Deployed Contracts
Network
| Chain | Flare Coston2 testnet |
| Chain ID | 114 |
| Vault deploy block | 33927500 |
| Explorer | coston2-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
| Contract | Address |
|---|---|
ShieldedVault | 0xa289AF1069a8ce415434ac329B86578cF9b9c15f |
WrappedBTC | 0x0E8012D34cCcE7252b680cE96b36f514C5D2Bd04 |
ComplianceRegistry | 0xC9192Ecaf662c977B28c614e49F558AAAB832577 |
OwnerKeyRegistry | 0x48C77021624f7b4baC092570CDD56EB163eC3e71 |
StealthAnnouncer | 0xdA0B6371734C2Fa3D1C46c367f9bFCd0586C6ba1 |
BatchWithdrawer | 0x4E90ECc46d47FF8B8a13F5396931838b256A3fC1 |
PrivacyKeyRegistry | 0x8107172F8078c965bC9F334fD0bFefB2cFFAe275 |
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
| Asset | ID | Token | Decimals |
|---|---|---|---|
C2FLR | 0 | native | 18 |
FXRP | 1 | 0x0b6A3645c240605887a5532109323A3E12273dc7 | 6 |
USDT0 | 2 | 0xC1A5B41512496B80903D1f32d6dEa3a73212E71F | 6 |
BTC | 999 | 0x0E8012D34cCcE7252b680cE96b36f514C5D2Bd04 (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:
WithdrawVerifierPayVerifierPlaceOrderVerifierCancelOrderVerifierMatchOrdersVerifierBtcDepositHonkVerifier— checked bydepositExternal, not part of the note/commitment scheme the other five belong to; see Bitcoin BridgeCheckpointRelayHonkVerifier— checked by the permissionlessextendCheckpoint, 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.