Yield Accrual and Technical Breakdown
As part of the ERC-4626 Tokenized Vault Standard, afCVX accrues yield through its redemption ratio. Since the yield from Vote Incentives and Convex will constantly accumulate and be compounded, this means that afCVXβs value effectively always increases relative to CVX.
Example:
1) Say your stake at the very beginning when 1 CVX = 1 afCVX. You deposit 100 CVX and receive 100 afCVX back.
2) If APY were to stay completely constant at for example, 40% for an entire year, the ratio between CVX and afCVX would change by 40%. So 1 afCVX = 1.4 CVX, or 1 CVX = 0.714 afCVX.
3) At this point, you could trade your 100 afCVX back to Asymmetryβs smart contracts and receive 140 CVX in return.
4) This means as long as you are holding afCVX, you are optimizing your CVX yield! Plus, you do not need have to hold afCVX from Asymmetry directly. For example, you can purchase afCVX on an exchange; as every afCVX token is exactly the same, you will automatically receive the benefits of staking just by holding the token!
Some users with eagle eyes may notice that after the system calls the borrow function, the exchange ratio moves slightly up, relative to CVX. This is because the CLever system holds onto a 1% "early repayment fee" in the event that users withdraw early. While it's unlikely that this fee is ever fully paid, the system must take the most conservative approach to ensure solvency at all times. This is refelcted by the 'afCVX Vault Power' on the afCVX page - detailing as afCVX yield grows over time as non-liquidating leverage builds with system maturity.
Why does the ratio fluctuate?
The afCVX:CVX ratio may now fluctuate on a day-to-day basis after Asymmetry's Governance community voted to enact a 10% performance fee to the product. In addition, the ratio may jump around CLever harvests, which have recently changed and are now spaced out now that they split their harvesting across Votium and StakeDAO, of which have different harvesting cadence.
The ratio may fluctuate on a day-to-day basis due to multiple CLever harvests and the performance fee, but rest assured that afCVX's interest will always accrue as normal over the course of weeks and months as it always has done since inception β Proving and establishing itself as the easy and hands-free way to earn on your CVX. A more technical breakdown is offered below.
afCVX: Complete Technical Breakdown
What is afCVX?
afCVX is an ERC-4626 vault that accepts CVX deposits and deploys them across two yield strategies:
- CLever CVX Strategy (~80%) β Locks CVX in CLever Protocol's locker, borrows clevCVX against it, and deposits that clevCVX into the Furnace, which gradually converts it back to CVX. This is the primary yield source.
- Convex Staking Strategy (~20%) β Stakes CVX in Convex's Rewards Pool to earn cvxCRV, which gets swapped back to CVX during harvest.
The vault is managed by an operator who calls distribute() to allocate deposits between the two strategies, borrow() to leverage the CLever position, and harvest() to collect rewards.
The two fees
1. Performance fee (protocolFeeBps) β charged on yield only
This is strictly a percentage of harvested rewards β never a percentage of total assets or principal. If set to 10% and 100 CVX in rewards are harvested, 10 CVX goes to the protocol and 90 CVX goes to depositors. Your deposited CVX is never touched by this fee.
2. Withdrawal fee (withdrawalFeeBps) β charged on exits
Applied when users call redeem() or withdraw(). The fee isn't extracted β it stays in the vault, effectively boosting the share price for remaining depositors. The requestUnlock() path (unlocking from CLever directly) does not charge this fee, though CLever's own repayment fee applies.
How totalAssets() works
The share price (afCVX:CVX ratio) is determined by totalAssets() / totalSupply(). totalAssets() sums three components:
1. Idle CVX β sitting in the vault contract
2. Staked CVX β in the Convex Rewards Pool
3. cleverStrategy.netAssets(protocolFeeBps) β the net value in CLever, calculated as:
deposited_in_locker
+ unrealizedFurnace β clevCVX not yet converted, counted at 100%
+ realizedFurnace * (1 - fee) β CVX already converted, counted at 100% minus the performance fee
- borrowed * (1 + repayFee) β clevCVX debt adjusted for CLever's repayment fee
- unlockObligations β CVX committed to pending unlock requests
The critical detail: unrealizedFurnace is counted at full value, but realizedFurnace is discounted by the performance fee. This pre-accrues the fee in the accounting before it's actually collected.
Why the ratio drifts down between harvests β and why that's fine
The Furnace continuously converts clevCVX into CVX. As this conversion happens:
- unrealizedFurnace decreases by X (was counted at 100%)
- realizedFurnace increases by X (now counted at 100% minus fee)
Net impact on totalAssets(): -X feeBps / 10,000
With a 10% fee, every 100 CVX that moves from unrealized to realized causes totalAssets() to drop by 10 in the accounting. Total supply hasn't changed, so the share price drifts downward.
This is purely a display artifact. No value is actually leaving the vault during this period. The netAssets() function is simply pre-deducting the fee that will be collected at the next harvest.
Think of it as the vault honestly reporting "this is what you'll have after the fee is taken" rather than showing an inflated number and surprising you later. The underlying rewards are still accruing β they're just being shown net-of-fee in real time.
Every CVX of yield that belongs to depositors ends up in depositors' hands. The only deduction is the stated performance fee, applied once at harvest. There is no hidden drain, no double-counting, and no value leakage. The ratio moving down between harvests and jumping back up at harvest is the same yield showing up in two different accounting moments β it all nets out correctly.
Harvest
When the operator calls harvest():
1. Convex rewards are claimed β cvxCRV is claimed from the Rewards Pool and swapped to CVX. These rewards were not reflected in totalAssets() before this moment (the Rewards Pool's balanceOf only tracks staked principal, not pending rewards). This causes totalAssets() to jump up.
2. Furnace realized CVX is claimed β cleverStrategy.claim() pulls the realized CVX from Furnace into the vault. This nets to approximately zero in terms of totalAssets(), because the value was already counted (with fee discount) in netAssets() before harvest, and now it appears as idle CVX minus the fee transferred out.
3. The actual fee is collected β fee = totalRewards * feeBps / 10,000 is transferred to protocolFeeCollector as CVX. This is the only moment real value leaves the vault, and it matches exactly what was already pre-deducted in the accounting.
4. Weekly withdrawal limit is updated based on the new totalAssets().
The remaining rewards sit as idle CVX in the vault until the operator calls distribute() to redeploy them into the two strategies.
The afCVX:CVX ratio follows a repeating cycle:
harvest()
β ratio jumps up (Convex staking rewards enter totalAssets)
β
β time passes...
β Furnace converts clevCVX β CVX
β unrealized (100%) moves to realized (100% - fee)
β totalAssets drifts down in the accounting
β ratio drifts down
β
harvest()
β ratio jumps up again
The downward drift is proportional to both the fee percentage and the rate at which the Furnace is realizing rewards. The upward jump is driven by how much cvxCRV was earned from Convex staking since the last harvest.
The net trajectory over time is upward. Each harvest cycle adds more yield than the accounting dip removes. The sawtooth is cosmetic β the long-term trend reflects real yield accruing to depositors at exactly (100% minus the stated fee).
Last updated