Recurve Docs
Website GitHub Open app

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.

FunctionReturns
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.

Note

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.