Docs
Technical notes for people who want to check what Mirage does. Everything below runs in your browser unless it says otherwise.
Keys
Your private balance is a Privacy Cash balance. Its keys come from one signature of your main wallet over the fixed message “Privacy Money account sign in”, exactly as the Privacy Cash SDK and website derive them. The signature never leaves your browser; from it come the encryption key for your notes and the field-element private key the circuit uses. One-time wallets come from a second signature over “Mirage one-time wallets v1”, through HKDF, so a leak of one signature does not expose the other side. Both can be re-derived from your main wallet: that is your backup.
Notes and balance
Every deposit creates an encrypted note in the pool. To find yours, the browser downloads the pool's encrypted outputs (the same list for everyone) and tries to open each one with your key. It takes about a minute the first time and reads only new outputs afterwards. Whether a note is spent is checked against a public list of spent nullifiers published by the Mirage indexer, with a binary search in your browser. No query about your notes is ever sent anywhere.
Deposits
The deposit proof (two empty inputs, one output) is generated in your browser with the circuit shipped in the Privacy Cash SDK. You sign the transaction; it is submitted through Privacy Cash's relayer, which screens deposits. Mirage never bypasses that screening.
Withdrawals and the relayer
To fund a fresh wallet or withdraw anywhere, the browser computes the Merkle path of your note from the public tree files, generates the proof and sends it with the recipient and the fee to the Mirage relayer. The relayer pays the network fee, signs and submits. Recipient, amount and fee are bound inside the proof: the relayer cannot change them. In the same transaction it forwards 0.35 % to Privacy Cash and keeps 0.006 SOL for network and rent. It keeps no logs.
Tree files
The Mirage indexer reads the program's CommitmentData events, rebuilds the Merkle tree (depth 26) and checks the root against the root history of the on-chain tree account before publishing. The tree is split into chunks of 16,384 leaves (about 1 MB) plus the top levels (262 KB). Your browser downloads only the chunk that holds your note; which leaf it looks up stays private. Anyone can rebuild the same files from the chain.
Buys and sells
Buys go through Jupiter, which routes pump.fun bonding-curve tokens, PumpSwap and every other DEX. The one-time wallet signs in your browser and sends with a priority fee and an optional Jito tip. Selling swaps back to SOL and deposits it into your private balance from the same one-time wallet, through Privacy Cash's relayer.
Security: who controls each piece
| Piece | Who controls it | What that means |
|---|---|---|
| Privacy Cash program | Privacy Cash (upgrade authority, one key) | Audits listed in their repository (link below). Mirage checks the program bytes and the fee config every 10 minutes and pauses deposits if they change. |
| Deposits | Privacy Cash relayer | Every deposit goes through their relayer, which screens it against sanctions lists. Mirage never bypasses that. |
| Withdrawals | Mirage relayer | Receives a proof and a recipient, pays the network fee, forwards 0.35 % to Privacy Cash in the same transaction. It cannot change recipient or amount: both are inside the proof. No logs. |
| Keys and notes | You, in your browser | Balance keys come from one signature; one-time wallets from another. Nothing is stored unencrypted; nothing is sent to any server. |
| Tree and spent list | Mirage indexer (public files) | Rebuilt from the program's events, root checked against the chain before publishing. Anyone can rebuild it. |
Caps during the beta: 2 SOL per fresh wallet, 10 SOL per user, first two weeks of the beta, raised only after an external review of the code that touches funds. Mirage checks the program bytes, the upgrade authority and the fee configuration every 10 minutes and pauses deposits if anything changes.
Audits of the Privacy Cash program: listed in their repository. External review of the Mirage code that touches funds: coming soon, before the caps are raised.
Extension
The Mirage Buy extension (Chrome, Manifest V3) adds a button on pump.fun, Axiom and GMGN token pages. It reads the token address from the page and opens the app on that token in a popup; the buy is prepared and signed inside the app from a fresh wallet. It holds no keys, reads nothing else and sends nothing anywhere. During the beta it is installed unpacked from the repository (Load unpacked in chrome://extensions); the Chrome Web Store listing comes after the beta.
$MIRAGE · after the beta
Nobody needs $MIRAGE to use Mirage. If the beta reaches 100 depositors in two weeks, the token launches on pump.fun (pair MIRAGE/SOL): buys and sells cost 0.4 % when paid in $MIRAGE instead of 0.5 %, and 30 % of Mirage revenue buys $MIRAGE on the market with public transactions. Until then there is no token and no contract address.
Recover without Mirage
Your balance is a Privacy Cash balance and is built to be recoverable with the same wallet; this check is run with a real deposit before the beta opens. Open privacycash.org, connect the same wallet, sign their message and withdraw. Your one-time wallets can be exported from the app (Wallets tab) and imported in any Solana wallet.
Questions
Do I need $MIRAGE to use Mirage?
No. Depositing is free. Preparing a fresh wallet costs 0.35 % (to Privacy Cash) plus 0.006 SOL for network and rent. Each buy or sell costs 0.5 %; 0.4 % when paid in $MIRAGE, after the beta.
Where is my money?
In the Privacy Cash pool, an audited on-chain program. Mirage never holds it. The balance is built to be recoverable on privacycash.org with the same wallet; that check runs before the beta opens.
What does the relayer see?
A proof, an amount, a recipient and a fee. Not your main wallet, not which note you spent. It cannot redirect funds: the recipient is bound in the proof.
Why standard amounts and random times?
Because an exact amount or an immediate withdrawal matches your deposit on its own. Standard sizes and waits of 5 to 30 minutes between preparations break that trail.
Is this instant?
The buy is: the fresh wallet is loaded ahead of time. Preparing a wallet takes a few seconds of proving in your browser plus one transaction.
Which tokens can I buy?
Anything Jupiter routes, including tokens still on the pump.fun bonding curve and tokens on PumpSwap. The balance is held in SOL in this version.
Is the code public?
Yes, with a reproducible build. Nothing from Privacy Cash's program code is copied: Mirage uses their ISC SDK and calls their deployed program.
Licenses
Mirage adapts the Privacy Cash SDK (ISC) and calls the deployed program. Nothing from the Privacy Cash program repository (BSL 1.1) is copied or embedded.