Test tokens
Every tradeable asset comes as a pair of contracts:
- an underlying ERC-20 (a permissionless mock you can mint freely), and
- a confidential ERC-7984 wrapper (the
c-prefixed token, e.g.cUSDC, that the swap protocol actually trades).
To get a balance you can swap, you mint the underlying, approve the wrapper to spend it, then wrap it into the confidential token. Pick whichever path fits you below. Both need a little Sepolia ETH for gas.
This is the testnet flow, where the underlying is a mintable mock. On mainnet you wrap the real asset you already hold, so there's nothing to mint; the approve + wrap steps are the same.
You'll need the addresses for the token you want. Find every underlying/confidential pair on Addresses.
The quick way: the faucet
The app ships a Faucet page that does all three steps for you: pick
the tokens you want and it mints the underlying, wraps it, and credits your
confidential balance — 1,000,000 of each selected token, in a single
transaction (via the ConfidentialFaucet contract, listed on
Addresses). Only tokens that are part of an active trading
pair are offered. You still need a little Sepolia ETH for gas.
The manual paths below do exactly the same thing step by step — useful when you're integrating from code or want a custom amount.
Option A: from code
The underlying mock's mint is permissionless, so any funded account can run the
three calls. With viem / ethers and the addresses from
Addresses:
const amount = 1_000_000_000n; // 1,000 USDC at 6 decimals (use the token's base units)
// 1. Mint the underlying ERC-20 to yourself
await underlying.write.mint([account, amount]);
// 2. Approve the confidential wrapper to pull it
await underlying.write.approve([confidentialToken, amount]);
// 3. Wrap into the confidential token
await confidential.write.wrap([account, amount]);Option B: block explorer
You can do the same three calls by hand from the contract pages on the explorer (eth-sepolia.blockscout.com, Etherscan also works). Grab the two addresses for your token from Addresses first.
- Mint the underlying. Open the underlying ERC-20 contract →
Write →
mint:account= your addressamount= raw amount in base units (multiply by the token's decimals, e.g. 1,000 USDC at 6 decimals =1000000000)
- Approve the wrapper. Same underlying contract → Write →
approve:spender= the confidential (c-) token addressvalue= the same raw amount
- Wrap. Open the confidential (c-) token contract → Write →
wrap:to= your addressamount= the same raw amount
After wrapping, your confidential balance is ready. Note the wrapper caps confidential precision at 6 decimals: an underlying with more than 6 decimals is scaled down on wrap (and dust below the rate is refunded), while one with 6 or fewer keeps its own decimals.
See it in the app
Head to the Swap page. The first time you trade a token the app runs a one-off initialize balance step (and an operator approval), after which your confidential balance appears and you can swap. See Protocol flow for what happens on-chain, or the Integration quickstart to build against the contract directly.