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
| Field | Value |
|---|---|
| Chain ID | 5042002 |
| Deployer EOA | 0x57b3771F6b772C52E81646Aa007D1Ab28d91B3Fe |
Core contracts
| Contract | Address | Notes |
|---|---|---|
| AccessControl · singleton | 0xa7Dc0A8815acCbDfc22619b6F65b2dE710Eb2A7B | Owner/guardian/roles for the whole stack |
| ExternalOracle (primary) · singleton | 0xfe1Dc89FfE61CcDe653Fc05Bc5D6108417E5AF8e | Signed keeper-mark feed store, consumed for quoting |
| ExternalOracle (reference) · singleton | 0x317AE92F92bDDac76DA52D5D19832f3758FE3bbf | Independent 2nd instance; depeg-band + volatile refFeed source, never used for quoting |
| Admin · UUPS proxy | 0x35BB3BBeB86c7caee532083DAC639400912C8f00 | Risk params, curve presets, timelocked ops. UUPS; Pool bakes THIS address as an immutable |
| Admin (implementation) · singleton | 0xe2d5705DDFc3afa1D17F794f9a4dD7c913ac6e93 | Logic behind the Admin proxy |
| Flash · UUPS proxy | 0x544128B1F23D959F1B2660b1e392cb9D5e24d81f | Flash-loan entry, pool-wide inflight guard. UUPS; Pool bakes THIS address as an immutable |
| Flash (implementation) · singleton | 0x1ECe18dCD2bea76998AE059bA47898CbF758aCBf | Logic behind the Flash proxy |
| PoolFactory · singleton | 0xaF5Dfa6F3f549bAb1598Ff24d15c0cF9aCaA6Df7 | Deploys ERC-1967 beacon proxies; IS the beacon, its implementation() is the code EVERY live pool runs |
| TestnetFaucet · singleton | 0x97BE19E537B9064f5c4984dD1e83Ad8b6aBe0cC3 | Rate-limited mock-token claims |
Pools (shared implementation + ERC-1967 beacon proxies)
| Pool | Address |
|---|---|
| Pool implementation · implementation | 0xe3438c3BcD6921331D93950966c303453a607f51 |
| Crypto core · beacon proxy | 0xACe9a150cdc3ab8AdBbc3e7CC5d5ce92485624F5 |
| FX core · beacon proxy | 0xCbB809d5A5583301e7753D57D73A25C0d12EC232 |
| Stable core · beacon proxy | 0x8e33853c6c34F20c93385449afE9477029D45BFE |
| Stocks core · beacon proxy | 0xD98A734203A719d9CA26f562dc8bc9fcb55685e3 |
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
| Symbol | Address | Feed ID (primary, keccak(token, USDC)) |
|---|---|---|
| AMD | 0x3e04aa20170944d29681a475Bb3dd0a1Bb421cCb | 0xa6c9396c58cb1c50e6f2a6139404b148ecc7f86489d9d4faa01e3eb5228fc652 |
| ASML | 0x56520a1D0F047e748AA042975D95B6B3CD203a4d | 0x6b434d49a41b22478b4b1d3fca59c90e5dbfc185cc1b5e2a9a3efd2f901e0c23 |
| AUDF | 0x35c625c07ed4a9123ab863f6e8722c9210c808A3 | 0x20dc0d8625fb1ae982d08763105cdce98e9a95ca59c4903190119c9fe88a47cd |
| AVGO | 0x0458D9Fc5bd31b5Af3018Be9CfE91ecF4ABf9a7e | 0x7d9c97fe812e6df01e2604baeade55e60503c8d793300e69d6da8efa52618b54 |
| BNB | 0x49C710167A4b486F20f9437485D865D653806310 | 0x5398b2b4caab86e6c562e30f6ecb15c4b87c20ed7595ad48b4048b62005b9888 |
| CBBTC | 0xbAA18E707E7b7fE9d1c0e4CeA61603035cb30C55 | 0x27f98ddc32af5a6272f676d428fd004af1718c18541118dc044c0ac3a2b612fd |
| EURC | 0x89B50855Aa3bE2F677cD6303Cec089B5F319D72a | 0x9af29d8ae5269a47d972f6e5a188878d8e45cb2c7f7ce637492bdaef05a980be |
| EURCB | 0xd9016a91387db71fbD07Cde32E900E17061dE5A1 | shares EURC-USDC · 0x9af29d8ae5269a47d972f6e5a188878d8e45cb2c7f7ce637492bdaef05a980be |
| INTC | 0xd7A6216738Eba05C0ee47ff478e307bE5A94Dc95 | 0x058dc9a04c0ebce2bb560948628013d466bdc2bfb8042e33d4a7a0dde2045fba |
| JPYC | 0xA1fe5aDcB5f5DD1c21d372D18E7dF7fa5bfbc09e | 0xf3570f02e056765d6c42a5b3624067f3b80c80b9d22355c71b534c24eb8ae1e9 |
| KRW1 | 0xee7D69C52c2F183A0389374E82ca841c5a463573 | 0x2642c5e9691dbb5c5674a2a24ebb68e4df723f0656e3d4e2e45fa028c6caf650 |
| META | 0x2767f2e94a7cF7935d59DdD7A5A30138369846e2 | 0x2d2201820627f4019b4ddd9d9742fc14a750d4df2f5413961e91c03e8af9581a |
| MSFT | 0x83E43A65ce9E5aE1872a2363eD74D67C5A30fdb5 | 0x778b165de0bfe24e8806a0334dabd237c8f5844fb3d60a8d5b623d352120e784 |
| NVDA | 0xA4816856b8144ad1bb5a555A9Afa8B0f4B9FC8D0 | 0x9a0882814ace331414f8c2c7cb34e815e4c7092f8de7df39bba1fc92968deb69 |
| ORCL | 0x56F81D0831b9352e023266b72F38b4657baA32E8 | 0x83c6210ed83e6bbd8db6d6dd43893d46cbc0a20efce89c30f6be2ce536ea74db |
| PAXG | 0x96f953bAC2FF3829B4a526cacd858A5a22327E03 | 0xb8b495d5826591b537a47841255ffbca7f1f0f56afff8f5e7bc565f1e20b338c |
| PYUSD | 0xeE12a7072779a4ab85f2DD2a1E163DbF164291f9 | 0xd4ebce1baf00f6124f7a0bd347ef8170aaa7ce6e5dcf595879e3c61676921e99 |
| QCAD | 0x626eb915d4a4136F7c00352A54378d3A322488da | 0x1c9b7f4cc3a7295cb420362f039e13565a7f80f9d0b7023405023d1db74735ea |
| SPCX | 0xf782226BB4B4C6F57F24D17a34c5C041482b4bE2 | 0x1729d32f332780e7a939b7ca2a73ceb60cf507d64ed28e15023dad847f50fe47 |
| TSLA | 0xBA76ce34AC2c65813ee2c11F34Ad1523fE43CBac | 0x91a8aa38cb67e3a567c5b58b125e69e218c5a97677de4b4ce327a1bd281e0952 |
| USD1 | 0x0326748d09eD77D8C15fbf04d6277aE4CAF033f3 | 0x4c7fec22c40835f297ef183fc68a20f5a965997cddedf9fcf5bd18b3d0898d85 |
| USDC | 0x3600000000000000000000000000000000000000 | – |
| USDCB | 0x9A8Ea4AB461d0Db943ecB1B1e4CE0B68df9061CC | shares USDT-USDC · 0xfa722ae80d6181ca931f45c80582c173b9c19cd30c1632e864e8f48ea62a6548 |
| USDS | 0x66dbe40c8dc03f2C9e7A187F253e8889A03640c8 | 0x4d9df04bbf62ab0e8418c56a2fea063a7956bc08674600862a95970c583f3be5 |
| USDT | 0x878e27566Ab9E32534e306C26388dFcE82D0AB46 | 0xfa722ae80d6181ca931f45c80582c173b9c19cd30c1632e864e8f48ea62a6548 |
| WBTC | 0xF36eEe851bf3e76E464609a717bAE4a239A8cC7b | 0x63b49bbd6b259a4c3500020453ad775a8df2ff9e423fe5228644f18f495262bf |
| WETH | 0x89A9cD1dd6DE3ab7152EF9c7C5496c2946334D0D | 0xacb54d59d0c847602722bfdec8aaaf92ead1385b3402cad482b3c6484a6efc1c |
| XAUT | 0x432A3248e91d8B6fd41A487dE8886E0B44Fb7a6D | 0xaf63e9c459822846879d75246ea10ee933d53a8f206c51c5150270aadd42625f |
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
| Role | Address | Powers |
|---|---|---|
| Owner | 0x57b3771F6b772C52E81646Aa007D1Ab28d91B3Fe | Holds every timelocked lane; the only address that can un-halt, upgrade or rotate roles |
| Guardian | 0xDc9478be9ceA6288574A45D9cD07C48F7f03ed73 | Fail-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
| Purpose | Address / ID |
|---|---|
| USD (unit reference) | 0xa7E62dd82789346bEb48a80227B5d926c6403400 |
| USDC/USD depeg reference feed ID | 0x0189091eac3c33dc88b48c58f75a1d978253e7fb2d4a1711b5701172b083c487 |
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:
refOracleis a second, independentExternalOracleinstance backing the depeg band and the volatile-assetrefFeedbreaker, 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 theUPGRADEtier 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
permitsupport. Mainnet reference addresses (feed mapping only) live in the Asset Registry. The “Ref-oracle bound” column is read offrefFeeds; the note under that table explains what it does and does not mean. - Feed IDs:
keccak256(abi.encodePacked(token, USDC)), the primaryExternalOraclefeed identifier the keeper pushes against.
Upgradeability
Three upgrade paths, identical on every chain.
- Pool fleet (largest): the
PoolFactorybeacon - see its row above and Deployment & Upgrades §4.1. MonitorReferencePoolUpgradeRequested/ReferencePoolUpgradedonPoolFactory. A pool logic change ships as a new implementation address plus a beacon swap: an in-place upgrade of every existing pool. AdminandFlash: UUPS proxies over the sharedUpgradeGatebase (timelockedrequestUpgrade/executeUpgrade; a directupgradeToAndCallis rejected even from the authority). Table addresses are the proxies, which is whatPoolbakes in as immutables; implementations are tracked separately asadminImpl/flashImpl.- No upgrade path:
AccessControl(Ownable- rotatable owner, fixed code),PoolFactory(holds the fleet implementation pointer, own code fixed), bothExternalOracleinstances, theLPTokenimplementation, 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.
| Chain | chainId | Native gas | Explorer |
|---|---|---|---|
| Arc | 5042 | USDC | – |
| Ethereum | 1 | ETH | explorer |
| BNB Chain | 56 | BNB | explorer |
| Base | 8453 | ETH | explorer |
| Arbitrum | 42161 | ETH | explorer |
| X Layer | 196 | OKB | explorer |
| Monad | 143 | MON | explorer |
| Robinhood Chain | 4663 | ETH | explorer |
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.
| Contract | Reserved address |
|---|---|
| ExternalOracle (primary) | 0xbbbbbbbb76433322889ddbb7a1d1eb45a135ca4d |
| ExternalOracle (reference) | 0xbbbbbbbbd25e9fe06b53cd32803e38f5fbbf8c70 |
| PoolFactory | 0xbbbbbbbb323d7f7e51976b8a8df2bb4b4608d9b3 |
| Flash (UUPS proxy) | 0xbbbbbbbb1bcf78304ecbe4c7fc7c21244bb55d3a |
| AccessControl | 0xbbbbbb289736272e5fb64f284d176ffb49d6c6cf |
| 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.