pocket
Reference

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, XLMCDMXZEFOM5DN2GSHQKNOOW242RJZGCEM5LOOAPGRQE35GGHB7ALDK2Y6
Confidential wrapper, USDCCBCCCG6THS4QHMHYNXEPDA4RFBJ7L2I2YHJJFV3G74PM2LAS6GBMBNZS
UltraHonk verifierCBERRYPR34G2MB3EOUNO3JGWOAWFVBUPINJ42JP7XVVB3AHKIPVPPWYH
Auditor registryCDE5JETGXV7TOUUDQPUTGLJB6TCUUIIWJJTLWFX4RNH36XABKCEPNTEV

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 ContractCDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC
USDC Stellar Asset ContractCBIELTK6YBZJU5UP2WWQEUCYKLPU6AUNZ2BQ4WWFEIE3USCIHMXQDAMA
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

Deployed31 July 2026
USDC wrapper added7 August 2026
DeployerGB43MNLS6IL77FIZHOBLYILQIQP5MPQVF77O5JOAYCSWX3TUHAL6Z3F7

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.

CircuitSHA-256 of the verification key
registere01ba8729578e9ec4ea982801e2d806028246eeafe1a2e551e1f9cdef69a7268
withdrawd800122c23d7216ead4f3d7c70c84fd39db37d4f7743659b7d6bf05674ce5c09
transferb9c6d437368efc5343d33be20b3455840b0b66ae7ad430bebc75c93a172b173c
spender_transfer2366fbe28a033e3adaa2fc61e508c300a5e31dce9f73e03692b678f801182038
set_spender0cc48b122d7895fae17570c299c80ddc2f2f0c4c3750ab798a887cf3411df7fb
revoke_spenderce95f994dbcefa4d3d89bc7c7abc12b373c780a16b1e166fad46ba05dcf17660

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/vk

bb 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

WhatTransaction
Auditor key registered7465cc88…
Confidential account registered60dff27f…
Merge into spendable792caf07…
Confidential transfer391b5767…

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.sh

Mainnet

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.

On this page