Contracts
The ArcNS contract set on Arc testnet — every deployed address, generated from the deployment file in the repository — single-registry and authoritative for every namespace.
Deployed on Arc testnet
The ArcNS contracts were deployed to Arc testnet (chain id 5042002) on 2026-09-07 at block 60889698 (solc 0.8.30, EVM osaka, 800 optimizer runs). The table below is generated from contracts/deployments/5042002.json on the main branch of fortiblox/fortiblox-arcns, which also records the bytecode hash of every contract; the docs build refuses to publish an address that does not appear in that file, so nothing here is typed by hand.
Warning
Do not trust any address claiming to be an ArcNS contract that is not in that file. The SDK ships the same set as ARCNS_DEPLOYMENTS[5042002]; the API takes them from its environment with no defaults, because a defaulted address is one an attacker can substitute.
| Contract | Address | Role |
|---|---|---|
HandleRegistry | 0x520Ef0D49F2e2A66d99B460E05EC5A8C743215d2 | @handle ownership (ERC-721, soulbound until tokenized), recovery, lock, sub-handles. tokenId = keccak256(name). |
HandleController | 0xF84B693cE8c9230BCacC0422cA98eAf19f7c46f0 | Commit-reveal registration for @handle (min age 60 s, max 24 h), fee split, reserved genesis. Swappable. |
ENSRegistry | 0x0a1DfA7f63fCd0526ed3bA81Af3d31E05Aa42FE4 | node → (owner, resolver, ttl) for .arc / .circle — verbatim ENS. |
Root | 0xc1291563f4206301e70665FFDb190a057B569909 | Root node owner — verbatim ENS; governed through the timelock. |
TldDirectory | 0x66aeb7Dd9766d525e094EFa6d4D78933cAFbe8de | The on-chain TLD table: registrar, controller, status (Active, RegistrationsPaused, Sunset, Retired), sunset and migration data. Written only by the timelock. |
TldMetadata | 0xB53cCF5C84e616C69494964F12Bddaf702C72dFf | TLD display metadata. |
ArcNSPriceOracle | 0xAb0B37dc10Da89158e6E7641aa032EAef300bcCD | Per-namespace stacked price curve (ENS IPriceOracle); see Fees. |
ArcNSResolver | 0x2841Ca947CC17eB3759df4950a548C217dA6287a | One record store for every namespace: addr(node, coinType), text, contenthash, name, plus verified(node, coinType). |
ReverseRegistrar | 0x50986507E5c91255Ee4Ee63832b90e2DdC1B2cFA | The single primary-name store: one primary per address across all namespaces — verbatim ENS. |
UniversalResolver | 0xF7DEea25dc3Edb3c9a82cB8Dc1Ba529230A91737 | One-call ENSIP-10 resolution and reverse for SDK and wallets — verbatim ENS. |
GatewayProvider | 0x0cA06Cc1375Eb146CbbfcF25Eb1f20718Fa24C81 | CCIP-read gateway provider for the universal resolver. |
EnsBootstrap | 0x553fdB0A3661cD60383bD98777a4a46DF7b953AB | One-shot bootstrap of the ENS root for the two TLDs. |
TimelockController | 0xF0027dfe0D0a1d484c7186F8DA72165C6F1D0b24 | Owner of every contract (1-hour delay); proposer / executor is the admin Safe — verbatim OpenZeppelin. |
AdminSafe | 0x632e02ADaA92dE3303506eAfc3937348C88dcd83 | The admin Safe (proposer / executor on the timelock). |
Per TLD (the BaseRegistrarImplementation is verbatim ENS; the controller is a fork of ENS ETHRegistrarController with renewals removed):
| TLD | BaseRegistrar | Controller | Status |
|---|---|---|---|
.arc | 0x38Ed7B5d7582d7314aAD4A9Fa55A89c843c65369 | 0x9ef9bc82F54b004c3667bCE1f3196Ec5deB95F5d | Active |
.circle | 0xB636C5f1a300391A1B8d9f1A14e2C9f11BC09B05 | 0x66080189EEeD22f74dfC68fdfd854CFd811f83b4 | Active |
The registration treasury is 0x3dDF29e9757FaD73F1174391926cb3794AcF3A17: registration prices are paid to it, and it holds the 20,307 reserved genesis names in each namespace (see Fees).
Market stack — deployed, partly wired
A second batch, deployed to the same chain at block 61573559 and appended to the same contracts/deployments/5042002.json (its market object), and likewise timelock-owned:
| Contract | Address | Status |
|---|---|---|
ArcNSMarket | 0x4f5b37aA51a3e600581139913a0f5De5C5992ab6 | Fully wired — listings, escrowed offers, English auctions, batch buy, settle, cancel all work end to end. MARKET_ROLE on HandleRegistry is granted. The app's /marketplace page is still behind a feature flag that has not been switched on yet (see What you can do); until it is, a @handle still moves only by its owner's explicit transfer, recovery or tokenization. |
NameLocks | 0x84990f68e2b88e25E17b658DC247aC4950b23986 | Wired — a secondary lock ArcNSMarket checks alongside the native HandleRegistry lock. |
RecordDelegate | 0x4E5943BBAd8347898d5cBEe3a7a3aCa460e7026E | Deployed, intentionally unused. The app does per-name delegation natively on ArcNSResolver (approve/isApprovedFor) instead — a deliberate redesign, not a gap. |
TextRecords | 0x241C2529eC3dee8Bc03DFF565ec02F58bE525172 | Deployed, intentionally unused. The app reads/writes text records natively on ArcNSResolver (text/TextChanged) instead, for the same reason. |
Vouchers | 0x7198B18FFF6AF29E375adD6Fd269F14BB1f02156 | Deployed, not wired. Neither HandleController nor a TLD controller has a voucher-argument register overload, so create/claim/refund are reachable on chain but nothing in the app calls them yet. |
IntegratorRegistry | 0x11Ca7573fbF86B1B48d1A44110EcaF3bab77736D | Deployed, not wired. setIntegrator/setIntegratorRate are callable by the timelock today, but no registration path calls rateOf/computeSplit, so no revenue share is actually paid out yet. |
AttestationRegistry | 0x529B9b88E06F92009f354f19dB81bf88E1591341 | Deployed; the off-chain attest service and app UI are built and shipped but off by default behind a feature flag. isAttestor for the service's signing address is still false on chain — the setAttestor timelock grant is pending. |
None of the market-stack addresses are in the SDK's checked-in ARCNS_DEPLOYMENTS[5042002] yet — only the core set from the table above is. Do not design against an ArcNS market address that is not in contracts/deployments/5042002.json's market object.
The contract set
All contracts are immutable (no proxies). Upgrades happen by deploying a replacement and re-pointing through the timelock. TLDs are data: adding one is a script run, not a redeploy. Registry cores are never pausable: resolution, record writes and transfers always work. Only new registrations (and, later, market actions) can be paused, and only the timelocked admin can unpause.
Checked-in ABIs for the new contracts (HandleRegistry, HandleController, ArcNSResolver, the TLD stack, the oracle) live in contracts/abi/ in the repository; the SDK's test suite pins every function, error and event fragment against them, so a signature change on chain fails the SDK build instead of shipping a silent mismatch. The verbatim ENS contracts use the published ENS ABIs unchanged.
Single-registry, authoritative
.arc and .circle resolve only through the ArcNS registry above — the SDK, the resolver API and the MCP server all read this registry and this registry alone. A name it does not hold is a plain "not registered," never a comparison against, or a warning about, any other registry on Arc.
Questions
Questions: [email protected].