Overview

Offrecord is the public anonymous Ring on Solana Privacy Rings, and the account people use it through.

What Offrecord is

A person connects the Solana wallet they already use and moves SOL, USDC or any SPL or Token-2022 asset off the record. From then on they hold, send and receive it with sender, recipient, asset and amount hidden.

The Ring is one program on the Solana Privacy Program. Balances are notes backed by the assets people already hold, addresses stay Solana addresses, and a transfer settles in one Solana transaction.

These docs use ten words, each with one meaning.

WordMeaning
accounta wallet's shielded keys in the Ring
off the recordheld in the Ring
on the recordheld in a public wallet
noteone piece of off-record balance
receipta link that opens one transfer
relayersubmits each transfer and is paid from it
the Ringthe public anonymous Ring Offrecord runs on Solana Privacy Rings
the empty seatthe Ring's auditor key, a public key with no private half
block listthe Solana addresses on the OFAC SDN list
exit feethe share of a withdrawal the Ring keeps, in the asset withdrawn

What a person does

ActionWhat happens
Open your accountThe wallet signs two messages. The account keys derive from the first in the browser, and the second enrolls them in the Ring. Nothing moves.
Go off the recordA deposit moves an asset from the public wallet into the Ring, where it becomes a note.
SendThe owner enters a Solana address, an asset and an amount, reads the quote and signs. The relayer submits the transfer.
ReceiveThe account scans the Ring with its viewing key and finds the notes paid to it.
Go back on the recordA withdrawal sends an asset to any public address. The exit fee is taken here.
Create receiptThe owner exports one transfer as a link. Whoever holds the link can verify that transfer in a browser.

How a transfer works follows one send through every step and lists what the chain shows for each kind of transfer.

Where to start

Developers get the same account the app uses, through @offrecord/sdk.

TypeScript
const account = await offrecord.open(wallet)
await account.send({ to, amount, mint })