Skip to main content

1. Prepare recipients locally

Enter one Robinhood Chain address or upload a CSV containing address,amount rows. CSV parsing happens in the browser. The file is not uploaded to KovaSwap.

2. Receive a signed relay quote

For relayed settlement, the same-origin KovaSwap API returns an Ed25519-signed quote. The browser verifies it against the public key pinned in the release. The quote binds:
  • chain and pool;
  • public payment amount;
  • relay address and relay fee;
  • privacy profile;
  • expiration time.
Self-submit does not request a relay quote and carries no relay fee.

3. Create and deposit a private note

The browser derives a random note and computes its Poseidon commitment. The connected wallet deposits the note amount plus the pool’s protocol fee. KovaSwap stores only the public commitment and its Merkle position. The encrypted note vault stays in the browser. Unlocking it requires a wallet signature that does not authorize a transaction.

4. Synchronize the Merkle path

The browser reads finalized Deposit and PrivateTransaction events from the published deployment block through Robinhood’s free public RPC. It reconstructs the Poseidon Merkle tree, verifies each emitted root, and compares the final root with the pool contract before creating a proof. Only public commitments and a reorg-checked finalized cursor are cached locally. No hosted indexer is required for a payment. The public RPC provider can still observe the user’s IP address and public log requests; Private Pay does not claim to hide network metadata.

5. Generate the Groth16 proof locally

The browser downloads hash-pinned WASM and proving-key artifacts. The proof shows that the sender controls an unspent note in a known root and that value is conserved. The witness and note secrets do not leave the device.

6. Settle

The user either sends the proof through the Kova relayer or broadcasts it from the connected wallet. The pool verifies the proof, marks the nullifier spent, inserts any change commitment, and pays the proof-bound recipient. The relayer API accepts only canonical proof bytes and 14 public field inputs. It does not accept recipient lists, notes, witnesses, memos, or CSV data.