Skip to main content

Ethereum mainnet

Ethereum mainnet (chainId 1) is a production deployment of Privacy Pools v2, served by the production ASP and relayer. The core contracts went live on 2026-09-01 (Keystore at block 25884228; the ASP indexes the pool from block 25893288). It is one of three production chains deployed deterministically, so the core addresses below are identical on BNB Chain and Citrea.

Contract addresses

PoolVault 0x0Eb42804BF897662aF851370eaeAdcDBEC1b97ed (UUPS proxy; implementation 0x5f89cd5c3610c2ad870b1b33126d209fecdb69c7)
Entrypoint 0xca1e072236D231130059eeA6Bfceb7F4e9a1F0C3
Keystore 0x6E463391c79b7e1A88eF26E0B023f9A6C9938a71
ASPRegistry 0x259C0BEa1d783c202509BD3b2688d23b8AEf58B0
AccessRouter 0x40a6bC296D87f71Ab31Ca3Bfb50513441fBD5160
PrivacyPoolRelay 0x01a8Fa4dbb60187aD8d3c3d08E7Fb8C14198A461. The full relay: MAX_BATCH() answers 10 and ANNOUNCER() is the canonical ERC-5564 announcer, so relayBatch, relayAndAnnounce, and registerAndRelay are all available.
RelaySwaps 0xd0395c08DD8eA7671a7A65bDca8E473e8E8260a8 (owner 0x0967755AfA2016866D12EefB820705026842dCe8). Its approvedZapList() holds the three yield zaps below, so yield-share notes can be spent through executeUnwrapped.
Deposit verifier 0x49Ab3f48Ff9fa603EE81E5f28eB4214798E29862
Ragequit verifier 0x687059Fc9C2488f333e06aa72CBea7E4b1D05B57
Transact verifiers The 5×5 grid is registered on the vault (transact_1x1 at 0x1C838Ca4BB05838907E99A3e328e14d87a6859c1 through transact_5x5 at 0x20D183F61B7a0A0c502d136149a827C811750272; (6,6) is unregistered). Read any cell with PoolVault.verifiers(keccak256(abi.encode(n, m))).

Compatibility: SDK, circuits, deployed verifiers, and deployment addresses must all match. Mixing sets produces invalid proofs.

Parameters

rootHistorySize 16 state roots in the buffer, which is what bounds MAX_BATCH at 10.
maxStateTreeSize 4,194,304 (2^22).
keystoreRootLiveness 1200 seconds. A superseded keystore root stays valid for twenty minutes; see the threat model.
maxKeystoreTreeSize 262,144 (2^18) registrations.
Pause state Not paused at the time of writing.

How each path resolves

The SDK's default DEPLOYMENTS table still carries Sepolia only. To target mainnet, pass the addresses above as config.deployment, point aspUrl at the production ASP, and supply matching circuit artifacts. Relayer, processor, and yield-router addresses come from the production relayer's /v1/details, which lists this chain as mainnet with the contracts and yield deployments below. The 0xbow frontend pins the same set and cross-checks the relayer's published RelaySwaps against its pin before quoting a swap.

Tokens

Read the live configuration with Entrypoint.assets(asset) before quoting; the values below were read on 2026-09-22. The vetting fee is 0 bps on every enabled asset.

Native ETH (placeholder) 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee. Enabled; minAmount 0.004 ETH; maxRelayFee 0.5 ETH.
ppUSDC (yield share) 0xC246aFb23482fF9596E9cee5f1f678eFe0EB1ad6. Enabled; minAmount 10 shares; maxRelayFee 1200 shares (18-decimal share units, roughly the dollar figures of plain USDC).
ppUSDT (yield share) 0xA4cF419558Ef36CC6FfB666195684dC963910426. Enabled; minAmount 10 shares; maxRelayFee 1200 shares.
ppETH (yield share) 0x66051920D25af4E3596A8a46309F4D045F9D83B7. Enabled; minAmount 0.004 shares; maxRelayFee 0.5 shares.
USDC, USDT, WETH 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48, 0xdAC17F958D2ee523a2206206994597C13D831ec7, 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2. Not enabled as plain pool assets (enabled: false). On mainnet, stablecoins and WETH enter the pool only as the yield shares above, through PPRouter; the relayer lists them as swap inputs and outputs, not as depositable assets.

