About 0.001 SOL a note. Almost all of it is rent to the chain, and none of it is a percentage.
The figures below are measured, not estimated: scripts/measure-costs.js reads the lamport deltas from a real deposit and a real withdrawal on mainnet.
| Item | Roughly | Paid to |
|---|---|---|
| nullifier account rent | ~0.00097 SOL | the chain, permanently |
| transaction fees | ~0.00001 SOL | validators |
| relayer margin | small, shown before you confirm | the relayer |
| percentage of your deposit | none | — |
Solana charges rent to keep an account alive. The record marking a note as spent has to exist for as long as the pool does, because the moment it disappears the note can be spent again. So it is paid for once, up front, and it lasts. Nobody chose that charge and nobody collects it — it is the price of the double-spend guard being permanent.
The cost does not scale with the amount. Mix 0.1 SOL and 0.001 SOL is 1% of it. Mix 10 SOL and the same 0.001 SOL is 0.01%. That inverts the usual advice: the small pools are the expensive ones in relative terms, and they are also the thinner crowds. Both arguments point the same way.
A brand-new destination wallet holds no SOL, so it cannot pay for its own transaction. Funding it from your old wallet would rebuild exactly the link you are paying to remove. A relayer broadcasts instead and takes its fee from the withdrawal. The fee and the recipient are both bound into the proof, so it cannot quietly raise one or change the other — a modified transaction stops verifying.
Waiting. It is free, it does more for your privacy than any fee you pay, and it is the step people skip. A deposit and a withdrawal minutes apart are linkable on timing whatever they cost.
Compare with routing through an exchange, where the fee is lower and the price is your identity.