What holds
Requirements the program has to meet, written down so they can be checked against the code. They are not test results: nothing is deployed and nothing is audited. Read the status page.
Nobody holds your funds
Deposits sit on a PDA: an address computed from the program, with no private key behind it. There is no team wallet, no admin instruction and no key to steal, leak or hand over.
Only a valid proof moves a lamport
The one way out is the withdraw path, and it runs only when it is handed a proof that someone holds the receipt for a deposit in the pool.
Value cannot be minted
A receipt is worth nothing unless the matching deposit actually arrived. The program cannot invent SOL it was never sent.
A deposit cannot be withdrawn twice
Withdrawing publishes a nullifier derived from your receipt. Present the same deposit again and the same nullifier comes out, and the second withdrawal fails.
A relayer cannot alter a withdrawal
Destination, amount and fee are sealed inside the proof. Change a byte and verification fails. The worst a hostile relayer can do is refuse to submit.
The pause key cannot stop a withdrawal
One key survives deployment, and it can only close the door to new deposits. It cannot move funds, block a withdrawal, change the code or see anything hidden.
The edges
What stays public
Every deposit: the wallet it came from, the amount, the time. Every withdrawal: the address it lands on, the amount, the time. The pool hides the line between the two and nothing else. That is how a pool on a public chain works, and the rest is your own care: wait before you withdraw, and do not withdraw into the wallet you deposited from.
01 Deposit
Public
A fixed amount of SOL, the wallet it came from, and one fingerprint.
02 Wait
Hidden
Which deposit is yours. Every deposit that joins while you wait is another one it could be.
03 Withdraw
Public
The amount and the address it lands on. Never which deposit paid for it.