{"file_path":"src/ArcNameRegistry.sol","creation_status":"success","source_code":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.24;\n\nimport { IArcNameRegistry } from \"./interfaces/IArcNameRegistry.sol\";\n\n/// @notice ENS-compatible ownership, resolver and TTL source of truth for Arc names.\ncontract ArcNameRegistry is IArcNameRegistry {\n    error Unauthorized(bytes32 node, address caller);\n\n    struct Record {\n        address owner;\n        address resolver;\n        uint64 ttl;\n    }\n\n    mapping(bytes32 node => Record record) private _records;\n    mapping(address account => mapping(address operator => bool approved)) private _operators;\n\n    event Transfer(bytes32 indexed node, address owner);\n    event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\n    event NewResolver(bytes32 indexed node, address resolver);\n    event NewTTL(bytes32 indexed node, uint64 ttl);\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n    constructor(address rootOwner) {\n        if (rootOwner == address(0)) revert Unauthorized(bytes32(0), address(0));\n        _records[bytes32(0)].owner = rootOwner;\n        emit Transfer(bytes32(0), rootOwner);\n    }\n\n    modifier authorised(bytes32 node) {\n        address nodeOwner = _records[node].owner;\n        if (msg.sender != nodeOwner && !_operators[nodeOwner][msg.sender]) {\n            revert Unauthorized(node, msg.sender);\n        }\n        _;\n    }\n\n    function owner(bytes32 node) external view returns (address) {\n        return _records[node].owner;\n    }\n\n    function resolver(bytes32 node) external view returns (address) {\n        return _records[node].resolver;\n    }\n\n    function ttl(bytes32 node) external view returns (uint64) {\n        return _records[node].ttl;\n    }\n\n    function recordExists(bytes32 node) external view returns (bool) {\n        return _records[node].owner != address(0);\n    }\n\n    function isApprovedForAll(address account, address operator) external view returns (bool) {\n        return _operators[account][operator];\n    }\n\n    function setApprovalForAll(address operator, bool approved) external {\n        _operators[msg.sender][operator] = approved;\n        emit ApprovalForAll(msg.sender, operator, approved);\n    }\n\n    function setOwner(bytes32 node, address newOwner) external authorised(node) {\n        _records[node].owner = newOwner;\n        emit Transfer(node, newOwner);\n    }\n\n    function setSubnodeOwner(bytes32 node, bytes32 label, address newOwner)\n        external\n        authorised(node)\n        returns (bytes32 subnode)\n    {\n        subnode = keccak256(abi.encodePacked(node, label));\n        _records[subnode].owner = newOwner;\n        emit NewOwner(node, label, newOwner);\n    }\n\n    function setResolver(bytes32 node, address newResolver) external authorised(node) {\n        _records[node].resolver = newResolver;\n        emit NewResolver(node, newResolver);\n    }\n\n    function setTTL(bytes32 node, uint64 newTTL) external authorised(node) {\n        _records[node].ttl = newTTL;\n        emit NewTTL(node, newTTL);\n    }\n}\n\n","deployed_bytecode":"0x608060405234801561000f575f80fd5b50600436106100b9575f3560e01c80631896f70a11610072578063a22cb46511610058578063a22cb4651461020d578063e985e9c514610220578063f79fe53814610278575f80fd5b80631896f70a146101e75780635b0fc9c3146101fa575f80fd5b806306ab5923116100a257806306ab59231461015457806314ab90381461017557806316a25cbd1461018a575f80fd5b80630178b8bf146100bd57806302571be31461011f575b5f80fd5b6100f56100cb366004610850565b5f9081526020819052604090206001015473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f561012d366004610850565b5f9081526020819052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b61016761016236600461088f565b6102af565b604051908152602001610116565b6101886101833660046108c1565b61042d565b005b6101ce610198366004610850565b5f9081526020819052604090206001015474010000000000000000000000000000000000000000900467ffffffffffffffff1690565b60405167ffffffffffffffff9091168152602001610116565b6101886101f53660046108fb565b61056d565b6101886102083660046108fb565b610695565b61018861021b366004610925565b6107ba565b61026861022e366004610953565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205460ff1690565b6040519015158152602001610116565b610268610286366004610850565b5f9081526020819052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b5f83815260208190526040812054849073ffffffffffffffffffffffffffffffffffffffff16338114801590610315575073ffffffffffffffffffffffffffffffffffffffff81165f90815260016020908152604080832033845290915290205460ff16155b1561035a576040517f6f2ff527000000000000000000000000000000000000000000000000000000008152600481018390523360248201526044015b60405180910390fd5b6040805160208101889052908101869052606001604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815282825280516020918201205f8181528083529290922080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89169081179091558352909450869188917fce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e82910160405180910390a350509392505050565b5f82815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff16338114801590610493575073ffffffffffffffffffffffffffffffffffffffff81165f90815260016020908152604080832033845290915290205460ff16155b156104d3576040517f6f2ff52700000000000000000000000000000000000000000000000000000000815260048101839052336024820152604401610351565b5f848152602081815260409182902060010180547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff881690810291909117909155915191825285917f1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa6891015b60405180910390a250505050565b5f82815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff163381148015906105d3575073ffffffffffffffffffffffffffffffffffffffff81165f90815260016020908152604080832033845290915290205460ff16155b15610613576040517f6f2ff52700000000000000000000000000000000000000000000000000000000815260048101839052336024820152604401610351565b5f848152602081815260409182902060010180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8716908117909155915191825285917f335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a0910161055f565b5f82815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff163381148015906106fb575073ffffffffffffffffffffffffffffffffffffffff81165f90815260016020908152604080832033845290915290205460ff16155b1561073b576040517f6f2ff52700000000000000000000000000000000000000000000000000000000815260048101839052336024820152604401610351565b5f848152602081815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8716908117909155915191825285917fd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d266910161055f565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f60208284031215610860575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461088a575f80fd5b919050565b5f805f606084860312156108a1575f80fd5b83359250602084013591506108b860408501610867565b90509250925092565b5f80604083850312156108d2575f80fd5b82359150602083013567ffffffffffffffff811681146108f0575f80fd5b809150509250929050565b5f806040838503121561090c575f80fd5b8235915061091c60208401610867565b90509250929050565b5f8060408385031215610936575f80fd5b61093f83610867565b9150602083013580151581146108f0575f80fd5b5f8060408385031215610964575f80fd5b61096d83610867565b915061091c6020840161086756","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"evmVersion":"cancun","libraries":{},"metadata":{"appendCBOR":false,"bytecodeHash":"none","useLiteralContent":false},"optimizer":{"enabled":true,"runs":10000},"outputSelection":{"*":{"":["*"],"*":["*"]}},"viaIR":false},"optimization_runs":10000,"sourcify_repo_url":null,"decoded_constructor_args":[["0x78de409a6306550882328E2a67160471368387FF",{"internalType":"address","name":"rootOwner","type":"address"}]],"compiler_version":"v0.8.24+commit.e11b9ed9","is_verified_via_verifier_alliance":false,"verified_at":"2026-07-17T13:46:10.075681Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x608060405234801561000f575f80fd5b50604051610a94380380610a9483398101604081905261002e916100df565b6001600160a01b03811661006257604051636f2ff52760e01b81525f60048201819052602482015260440160405180910390fd5b5f80805260208181527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb580546001600160a01b0319166001600160a01b0385169081179091556040519081527fd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d266910160405180910390a25061010c565b5f602082840312156100ef575f80fd5b81516001600160a01b0381168114610105575f80fd5b9392505050565b61097b806101195f395ff3fe608060405234801561000f575f80fd5b50600436106100b9575f3560e01c80631896f70a11610072578063a22cb46511610058578063a22cb4651461020d578063e985e9c514610220578063f79fe53814610278575f80fd5b80631896f70a146101e75780635b0fc9c3146101fa575f80fd5b806306ab5923116100a257806306ab59231461015457806314ab90381461017557806316a25cbd1461018a575f80fd5b80630178b8bf146100bd57806302571be31461011f575b5f80fd5b6100f56100cb366004610850565b5f9081526020819052604090206001015473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100f561012d366004610850565b5f9081526020819052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b61016761016236600461088f565b6102af565b604051908152602001610116565b6101886101833660046108c1565b61042d565b005b6101ce610198366004610850565b5f9081526020819052604090206001015474010000000000000000000000000000000000000000900467ffffffffffffffff1690565b60405167ffffffffffffffff9091168152602001610116565b6101886101f53660046108fb565b61056d565b6101886102083660046108fb565b610695565b61018861021b366004610925565b6107ba565b61026861022e366004610953565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260016020908152604080832093909416825291909152205460ff1690565b6040519015158152602001610116565b610268610286366004610850565b5f9081526020819052604090205473ffffffffffffffffffffffffffffffffffffffff16151590565b5f83815260208190526040812054849073ffffffffffffffffffffffffffffffffffffffff16338114801590610315575073ffffffffffffffffffffffffffffffffffffffff81165f90815260016020908152604080832033845290915290205460ff16155b1561035a576040517f6f2ff527000000000000000000000000000000000000000000000000000000008152600481018390523360248201526044015b60405180910390fd5b6040805160208101889052908101869052606001604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815282825280516020918201205f8181528083529290922080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89169081179091558352909450869188917fce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e82910160405180910390a350509392505050565b5f82815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff16338114801590610493575073ffffffffffffffffffffffffffffffffffffffff81165f90815260016020908152604080832033845290915290205460ff16155b156104d3576040517f6f2ff52700000000000000000000000000000000000000000000000000000000815260048101839052336024820152604401610351565b5f848152602081815260409182902060010180547fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000067ffffffffffffffff881690810291909117909155915191825285917f1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa6891015b60405180910390a250505050565b5f82815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff163381148015906105d3575073ffffffffffffffffffffffffffffffffffffffff81165f90815260016020908152604080832033845290915290205460ff16155b15610613576040517f6f2ff52700000000000000000000000000000000000000000000000000000000815260048101839052336024820152604401610351565b5f848152602081815260409182902060010180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8716908117909155915191825285917f335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a0910161055f565b5f82815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff163381148015906106fb575073ffffffffffffffffffffffffffffffffffffffff81165f90815260016020908152604080832033845290915290205460ff16155b1561073b576040517f6f2ff52700000000000000000000000000000000000000000000000000000000815260048101839052336024820152604401610351565b5f848152602081815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8716908117909155915191825285917fd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d266910161055f565b335f81815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f60208284031215610860575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461088a575f80fd5b919050565b5f805f606084860312156108a1575f80fd5b83359250602084013591506108b860408501610867565b90509250925092565b5f80604083850312156108d2575f80fd5b82359150602083013567ffffffffffffffff811681146108f0575f80fd5b809150509250929050565b5f806040838503121561090c575f80fd5b8235915061091c60208401610867565b90509250929050565b5f8060408385031215610936575f80fd5b61093f83610867565b9150602083013580151581146108f0575f80fd5b5f8060408385031215610964575f80fd5b61096d83610867565b915061091c602084016108675600000000000000000000000078de409a6306550882328e2a67160471368387ff","name":"ArcNameRegistry","is_blueprint":false,"license_type":"none","is_fully_verified":false,"is_verified_via_eth_bytecode_db":true,"language":"solidity","evm_version":"cancun","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":false,"additional_sources":[{"file_path":"src/interfaces/IArcNameRegistry.sol","source_code":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.24;\n\ninterface IArcNameRegistry {\n    function owner(bytes32 node) external view returns (address);\n    function resolver(bytes32 node) external view returns (address);\n    function ttl(bytes32 node) external view returns (uint64);\n    function recordExists(bytes32 node) external view returns (bool);\n    function isApprovedForAll(address account, address operator) external view returns (bool);\n\n    function setOwner(bytes32 node, address newOwner) external;\n    function setSubnodeOwner(bytes32 node, bytes32 label, address newOwner)\n        external\n        returns (bytes32);\n    function setResolver(bytes32 node, address newResolver) external;\n    function setTTL(bytes32 node, uint64 newTTL) external;\n}\n\n"}],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[{"internalType":"address","name":"rootOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"caller","type":"address"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"label","type":"bytes32"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"NewOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"resolver","type":"address"}],"name":"NewResolver","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"ttl","type":"uint64"}],"name":"NewTTL","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"recordExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"resolver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"newResolver","type":"address"}],"name":"setResolver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"label","type":"bytes32"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"setSubnodeOwner","outputs":[{"internalType":"bytes32","name":"subnode","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint64","name":"newTTL","type":"uint64"}],"name":"setTTL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"ttl","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"}],"is_changed_bytecode":false,"is_partially_verified":true,"constructor_args":"00000000000000000000000078de409a6306550882328e2a67160471368387ff"}