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

1

Name a destination

Any Solana address, a Veilo username, or a fresh wallet. The destination is chosen at withdrawal time.

2

Authorise it with a proof

Your client generates a proof that binds the destination and amount. Altering either invalidates it.

3

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.

PublicHidden
That a withdrawal occurredWhich deposit funded it
The amount withdrawnWho authorised it
The destination addressAny link between the destination and the depositor

The amount is public but not a fingerprint

Balances can be split and merged in arbitrary amounts inside the pool, so a withdrawal amount need not correspond to any deposit amount. That is what stops the public amount from acting as an identifier. See Notes & private balance.

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.