Confidential Wrapper Registry — a usable frontend for the official Zama Wrappers Registry

Count how many throwaway ERC-20 test tokens you’ve deployed. Now count the wrappers you wrote to go with them. Every one of those already existed in the official registry, sitting onchain, addressable, waiting. We all skipped it. Not because it’s bad, but because it’s a contract with no face. There’s nothing to click.

(add one forward slash (/) to the https)

Live: [https:/confidential-wrapper-registry-eta.vercel.app]
Code: [https:/github.com/DannyTrillion/confidential-wrapper-registry\]
Video: [https:/youtu.be/OnBjKfobFQQ\]

What it does:

  • Lists every ERC-20 ↔ ERC-7984 pair in the official registry, across both Sepolia and Ethereum mainnet, with one toggle between networks
  • Wraps any valid pair. Approve, deposit, done, with the allowance handled for you and no hardcoded decimals
  • Unwraps in the other direction, including the async decryption step, with the UI telling you in plain words what’s happening at each stage
  • Reveals your confidential balance through the EIP-712 user-decrypt flow. Sign once per session, not once per token
  • Hands out cTokenMocks from a Sepolia faucet, so you have something to test with in about ten seconds
  • Shows revoked pairs instead of hiding them, marked clearly, and blocks wrapping into them - Picks up newly registered pairs automatically, because the list is read from the registry at runtime and nothing is hardcoded in my repo The part I care about most is the reveal.

Your ERC-7984 balance shows up as redacted dots, because that’s what it actually is: a handle, not a number. Then you sign once, and the ciphertext dissolves into the real figure. It’s the only moment in the app I let myself have fun with, and honestly it’s the moment that made FHE click for me in a way reading the docs never did. One choice you might disagree with. Revoked pairs stay on screen because revocation sets isValid = false, it doesn’t delete the mapping, and the registry keeps that history on purpose. Hiding it would be me deciding you don’t need to know. Next.js, wagmi/viem, @zama-fhe/relayer-sdk, OpenZeppelin confidential contracts.

Two things I want to be told I’m wrong about: Uninitialized balances come back as bytes32(0) and the relayer rejects them.

I catch it client-side and render “no balance yet” instead of letting it fail. Is that what everyone does, or is there a cleaner convention I’ve missed? And the reveal animation. I made it the centrepiece.

Tell me if that reads as useful or as noise, because I genuinely can’t tell anymore after staring at it this long.

Hey @Dannytrillion thanks for submitting your Confidential Wrapper Registry to the Bounty Track! We’ve received it and judging is currently ongoing.

Let me know if you have any questions in the meantime. Happy to help.

Best,
Jan