> ## Documentation Index
> Fetch the complete documentation index at: https://docs.opaque.cash/llms.txt
> Use this file to discover all available pages before exploring further.

# Testnet deployments

> The generated @opaquecash/deployments registry and the bundled addresses.

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:

| Source of truth                                         | Generator                                             | Output                                        |
| ------------------------------------------------------- | ----------------------------------------------------- | --------------------------------------------- |
| `ethereum/infra/deployments/*.json` + hardhat artifacts | `npm run generate` in `ethereum/infra`                | EVM addresses + contract ABIs                 |
| `solana/Anchor.toml` program tables                     | `npm run generate` in `solana`                        | Program ids + Wormhole core per cluster       |
| `starknet/deployments/*.json`                           | `node scripts/generate-deployments.mjs` in `starknet` | Starknet addresses + class hashes per network |

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`:

```ts theme={"dark"}
import { getChainDeployment, getSolanaDeployment } from "@opaquecash/opaque";

const evm = getChainDeployment(11155111);   // registry, announcer, verifier, tokens
const sol = getSolanaDeployment("devnet");  // program ids as PublicKey
```

Or read the registry directly (string ids, zero dependencies):

```ts theme={"dark"}
import {
  requireEvmDeployment,
  requireSolanaProgramIds,
  stealthAddressAnnouncerAbi,   // generated ABIs ship here too
} from "@opaquecash/deployments";

const evm = requireEvmDeployment(11155111);
// evm.contracts.{stealthMetaAddressRegistry, uabSender, ...}, evm.wormhole, evm.tokens

const sol = requireSolanaProgramIds("devnet");
// sol.{stealthRegistry, stealthAnnouncer, uabReceiver, wormholeCore, ...}
```

Override any address per client via `OpaqueClient.create({ contracts: { ... } })`.

## Ethereum Sepolia (`chainId: 11155111`)

| Contract                                       | Address                                      |
| ---------------------------------------------- | -------------------------------------------- |
| StealthMetaAddressRegistry                     | `0x77425e04163d608B876c7f50E34A378624A12067` |
| StealthAddressAnnouncer                        | `0x840f72249A8bF6F10b0eB64412E315efBD730865` |
| UABSender                                      | `0x872787c0BD1A0C71e6D1be5a144EB044e0CB2069` |
| UABReceiver                                    | `0x9eF189f7a263F870Cf80f9A89d1349A6AF7b15cF` |
| Wormhole Core Bridge (external)                | `0x4a8bc80Ed5a4067f1CCf107057b8270E0cC11A78` |
| OpaqueSchemaRegistry                           | `0xAA5F3942117bD48E7Cd81A500A8b7Bbb122ae80f` |
| AttestationRegistry (V2)                       | `0x049aF9CBB62387034CDd5403794a94E9c000ACCc` |
| OpaqueReputationVerifier (V2)                  | `0x18cEc2812953c2E9bcADE20CbF6415BD36aEb44f` |
| Groth16Verifier (V2)                           | `0x49A212bdbc52F1cb6C93623FC7814a61Fc71ddB5` |
| OpaqueNameRegistry (ONS, parent `opqtest.eth`) | `0x6e18a2faaa929848a3377C28Cf250795E20Fce02` |
| RelayerRegistry (gas-private market)           | `0x5fA252e2D22058a4ec3420573a3B3A5dca025837` |
| StealthTokenSweep (gasless sweep forwarder)    | `0xdb8103231c8b2488Faf00427Cb1241bbe62A1410` |
| OpaquePrivacyPool                              | `0x49a5bB6d079a43d50596069b4F2632005CFe729E` |
| WithdrawalVerifier (privacy pool)              | `0xa1add9daa1F4D0f9190c13fb9AD52e525f4726b5` |

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

| Program                               | Address                                        |
| ------------------------------------- | ---------------------------------------------- |
| StealthMetaAddressRegistry            | `E9LBRG5eP2kvuNfveouqQ9tA5P6nrpyLyWFjH9MFYVno` |
| StealthAddressAnnouncer               | `HGFn2fH7bVQ5cSuiG52NjzN9m11YrB3FZUfoN9b9A5jf` |
| SchemaRegistry                        | `FbgMJYGWnLKLcrKYS1NxM5uER1ihQkYLMTLs4STuDMWB` |
| AttestationEngineV2                   | `4T9kPCVCFGdEuLpEqRJihsPCbEEo2LWWDEPFvUESEqtM` |
| Groth16Verifier                       | `6mFaKyp7F4NqNeoiBLEWSqy5wJSk7rWf1EYumVXgHvhQ` |
| ReputationVerifier                    | `BSnkCDoTpgNVN5BbF3aN5L5EJPiaYUkqqj9MHp8kaqWM` |
| UAB Receiver                          | `7d4Sbmmpy954JwSNdjwf31pgbeWUQqwpgNdte5iy3vuM` |
| ONS Mirror                            | `D7EXuwcsGrUAYC6k69jrKvsKethsKYgR1pokkTcFvWsk` |
| ONS Registration                      | `5gfK9J8FJi3FpsQD33Hkrfwq8KqN4yadB2PDF9REnwMT` |
| relayer-registry (gas-private market) | `E4xmYaAU31dbNTbhfMfp2F24b48DAxJigvZTVbsKJREg` |
| opaque-privacy-pool                   | `5NjweHM4z7NrG4NLVUyJ8rtX8jLM3xtBWAR1wSJZ7vjY` |
| Wormhole Core Bridge (external)       | `3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5` |

```ts theme={"dark"}
import { getSolanaDeployment } from "@opaquecash/opaque";

const d = getSolanaDeployment("devnet");
console.log(d.schemaRegistry, d.attestationEngineV2);
```

## Starknet Sepolia (chain id `0x534e`)

Testnet preview — see [Starknet](/concepts/starknet).

| Contract                         | Address                                                              |
| -------------------------------- | -------------------------------------------------------------------- |
| StealthAnnouncer                 | `0x003b8258e84e6feec93239b442e6a91f532fda35fed67de4093b1d97150d2aa2` |
| StealthMetaAddressRegistry       | `0x047ff90c491384ecf8dba8b32b1eea7947f850ea92ddc196edcb0f508acff874` |
| OpaqueReputationVerifierV2       | `0x079ada2245bd7f7575c4c67c9ea34edc9c420c57de711762b8ffbb8483823af6` |
| Groth16VerifierBN254             | `0x01f339dfc3a1509bc3ccd1c7ea1a19c07bc0f89ad7378b505b3edc5f5b13b02e` |
| PsrGate (credential-gated entry) | `0x07103219e851b7bc16b07748e4427d38c2b884b06d524b52dbae9a04386b8331` |
| StealthAccount (class hash)      | `0x04794bab07198e0585d2d7951dbc5860fba47fea2a15d227ca3237b7b9e484ed` |

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

```ts theme={"dark"}
import { getStarknetDeployment } from "@opaquecash/deployments";

const sn = getStarknetDeployment("sepolia");
console.log(sn.stealthAnnouncer, sn.reputationVerifier, sn.stealthAccountClassHash);
```

## Supported chain IDs

```ts theme={"dark"}
OpaqueClient.supportedChainIds();  // [11155111] in the current SDK version
```

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.
