Privacy that regulators can live with.
A USDC privacy pool where you can only withdraw if you prove you're on the compliance allowlist — private for honest users, locked for sanctioned addresses.
withdraw(proof, nullifier, recipient)
→ compliant → fresh wallet ✓
→ sanctioned → locked out ✗
Stellar Hacks: Real-World ZK · DoraHacks
Mixers are uncompliant
Tornado-style pools let sanctioned actors mix funds → global blacklists. The whole tool becomes radioactive and taints every user.
So institutions can't use privacy
Regulated firms are forced onto transparent rails, leaking payroll and treasury flows to anyone with a block explorer.
Shroud implements the SDF's recommended Association Set Provider (ASP) gateway. Every withdrawal proves allowlist membership — in zero knowledge.
Gated
sanctioned addresses locked out
Private
withdraw to a fresh wallet
Owner-bound
EdDSA stops note theft
Gasless
relayer paid on-chain
$ npm run prove:demo
1. ASP updates compliance root (ASPRegistry)
2. deposit 100 USDC + commitment (ShroudPool)
3. allowlist path → Groth16 proof + EdDSA(nullifier)
4. relayer submits proof + nullifier + recipient
5. verify root active → BN254 pairing on-chain
compliant → payout to fresh wallet ✓
non-compliant / tampered → rejected ✗
Compliance root checked against the live ASP registry on-chain. Hosted app = UX sandbox; load-bearing ZK = prove:demo + deployed contracts.
ZK Circuit
Circom/Groth16 bn128 · deposit + compliance Merkle membership + nullifier + EdDSA over nullifier · nPublic = 6
Pool
bn254().pairing_check() (P25/26) · compliance_root bound to live ASPRegistry.get_root · nullifier map · real relayer fee transfer
Registry
require_auth() gates root rotation to the authorized ASP admin
App
Next.js 16 / React 19 / Supabase · deposit events build paths dynamically
A stale or forged allowlist can't pass — the contract checks the proof's root against the registry's current root. EdDSA stops a stolen note from being drained.
Institutional DeFi
tokenized assets moving on-chain — transparent ledgers are a non-starter for payroll & treasury.
OFAC reality
sanctions proved uncompliant privacy is a dead end. The market needs a compliance gate baked in.
SDF-aligned
ASP is the SDF's own recommended pattern — Shroud ships it.
Relayer fees — basis points on each gasless withdrawal fund relayer + protocol.
ASP-as-a-Service — compliance providers run allowlists; Shroud licenses the gateway.
Enterprise privacy SDK — neobanks & payroll apps embed the pool for confidential payouts.
Cost moat — sub-cent verification → private withdrawals cheap enough for payroll volumes.
| Transparent rails | Tornado mixer | Shroud | |
|---|---|---|---|
| Privacy | ❌ | ✅ | ✅ |
| Sanctions-safe | ✅ | ❌ blacklisted | ✅ allowlist-gated |
| Institution-usable | ⚠️ | ❌ | ✅ |
| Note-theft resistant | n/a | ⚠️ | ✅ EdDSA |
| On-chain compliance binding | n/a | ❌ | ✅ live ASP root |
✅ Verifies on testnet
Real Groth16 withdrawal proof accepted on-chain — npm run prove:demo.
✅ Compliance enforced
withdraw checks proof root vs live ASP registry; nullifiers block double-spend; relayer fee is a real transfer.
✅ Owner binding hardened
In-circuit EdDSA over the nullifier (public inputs 4 → 6).
✅ Engineering rigor
Cargo tests green (2 withdraw paths), 100 unit tests, 6-stage CI.
30 DAYS
Redeploy BN254 + EdDSA contracts; stellar.expert verified; live compliant-withdrawal demo.
60 DAYS
Decentralize ASP to multi-sig committee; in-browser proving; root-rotation grace windows.
90 DAYS
Variable denominations, multi-asset pools, first neobank/payroll design partner.
Edy Cu
full-stack + applied-ZK engineer
Solo-built the Circom withdrawal circuit (Merkle membership + nullifier + EdDSA), the Rust/Soroban pool & ASP registry, the gasless relayer flow, and the Next.js app + SDK. One of five real on-chain ZK products shipped for this hackathon.
Shroud makes privacy conditional on compliance — the only design institutions can legally adopt, built on the SDF's own recommended ASP pattern.