Recurve Docs
Website GitHub Open app

Reference

Contracts

Three contracts, deployed one registry per network and one vault/governor pair per fund.

The set

ContractScopePurpose
RecurveVaultPer fundERC-4626 vault with voting shares. Holds positions, gates capital movement, runs the redemption queue.
RecurveGovernorPer fundProposal lifecycle and the performance fee.
GuardianRegistryPer networkStake, 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.