A public order is a published strategy.
A treasury moving two million dollars from USDC into ETH has a problem that has nothing to do with execution quality. The moment the order is public, so is the intent. Size, direction, and the wallet behind it are readable before the trade fills.
This is not a flaw in Uniswap. Public order flow is what makes these protocols work. It just means any treasury large enough to matter cannot use them without leaking.
Front running
An observable order is an observable opportunity. The treasury pays the difference.
Strategy disclosure
A sequence of public trades is a public thesis. Competitors read it for free.
Counterparty pricing
Anyone quoting you can see your position first, and quote accordingly.
Governance exposure
A DAO debating a reallocation announces it long before it executes.
Three phases. Two of them nobody can see.
Submit
Amount, direction and limit are encrypted in the browser before anything is sent. The chain records that a Safe submitted an order for a pair, and nothing else.
- Public
- The Safe, the pair, the expiry
- Hidden
- Side, amount, limit
Cross
Every thirty minutes an epoch seals. Opposing orders match against each other inside the encrypted computation, at a time-weighted price from the Uniswap pool.
- Public
- That an epoch sealed
- Hidden
- Who matched whom, and for how much
Settle the remainder
Only what did not match is aggregated into one net figure and sent to Uniswap. One transaction, everybody's leftover combined, with no individual attribution.
- Public
- The aggregate that reached the venue
- Hidden
- Each treasury's share of it
The floor is why this holds
An aggregate contributed to by one treasury is that treasury's order in plain sight. shrud refuses to publish it. The epoch floor requires three participants, and the residual and supply routes each require two, counted separately so a busy swap route can never authorise a lonely supply. Anything that misses its floor rolls into the next epoch rather than settling.
Stated precisely, because it is the product.
A privacy claim that does not say what remains visible is not a claim. Here is the whole line.
The public lifecycle has exactly five states, and it must never gain a sixth.
Processed is where every order that entered a sealed epoch ends up. The one that filled completely, the one whose private limit failed, the one that was underfunded, and the one that simply held. A sixth state such as Rejected or InsufficientBalance would turn repeated oversized orders into a binary search over a confidential balance.
Four protocols. None of them modified.
shrud is a layer on top of infrastructure that is public by design. It adds confidentiality without asking anything underneath to change.
Safe
1.5.0Every treasury is a standard Safe with a shrud module installed. Version-gated on the VERSION string, because 1.4.1 silently swallows setModuleGuard rather than reverting.
iExec Nox
0.2.4Confidential computation inside a trusted execution environment. Handles are pointers to encrypted data, decryptable only by the Safe that owns them.
Uniswap v3
SepoliaReference prices come from a thirty minute TWAP with a tick deviation bound. Net remainders settle through SwapRouter02 as one unattributed transaction.
Aave v3
SepoliaAggregate supply reaches a pooled position. Output is measured as an aToken balance delta, because Pool.supply returns nothing and aTokens rebase.
Nothing here asks to be believed.
One command reads Sepolia and re-derives every claim this site makes. It needs no private key, so you can run it against this deployment without asking anyone for anything.
$ pnpm verify:live
✓ 17 contracts, code hashes match
✓ wiring closed, deployer cannot forge intents
✓ governance delays as claimed
✓ assets, routes and adapters registered
✓ privacy floors at least 2
✓ nothing has been seeded
65 checks passed, 0 failed.17 contracts, live
Deployed to Ethereum Sepolia with no Safes, no orders, no balances and no epochs. The verifier asserts that absence, because a verifier that passes against seeded state is checking numbers the repository wrote itself.
Full set with runtime code hashes and constructor arguments in the deployment manifest.
Bring your Safe. Keep your strategy.
Install the module on a Safe you already control. Nothing custodial, nothing to migrate.
A full clearing epoch needs three participating Safes. That is the privacy floor, not a limitation.