Skip to Content
ReferenceDeployed Contracts

Deployed Contracts

Network

ChainFlare Coston2 testnet
Chain ID114
Vault deploy block33927500
Explorercoston2-explorer.flare.network 

The app talks to Coston2 through flare-testnet.drpc.org rather than the official coston2-api.flare.network endpoint, because the official RPC caps eth_getLogs to a 30-block range — which breaks the note wallet’s history scan outright.

Contracts

ContractAddress
ShieldedVault0xa289AF1069a8ce415434ac329B86578cF9b9c15f
WrappedBTC0x0E8012D34cCcE7252b680cE96b36f514C5D2Bd04
ComplianceRegistry0xC9192Ecaf662c977B28c614e49F558AAAB832577
OwnerKeyRegistry0x48C77021624f7b4baC092570CDD56EB163eC3e71
StealthAnnouncer0xdA0B6371734C2Fa3D1C46c367f9bFCd0586C6ba1
BatchWithdrawer0x4E90ECc46d47FF8B8a13F5396931838b256A3fC1
PrivacyKeyRegistry0x8107172F8078c965bC9F334fD0bFefB2cFFAe275

ShieldedVault was redeployed (2026-08-17) for an admin-timelock + permissionless-checkpoint-relay redesign: setTrustedVerifier/ setExternalDepositToken now require a queue step, a public 48h delay, then a separate execute step (ADMIN_TIMELOCK_DELAY); setCheckpoint is gone, replaced by a one-time timelocked genesis plus a permissionless, proof-gated extendCheckpoint for every update after — see Bitcoin Bridge. DEFAULT_ADMIN_ROLE on this vault is held by a real, deployed 2-of-3 Safe, not a single EOA — see docs/LIMITATIONS.md #6. Current status: all three one-time bridge-config actions have executed — executeSetTrustedVerifier/executeSetExternalDepositToken (2026-09-01) and the checkpoint genesis bootstrap at signet height 320241 (2026-09-08) — confirmed on-chain. BTC deposits/withdrawals are live on this vault. See the root README’s Status section  if anything here looks stale by the time you’re reading it. Before that, ShieldedVault was separately redeployed (2026-08-11) to add real Bitcoin bridging — depositExternal mints public WrappedBTC directly instead of a hidden note. Every other contract above is unchanged and reused across both redeployments.

ShieldedVault holds the funds, the Merkle tree, and the nullifier set, and calls the per-circuit verifiers. OwnerKeyRegistry, PrivacyKeyRegistry, and StealthAnnouncer are standalone helpers read and written entirely off-chain by clients, and ComplianceRegistry is only consulted by the vault on withdraw.

PrivacyKeyRegistry publishes the secp256k1 key StealthAnnouncer announcements are encrypted to (see Stealth Addresses). A wallet that hasn’t registered here yet falls back to the legacy plaintext/real-address announcement form automatically — nothing else on this page depends on it.

BatchWithdrawer is a permissionless call-forwarder: “Unshield All” proves every selected note locally (no signature needed for that), then submits them all through this contract in one transaction instead of one withdraw() signature per note. It holds no funds — each withdraw() still pays its own recipient directly — and needs no constructor wiring, since it takes the vault address as a call-time parameter. A failing item (a stale root, an already-spent nullifier) doesn’t block the rest of the batch; see BatchWithdrawer.sol.

Assets

AssetIDTokenDecimals
C2FLR0native18
FXRP10x0b6A3645c240605887a5532109323A3E12273dc76
USDT020xC1A5B41512496B80903D1f32d6dEa3a73212E71F6
BTC9990x0E8012D34cCcE7252b680cE96b36f514C5D2Bd04 (WrappedBTC)8

The asset ID is what appears inside note commitments — not the token address, which would be a needlessly large field element to hash. BTC is the one asset that doesn’t arrive via shield() — see Bitcoin Bridge for how it mints instead.

Verifiers

One generated Solidity verifier per circuit, all called by ShieldedVault:

  • WithdrawVerifier
  • PayVerifier
  • PlaceOrderVerifier
  • CancelOrderVerifier
  • MatchOrdersVerifier
  • BtcDepositHonkVerifier — checked by depositExternal, not part of the note/commitment scheme the other five belong to; see Bitcoin Bridge
  • CheckpointRelayHonkVerifier — checked by the permissionless extendCheckpoint, proving a real 6-header extension of the BTC checkpoint; see Bitcoin Bridge

See Noir Circuits for each one’s public inputs and the order they must be passed in.

Single source of truth. These values live in frontend/src/lib/noteWallet/coston2Addresses.json. If contracts are redeployed, update that file and re-sync this page from it.

Last updated on