Contract Addresses

This page is the address of record for every deployed BTR contract, and the one integrations should read. Each chain gets one section, generated from that chain’s deploy-time artifacts - never hand-typed - and regenerated after every deploy; deployed chains come first, chains without a deployment at the end. A section covers the deploy metadata, the oracle stack, the mock ERC-20s and their feed IDs, and the protocol singletons (Admin, Flash, PoolFactory, Pool implementation, reference oracle). Verify every address before sending funds; cross-check the block explorer link on each row.

Contract ABIs are served by the backend at GET /v1/abis/<ContractName> (the same endpoint @btr-protocol/sdk fetchAbi uses). Do not wire integrations to the SDK’s CONTRACTS[chainId] registry - it is a placeholder of zero addresses.


Network: Arc Testnet, chainId 5042002

Status: live public testnet (Deployments Overview §1). Hub token USDC.b; native USDC is Circle testnet / gas.

Explorer: Arc Testnet Explorer

Deploy metadata

FieldValue
Chain ID5042002
Deployer EOA0x57b3771F6b772C52E81646Aa007D1Ab28d91B3Fe

Core contracts

ContractAddressNotes
AccessControl · singleton0xa7Dc0A8815acCbDfc22619b6F65b2dE710Eb2A7BOwner/guardian/roles for the whole stack
ExternalOracle (primary) · singleton0xfe1Dc89FfE61CcDe653Fc05Bc5D6108417E5AF8eSigned keeper-mark feed store, consumed for quoting
ExternalOracle (reference) · singleton0x317AE92F92bDDac76DA52D5D19832f3758FE3bbfIndependent 2nd instance; depeg-band + volatile refFeed source, never used for quoting
Admin · UUPS proxy0x35BB3BBeB86c7caee532083DAC639400912C8f00Risk params, curve presets, timelocked ops. UUPS; Pool bakes THIS address as an immutable
Admin (implementation) · singleton0xe2d5705DDFc3afa1D17F794f9a4dD7c913ac6e93Logic behind the Admin proxy
Flash · UUPS proxy0x544128B1F23D959F1B2660b1e392cb9D5e24d81fFlash-loan entry, pool-wide inflight guard. UUPS; Pool bakes THIS address as an immutable
Flash (implementation) · singleton0x1ECe18dCD2bea76998AE059bA47898CbF758aCBfLogic behind the Flash proxy
PoolFactory · singleton0xaF5Dfa6F3f549bAb1598Ff24d15c0cF9aCaA6Df7Deploys ERC-1967 beacon proxies; IS the beacon, its implementation() is the code EVERY live pool runs
TestnetFaucet · singleton0x97BE19E537B9064f5c4984dD1e83Ad8b6aBe0cC3Rate-limited mock-token claims

Pools (shared implementation + ERC-1967 beacon proxies)

PoolAddress
Pool implementation · implementation0xe3438c3BcD6921331D93950966c303453a607f51
Crypto core · beacon proxy0xACe9a150cdc3ab8AdBbc3e7CC5d5ce92485624F5
FX core · beacon proxy0xCbB809d5A5583301e7753D57D73A25C0d12EC232
Stable core · beacon proxy0x8e33853c6c34F20c93385449afE9477029D45BFE
Stocks core · beacon proxy0xD98A734203A719d9CA26f562dc8bc9fcb55685e3

Further pools (permissionless deploys included): enumerate via PoolFactory.allPools. Every pool reads its implementation from PoolFactory, which is the beacon, so a single timelocked executeReferenceUpgrade changes the code of all of them at once.

Mock ERC-20s + oracle feeds

