Documentation
Private payments that leave no trail
Blackpool is a set of zero-knowledge privacy pools on EVM chains. You shield funds into a pool, then send, swap or bridge them without any on-chain link between the money that went in and the money that comes out. Nothing is held for you: every balance is a note only your wallet can spend.
Overview
Each supported chain runs one pool per asset (native coin plus a stablecoin). Deposits add an encrypted note to a Merkle tree; spending a note means proving, in zero knowledge, that you own a leaf of that tree without revealing which one. Blackpool uses Groth16 proofs generated in your browser or by the CLI, and a relayer that submits transactions so your wallet never has to appear on-chain again after the deposit.
Core concepts
Private account
When you connect a wallet, you sign a fixed message once. The signature is hashed into your spending key and viewing key. Keys never leave the device; the API only ever sees the signature-derived public identifier it needs to look up your encrypted notes.
Notes, commitments and nullifiers
A note is (amount, owner, blinding). Its commitment is inserted in the pool's Merkle tree. To spend, you publish a nullifier (a hash that commits to the note without revealing it) and a proof that the note exists in the tree and that inputs equal outputs plus fees. The contract rejects a nullifier it has seen before, which is what prevents double spends.
Relayer
Every private operation is a transact call on the pool. The relayer pays gas and broadcasts it; the fee is taken inside the proof from the amount you are moving, so you never need gas in a fresh address. The relayer learns the public destination of a withdrawal but not who funded it.
Shield (deposit)
Shielding moves public funds into the pool. The app prepares a proof for a new note worth the deposit, your wallet sends the token (or native coin) to the pool contract together with that proof, and the commitment is appended to the tree. Shielding is the only step your wallet signs on-chain.
- Prepare — the client builds an output note for you and a Groth16 proof.
- Broadcast — your wallet calls
transactwith the deposit amount (ERC-20s need a one-time approval). - Confirm — the pool emits the new commitment and an encrypted copy of the note that only your viewing key can read.
Your private balance is the sum of your unspent notes. The app keeps an encrypted index per account; nothing about balances is stored in plaintext anywhere.
Private send
A private send spends one or more notes and pays an external address. The relayer submits it, so the recipient sees a plain transfer from the pool contract with no connection to your wallet. Up to two recipients can be paid in one proof; any remainder returns to you as change.
Recipient 0x9f3c…41e7
Amount 0.25 ETH
Fee 0.00015 ETH + 0.35% (paid from the pool, no gas needed)
Result pool → recipient. Nothing on-chain links the two.Swap
Swaps happen inside the pool's privacy set. The app derives a one-time burner wallet from your account, withdraws to it privately, swaps on Uniswap V3 (Base and Arbitrum) and re-shields the output into the destination pool. The burner is used exactly once and is deterministic, so it can always be recovered from your signature.
Gas for the burner is capped per chain to realistic values; the app refuses to start a swap whose output would fall under the destination pool's minimum after slippage.
Bridge
Cross-chain moves use NEAR Intents (1Click). Blackpool asks for a quote, receives a one-off deposit address controlled by the solver network, and pays it from the pool through a burner. Solvers deliver the destination asset to your recipient. The origin chain never sees the recipient, and the destination chain never sees the origin.
- Destinations include EVM chains (Base, Ethereum, Arbitrum, BNB Chain, Robinhood Chain) and Solana (SOL, USDC, USDT).
- Every bridge is recorded server-side in an intent registry keyed to your account, with a refund address on the origin chain in case a quote expires.
- Status is tracked until
SUCCESSorREFUNDED; you can follow any intent on the public NEAR Intents explorer.
Recovery
Anything that can get stuck is recoverable from your signature alone. The Recover page lists every burner wallet your account has ever derived (with live balances) and every bridge intent, and lets you sweep or re-shield funds from any device. No seed phrases, no exports: the same wallet signature regenerates everything.
Chains & assets
| Chain | Pools | Swap | Bridge |
|---|---|---|---|
| Base | ETH · USDC · cbBTC | Uniswap V3 | in / out |
| Robinhood Chain | ETH · USDG | — | in / out |
| Arbitrum | ETH · USDC · USDT | Uniswap V3 | in / out |
| BNB Chain | BNB · USDC · USDT | — | in / out (min $1,000) |
| Ethereum | — | — | destination only |
| Solana | — | — | destination only (SOL, USDC, USDT) |
Pool addresses are published here when each chain goes live. Blackpool uses public RPC endpoints only.
Fees & limits
| Pool | Flat fee | Rate | Minimum |
|---|---|---|---|
| Native (ETH / BNB) | 0.00015 | 0.35% | 0.0005 |
| Stablecoins | 1.00 | 0.35% | 1.00 |
Fees are deducted inside the proof from the amount you move and cover relayer gas. Bridges pay the pool fee plus the solver's quoted rate; there is no additional Blackpool fee on bridges.
CLI
The CLI wraps the same API as the app, so agents and scripts get private payments without a ZK client of their own. Keys are read from BLACKPOOL_KEY or stored locally with chmod 600; only derived signatures are ever sent.
npm i -g @blackpool/cli
blackpool login # hidden prompt, or set BLACKPOOL_KEY
blackpool balance --chain base
blackpool deposit 25 --pool usdc # shield
blackpool send 0xRECIPIENT 2.5 # private send, relayer pays gas
blackpool swap 0.001 --from eth # private ETH → USDC via Uniswap V3
blackpool bridge 0.05 --to sol_usdc --recipient <solana address>
blackpool bridges # list your intents and their status
blackpool recover # sweep stranded burnersEvery command accepts --chain base|robinhood|arbitrum|bsc (default base).
API
The relayer API is stateless with respect to your keys: requests carry a signature-derived account identifier and the proof inputs, never a private key. Base URL will be published with the first deployment.
| Endpoint | Purpose |
|---|---|
GET /api/health | Relayer status, chains, pool configuration |
GET /api/assets | Supported pools, bridge assets and minimums |
POST /api/balance | Encrypted notes for an account (decrypted client-side) |
POST /api/deposit | Prepare a shield transaction |
POST /api/withdraw | Private send (up to two recipients) |
POST /api/swap-private | Private same-chain swap through a one-time burner |
POST /api/swap | Cross-chain bridge via NEAR Intents |
GET /api/intent-status | Status of a bridge by deposit address |
POST /api/intents | All bridges for the signed-in account |
POST /api/burner | Burner registry for recovery |
GET /api/suggested-fees, /api/price | Fee and price helpers |
Security model
What is hidden
The link between a deposit and any later spend; your balance; which note a spend consumes; the origin of a bridged payment on its destination chain.
What is public
That a deposit of a given amount entered a pool; that a withdrawal of a given amount left it to a given address; the fee paid. Anonymity grows with the number and variety of notes in a pool — a very unusual amount is easier to correlate.
Trust assumptions
Proofs are verified on-chain, so the relayer cannot steal or forge spends; it can only refuse to relay. Bridges rely on NEAR Intents solvers for delivery, with on-chain refunds on failure. Contracts are upgradeable behind a multisig during the launch period; the upgrade path and audit status will be documented here before mainnet pools accept deposits.
FAQ
Do I need gas to send privately?
No. The relayer pays gas and the fee is taken from the amount inside the proof.
What if I lose my device?
Connect the same wallet anywhere and sign once. Your account, notes, burners and bridge history are all derived or re-indexed from that signature.
Can the team see my balance?
No. Notes are encrypted to your viewing key; the API stores ciphertext it cannot read.
Why is there a minimum amount?
Fees are deducted from each spend; the minimum keeps every spend meaningfully above its own fee.
Is Blackpool related to RAIL20?
Blackpool is an independent product with its own pools, keys and accounts. Balances in other systems are not visible here.