Sotto Systems

Confidential execution for onchain markets

Encrypt intent.
Verify execution.

Your order stays unreadable to everyone, Sotto included, until its batch closes. Then it clears at one price that anyone can check.

A sealed order is a window you can see straight through. The three on this desktop replay an example batch: when the clock in the taskbar reaches zero they decrypt, clear at one price, and go back to glass.

buy.txt - Notepad
An order, sealed. Unreadable to everyone until batch 48392 closes.
Sealed. Nobody can read thisLn 1, Col 1
sell.txt - Notepad
An order, sealed. Unreadable to everyone until batch 48392 closes.
Sealed. Nobody can read thisLn 1, Col 1
you.txt - Notepad
Your order. Write a line, then SealLn 1, Col 1
SEALED.BMP - Viewer
Ciphertext240 x 180
What Sotto hides.txt - Notepad

What Sotto hides, and what it does not

Sotto protects intent before the trade. It is not a mixer, a privacy coin or an anonymity tool, and it does not hide what settles.

Hidden until the epoch closes

  • Buy or sell
  • Which asset
  • Size
  • Limit price
  • The wallet that signed

Hidden from the relay too. Encryption happens in your browser.

Not hidden

  • Token transfers at settlement
  • Every order in the batch, once the epoch is decrypted
  • Wallet balances and history
  • That an address uses Sotto

Settlement is transparent on purpose. That is what makes execution verifiable.

Ln 1, Col 1100%
Epoch 48392

One epoch, five states

NameWhat happensPublic after this step
1

Sealed

Your browser signs the order and encrypts it. The relay receives a ciphertext, its hash and a salted commitment.Nothing about the order
2

Committed

The epoch closes. The relay fixes the batch as a Merkle root before any key exists, so no order can be added later.Order count and root
3

Decrypted

The drand network publishes the round signature that opens every ciphertext in the batch at once.All orders in the batch
4

Matched

A deterministic auction finds the single price that trades the most volume, closest to the oracle.Clearing price and result hash
5

Settled

The settlement contract re-checks every signature, limit and nonce, then moves tokens atomically.Every transfer

Example batch, six sealed orders

CiphertextSideQtyLimitFilledFill
0x9f3a…c21eBuy120332.60120
0x41d0…7b9aSell150332.0580
0xe6b2…03f4Buy60331.800
0x1c77…a8d5Sell80331.9080
0xb90e…5e12Buy40332.3040
0x73a4…d6c0Sell30332.900

When the epoch closes the Merkle root 0xbb17b3…c5f5a3 is committed, the orders are decrypted, and four of them fill at a single clearing price of 332.19 USDG.

6 itemsClearing price 332.19 USDG · 160 AAPL, 4 fills
How Sotto is built

How it is built

Four parts, each checkable without trusting the one before it.

Client

Signed and encrypted locally

EIP-712 orders bound to one chain, one contract and one epoch. Timelock encryption to the drand threshold network, which publishes a key every 3 seconds. The scheme is pluggable; Shutter was evaluated.

Relay

Accountable, not trusted

Every accepted ciphertext gets a signed inclusion receipt. If the published root leaves your order out, the receipt is proof of censorship.

Matcher

One price, no queue

A uniform-price batch auction in integer arithmetic. The Rust matcher and an independent TypeScript reference produce identical result hashes for every fixture.

Settlement

The contract enforces

The matcher only proposes a price and fills. Signatures, limits, minimum fills, nonces, oracle bounds and batch membership are verified again onchain.

Recycle Bin
NameOriginal locationSize
front-run.txtEvery batch0 bytes
1 item
place-order.ts - Notepad

The SDK in twenty lines

const client = new SottoClient({ relayUrl });
const { markets } = await client.config();

const order = await client.buildOrder({
  owner: account.address,
  market: markets[0],
  side: SIDE_BUY,
  baseAmount: 120n * 10n ** 18n,
  limitPrice: toProtocolPrice("332.60", 18, 6),
});

// Signed, then encrypted, in this process.
const sealed = await client.signAndSeal(order, (typedData) =>
  account.signTypedData(typedData),
);

const receipt = await client.submit(sealed.envelope);

// After the epoch closes.
const check = await client.verifyInclusion(receipt);
@sotto/sdkLn 22, Col 52
envelope.json - Notepad

What the relay receives

{
  "protocolVersion": 1,
  "scheme": 1,
  "epochId": 48392,
  "ciphertext": "0x2d2d2d2d2d424547…",
  "ciphertextHash": "0x9f3a…c21e",
  "orderCommitment": "0x5be1…90d7"
}

No ticker, side, size, price or wallet. The relay rejects any envelope that carries an extra field.

POST /api/v1/ordersLn 8, Col 2
System Properties

Where it stands

Sotto Systems

Venue
Terminal
Robinhood Chain mainnet, chain 4663. AAPL, NVDA, TSLA and SPY Stock Tokens are listed against USDG, in 30-second sealed batches.
Prices
Chainlink reference prices for Stock Tokens, read from Robinhood Chain.
Contracts
Tested, including fuzz tests, and reviewed internally. Not audited by a third party. Read the security review before relying on them.
About Sotto Systems
Sotto Systems

Confidential execution for onchain markets. Encrypt intent, verify execution.

Sotto Systems is not affiliated with, endorsed by, or operated by Robinhood. Stock Tokens are issued by Robinhood Assets (Jersey) Limited and are not offered to US persons. Company names and logos are trademarks of their owners and are shown only to identify assets; Sotto Systems is not affiliated with those companies. Nothing here is investment advice.

© 2026 Sotto SystemsSotto on X