The $CLOAKR CA ends in 777. Spin the sevens

Overview

Private payments on Robinhood Chain.

Cloakr holds ETH and USDG in shielded pools. Inside a pool, balances and transfers are private: an observer sees that the pool was used, not who paid whom or how much. You shield from your wallet, send or swap privately, and withdraw to any address. Proofs are made in your browser and a relayer submits them, so your wallet never signs the private part.

2 assetsETH and USDG pools
~1.5 sproof in a laptop browser
0.3%only when funds leave
0 gasfrom your wallet for sends

How it works

Every balance in Cloakr is a set of notes. A note is an amount owned by a spending key, stored on chain only as a commitment: a Poseidon hash of the amount and a hiding value built from your public key and a random blinding factor. The pool keeps every commitment in a Merkle tree of depth 20 (about a million notes) and remembers its last 100 roots.

  1. Shield. You deposit ETH or USDG. The pool computes the commitment on chain from the amount it received and the hiding value you sent, and appends it to the tree. The note itself is encrypted to your key and published alongside, so any of your devices can find it again.
  2. Prove. To spend, your browser builds a Groth16 proof that you own up to two notes in the tree, that the outputs add up, and which nullifiers they burn. A nullifier is a hash only the owner can compute; publishing it marks a note spent without saying which one.
  3. Relay. The proof and the encrypted outputs go to the relayer, which submits the transaction from its own address and takes a small fee from the notes. The fee, recipient and outputs are sealed into the proof, so the relayer cannot change them.
  4. Settle. The pool checks the proof, burns the nullifiers, adds the new notes to the tree and, for a withdrawal, pays the recipient. Change comes back to you as a fresh note.

A shielded swap spends notes in one pool, routes the proceeds through the ETH/USDG pool on Uniswap V3, and lands the output in the other pool as a new note for you. The swap target, minimum output and your new note are bound into the proof, so nobody in between can redirect it.

Using the app

Open the app, connect an EVM wallet on Robinhood Chain and sign one message to unlock your private balance. The signature never leaves your browser; it is turned into your keys there.

ShieldMove ETH or USDG from your wallet into your private balance. The deposit is public like any transfer; what happens next is not.
SendPay a 0x address or a ck1 shielded address. If the 0x address published a shielded address, the payment stays inside the pool. Otherwise it is paid out from the pool to that wallet.
SwapTrade between ETH and USDG without leaving the pool. There is no withdrawal fee on a swap.
WithdrawPay private funds out to any 0x address, including a fresh one.
ReceiveCopy your ck1 address, publish it for your 0x address so people can pay that address privately, or make a payment request link.
Payment linksPut funds in a link and send it to anyone. They claim it to a wallet or a private balance with no gas and no account. Take it back any time before it is claimed.
PayrollPaste or upload a list of addresses and amounts and pay everyone in one run, each as its own private transfer.
HistoryYour notes and the activity on this device, exportable as CSV.
Viewing keysShare read-only access with an auditor, or open a key someone shared with you.

Payroll and requests

Payroll takes one payment per line: address, amount, label. Paste from a spreadsheet or upload a CSV of up to 100 rows. Cloakr checks every address first, shows the total with fees, and then pays each row as a separate relayed transfer. Shielded and registered recipients are paid inside the pool; plain 0x addresses get a payout from the pool, minus 0.3%.

Progress is saved in your browser after every row. If the tab closes mid-run, finished rows stay paid, and the row that was in flight is marked check so you can confirm it in History before paying it again. When the batch is done, download the results with a transaction link per row.

Payment requests are links you make under Receive: your shielded address, an asset, and optionally an amount and a note. Opening one starts a private send with everything filled in, so the payer only checks and confirms. A request link holds no money and reveals nothing beyond the address you chose to share.

Fees and limits

ShieldingFree. You pay the normal network gas from your wallet.
Withdrawals and payouts0.3% of the amount leaving the pool, sent to the Cloakr treasury. The contract caps this fee at 1%.
Private transfers and swapsNo protocol fee. Swaps pay the Uniswap pool fee (0.01%) and settle within 1% of the quote.
Relayer feeCovers the gas of the relayed transaction, taken from your notes in the same asset. Typically well under a dollar; the app shows the exact figure before you confirm.
Deposit sizeFrom 0.001 to 10 ETH, or 1 to 25,000 USDG, per deposit. You can shield several times.

Getting the most privacy

  • Leave time between shielding and spending. A deposit followed seconds later by a payout of the same amount is easy to pair up.
  • Shield round amounts and spend different ones.
  • Withdraw to a fresh address rather than the wallet you shielded from.
  • Pay registered 0x addresses or ck1 addresses when you can: those payments never leave the pool.
  • Use the relayer. If it is offline the app can submit from your wallet, which hides amounts and recipients of private transfers but shows that your wallet used Cloakr.

Keys and recovery

Your shielded account comes from one signature of a fixed message by your wallet. The same wallet always produces the same keys, so there is nothing extra to back up: open the app on another device with the same wallet and your notes are found again from chain data. Wallets that sign differently every time (some smart contract accounts) cannot hold a Cloakr balance.

