# Privacy Pools v2 > Compliant private payments on Ethereum Sitemap: https://docs.privacypools.com/sitemap.xml Full docs for LLMs: https://docs.privacypools.com/llms-full.txt Agent overview: https://docs.privacypools.com/for-agents/overview Quickstart: https://docs.privacypools.com/introduction/quickstart ## Table of Contents - [ASP attestation](https://docs.privacypools.com/concepts/asp-attestation.md): The Association Set Provider (ASP) is operated by 0xbow and attests which deposit lineages are approved after screening. Without attestation, a [no... - [Commitments & nullifiers](https://docs.privacypools.com/concepts/commitments-and-nullifiers.md): Commitments and nullifiers are the two cryptographic objects that let the chain track who-spent-what without revealing identities or values. A comm... - [Discoverable vs out-of-band notes](https://docs.privacypools.com/concepts/discoverable-vs-oob.md): Three modes for delivering a [note](/concepts/notes)'s secret to its recipient. - [Keys](https://docs.privacypools.com/concepts/keys.md): Three private keys per account, derived from one EIP-712 signature. Each does one thing. - [Keystore tree](https://docs.privacypools.com/concepts/keystore-tree.md): The keystore tree is a Merkle tree (depth 18) of registered accounts. Registering puts your account in the tree and publishes your [viewing public ... - [Notes](https://docs.privacypools.com/concepts/notes.md): The fundamental unit of value in the pool. Every shielded balance is a set of notes. - [Selective disclosure](https://docs.privacypools.com/concepts/selective-disclosure.md): Per-transaction disclosure without revealing wallet history: the cryptographic foundation under payment receipts. - [State tree](https://docs.privacypools.com/concepts/state-tree.md): The state tree is an incremental Merkle tree (LeanIMT, depth 22) that holds every leaf ever inserted into the pool: [commitment](/concepts/commitme... - [Stealth addresses](https://docs.privacypools.com/concepts/stealth-addresses.md): Pay a withdrawal to a fresh, unlinkable address the recipient can find and spend without ever sharing an address: ERC-5564 meta-addresses, announce... - [Yield shares](https://docs.privacypools.com/concepts/yield-shares.md): How a shielded note can earn Aave interest without leaking how long it has been held: the note commits to a fixed share count in a non-rebasing wra... - [BNB Chain](https://docs.privacypools.com/deployments/bnb.md): BNB Chain (chainId 56) is a production deployment of Privacy Pools v2, served by the production ASP and relayer. The core contracts went live on 20... - [Citrea](https://docs.privacypools.com/deployments/citrea.md): Citrea mainnet (chainId 4114) is a production deployment of Privacy Pools v2, served by the production ASP and relayer. The core contracts went liv... - [Deployments](https://docs.privacypools.com/deployments/index.md): Contract addresses and deployment parameters per network. - [Ethereum mainnet](https://docs.privacypools.com/deployments/mainnet.md): Ethereum mainnet (chainId 1) is a production deployment of Privacy Pools v2, served by the production ASP and relayer. The core contracts went live... - [Sepolia (testnet)](https://docs.privacypools.com/deployments/sepolia.md): Sepolia testnet is the canonical development environment for Privacy Pools v2 (chainId 11155111). The 0xbow frontend, the SDK's default deployment ... - [Debugging](https://docs.privacypools.com/dev-guide/debugging.md): When something goes wrong end-to-end, here's where to look first. - [Failure modes](https://docs.privacypools.com/dev-guide/failure-modes.md): Errors you will hit, what they actually mean, and how to recover. - [Local setup](https://docs.privacypools.com/dev-guide/local-setup.md): Get a local Privacy Pools v2 development environment running against the Sepolia testnet. - [Testing](https://docs.privacypools.com/dev-guide/testing.md): How tests are organized in v2-monorepo and how to add your own. - [API surface index](https://docs.privacypools.com/for-agents/api-surface-index.md): A partial overview of the SDK's public API, handy for orientation but not a complete or authoritative listing. For the complete compiler-derived su... - [API Surface Tables (generated)](https://docs.privacypools.com/for-agents/api-surface-tables.md): Complete contract ABI + SDK export tables, generated from compiler-derived data at a pinned commit. - [Grep cheatsheet](https://docs.privacypools.com/for-agents/grep-cheatsheet.md): Where to look in the v2-monorepo codebase when you need to find something. Optimized for grep / glob, not for reading. - [Overview for AI agents](https://docs.privacypools.com/for-agents/overview.md): You're reading this because you're an AI agent (Claude, an MCP client, an LLM-driven coding tool) that needs to integrate with Privacy Pools v2. Th... - [Integration architecture](https://docs.privacypools.com/guides/integration-architecture.md): How to assemble a Privacy Pools v2 integration: what runs where, what to persist, and what to do when a dependency degrades. - [Quickstart](https://docs.privacypools.com/introduction/quickstart.md): Deposit ETH, discover your note, and send a private transfer in five minutes. - [Threat model](https://docs.privacypools.com/introduction/threat-model.md): This page lays out the threat model for Privacy Pools v2: what is private and when, who is in control of what, and what happens in adversarial cond... - [v1 vs v2: what changed](https://docs.privacypools.com/introduction/v1-vs-v2.md): How Privacy Pools v2 differs from v1: UTXO-style notes, private in-pool transfers, a keystore account model, and a unified multi-asset anonymity set. - [What is Privacy Pools v2?](https://docs.privacypools.com/introduction/what-is-pp-v2.md): A shielded-pool protocol on Ethereum with private transfers, selective disclosure, and ASP-mediated compliance. - [Accounts & keys](https://docs.privacypools.com/operations/accounts-and-keys.md): Derive your protocol keys from one wallet signature and register on the keystore, the prerequisite for spending anything you deposit. - [Batch withdraw](https://docs.privacypools.com/operations/batch-withdraw.md): Withdraw a whole single-asset balance to one address in a single transaction by bundling several transact proofs into one relayBatch. - [Check viewing-key registration](https://docs.privacypools.com/operations/check-registration.md): Look up whether an EVM address has a viewing key in the Keystore, which gates the discoverable versus out-of-band send paths. - [Create a payment request](https://docs.privacypools.com/operations/create-payment-request.md): Issue a shareable request whose tag lets incoming private payments match themselves to your invoice. - [Deposit](https://docs.privacypools.com/operations/deposit.md): Move ETH or an ERC20 into the pool and get a private note back once the ASP approves the deposit. - [Derive your protocol keys](https://docs.privacypools.com/operations/derive-keys.md): One EIP-712 signature yields four keys: nullifying, revocable, viewing private, and viewing public. They are wallet-deterministic and recoverable. - [Disclose your viewing key](https://docs.privacypools.com/operations/disclose-viewing-key.md): Provide your viewing private key for a full receive-history audit. Spending stays yours alone. - [Discover incoming payments by paymentId](https://docs.privacypools.com/operations/discover-by-paymentid.md): Find out when a request has been paid: discovery tag-matches incoming events and decrypts them with the request key. - [Discover your notes from chain](https://docs.privacypools.com/operations/discover-notes.md): Reconcile your local NoteManager with on-chain state, using the ASP note-events fast path when available. - [Encrypt a note to a published viewing key](https://docs.privacypools.com/operations/encrypt-to-pubkey.md): Skip the keystore lookup and encrypt directly against a viewing pubkey you already know. - [Export a note for sharing](https://docs.privacypools.com/operations/export-note.md): Pack a note's material into portable JSON to move it between your own devices or back it up. - [Generate a payment receipt](https://docs.privacypools.com/operations/generate-receipt.md): Prove a single payment to an accountant, verifiable against the chain, without handing over your viewing key. - [Get a fee quote from a relayer](https://docs.privacypools.com/operations/get-fee-quote.md): Ask a relayer what it'll cost to submit your transfer or withdrawal. The quote carries a signed fee commitment with an expiry. - [Import a note received out-of-band](https://docs.privacypools.com/operations/import-note.md): Claim a note someone sent you in out-of-band mode (you have the noteSecret but it's not encrypted on-chain). - [List notes by status, asset, or label](https://docs.privacypools.com/operations/list-notes.md): Query the local NoteManager. Filter by ACTIVE / PENDING / SPENT, by asset, or by deposit-lineage label. - [Manage notes](https://docs.privacypools.com/operations/manage-notes.md): Keep your local view of the pool in sync: discover, import, export, list, and verify your notes. - [Payment requests](https://docs.privacypools.com/operations/payment-requests.md): Issue an invoice-style request and have incoming private payments match themselves to it. - [Ragequit](https://docs.privacypools.com/operations/ragequit.md): Recover a note's full value through a public exit, even when the ASP refuses to cooperate. - [Receipts & viewing keys](https://docs.privacypools.com/operations/receipts-and-viewing-keys.md): Disclose individual payments when proof is needed, from a single receipt to a full receive-history audit. - [Register your viewing key on-chain](https://docs.privacypools.com/operations/register-viewing-key.md): Publish your viewing public key to the keystore so others can send you discoverable notes (no out-of-band hand-off). - [Relaying](https://docs.privacypools.com/operations/relaying.md): How prepared transactions reach the chain: signed fee quotes, processor binding, and what a relayer can and cannot do. - [Reshield](https://docs.privacypools.com/operations/reshield.md): Change a shielded asset without leaving the pool: withdraw, swap through an aggregator, and redeposit as a fresh note in one transaction, on this c... - [Rotate your revocable key](https://docs.privacypools.com/operations/rotate-revocable-key.md): Bump the revocable key index without losing notes or re-depositing, for key hygiene or compromise response. - [Self-relay directly to PoolVault](https://docs.privacypools.com/operations/self-relay.md): Submit a transfer or withdrawal yourself instead of using a relayer. Your wallet becomes the public submitter, so this is not a private path. - [Share a single-note secret](https://docs.privacypools.com/operations/share-single-note-secret.md): Disclose a single incoming note to a third party via the per-note ephemeral shared secret. Other notes stay private. - [Stealth withdraw](https://docs.privacypools.com/operations/stealth-withdraw.md): Pay a withdrawal to a one-time address the recipient can discover and spend, announced atomically so the announcement cannot name an address the wi... - [Submit a transfer or withdrawal via relayer](https://docs.privacypools.com/operations/submit-via-relayer.md): Hand a prepared transfer or withdrawal and signed quote to a relayer, who pays gas, submits on-chain, and splits the fee. - [Swap and deposit](https://docs.privacypools.com/operations/swap-and-deposit.md): Enter the pool from any wallet token: swap through an aggregator and deposit the output as a shielded note in one wallet transaction. - [Transfer](https://docs.privacypools.com/operations/transfer.md): Pay another account without leaving the pool. The chain shows no sender, no recipient, and no amount. - [Verify a payment receipt](https://docs.privacypools.com/operations/verify-receipt.md): Recompute the commitment locally and check on-chain that it's in the state tree. All four checks run client-side. - [Verify a note's spent status on-chain](https://docs.privacypools.com/operations/verify-spent.md): Confirm on-chain that a note is still unspent before picking it as an input. - [Withdraw and swap](https://docs.privacypools.com/operations/withdraw-and-swap.md): Leave the pool as a different token, on this chain or another, with the swap route frozen into the proof so the relayer cannot change it. - [Withdraw](https://docs.privacypools.com/operations/withdraw.md): Exit the pool to any public address, with no on-chain link back to where the value came from. - [Yield deposit](https://docs.privacypools.com/operations/yield-deposit.md): Shield a yield-bearing position: wrap the underlying into an exact number of ppUSDC shares and deposit them in one router transaction. - [Yield withdraw](https://docs.privacypools.com/operations/yield-withdraw.md): Unshield a yield-share note and unwrap it to the underlying for a recipient in one router call, with a slippage floor on what they receive. - [Attestation flow](https://docs.privacypools.com/protocol/asp/attestation-flow.md): This page walks the end-to-end timeline of a deposit moving through [ASP attestation](/protocol/asp/what-is-an-asp), from transaction confirmation ... - [Query the attestation snapshot](https://docs.privacypools.com/protocol/asp/query-attestation.md): Pull the full ASP-indexed event stream in one HTTP call. Backs status reconciliation during note discovery. - [ASP snapshot API](https://docs.privacypools.com/protocol/asp/snapshot-api.md): The snapshot API is the HTTP surface the [ASP](/protocol/asp/what-is-an-asp) exposes so clients can sync without scanning the chain directly. Its `... - [Verify an ASP root on-chain](https://docs.privacypools.com/protocol/asp/verify-asp-root.md): Check whether an ASP-attested root has been published to the ASPRegistry. This controls which deposits are spendable. - [What is an ASP](https://docs.privacypools.com/protocol/asp/what-is-an-asp.md): The Association Set Provider is a third-party service that gates which deposits are spendable through normal flows. The protocol delegates complian... - [Deposit circuit](https://docs.privacypools.com/protocol/circuits/deposit.md): The Deposit circuit proves a deposit is well-formed: the depositor knows a (noteSecret, depositSecret) pair that produces a specific [commitment](/... - [Circuit helpers](https://docs.privacypools.com/protocol/circuits/helpers.md): The main circuits share a small set of reusable circom templates, listed below. - [Ragequit circuit](https://docs.privacypools.com/protocol/circuits/ragequit.md): The ragequit circuit is the public-exit proof for any unspent note. The **current note owner** proves keystore membership and knowledge of the note... - [Transact circuit (NxM)](https://docs.privacypools.com/protocol/circuits/transact.md): The transact circuit is the NxM family of spend proofs. A proof states that the prover spent N input [notes](/concepts/notes) whose [nullifiers](/c... - [AccessRouter and roles](https://docs.privacypools.com/protocol/contracts/access-control.md): The protocol separates two kinds of state change: - [ASPRegistry contract](https://docs.privacypools.com/protocol/contracts/asp-registry.md): The ASPRegistry stores the append-only history of [ASP](/concepts/asp-attestation)-attested roots. Spending circuits prove their note's label is in... - [Entrypoint contract](https://docs.privacypools.com/protocol/contracts/entrypoint.md): The Entrypoint is the front door for [deposits](/operations/deposit). It handles asset configuration, vetting fees, and [access control](/protocol/... - [Keystore contract](https://docs.privacypools.com/protocol/contracts/keystore.md): The Keystore is the on-chain registry of [viewing keys](/concepts/keys). Recipients register by calling `setAuthPolicy` and then `setViewingKey`, a... - [PoolVault contract](https://docs.privacypools.com/protocol/contracts/pool-vault.md): PoolVault is the core contract. It holds user funds (native ETH and ERC20), maintains the [state tree](/concepts/state-tree) of timestamped [commit... - [PPRouter contract](https://docs.privacypools.com/protocol/contracts/pp-router.md): The yield router: wraps an underlying into an exact number of ppUSDC shares on deposit, and acts as the transact processor that unwraps shares to t... - [PPYieldTokenZap contract](https://docs.privacypools.com/protocol/contracts/pp-yield-token-zap.md): Stateless underlying-to-share conversion and the yield stack's only Aave touchpoint: exact-share minting with a 2-unit rounding buffer and balance-... - [PPYieldToken contract](https://docs.privacypools.com/protocol/contracts/pp-yield-token.md): The non-rebasing ERC-4626 wrapper that turns an Aave aToken into a pool asset (aUSDC to ppUSDC): fixed 18-decimal shares, a live exchange rate, and... - [PrivacyPoolRelay contract](https://docs.privacypools.com/protocol/contracts/privacy-pool-relay.md): PrivacyPoolRelay is the fee-splitting processor that [relayers](/operations/relaying) call into: it wraps [`PoolVault`](/protocol/contracts/pool-va... - [RelaySwaps contract](https://docs.privacypools.com/protocol/contracts/relay-swaps.md): The withdraw-and-swap processor: forwards a withdrawal to an allowlisted aggregator with proof-bound calldata, covering swap-out, reshield, and cro... - [Yield factories](https://docs.privacypools.com/protocol/contracts/yield-factories.md): The three owner-gated factories that deploy one wrapper, zap, and router per Aave asset, check aToken genuineness against one trusted pool, and see... - [Protocol Reference](https://docs.privacypools.com/protocol/index.md): The on-chain system: contracts, circuits, and the ASP service. - [OTC private swap](https://docs.privacypools.com/recipes/otc-swap.md): Swap shielded assets between two parties, each submitting their own leg without a shared relayer. - [Payment request](https://docs.privacypools.com/recipes/payment-request.md): Invoice privately: issue a request, get paid against it, and have the payment match itself to the invoice. - [Paying many recipients](https://docs.privacypools.com/recipes/payroll-cycle.md): Pay a whole roster from one wallet's notes in a single cycle, with a receipt for every recipient. - [Receipt export and auditor verification](https://docs.privacypools.com/recipes/receipt-export-and-audit.md): Send a payment, export its receipt, and let a third party verify it against the chain. - [Single deposit and withdraw](https://docs.privacypools.com/recipes/single-deposit-withdraw.md): The smallest complete integration: deposit ETH, wait for approval, and withdraw to a fresh address. - [Circuit artifacts loaders](https://docs.privacypools.com/sdk/circuit-artifacts.md): This page explains how the SDK gets WASM, proving keys (zkey), and verification keys (vkey) into the prover. Three implementations cover different ... - [Crypto services](https://docs.privacypools.com/sdk/crypto-services.md): The cryptographic primitives the SDK builds on. Each is a service you can use independently or get via a session. - [SDK Reference](https://docs.privacypools.com/sdk/index.md): The TypeScript SDK surface: sessions, note management, crypto services, and types. - [NoteManager](https://docs.privacypools.com/sdk/note-manager.md): The NoteManager is the local index of your [notes](/concepts/notes): what you have, each note's status, and the discovery cursor. It is held in the... - [PoolSessionBuilder](https://docs.privacypools.com/sdk/pool-session-builder.md): Entry point for the TypeScript SDK. Wires config to a runnable PoolSession. - [PoolSession](https://docs.privacypools.com/sdk/pool-session.md): Method-by-method reference for the SDK's main runtime object: signatures, parameters, returns, and errors. - [Stealth module](https://docs.privacypools.com/sdk/stealth.md): Export-by-export reference for @privacy-pools-v2/sdk/stealth: ERC-5564 derivation, scanning, announcement binding, and the deposit-payload carrier. - [Types reference](https://docs.privacypools.com/sdk/types-reference.md): Field-by-field shapes for the SDK's public parameter, result, and data types, and the error catalog. - [Signing in with an account key](https://docs.privacypools.com/using/account-key-sessions.md): What an account key is, what a key session can and can't do, and when you need the wallet instead. - [Claiming money you've received](https://docs.privacypools.com/using/claiming-a-payment.md): What the Claim state means, what Register and claim does, what it costs, and what still needs doing afterwards. - [Depositing to an address that hasn't registered](https://docs.privacypools.com/using/deposit-to-unregistered.md): What changes when you deposit to someone who hasn't set up Privacy Pools yet, what you have to send them, and what they do with it. - [Exit: the emergency withdrawal](https://docs.privacypools.com/using/exit.md): What the Exit action does, what it costs you, when it's the right move, and the two kinds of note it can't reach. - [Paying a payment request](https://docs.privacypools.com/using/paying-a-request.md): The two ways to pay a request, which one to pick, what each costs you, and what the recipient sees. - [The relayer fee and who pays it](https://docs.privacypools.com/using/relayer-fees-and-exact-amounts.md): Why private sends and withdrawals go through a relayer, what the fee covers, what the exact-amount toggle changes, and what stays visible. - [Sending to someone who hasn't registered](https://docs.privacypools.com/using/sending-to-unregistered.md): Why the Send flow stops to ask, what the one-time link is, and what you must do with it. - [Why the app warns you about withdrawing everything](https://docs.privacypools.com/using/withdrawing-everything.md): What the full-withdrawal warning is protecting, what the 75% option does, and how to leave the pool without linking your deposit to your withdrawal.