Trade privately. Prove publicly.
Anomie is the private trading identity layer for Solana. Your vault keeps your balance and your trades sealed; your Anomie ID and Proof of Alpha let you show the market what it needs to verify, and nothing more. Your keys never leave your browser.
Protect your financial activity.
Trade with less information leakage.
Build a persistent identity without exposing your wallets.
Demonstrate real performance without revealing every position.
How it works
Value enters through a public shield, lives as sealed notes, trades in the dark, and comes back out only as the claims you choose to prove. Everything in between is proven, not revealed. Tap a stage.
Phantom, Solflare or Backpack stays your public identity. It signs exactly one thing in Anomie: a shield. Anomie never holds or sees its private key.
The three pieces
Each note commits to a token, an amount and its owner. Only your viewing key can open it; only your spending key can spend it.
Groth16 zero-knowledge proofs, built in your browser, convince the Anomie program that balances add up and you own what you spend.
A relayer submits your proof and pays the network fee. It can't change where funds go: the recipient and its fee are bound into the proof.
Quick start
anom1… address, trade, or lend. No wallet signatures, no public link.Shield
Moves any registered SPL or Token-2022 token from your wallet into Anomie. SOL is wrapped and unwrapped automatically. Your wallet pays the amount plus the 0.3% Anomie fee and signs once; the note is sealed in your browser.
Any token can get a Anomie vault: if it doesn't have one yet, anyone can open it for about 0.004 SOL of rent. Tokens with features that could put a shared vault at risk (permanent delegates, transfer hooks, pausable mints) are refused on-chain.
Send privately
Pay any Anomie address (anom1…; its last characters are a checksum, so a typo is caught) in any token. There's no wallet signature and no Anomie fee, only the relayer's network fee. When you hold private SOL, Anomie pays that fee in SOL, and the transaction doesn't name the token you sent.
The recipient's app finds the payment by trying to open every new note with its viewing key, so nobody (not even the indexer) learns which notes are whose.
Earn
Lend from your private balance through Jupiter Lend. Your position is a private note of the market's share token (for example jlUSDC), and it grows as the share price rises with interest. Withdraw turns it back into the underlying token, privately.
Withdraw & one-time addresses
Withdraw sends funds to any Solana address. By default it creates a one-time address derived from your vault, so nothing ties it to your wallet. Your recovery key restores every one of them.
Receive works the other way: give a payer a one-time address instead of your wallet. When funds land, shield them back with one tap. It's gasless: the relayer pays the network fee and takes its fee from the deposit, so even a token-only address works.
Invite & earn
Every vault can create an invite link. Friends who shield through it get 50% of Anomie's shield fee back for their first 30 days, and you earn 20% of the shield fees they pay for 12 months. Open Invite in the app.
Trade
Swap inside your private balance through Jupiter. On-chain, Anomie's vault is the trader. You set a minimum output; if the market can't meet it, nothing is traded and your input returns to your private balance automatically.
Each trade runs in two steps: your proof sets aside the input in an escrow of its own, then the route runs. The program checks the escrow paid out exactly the input and the vault received at least the minimum you approved. The quote and that minimum come from the relayer, so the app compares them with the market price before you approve.
Anomie ID
An Anomie ID is a persistent, pseudonymous identity for a trader. It is derived from your vault's root key, never from a wallet, so it can carry a reputation across every wallet you use without revealing any of them.
- Handle: a public name (for example
@nightdesk) bound to an identity key. Anyone can check that a proof was made by that handle. - Private wallet links: you can prove that several wallets feed the same identity without saying which wallets they are. Links live as sealed notes, like your balance.
- Rotation: the handle survives a lost or burned wallet. Your recovery key restores the identity together with the vault.
Proof of Alpha
Proof of Alpha turns your private trade history into a public, verifiable claim about performance. Your browser computes the numbers from your sealed trades and builds a zero-knowledge proof that they are correct; the chain checks the proof and records the claim under your Anomie ID.
What is public, what is private
Pick an action to see exactly what the chain records and what stays sealed.
- That a private transfer happened
- The relayer fee (in SOL when you hold private SOL)
- How many notes were spent (1-4)
- Sender
- Recipient
- Amount
- Which token, when the fee is paid in SOL
Good habits
- Don't withdraw the exact amount you shielded to the same wallet right away.
- Keep a little private SOL so transfers can hide their token.
- Prefer tokens with a big crowd; wait a while between shielding and withdrawing.
- Reach the relayer through a network-level privacy tool if your IP address matters to you.
Fees
Anomie's fee is 0.3% each time value crosses the privacy wall: when you shield, trade or withdraw. Private sends between Anomie users have no Anomie fee. The program enforces the rates; here they are, read live from the chain:
| Action | Anomie fee | Relayer fee |
|---|---|---|
| Shield | 0.3%, on top | None (your wallet pays the network fee) |
| Send | None | Network fee + rent for each note spent |
| Trade / Earn | 0.3% of the input | Network fee + rent |
| Withdraw | 0.3% of what you withdraw | Network fee + rent (+ opening the recipient's token account if needed) |
Try it
Keys & recovery
Your vault holds one random 32-byte root. From it your browser derives a spending key (to spend notes), a viewing key (to find and open them) and every one-time address. It's encrypted with your passphrase (PBKDF2, 600,000 rounds → AES-GCM) and stored only in this browser.
- The recovery key (shown once at creation) restores everything on any device. Anyone who has it can spend your private balance.
- It is not derived from your wallet, so a wallet compromise doesn't expose your Anomie balance, and vice versa.
- Lose both this browser and the recovery key and the funds are unrecoverable. Nobody, including Anomie, can restore them.
Security model
- Non-custodial: only proofs from your keys move your notes. The admin can pause, set fees, caps and allowlisted programs, but cannot move anyone's funds.
- Bound to the proof: recipient, fees and swap terms are hashed into the proof by the program itself; a relayer that changes anything gets an invalid proof.
- Isolated swaps: each trade or lend has its own escrow and signer; an allowlisted protocol can only touch that one.
- Multisig admin: a 2-of-2 multisig, handed over in two steps; it can pause, never move funds.
Testing, review status and live on-chain checks are on the Security page.
Limits & risks
- Anonymity set: privacy grows with the number of people using Anomie, and per token for shields and exits.
- Freezable tokens (like USDC) can have their vault frozen by the issuer. The app labels them.
- Emergency pause: the multisig can pause deposits, transfers and swaps; withdrawals stay open. In an incident it can also pause everything leaving the pool for at most about 3 days (it ends by itself, and a new one can start only 7 days after the last).
SDK
@anomie/sdk does everything the app does: keys, sync, proofs, and talking to the relayer. Proofs are generated client-side; nothing secret is ever sent.
import { AnomieClient } from '@anomie/sdk'
import { deriveKeys, rand } from '@anomie/crypto'
const anomie = new AnomieClient({
connection, programId,
indexerUrl: 'https://indexer.example', relayerUrl: 'https://relayer.example',
circuit: { wasm: '/circuits/transaction.wasm', zkey: '/circuits/transaction.zkey' }
})
anomie.unlock(deriveKeys(rand(32))) // keep the 32-byte root safe: it is the vault
await anomie.sync() // download notes, find yours by trial decryption
console.log(anomie.rootStatus) // 'ok': checked against the program's own root on-chain
// tokens are named by mint (a token's own symbol is never trusted)
const SOL_MINT = 'So11111111111111111111111111111111111111112'
const USDC_MINT = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'
for (const m of [SOL_MINT, USDC_MINT]) await anomie.resolveAsset(m) // reads each token's Anomie config from chainRelayer & indexer API
Both are plain HTTP and keep no logs of who asked what. Anyone can run their own.
| Endpoint | What it does |
|---|---|
| GET /v1/info | Relayer key, allowlisted swap and lending programs, protocol fee rates |
| GET /v1/fee?mint&inputs | Relayer fee for a token and number of notes spent, and the account it's paid to |
| POST /v1/relay | Submit a proof (transfer, withdrawal, trade, lend); the relayer pays the network fee |
| POST /v1/sponsor | Gasless shield: co-sign a deposit as fee payer after a strict check |
| GET /v1/quote | Swap or lending quote, after the Anomie fee |
| GET /v1/positions | Lending markets, rates and share prices |
| GET /v1/id/:handle | Anomie ID: public profile, creation time and published attestations |
| POST /v1/alpha/attest | Proof of Alpha: submit a performance proof; the relayer pays the network fee |
| GET /v1/commitments | Indexer: every note commitment and ciphertext, in order (everyone downloads all) |
| GET /v1/nullifiers · /v1/root | Indexer: spent markers and the current Merkle root |
On-chain program
Not deployed yet| Instruction | Purpose |
|---|---|
| transact | Shield, private transfer or withdrawal, with a Groth16 proof (up to 4 notes in, 3 out) |
| swap_prepare · swap_execute · swap_refund | Two-step private trade or lending position through an allowlisted program |
| id_register · id_rotate | Anomie ID: bind a handle to an identity key; rotate keys without losing reputation |
| alpha_attest | Proof of Alpha: verify a performance proof against the note tree and record the disclosed metrics |
| register_asset | Open a vault for a token (anyone; screened on-chain) |
| collect_fees | Sweep protocol fees to the treasury (anyone; treasury only) |
| set_* · accept_admin | Multisig governance: fees, caps, pause, allowlist, two-step admin handover |
Circuit: Transaction(26, 4, 3), Groth16 over BN254, 13 public inputs, verified with Solana's alt_bn128 syscalls. Notes live in a Poseidon Merkle tree of 226 leaves. Proof of Alpha uses a second circuit over the same tree that checks fills against recorded prices and outputs only the disclosed metrics. All of this is the target design: nothing is deployed yet.
FAQ
Can anyone see which wallets are behind my Anomie ID?
No. The ID is derived from your vault, not a wallet, and wallet links are proven privately. The public profile shows the handle and the attestations you publish.
How do I know someone's Proof of Alpha is real?
Each attestation carries a zero-knowledge proof that the program verified on-chain: the metrics follow from real fills in the vault at the prices of the time. You see the numbers and the check, not the trades.
Does Anomie ever hold my keys?
No. Your vault is generated and encrypted in your browser. Proofs are built there too. The relayer and indexer never get your keys; they see your IP address, and the relayer sees the transactions it submits for you, which are public on-chain anyway.
Can the Anomie team freeze or take my funds?
The program has no path for anyone to move notes without the owner’s proof. The multisig can pause deposits, transfers and swaps in an emergency (withdrawals stay open), pause everything leaving the pool for at most about 3 days with 7 days between two such pauses, and set limits (disabling a token stops new deposits into it, never its withdrawals); no instruction lets it move funds. It is also the upgrade authority, so it could change the program itself: upgrades are announced in advance.
What if the relayer goes down?
Your notes stay in the pool, untouched: try again when it is back. The relayer only submits proofs and pays network fees, and anyone can run one, but each proof pays one specific relayer, and this app uses Anomie's.
Is Anomie anonymous?
Anomie hides the link between your wallet and your private activity. How well depends on the crowd and your habits (amounts, timing, tokens). No tool makes you 100% anonymous, and we won’t claim it does.
Which tokens work?
Any SPL or Token-2022 token without features that are unsafe in a shared vault. Anyone can open a vault for a new token.
I lost my recovery key and browser data.
Then the funds can’t be recovered by anyone. Keep the recovery key offline and private.
Why does a send sometimes show the token?
When you have no private SOL, the relayer is paid in the token you’re sending, which names it. Shield a little SOL to keep sends fully hidden.
Glossary
| Anomie ID | A pseudonymous trader identity derived from your vault. Carries reputation, not wallets. |
| Attestation | A published Proof of Alpha: a period, the metrics you disclosed and the proof that they are correct. |
| Note | A sealed record of a token amount you own. Your private balance is your notes. |
| Commitment | The public fingerprint of a note, added to the Merkle tree. Reveals nothing about the note. |
| Nullifier | Published when a note is spent, so it can't be spent twice. Unlinkable to the note's commitment. |
| Relayer | A server that submits proofs and pays network fees. It can't alter what the proof allows. |
| Anonymity set | The crowd your activity blends into: other users of the same pool and token. |
| One-time address | A fresh Solana address derived from your vault, used once for an exit or a payment. |