SolVanish
Documentation

How SolVanish works

SolVanish is a zero-knowledge privacy protocol on Solana. It lets you deposit SOL from one wallet and withdraw the same amount to a completely different wallet — with no on-chain link between the two.

Overview

When you deposit, your SOL goes into a shared on-chain pool and a cryptographic commitment is recorded in a Merkle tree. You receive a private note — a secret string that proves you own that deposit. When you're ready to withdraw, you submit that note along with a destination address. A zero-knowledge proof is generated in your browser that proves you know a valid note in the tree, without revealing which deposit it is. The protocol verifies the proof on-chain and releases the funds to your chosen address.

Because the proof reveals nothing about the deposit wallet, an observer watching the blockchain cannot connect the source and destination.

Step-by-step

1

Connect your wallet

Connect any Solana wallet (Phantom, Backpack, Solflare, etc.) using the button in the top-right corner.

2

Select an amount and deposit

Choose a fixed denomination (0.1, 0.5, 1, 5, or 10 SOL) or enter a custom amount. Fixed amounts give better privacy because all deposits of the same size look identical on-chain. Hit Deposit and approve the transaction in your wallet.

3

Save your note — immediately

After the deposit confirms, a solvanish-v1-… note string is shown. Copy it somewhere safe — a text file, password manager, anywhere offline. This note is the only way to withdraw your funds. If you lose it, the SOL is gone permanently.

4

Wait (optional but recommended)

For the strongest privacy, wait some time before withdrawing — ideally after other deposits have been made into the pool. The larger the anonymity set, the harder it is to guess which deposit you're withdrawing.

5

Withdraw to a fresh wallet

Switch to the Withdraw tab. Paste your note, enter the destination address (ideally a wallet with no prior history), and click Withdraw. Your browser generates a ZK proof — this takes around 30–60 seconds. Once done, a transaction is submitted and the funds land at your destination address.

Fees

Deposit fee0%
Withdrawal fee1%

The 1% withdrawal fee is taken at the protocol level and goes to the fee recipient. No other fees are charged.

Privacy model

Privacy comes from two things working together:

  • Zero-knowledge proofs (Groth16). The proof confirms you know a valid note without revealing which commitment in the tree it corresponds to.
  • Shared pool. All deposits go into the same contract. An on-chain observer only sees SOL entering and leaving the pool — not which entry maps to which exit.
  • Nullifiers. Each note can only be spent once. When you withdraw, a nullifier is published on-chain to prevent double-spending, but it cannot be traced back to your deposit.

For maximum privacy: use a fresh destination wallet, withdraw to a different amount than you deposited (use multiple notes), and allow time between deposit and withdrawal.

Private note format

Your note looks like this:

solvanish-v1-[base64-encoded-data]

It encodes your UTXO secret keys, leaf index in the Merkle tree, deposit transaction signature, and amount. Notes are stored in your browser's local storage for convenience, but you should always keep a separate backup — clearing browser data will remove them.

FAQ

What happens if I lose my note?

The funds are permanently inaccessible. There is no recovery mechanism — this is a property of zero-knowledge systems. Always back up your note.

Is this non-custodial?

Yes. The protocol is entirely on-chain. No one else holds your funds and no server is involved in the deposit or withdrawal flow. The ZK proof is generated locally in your browser.

Why does proof generation take 30–60 seconds?

Generating a Groth16 proof requires heavy computation. This runs fully in your browser using WebAssembly, so no proof data ever leaves your device.

Can I withdraw to the same wallet I deposited from?

You can, but it defeats the purpose. For meaningful privacy, withdraw to a wallet that has never interacted with your depositing wallet.

Can I split a deposit across multiple withdrawals?

Not directly — each note corresponds to one fixed deposit amount. To receive funds across multiple wallets, make multiple separate deposits and withdraw each note independently.

What network is this on?

Solana Mainnet.

Technical details

Proof system

Groth16 (snarkjs)

Hash function

Poseidon

Merkle tree depth

26 levels

Root history

100 roots

Fixed denominations

0.1 · 0.5 · 1 · 5 · 10 SOL

Program

Anchor (Solana)