SymbolAddressFeed ID (primary, keccak(token, USDC))
AMD0x3e04aa20170944d29681a475Bb3dd0a1Bb421cCb0xa6c9396c58cb1c50e6f2a6139404b148ecc7f86489d9d4faa01e3eb5228fc652
ASML0x56520a1D0F047e748AA042975D95B6B3CD203a4d0x6b434d49a41b22478b4b1d3fca59c90e5dbfc185cc1b5e2a9a3efd2f901e0c23
AUDF0x35c625c07ed4a9123ab863f6e8722c9210c808A30x20dc0d8625fb1ae982d08763105cdce98e9a95ca59c4903190119c9fe88a47cd
AVGO0x0458D9Fc5bd31b5Af3018Be9CfE91ecF4ABf9a7e0x7d9c97fe812e6df01e2604baeade55e60503c8d793300e69d6da8efa52618b54
BNB0x49C710167A4b486F20f9437485D865D6538063100x5398b2b4caab86e6c562e30f6ecb15c4b87c20ed7595ad48b4048b62005b9888
CBBTC0xbAA18E707E7b7fE9d1c0e4CeA61603035cb30C550x27f98ddc32af5a6272f676d428fd004af1718c18541118dc044c0ac3a2b612fd
EURC0x89B50855Aa3bE2F677cD6303Cec089B5F319D72a0x9af29d8ae5269a47d972f6e5a188878d8e45cb2c7f7ce637492bdaef05a980be
EURCB0xd9016a91387db71fbD07Cde32E900E17061dE5A1shares EURC-USDC · 0x9af29d8ae5269a47d972f6e5a188878d8e45cb2c7f7ce637492bdaef05a980be
INTC0xd7A6216738Eba05C0ee47ff478e307bE5A94Dc950x058dc9a04c0ebce2bb560948628013d466bdc2bfb8042e33d4a7a0dde2045fba
JPYC0xA1fe5aDcB5f5DD1c21d372D18E7dF7fa5bfbc09e0xf3570f02e056765d6c42a5b3624067f3b80c80b9d22355c71b534c24eb8ae1e9
KRW10xee7D69C52c2F183A0389374E82ca841c5a4635730x2642c5e9691dbb5c5674a2a24ebb68e4df723f0656e3d4e2e45fa028c6caf650
META0x2767f2e94a7cF7935d59DdD7A5A30138369846e20x2d2201820627f4019b4ddd9d9742fc14a750d4df2f5413961e91c03e8af9581a
MSFT0x83E43A65ce9E5aE1872a2363eD74D67C5A30fdb50x778b165de0bfe24e8806a0334dabd237c8f5844fb3d60a8d5b623d352120e784
NVDA0xA4816856b8144ad1bb5a555A9Afa8B0f4B9FC8D00x9a0882814ace331414f8c2c7cb34e815e4c7092f8de7df39bba1fc92968deb69
ORCL0x56F81D0831b9352e023266b72F38b4657baA32E80x83c6210ed83e6bbd8db6d6dd43893d46cbc0a20efce89c30f6be2ce536ea74db
PAXG0x96f953bAC2FF3829B4a526cacd858A5a22327E030xb8b495d5826591b537a47841255ffbca7f1f0f56afff8f5e7bc565f1e20b338c
PYUSD0xeE12a7072779a4ab85f2DD2a1E163DbF164291f90xd4ebce1baf00f6124f7a0bd347ef8170aaa7ce6e5dcf595879e3c61676921e99
QCAD0x626eb915d4a4136F7c00352A54378d3A322488da0x1c9b7f4cc3a7295cb420362f039e13565a7f80f9d0b7023405023d1db74735ea
SPCX0xf782226BB4B4C6F57F24D17a34c5C041482b4bE20x1729d32f332780e7a939b7ca2a73ceb60cf507d64ed28e15023dad847f50fe47
TSLA0xBA76ce34AC2c65813ee2c11F34Ad1523fE43CBac0x91a8aa38cb67e3a567c5b58b125e69e218c5a97677de4b4ce327a1bd281e0952
USD10x0326748d09eD77D8C15fbf04d6277aE4CAF033f30x4c7fec22c40835f297ef183fc68a20f5a965997cddedf9fcf5bd18b3d0898d85
USDC0x3600000000000000000000000000000000000000
USDCB0x9A8Ea4AB461d0Db943ecB1B1e4CE0B68df9061CCshares USDT-USDC · 0xfa722ae80d6181ca931f45c80582c173b9c19cd30c1632e864e8f48ea62a6548
USDS0x66dbe40c8dc03f2C9e7A187F253e8889A03640c80x4d9df04bbf62ab0e8418c56a2fea063a7956bc08674600862a95970c583f3be5
USDT0x878e27566Ab9E32534e306C26388dFcE82D0AB460xfa722ae80d6181ca931f45c80582c173b9c19cd30c1632e864e8f48ea62a6548
WBTC0xF36eEe851bf3e76E464609a717bAE4a239A8cC7b0x63b49bbd6b259a4c3500020453ad775a8df2ff9e423fe5228644f18f495262bf
WETH0x89A9cD1dd6DE3ab7152EF9c7C5496c2946334D0D0xacb54d59d0c847602722bfdec8aaaf92ead1385b3402cad482b3c6484a6efc1c
XAUT0x432A3248e91d8B6fd41A487dE8886E0B44Fb7a6D0xaf63e9c459822846879d75246ea10ee933d53a8f206c51c5150270aadd42625f

