TracerDocs
Docs menu
Reference

Deployments

Addresses for the active chain and the reference deployment.

Addresses come from contracts/deployments/<chainId>.json, written by Deploy.s.sol and copied to web/src/config/deployment.json by script/sync-deployment.sh <chainId>.

{ "schemaVersion": 3, "chainId": 31337,
  "aqua": "0x…", "weth": "0x…", "usdc": "0x…", "feed": "0x…",
  "router": "0x…", "routerSourceCommit": "…", "routerBytecodeHash": "0x…",
  "seriesFactory": "0x…", "marketEngine": "0x…", "accumulator": "0x…",
  "seriesDeployer": "0x…", "programs": "0x…", "lens": "0x…", "oracle": "0x…",
  "portfolioMarket": "0x…", "portfolioAccumulator": "0x…",
  "deploymentBlock": 51021223, "writer": "0x…", "buyer": "0x…" }

The manifest is versioned. Schema 3 adds portfolioMarket and portfolioAccumulator for the v3 HIGH/CALM risk groups. The backend rejects any schemaVersion it does not understand at startup rather than mis-decoding an older manifest, and it also refuses zero addresses. routerSourceCommit and routerBytecodeHash pin exactly which official AquaSwapVMRouter source this deployment runs — see Running on the official router.

On the public Base Sepolia deployment routerSourceCommit reads unknown: the vendored contracts/lib/swap-vm carries no .git directory, so the upstream commit cannot be recovered. routerBytecodeHash is still pinned and verifiable, and the deployed router's runtime bytecode reproduces the vendored official source byte-for-byte outside its immutable slots.

This build — Tracer Fork (31337), not deployed

ContractAddress
Aqua0x0000000000000000000000000000000000000000
AquaSwapVMRouter0x0000000000000000000000000000000000000000
VarianceSeriesFactory0x0000000000000000000000000000000000000000
TracerMarketEngine0x0000000000000000000000000000000000000000
VarianceAccumulator0x0000000000000000000000000000000000000000
TracerSeriesDeployer0x0000000000000000000000000000000000000000
TracerPrograms0x0000000000000000000000000000000000000000
TracerLens0x0000000000000000000000000000000000000000
RealizedVarianceOracle0x0000000000000000000000000000000000000000
TracerPortfolioMarket0x0000000000000000000000000000000000000000
Portfolio VarianceAccumulator0x0000000000000000000000000000000000000000
Quote token0x0000000000000000000000000000000000000000
Chainlink ETH/USD0x0000000000000000000000000000000000000000
WETH0x0000000000000000000000000000000000000000
Demo writer0x0000000000000000000000000000000000000000
Demo buyer0x0000000000000000000000000000000000000000
Deployment block0
Router source commit—
Router bytecode hash—
Manifest schema0

Env for this build: NEXT_PUBLIC_RPC_URL=http://127.0.0.1:8545, NEXT_PUBLIC_API_URL=http://localhost:8787.

Chains

ChainIdAquaUSDCChainlink ETH/USD
Tracer Fork (anvil fork of Base mainnet)31337canonical 0x1111113ccf1426a8e30e2bff5e005d929bf6a90areal 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 (6 dec)real 0x71041dddad3595F9CEd3DcCFBe3D1F4b0a16Bb70 (8 dec)
Base Sepolia84532our own Aqua deploymentMockUSDC — test token, see below0x4aDC67696bA383F43DD60A9e78F2C97Fbbfc7cb1
Base8453canonical 0x1111113ccf1426a8e30e2bff5e005d929bf6a90areal USDCreal ETH/USD

The Base Sepolia quote token is not USDC. It is Tracer's own MockUSDC at 0x13a058bE25Da579e0858d689F5982eDaCE8356B7 — freely mintable by anyone and worth nothing. Its ERC-20 symbol() returns the string "USDC", so wallets and explorers will display it as USDC. It has no relationship to Circle's USDC. Every amount shown in the app on chain 84532 is denominated in this test token.

Note the router. Tracer deploys the official AquaSwapVMRouter source, unmodified, rather than using the router deployed at the canonical SwapVM address, because that address exposes a different SwapVM revision's swap ABI. The compatibility gate documents the observation and the fallback.

Reference fork deployment (deployments/31337.json, deploymentBlock 51021223)

A fresh demo.sh run on a fresh fork reproduces the same addresses when deployed from the same account and nonce.

aqua (canonical)0x1111113CCf1426A8E30e2bfF5E005d929bF6a90a
weth0x4200000000000000000000000000000000000006
usdc (real)0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913
feed (real ETH/USD)0x71041dddad3595F9CEd3DcCFBe3D1F4b0a16Bb70
router (official source)0x1B83b466d739cb84B131B21CF66e598C9c01971e
seriesFactory0x43AfB5635F840c1b0D4D68b10CE9CE272a354523
marketEngine0xE37eC1884ce6b498C69B63d6911646006Dd226da
accumulator0x740af24813F255C2ce72649bE15A2DEcb4eEDC8a
seriesDeployer0x669D2dfb6Da3F834f46c10f9c91DddD5fE517d85
programs0x1BcA8cF5c9c60559c10535851Df022E35513F2B9
lens0x19613E7614086c162C75fB53D5911F8FE936E2e5
oracle0x856C170B1188e5C36C49cF1EE4073173E41d02b4
writer (anvil #0)0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
buyer (anvil #1)0x70997970C51812dc3A010C7d01b50e0d17dc79C8

Writer vaults and receipts are not in the manifest, because they do not need to be: a vault address is CREATE2 from keccak256(writer, quoteToken) and lens.writerVault(writer) returns it whether or not it exists yet.

Build settings and sizes

Solidity 0.8.30, via-IR, optimizer 200 runs — size-tuned, because the controller embeds its children's creation code and therefore has to fit EIP-3860's 49,152-byte initcode limit as well as EIP-170's 24,576-byte runtime limit.

ContractRuntimeInitcodeRuntime margin
AquaSwapVMRouter (official)20,05221,5404,524
VarianceSeriesFactory17,89246,4846,684
TracerLens15,18416,3649,392
TracerSeriesDeployer11,23611,57413,340
TracerMarketEngine8,6128,86815,964
TracerPrograms7,6078,05716,969
VarianceAccumulator6,8587,16317,718
RealizedVarianceOracle5,5625,78119,014
TracerMakerVault3,6524,40820,924
VarianceReceipt2,9815,21821,595

The binding constraint is the controller's initcode: 46,484 of 49,152, a margin of 2,668 bytes. That is why the read models live in separate contracts (TracerLens, TracerPrograms) rather than on the controller itself.