Table of Contents
ERC-7984 is the draft Ethereum standard for confidential fungible tokens: balances and transfer amounts are stored as encrypted pointers instead of plain numbers, while sender and recipient addresses stay public. Wrapped around a stablecoin such as USDC, it produces a "confidential stablecoin" that moves on Ethereum without exposing how much anyone holds or sends.
The standard moved from spec to retail product on 9 November 2026, when Zama spin-off Raycash opened a private beta on Ethereum mainnet that wraps USDC 1:1 into ERC-7984 tokens, according to The Block. The underlying specification, ERC-7984: Confidential Fungible Token, was created on 3 July 2025 and is still marked Draft.
This post covers what ERC-7984 is, how wrapping, transferring and unwrapping work, what stays private and what does not, how issuer freezes still apply, and what to check before you use one.
Last updated: 10 November 2026. Specifications, documentation and supply data re-checked against primary sources on this date.
Key Takeaways
- ERC-7984 is a draft Ethereum token standard in which every balance and amount is a
bytes32pointer to encrypted data, per the EIP text. - It is technology agnostic: the spec names fully homomorphic encryption (FHE), zero-knowledge proofs and secure enclaves as valid back ends; Zama's implementation uses FHE.
- Existing stablecoins become confidential through a wrapper: Zama's confidential wrapper locks the ERC-20 and mints an encrypted balance, capped at 6 decimals.
- Addresses, wrap amounts and final unwrap amounts remain public; balances and transfer amounts between wrapping and unwrapping do not.
- Compliance hooks survive: Zama's wrapper enforces both its own denylist and the underlying token's blocklist, and can name "observers" who can decrypt every balance.
- Ethereum held $133.8 billion of the $289.6 billion USD-pegged stablecoin supply tracked by DefiLlama on 10 November 2026, all of it readable by anyone.
What is ERC-7984?
ERC-7984 is a token interface for "confidential fungible tokens" that use an account-based model like ERC-20 but keep transfer amounts and balances confidential. The specification replaces every plaintext uint256 amount with a bytes32 pointer, so confidentialBalanceOf() and confidentialTotalSupply() return a handle to encrypted data rather than a number.
The pointer design is deliberate. The authors write that using bytes32 lets implementations built on FHE, zero-knowledge proofs, secure enclaves "or future technologies" comply with the same interface. Compliant tokens must signal support through ERC-165 with interface ID 0x4958f2a4. Discussion of the draft runs on Ethereum Magicians.
OpenZeppelin's documentation is blunt about one point: ERC-7984 is inspired by ERC-20 but "is not ERC-20 compliant". Wallets, exchanges and DeFi protocols have to integrate it on purpose; a confidential USDC balance will not appear in an app that only reads balanceOf().
How does ERC-7984 work?
ERC-7984 works by moving encrypted handles between accounts and letting a separate cryptographic system compute on them. In Zama's design, the token contract adds and subtracts ciphertexts with its FHE library, and an access control list (ACL) decides which addresses may decrypt each value, as described in the Zama confidential wrapper documentation.

