{
"unverifiedContracts": [
"eth:0xd0395c08DD8eA7671a7A65bDca8E473e8E8260a8"
],
"yellowWarning": "Privacy Pools v2 opened to the public on 2026-10-20 after a capped beta. We are still early, so the ratings rest on the design and ignore the small anonymity set."
}
display+17-0
{
"badges": [],
"description": "A shielded ledger with private transfers, swaps and Aave yield inside the pool, where only deposits the ASP approves can be spent privately.",
"detailedDescription": "Privacy Pools v2 lets you shield ETH, USDC or USDT in one pool, then send, swap, earn Aave yield and withdraw without a visible link to the deposit. Only deposits that 0xbow's association set provider (ASP) approves can be spent privately. Depositors, recipients, amounts and timing at the pool's edges stay public.\n\nUsers trust 0xbow, which runs the ASP, the only relayer and the website, and one key that can upgrade every core contract without delay. The ASP can withhold or revoke approval for any deposit. Exiting is permissionless: a note's owner can always ragequit it from the vault, losing their privacy.\n\n### Architecture\n\nA note is a private record of value in one asset, owned by an Ethereum address. Each deposit creates a note with a label, which the ASP approves or revokes. The label travels inside every note descending from it, so each recipient learns it. Notes from different deposits never merge. The PoolVault holds all assets and a state tree of note commitments and spent nullifiers. The Keystore holds each account's registration: a hash of its nullifying key, its auth policy and an X25519 viewing public key. The ASPRegistry holds the latest root of the approved labels. USDC, USDT and ETH enter as yield shares, ppUSDC, ppUSDT and ppETH, which wrap Aave v3 deposits.\n\n### Flow\n\n1. **Register.** Two transactions from your wallet add your account to the Keystore and publish your viewing public key.\n2. **Shield.** You deposit through the Entrypoint. USDC, USDT and ETH pass through a PPRouter that supplies Aave and deposits the shares. Your address, asset and amount are public, and the data that ties the deposit to its label goes onchain encrypted to the ASP.\n3. **Approval.** The ASP screens the depositor, adds the label to its list and posts the root onchain, with the list on IPFS.\n4. **Send.** A transact proof spends your notes and creates one for the recipient, encrypted to their viewing key and published onchain, plus change for you. An unregistered recipient gets a claim link instead. 0xbow's relayer submits the proof onchain and takes its fee as a public withdrawal.\n5. **Withdraw.** The relayer pays any address, minus its fee. Change stays as a note.\n\n### Keys\n\nAll keys derive from one signature of the user's wallet. Contract wallets and signers that cannot sign the same way twice can use a passkey instead. The derived account key can be exported from the app. Sharing the viewing private key reveals every incoming note, a receipt reveals one payment. The revocable key can be rotated, and the old one stays valid for 20m.\n\n### App\n\nThe ratings assume the website at [privacypools.com](https://privacypools.com), built from [public source](https://github.com/0xbow-io/privacy-pools-website-v2) and hosted by 0xbow. It reads the chain from Alchemy under 0xbow's key unless the user sets an endpoint per chain. It downloads the pool's events whole from the ASP but offers only 0xbow's relayer. Its Tor option requires a user-run Tor gateway and covers only RPC calls. It does not support connecting a local node with Tor enabled. Privacy Pools v2 is deployed on BNB Chain, Citrea, Optimism, Base, Arbitrum and Robinhood Chain, which L2BEAT does not track.\n\n### Swaps and yield\n\nThe yield shares keep a fixed share count while their value grows, so the share count encodes the exchange rate on the deposit day. Withdraw-and-swap sends the withdrawn asset through LI.FI to another token or chain, with the route bound into the proof. A reshield swaps into another pool asset and deposits again in the same transaction, as a fresh deposit that needs approval again.\n\n### Exits\n\n**Ragequit.** The note's current owner can take out its full value at any time, approved or not, directly from the vault, also while it is paused. It publishes the owner, the amount, the label and the commitment, which names the transaction that created the note. A transferred note's label can still point back to someone else's deposit. **Claim link.** A payment to an unregistered address can only be claimed with the link the payer holds. Until then the funds can neither move nor exit. **Relaying.** The contracts accept a proof from any address, and the proof fixes the recipient and the fee. A relayer other than 0xbow's needs the user's own build of the website or another client.\n\n### Compliance\n\nThe ASP screens each depositor before approving the deposit, under 0xbow's own due diligence, and may reject it. Every private spend must prove its notes' labels (which privately tie them to a deposit) against the latest list, so a later list can revoke an approval and freezes every note descending from that deposit. A rejected deposit can leave only by ragequit. The user can report an address to the ASP, or ask it whether 0xbow's services refuse their wallet, by signing a message.\n\n### Fees\n\nDeposits pay no vetting fee. The relayer quotes its fee per request and takes it from the sent or withdrawn asset, within a cap per asset set by the entrypoint manager. A private transfer pays that fee as a public payout from the vault. The yield shares keep 20% of the Aave yield for 0xbow.\n\n### Anonymity set\n\nOne vault holds every asset, but a withdrawal names its asset. The set is therefore the ASP-approved deposits of that asset whose notes still hold at least the withdrawn amount, including the notes that transfers and reshields created from them. We count every depositor of the asset, approved or not.",
"links": {
"websites": [
"https://privacypools.com"
],
"documentation": [
"https://privacy-pools-v2-docs.vercel.app"
],
"repositories": [
"https://github.com/0xbow-io/privacy-pools-v2-monorepo",
"https://github.com/0xbow-io/privacy-pools-website-v2"
]
}
}
colors+1-0
null
ecosystemColors+1-0
null
milestones+23-0
[
{
"title": "Privacy Pools v2 public launch",
"url": "https://github.com/0xbow-io/privacy-pools-website-v2/releases/tag/v1.0.0",
"date": "2026-10-20T00:00:00Z",
"description": "The v2 app opens at privacypools.com with transfers, swaps and yield inside the pool.",
"type": "general"
},
{
"title": "Beta verifiers used single-contributor keys",
"url": "https://github.com/0xbow-io/privacy-pools-v2-monorepo/blob/61fac03acd1fc306164ddc234f7fac4147d04493/CHANGELOG.md",
"date": "2026-10-20T00:00:00Z",
"description": "From 2026-09-01 until this rotation, every verifier held a developer key, not the ceremony key.",
"type": "incident"
},
{
"title": "Mainnet beta with a $100 deposit cap",
"url": "https://github.com/0xbow-io/privacy-pools-website/pull/232",
"date": "2026-09-03T00:00:00Z",
"description": "The production contracts take their first deposits, capped at $100 each by the ASP and the app.",
"type": "general"
}
]
{
"creator": "0xbow",
"projectsForTvs": [
{
"projectId": "privacy-pools-v2",
"sinceTimestamp": 1788287903
}
],
"proofSystemInfo": "",
"techStack": {
"zkVM": [
{
"id": "BN254",
"type": "curve",
"name": "BN254",
"description": "BN254, aka BN256, aka alt_bn128 pairing-friendly 254-bit prime field Weierstrass elliptic curve."
},
{
"id": "Snarkjs",
"type": "Groth16",
"name": "Snarkjs",
"description": "Circom / iden3 implementation of Groth16 proving system written in JS."
}
]
},
"trustedSetups": [
{
"proofSystem": {
"id": "Snarkjs",
"type": "Groth16",
"name": "Snarkjs",
"description": "Circom / iden3 implementation of Groth16 proving system written in JS."
},
"id": "PrivacyPoolsV2",
"name": "Privacy Pools v2",
"risk": "yellow",
"participantCount": 80,
"shortDescription": "Trusted setup for the 27 Groth16 Privacy Pools v2 circuits. It was built on top of 80 phase 1 contributions, with 500 phase 2 contributions per circuit from 597 participants and a RANDAO beacon. Proving system could be broken if either phase 1 or 2 is compromised.",
"longDescription": "Trusted setup for the 27 Groth16 Privacy Pools v2 circuits: deposit, ragequit and 25 transact circuits, one per combination of 1 to 5 spent notes and 1 to 5 created notes.\n\nPhase 1 is the 80th contribution to the [Perpetual Powers of Tau ceremony](https://github.com/privacy-ethereum/perpetualpowersoftau), prepared for 2^18 constraints.\n\nPhase 2, named ppv2-ceremony, ran publicly from 2026-07-08 to 2026-07-14 with 500 contributions per circuit from 597 distinct participants, followed by one beacon contribution from the RANDAO reveal of beacon-chain slot 14767039. Participants are pseudonymous in the published transcript. The final proving keys, their verification keys and the transcript are published with release v1.0.0 of the monorepo, and the ceremony code is open source.\n\n- Phase 1 ceremony: .\n- Ceremony code and UI: .\n- Ceremony description and key hashes: .\n- Final keys and transcript: ."
}
],
"verifierHashes": [
{
"hash": "Privacy Pools v2 verifiers 20.10.2026",
"name": "Privacy Pools v2 verifiers v1.0.1",
"sourceLink": "https://github.com/0xbow-io/privacy-pools-v2-monorepo/tree/61fac03acd1fc306164ddc234f7fac4147d04493/packages/circuits",
"proofSystem": {
"id": "Snarkjs",
"type": "Groth16",
"name": "Snarkjs",
"description": "Circom / iden3 implementation of Groth16 proving system written in JS."
},
"knownDeployments": [
{
"address": "eth:0xEe96Ca04d2Ab2eC9A8803eb78F39b2875dFF6fdf"
},
{
"address": "eth:0x5a06582115953E2cAbeD8e6A0EeAE35BA430118f"
},
{
"address": "eth:0x21347145497569b34efAB7d73952208866520042"
},
{
"address": "eth:0x0e13d94235d8a0d8f9fC3B63BB41D666eF0677Ed"
},
{
"address": "eth:0xC5E1D9D9CF12E796Ec8E072646c6BF29A1e55382"
},
{
"address": "eth:0x3ee4A00e0ba1AC0Ef8aD3e4b541CA42FBB4592c3"
},
{
"address": "eth:0xfa0138C5dE45E520AbA349BE38a827DAb470f70A"
},
{
"address": "eth:0x338625F2199675D2aC4Fbf7A89567864ac990710"
},
{
"address": "eth:0xAc716f21626994c4264eA457Fe208071050611B5"
},
{
"address": "eth:0xB8aa00333b8D6958da72A15D59179BbDD1e49064"
},
{
"address": "eth:0xF1C6c55B70EC3Df923f5E9bcd64aee5c3073C42c"
},
{
"address": "eth:0x62Cf8963300F284016daE0cD19f5D9BC60846a46"
},
{
"address": "eth:0x579f6734d35937b8432BA8FfC17C3120eb657c82"
},
{
"address": "eth:0x76D574559765fd4b90903fFa682964Ae7e7e878a"
},
{
"address": "eth:0xAeCDf3E27A602f23cEc2E5CE250093b3E806D041"
},
{
"address": "eth:0xe0aec1eE10eBfCDcB09b6e5a7ea6Ae34D066219d"
},
{
"address": "eth:0xFdF4EbC7645E1F4c04aE33285b6e3f78e4A3a275"
},
{
"address": "eth:0x909ECAF2A4959726a2BC3d82Fc837B8D3F1c61d3"
},
{
"address": "eth:0x454F1Da26DD4c7c89a849019BeC4c7C7C404d3A4"
},
{
"address": "eth:0x95dEC97ac78E8C0FfDc6315FDc0A0791238b93A3"
},
{
"address": "eth:0x4Cb752CEF56a5095321Ed72699cD7A699D48F4b5"
},
{
"address": "eth:0x01b4954E3b3C1F68785f60D7465c38C31266bfab"
},
{
"address": "eth:0x61573Cf3c3A20C9739b68B8e742Ca51971387Cb5"
},
{
"address": "eth:0x8ABfb288dAc87392EaFdD59F6809825fcA0e8b85"
},
{
"address": "eth:0x20D4B794A2A1ae7A34AF184172dd931d3ff2Fa32"
},
{
"address": "eth:0x766c2F31483935CD55355fcE00fc5eDB82A15acC"
},
{
"address": "eth:0x7BeE2554970A749D7671424DFa3fAbE15d7e4BD8"
}
],
"verificationStatus": "successful",
"attesters": [
{
"id": "l2beat",
"name": "L2BEAT",
"link": "https://l2beat.com"
}
],
"verificationSteps": "Privacy Pools v2 uses 27 Groth16 circuits: `deposit`, `ragequit` and `transact_NxM` for 1 to 5 spent notes (N) and 1 to 5 created notes (M). The PoolVault holds the deposit and ragequit verifier addresses and routes each transact proof to the verifier registered for its (N, M). Each verifier contract hard-codes its verification key. The steps below tie the deployed bytecode to the published circuit sources and ceremony keys.\n\nSteps, all on monorepo tag `v1.0.2` (commit `61fac03acd1fc306164ddc234f7fac4147d04493`), whose circuit sources, `.r1cs` files and keys are those of release `v1.0.0`:\n\n1. Compile every main circuit under `packages/circuits/circuits/main` with circom 2.2.3, `--O1`, circomlib 2.0.5 and `@zk-kit/binary-merkle-root.circom` 2.0.0, the toolchain `circomkit.json` and `package.json` pin. The sha256 of each produced `.r1cs` equals the committed `packages/circuits/build//.r1cs` (Git LFS).\n2. Download the circuit tarballs and `transcript.json` of release `v1.0.0` and check them against `circuits-v1.0.0-SHA256SUMS.txt`. The sha256 of each `groth16_pkey.zkey` equals the hash in `packages/circuits/CEREMONY.md` and the transcript's `finalZkeyHash`.\n3. Download the phase 1 file `ppot_0080_18.ptau` (Perpetual Powers of Tau contribution 80, sha256 `9693220206afab749e3d88d4ab5fdf5d36120ea102e7e587ccea0e7a5208e711`).\n4. Run `snarkjs zkey verify .r1cs ppot_0080_18.ptau .zkey` (snarkjs 0.7.5) for all 27 circuits. Each key verifies with 500 contributions and the beacon contribution 501. For `deposit`, the 500 contribution hashes equal the transcript's `serverContributionHash` values in order and contribution 501 equals its `finalContributionHash`.\n5. Read the runtime bytecode of the 27 verifiers the PoolVault names at block 26235496 and check that every coordinate of `vk_alpha_1`, `vk_beta_2`, `vk_gamma_2`, `vk_delta_2` and `IC` in the committed `groth16_vkey.json` appears in it as a PUSH constant (values with leading zero bytes use shorter pushes). All 27 match.\n6. Build `packages/contracts/src/verifiers/VerifierArtifacts.sol` with `forge build` under `packages/contracts/foundry.toml` (solc 0.8.32, via-IR, 10,000 optimizer runs, EVM version prague). The runtime bytecode of each verifier equals the deployed one, metadata hash included."
}
]
}
interopConfig+1-0
null
privacyInfo+566-0
{
"adversaries": {
"promise": {
"protects": "linkage",
"text": "Hides which deposit funds which withdrawal and who pays whom inside the pool, for deposits the ASP approves. Deposits and withdrawals are public."
},
"adversaries": [
{
"id": "publicObserver",
"label": "Public observer",
"description": "Everyone with a block explorer and some basic tools. Sees every public onchain event, but does no correlation beyond following links.",
"examples": "A curious counterparty, an employer, a journalist."
},
{
"id": "chainAnalyst",
"label": "Chain analyst",
"description": "Scrapes all public data and correlates it: timing, amounts, gas and wallet fingerprints, address clusters.",
"examples": "Chain analytics firms, ZachXBT, data brokers."
},
{
"id": "networkObserver",
"label": "Network observer",
"description": "Sits between the user and the services and sees traffic only: ISPs, VPNs, Tor exits, public RPCs and relayers. Learns IP addresses, timing, fingerprints and ciphertext. Services the operator runs count as the insider.",
"examples": "Infura or Alchemy, a Tornado relayer, a wallet vendor selling telemetry, Google captcha or analytics in the dapp frontend."
},
{
"id": "privilegedInsider",
"label": "Privileged insider",
"description": "Holds an operator role, custodies funds, receives keys or plaintext by design, or delivers the client: upgrade admin, custodian, view key holder, enclave operator, association set provider, hosted prover, registry, frontend host.",
"examples": "A compliance backdoor key, a DAO with an upgrade key, a KMS committee, an ASP operator, a custodial bridge."
},
{
"id": "futureAdversary",
"label": "Future adversary",
"description": "Harvest now, decrypt later. Holds every byte ever published and runs the known quantum attacks: elliptic curves, pairings and RSA fall. Hashes, symmetric ciphers and post-quantum schemes stand until an attack on them is known.",
"examples": "An intelligence agency archiving chain data today, then anyone once a break is public."
}
],
"fields": [
{
"id": "sender",
"label": "Sender",
"subject": "Sender",
"promiseLabel": "Sender privacy",
"description": "The Ethereum address that funds entered from, or that initiated a transfer."
},
{
"id": "recipient",
"label": "Recipient",
"subject": "Recipient",
"promiseLabel": "Recipient privacy",
"description": "Who receives the funds: the address they exit to, the receiver of a transfer, or whoever controls a one-time receiving address."
},
{
"id": "amount",
"label": "Amount",
"subject": "Amounts",
"promiseLabel": "Amount privacy",
"description": "The value moved."
},
{
"id": "asset",
"label": "Asset",
"subject": "Asset",
"promiseLabel": "Asset privacy",
"description": "Which token is moved."
},
{
"id": "linkage",
"label": "Link",
"subject": "Link",
"promiseLabel": "Link privacy",
"description": "Whether the entry and exit of the same funds, or sender and recipient of the same transfer, can be tied together."
}
],
"cells": {
"publicObserver": {
"sentiment": "good",
"exposureShort": "A zero-knowledge proof hides which approved notes a withdrawal or transfer spends, and a transfer publishes only encrypted notes.",
"exposureContinued": "A relayed transfer pays its fee as a public withdrawal to the relayer, so transfers are visible as events. A ragequit publishes the owner, the amount, the label and the commitment, which names the transaction that created the note. Claiming a payment to an unregistered address registers that wallet.",
"advice": "Exit through a relayer, so none of your wallets pay gas for the receiving address. Ragequit only notes you deposited and never spent from. On any other note, a ragequit names the private transaction that created it.",
"interior": {
"sender": "private",
"recipient": "private",
"amount": "private",
"asset": "private",
"linkage": {
"verdict": "atRisk",
"note": "A ragequit names the transaction that created the note."
}
},
"sources": [
{
"contract": "PoolVault"
},
{
"title": "Transact circuit",
"url": "https://github.com/0xbow-io/privacy-pools-v2-monorepo/blob/61fac03acd1fc306164ddc234f7fac4147d04493/packages/circuits/circuits/templates/Transact.circom"
},
{
"title": "Relayed transfers pay the fee as a public output",
"url": "https://privacy-pools-v2-docs.vercel.app/operations/transfer"
},
{
"title": "Ragequit publishes the label and owner",
"url": "https://privacy-pools-v2-docs.vercel.app/operations/ragequit"
}
],
"id": "publicObserver",
"value": "Link private",
"alsoExposed": []
},
"chainAnalyst": {
"sentiment": "warning",
"exposureShort": "A note's label passes to every later payee, and the ASP update that first approved it often leaves one candidate deposit.",
"exposureContinued": "The ASP adds ten labels per update, decoys included, so an update that follows a single deposit names it. Without a payee, a relayed exit of a common amount hides among every approved deposit of its asset. Any amount is allowed, so an unusual one pairs a deposit with its withdrawal, and a yield deposit's share count encodes the day it was made. Paying gas from the user's wallet instead of a relayer exposes its fingerprint, account implementation and fee habits, even from a fresh address.",
"advice": "Reshield into another asset before paying someone who should not learn the deposit, since the reshield deposits the funds again under a new label. Use a pool with a large anonymity set. Withdraw common amounts rather than everything at once. Wait before exiting and pick a different time of day than the deposit. Exit to a fresh address every time and spend from it with a different wallet than the one that deposited.",
"interior": {
"sender": "private",
"recipient": "private",
"amount": "private",
"asset": "private",
"linkage": {
"verdict": "atRisk",
"note": "A received note's label, an unusual amount or a share count only one deposit day produces can pair the two ends."
}
},
"sources": [
{
"title": "Every output note inherits the label of an input",
"url": "https://github.com/0xbow-io/privacy-pools-v2-monorepo/blob/61fac03acd1fc306164ddc234f7fac4147d04493/packages/circuits/circuits/templates/helpers/ValueConservation.circom"
},
{
"contract": "ASPRegistry",
"title": "Each root update links its list on IPFS"
},
{
"title": "Share counts encode the exchange rate at deposit",
"url": "https://privacy-pools-v2-docs.vercel.app/concepts/yield-shares"
},
{
"title": "Tutela (arXiv:2201.06811)",
"url": "https://arxiv.org/abs/2201.06811"
}
],
"id": "chainAnalyst",
"value": "Link at risk",
"alsoExposed": []
},
"networkObserver": {
"sentiment": "warning",
"exposureShort": "The default RPCs, Alchemy under 0xbow's key with a public node as fallback, see the account at sign-in and can time it against the withdrawal.",
"exposureContinued": "Network services like the LI.FI swap service and Sentry error reporting receive your IP address unless the app is used over Tor or a VPN, while the Tor mode is not compatible with a local Ethereum node. The app confirms a relayed withdrawal from bulk reads, so no request names it, and the pairing rests on timing, which Tor does not hide. The app downloads the pool's events whole from the ASP and matches notes locally. The relayer learns the recipient at quote time. Tor Browser works, but the relayer refuses many Tor exits and the app offers no other relayer.",
"advice": "Set your own node, served over https, as the endpoint for the chain before signing in. Withdraw in a new Tor Browser session signed in with your account key, so no wallet is connected, and retry on a new circuit when the relayer refuses.",
"interior": {
"sender": "private",
"recipient": "private",
"amount": "private",
"asset": "private",
"linkage": {
"verdict": "atRisk",
"note": "Private only from an own node, with a new Tor Browser session for the exit."
}
},
"sources": [
{
"title": "Alchemy first, public node last",
"url": "https://github.com/0xbow-io/privacy-pools-website-v2/blob/bfb752cdf7c0659bb4fd25e97933e04fce844c4a/config/rpc-order.ts#L55-L70"
},
{
"title": "Allowlist refuses per-note reads and topic filters",
"url": "https://github.com/0xbow-io/privacy-pools-website-v2/blob/bfb752cdf7c0659bb4fd25e97933e04fce844c4a/services/egress-policy.ts#L447-L520"
},
{
"title": "The receive quote carries the recipient",
"url": "https://github.com/0xbow-io/privacy-pools-website-v2/blob/bfb752cdf7c0659bb4fd25e97933e04fce844c4a/services/egress-policy.ts#L606-L617"
},
{
"title": "Tor needs a gateway the user runs",
"url": "https://github.com/0xbow-io/privacy-pools-website-v2/blob/bfb752cdf7c0659bb4fd25e97933e04fce844c4a/config/tor.ts#L1-L50"
}
],
"id": "networkObserver",
"value": "Link at risk",
"alsoExposed": []
},
"privilegedInsider": {
"sentiment": "warning",
"exposureShort": "The ASP postman can publish a new approved list at any time with no delay, and every private spend must prove against the latest one.",
"exposureContinued": "A list without a deposit's label freezes every note descending from it, and a list with few labels narrows the set to them. 0xbow's relayer sees the IP and recipient of every private exit and its ASP feeds see the IP of every session, so one operator can pair a deposit session with its withdrawal. The request logs of its Alchemy key show it the account each sign-in looks up, which it can time against the withdrawals its relayer submits. One key holds every admin role and can upgrade the four core contracts without delay.",
"advice": "Before withdrawing, check the size of the approved list behind the latest root, which the ASPRegistry links on IPFS. Exit as the network observer advice says, so 0xbow sees no IP it saw at the deposit and no account lookup.",
"interior": {
"sender": "private",
"recipient": {
"verdict": "atRisk",
"note": "The relayer sees the recipient of every exit, with the IP that asked."
},
"amount": "private",
"asset": "private",
"linkage": {
"verdict": "atRisk",
"note": "The ASP can narrow the approved list, and 0xbow can pair sessions across ASP, relayer and its Alchemy logs."
}
},
"sources": [
{
"contract": "ASPRegistry",
"title": "updateASPRoot: the postman sets a new root with no delay"
},
{
"contract": "PoolVault",
"title": "transact: only the latest ASP root is accepted"
},
{
"title": "What the relayer receives, the IP included",
"url": "https://privacy-pools-v2-docs.vercel.app/introduction/threat-model"
},
{
"title": "Alchemy request logs show the key owner each payload",
"url": "https://www.alchemy.com/docs/alchemy-request-logs"
}
],
"id": "privilegedInsider",
"value": "Link at risk",
"alsoExposed": [
{
"field": "recipient",
"exposure": "atRisk"
}
]
},
"futureAdversary": {
"sentiment": "bad",
"exposureShort": "Every registered account's viewing public key sits in the Keystore, so whoever breaks elliptic-curve cryptography decrypts every note ever sent to it from the chain.",
"exposureContinued": "A decrypted note holds value, token and deposit lineage, which pairs each transfer's commitments with their deposit and recipient. Accounts created from a wallet signature reduce to that wallet's key. Breaking the ASP's key the same way decrypts the data that ties each deposit to its label.",
"interior": {
"sender": "exposed",
"recipient": "exposed",
"amount": "exposed",
"asset": "exposed",
"linkage": "exposed"
},
"sources": [
{
"contract": "Keystore",
"title": "viewingKeys: X25519 public key per account"
},
{
"title": "Notes encrypted with X25519 ECDH and XChaCha20",
"url": "https://github.com/0xbow-io/privacy-pools-v2-monorepo/blob/61fac03acd1fc306164ddc234f7fac4147d04493/packages/core-sdk/src/services/NoteComputationService.ts#L242-L260"
},
{
"title": "Three keys from one wallet signature",
"url": "https://github.com/0xbow-io/privacy-pools-v2-monorepo/blob/61fac03acd1fc306164ddc234f7fac4147d04493/packages/core-sdk/src/services/AbstractCryptoService.ts#L147-L195"
},
{
"section": "trusted-setups"
}
],
"id": "futureAdversary",
"value": "Link exposed",
"alsoExposed": [
{
"field": "sender",
"exposure": "exposed"
},
{
"field": "recipient",
"exposure": "exposed"
},
{
"field": "amount",
"exposure": "exposed"
},
{
"field": "asset",
"exposure": "exposed"
}
]
}
}
},
"attributes": [
{
"id": "zk",
"label": "ZK",
"description": "Uses zero-knowledge proofs to prove private actions without revealing private data."
},
{
"id": "transfers",
"label": "Transfers",
"description": "Private transfers within the shielded pool."
},
{
"id": "defi",
"label": "DeFi",
"description": "Interop with DeFi (swaps, vaults) from within the shielded pool."
},
{
"id": "anyAmount",
"label": "Any amount",
"description": "Deposits and withdrawals can have any size."
}
],
"category": {
"id": "shieldedLedger",
"label": "Shielded ledger",
"description": "A pool with transfers or DeFi inside. Hides who pays whom and which deposit became which withdrawal."
},
"exitWindow": {
"value": "None",
"sentiment": "bad",
"orderHint": 0,
"description": "The upgrader role can replace the PoolVault that escrows deposits without delay, so a malicious upgrade takes the funds before anyone can leave. Ragequit works while the vault is paused, but not against a new implementation.",
"walkawayTest": {
"passed": false,
"reason": "New deposits need the ASP's approval to be spent privately. The app offers only 0xbow's relayer."
}
},
"referenceClient": {
"name": "privacypools.com",
"repository": "https://github.com/0xbow-io/privacy-pools-website-v2",
"commit": "bfb752cdf7c0659bb4fd25e97933e04fce844c4a"
},
"relayerTracking": {
"type": "onchainEvents",
"sources": [
{
"address": "eth:0x01a8Fa4dbb60187aD8d3c3d08E7Fb8C14198A461",
"sinceTimestamp": 1788288047,
"extractor": "privacyPoolsV2Relayed"
},
{
"address": "eth:0x01a8Fa4dbb60187aD8d3c3d08E7Fb8C14198A461",
"sinceTimestamp": 1788288047,
"extractor": "privacyPoolsV2RelayedBatch"
},
{
"address": "eth:0xe76E793d776c1e207aD7a7fa7C57d27420d85110",
"sinceTimestamp": 1788511199,
"extractor": "privacyPoolsV2RouterWithdrawal"
},
{
"address": "eth:0x13a0b86bac3e0C29bd64fED7BCD2EE84f371f41C",
"sinceTimestamp": 1788527387,
"extractor": "privacyPoolsV2RouterWithdrawal"
},
{
"address": "eth:0x77613D670BB9fD48A9898D0eac8ebf21B566F960",
"sinceTimestamp": 1789501787,
"extractor": "privacyPoolsV2RouterWithdrawal"
},
{
"address": "eth:0xd0395c08DD8eA7671a7A65bDca8E473e8E8260a8",
"sinceTimestamp": 1789704851,
"extractor": "privacyPoolsV2SwapExecuted"
}
]
},
"reproducibility": {
"value": "Partially reproducible",
"sentiment": "warning",
"description": "Contracts, circuits, SDK, relayer and website are public and build locally, the contracts under a Business Source License. The 27 verifiers rebuild from the circuit sources and ceremony keys. The deployed RelaySwaps matches no version of its published source. The ASP service is closed."
},
"riskSummary": "## Funds can be stolen if\n1. the zk proof system is broken, allowing invalid spends or withdrawals.\n2. all [trusted setup](#trusted-setups) participants collude or leak their secrets, allowing forged proofs.\n3. the upgrader key deploys a malicious [upgrade](#upgrades-and-governance) of the PoolVault, which holds every deposit, or a verifier that accepts any proof, with no delay.\n \n## Funds can be lost if\n1. a user loses the wallet whose signature derives their keys and the exported account key.\n2. the payer loses a claim link before the recipient claims it.\n3. Aave suffers a loss on the reserve behind a yield share.\n \n## Privacy can be lost if\n1. the ASP leaves deposits out of its latest list, which freezes every note from them, up to halting all private spends (see privileged insider).\n2. the ASP keeps only a few labels in its latest list, so spends proven against it point to one of them (see privileged insider).\n3. 0xbow's relayer refuses a withdrawal, so the user must self-relay from a public wallet (see chain analyst).\n4. a note's label, which passes to every later payee, links to its deposit when timed against the ASP's updates (see chain analyst).\n5. 0xbow pairs the IP of a deposit session with the IP of a withdrawal request across its ASP and relayer (see privileged insider).\n6. a user keeps the default RPCs, which see their account at sign-in and can time it against the withdrawal (see network observer).\n7. elliptic-curve cryptography is broken, which decrypts every onchain note from the published viewing keys (see future adversary).",
"tokens": [
{
"token": {
"address": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
"iconUrl": "https://assets.coingecko.com/coins/images/279/large/ethereum.png?1595348880",
"symbol": "ETH",
"decimals": 18,
"priceId": "ethereum",
"sinceTimestamp": 1788287903
},
"buckets": [
{
"id": "privacy-pools-v2-ETH",
"type": "pool",
"label": "ETH",
"address": "eth:0x0Eb42804BF897662aF851370eaeAdcDBEC1b97ed",
"sinceTimestamp": 1788287903,
"anonymitySet": {
"minimumAmounts": [
"100000000000000000",
"10000000000000000000"
]
},
"deposit": {
"event": "0xed45e0df2bf0e287a792a7b79b19292af5cbab76cc8819049bf37aa067bf8501",
"extractor": "privacyPoolsV2Value",
"params": {
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"
}
},
"withdrawal": {
"event": "0x10763cc44bf9290f53ec1afd9f70684d93fe62b7d1956d9a18410ae38da9d048",
"extractor": "privacyPoolsV2Value",
"params": {
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"
}
},
"additionalWithdrawals": [
{
"event": "0x507455b25c1a4595720da5b6a8f6b76e4aa36db987a63b47266112d3cbf2e103",
"extractor": "privacyPoolsV2Value",
"params": {
"tokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"
}
}
]
}
]
},
{
"token": {
"address": "0xC246aFb23482fF9596E9cee5f1f678eFe0EB1ad6",
"iconUrl": "https://coin-images.coingecko.com/coins/images/6319/large/USDC.png?1769615602",
"symbol": "ppUSDC",
"decimals": 18,
"priceId": "usd-coin",
"sinceTimestamp": 1788287903
},
"buckets": [
{
"id": "privacy-pools-v2-ppUSDC",
"type": "pool",
"label": "ppUSDC",
"address": "eth:0x0Eb42804BF897662aF851370eaeAdcDBEC1b97ed",
"sinceTimestamp": 1788287903,
"anonymitySet": {
"minimumAmounts": [
"200000000000000000000",
"20000000000000000000000"
]
},
"deposit": {
"event": "0xed45e0df2bf0e287a792a7b79b19292af5cbab76cc8819049bf37aa067bf8501",
"extractor": "privacyPoolsV2Value",
"params": {
"tokenAddress": "0xC246aFb23482fF9596E9cee5f1f678eFe0EB1ad6"
}
},
"withdrawal": {
"event": "0x10763cc44bf9290f53ec1afd9f70684d93fe62b7d1956d9a18410ae38da9d048",
"extractor": "privacyPoolsV2Value",
"params": {
"tokenAddress": "0xC246aFb23482fF9596E9cee5f1f678eFe0EB1ad6"
}
},
"additionalWithdrawals": [
{
"event": "0x507455b25c1a4595720da5b6a8f6b76e4aa36db987a63b47266112d3cbf2e103",
"extractor": "privacyPoolsV2Value",
"params": {
"tokenAddress": "0xC246aFb23482fF9596E9cee5f1f678eFe0EB1ad6"
}
}
]
}
]
},
{
"token": {
"address": "0xA4cF419558Ef36CC6FfB666195684dC963910426",
"iconUrl": "https://coin-images.coingecko.com/coins/images/325/large/Tether.png?1696501661",
"symbol": "ppUSDT",
"decimals": 18,
"priceId": "tether",
"sinceTimestamp": 1788287903
},
"buckets": [
{
"id": "privacy-pools-v2-ppUSDT",
"type": "pool",
"label": "ppUSDT",
"address": "eth:0x0Eb42804BF897662aF851370eaeAdcDBEC1b97ed",
"sinceTimestamp": 1788287903,
"anonymitySet": {
"minimumAmounts": [
"200000000000000000000",
"20000000000000000000000"
]
},
"deposit": {
"event": "0xed45e0df2bf0e287a792a7b79b19292af5cbab76cc8819049bf37aa067bf8501",
"extractor": "privacyPoolsV2Value",
"params": {
"tokenAddress": "0xA4cF419558Ef36CC6FfB666195684dC963910426"
}
},
"withdrawal": {
"event": "0x10763cc44bf9290f53ec1afd9f70684d93fe62b7d1956d9a18410ae38da9d048",
"extractor": "privacyPoolsV2Value",
"params": {
"tokenAddress": "0xA4cF419558Ef36CC6FfB666195684dC963910426"
}
},
"additionalWithdrawals": [
{
"event": "0x507455b25c1a4595720da5b6a8f6b76e4aa36db987a63b47266112d3cbf2e103",
"extractor": "privacyPoolsV2Value",
"params": {
"tokenAddress": "0xA4cF419558Ef36CC6FfB666195684dC963910426"
}
}
]
}
]
},
{
"token": {
"address": "0x66051920D25af4E3596A8a46309F4D045F9D83B7",
"iconUrl": "https://coin-images.coingecko.com/coins/images/279/large/ethereum.png?1696501628",
"symbol": "ppETH",
"decimals": 18,
"priceId": "ethereum",
"sinceTimestamp": 1788287903
},
"buckets": [
{
"id": "privacy-pools-v2-ppETH",
"type": "pool",
"label": "ppETH",
"address": "eth:0x0Eb42804BF897662aF851370eaeAdcDBEC1b97ed",
"sinceTimestamp": 1788287903,
"anonymitySet": {
"minimumAmounts": [
"100000000000000000",
"10000000000000000000"
]
},
"deposit": {
"event": "0xed45e0df2bf0e287a792a7b79b19292af5cbab76cc8819049bf37aa067bf8501",
"extractor": "privacyPoolsV2Value",
"params": {
"tokenAddress": "0x66051920D25af4E3596A8a46309F4D045F9D83B7"
}
},
"withdrawal": {
"event": "0x10763cc44bf9290f53ec1afd9f70684d93fe62b7d1956d9a18410ae38da9d048",
"extractor": "privacyPoolsV2Value",
"params": {
"tokenAddress": "0x66051920D25af4E3596A8a46309F4D045F9D83B7"
}
},
"additionalWithdrawals": [
{
"event": "0x507455b25c1a4595720da5b6a8f6b76e4aa36db987a63b47266112d3cbf2e103",
"extractor": "privacyPoolsV2Value",
"params": {
"tokenAddress": "0x66051920D25af4E3596A8a46309F4D045F9D83B7"
}
}
]
}
]
}
],
"trackedOn": [
"ethereum"
],
"upgradesAndGovernance": {
"content": "One EOA holds the default admin, ops admin, upgrader, pauser, unpauser and entrypoint manager roles in the AccessRouter. It can upgrade the PoolVault, Entrypoint, Keystore and ASPRegistry, replace the verifiers, pause deposits and spends, enable assets and set fee caps, all without delay. It also administers the three yield shares, with a fee of at most 20% of the yield. The shares hold Aave v3 deposits, whose contracts Aave governance can upgrade after a public vote and delay. Aave's guardian multisig can pause a reserve instantly, which blocks redeeming its shares. A second EOA holds the postman role that publishes approved-label roots. A third owns RelaySwaps and curates its routers. No timelock or multisig is deployed. Ragequit cannot be paused, so funds already in the vault can leave to their owners as long as the implementation is not changed."
}
}
{
"ethereum": {
"roles": [],
"actors": [
{
"id": "Entrypoint",
"name": "Entrypoint",
"accounts": [
{
"address": "eth:0xca1e072236D231130059eeA6Bfceb7F4e9a1F0C3",
"type": "Contract",
"isVerified": true,
"name": "0xca1e…F0C3",
"url": "https://etherscan.io/address/0xca1e072236D231130059eeA6Bfceb7F4e9a1F0C3"
}
],
"chain": "ethereum",
"description": "Deposit gate of Privacy Pools v2. It checks each deposit against its asset's configuration and keeps the vetting fee.\n* Can interact with AccessRouter\n * deposit into the PoolVault on behalf of users ",
"discoveryDrivenData": true
},
{
"id": "EOA-1",
"name": "EOA 1",
"accounts": [
{
"address": "eth:0x12Dbd6335d7f529F8922420Ba9c15c9E7A324c92",
"type": "EOA",
"isVerified": true,
"name": "0x12Db…4c92",
"url": "https://etherscan.io/address/0x12Dbd6335d7f529F8922420Ba9c15c9E7A324c92",
"displayName": "EOA 1"
}
],
"chain": "ethereum",
"description": "* Can interact with AccessRouter\n * enable or disable assets, set minimum deposits, vetting fees and relayer fee caps, and sweep fees held by the Entrypoint \n * grant and revoke the ops admin, upgrader, unpauser and depositor roles \n * grant and revoke the pauser, entrypoint manager and postman roles \n * pause deposits and transacts in the PoolVault \n * unpause the PoolVault \n * upgrade the PoolVault, Entrypoint, Keystore and ASPRegistry, and replace the vault's verifiers, registries and tree limits \n* Can interact with ppETH\n * set the yield fee up to 20%, claim fees, pause minting, set the Aave rewards controller and rescue tokens other than the backing aToken \n* Can interact with ppUSDT\n * set the yield fee up to 20%, claim fees, pause minting, set the Aave rewards controller and rescue tokens other than the backing aToken \n* Can interact with ppUSDC\n * set the yield fee up to 20%, claim fees, pause minting, set the Aave rewards controller and rescue tokens other than the backing aToken ",
"discoveryDrivenData": true
},
{
"id": "EOA-2",
"name": "EOA 2",
"accounts": [
{
"address": "eth:0xa05B43E1dcdCe0c6A40471a602038BC346900758",
"type": "EOA",
"isVerified": true,
"name": "0xa05B…0758",
"url": "https://etherscan.io/address/0xa05B43E1dcdCe0c6A40471a602038BC346900758",
"displayName": "EOA 2"
}
],
"chain": "ethereum",
"description": "* Can interact with AccessRouter\n * publish the approved-label root every private spend must match ",
"discoveryDrivenData": true
}
]
}
}
contracts+708-0
{
"addresses": {
"ethereum": [
{
"name": "PrivacyPoolRelay",
"isVerified": true,
"address": "eth:0x01a8Fa4dbb60187aD8d3c3d08E7Fb8C14198A461",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Withdrawal processor that submits the transact proof and pays the recipient and the relayer's fee, capped per asset.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x01a8Fa4dbb60187aD8d3c3d08E7Fb8C14198A461#code"
},
{
"name": "PoolVault",
"isVerified": true,
"address": "eth:0x0Eb42804BF897662aF851370eaeAdcDBEC1b97ed",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0x0000000000000000000000000000000000000000"
],
"implementations": [
"eth:0x5F89cD5c3610c2AD870B1b33126d209fECdb69c7"
]
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1788287903,
"transactionHash": "0x2739363102ee08c72a6dd6c96e3c3241bff7507f23a71498c51b25dd5224f0c9",
"implementations": [
"eth:0x5F89cD5c3610c2AD870B1b33126d209fECdb69c7"
]
}
],
"description": "Holds every pool asset and the state tree of note commitments and spent nullifiers.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x0Eb42804BF897662aF851370eaeAdcDBEC1b97ed#code"
},
{
"name": "PPRouterUSDT",
"isVerified": true,
"address": "eth:0x13a0b86bac3e0C29bd64fED7BCD2EE84f371f41C",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Yield router for one share token. It wraps deposits of the underlying into shares, and unwraps withdrawn shares to pay the recipient and the relayer fee.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x13a0b86bac3e0C29bd64fED7BCD2EE84f371f41C#code"
},
{
"name": "ASPRegistry",
"isVerified": true,
"address": "eth:0x259C0BEa1d783c202509BD3b2688d23b8AEf58B0",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0x0000000000000000000000000000000000000000"
],
"implementations": [
"eth:0x046991310B099e86af239d3A4F3AB3e196F24EC7"
]
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1788287435,
"transactionHash": "0xc4c8179cb77006b5190cba6d0ecae70485773ad0abd596fc1f96bdc2cb4120aa",
"implementations": [
"eth:0x046991310B099e86af239d3A4F3AB3e196F24EC7"
]
}
],
"description": "Publishes the association set provider's approved-label roots with their IPFS CIDs, and receives the data that ties each deposit to its label, encrypted to the ASP.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x259C0BEa1d783c202509BD3b2688d23b8AEf58B0#code"
},
{
"name": "PPYieldTokenZapETH",
"isVerified": true,
"address": "eth:0x33c1eEf370bBb447414156CFc4fDABD434776EAf",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Converts between a share token and its underlying in one call, through Aave v3.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x33c1eEf370bBb447414156CFc4fDABD434776EAf#code"
},
{
"name": "AccessRouter",
"isVerified": true,
"address": "eth:0x40a6bC296D87f71Ab31Ca3Bfb50513441fBD5160",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Role registry the Privacy Pools v2 core contracts check. No role has a delay.\n* Roles:\n * **defaultAdmins**: EOA 1\n * **depositors**: Entrypoint\n * **entrypointManagers**: EOA 1\n * **opsAdmins**: EOA 1\n * **pausers**: EOA 1\n * **postmen**: EOA 2\n * **unpausers**: EOA 1\n * **upgraders**: EOA 1",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x40a6bC296D87f71Ab31Ca3Bfb50513441fBD5160#code"
},
{
"name": "ppETH",
"isVerified": true,
"address": "eth:0x66051920D25af4E3596A8a46309F4D045F9D83B7",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "ERC-4626 share token over an Aave v3 aToken, the asset the pool holds for a yield deposit. The admin's fee applies to the yield only.\n* Roles:\n * **owner**: EOA 1",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x66051920D25af4E3596A8a46309F4D045F9D83B7#code"
},
{
"name": "Keystore",
"isVerified": true,
"address": "eth:0x6E463391c79b7e1A88eF26E0B023f9A6C9938a71",
"upgradeability": {
"proxyType": "EIP1967 proxy",
"admins": [
"eth:0x0000000000000000000000000000000000000000"
],
"implementations": [
"eth:0x7b915008ffa267271e9E328430FE328eA02C5F04"
]
},
"chain": "ethereum",
"pastUpgrades": [
{
"timestamp": 1788287351,
"transactionHash": "0x50b876488cdaab2020765918b7270329ab4d9194f34126ed5192e33402c1753e",
"implementations": [
"eth:0x7b915008ffa267271e9E328430FE328eA02C5F04"
]
}
],
"description": "Account registry of Privacy Pools v2: one leaf per account with its nullifying key hash and auth policy, plus an optional X25519 viewing public key.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x6E463391c79b7e1A88eF26E0B023f9A6C9938a71#code"
},
{
"name": "PPRouterETH",
"isVerified": true,
"address": "eth:0x77613D670BB9fD48A9898D0eac8ebf21B566F960",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Yield router for one share token. It wraps deposits of the underlying into shares, and unwraps withdrawn shares to pay the recipient and the relayer fee.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x77613D670BB9fD48A9898D0eac8ebf21B566F960#code"
},
{
"name": "PPYieldTokenZapUSDC",
"isVerified": true,
"address": "eth:0x9Ea986BcDF6784D85B518b15bEEE1E65b585817B",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Converts between a share token and its underlying in one call, through Aave v3.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x9Ea986BcDF6784D85B518b15bEEE1E65b585817B#code"
},
{
"name": "ppUSDT",
"isVerified": true,
"address": "eth:0xA4cF419558Ef36CC6FfB666195684dC963910426",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "ERC-4626 share token over an Aave v3 aToken, the asset the pool holds for a yield deposit. The admin's fee applies to the yield only.\n* Roles:\n * **owner**: EOA 1",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xA4cF419558Ef36CC6FfB666195684dC963910426#code"
},
{
"name": "ppUSDC",
"isVerified": true,
"address": "eth:0xC246aFb23482fF9596E9cee5f1f678eFe0EB1ad6",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "ERC-4626 share token over an Aave v3 aToken, the asset the pool holds for a yield deposit. The admin's fee applies to the yield only.\n* Roles:\n * **owner**: EOA 1",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xC246aFb23482fF9596E9cee5f1f678eFe0EB1ad6#code"
},
{
"name": "PPYieldTokenZapUSDT",
"isVerified": true,
"address": "eth:0xDC3D922df81FC7B7f58229431ED91acB0482f3A5",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Converts between a share token and its underlying in one call, through Aave v3.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xDC3D922df81FC7B7f58229431ED91acB0482f3A5#code"
},
{
"name": "PPRouterUSDC",
"isVerified": true,
"address": "eth:0xe76E793d776c1e207aD7a7fa7C57d27420d85110",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Yield router for one share token. It wraps deposits of the underlying into shares, and unwraps withdrawn shares to pay the recipient and the relayer fee.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xe76E793d776c1e207aD7a7fa7C57d27420d85110#code"
},
{
"name": "Transact4x5Verifier",
"isVerified": true,
"address": "eth:0x01b4954E3b3C1F68785f60D7465c38C31266bfab",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x01b4954E3b3C1F68785f60D7465c38C31266bfab#code"
},
{
"name": "Transact1x2Verifier",
"isVerified": true,
"address": "eth:0x0e13d94235d8a0d8f9fC3B63BB41D666eF0677Ed",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x0e13d94235d8a0d8f9fC3B63BB41D666eF0677Ed#code"
},
{
"name": "Transact5x3Verifier",
"isVerified": true,
"address": "eth:0x20D4B794A2A1ae7A34AF184172dd931d3ff2Fa32",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x20D4B794A2A1ae7A34AF184172dd931d3ff2Fa32#code"
},
{
"name": "Transact1x1Verifier",
"isVerified": true,
"address": "eth:0x21347145497569b34efAB7d73952208866520042",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x21347145497569b34efAB7d73952208866520042#code"
},
{
"name": "Transact2x1Verifier",
"isVerified": true,
"address": "eth:0x338625F2199675D2aC4Fbf7A89567864ac990710",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x338625F2199675D2aC4Fbf7A89567864ac990710#code"
},
{
"name": "Transact1x4Verifier",
"isVerified": true,
"address": "eth:0x3ee4A00e0ba1AC0Ef8aD3e4b541CA42FBB4592c3",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x3ee4A00e0ba1AC0Ef8aD3e4b541CA42FBB4592c3#code"
},
{
"name": "Transact4x2Verifier",
"isVerified": true,
"address": "eth:0x454F1Da26DD4c7c89a849019BeC4c7C7C404d3A4",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x454F1Da26DD4c7c89a849019BeC4c7C7C404d3A4#code"
},
{
"name": "Transact4x4Verifier",
"isVerified": true,
"address": "eth:0x4Cb752CEF56a5095321Ed72699cD7A699D48F4b5",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x4Cb752CEF56a5095321Ed72699cD7A699D48F4b5#code"
},
{
"name": "Transact3x1Verifier",
"isVerified": true,
"address": "eth:0x579f6734d35937b8432BA8FfC17C3120eb657c82",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x579f6734d35937b8432BA8FfC17C3120eb657c82#code"
},
{
"name": "RagequitVerifier",
"isVerified": true,
"address": "eth:0x5a06582115953E2cAbeD8e6A0EeAE35BA430118f",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x5a06582115953E2cAbeD8e6A0EeAE35BA430118f#code"
},
{
"name": "Transact5x1Verifier",
"isVerified": true,
"address": "eth:0x61573Cf3c3A20C9739b68B8e742Ca51971387Cb5",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x61573Cf3c3A20C9739b68B8e742Ca51971387Cb5#code"
},
{
"name": "Transact2x5Verifier",
"isVerified": true,
"address": "eth:0x62Cf8963300F284016daE0cD19f5D9BC60846a46",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x62Cf8963300F284016daE0cD19f5D9BC60846a46#code"
},
{
"name": "Transact5x4Verifier",
"isVerified": true,
"address": "eth:0x766c2F31483935CD55355fcE00fc5eDB82A15acC",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x766c2F31483935CD55355fcE00fc5eDB82A15acC#code"
},
{
"name": "Transact3x2Verifier",
"isVerified": true,
"address": "eth:0x76D574559765fd4b90903fFa682964Ae7e7e878a",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x76D574559765fd4b90903fFa682964Ae7e7e878a#code"
},
{
"name": "Transact5x5Verifier",
"isVerified": true,
"address": "eth:0x7BeE2554970A749D7671424DFa3fAbE15d7e4BD8",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x7BeE2554970A749D7671424DFa3fAbE15d7e4BD8#code"
},
{
"name": "Transact5x2Verifier",
"isVerified": true,
"address": "eth:0x8ABfb288dAc87392EaFdD59F6809825fcA0e8b85",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x8ABfb288dAc87392EaFdD59F6809825fcA0e8b85#code"
},
{
"name": "Transact4x1Verifier",
"isVerified": true,
"address": "eth:0x909ECAF2A4959726a2BC3d82Fc837B8D3F1c61d3",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x909ECAF2A4959726a2BC3d82Fc837B8D3F1c61d3#code"
},
{
"name": "Transact4x3Verifier",
"isVerified": true,
"address": "eth:0x95dEC97ac78E8C0FfDc6315FDc0A0791238b93A3",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0x95dEC97ac78E8C0FfDc6315FDc0A0791238b93A3#code"
},
{
"name": "Transact2x2Verifier",
"isVerified": true,
"address": "eth:0xAc716f21626994c4264eA457Fe208071050611B5",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xAc716f21626994c4264eA457Fe208071050611B5#code"
},
{
"name": "Transact3x3Verifier",
"isVerified": true,
"address": "eth:0xAeCDf3E27A602f23cEc2E5CE250093b3E806D041",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xAeCDf3E27A602f23cEc2E5CE250093b3E806D041#code"
},
{
"name": "Transact2x3Verifier",
"isVerified": true,
"address": "eth:0xB8aa00333b8D6958da72A15D59179BbDD1e49064",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xB8aa00333b8D6958da72A15D59179BbDD1e49064#code"
},
{
"name": "Transact1x3Verifier",
"isVerified": true,
"address": "eth:0xC5E1D9D9CF12E796Ec8E072646c6BF29A1e55382",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xC5E1D9D9CF12E796Ec8E072646c6BF29A1e55382#code"
},
{
"name": "Transact3x4Verifier",
"isVerified": true,
"address": "eth:0xe0aec1eE10eBfCDcB09b6e5a7ea6Ae34D066219d",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xe0aec1eE10eBfCDcB09b6e5a7ea6Ae34D066219d#code"
},
{
"name": "DepositVerifier",
"isVerified": true,
"address": "eth:0xEe96Ca04d2Ab2eC9A8803eb78F39b2875dFF6fdf",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xEe96Ca04d2Ab2eC9A8803eb78F39b2875dFF6fdf#code"
},
{
"name": "Transact2x4Verifier",
"isVerified": true,
"address": "eth:0xF1C6c55B70EC3Df923f5E9bcd64aee5c3073C42c",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xF1C6c55B70EC3Df923f5E9bcd64aee5c3073C42c#code"
},
{
"name": "Transact1x5Verifier",
"isVerified": true,
"address": "eth:0xfa0138C5dE45E520AbA349BE38a827DAb470f70A",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xfa0138C5dE45E520AbA349BE38a827DAb470f70A#code"
},
{
"name": "Transact3x5Verifier",
"isVerified": true,
"address": "eth:0xFdF4EbC7645E1F4c04aE33285b6e3f78e4A3a275",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xFdF4EbC7645E1F4c04aE33285b6e3f78e4A3a275#code"
},
{
"name": "RelaySwaps",
"isVerified": false,
"address": "eth:0xd0395c08DD8eA7671a7A65bDca8E473e8E8260a8",
"upgradeability": {
"proxyType": "immutable",
"admins": [],
"implementations": [],
"immutable": true
},
"chain": "ethereum",
"description": "Withdrawal processor that swaps the withdrawn asset through an approved aggregator router, with the swap calldata bound into the proof. The deployed build does not match the published source.\n",
"discoveryDrivenData": true,
"url": "https://etherscan.io/address/0xd0395c08DD8eA7671a7A65bDca8E473e8E8260a8#code"
}
]
},
"risks": [
{
"category": "Funds can be stolen if",
"text": "the source code of unverified contracts contains malicious code.",
"isCritical": true
}
],
"zkVerifiers": [
"eth:0xEe96Ca04d2Ab2eC9A8803eb78F39b2875dFF6fdf",
"eth:0x5a06582115953E2cAbeD8e6A0EeAE35BA430118f",
"eth:0x21347145497569b34efAB7d73952208866520042",
"eth:0x0e13d94235d8a0d8f9fC3B63BB41D666eF0677Ed",
"eth:0xC5E1D9D9CF12E796Ec8E072646c6BF29A1e55382",
"eth:0x3ee4A00e0ba1AC0Ef8aD3e4b541CA42FBB4592c3",
"eth:0xfa0138C5dE45E520AbA349BE38a827DAb470f70A",
"eth:0x338625F2199675D2aC4Fbf7A89567864ac990710",
"eth:0xAc716f21626994c4264eA457Fe208071050611B5",
"eth:0xB8aa00333b8D6958da72A15D59179BbDD1e49064",
"eth:0xF1C6c55B70EC3Df923f5E9bcd64aee5c3073C42c",
"eth:0x62Cf8963300F284016daE0cD19f5D9BC60846a46",
"eth:0x579f6734d35937b8432BA8FfC17C3120eb657c82",
"eth:0x76D574559765fd4b90903fFa682964Ae7e7e878a",
"eth:0xAeCDf3E27A602f23cEc2E5CE250093b3E806D041",
"eth:0xe0aec1eE10eBfCDcB09b6e5a7ea6Ae34D066219d",
"eth:0xFdF4EbC7645E1F4c04aE33285b6e3f78e4A3a275",
"eth:0x909ECAF2A4959726a2BC3d82Fc837B8D3F1c61d3",
"eth:0x454F1Da26DD4c7c89a849019BeC4c7C7C404d3A4",
"eth:0x95dEC97ac78E8C0FfDc6315FDc0A0791238b93A3",
"eth:0x4Cb752CEF56a5095321Ed72699cD7A699D48F4b5",
"eth:0x01b4954E3b3C1F68785f60D7465c38C31266bfab",
"eth:0x61573Cf3c3A20C9739b68B8e742Ca51971387Cb5",
"eth:0x8ABfb288dAc87392EaFdD59F6809825fcA0e8b85",
"eth:0x20D4B794A2A1ae7A34AF184172dd931d3ff2Fa32",
"eth:0x766c2F31483935CD55355fcE00fc5eDB82A15acC",
"eth:0x7BeE2554970A749D7671424DFa3fAbE15d7e4BD8"
]
}
[
{
"id": "75f84d35",
"date": "Wed, 21 Oct 2026 10:15:09 GMT",
"timestamp": 1792559137,
"description": "Initial discovery of Privacy Pools v2 on Ethereum: Entrypoint, PoolVault, Keystore, ASPRegistry, AccessRouter, PrivacyPoolRelay, RelaySwaps, the yield routers, shares and zaps, and the 27 Groth16 verifiers.",
"isHighSeverity": false,
"changeCount": 44,
"sections": [
{
"kind": "initial-discovery",
"body": "```diff\n+ Status: CREATED\n contract PrivacyPoolRelay (eth:0x01a8Fa4dbb60187aD8d3c3d08E7Fb8C14198A461) [privacy-pools-v2/PrivacyPoolRelay]\n +++ description: Withdrawal processor that submits the transact proof and pays the recipient and the relayer's fee, capped per asset.\n```\n\n```diff\n+ Status: CREATED\n contract Transact4x5Verifier (eth:0x01b4954E3b3C1F68785f60D7465c38C31266bfab) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```\n\n```diff\n+ Status: CREATED\n contract Transact1x2Verifier (eth:0x0e13d94235d8a0d8f9fC3B63BB41D666eF0677Ed) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```\n\n```diff\n+ Status: CREATED\n contract PoolVault (eth:0x0Eb42804BF897662aF851370eaeAdcDBEC1b97ed) [privacy-pools-v2/PoolVault]\n +++ description: Holds every pool asset and the state tree of note commitments and spent nullifiers.\n```\n\n```diff\n+ Status: CREATED\n EOA (eth:0x12Dbd6335d7f529F8922420Ba9c15c9E7A324c92)\n +++ description: None\n```\n\n```diff\n+ Status: CREATED\n contract PPRouterUSDT (eth:0x13a0b86bac3e0C29bd64fED7BCD2EE84f371f41C) [privacy-pools-v2/PPRouter]\n +++ description: Yield router for one share token. It wraps deposits of the underlying into shares, and unwraps withdrawn shares to pay the recipient and the relayer fee.\n```\n\n```diff\n+ Status: CREATED\n contract Transact5x3Verifier (eth:0x20D4B794A2A1ae7A34AF184172dd931d3ff2Fa32) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```\n\n```diff\n+ Status: CREATED\n contract Transact1x1Verifier (eth:0x21347145497569b34efAB7d73952208866520042) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```\n\n```diff\n+ Status: CREATED\n contract ASPRegistry (eth:0x259C0BEa1d783c202509BD3b2688d23b8AEf58B0) [privacy-pools-v2/ASPRegistry]\n +++ description: Publishes the association set provider's approved-label roots with their IPFS CIDs, and receives the data that ties each deposit to its label, encrypted to the ASP.\n```\n\n```diff\n+ Status: CREATED\n contract Transact2x1Verifier (eth:0x338625F2199675D2aC4Fbf7A89567864ac990710) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```\n\n```diff\n+ Status: CREATED\n contract PPYieldTokenZapETH (eth:0x33c1eEf370bBb447414156CFc4fDABD434776EAf) [privacy-pools-v2/PPYieldTokenZap]\n +++ description: Converts between a share token and its underlying in one call, through Aave v3.\n```\n\n```diff\n+ Status: CREATED\n contract Transact1x4Verifier (eth:0x3ee4A00e0ba1AC0Ef8aD3e4b541CA42FBB4592c3) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```\n\n```diff\n+ Status: CREATED\n contract AccessRouter (eth:0x40a6bC296D87f71Ab31Ca3Bfb50513441fBD5160) [privacy-pools-v2/AccessRouter]\n +++ description: Role registry the Privacy Pools v2 core contracts check. No role has a delay.\n```\n\n```diff\n+ Status: CREATED\n contract Transact4x2Verifier (eth:0x454F1Da26DD4c7c89a849019BeC4c7C7C404d3A4) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```\n\n```diff\n+ Status: CREATED\n contract Transact4x4Verifier (eth:0x4Cb752CEF56a5095321Ed72699cD7A699D48F4b5) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```\n\n```diff\n+ Status: CREATED\n contract Transact3x1Verifier (eth:0x579f6734d35937b8432BA8FfC17C3120eb657c82) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```\n\n```diff\n+ Status: CREATED\n contract RagequitVerifier (eth:0x5a06582115953E2cAbeD8e6A0EeAE35BA430118f) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```\n\n```diff\n+ Status: CREATED\n contract Transact5x1Verifier (eth:0x61573Cf3c3A20C9739b68B8e742Ca51971387Cb5) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```\n\n```diff\n+ Status: CREATED\n contract Transact2x5Verifier (eth:0x62Cf8963300F284016daE0cD19f5D9BC60846a46) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```\n\n```diff\n+ Status: CREATED\n contract ppETH (eth:0x66051920D25af4E3596A8a46309F4D045F9D83B7) [privacy-pools-v2/PPYieldToken]\n +++ description: ERC-4626 share token over an Aave v3 aToken, the asset the pool holds for a yield deposit. The admin's fee applies to the yield only.\n```\n\n```diff\n+ Status: CREATED\n contract Keystore (eth:0x6E463391c79b7e1A88eF26E0B023f9A6C9938a71) [privacy-pools-v2/Keystore]\n +++ description: Account registry of Privacy Pools v2: one leaf per account with its nullifying key hash and auth policy, plus an optional X25519 viewing public key.\n```\n\n```diff\n+ Status: CREATED\n contract Transact5x4Verifier (eth:0x766c2F31483935CD55355fcE00fc5eDB82A15acC) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```\n\n```diff\n+ Status: CREATED\n contract Transact3x2Verifier (eth:0x76D574559765fd4b90903fFa682964Ae7e7e878a) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```\n\n```diff\n+ Status: CREATED\n contract PPRouterETH (eth:0x77613D670BB9fD48A9898D0eac8ebf21B566F960) [privacy-pools-v2/PPRouter]\n +++ description: Yield router for one share token. It wraps deposits of the underlying into shares, and unwraps withdrawn shares to pay the recipient and the relayer fee.\n```\n\n```diff\n+ Status: CREATED\n contract Transact5x5Verifier (eth:0x7BeE2554970A749D7671424DFa3fAbE15d7e4BD8) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```\n\n```diff\n+ Status: CREATED\n contract Transact5x2Verifier (eth:0x8ABfb288dAc87392EaFdD59F6809825fcA0e8b85) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```\n\n```diff\n+ Status: CREATED\n contract Transact4x1Verifier (eth:0x909ECAF2A4959726a2BC3d82Fc837B8D3F1c61d3) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```\n\n```diff\n+ Status: CREATED\n contract Transact4x3Verifier (eth:0x95dEC97ac78E8C0FfDc6315FDc0A0791238b93A3) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```\n\n```diff\n+ Status: CREATED\n contract PPYieldTokenZapUSDC (eth:0x9Ea986BcDF6784D85B518b15bEEE1E65b585817B) [privacy-pools-v2/PPYieldTokenZap]\n +++ description: Converts between a share token and its underlying in one call, through Aave v3.\n```\n\n```diff\n+ Status: CREATED\n contract ppUSDT (eth:0xA4cF419558Ef36CC6FfB666195684dC963910426) [privacy-pools-v2/PPYieldToken]\n +++ description: ERC-4626 share token over an Aave v3 aToken, the asset the pool holds for a yield deposit. The admin's fee applies to the yield only.\n```\n\n```diff\n+ Status: CREATED\n contract Transact2x2Verifier (eth:0xAc716f21626994c4264eA457Fe208071050611B5) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```\n\n```diff\n+ Status: CREATED\n contract Transact3x3Verifier (eth:0xAeCDf3E27A602f23cEc2E5CE250093b3E806D041) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```\n\n```diff\n+ Status: CREATED\n contract Transact2x3Verifier (eth:0xB8aa00333b8D6958da72A15D59179BbDD1e49064) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```\n\n```diff\n+ Status: CREATED\n contract ppUSDC (eth:0xC246aFb23482fF9596E9cee5f1f678eFe0EB1ad6) [privacy-pools-v2/PPYieldToken]\n +++ description: ERC-4626 share token over an Aave v3 aToken, the asset the pool holds for a yield deposit. The admin's fee applies to the yield only.\n```\n\n```diff\n+ Status: CREATED\n contract Transact1x3Verifier (eth:0xC5E1D9D9CF12E796Ec8E072646c6BF29A1e55382) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```\n\n```diff\n+ Status: CREATED\n contract Entrypoint (eth:0xca1e072236D231130059eeA6Bfceb7F4e9a1F0C3) [privacy-pools-v2/Entrypoint]\n +++ description: Deposit gate of Privacy Pools v2. It checks each deposit against its asset's configuration and keeps the vetting fee.\n```\n\n```diff\n+ Status: CREATED\n contract RelaySwaps (eth:0xd0395c08DD8eA7671a7A65bDca8E473e8E8260a8) [N/A]\n +++ description: Withdrawal processor that swaps the withdrawn asset through an approved aggregator router, with the swap calldata bound into the proof. The deployed build does not match the published source.\n```\n\n```diff\n+ Status: CREATED\n contract PPYieldTokenZapUSDT (eth:0xDC3D922df81FC7B7f58229431ED91acB0482f3A5) [privacy-pools-v2/PPYieldTokenZap]\n +++ description: Converts between a share token and its underlying in one call, through Aave v3.\n```\n\n```diff\n+ Status: CREATED\n contract Transact3x4Verifier (eth:0xe0aec1eE10eBfCDcB09b6e5a7ea6Ae34D066219d) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```\n\n```diff\n+ Status: CREATED\n contract PPRouterUSDC (eth:0xe76E793d776c1e207aD7a7fa7C57d27420d85110) [privacy-pools-v2/PPRouter]\n +++ description: Yield router for one share token. It wraps deposits of the underlying into shares, and unwraps withdrawn shares to pay the recipient and the relayer fee.\n```\n\n```diff\n+ Status: CREATED\n contract DepositVerifier (eth:0xEe96Ca04d2Ab2eC9A8803eb78F39b2875dFF6fdf) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```\n\n```diff\n+ Status: CREATED\n contract Transact2x4Verifier (eth:0xF1C6c55B70EC3Df923f5E9bcd64aee5c3073C42c) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```\n\n```diff\n+ Status: CREATED\n contract Transact1x5Verifier (eth:0xfa0138C5dE45E520AbA349BE38a827DAb470f70A) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```\n\n```diff\n+ Status: CREATED\n contract Transact3x5Verifier (eth:0xFdF4EbC7645E1F4c04aE33285b6e3f78e4A3a275) [privacy-pools-v2/Groth16Verifier]\n +++ description: Groth16 verifier for one Privacy Pools v2 circuit, with that circuit's trusted-setup verification key hard-coded.\n```"
}
]
}
]