While a strategy is executing, redemptions queue and settle at the realized price. Outside that window, standard ERC-4626 deposit and redeem run against vault float. No permission needed.Vaults are standard ERC-4626. Instant
deposit / redeem execute against idle float. They close while a strategy is live; the async queue is then the path in and out. The vault does not mark in-flight strategy positions.
Outside an executing strategy (redemptionsLocked() == false): standard ERC-4626. redeem / withdraw execute instantly against vault float, capped so they cannot drain assets reserved for already-stamped queue claims. Instant deposit is additionally closed for the whole open-proposal window (depositsLocked()), even before execute — there is no mint against an unrealized strategy.
While a strategy is executing (redemptionsLocked() == true): instant redeem / withdraw return 0. Depositors who want to leave call requestRedeem; depositors who want to enter call requestDeposit. Shares or assets escrow in VaultWithdrawalQueue. At settlement the vault stamps one frozen post-fee price for the proposal. Anyone then claims at that price.
Full flow
The queue — requestRedeem → stamp → claim
The queue is the only path out while a strategy is executing.
requestRedeem(shares, owner)— shares move into theVaultWithdrawalQueue. They are not burned yet. Redemption value is unknown until settlement. RequiresredemptionsLocked() == true.- Settlement stamps one price. The vault records a frozen
num/denfor that proposal — realized assets-per-share after fees, using the same virtual offsets as ERC-4626 so queue claims round like the vault. claim(requestId)— after the price is stamped and redemptions unlock, anyone can claim. A redeem claim burns the escrowed shares and pays the vault asset. A deposit claim mints shares at the frozen price.
requestDeposit(assets, receiver) is the symmetric entry: assets escrow in the queue (off-vault, so they never inflate totalAssets or get swept into the live strategy) and mint at the stamped price on claim. Instant deposit is already closed for the whole open-proposal window, so this is the path in from Pending through Executed.
A request can be cancelled only before its price is stamped, and only by the request owner — a post-stamp cancel would be a free look-back option.
Reserve invariant
Assets owed to settled-but-unclaimed redeem requests must stay in the vault. A subsequent proposal’s execution — or any withdrawal — reverts if it would leave vault float below that reserve. Queued depositors are always made whole; in-flight claims are never stranded.totalAssets()
claim moves neither the price nor anyone else’s position.
Queue claims settle at the actual realized value, not any mid-proposal mark.