Four mechanics matter for a stablecoin holder:
- Encrypted inputs. To send a new amount, the wallet encrypts it client-side and attaches an
inputProofshowing the sender knows the value, per OpenZeppelin. - Time-limited operators. Instead of ERC-20 allowances, a holder calls
setOperator(operator, until). The operator can move any amount until the timestamp expires, so the spec trades granular allowances for expiry. - Silent failure. A confidential transfer that exceeds the balance does not have to revert; the function returns the amount actually transferred as another encrypted handle, because a revert would leak that the balance was too low.
- Optional disclosure. The standard defines an
AmountDisclosedevent for when an encrypted amount is deliberately made public, and Zama's wrapper exposesrequestDiscloseEncryptedAmountfor it.
How is ERC-7984 different from ERC-20?
ERC-7984 is different from ERC-20 in what it reveals and how it delegates spending, not in what the token represents. The table compares the two interfaces using the ERC-20 and ERC-7984 texts; each row links to the source.
| Feature | ERC-20 (e.g. USDC) | ERC-7984 confidential token |
|---|---|---|
| Balance query | balanceOf() returns a public number (EIP-20) | confidentialBalanceOf() returns an encrypted bytes32 handle (EIP-7984) |
| Transfer event | Transfer logs from, to and the plaintext value | ConfidentialTransfer logs from, to and an encrypted amount pointer |
| Total supply | Public totalSupply() | confidentialTotalSupply() is encrypted |
| Spending delegation | Amount-based approve() allowance | Time-limited operator with no amount cap (OpenZeppelin) |
| Wallet and DeFi support | Universal | Must be integrated explicitly; not ERC-20 compliant |
Two patterns stand out. First, ERC-7984 hides amounts, not identities: the counterparty graph is as public as ever. Second, the operator model is riskier than a capped allowance; OpenZeppelin warns that setting an operator "for any amount of time allows the operator to take all of your tokens".
What stays private and what stays public in a confidential stablecoin?
What stays private in a confidential stablecoin is the balance of each holder and the amount of each transfer while tokens are wrapped; what stays public is every address, the amount entering the wrapper and the amount leaving it. The table below is built from the events and view functions listed in Zama's wrapper documentation.
| Data point | Public? | Why |
|---|---|---|
| Sender and recipient addresses | Public | Indexed in the ConfidentialTransfer event |
| Transfer amount | Hidden | Stored as an encrypted euint64 handle |
| Holder balance | Hidden | Readable only by addresses the ACL allows, including approved observers |
| Amount wrapped | Public | Wrap event logs roundedAmount in cleartext, and the ERC-20 transfer into the wrapper is visible |
| Amount unwrapped | Public | UnwrapFinalized logs cleartextAmount after public decryption |
| Total value shielded | Public (approximate) | inferredTotalSupply() reads the underlying ERC-20 held by the wrapper |
The practical lesson: privacy is strongest when funds stay wrapped and move several times. Someone who wraps exactly 4,250 USDC and unwraps exactly 4,250 USDC a day later to a linked address has revealed most of what matters.
How do you wrap USDC into a confidential token, step by step?
You wrap USDC into a confidential token by depositing it into a verified wrapper contract, which mints the same amount as an encrypted balance. Based on the Zama wrapper docs and unshield guide, the flow is:
- Find the verified wrapper. Zama keeps an on-chain registry that maps each ERC-20 to its confidential wrapper; check it before sending funds to any contract that claims to be cUSDC.
- Wrap. If the token supports ERC-1363, one
transferAndCallto the wrapper mints the confidential balance. Otherwise approve the wrapper and callwrap(to, amount). USDC and USDT use 6 decimals, so they map 1:1. - Transfer confidentially. Your wallet encrypts the amount, attaches an input proof and calls
confidentialTransfer. PreferconfidentialTransferAndCallwhen paying a contract instead of granting a standing operator. - Read your own balance. Only addresses with ACL permission can decrypt a handle, so your wallet reads your balance through Zama's SDK while everyone else sees ciphertext.
- Unwrap in two transactions.
unwrapburns the encrypted amount and emits a request ID; after the network publicly decrypts the amount,finalizeUnwrapreleases the USDC. Zama's SDK bundles both throughunshield()and notes the proof wait "can take several seconds".
Why does stablecoin privacy matter on Ethereum?
Stablecoin privacy matters on Ethereum because Ethereum carries the largest stablecoin float of any network and every ERC-20 balance on it is public. DefiLlama's stablecoin chain data showed $133.8 billion of USD-pegged stablecoins on Ethereum on 10 November 2026, 46.2% of the $289.6 billion tracked, ahead of Tron at $93.6 billion.

