Introduction to Zama
Zama confidential tokens follow the ERC-7984 standard on Ethereum mainnet. They work like ERC-20 tokens, except that transfer amounts and balances are encrypted onchain using Fully Homomorphic Encryption (FHE).
Utila supports all confidential tokens in Zama's token registry on Ethereum mainnet, such as cUSDC, cUSDT, and cWETH. Each confidential token wraps a standard ERC-20 token.
Activate a wallet for confidential tokens
Before Utila can show confidential balances or send confidential tokens from a wallet, you need to activate the wallet once. Activation creates a view key for the wallet: a read only key that lets Utila decrypt the wallet's balances and amounts through Zama's network.
Open the wallet. If the wallet holds a confidential token that is not yet activated, you see an indication on the token with an Activate option.
Click Activate and create the transaction.
Sign the activation from the Utila mobile app or using an API co-signer.
Activation transactions are approved automatically by policy. They have their own transaction subtype, so you can filter for them in the transactions list.
After activation, Utila refreshes your confidential balances whenever needed, with no further signing.
A single activation covers up to 10 tokens. If more confidential tokens are supported, Utila creates a bundle of activation messages for you to sign together. All tokens in a wallet share the same activation status and expiry date.
View key expiry and renewal
A view key is valid for 365 days. For each wallet, you can see which tokens are activated and when the activation expires.
When expiry is less than 30 days away, Utila shows a warning on the wallet.
To renew, activate the wallet again. You can also renew at any time, for example if you suspect the view key was exposed.
When Utila adds support for a new confidential token, you need to activate affected wallets again to include it.
If a view key expires, Utila keeps showing the last known balance as long as it has not changed. Once Utila detects a change, the balance is shown as unknown until you activate the wallet again.
Deposits received before activation. Utila detects incoming confidential transfers, but can only read their amounts after the wallet is activated.
Send confidential tokens
Confidential transfers work like any other token transfer in Utila.
Create a transfer and select the confidential token (for example, cUSDC) as the asset, or hover over the token in the wallet and click Transfer.
Enter the destination and amount. Utila shows the estimated gas fee before you sign.
Review, approve, and sign.
The amount and recipient are visible to approvers, and your transfer policies apply to the actual amount, as with standard ERC-20 transfers.
Transfer details include the source, destination, privacy status (Confidential), the amount Utila sent, the transaction hash, and the gas fee. The amount is not visible on the block explorer.
Transfers that fail onchain
If a confidential transfer exceeds the wallet's balance, the Zama token contract does not reject it. Instead, it transfers an amount of 0, and the block explorer shows the transaction as successful.
Utila detects this by decrypting the transferred amount and comparing it with the amount you requested. In this case, the transaction status changes to Mined (Failed) and then Failed.
Shield and unshield
Shielding converts a standard ERC-20 token into its confidential version (for example, USDC to cUSDC). Unshielding converts it back.
The amount you shield or unshield is always public onchain. Only transfers made while funds are in their confidential form keep amounts private.
Shield tokens
Open the wallet and hover over the standard token (for example, USDC).
Click Shield and enter the amount. Click Create transaction.
Review, approve, and sign.
Utila executes the token approval and the shield in a single transaction. In the transactions list, the shield appears with the type Shield, and the approval with the type Approve. If a wallet delegation is needed to complete the shield, Utila shows this in the transaction.
Unshield tokens
Unshielding takes two onchain transactions, with a decryption step by Zama's network between them.
Open the wallet and hover over the confidential token (for example, cUSDC).
Click Unshield and enter the amount. Click Create transaction.
Review, approve, and sign. This first transaction burns the confidential tokens and requests public decryption of the amount.
When the amount is decrypted, sign the second transaction to release the standard tokens to your wallet.
Both transactions appear with the type Unshield. Between the two steps, the unshield shows as pending in the console and API, so you can track its progress. The first transaction includes a request ID, which Utila stores and shows in the transaction details.
Decimals. Confidential tokens use 6 decimals. When you shield or unshield a token with more decimals (such as WETH), rounding and overflow behavior follows Zama's token contracts.
More information
Policies and address book. Confidential transfers are evaluated by your transfer policies against the actual amount, just like ERC-20 transfers. Shield and unshield transactions are evaluated as contract calls. Address book, allowlist, and blocklist behavior is unchanged.
AML/KYT screening. Screening runs against the actual transfer amount, as with standard transfers.
View key security. A view key can only read balances and amounts. It cannot move funds. Your wallet's MPC key shares are completely separate, and all transfers still require MPC signing and your approval workflow.
Backup and recovery. View keys are not part of your wallet backup. After recovery, activate your wallets again to create a new view key. Your funds are covered by Utila's standard disaster recovery process.
Networks. Confidential token support is available on Ethereum mainnet.