Prove you're solvent. Reveal nothing.
A real-time zero-knowledge oracle that proves a Stellar issuer's reserves ≥ liabilities on-chain — leaking no customer balance and no true total.
attest_reserves(proof, root, L, R, ax, ay)
→ valid proof ✓ true
→ tampered ✗ false
Stellar Hacks: Real-World ZK · DoraHacks
Privacy leakage
Standard PoR unmasks individual customer balances and the issuer's exact total assets to competitors.
Retrospective
Audits are a quarter-old snapshot, signed by an accounting firm you also have to trust.
No live signal
By publication, the reserves an attestation describes may already be gone. One rumor → a run.
Crisp encodes the whole liability book as a ZK Merkle-Sum Tree and proves one statement on-chain: "liabilities sum to L, reserves R ≥ L, and I signed this" — revealing no balance and no exact figure.
Real-time
scrape → prove → attest
Zero leakage
balances salted & blinded
Issuer-bound
in-circuit EdDSA signature
Inclusion
holder verifies in <1s
$ npm run prove:demo
1. Connect Freighter → Issuer Dashboard
2. Scrape holder balances (Horizon)
3. Merkle-Sum Tree + Groth16 + EdDSA(root)
4. attest_reserves(...) → BN254 pairing on-chain
valid proof → true ✓
tampered input → false ✗ (negative control)
5. Customer salt → local inclusion check <1s
Honest status: the hosted web app is a demo sandbox for UX; the load-bearing ZK is prove:demo + the deployed contract.
ZK Circuit
Circom/Groth16 over bn128 · Merkle-Sum + Poseidon + EdDSA-Poseidon · ~30k constraints · nPublic = 5
Verifier
Rust/Soroban 26 · env.crypto().bn254().pairing_check() runs full Groth16 on-chain (Protocol 25/26) · g1_mul/g1_add MSM
Indexer
Stellar Horizon · native balance/trustline scraping, no custom node
App
Next.js 16 / React 19 / Supabase · roots indexed from on-chain events
A raw-WASM pairing check would exhaust Soroban's CPU budget — Crisp leans on the native host functions exactly where it counts.
$200B+
stablecoin market cap — every dollar a liability someone must prove is backed.
MiCA
+ US frameworks + exchange PoR mandates force recurring attestation.
10×
better than the audits issuers already pay for — faster, private, continuous.
Attestation-as-a-Service — SaaS per attestation cadence (hourly/daily/on-demand).
"Crisp Verified ✓" SDK — wallets, exchanges & aggregators embed the badge. Freemium → enterprise.
Compliance data layer — historical solvency roots for auditors & regulators (premium analytics).
Cost moat — sub-cent Soroban verification → attest continuously at a price legacy auditors can't touch.
| Big-4 audit | On-chain Merkle PoR | Crisp | |
|---|---|---|---|
| Real-time | ❌ | ⚠️ | ✅ |
| Privacy | ⚠️ NDA | ❌ | ✅ |
| Trustless | ❌ | ✅ | ✅ |
| Issuer-bound | PDF sig | ❌ anyone posts | ✅ in-circuit EdDSA |
| Cost / attestation | $$$$ | gas | sub-cent |
Most ZK PoR demos let anyone post a root. Crisp's BabyJubjub EdDSA binds the proof to the issuer's key.
✅ Verifies on testnet
Real Groth16 proof accepted on-chain — reproduce with npm run prove:demo.
✅ Negative control
Tampered inputs rejected on-chain — verification is real, not theater.
✅ Hardened circuit
Added in-circuit EdDSA identity binding: 21,908 → ~30,000 constraints.
✅ Measured cost
Pairing check ≈ 22.4M CPU (~22% budget), ~120KB mem; G1 op ≈ 14,488 CPU.
30 DAYS
Redeploy BN254 + EdDSA contract; stellar.expert verified + live attestation explorer.
60 DAYS
In-browser proving (snarkjs WASM), multi-asset reserve baskets, distributed scrapers.
90 DAYS
Multi-issuer registry + regulator read-API; first design-partner issuer; badge SDK.
Edy Cu
full-stack + applied-ZK engineer
Solo-built the entire stack — Circom circuits (Merkle-Sum + Poseidon + EdDSA), the Rust/Soroban verifier, the Horizon scraper, and the Next.js dashboard. One of five real on-chain ZK products shipped for this hackathon.
Crisp makes solvency a continuous, private, on-chain fact — the missing primitive for every regulated issuer on Stellar.