Solana · Privacy Rings + MagicBlock PER · devnet first — nothing on mainnet

Value moves. The link doesn't publish.

Dark Payments is the umbrella for shielded value on Solana: who paid, who traded, and how much stay encrypted — while settlement, solvency, and aggregate flow stay publicly verifiable.

The products

Three products, composed from three primitives. Each one is honest about what it hides and what it cannot.

Design · not built

Dark x402

An x402 machine payment where the payer pays shielded, inside a Solana Privacy Ring. The facilitator verifies settlement from shielded-transaction reads plus a scoped, one-transaction viewing grant — never a public transaction link.

The resource server learns that a payment settled. It never sees a payer wallet, a public payment transaction, or a payer balance. Default verification costs ~20 Helius credits; the 1,000-credit Merkle proof is the exception, not the path.

Program live on devnet

Dark Percolator

The private-perps engine: a public market account, with per-trader portfolios private inside a MagicBlock Private Ephemeral Rollup on Intel TDX. Sealed intents are crossed in batches at the oracle mark; the pool absorbs imbalance up to pool_cap.

Deployed on devnet 2026-11-11 with Market 0 created and insurance funded. Base layer only so far — no portfolio, no rollup step has run. Unaudited. Not on mainnet.

Product of the engine

Dark Perps

The trader-facing product on Dark Percolator: hidden positions, hidden intents, hidden liquidation prices — with a public mark, public aggregate open interest, and public insurance, so solvency stays auditable.

The Phoenix shadow pool is its market-making and hedge side: each commit writes the pool's aggregate inventory to a public hedge ticket, and an operator hedges the net on Phoenix. The hedge is public on purpose — privacy is whose position it is, not the book.

The primitives

Everything above is a composition of these three. The read side runs on the Helius Solana Privacy Rings (SPR) indexer: seven read methods, 10 credits a read, 1,000 a proof. The API never moves value — deposits, transfers, withdrawals and decryption happen user-side through the SPR SDK, with the owner's keys.

Shielded tx

A transfer that lives inside an SPR ring: register, deposit, shielded transfer, withdraw. Amounts and counterparties are encrypted on-chain; a spend reveals a nullifier, not which output it was. A private balance is not an account — it is the sum of a wallet's unspent decrypted UTXOs, computed locally.

Ring deposits and withdrawals are public events, amounts included. That boundary is the anonymity set's edge, and this suite says so.

Shielded swaps — v0, stated plainly

The funding leg and the proceeds leg are shielded; the swap leg trades where swaps trade, from a fresh single-purpose wallet, and that venue sees a trade. v0 breaks the on-chain link between the owner's funded wallet and the trade. It does not hide pair, size, side or timing from the venue, and amount/time correlation remains possible.

Fully shielded swaps — sealed intents crossed inside a PER at a mark — are a later phase. Until that exists, no copy here claims it.

Shielded messaging

x402m agent messages whose payment proposals settle as shielded transfers. Counterparties discover each other through the SPR public registry — owner key in, shielded address and viewing pubkey out — instead of public wallet addresses.

A proposal does not itself authorize a transfer. Acceptance triggers settlement; both parties verify from the signature, their own tags, and a nullifier check. Nobody else learns the payment.

Devnet status — checked on-chain

Dark Percolator is real on devnet. Exactly two transactions have ever touched the program: the deploy and Market 0's creation. Everything past the base layer waits on an explicit go.

Program (devnet)
Deployed 2026-11-11 · upgradeable · unaudited
Market 0
Base layer · not yet delegated to the rollup
Insurance
0.05 SOL
50,000,000 lamports locked in the vault — no withdraw path, by design
Market params
pool_cap 0
Mark age 6,027 slots · EWMA halflife 260,348,936 · mm/im 500/500 bps · fees 1–10,000 bps
SPR read client
Complete
All 7 methods, pagination, −32016 backoff, credit meter, local ciphertext store — mocked tests green
Mainnet
Nothing
No program, no funds, no exceptions. Each mainnet candidate is its own explicit go.

How a Dark Perps trade will move

  1. Shield collateral. The trader's SOL sits in a privacy ring.
  2. Fund. Withdraw from the ring into the market vault via deposit. The ring breaks the plain transfer link; the boundary events stay public.
  3. Go private. open_portfolio, delegate_portfolio, init_permission, set_privacy. submit_intent is refused unless the permission is private.
  4. Trade sealed. The keeper crosses batches at the mark inside the TEE. Matched flow never touches a public book. Fees go to insurance.
  5. Hedge, public on purpose. Each commit_market writes the pool's aggregate inventory to the hedge ticket; an operator places the offsetting Phoenix order from their own wallet.
  6. Exit. Close, undelegate_portfolio, then withdraw — to a public wallet, or back into the ring.

Build order

Devnet before mainnet. Shadow before live. An explicit go before any mainnet value moves. Nothing in the repo signs or sends a transaction.

P1

Local, no cluster. SPR client, pagination, backoff, credit meter, ciphertext store — done, with mocked tests. In progress: fixtures recorded from the official schemas, and a field-for-field check that the TypeScript shapes match them. No live call.

P2

Devnet, fresh keys. Shielded tx end to end (register, deposit, transfer, balance, withdraw) between two test wallets. A devnet resource plus a facilitator verifying on the ~20-credit path. Dark Percolator collateral arriving through the ring. One x402m thread whose proposal settles shielded. Each step waits on an explicit go.

P3

Shadow, zero transactions. The facilitator verifies real-shaped mainnet proof material and does not settle or serve. Credits per verification measured against budget. A shielded-swap v0 correlation study on recorded data — the privacy claim is a measurement.

P4

Gated mainnet pilot. Each candidate is its own go: (a) shielded tx at small caps; (b) Dark x402 on one live resource; (c) the Dark Percolator pilot — which also needs MagicBlock mainnet PER access, team-gated. The documented mainnet SPR host means (a) and (b) are not blocked on an indexer.

P5

Later. Fully shielded spot swaps via sealed intents, attested keeper settlement, and shielded settlement as the x402m default for payment-carrying threads.

What this suite does not claim

No hidden orders on a public CLOB. Phoenix hedges and vault quotes are public. Privacy is whose position the hedge is, not the book.

Ring boundaries are public. Deposits and withdrawals are visible events with visible amounts. Timing and amount correlation at the boundary is an operational risk, not a solved problem.

The facilitator learns what it must. Dark x402 hides the payer's identity and history — not the payment's existence from its verifier.

Trust is named, not retired. SPR read privacy trusts Helius with query patterns. PER privacy trusts Intel TDX and MagicBlock's operation of the validator. The keeper sees positions, because it crosses and liquidates.

The program is unaudited and has never run against a live PER. Insurance and pool lamports have no withdraw path. A pool_cap of 0 means a batch takes no inventory — Market 0 fills only what both sides bring.