Deployed addresses
Every contract Pocket has deployed on testnet, the verification keys installed in the verifier, and how to check each one yourself.
Everything on this page is on Stellar testnet and anyone can look it up. Contract addresses are configuration rather than constants, and the authority is resources/deployment-testnet.json, which the release gates and the scheduled infrastructure check both read.
Contracts
| Address | |
|---|---|
| Confidential wrapper, XLM | CDMXZEFOM5DN2GSHQKNOOW242RJZGCEM5LOOAPGRQE35GGHB7ALDK2Y6 |
| Confidential wrapper, USDC | CBCCCG6THS4QHMHYNXEPDA4RFBJ7L2I2YHJJFV3G74PM2LAS6GBMBNZS |
| UltraHonk verifier | CBERRYPR34G2MB3EOUNO3JGWOAWFVBUPINJ42JP7XVVB3AHKIPVPPWYH |
| Auditor registry | CDE5JETGXV7TOUUDQPUTGLJB6TCUUIIWJJTLWFX4RNH36XABKCEPNTEV |
The verifier and the registry are shared by both wrappers. Each wrapper binds exactly one underlying asset at construction, so a second private asset is a second wrapper.
Underlying assets
| Address | |
|---|---|
| XLM Stellar Asset Contract | CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC |
| USDC Stellar Asset Contract | CBIELTK6YBZJU5UP2WWQEUCYKLPU6AUNZ2BQ4WWFEIE3USCIHMXQDAMA |
| USDC issuer (Circle, testnet) | GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5 |
The USDC story is one asset end to end: the same Circle issuer whose Stellar Asset Contract the confidential wrapper wraps is what the swap trades and what the bridge mints.
The deployment record
| Deployed | 31 July 2026 |
| USDC wrapper added | 7 August 2026 |
| Deployer | GB43MNLS6IL77FIZHOBLYILQIQP5MPQVF77O5JOAYCSWX3TUHAL6Z3F7 |
The deployer holds no power over anything it deployed. The wrapper takes no admin argument and exposes no setter, and the verifier's two mutation methods refuse unconditionally.
Verification keys
Six keys, 1,760 bytes each, installed in the verifier at construction with no code path that can replace them. These SHA-256 hashes are pinned in extension/src/core/vk-hashes.json and reproduced from circuit source on every release.
| Circuit | SHA-256 of the verification key |
|---|---|
register | e01ba8729578e9ec4ea982801e2d806028246eeafe1a2e551e1f9cdef69a7268 |
withdraw | d800122c23d7216ead4f3d7c70c84fd39db37d4f7743659b7d6bf05674ce5c09 |
transfer | b9c6d437368efc5343d33be20b3455840b0b66ae7ad430bebc75c93a172b173c |
spender_transfer | 2366fbe28a033e3adaa2fc61e508c300a5e31dce9f73e03692b678f801182038 |
set_spender | 0cc48b122d7895fae17570c299c80ddc2f2f0c4c3750ab798a887cf3411df7fb |
revoke_spender | ce95f994dbcefa4d3d89bc7c7abc12b373c780a16b1e166fad46ba05dcf17660 |
These are the keys from OpenZeppelin's post-audit revision. The upstream demo's own testnet instance holds pre-audit keys, which is why Pocket deployed its own rather than pointing at it.
Reproducing them
bb write_vk \
-b extension/public/vendor/circuits/target/circuit_register.json \
-o /tmp/vk-out \
--scheme ultra_honk --oracle_hash keccak
shasum -a 256 /tmp/vk-out/vkbb must be exactly 0.87.0. The result matches the table above, and it must also match the vendored extension/public/vendor/circuits/vks/register.vk.bin byte for byte: a vendored key that disagrees with the reproduced one means the extension ships a key the circuit did not produce.
Release gate 2 does all of this for all six, checks each is 1,760 bytes, and additionally proves once and asserts the proof is 14,592 bytes. That last check catches something the hash cannot: an accidental zero-knowledge flag produces a 16,224-byte proof from the same verification key.
Proven on chain
| What | Transaction |
|---|---|
| Auditor key registered | 7465cc88… |
| Confidential account registered | 60dff27f… |
| Merge into spendable | 792caf07… |
| Confidential transfer | 391b5767… |
How to check each of these yourself.
Keeping them alive
Soroban archives contract entries that go untouched. The verifier holds every verification key in instance storage and the library never extends it, so if that entry archives, every confidential operation on every wrapper pointing at it fails.
scripts/check-infrastructure.sh reads every id the deployment record declares, including the ones nested under confidentialAssets, and extends anything below 30 days remaining.
Testnet caps a fresh instance at 120,960 ledgers, about seven days. Mainnet's floor is 2,073,600 ledgers, about 120 days, so the thresholds are per-network and must not be calibrated on testnet.
./scripts/check-infrastructure.shMainnet
No mainnet deployment exists. mainnet.confidential is empty in the network table, and every consumer guards on that rather than reading past the end. The path to mainnet.