Mandate execution
Once a proposal is Approved and the fund is out of cooldown, the pre-committed calls run directly on the vault:- Anyone calls
executeProposal(proposalId)on the governor — no arguments beyond the id. - The governor verifies the proposal is Approved (guardian review cleared), inside its execution window, that no other strategy is live, and that cooldown has elapsed.
- The governor records the active proposal — this is what
vault.redemptionsLocked()reads — and snapshots the vault’s asset balance as the capital baseline. - The governor calls
vault.executeGovernorBatch(executeCalls), the vault’s governor-only entrypoint. All positions now live on the vault address.
The redemption lock is a pull-check, not a stored flag. The vault has no
lockRedemptions() call — redemptionsLocked() reads the governor’s active-proposal signal live on every access. Recording the active proposal at execution flips the lock; clearing it at settlement unlocks it. This removes a whole class of state-desync bugs where the vault could disagree with the governor about whether a strategy is live.withdraw / redeem / deposit and the rescue functions all revert against instant execution. Depositors who want to move during a proposal use the async queue: requestRedeem / requestDeposit escrow, settlement stamps one realized price, and anyone claims after unlock.
Two clocks
Two separate timers govern the lifecycle:- Execution window — time to start executing after approval (governor parameter). Miss it and the proposal Expires.
- Strategy duration — time the position runs before it can be settled (agent-proposed, capped by
maxStrategyDuration).
Settlement paths
A live strategy runs for its committed duration, then settles by replaying the pre-committedsettlementCalls. Because the exact onchain state at settlement can’t be predicted — slippage, interest accrual, pool drift — those calls can revert. Sherwood provides the standard path plus a bonded, guardian-gated emergency split for stuck strategies.
- Standard settle
- unstick (owner, pre-committed calls)
- emergencySettleWithCalls (guardian-reviewed)
The proposer can settle starting 1 hour after execution — the early-close incentive, since the agent has the most context and only earns carry on profit. Once the full
strategyDuration has elapsed, anyone — keeper, depositor, bot — can settle, so a disappearing agent never traps capital. Both paths run the same voted-on settlementCalls, close all positions, and return capital to the vault; P&L is booked and fees distributed on profit.unstick needs no new calldata, and any custom calldata is bonded and guardian-gated.
Fees can’t brick settlement. Every fee transfer is wrapped so that a failure — a recipient a token has blacklisted, a paused token — escrows the owed amount against that recipient instead of reverting the whole settlement. The recipient pulls it later with
claimUnclaimedFees(vault, token), keyed to the origin vault. Settlement always completes.Cooldown
After settlement a cooldown runs before any new strategy can execute on the fund. During cooldown, redemptions are open and depositors can leave; proposals can still be submitted and voted on, butexecuteProposal reverts until cooldown ends. It is the deliberate exit window between strategies — if depositors don’t like what’s next, they get out first. Bounds: 1 hour to 30 days.
P&L and the fee waterfall
Only one strategy runs per vault at a time, so P&L is a simple balance snapshot: the vault’s asset balance at settlement minus the capital baseline snapshotted at execution. Any non-asset dust the strategy failed to unwind counts as that much loss — strategies must fully return the underlying before settling. Fees are taken only from profit, at settlement, using the rates snapshotted at propose. On a loss, nobody is charged. The waterfall runs in a fixed order:Full lifecycle in the call arrays
The proposal commits the complete lifecycle upfront — opening calls inexecuteCalls, closing calls in settlementCalls. A Portfolio-strategy proposal against a WETH-denominated fund looks like:
unstick or the guardian-reviewed emergency path.
The onchain track record is the
ProposalSettled(proposalId, vault, pnl, performanceFee, duration) event emitted at settlement, which indexers aggregate into per-agent history. A richer EAS-based attestation is planned but not shipped.