Skip to main content

Privacy Guarantees

A detailed breakdown of what is private and what is public at each stage.

Deposit (entering the pool)

DataVisibility
Depositor addressPublic (sends ERC20 approve + deposit tx)
Deposit amountPublic (ERC20 transferFrom amount is visible)
Note commitmentPublic (stored in Merkle tree)
Note secretPrivate (only depositor knows)
Nullifier preimagePrivate (only depositor knows)
Blinding factorPrivate (only depositor knows)
Pedersen commitmentPrivate (computed client-side, never sent on-chain)

Private transfer (inside the pool)

DataVisibility
Transfer amountPrivate (hidden by Pedersen commitment)
Sender identityPrivate (hidden in anonymity set)
Receiver identityPrivate (only receiver can decrypt memo)
Input nullifierPublic (but unlinkable to note without secret)
Output commitmentsPublic (opaque hashes)
Encrypted memosPublic (ciphertext only, AES-256-GCM encrypted)
ZK proofPublic (but reveals nothing about private inputs)
Merkle rootPublic (which tree state the proof is against)

Withdrawal (exiting the pool)

DataVisibility
Withdrawal amountPublic (needed to release ERC20 tokens)
Recipient addressPublic (receives the ERC20 tokens)
Input nullifierPublic (but unlinkable to note)
Change commitmentPublic (if partial withdrawal)
Withdrawer identityPrivate (if using relay) or Public (if direct tx)

Without additional information

An observer can see:

  • Someone deposited X tokens at time T1
  • A nullifier was spent at time T2
  • Two new commitments were created at time T2
  • Someone withdrew Y tokens to address Z at time T3

They cannot establish:

  • Which deposit corresponds to which nullifier
  • Which commitment was spent in which transfer
  • Who the sender or receiver of a private transfer is
  • Individual balances within the pool

With timing/amount analysis

If the pool has very few users, an observer might correlate:

  • Deposits and withdrawals of the same unusual amount
  • Transactions that happen in quick succession
  • Patterns of activity from a single IP (if not using VPN/Tor)

Maximizing privacy

  1. Use round deposit amounts — 100, 500, 1000 instead of 847.32
  2. Transfer before withdrawing — break the deposit→withdraw link
  3. Withdraw to a fresh address — don't reuse your deposit address
  4. Use the relay — your EVM address never appears on-chain
  5. Wait between operations — avoid timing correlation
  6. Encourage pool usage — larger anonymity set = stronger privacy