Skip to content
Arc Testnet — names have no monetary value yet
ArcNS / Contracts

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.

ContractAddressRole
HandleRegistry0x520Ef0D49F2e2A66d99B460E05EC5A8C743215d2@handle ownership (ERC-721, soulbound until tokenized), recovery, lock, sub-handles. tokenId = keccak256(name).
HandleController0xF84B693cE8c9230BCacC0422cA98eAf19f7c46f0Commit-reveal registration for @handle (min age 60 s, max 24 h), fee split, reserved genesis. Swappable.
ENSRegistry0x0a1DfA7f63fCd0526ed3bA81Af3d31E05Aa42FE4node → (owner, resolver, ttl) for .arc / .circle — verbatim ENS.
Root0xc1291563f4206301e70665FFDb190a057B569909Root node owner — verbatim ENS; governed through the timelock.
TldDirectory0x66aeb7Dd9766d525e094EFa6d4D78933cAFbe8deThe on-chain TLD table: registrar, controller, status (Active, RegistrationsPaused, Sunset, Retired), sunset and migration data. Written only by the timelock.
TldMetadata0xB53cCF5C84e616C69494964F12Bddaf702C72dFfTLD display metadata.
ArcNSPriceOracle0xAb0B37dc10Da89158e6E7641aa032EAef300bcCDPer-namespace stacked price curve (ENS IPriceOracle); see Fees.
ArcNSResolver0x2841Ca947CC17eB3759df4950a548C217dA6287aOne record store for every namespace: addr(node, coinType), text, contenthash, name, plus verified(node, coinType).
ReverseRegistrar0x50986507E5c91255Ee4Ee63832b90e2DdC1B2cFAThe single primary-name store: one primary per address across all namespaces — verbatim ENS.
UniversalResolver0xF7DEea25dc3Edb3c9a82cB8Dc1Ba529230A91737One-call ENSIP-10 resolution and reverse for SDK and wallets — verbatim ENS.
GatewayProvider0x0cA06Cc1375Eb146CbbfcF25Eb1f20718Fa24C81CCIP-read gateway provider for the universal resolver.
EnsBootstrap0x553fdB0A3661cD60383bD98777a4a46DF7b953ABOne-shot bootstrap of the ENS root for the two TLDs.
TimelockController0xF0027dfe0D0a1d484c7186F8DA72165C6F1D0b24Owner of every contract (1-hour delay); proposer / executor is the admin Safe — verbatim OpenZeppelin.
AdminSafe0x632e02ADaA92dE3303506eAfc3937348C88dcd83The 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):

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:

ContractAddressStatus
ArcNSMarket0x4f5b37aA51a3e600581139913a0f5De5C5992ab6Fully 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.
NameLocks0x84990f68e2b88e25E17b658DC247aC4950b23986Wired — a secondary lock ArcNSMarket checks alongside the native HandleRegistry lock.
RecordDelegate0x4E5943BBAd8347898d5cBEe3a7a3aCa460e7026EDeployed, intentionally unused. The app does per-name delegation natively on ArcNSResolver (approve/isApprovedFor) instead — a deliberate redesign, not a gap.
TextRecords0x241C2529eC3dee8Bc03DFF565ec02F58bE525172Deployed, intentionally unused. The app reads/writes text records natively on ArcNSResolver (text/TextChanged) instead, for the same reason.
Vouchers0x7198B18FFF6AF29E375adD6Fd269F14BB1f02156Deployed, 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.
IntegratorRegistry0x11Ca7573fbF86B1B48d1A44110EcaF3bab77736DDeployed, 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.
AttestationRegistry0x529B9b88E06F92009f354f19dB81bf88E1591341Deployed; 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].

Browse the docs