Every asset above carries an independent breaker feed <SYM>-USDC on refOracle (§ core contracts), used for the depeg band and never for quoting, except USDC, which is the pool base and has no <SYM>-USDC identity feed to bind. That is not pool membership: which core an asset sits in is Admin risk-config data rather than deploy-artifact data, and lives in Pool Composition.

A row reading “shares” is a faucet twin: it owns no feed and quotes off an existing one, so it carries that feed’s id rather than a blank. USDCB quotes USDT-USDC; EURCB quotes EURC-USDC. USDCB binds to USDT-USDC rather than to USDC because USDC is the pool base and has no identity feed of its own.

Roles

RoleAddressPowers
Owner0x57b3771F6b772C52E81646Aa007D1Ab28d91B3FeHolds every timelocked lane; the only address that can un-halt, upgrade or rotate roles
Guardian0xDc9478be9ceA6288574A45D9cD07C48F7f03ed73Fail-safe only: halt, tighten, cancel. Cannot un-halt, upgrade or move value

Authority is asymmetric by design: halting is guardian-or-owner, un-halting is owner-only. The full matrix is in Access Control.

Independent reference feeds

Pairs priced on refOracle (above), used only for the depeg-band / volatile refBand breaker, never for quoting. Pairs: AMD-USDC, ASML-USDC, AUDF-USDC, AVGO-USDC, BNB-USDC, CBBTC-USDC, EURC-USDC, INTC-USDC, JPYC-USDC, KRW1-USDC, META-USDC, MSFT-USDC, NVDA-USDC, ORCL-USDC, PAXG-USDC, PYUSD-USDC, QCAD-USDC, SPCX-USDC, TSLA-USDC, USD1-USDC, USDS-USDC, USDT-USDC, WBTC-USDC, WETH-USDC, XAUT-USDC.

USD unit reference

PurposeAddress / ID
USD (unit reference)0xa7E62dd82789346bEb48a80227B5d926c6403400
USDC/USD depeg reference feed ID0x0189091eac3c33dc88b48c58f75a1d978253e7fb2d4a1711b5701172b083c487

Reading this table once populated

Applies to every chain section.

  • Core contracts: singleton, deployed once per chain, plain immutable logic (see Upgradeability below for the three upgrade paths); a redeploy changes the address.
  • Reference oracle: refOracle is a second, independent ExternalOracle instance backing the depeg band and the volatile-asset refFeed breaker, never a swap quote (Oracles). Ref-bound pairs are marked per token row above.
  • Pools: every pool is an ERC-1967 beacon proxy, not an immutable clone. All read PoolFactory.implementation(): the factory is the beacon. A pool’s address is permanent; its code is not. One owner transaction, PoolFactory.executeReferenceUpgrade() after the UPGRADE tier delay (7 days in production), re-points every live pool on that chain at a new implementation at once, including pools deployed permissionlessly by third parties. Vetoable by the owner or any guardian (cancelReferenceUpgrade); expires 7 days after maturity. See Deployment & Upgrades §4.1.
  • Mock ERC-20s: testnet chains have no viable canonical token supply to seed pools, so every non-official pool asset is a BTR-deployed mock, mainnet-faithful in decimals and permit support. Mainnet reference addresses (feed mapping only) live in the Asset Registry. The “Ref-oracle bound” column is read off refFeeds; the note under that table explains what it does and does not mean.
  • Feed IDs: keccak256(abi.encodePacked(token, USDC)), the primary ExternalOracle feed identifier the keeper pushes against.