Yield deployments

Three Aave v3 positions are live, each a PPYieldToken wrapper with its zap and router. All three wrappers charge feeBps 2000 (the 20% cap, on yield only) and share the admin 0x12Dbd6335d7f529F8922420Ba9c15c9E7A324c92. The routers are the relayer's allowed_processors.

ppUSDC share 0xC246aFb23482fF9596E9cee5f1f678eFe0EB1ad6 over aEthUSDC 0x98C23E9d8f34FEFb1B7BD6a91B7FF122F4e16F5c · router 0xe76E793d776c1e207aD7a7fa7C57d27420d85110 (ERC-20 mode) · zap 0x9Ea986BcDF6784D85B518b15bEEE1E65b585817B · underlying USDC, 6 decimals
ppUSDT share 0xA4cF419558Ef36CC6FfB666195684dC963910426 over aEthUSDT 0x23878914EFE38d27C4D67Ab83ed1b93A74D4086a · router 0x13a0b86bac3e0C29bd64fED7BCD2EE84f371f41C (ERC-20 mode) · zap 0xDC3D922df81FC7B7f58229431ED91acB0482f3A5 · underlying USDT, 6 decimals
ppETH share 0x66051920D25af4E3596A8a46309F4D045F9D83B7 over aEthWETH 0x4d5F47FA6A74757f35C14fD3a6Ef8E3C9BC514E8 · router 0x77613D670BB9fD48A9898D0eac8ebf21B566F960 (native mode: NATIVE_MODE() answers true, so users deposit and receive ETH) · zap 0x33c1eEf370bBb447414156CFc4fDABD434776EAf · underlying WETH, 18 decimals

The ppUSDC and ppUSDT routers are the earlier ERC-20-only router build and do not expose NATIVE_MODE(); the ppETH router is the merged build that does. Both shapes serve withdrawToUnderlying with the same ABI, so the relayer drives all three through configuration alone.

ASP

ASP public key (X25519) 0x3f651e2321b9b78c3690064b025b610942cbf755e28d44726378cf853cfd8f34, served at /public-key. This differs from the dev ASP's key used on Sepolia; encrypting a label to the wrong one makes the deposit unattestable.
Attestation state An association-set root is published (latestASPRoot() and latestIPFSCID() both answer), so attested notes are spendable.

Relayer configuration

Base URL https://relayer-v2-prod-149184580131.us-east1.run.app (one multi-chain service; /v1/details lists chains 1, 4114, and 56)
Relayer signer EOA 0x9e2f1B234953F46c6091636290E9035618EA3C07, the gas wallet that signs quotes and submits transactions.
Processor for transfers and withdrawals PrivacyPoolRelay 0x01a8Fa4dbb60187aD8d3c3d08E7Fb8C14198A461
Processor for swaps and reshields RelaySwaps 0xd0395c08DD8eA7671a7A65bDca8E473e8E8260a8 (swapsSupported: true)
Processors for yield withdrawals the three PPRouters above, published as processors and yield[]
Fee shape The relayer publishes a fixed fee component of 21000 wei-equivalent per asset with no BPS component on this chain; the committed fee is what /v1/quote signs.

These relayer and processor addresses are what the production relayer publishes on 2026-09-22 and are not part of the SDK deployment table. They can change when the relayer redeploys; read /v1/details at runtime.

Governance

Roles live on the AccessRouter above. Read its RoleGranted and RoleRevoked events (from block 25884228) to see who currently holds DEFAULT_ADMIN_ROLE, UPGRADER_ROLE, and the operational roles; the deployment is not recorded in the monorepo's ChainDeploymentRegistry, so the registry cannot be used as a source for this chain.

Source: read live from chain and from the production ASP and relayer on 2026-09-22; the same set is pinned in the 0xbow frontend's config/prod-deployments.ts.