Core workflow
Withdraw
A withdrawal releases value from the pool to a destination you name at the moment you spend, with no relationship to where the funds came from.
How it works
Name a destination
Any Solana address, a Veilo username, or a fresh wallet. The destination is chosen at withdrawal time.
Authorise it with a proof
Your client generates a proof that binds the destination and amount. Altering either invalidates it.
A relayer submits it
The program verifies the proof and releases the funds. Your wallet is never the signer. See Relayers.
What a withdrawal reveals
This is worth being exact about, because it is the most commonly misunderstood part of any privacy pool.
| Public | Hidden |
|---|---|
| That a withdrawal occurred | Which deposit funded it |
| The amount withdrawn | Who authorised it |
| The destination address | Any link between the destination and the depositor |
The amount is public but not a fingerprint
Spend protection
The program enforces that the same deposit can never be claimed twice. This holds without revealing which deposit was spent. The check proves uniqueness, not identity.
Choosing a destination well
- A fresh wallet gives the strongest result: nothing is already known about it.
- A wallet already tied to your identity re-attaches everything you just detached. The cryptography did its job, the destination undid it.
- Withdrawing an unusual amount shortly after depositing the same unusual amount lets an observer guess correctly without breaking anything.
Anything you do with funds after they leave the pool is as public as it would otherwise be. See Best practices.
