╔═══════════════════════════════════════╗ ║ O P A Q U E ║ ╚═══════════════════════════════════════╝
Private payments & proof-backed reputation on Ethereum
Website · GitHub · SDK · Docs · Playground · PSR Verifier Demo · Demo
Opaque is an open protocol for unlinkable receive addresses and optional reputation you can prove without doxxing your wallet. Think of it as: every payment can land at a fresh address only you control, while still letting apps verify things like “this person passed KYC” or “this account is in good standing”—using zero-knowledge proofs when you opt into that layer.
No single product owns the stack: there is a reference wallet at opaque.cash, a TypeScript SDK for builders, developer docs (guides + API reference + playground), and on-chain contracts you can read and deploy yourself.
Heads-up: This is experimental software. Stealth cryptography and local-only data paths have real trade-offs—read DISCLAIMER.md before relying on it for anything serious.
| Stealth payments (EIP-5564) | Recipients share a meta-address (not a single static deposit address). Senders derive a one-time address per transfer so observers cannot trivially link your incoming flow on-chain. |
| Registry | Optionally map your normal Ethereum address to your meta-address so people can pay you by 0x… without pasting a long key—resolution is public; the unlinkability is in how funds are received. |
| Announcer | Senders emit a compact announcement on-chain so the right recipient can discover which stealth outputs are theirs (with view tags so scanning stays practical). |
| Manual “ghost” receives | The app can also generate one-time addresses without an on-chain announcement; those rely on local storage on the device—flexible, but not recoverable from chain state alone. |
| PSR — private reputation | When you need it, attestation metadata can ride alongside announcements. The recipient can discover traits from their announcements, then build Groth16 proofs scoped to an action and verify against on-chain roots—showing that you qualify without exposing who you are to everyone. |
Under the hood, heavy lifting uses Rust → WebAssembly for scanning and crypto, viem-friendly ABIs for contracts, and hosted circuit artifacts on opaque.cash for proof generation when you don’t self-host.
The @opaquecash/opaque package is the unified client: configure chain + RPC + wallet signature + WASM, pass indexer-shaped announcements, and get calldata for register/announce flows, owned outputs, balances by token, and PSR traits—without forcing a specific indexer or UI.
cd sdk && npm install && npm run buildPoint your app at the published WASM entry (or your own build):
https://www.opaque.cash/pkg/cryptography.js
Full API surface, types, and lower-level packages (@opaquecash/stealth-*, @opaquecash/psr-*) live in sdk/packages/opaque/README.md.
The docs/ app is a Vite + React site: quick start, configuration, indexer integration, send/receive guides, PSR flows, API reference, and a playground.
cd docs && npm install && npm run devUse it alongside the SDK README when you’re wiring Graph-style announcement rows, reputation proofs, or custom deployments.
| Path | What you’ll find |
|---|---|
frontend/ |
Reference wallet UI (balances, send, receive, private balance) |
sdk/ |
@opaquecash/opaque and modular stealth + PSR packages |
docs/ |
Developer documentation site |
infra/ |
Hardhat contracts, deploy scripts |
scanner/ |
Rust WASM core; see scanner/WASM_BUILD.md |
| StealthMetaAddressRegistry | 0x77425e04163d608B876c7f50E34A378624A12067 |
| StealthAddressAnnouncer | 0x840f72249A8bF6F10b0eB64412E315efBD730865 |
| Groth16Verifier | 0x78A169b6E308Fd5BfAfc728f216CdB06EcEdde06 |
| OpaqueReputationVerifier | 0x30B750Ae9851e104F8dbB4B8082b1a07a34885B0 |
Issues and PRs are welcome—whether you’re fixing a doc typo, improving the SDK ergonomics, or integrating Opaque into something new.
Support: hello@collinsadi.xyz
MIT License · Built in public · opaque.cash