Anonymity sets
A privacy pool hides you among everyone whose deposit or note could be yours. That crowd is your anonymity set: the larger it is, the weaker a watcher's guess. This page counts it for six projects, from their own contracts and nodes.
- 6 projects
- 82 pools and trees
- 11 blockchains
- 9 charts
What an anonymity set is
When you take money out of a privacy pool, a watcher sees the withdrawal but not which deposit it came from. Everyone whose deposit could be the one is part of your anonymity set. With three candidates, a watcher has a one-in-three guess; with thousands, the guess is close to worthless.
How it works explains the idea in The basic trick: the pool, and Where privacy still leaks explains why the real crowd is often smaller than any count.
No project publishes one agreed figure, so this page uses the counter each design keeps on its own chain and says which it is. Counts from different designs do not compare directly: a deposit, a note and a ring member are different things.
The counts used here
- Deposits since launch
- Every deposit a pool has taken, from the contract's own counter. In a pool of fixed amounts, a withdrawal could come from any earlier deposit of the same size.
- Unspent notes
- Deposits not yet withdrawn: the pool's balance divided by its fixed amount. A stricter count, although nobody can see which deposits they are.
- Note commitments
- Pools that take any amount record each note they create in a Merkle tree. Change and dummy notes count too, so this measures notes, not people.
- Ring members
- Monero hides each coin it spends among decoys picked from earlier outputs. Every ring now has 16 members: the real one and 15 decoys.
Current pool sizes
The latest daily reading for each pool, with where and when it was read. Each row is its own crowd: a note in one pool gives no cover in another, so the rows do not add up.
| Pool | Set size | What it counts | Held | Source | Read |
|---|---|---|---|---|---|
| Tornado Cash | |||||
| 0.1 ETH, Ethereum | 6,235 | Notes not yet withdrawn, of 74,380 deposits | 623.5 ETH | PublicNode | 18 Oct 2026, 01:23 UTC |
| 1 ETH, Ethereum | 4,303 | Notes not yet withdrawn, of 95,779 deposits | 4,303 ETH | PublicNode | 18 Oct 2026, 01:23 UTC |
| 10 ETH, Ethereum | 2,291 | Notes not yet withdrawn, of 78,242 deposits | 22,910 ETH | PublicNode | 18 Oct 2026, 01:23 UTC |
| 100 ETH, Ethereum | 2,253 | Notes not yet withdrawn, of 48,807 deposits | 225,300 ETH | PublicNode | 18 Oct 2026, 01:23 UTC |
| 15 other pools on Ethereum | 591 | Notes not yet withdrawn, of 16,828 deposits, in DAI, cDAI, USDC, USDT and WBTC pools | By pool | PublicNode | 18 Oct 2026, 01:23 UTC |
| Pools on six other chains | 9,997 | Notes not yet withdrawn, of 318,875 deposits | By chain | PublicNode | 18 Oct 2026, 01:23 UTC |
| Nova, Gnosis | 47,940 | Note commitments, two per transaction, in a pool of any amount | 463.06 WETH | PublicNode | 18 Oct 2026, 01:23 UTC |
| Railgun | |||||
| Ethereum | 289,861 | Note commitments in the contract's trees | 20,185 WETH, 30,193,748 USDTAll tokens read | PublicNode | 18 Oct 2026, 01:23 UTC |
| BNB Chain | 53,831 | Note commitments in the contract's trees | 565.17 WBNB, 223,118 USDTAll tokens read | PublicNode | 18 Oct 2026, 01:23 UTC |
| Polygon | 91,324 | Note commitments in the contract's trees | 653,377 WPOL, 215,585 USDCAll tokens read | PublicNode | 18 Oct 2026, 01:23 UTC |
| Arbitrum | 130,659 | Note commitments in the contract's trees | 687.58 WETH, 801,162 USDCAll tokens read | PublicNode | 18 Oct 2026, 01:23 UTC |
| Zcash | |||||
| Sapling | 73,986,586 | Note commitments in the pool's tree | 474,372 ZEC | ZecStats | 18 Oct 2026, 01:21 UTC |
| OrchardClosed to new value | 50,476,893 | Note commitments in the pool's tree | 350,222 ZEC | ZecStats | 18 Oct 2026, 01:21 UTC |
| Ironwood | 797,547 | Note commitments in the pool's tree | 4,116,711 ZEC | ZecStats | 18 Oct 2026, 01:21 UTC |
| Sprout | – | No tree in the data read here | 22,309 ZEC | ZecStats | 18 Oct 2026, 01:21 UTC |
| Privacy Pools | |||||
| ETH, Ethereum | 6,274 | Deposits since launch; 7,282 withdrawals | 789 ETH | PublicNode | 18 Oct 2026, 01:23 UTC |
| 13 other pools on Ethereum | 1,615 | Deposits since launch, each pool its own set | By pool | PublicNode | 18 Oct 2026, 01:23 UTC |
| Eight pools on four other chains | 696 | Deposits since launch, each pool its own set | By pool | PublicNode | 18 Oct 2026, 01:23 UTC |
| Association set, Ethereum | 6,903 | Deposits approved by 0xbow across the 14 Ethereum pools, checked once | – | IPFS file of the latest root | 16 Oct 2026, 07:55 UTC |
| Privacy Cash | |||||
| SOL, Solana | 860,000 | Note commitments, two per transaction | 9,457 SOL | PublicNode | 18 Oct 2026, 01:23 UTC |
| USDC, Solana | 98,340 | Note commitments, two per transaction | 586,591 USDC | PublicNode | 18 Oct 2026, 01:23 UTC |
| Seven other token trees | 14,440 | Note commitments, each token its own set | By token | PublicNode | 18 Oct 2026, 01:23 UTC |
| Monero | |||||
| Every transaction input | 16 | Ring members: the real output and 15 decoys | – | Monero README | Consensus rule since 13 Aug 2022 |
| RingCT outputs | 165,764,651 | Outputs on the chain that decoys are drawn from | – | xmr-node.cakewallet.com | 18 Oct 2026, 01:22 UTC |
Tornado Cash
Tornado Cash takes only fixed amounts, and each amount has its own pool: a withdrawal of 1 ETH hides only among deposits of 1 ETH. Each contract counts its deposits, and its balance divided by the fixed amount gives the notes still inside. A withdrawal could come from any earlier deposit in the same pool; the notes still inside are a stricter count, although nobody can see which deposits they are.
Unspent notes in the ETH pools on Ethereum
Each pool's balance divided by its fixed amount, read once a day from the contracts. No free source gives the pools' past balances, so the chart starts with the first daily reading.
Deposits since launch, ETH pools on Ethereum
Each contract's own deposit counter (nextIndex), read once a day. The first deposit in the 1 ETH pool was made on 16 Dec 2019.
Pools on Ethereum
| Pool | Deposits since launch | Withdrawn | Unspent notes | Held |
|---|---|---|---|---|
| 0.1 ETH | 74,380 | 68,145 | 6,235 | 623.5 ETH |
| 1 ETH | 95,779 | 91,476 | 4,303 | 4,303 ETH |
| 10 ETH | 78,242 | 75,951 | 2,291 | 22,910 ETH |
| 100 ETH | 48,807 | 46,554 | 2,253 | 225,300 ETH |
| 100 DAI | 471 | 399 | 72 | 7,200 DAI |
| 1,000 DAI | 1,374 | 1,255 | 119 | 119,000 DAI |
| 10,000 DAI | 3,445 | 3,338 | 107 | 1,070,000 DAI |
| 100,000 DAI | 4,385 | 4,319 | 66 | 6,600,000 DAI |
| 5,000 cDAI | 5 | 3 | 2 | 10,000 cDAI |
| 50,000 cDAI | 118 | 118 | 0 | 0 cDAI |
| 500,000 cDAI | 87 | 85 | 2 | 1,000,000 cDAI |
| 5,000,000 cDAI | 114 | 114 | 0 | 0 cDAI |
| 100 USDC | 395 | 349 | 46 | 4,600 USDC |
| 1,000 USDC | 934 | 908 | 26 | 26,000 USDC |
| 100 USDT | 978 | 876 | 102 | 10,293 USDT |
| 1,000 USDT | 2,122 | 2,087 | 35 | 35,010 USDT |
| 0.1 WBTC | 156 | 153 | 3 | 0.3 WBTC |
| 1 WBTC | 1,042 | 1,039 | 3 | 3 WBTC |
| 10 WBTC | 1,202 | 1,194 | 8 | 80 WBTC |
Withdrawn is deposits minus unspent notes. cDAI is held as cDAI. Read at Ethereum block 26,216,135 on 18 Oct 2026, 01:23 UTC.
Other chains
| Chain | Pools | Deposits since launch | Unspent notes | Held |
|---|---|---|---|---|
| BNB Chain | 4 | 281,787 | 8,489 | 78,100 BNB |
| Arbitrum | 4 | 6,798 | 419 | 229.1 ETH |
| Optimism | 4 | 1,083 | 70 | 11.5 ETH |
| Gnosis | 4 | 1,660 | 82 | 46,900 xDAI |
| Polygon | 4 | 20,422 | 779 | 442,400 POL |
| Avalanche | 3 | 7,125 | 158 | 5,110 AVAX |
The same contracts, with the chain's own coin in each pool. Tornado Cash Nova on Gnosis takes any amount, so it has no count of notes: on 18 Oct 2026, 01:23 UTC its tree held 47,940 note commitments, two per transaction, and 463.06 WETH.
Railgun
Railgun keeps shielded balances as private notes inside one contract per chain. Every shield and private transfer adds note commitments to the contract's Merkle trees; a tree holds 65,536 leaves before the next one starts, and the counts below add the trees up. Notes of any amount and any token share a chain's trees.
Note commitments by chain
Read from each chain's contract once a day. Before that, the count at the end of the first day of each month, from the quick-sync index the Railgun wallet uses.
Notes, not people
A note commitment is created for every output of a shield or a private transfer, including the change sent back to the sender, so one person can account for many. The count says how many notes a spend could be hidden among, not how many people use Railgun.
Tokens held by the contract
| Chain | Note commitments | Main tokens held | Read |
|---|---|---|---|
| Ethereum | 289,861 | 20,185 WETH; 30,193,748 USDT; 16,810,286 USDC; 4,989,106 DAI; 32.93 WBTC | 18 Oct 2026, 01:23 UTC |
| BNB Chain | 53,831 | 565.17 WBNB; 223,118 USDT; 33,889 USDC | 18 Oct 2026, 01:23 UTC |
| Polygon | 91,324 | 653,377 WPOL; 215,585 USDC; 18,628 USDC.e; 72,023 USDT | 18 Oct 2026, 01:23 UTC |
| Arbitrum | 130,659 | 687.58 WETH; 801,162 USDC; 399,142 USDT | 18 Oct 2026, 01:23 UTC |
Railgun wraps each chain's own coin, so ETH, BNB and POL appear as WETH, WBNB and WPOL. The contract on Ethereum also holds hundreds of smaller tokens that are not read here.
Zcash
Zcash has its shielded pools built into the coin. Each pool keeps a note commitment tree, and every shielded output adds a leaf, including the change and dummy outputs that wallets add. Since the NU6.3 upgrade on 28 Jul 2026 (height 3,428,143), no new value may enter Orchard; value can leave it, including into Ironwood, so Orchard's fall reflects that move rather than people leaving the shielded pools. Sprout, the first pool, has no tree in the data read here.
ZEC held in each shielded pool
Daily since 29 Oct 2018 from zeczcash.com; the latest value from ZecStats. Data: ZecStats (https://zecstats.org), CC BY 4.0.
Note commitments in each tree
Tree sizes from the zec.rocks lightwalletd servers, which must agree on the height: on the first day of each month before daily readings began, then daily.
| Pool | ZEC held | Note commitments | Read |
|---|---|---|---|
| Sapling | 474,372 ZEC | 73,986,586 | 18 Oct 2026, 01:21 UTC |
| Orchard | 350,222 ZEC | 50,476,893 | 18 Oct 2026, 01:21 UTC |
| Ironwood | 4,116,711 ZEC | 797,547 | 18 Oct 2026, 01:21 UTC |
| Sprout | 22,309 ZEC | – | 18 Oct 2026, 01:21 UTC |
Privacy Pools
Privacy Pools, run by 0xbow, takes any amount, with one pool per asset and chain. Each pool counts its deposits, and its state tree adds a leaf for every deposit and every withdrawal, so the difference gives the withdrawals. To withdraw privately, a user proves that their deposit is in the association set, the list of deposits 0xbow has approved; a deposit left out can still be taken back, but only in public.
Deposits since launch
Each pool's deposit counter (the label nonce), read once a day from the contracts. No free source gives the counters' past values, so the chart starts with the first daily reading.
The association set
At 16 Oct 2026, 07:55 UTC (Ethereum block 26,203,736), the association set held 6,903 approved deposits, shared by the 14 pools on Ethereum; 5,315 of the ETH pool's 6,230 deposits were in it. This was checked once, from the file named by the latest root on chain, through a public IPFS gateway meant only for testing, so it is not updated daily.
Pools
| Pool | Chain | Deposits since launch | Withdrawals | Held |
|---|---|---|---|---|
| ETH | Ethereum | 6,274 | 7,282 | 789 ETH |
| USDT | Ethereum | 520 | 1,078 | 6,840,347 USDT |
| USDC | Ethereum | 893 | 1,839 | 408,571 USDC |
| DAI | Ethereum | 8 | 5 | 4,534 DAI |
| USDS | Ethereum | 18 | 12 | 2,483 USDS |
| sUSDS | Ethereum | 11 | 6 | 1,250 sUSDS |
| wstETH | Ethereum | 45 | 45 | 45.79 wstETH |
| wBTC | Ethereum | 6 | 9 | 0.0554 wBTC |
| USDe | Ethereum | 1 | 1 | 0 USDe |
| USD1 | Ethereum | 4 | 1 | 1,350 USD1 |
| frxUSD | Ethereum | 9 | 9 | 10,149 frxUSD |
| WOETH | Ethereum | 4 | 2 | 2.07 WOETH |
| fxUSD | Ethereum | 76 | 114 | 710.67 fxUSD |
| BOLD | Ethereum | 20 | 27 | 49,861 BOLD |
| ETH | Optimism | 75 | 80 | 0.089 ETH |
| USDC | Optimism | 90 | 118 | 2,672 USDC |
| BNB | BNB Chain | 32 | 18 | 0.0701 BNB |
| USDT | BNB Chain | 40 | 8 | 52.45 USDT |
| ETH | Arbitrum | 187 | 280 | 3.82 ETH |
| USDC | Arbitrum | 236 | 348 | 28,657 USDC |
| yUSND | Arbitrum | 33 | 27 | 68 yUSND |
| ETH | Base | 3 | 2 | 0.01 ETH |
Withdrawals is the state tree's leaves minus deposits. Each withdrawal leaves a new note for any value still in the pool, so a deposit can be withdrawn in parts and withdrawals can outnumber deposits. None of the pools has been wound down. The pool on Base is deployed but not listed in the web app.
Privacy Cash
Privacy Cash runs on Solana, with one Merkle tree per token, so each token is a separate crowd. Each transaction adds two note commitments, so the counts are about twice the number of transactions. SOL is held by the program's pool account and the other tokens in vaults owned by its configuration account.
Note commitments by token tree
Each tree's next index, read once a day from Solana. No cheap source gives past values, so the chart starts with the first daily reading.
Other chains
DefiLlama also lists Privacy Cash on Ethereum, Base, BNB Chain and Robinhood Chain. Those deployments are not read here: their contract addresses have not been checked against a primary source.
Token trees
| Token | Note commitments | Held |
|---|---|---|
| SOL | 860,000 | 9,457 SOL |
| USDC | 98,340 | 586,591 USDC |
| USDT | 9,422 | 18,127 USDT |
| ZEC | 1,070 | 1.67 ZEC |
| ORE | 2,238 | 510.28 ORE |
| stORE | 158 | 600.08 stORE |
| stORE (legacy) | 1,522 | 94.42 stORE |
| jlUSDC | 18 | 16 jlUSDC |
| jlWSOL | 12 | 0.04 jlWSOL |
SOL is shown without the account's rent deposit. Read on 18 Oct 2026, 01:23 UTC.
Monero
Monero has no pool to join: every transaction hides its inputs. Each coin spent is signed for as one member of a ring of earlier outputs, and since the v15 upgrade at height 2,688,888 on 13 Aug 2022, every ring has exactly 16 members. The ring size is a consensus rule, so it is shown as a dated constant from the Monero README rather than measured.
16ring members for every input, the real output and 15 decoys, since 13 Aug 2022. The nodes read report hard fork version 16, so the rule still applies.
Ring size required by consensus
From the upgrade table in the Monero README: at least 3 from 22 Mar 2016, 5 from 16 Sep 2017 and 7 from 6 Apr 2018, then exactly 11 from 18 Oct 2018 and 16 from 13 Aug 2022.
RingCT outputs on the chain
Decoys are drawn from these outputs, and FCMP++ would make all of them the set. Every 64,800 blocks (about 90 days) from the start of RingCT at height 1,220,516, then daily, from public nodes checked against each other.
FCMP++
Full-chain membership proofs (FCMP++) would replace rings with a proof that the coin spent is one of all the outputs on the chain. In April 2024 the Monero Project described this as taking each input from an immediate anonymity set of 16 to about 100 million. FCMP++ is being tested on public test networks: the latest stressnet release is v0.19.0.0-beta.3.0 (25 Sep 2026), and the fcmp++ hf milestone had 29 of 42 issues closed on 18 Oct 2026 and no due date. The README's upgrade table lists no mainnet height for it.
| From | Height | Upgrade | Ring size |
|---|---|---|---|
| 22 Mar 2016 | 1,009,827 | v2 | At least 3 |
| 16 Sep 2017 | 1,400,000 | v6 | At least 5 |
| 6 Apr 2018 | 1,546,000 | v7 | At least 7 |
| 18 Oct 2018 | 1,685,555 | v8 | Exactly 11 |
| 13 Aug 2022 | 2,688,888 | v15 | Exactly 16 |
What this does not tell you
- Deposits, notes and outputs are not people. One person can make many deposits, and wallets add change and dummy notes: Zcash counts every shielded output, and Privacy Cash adds two commitments to every transaction.
- The crowd that matters is smaller than the count. A withdrawal can only come from a deposit made before it, and in pools of any amount a deposit of a different size or token can often be ruled out.
- Habits shrink it further. Timing, amounts, fees and reused addresses can single out a user however large the pool, as Where privacy still leaks explains.
- Sets do not add up. Each pool, token and chain is its own crowd: a note in the 1 ETH pool gives no cover to a 10 ETH withdrawal, and Railgun notes on Polygon give none on Ethereum.
- Value is not users. A few large holders can account for most of a pool's balance.
- Monero's figure is per input. Each input hides among its ring of 16; the outputs count is where decoys are drawn from, not a set that any one transaction hides in today.
- Privacy Pools' private withdrawals rely on 0xbow. A withdrawal that uses the association set hides only among the deposits 0xbow has approved.
- These are daily readings, not a census. Most figures come from one public node once a day, and a node can be wrong or behind; only the Zcash trees and Monero's outputs are checked against a second server. Most series start on 16 Oct 2026.
- Nothing here rates a project's safety or says anything about its legal status where you live.
Sources and method
How each figure is read
- Tornado Cash
- Each of the 42 pool contracts on seven chains for its fixed amount (denomination), its deposit counter (nextIndex) and its balance, and Nova's tree and balance: one batch per chain through PublicNode (dRPC as the fallback on Ethereum), all at the same block. Daily.
- Railgun
- The contract on each of four chains for its tree number and next leaf (treeNumber, nextLeafIndex) and its balance of 15 tokens, through PublicNode. Daily; monthly history from the Railgun quick-sync index.
- Zcash
- Pool balances from ZecStats (ZcashInfo as the fallback), with daily history from zeczcash.com; tree sizes from GetLatestTreeState on two lightwalletd servers, decoded from each tree's frontier. Daily; monthly history of the trees.
- Privacy Pools
- Each of the 22 pools on five chains for its deposit counter (nonce), the size of its state tree (currentTreeSize), whether it has been wound down (dead) and its balance, through PublicNode. Daily. The association set was counted once.
- Privacy Cash
- The pool account and nine tree accounts, then eight vaults, on Solana through PublicNode (the Solana Foundation as the fallback). Daily.
- Monero
- The ring size from the README; RingCT outputs from get_output_distribution on two public nodes; the FCMP++ milestone and releases from the GitHub API. Daily; outputs every 64,800 blocks before that.
Cadence and downloads
The daily job reads every source once, after 01:20 UTC, and keeps one reading per day. The last run was on 18 Oct 2026, 01:23 UTC, and every source was read. The series behind the charts and the latest reading of each are in anonymity.json, under the site's licence and credits.
Contract addresses come from each project's own code and documentation, and the amounts and decimals are checked against the contracts when they are read. The contracts and endpoints were checked on 16 Oct 2026.
Sources
Tornado Cash
- tornado-cli config.js (mainnet deployments and deployment blocks)
- Tornado Cash smart contracts
- Tornado.sol (denomination getter, Deposit and Withdrawal events)
- MerkleTreeWithHistory.sol (nextIndex getter)
- tornado-nova MerkleTreeWithHistory.sol (two leaves inserted per transaction)
- Ethereum JSON-RPC responses (tested)
- BNB Smart Chain JSON-RPC responses (tested)
- Arbitrum One JSON-RPC responses (tested)
- Optimism JSON-RPC responses (tested)
- Gnosis JSON-RPC responses (tested)
- Polygon JSON-RPC responses (tested)
- Avalanche C-Chain JSON-RPC responses (tested)
- Ethereum JSON-RPC responses, free tier, including archive reads (tested)
Railgun
- network-config.ts (Railgun proxy contracts, deployment blocks, wrapped base tokens, V3 contracts not yet set on mainnets)
- Commitments.sol (TREE_DEPTH 16, treeNumber and nextLeafIndex getters)
- Quick-sync GraphQL client (Subsquid endpoint URLs; Commitment, Nullifier and Unshield entities)
- Railgun Ethereum quick-sync GraphQL responses (tested)
- Token balances of the Railgun proxy on Ethereum (used to choose the tokens read)
- Ethereum JSON-RPC responses (tested)
- BNB Smart Chain JSON-RPC responses (tested)
- Polygon JSON-RPC responses (tested)
- Arbitrum One JSON-RPC responses (tested)
Zcash
- ZecStats summary (pools and Ironwood fields)
- ZecStats public API
- Coin pools (fallback)
- Shielded supply daily export (pool balances and block height per day)
- service.proto (CompactTxStreamer GetTreeState and GetLatestTreeState; TreeState with ironwoodTree)
- merkle_tree.rs (read_commitment_tree: legacy commitment tree serialisation)
- zec.rocks
- lightwalletd GetLatestTreeState and GetTreeState responses (tested)
- lightwalletd GetLatestTreeState responses (tested)
- ZIP 258: Deployment of the NU6.3 Network Upgrade (mainnet activation height 3428143; no new value may enter the Orchard pool)
- Ironwood: a new shielded pool for Zcash
Privacy Pools
- chainData.ts (pool addresses, assets, scopes and deployment blocks)
- Deployments
- State.sol (nonce, currentTreeSize, dead)
- PrivacyPool.sol (label nonce incremented per deposit; withdrawals checked against ENTRYPOINT.latestRoot())
- IPrivacyPool.sol (Deposited, Withdrawn, Ragequit events)
- Ethereum JSON-RPC responses (tested)
- Optimism JSON-RPC responses (tested)
- Arbitrum One JSON-RPC responses (tested)
- BNB Smart Chain JSON-RPC responses (tested)
- Base JSON-RPC responses (tested)
- Terms and conditions
- Association set file for the latest root (tested)
- Entrypoint.sol (single associationSets array, updateRoot, latestRoot)
- IEntrypoint.sol (RootUpdated event; IPFS CID of the association set data)
- What are IPFS Gateways?
Privacy Cash
- zkcash program lib.rs (program id, PDA seeds, MerkleTreeAccount layout)
- privacy-cash-sdk constants.ts (program id, token mints, tree depth, relayer URL)
- Solana JSON-RPC responses (tested)
- Solana mainnet JSON-RPC responses, endpoint named in the docs (tested)
- Clusters and public RPC endpoints
Monero
- Monero README: scheduled software and network upgrades
- Daemon RPC documentation
- Restricted daemon RPC responses (tested)
- Restricted daemon RPC responses (tested)
- fcmp++ hf milestone
- FCMP++ and Carrot stressnet releases
- Full-Chain Membership Proofs Development
Terms of the services read