The ghost wallet and private funding
A burner key in your browser, funded through a shielded pool.
The ghost wallet
The keypair that signs every game transaction: deposit, seal, open, withdraw, claims. Your main wallet never signs anything that touches the program. The key is kept in this browser and can be recovered.
Recovery
Linked. Your main wallet signs a fixed message twice; the two signatures must match, and the ghost key is derived from them (HMAC-SHA256 under a Whisp tag). On a new device press Recover and sign again. The signature never leaves the browser. Linking leaves nothing on-chain that connects the wallets; only a plain transfer would, so fund privately.
Phrase. Or pick 12 words instead (no main wallet needed), shown once and confirmed before the wallet is created. The words are a BIP-39 seed and the key is derived from it. Anyone with the words controls the wallet.
Your sealed-bet secrets live in the browser too; a bet whose secret is lost before the reveal window never opens and forfeits its 0.001 SOL bond.
The inbox key
A second keypair, derived from the ghost key, so recovering the ghost wallet recovers the inbox too. Fund privately takes a fixed amount (0.1, 0.5, 1 or 5 SOL) and asks your main wallet for one plain transfer to the inbox (the amount plus 0.005 SOL for the deposit's fee and rent), the only popup, after checking that the pool will take the deposit. The inbox deposits into Privacy Cash and, a random 2–15 minutes later, the pool's relayer withdraws to the ghost wallet. Your main wallet never touches the pool and the relayer pays the ghost wallet, so no transaction connects the two ends. Amount and timing still could; the fixed amounts and the wait make that harder.
The shielded pool
Privacy Cash is an audited zero-knowledge pool on Solana. A deposit becomes a note; a withdrawal proves it owns a note without saying which one. The fee is about 0.35% + 0.006 SOL per withdrawal. The SDK loads only when a private action starts.
Auto-deposit
When the ghost wallet holds more than 0.02 SOL above a 0.01 SOL fee reserve, all of it moves into the game balance. This happens when funds arrive, never when you bet: a top-up sized like the bet would leak the amount. Withdrawal flows pause it. When the fee reserve runs low, the app refills it from the game balance.
Withdrawing
Withdraw privately: game balance → ghost wallet → pool → relayer → the address you paste. SOL only, in whole 0.1 SOL steps (it needs 0.105 SOL or more); the rest stays in the game. Withdraw: game balance, spare wallet SOL, owed ZEC and unstaked WHISP go to any address in one visible transaction.
Private transfers take 2–15 minutes either way. The wait is what makes them private. The wallet shows when yours arrives. It finishes on its own while this browser has Whisp open, or the next time you open Whisp in this browser, so keep this browser until it arrives. One private flow runs at a time. If one is interrupted, the wallet menu says your SOL is safe and offers [ Resume ]: anything left in the pool goes on to its destination, anything left in the inbox is shielded again. If it stopped before reaching the pool, [ Cancel ] ends it instead: a withdrawal's SOL stays in your balance, and a funding goes back, less the fee, to the main wallet that paid it.