Tint
In the pool········
Notes in the tree········

The chain sees the pool, never your wallet.

Open account

Docs

The account

A Tint account is a private balance held as notes. You open it by connecting a Solana wallet (Phantom, Solflare, Backpack) and signing one fixed message. The browser derives three things from that signature: a spending key, a viewing key and the account’s address, which starts with tint1. Nothing leaves the device, and nothing moves on chain.

The same wallet and the same signature reopen the same account on any device. Your balance is rebuilt by reading the encrypted note feed and decrypting what belongs to you.

Notes, the tree and nullifiers

A note is one private amount of one asset. On chain it is only a commitment, Poseidon(mint, amount, owner, blinding), a leaf in one tree of commitments shared by every asset. Because every asset lives in the same tree, every note belongs to the same crowd.

Spending a note publishes its nullifier, Poseidon(nullifier_key, leaf_index). Nothing public links a nullifier to its note. A Groth16 proof over BN254, made in your browser, shows that the notes you spend are in a recent root, that they are yours, and that they balance against what you create. It never says which notes they are.

The tree is 32 levels deep.

The screening gate

A shield moves tokens from your wallet into the mint’s vault and records a pending deposit with your note’s commitment. The screener checks the depositing wallet and admits the deposit; only then does the commitment join the tree.

A deposit that isn’t admitted goes back to the wallet it came from with reclaim, and no note enters the tree. So every note in the pool descends from a screened deposit, and whatever leaves the pool came in screened.

The swap path

A private swap is one proof and one transaction. Your proof spends notes of the asset you sell and fixes the amount in, the minimum out, a change note, and a partial output note whose owner is you and whose amount is left open.

The relayer submits it. The program checks the proof, takes the 0.25% protocol fee, swaps from one vault to the other through Jupiter, measures what arrived against your minimum, and completes your output note on chain with the Poseidon syscall from the amount that actually landed. The chain sees the pool swap; it never sees who.

It fits in one transaction because v1 transactions carry 4,096 bytes and a CPI can pass 255 accounts. Verifying a Groth16 proof costs 78,293–108,762 CU of the 1,400,000 CU a transaction allows.

Viewing keys

The Statement issues a read-only viewing key. Whoever holds it can decrypt your notes and your whole history, and can export it, but can never spend. Hand it to an accountant or an exchange’s compliance desk when they need to read your account.

The relayer

Private actions are submitted by a relayer, which pays their SOL and takes a small fee in the asset being spent. Your wallet never signs a send, a swap or a withdrawal, so it never appears next to one.

Fees

  • Shield: free.
  • Send: no protocol fee; the relayer’s fee covers the SOL it spends.
  • Swap and withdraw: 0.25% of the amount, in the asset being spent, to the protocol fee account for that mint, plus the relayer’s fee.

Fees are added to the amount you enter, so the amount you choose is the amount that moves.

The SDK

Terminals and wallets shield into the same pool through the SDK, so every integration adds to one crowd. Each action is one line:

tint.shield(…)
tint.send(…)
tint.swap(…)
tint.withdraw(…)
tint.balance(…)

Keys are derived and notes decrypted in the browser; proofs are made there too. The SDK talks to the indexer for the note feed and to the relayer for submission, and neither ever holds a key.

Program and vaults

Cluster
…
Program (Anchor)
…
Pool
…
Protocol PDA
…

Any SPL mint can be shielded: open_vault opens a vault for a new mint, and anyone can call it.

The token

TINT has a fixed supply of 1,000,000,000: 97% in one public fair launch, and 3% to the developer, locked for one year. The protocol’s whole fee share buys it and burns it. Token has the rest.