Both legs,
or neither.

Settle large stablecoin trades without showing the market your hand, and prove you're clean without showing who you are.

Private, atomic OTC settlement on Arc

The first side to move carries the risk.

Prefunding, side letters and chat confirmations leave one party exposed until the other delivers.

  1. Agreed at 1.0765?
    A 14:02
  2. Yes.
    B 14:03
    No confirmation
  3. Can you send first?
    A 14:03
  4. No, you send first.
    B 14:04
  5. Sent. Waiting for you…
    A 14:05
    Sent first
  6. B 14:47
    Still waiting
  7. One side exposed

Three steps.
Both legs, or neither.

01

Prepare

Each side proves, from a credential, that it is valid and screened, without revealing who it is.

02

Commit

Both sides lock the same terms. They stay private until settlement.

03

Settle

If both proofs and both commitments match, both legs move in one transaction. Otherwise nothing moves.

Same trade.
Three different views.

Before it settles, the terms are a hash. After, they are public. Who is behind each side stays private, unless a regulator holds the key.

Market

Anyone watching Arc
Terms, before settlement
Hidden
Terms, after settlement
25,000,000 USDC for 22,950,000 EURC
Who is behind each side
Hidden
Both proofs verified
yes
Lists and versions used
list v12, 14 Oct 2026

Counterparty

The other side
Terms, before settlement
25,000,000 USDC for 22,950,000 EURC
Terms, after settlement
25,000,000 USDC for 22,950,000 EURC
Who is behind each side
Hidden
Both proofs verified
yes
Lists and versions used
list v12, 14 Oct 2026

Regulator

Holding the key
Terms, before settlement
Hidden
Terms, after settlement
25,000,000 USDC for 22,950,000 EURC
Who is behind each side
holder 7f3c…a9d2
Both proofs verified
yes
Lists and versions used
list v12, 14 Oct 2026

Synthetic example. The proofs are public inputs; the credential never is.

Proof, per trade.

Each side proves three things before anything moves, without saying who it is.

Trade
initiated

01Credential valid and not revoked.

02Not on the sanctions list in use.

03Bound to this trade and to the address that trades.

Proof
complete
Public inputsissuersRoot, revocationRoot, minTier
Public inputssanctionsRoot, validAt
Public inputstradeId, tradingAddress

25,378 constraints, 13 public signals. Proves in 879 ms, verifies in 8 ms. Measured with snarkjs on an Apple M4, 14 Oct 2026.

Built to be verified.

Open contracts, an SDK, and transactions your custody policy can approve.

TypeScript
import { KeelsonClient, proveCompliance } from "@keelson/sdk";

const keelson = new KeelsonClient({ publicClient, walletClient, deployment });

const context = await keelson.loadContext(lists);
const proof = await proveCompliance({
  held, tradeId, tradingAddress, context, keys,
});

await keelson.attest(proof);
await keelson.commit(tradeId, termsHash);
await keelson.settle(tradeId, terms, salt);

Both legs,
or neither.