Spending keyNever leaves the browser. Needed to make proofs.
Shielded addressck1 followed by 128 hex characters: your public key and note encryption key. Safe to share.
Viewing keyvk1 followed by 192 hex characters. Reads your history, cannot spend.

Viewing keys

A viewing key contains your public key, your nullifying key and your note decryption key. With it, anyone can scan the pools, open every note you received and compute whether each one is spent. That is enough for a statement of what came in, what went out and what is left, and nothing more: it cannot make a proof, so it cannot move funds.

Share it with an accountant, an auditor or a compliance team the way you would share a bank statement. Everyone else keeps seeing only commitments.

SDK quickstart

The SDK is a plain ES module served from this site. It works with any EIP-1193 wallet and uses the same code as the app.

import { Cloakr } from 'https://cloakr.tech/sdk/cloakr.js';

// wallet access, Robinhood Chain, one signature that derives the shielded keys
const cloakr = await Cloakr.connect(window.ethereum);

await cloakr.shield({ asset: 'ETH', amount: '0.05' });
await cloakr.send({ asset: 'USDG', amount: '25', to: '0x9f2c...41d7' });  // private payout
await cloakr.swap({ from: 'ETH', to: 'USDG', amount: '0.02' });          // stays in the pool

console.log(await cloakr.balances());   // { ETH: '0.0299', USDG: '...' }
console.log(cloakr.address);            // ck1... to get paid privately

const link = await cloakr.createLink({ asset: 'USDG', amount: '20', note: 'Lunch' });
// send link.url to anyone; they claim it with no wallet:
await Cloakr.claimLink(link.url, { to: '0x5e1a...c0de' });

Every action accepts { onStep }, called with { step, detail } as it loads the prover, proves, relays and confirms, so you can show progress.

SDK reference

Cloakr.connect(provider)Any EIP-1193 provider. Requests the account, switches to Robinhood Chain (4663, added if needed), asks for the one signature that derives the keys, and syncs both pools. Returns a ready client.
new Cloakr({ provider })The same in steps: connect() then unlock().
balances()Private balances as decimal strings, per asset.
shield({ asset, amount })Deposits from the wallet. Approves USDG first when needed.
send({ asset, amount, to })to is a 0x or ck1 address. Private transfer when the recipient is shielded or registered, payout otherwise.
quoteSend(asset, amount, to)Route, relayer fee, protocol fee and the amount that arrives.
withdraw({ asset, amount, to })Always a payout to a 0x address.
swap({ from, to, amount })Shielded swap between ETH and USDG with 1% slippage protection by default.
register()Publishes your shielded address for your 0x address.
address, viewingKey()The account's ck1 address and vk1 viewing key once unlocked.
createLink({ asset, amount, note? })Funds a payment link from the private balance, including the claim fee. Returns { url, seed, amount, claimFee, hash }. Whoever holds url can claim it.
Cloakr.claimLink(url, { to })Claims a link to a 0x or ck1 address. Static: no wallet needed, the relayer submits. Returns what arrived per asset.
linkStatus(url), reclaimLink(url)What a link still holds, and moving an unclaimed link back into this account.
sendMany({ asset, payments })Pays [{ to, amount }] one by one. Returns a result per row and stops when the balance runs out.
requestLink({ asset, amount?, note? })A link that opens the Cloakr app on Send with this account as the recipient.
Cloakr.audit(viewingKey)Per asset: every note the key can open, spent or not, and the totals.

Relayer API

The SDK talks to the relayer for you. If you build your own client:

GET /api/relayWhether the relayer is online, its address, the current gas price, the ETH price and the fee it expects per action and asset.
POST /api/relayBody { kind: 'transact' | 'swap', pool, proof, extData, swap? }. The relayer simulates the transaction, refuses anything that would revert or pays it too little, then submits and returns { hash }. Deposits are never relayed; they come from your wallet.
POST /api/rpcRead-only JSON-RPC proxy to Robinhood Chain, used for syncing the pools.

Security

  • Circuit. One 2-in, 2-out transaction circuit over BN254 with Poseidon hashing, about 29,000 constraints. It range-checks every amount to 248 bits, forbids spending the same note twice in one proof and binds the public data hash into the proof.
  • Trusted setup. Phase one is the public Perpetual Powers of Tau ceremony (80 contributions). Phase two had one Cloakr contribution from fresh randomness followed by a random beacon.
  • Contracts. The factory creates one pool per asset. The admin can pause new deposits, change deposit limits, the treasury, and the withdrawal fee up to its 1% cap. Nothing can pause, block or redirect a withdrawal, and nobody can spend a note without its key. Source is verified on Sourcify.
  • Hashing on chain. The pools use the Poseidon contract already deployed on Robinhood Chain at its standard address, and the deploy script checks its output against the circuit before anything is sent.
  • Status. The contracts and circuit are new and have not had an external audit yet. Deposits are capped per transaction for that reason. Use amounts you are comfortable with.