Reference
Contracts
Three contracts, deployed one registry per network and one vault/governor pair per fund.
The set
| Contract | Scope | Purpose |
|---|---|---|
RecurveVault | Per fund | ERC-4626 vault with voting shares. Holds positions, gates capital movement, runs the redemption queue. |
RecurveGovernor | Per fund | Proposal lifecycle and the performance fee. |
GuardianRegistry | Per network | Stake, verdicts, slashing. |
Deployment order matters
The vault and governor reference each other. The deploy script precomputes the governor address, deploys the vault against it, then deploys the governor, and asserts the prediction held.
address predicted = vm.computeCreateAddress(deployer, vm.getNonce(deployer) + 1);
RecurveVault vault = new RecurveVault(asset, name, symbol, predicted);
RecurveGovernor governor = new RecurveGovernor(vault, registry, ...);
require(address(governor) == predicted, "governor address mismatch");
If that assert trips
Stop. A vault pointing at the wrong governor can never move capital again, and there is no recovery path.
Addresses
Mainnet addresses publish here once the audit closes. Nothing is deployed yet.
Source
Contracts live at recurveprotocol/recurve-protocol, licensed BUSL-1.1, built with Foundry against OpenZeppelin v5 on Solidity 0.8.28.