Trade your shielded $ZEC for confidential USDC on Ethereum, without ever unshielding it.
No bridge. No custodian. No wrapped ZEC. And the amount never shows up on chain.
I connected
@zama and
@Zcash to make it work.
Live on testnet 👇
What it is
ZEC Desk is a small trading desk on Zama's FHEVM, on Ethereum Sepolia. On one side there's cUSDC, a dollar token whose balances are encrypted. On the other side there's shielded ZEC on Zcash testnet.
You can trade either way.
Built on Zama's model
Zama's Confidential RFQ is already live on Ethereum mainnet, open to everyone:
It runs confidential swaps with encrypted quotes, a sealed-bid pick on chain and a hidden floor.
ZEC Desk takes that same model and extends it to native shielded ZEC. Zama's swap settles both legs on one chain, inside its own contract, so a Zcash leg can't plug into it directly.
Here that leg lives on Zcash and settles minutes later with a proof, so the mechanics run in my own contract. It's a sketch of how native ZEC could sit next to Zama's swaps one day, with no wrapped token.
How a trade works (buying ZEC) 👇
1️⃣ You lock cUSDC in the desk. The amount is encrypted.
2️⃣ Makers send encrypted quotes. Nobody sees anyone else's price, or the minimum you'll accept.
3️⃣ The contract picks the best one under FHE.
4️⃣ The winning maker sends shielded ZEC to your Zcash address, with the order's reference in the memo.
5️⃣ A zero-knowledge proof shows that payment happened, and the contract releases your cUSDC to the maker.
If no proof arrives in time, your cUSDC comes back to you.
Selling is the same in reverse: the maker locks cUSDC, you pay the ZEC, and the proof releases the cUSDC to you.
Why these pieces
Each piece does one job. Zcash keeps the payment private. Zama keeps the amounts encrypted and can still compute on them.
Seam, the Zcash light client I built last month, connects the two: a contract checks every Zcash block header itself, and a RISC Zero proof shows a shielded payment reached the right receiver.
The transaction, the note and the address never touch the EVM chain.
The masked amount
This was the hard part. Seam's proof used to write the paid amount in the clear, and ZEC amount × price gives away the dollar amount.
So the amount is masked. The contract adds an encrypted one-time mask to the encrypted amount and reveals only the sum, which looks random to everyone else.
The mask comes from a secret that the side receiving the ZEC hands to the payer. The proof checks that the payment was at least the sum minus the mask, and never states the amount.
One-time pads are old, and Zama's RFQ uses one too. Using one to hand a value from FHE to a ZK proof is the part I haven't seen before. If you have, please send it my way.
No vault, no signers
Seam can read Zcash, but it can't take ZEC from anyone. So the design never needs someone to pay ZEC on someone else's behalf. Whoever pays, pays from their own wallet, and the escrow on the EVM side enforces the deal. The side that paid the ZEC can prove it itself, so nobody depends on the other side's goodwill.
Seam does more than this
Any EVM app that needs to know a shielded payment happened can use Seam: pay-with-ZEC checkouts, escrows, payouts, cross-chain orders. This desk is one example.
Where it stands ↓
Testnet only, unaudited. On 12 November 2026 I ran a Buy end to end:
➡️ Settled with a proof:
➡️ One proof: 2 minutes on a rented RTX 4090, about $0.25 for the whole session
➡️ Gas per Buy on Sepolia: about 7.6M, in six transactions
➡️ A Sell also ran on Sepolia, up to the maker locking its cUSDC; it settles through the same proof step
➡️ Seam's light client is now deployed on Ethereum Sepolia too, next to Base Sepolia
Where it can go ↓
→ The desk only needs Zama's FHEVM and a cUSDC. Both already run on Polygon, where following Zcash costs a fraction of Ethereum mainnet.
→ Zama keeps adding chains. On any cheap EVM chain it reaches, the same desk can run, and if it comes to Base, Seam's relay already runs on Base Sepolia.
→ Zama's roadmap also goes beyond the EVM, to chains like Solana. Seam's verifier would need a port there.
→ On Ethereum mainnet, following Zcash header by header would cost over 2B gas a day, so batched header proofs are next for Seam.
What it can't do yet
- Settlement takes minutes, not seconds. Zcash confirmations set the pace, not the GPU.
- Right now I'm the only maker, and a maker needs ZEC, cUSDC and a GPU.
- Amounts are hidden, but EVM addresses are public.
Read more ↓
Seam on
Seam:
ZEC Desk: