Mandate Execution
When a proposal is approved, the pre-committed calls are executed directly by the vault:- Anyone calls
executeProposal(proposalId)on the governor (no arguments beyond the ID) - Governor verifies: proposal is Approved, within execution window, no other strategy live, cooldown elapsed
- Governor calls
vault.lockRedemptions()— blocks withdraw/redeem - Governor snapshots vault’s deposit asset balance (
capitalSnapshot) - Governor calls
vault.executeBatch(proposal.executeCalls)— vault runs the execution calls - All DeFi positions (mTokens, LP tokens, borrows) now live on the vault address
withdraw / redeem) are blocked. Depositors who want to exit early can sell their shares on the WOOD/SHARES liquidity pool (see Economics).
Strategy Duration & Settlement
Two separate clocks govern the lifecycle:- Execution deadline — time to start executing after approval (
executionWindow, governor-controlled) - Strategy duration — time the position runs before settlement (
strategyDuration, agent-proposed, capped bymaxStrategyDuration)
Two Settlement Paths
Since the exact on-chain state at settlement time cannot be predicted (slippage, pool state, interest accrued), pre-committed unwind calls may revert. Two distinct settlement paths handle this:| Path | Who | When | Calls | Notes |
|---|---|---|---|---|
| Standard settle | Proposer anytime; anyone after duration | Proposer: anytime after execution. Others: after strategyDuration ends | Pre-committed settlementCalls from proposal | Uses the voted-on unwind calls |
| Emergency settle | Vault owner | After strategyDuration ends | Tries pre-committed calls first, falls back to owner-provided calls | Backstop with try/catch fallback |
- Standard Settlement
- Emergency Settlement
settleProposal
The standard settlement path uses the pre-committed settlementCalls that shareholders voted on.Who can call it:- The proposer (agent) can call at any time after execution — they have the most context about when to close
- Anyone (keeper, depositor, bot) can call after
strategyDurationexpires — no trust required
Why two paths?
Pre-committed unwind calls are a best-effort prediction of future on-chain state. Slippage, interest accrual, pool rebalancing, and oracle updates can all cause them to revert. The two-path model ensures settlement always succeeds:- Standard path — uses the pre-committed calls that shareholders voted on. The proposer can trigger it early; anyone can trigger it after duration. Zero trust required.
- Emergency path — vault owner backstop. Tries the pre-committed calls first (via try/catch), then falls back to owner-provided calls. Always works because the owner can craft any calls needed.
Fee transfers are wrapped in try/catch. If the agent or vault owner address is blacklisted by the deposit asset (e.g. USDC blacklist), the fee transfer will fail silently rather than blocking the entire settlement. Depositor capital is never held hostage by a blacklisted fee recipient.
Cooldown Window
After settlement, a cooldown period begins before any new strategy can execute on that vault.- Duration:
cooldownPeriod(governor parameter, owner-controlled) - During cooldown: redemptions are re-enabled, depositors can withdraw
- During cooldown: proposals can still be submitted and voted on, but
executeProposalreverts - Purpose: gives depositors an exit window between strategies — if they don’t like the next approved proposal, they can leave
cooldownPeriod: min 1 hour, max 30 days
P&L Calculation
Since only one strategy runs per vault at a time, P&L is calculated via a simple balance snapshot:PnL Attestation
At settlement, the governor mints an EAS attestation recording the proposal’s PnL:Full Lifecycle in calls[]
The proposal commits the complete strategy lifecycle in two separate call arrays — opening calls (executeCalls) and closing calls (settlementCalls). The agent commits everything upfront:
executeProposal(proposalId)— runsexecuteCalls(the opening portion)settleProposal(proposalId)— runssettlementCalls(the closing portion)
executeBatch (owner-only).
Stale parameters: Since pre-committed unwind calls are a prediction of future state, agents should use generous slippage tolerances. If standard settlement reverts, the vault owner can use emergencySettle as a backstop — it tries the pre-committed calls first via try/catch, then falls back to the owner’s custom calls.