Skip to main content
Do not hardcode addresses in your app; read them from the SDK. All bundled addresses come from one generated package, @opaquecash/deployments, which the chain repos emit from their canonical deployment records: A redeploy is therefore a regenerate + rebuild, never a code change. Higher SDK packages (@opaquecash/opaque, uab, stealth-chain-solana, stealth-chain-starknet, psr-chain, psr-chain-starknet) and the reference app all source their addresses from it.

Reading addresses

Most apps use the convenience getters re-exported from @opaquecash/opaque:
Or read the registry directly (string ids, zero dependencies):
Override any address per client via OpaqueClient.create({ contracts: { ... } }).

Ethereum Sepolia (chainId: 11155111)

Default tracked tokens: native ETH plus testnet USDC (0x73197e8303904862d543f9706E8422F634D713cb) and USDT (0x6Ff8Afb2aA9eB5A89Ce86c44DD460bD17C92f644). UAB deployment details (Wormhole chain ids, fromBlock): getUabDeployment(11155111) from @opaquecash/opaque.

Solana devnet

Starknet Sepolia (chain id 0x534e)

Testnet preview — see Starknet. The StealthAccount class hash is a consensus-critical constant: every Starknet stealth address is a counterfactual deployment of this exact class.

Supported chain IDs

This enumerates EVM chain ids only. The non-EVM chains are read through their own getters — getSolanaDeployment("devnet") and getStarknetDeployment("sepolia") — and do not appear in this list. Mainnet addresses will land in the same registry when they deploy: the chain repos run npm run generate against the mainnet records, and every consumer picks them up on rebuild.