Docs / Build
For all investors
Build a strategy for individual investor accounts. This is the current track for accredited and non-accredited investors. Your code proposes trades, and each account enforces the rules its owner approved.
What this version supports
The current profile is called Restricted Markets v1. It supports USDC and canonical WETH on Base mainnet, with swaps through one reviewed Uniswap v3 adapter. Each swap specifies the exact input amount and uses a single pool.
Each mandate has its own investor account. This version does not pool funds, issue shares, or allow performance, management, or referral fees on managed capital.
It also has no execution path for lending, borrowing, leverage, derivatives, liquidity provision, restaking, bridges, or cross-chain trades. Strategies cannot add arbitrary tokens, contracts, call data, multicalls, delegatecalls, exchange subaccounts, or unrestricted order and permit signatures. These are limits of the current account implementation.
Start your configuration
With the Epoche CLI installed, initialize the capital domain in your project:
epoche init --domain capitalThe CLI adds a commented mandate template to epoche.yaml. Fill it in for your deployment. The template leaves addresses for you to supply because a guessed address could authorize the wrong contract.
The examples below explain the fields. They are not ready-to-use configurations: replace the placeholder addresses and dataset hash, choose the budgets, and describe the strategy and recovery path your code actually implements.
Set the trading rules
The mandate names the exact assets, venues, and operations the account may use. It also sets trade-size, turnover, shortfall, and expense limits. The investor approves these rules before trading begins.
mandate:
chainId: 8453
initialCapitalBaseUnits: "0" # base units of the settlement asset
durationSeconds: 2592000
permittedAssets:
- { symbol: USDC, address: 0x... }
- { symbol: WETH, address: 0x... }
permittedVenues:
- { id: uniswap-v3-usdc-weth-500, address: 0x... }
permittedOperations: [exact-input-single-hop-swap]
proceedsRecipient: 0x... # the strategy never chooses this
maxSingleTradeBasisPoints: 1000
lifetimeTurnoverBasisPoints: 50000
perTradeShortfallBasisPoints: 50
rollingDailyShortfallUnits: "0"
lifetimeShortfallUnits: "0" # a shortfall budget is not a ceiling on loss
lifetimeExpenseUnits: "0"
recovery: Owner can revoke delegation and withdraw through account recovery.Amounts ending in Unitsuse the asset's smallest units. A basis point is one hundredth of a percent: 100 basis points is 1%. The recoveryfield describes how the owner can withdraw without the developer's signature.
Shortfall limits concern execution prices, not the total loss an investor could suffer. See the account model for that distinction.
Describe your strategy
Explain the signals your code uses, when it trades, and how it limits its positions. Be specific enough that a reviewer can compare the description with the source.
strategy:
summary: Mean reversion on the USDC/WETH 5 bp pool
procedure: Buy when the 1h VWAP sits two bands under the 24h mean; sell on reversion
actionSpace: [exact-input-single-hop-swap]
signals:
- { id: vwap-1h, statement: Hourly VWAP from the declared reference feed }
- { id: mean-24h, statement: Rolling 24h mean of the same feed }
conditions: [entry below the lower band, exit at the mean]
riskControls:
- { id: position-limit, statement: Hold at most one open position }
- { id: trade-cadence, statement: Evaluate trades at most once per hour }
delegatedTo: []Strategy Substance checks whether the code supports these claims. If you declare a signal or risk control that the code does not implement, the review can report it. It does not rank strategies or predict returns.
Document a backtest
A backtest can help a new strategy stand out against established ones before it has a long live track record. It shows how the strategy would have performed on historical data, giving investors concrete results to compare: winning and losing trades, how often each occurred, and how much the strategy gained or lost.
If you submit a backtest for Historical Robustness review, include its dataset identity, period, assumptions, costs, and the path to the code that produced the results. That code must be included in the submission.
backtest:
basis: simulated
datasetIdentity: base-usdc-weth-500-1m-2025
datasetSha256: <hash>
periodStart: 2025-01-01
periodEnd: 2025-12-31
instrumentUniverse: [USDC/WETH]
capitalBase: "100000000000" # base units
rebalanceCadence: hourly
costModel: pool fee plus declared slippage
fillAssumptions: next-bar open
lookAheadTreatment: signals lag one bar
survivorshipTreatment: single fixed pair
parameterConfigurationsEvaluated: 12
harness: backtest/run.ts # a path inside this submissionThis review checks that reported results follow from the submitted procedure and stated assumptions. It does not predict future results or establish that the strategy avoids overfitting. The declaration records how many parameter configurations you tried.
Run the reviews
Run the local check first, then submit the domains your strategy needs:
epoche check
epoche register safety
epoche register capital
epoche register strategy-substance- Execution Integrity uses the
safetydomain. It reviews the execution controls that the other domains rely on. - Capital Integrity uses
capital. It checks the declared fund-movement rules and their enforcement. - Strategy Substance uses
strategy-substance. It checks whether the strategy's source supports its declared behavior.
If you are submitting a backtest, also run:
epoche register historical-robustnessAccreditation Integrity is relevant when your code has a path that decides who may supply capital. If no such path exists, that domain is not evaluated. A credential applies only to the domain and scope it names.
A Capital Integrity pass does not mean a strategy is safe, profitable, or suitable for a particular investor. Read what each credential proves before presenting it to investors.