Upgradeability

Three upgrade paths, identical on every chain.

  1. Pool fleet (largest): the PoolFactory beacon - see its row above and Deployment & Upgrades §4.1. Monitor ReferencePoolUpgradeRequested / ReferencePoolUpgraded on PoolFactory. A pool logic change ships as a new implementation address plus a beacon swap: an in-place upgrade of every existing pool.
  2. Admin and Flash: UUPS proxies over the shared UpgradeGate base (timelocked requestUpgrade / executeUpgrade; a direct upgradeToAndCall is rejected even from the authority). Table addresses are the proxies, which is what Pool bakes in as immutables; implementations are tracked separately as adminImpl / flashImpl.
  3. No upgrade path: AccessControl (Ownable - rotatable owner, fixed code), PoolFactory (holds the fleet implementation pointer, own code fixed), both ExternalOracle instances, the LPToken implementation, and the four linked libraries (Pricing, PoolConfig, PoolLiquidity, NUQuartic).

Governance-critical DEX parameter changes - risk config, curve presets, feed additions - route through Admin’s timelock rather than through a contract upgrade, so the deployed code for those paths does not change at all; see Deployment & Upgrades.

Keeper on-chain touchpoints

Per chain, the oracle keeper is the only regular non-admin writer against the stack. It calls ExternalOracle.batchPushSigned(blob, sigs) (k-of-n EIP-712 NXR-signer quorum, at least 2-of-3) on a deviation-or-heartbeat trigger per feed; addFeed/updateFeed are owner-only setup/recovery calls, not part of the steady-state loop. Full trust model and signer set: Oracle Price-Push Security.


Other chains

These are deployment targets, each awaiting its launch. Addresses appear here the first time a chain is deployed, as its own generated section keyed by chainId, together with the matching machine-readable deployments.<chainId>.json. Until then a chain below has no BTR contracts and nothing to integrate against, so build on Arc testnet and switch the chainId when its section appears.

ChainchainIdNative gasExplorer
Arc5042USDC
Ethereum1ETHexplorer
BNB Chain56BNBexplorer
Base8453ETHexplorer
Arbitrum42161ETHexplorer
X Layer196OKBexplorer
Monad143MONexplorer
Robinhood Chain4663ETHexplorer

Reserved mainnet addresses

No mainnet chain has a BTR deployment, so no mainnet address appears in the tables above. Six addresses are nevertheless reserved for the eventual launch, mined in advance so the ceremony has nothing left to choose. They are the same on every chain BTR launches on.

ContractReserved address
ExternalOracle (primary)0xbbbbbbbb76433322889ddbb7a1d1eb45a135ca4d
ExternalOracle (reference)0xbbbbbbbbd25e9fe06b53cd32803e38f5fbbf8c70
PoolFactory0xbbbbbbbb323d7f7e51976b8a8df2bb4b4608d9b3
Flash (UUPS proxy)0xbbbbbbbb1bcf78304ecbe4c7fc7c21244bb55d3a
AccessControl0xbbbbbb289736272e5fb64f284d176ffb49d6c6cf
Admin (UUPS proxy)0xbbbbbb226988e555e7a175d8e07eef61cda84cd2

Reserved is not deployed. Nothing holds code at any of these addresses today, on any chain, and nothing will until a launch ceremony runs and this page grows a section for that chainId. Treat an address here as a future constant, not as somewhere to send funds or point an integration - and treat anything that appears at one of them before that section exists as not ours.

Why the addresses can be known in advance: BTR deploys through a CREATE3 factory, where the resulting address is a pure function of the factory, the deployer key and a mined salt, and does not depend on the contract’s bytecode. That makes the address stable across chains and independent of which generation of a contract ships. The deployer key is part of the input, so only the reserved mainnet key produces these addresses; the same salts under the testnet key give the ordinary addresses in the Arc section above.

Contracts with no reserved address get one at deploy time and are published here afterwards. The Admin and Flash rows are the proxies; their implementations move on every upgrade and are never reserved. Pools and LP tokens are never reserved either - a pool address is derived by PoolFactory from its own salt, and an LP token by the pool from the leg.

The contract surface is identical across chains; the addresses are not, and neither is the native gas token.