Test tokens, minted on demand
Mint value-less TTT and confidential CTTT on Sepolia to exercise the FHE products — without hand-sourcing test tokens.
Where to start
Point a public client at Sepolia, create the faucet client, and mint TTT (plaintext) and CTTT (backed confidential). No encryptor, no @zama-fhe dependency — mints take a plain bigint amount.
The vanilla TS client: mintUnderlying, mintConfidential, balance reads, and metadata. Use it from Node, workers, or tests where there are no React hooks.
Every client method ships as a wagmi + TanStack Query hook — nine read queries plus useMintUnderlying and useMintConfidential. All plaintext: no encryptor wiring for either mint.
The shape of the testnet faucet
Testnet only — Sepolia + local Anvil
The faucet ships for chain 11155111 (Sepolia) and 31337 (local Anvil) only — mainnet is intentionally omitted, with no mainnet addresses to resolve. assertTestnetFaucetChain throws UnsupportedChainError off those chains. These are value-less test tokens; nothing here mints anything redeemable.
Two tokens: plain TTT, confidential CTTT
TTT (TokenopsTestToken) is a plain 18-decimal ERC-20 with an open mint. CTTT (ConfidentialTokenopsTestToken) is a 6-decimal ERC-7984 confidential wrapper behind a UUPS proxy, with an open backed mint — minting CTTT mints the underlying TTT to back it 1:1. Mind the decimal mismatch: 18 for TTT, 6 for CTTT.
Open mint — no roles, no pause
Both faucets are open: anyone can mint to any address. There is no RBAC, no pausing, and no admin gate, so none of the role or pause error paths apply. The one ceiling is maxTotalSupply on CTTT, which surfaces as FaucetSupplyExhaustedError.
Plaintext in, encrypted handle out
Mints take a public plaintext bigint amount — there is no encryptor and no @zama-fhe dependency on the mint path. Reading a confidential balance returns an encrypted euint64 handle (Hex), not a number; decrypting it is a separate, opt-in FHE concern. underlyingBalanceOf returns a plain bigint.
Reference
The lookup layer. Every exported type, error class, event, and ABI lives in a dedicated table — copy-paste-ready, no MDX prose between you and the import.