For a business, a public balance is a public treasury report. Payroll amounts, supplier terms and runway can be read by anyone who links one address to the company. The ERC-7984 motivation section names payroll, confidential DeFi and institutional settlement as target use cases for exactly that reason.
Demand is already measurable. Zama's first confidential USDC yield vault, launched in June with Morpho and Steakhouse Financial, went from zero to $40 million in total value locked within seven weeks, and Zama expanded to 16 confidential vaults on 15 September, The Block reported. Raycash said more than 75,000 people joined its waitlist before launch.
Can confidential stablecoins still be frozen?
Confidential stablecoins can still be frozen in most designs, because the wrapper holds real USDC or USDT that the issuer controls. Zama's wrapper checks its own denylist and the underlying token's blocklist (for example USDT's getBlackListStatus) on every wrap, transfer, unwrap and finalizeUnwrap, per its documentation and source code.
The same docs list two deeper dependencies. USDC and USDT are pausable, so wraps and unwraps revert during a pause, and the wrapper contract address itself "may be blocked, preventing all wrap and unwrap operations". A confidential layer cannot outrun the issuer of the collateral beneath it.
That matters legally. The GENIUS Act (Public Law 119-27) requires permitted issuers to keep "technical capabilities, policies, and procedures to block, freeze, and reject specific or impermissible transactions", and defines a lawful order as one that "requires a person to seize, freeze, burn, or prevent the transfer of payment stablecoins". Raycash told The Block its confidential tokens have no freeze or seize functions "at the token layer"; that describes the wrapper, not the USDC it holds.
Zama's wrapper also supports observers: addresses the wrapper owner authorises to decrypt the balance of every holder, the total supply and every transfer amount. The docs state the authorisation "has no expiration" until revoked, and the observer list is public. Ownership starts with the Zama Protocol DAO and is meant to pass to the underlying token's owner, so for cUSDC the auditor-of-record could eventually be the issuer side.
What should you check before using a confidential stablecoin?
You should check the wrapper, its controls and your exit path before using a confidential stablecoin. The checklist below draws on the Zama wrapper docs and OpenZeppelin's token guide.
| Check | Why it matters | Where to look |
|---|---|---|
| Wrapper is the registered one | A fake wrapper can mint worthless ciphertext | Zama wrapper registry |
| Who owns and can upgrade it | The wrapper is UUPS-upgradeable by its owner | owner() on the contract |
| Observer list | Observers can decrypt every balance with no expiry | observers() view function |
| Denylist status of your address | Blocked addresses cannot wrap, move or unwrap | isBlocked(user) |
| Operator approvals you granted | Operators can move all tokens until expiry | isOperator(holder, spender) |
| Wallet and app support | ERC-7984 is not ERC-20 compliant | Wallet or app documentation |
Related reading on stablecoin privacy and freezes:
Comparing privacy designs? See how Circle's ZK-based approach differs in our Aleo USDCx explainer, and what issuer freezes did in practice in our Binance hack analysis.
Related hub: see our Stablecoin Payments and Cards Hub for every guide on paying, receiving and holding stablecoins.
FAQ
Is ERC-7984 a final Ethereum standard?
Is ERC-7984 compatible with ERC-20?
Does ERC-7984 hide who sent a payment?
What is a confidential stablecoin?
Can Circle or Tether freeze a confidential stablecoin?
Who can see my confidential balance?
Why is the confidential token limited to 6 decimals?
Sources: ERC-7984 specification, ERC-20 specification, Ethereum Magicians discussion, OpenZeppelin Confidential Contracts docs, Zama confidential wrapper docs, Zama SDK unshield guide, ConfidentialWrapper.sol, GENIUS Act, Public Law 119-27, DefiLlama stablecoin chains API and The Block on Raycash, all read on 10 November 2026.
This content is provided for informational and educational purposes only and doesn't constitute financial, investment, legal or tax advice. Figures and documentation were read on 10 November 2026 and may change. Companies and assets mentioned include Zama, Raycash, OpenZeppelin, Circle (USDC), Tether (USDT), Morpho and Steakhouse Financial. Do your own research before using any protocol.