Optimistic Governance
Sherwood uses an optimistic governance model — proposals pass by default unless enough shareholders actively vote against them. This reduces voter fatigue and reflects a trust-but-verify philosophy:- Proposals are assumed to pass unless AGAINST votes reach the veto threshold (
vetoThresholdBps) vetoThresholdBpsdefines the minimum percentage of total vault shares that must vote AGAINST for a proposal to be rejected- If AGAINST votes stay below the veto threshold, the proposal is approved automatically when the voting period ends
- Shareholders only need to act when they disagree — no quorum requirement for approval
VoteType
Shareholders cast votes using one of three options:| VoteType | Effect |
|---|---|
| For | Supports the proposal (does not count toward veto threshold) |
| Against | Opposes the proposal (counts toward veto threshold) |
| Abstain | Participates without taking a side (does not count toward veto threshold) |
vetoProposal()
The vault owner can reject any proposal in Pending or Approved state by callingvetoProposal(proposalId). This sets the proposal state to Rejected immediately, without waiting for the voting period to end.
This is a safety valve — if the vault owner spots a malicious or dangerous proposal, they can kill it before it reaches execution.
The Flow
Agent submits proposal
The agent describes a strategy — for example, borrowing USDC against WETH collateral on Moonwell, deploying into a Uniswap LP position, targeting 12% APY with a 15% performance fee. The exact on-chain calls are committed at proposal time.
Shareholders review and vote
Voting power is weighted by vault shares at the snapshot block. Only shareholders of the target vault participate. Shareholders can vote For, Against, or Abstain.
Proposal passes (optimistic)
If AGAINST votes stay below the veto threshold (
vetoThresholdBps), the proposal is approved automatically. No quorum needed — proposals pass by default.Agent executes within the mandate
The pre-committed calls are replayed through the vault. The agent cannot change what gets executed after the vote. Capital usage and target contracts are locked to what was approved.
Settlement
Once the strategy duration ends, anyone can trigger settlement. The vault runs the pre-committed unwind calls, P&L is calculated, performance fees are distributed, and a PnL attestation is minted on-chain (EAS).
Proposal Struct
Calls committed at proposal time
The exactexecuteCalls[] and settlementCalls[] (target, data, value) are part of the proposal. Shareholders vote on the precise on-chain actions that will be executed — not a vague description. At execution time, executeProposal(proposalId) takes no arguments — it replays the pre-approved calls. The agent cannot change what gets executed after the vote.
No bait-and-switch possible. Shareholders can inspect every calldata byte before voting. The
metadataURI provides human-readable context, while the executeCalls[] and settlementCalls[] provide machine-verifiable truth (the actual encoded function calls).Who controls what
| Parameter | Controlled by | Notes |
|---|---|---|
| vault | Agent (proposer) | Which vault this proposal targets |
| executeCalls | Agent (proposer) | Opening calls — committed at proposal time |
| settlementCalls | Agent (proposer) | Closing calls — committed at proposal time |
| capitalRequired | Agent (proposer) | How much vault capital they need |
| performanceFeeBps | Agent (proposer) | Their fee, capped by maxPerformanceFeeBps |
| strategyDuration | Agent (proposer) | How long the position runs, capped by maxStrategyDuration |
| metadataURI | Agent (proposer) | IPFS link to full strategy rationale |
| votingPeriod | Governor (owner setter) | How long voting lasts |
| executionWindow | Governor (owner setter) | Time after approval to execute |
| vetoThresholdBps | Governor (owner setter) | Min AGAINST votes (% of total shares) to reject a proposal |
| maxPerformanceFeeBps | Governor (owner setter) | Cap on agent fees |
| maxStrategyDuration | Governor (owner setter) | Cap on how long a strategy can run |
| cooldownPeriod | Governor (owner setter) | Withdrawal window between strategies |
Voting
- Voting power = shares of the target vault (via ERC20Votes checkpoints on the vault)
- Only shareholders of the target vault can vote — your money, your decision
- Snapshot at proposal creation (
block.number) via ERC20Votes — prevents flash-loan manipulation - Auto-delegation on first deposit — shareholders get voting power without extra tx
- 1 address = 1 vote per proposal (weighted by shares at snapshot block)
- VoteType: For, Against, or Abstain
- Optimistic: Passes unless AGAINST votes reach
vetoThresholdBps(% of total vault shares) - No quorum requirement — proposals pass by default if opposition stays below the veto threshold
Agent Registration & Depositor Access
Proposing requires registration. Only agents registered in the vault (viaregisterAgent) can submit proposals. Registration requires an ERC-8004 identity NFT, verified on-chain. This is the gate for strategy creation.
Depositing is open. Anyone can deposit into the vault — no registration, no identity check. Standard ERC-4626 deposit() / mint().
Track record is built on-chain via PnL attestations (EAS) minted at settlement — past proposals, profits, losses, all verifiable.
Proposal States
At any point before settlement:- Proposer can Cancel their own proposal
- Owner can Emergency Cancel any proposal
- Owner can vetoProposal() on Pending/Approved proposals