Overview
Coloris is color-coded capital management on Base. You deposit USDC and choose a strategy by its color. Each color is an ERC-4626 vault, ColorisVault, that holds a fixed board of other ERC-4626 USDC vaults (the venues) and decides how much to place in each one.
The three colors run the same contract. They differ by one parameter, the tilt: how much of each venue's weight comes from its depth (the size of the venue, a proxy for safety) and how much from its realised yield (what its share price actually earned over the last epoch). A color knows nothing about the other two.
The three colors
| Color | Share token | Tilt | Cap per venue | Reading |
|---|---|---|---|---|
| Stable | cSTABLE | 0 (all depth) | 40 % | The largest blue-chip vaults, in proportion to their size. |
| Balanced | cBALANCED | 50 | 35 % | Half depth, half realised yield. |
| Growth | cGROWTH | 100 (all yield) | 35 % | Where the realised yield was highest. |
Choosing the strategy that fits you means choosing a color, or a blend of the three. Stable is the least sensitive to short-term yield; it follows where most capital already sits. Growth chases realised yield, within a cap per venue. Balanced sits exactly in between.
Venues
At launch the boards hold nine ERC-4626 vaults on Base, all with asset() == USDC (0x8335…2913), passed in the constructor. Later additions go through a 48-hour timelock. Live TVL, share price and realised APR for each are on the Strategies page.
| Venue | Address | Stable | Balanced | Growth |
|---|
A venue's balance is always measured as convertToAssets(balanceOf(vault)), never as the USDC held at the venue's address: some venues (Fluid, for example) move their USDC into a separate liquidity layer.
The epoch
Every 24 hours each color runs three steps, strictly in order, each once. All three are permissionless: anyone can call them, there is no keeper and no allocator with discretion.
discover()
For each active venue the vault reads the price of one share, pps = convertToAssets(10^decimals). If it fell since the last epoch, the venue is marked impaired and excluded. Otherwise its realised APR is (pps − lastPps) × 365 days / (lastPps × dt), capped at 50 %. The very first read only primes the measurement (APR 0). The vault also records each venue's depth, totalAssets(), capped at 1 billion USDC so that a giant donation cannot buy weight beyond that.
deploy()
Retired or impaired venues are exited in full. Venues above their target give back capital, but at most 10 % of the color's TVL per epoch, so a bad reading cannot empty a venue overnight. Then any buffer above 5 % is deposited into venues below target; idle capital goes to work without limit.
Allocation formula
Over the active, non-impaired venues of a color:
dShare_i = depth_i * 1e18 / Σ depth (0 if Σ depth = 0)
aShare_i = apr_i * 1e18 / Σ apr (0 if Σ apr = 0)
score_i = (dShare_i * (1e4 - tilt) + aShare_i * tilt) / 1e4
Target weights are proportional to score over 95 % of the color (the other 5 % is the liquid buffer). Each is capped at the color's cap per venue; the excess is redistributed to the others by water-filling, in at most eight passes. If the caps add up to less than 95 %, the remainder stays in the buffer.
If every score is zero, nothing moves and the previous targets are kept. In practice this means Stable can allocate from its first epoch (depth is known immediately), while Growth waits for two share-price readings before it has any APR to weigh.
Withdrawals
A withdrawal is paid from the buffer first, then from venues in increasing order of score. maxWithdraw and maxRedeem report what is really liquid right now, including venues that are themselves constrained. You exit color by color with a standard ERC-4626 redeem on that color's vault.
Blending colors
ColorisRouter lets one deposit go to several colors: blend(assets, bps[3], receiver, minShares[3]). The three basis-point weights must add up to 10,000. The router pulls your USDC, deposits each slice into its color, and has the shares minted directly to receiver. The last slice takes the rounding remainder, so no USDC is ever left in the router. A color at 0 bps is not touched. minShares protects each slice against an unfavourable share price.
The router is stateless and has no owner. USDC on Base supports EIP-2612, so blendWithPermit does approval and deposit in one signature. positions(user) returns, for each color, your shares, their value in USDC and what you can withdraw now.
Fees and governance
- Performance fee: 10 % of gains above the high-water mark, taken as newly minted shares sent to the treasury. The owner can only lower it.
- No entry, exit or management fee.
- New venues:
proposeVenue, then a 48-hour timelock; the venue'sasset()must be USDC.retireVenueandexitVenuetake effect immediately, so the owner can always leave a venue but can never rush one in. - Deposit cap at launch: 250,000 USDC per color. Cap per venue adjustable up to 50 %.
- There is no arbitrary call, no rescue function for USDC and no transfer outside whitelisted venues.
Safety
The vault code is the Bitscall vault with one change, the scoring function. Beyond its existing suite, the tests required for Coloris cover:
- first-deposit inflation (OpenZeppelin ERC-4626 with a decimals offset of 6);
- donations to a venue: APR capped, depth capped, cap per venue;
- tilt isolation: Stable does not react to APR, Growth does not react to depth, Balanced lands exactly in the middle on a hand-computed case;
- epoch order, the per-epoch rebalancing limit, illiquid venues, losses marking a venue impaired, the high-water mark;
- router: weights not summing to 10,000 revert,
minSharesreverts, no dust left, shares to the receiver, untouched colors at 0 bps; - a fork of Base on the nine real venues, all three colors, with a 20,000 USDC round trip.
Status
The contracts are deployed on Base and verified on Basescan. Each epoch (discover, allocate, deploy) is permissionless: anyone can run it once every 24 hours. Nothing on this site is a simulated balance or a projected yield.
- ColorisVault — Stable (cSTABLE):
0x83c8C316cfd134546d710293E8f87ded84C066c2 - ColorisVault — Balanced (cBALANCED):
0x36992dDBf35896735FcB3e6831A577defaa30BE3 - ColorisVault — Growth (cGROWTH):
0x5E3927B478BD35431837b9aF4A3F8Bf5298c17a2 - ColorisRouter:
0x9BBb030238b0C39BE278F706a11C831cA035d29E - ColorisTreasury:
0x0f5298ab53d576Df870c5362157a013be567Dae2 - COLORIS token (B20):
0xb2000000000000000000003EabE460C7aa1204b3