Skip to main content

Octant

Octant provides the vault mechanics that let a garden hold an endowment. Funders deposit into a garden vault and keep a claim on what they put in, while the yield it earns flows to the garden's work. The deposit sits in a yield strategy, so like any on-chain investment, a strategy loss or a contract bug could reduce what can be withdrawn. Funders deposit and redeem directly on the ERC-4626 vaults; the Octant module owns vault creation, configuration, strategies, and the yield-donation routing, and has no deposit or withdrawal entrypoint of its own.

The public Vaults page: a hero reading Public goods campaigns, powered by Octant vaults, above the list of active campaigns ready for support
Funders back campaigns from the public Vaults page.

How it flows​

Money moves one way for yield and the other way for deposits. Funders can redeem their shares for what the vault then holds; the yield does not return to them.

Custody follows from that. Funders hold the vault's shares, the module is each vault's role manager, and the yield a strategy harvests is minted as vault shares to the yield resolver, which splits it between the garden's cookie jar, Hypercert fraction purchases, and the Juicebox treasury that backs GOODS. The garden's own account is not the vault's custodian. A portion whose destination is unavailable (no cookie jar, a jar that refuses the deposit, or no working Juicebox terminal) goes to the garden's treasury, and to the garden's own account only when no treasury is set.

Vaults are created when a garden is minted, one per supported asset, and that call is best-effort like the other module hooks, so a garden can exist with no vault. getVaultForAsset returns the zero address for one that is missing, and a steward of the garden or the protocol owner can create it with createVaultForAsset.

Where it lives in the code​

LayerSource
Modulepackages/contracts/src/modules/Octant.sol
Vault creation at mintpackages/contracts/src/tokens/Garden.sol, through notifyOctant in packages/contracts/src/lib/GardenHooks.sol, which skips a missing module and catches a failed call
Yield splitpackages/contracts/src/resolvers/Yield.sol
Vault data accesspackages/shared/src/modules/data/vaults.ts and vault-repository.ts
Yield routingpackages/shared/src/modules/data/yield-allocations.ts

The funder-facing behavior lives in the community docs' funder guide; these sources are the machinery under it.

Checked-in deployment projection​

NetworkStatusRecorded components
Sepolia Testnet (11155111)DeployedoctantFactory, octantModule
Arbitrum One (42161)DeployedoctantFactory, octantModule

Networks without recorded components are omitted; per-network state lives in the deployment status projection.

Indexer boundary​

Configured indexer contracts: OctantModule, OctantVault.

A deployment artifact does not by itself prove product activation, live indexing, or partner-service health. This projection regenerates from checked-in artifacts via node scripts/docs/generate.mjs.

Working with it locally​

The fork mode (bun run dev -- fork) runs a local fork of Arbitrum One with the deployed vault contracts present, so deposit and withdrawal flows run locally without real funds.

Canonical upstream docs​

Next steps​