What we built
Cipherproof is a confidential wallet dApp It runs a USDC-style token (cUSDC, OpenZeppelin ERC-7984) on Ethereum Sepolia where every balance lives on-chain as an FHE ciphertext (euint64), not a number.
The problem. On a normal chain, every ERC-20 balance and every transfer amount is public, forever. Anyone can look up what you hold, what you were paid, and who pays you your salary, your treasury, your counterparties. Existing “privacy” answers (mixers, off-chain ledgers, sidechains) either break composability with public Ethereum, carry regulatory stigma, or just move the trust problem somewhere else. And even amount-hiding schemes usually still leak the social graph: observers can cluster all payments arriving at your address.
The solution. Cipherproof keeps confidentiality at the protocol level while settling on public Ethereum:
- Encrypted balances and transfers → amounts are encrypted in the browser (with a ZK input proof) before touching the chain; the FHEVM coprocessor does the arithmetic on ciphertext. A transfer shows who, never how much.
- Gasless self-reveal you decrypt only your own balance by signing a time-boxed EIP-712 “viewer permit.” No gas, no transaction, and the FHE ACL means nobody else can decrypt your handle not the relayer, not us.
- Stealth addresses + sponsored spending → this is where we go beyond amount privacy. Recipients share one stable st:eth:… meta-address; every payment derives a fresh one-time stealth EOA (ERC-5564), so observers can’t cluster what you receive. Spending from a stealth address is gas-sponsored via an EIP-7702 relayer, so the sender’s main wallet never appears on the forward hop. In short: the ledger hides the amount (FHE) and degrades the who-pays-whom graph (stealth + relayer).
NOTE:
`Cipherproof runs on the same confidential-token foundation as Zama’s own wallet (app.zama.org). In both, your balance lives on Ethereum as an FHE ciphertext (an encrypted euint64 under the ERC-7984 standard), the chain computes transfers directly on that ciphertext without ever decrypting it, and you reveal your own balance by signing a gasless, time-limited viewer permit that decrypts it only in your browser nobody else, including the apps themselves, can read it. That shared foundation answers the first privacy question: how much? On-chain, every amount is invisible.
But it only answers half the question. Even with every number encrypted, the ledger still records which address paid which address. An observer who knows your address can’t see your balance but they can still see every counterparty you’ve ever touched: who pays you, how often, and when. Your payment graph the who, if not the how much remains public, and address clustering turns that graph into an identity.
Cipherproof closes that second half. Instead of publishing your wallet address to get paid, you share one stable meta-address (st:eth:…). For every payment, the sender’s browser derives from it a brand-new one-time stealth address (ERC-5564) a fresh 0x… account that has never appeared on-chain and that only you can compute the private key for, locally, from your own wallet keys. A hundred payments to you land on a hundred unrelated-looking addresses; nothing on-chain links them to each other or to you. And when you later spend from a stealth address, the gas is sponsored via an EIP-7702 relayer, so the transaction executes as the stealth account itself your main wallet never appears on that hop and never has to fund those addresses (which would re-link them).
So what an observer actually sees per payment: two addresses they can’t cluster, an encrypted amount they can’t read, and a gas payer that isn’t you. What you see: your real balance, decrypted on demand with a signature, with keys that never leave your wallet and funds that never touch a custodian.
The Zama App hides how much. Cipherproof also hides to whom and keeps from whom off the forward hop. Same vision, one layer deeper.`
product: https://cipherproof.vercel.app