Protocol Reference
This section documents the on-chain system itself: the contracts, the circuits that authorize every user operation, and the ASP service that screens deposits.
Two kinds of state change run side by side:
- User operations (deposit, transact, ragequit) take effect only when their zero-knowledge proof verifies on-chain.
- Administrative changes (pausing, upgrades, verifier swaps, asset config, ASP-root publication) are authorized by roles through the AccessRouter.
Role holders control this surrounding machinery but cannot move user funds.
Contracts
The core, all UUPS proxies except the router:
Processors that call PoolVault.transact and route its public output, all immutable:
- PrivacyPoolRelay: plain relayed withdrawals, batches, atomic register-and-withdraw, and stealth announcements
- RelaySwaps: withdraw-and-swap, reshield, and cross-chain delivery through an aggregator
- PPRouter: deposit and withdrawal for yield-share notes
The yield stack that sits on top of the pool as ordinary assets:
- PPYieldToken: the non-rebasing ERC-4626 wrapper (aUSDC to ppUSDC)
- PPYieldTokenZap: stateless underlying-to-share conversion, the only Aave touchpoint
- Yield factories: one wrapper, zap, and router per asset
The proofs behind user operations are checked by separate generated Groth16 verifier contracts (deposit, ragequit, and twenty-five transact_NxM variants), which the vault holds and an UPGRADER_ROLE can swap as part of a deployment set. See AccessRouter and roles for the role-gated administrative paths.