Protocol
Vaults
Every fund is a standard ERC-4626 vault with voting shares. It holds the positions and gates every movement of capital.
Standard where it counts
RecurveVault is ERC-4626, so deposit, mint,
convertToAssets and the rest behave the way any integrator expects. It additionally
extends ERC20Votes, which is what lets the governor snapshot voting weight.
Accounting
totalAssets() = idle balance + deployedAssets
deployedAssets is carried explicitly rather than inferred, because a position
mid-unwind is neither in the balance nor visible to balanceOf.
| Function | Returns |
|---|---|
totalAssets() | Everything owed to depositors |
float() | Idle assets minus what queued exits already claim |
deployedAssets() | Committed to a live strategy |
Capital only leaves one way
fundStrategy is the single path out, and only the governor can call it. It reverts
if the request exceeds the float, so a proposal that overreaches fails at execute rather than
stranding queued depositors.
Redemption
requestRedeem clears instantly when the float covers the exit and returns
type(uint256).max as a sentinel. Otherwise it escrows the shares, appends to the
queue, and returns the queue index.
claimRedeem prices at claim time, not request time. That is the whole reason the
queue exists: the exit price was unknown when the request was made.
Queued shares sit with the vault until claimed, and burn on claim. They keep counting toward
supply until then, which is why totalAssets does not net them out.