编译器
0.8.17+commit.8df45f5f
文件 1 的 18:Address.sol
pragma solidity ^0.8.1;
library Address {
function isContract(address account) internal view returns (bool) {
return account.code.length > 0;
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
文件 2 的 18:BaseSubdomainRegistrar.sol
pragma solidity ^0.8.17;
import {INameWrapper, PARENT_CANNOT_CONTROL, IS_DOT_ETH} from "../wrapper/INameWrapper.sol";
import {Address} from "@openzeppelin/contracts/utils/Address.sol";
import {ISubdomainPricer} from "./pricers/ISubdomainPricer.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
error Unavailable();
error Unauthorised(bytes32 node);
error NameNotRegistered();
error InvalidTokenAddress(address);
error NameNotSetup(bytes32 node);
error DataMissing();
error ParentExpired(bytes32 node);
error ParentNotWrapped(bytes32 node);
error DurationTooLong(bytes32 node);
error ParentNameNotSetup(bytes32 parentNode);
struct Name {
ISubdomainPricer pricer;
address beneficiary;
bool active;
}
abstract contract BaseSubdomainRegistrar {
mapping(bytes32 => Name) public names;
INameWrapper public immutable wrapper;
using Address for address;
event NameRegistered(bytes32 node, uint256 expiry);
event NameRenewed(bytes32 node, uint256 expiry);
event NameSetup(
bytes32 node,
address pricer,
address beneficiary,
bool active
);
uint64 internal GRACE_PERIOD = 90 days;
constructor(address _wrapper) {
wrapper = INameWrapper(_wrapper);
}
modifier authorised(bytes32 node) {
if (!wrapper.canModifyName(node, msg.sender)) {
revert Unauthorised(node);
}
_;
}
modifier canBeRegistered(bytes32 parentNode, uint64 duration) {
_checkParent(parentNode, duration);
_;
}
function available(bytes32 node) public view virtual returns (bool) {
try wrapper.getData(uint256(node)) returns (
address,
uint32,
uint64 expiry
) {
return expiry < block.timestamp;
} catch {
return true;
}
}
function _setupDomain(
bytes32 node,
ISubdomainPricer pricer,
address beneficiary,
bool active
) internal virtual authorised(node) {
names[node] = Name({
pricer: pricer,
beneficiary: beneficiary,
active: active
});
emit NameSetup(node, address(pricer), beneficiary, active);
}
function _batchRegister(
bytes32 parentNode,
string[] calldata labels,
address[] calldata addresses,
address resolver,
uint16 fuses,
uint64 duration,
bytes[][] calldata records
) internal {
if (
labels.length != addresses.length || labels.length != records.length
) {
revert DataMissing();
}
if (!names[parentNode].active) {
revert ParentNameNotSetup(parentNode);
}
_checkParent(parentNode, duration);
_batchPayBeneficiary(parentNode, labels, duration);
for (uint256 i = 0; i < labels.length; i++) {
_register(
parentNode,
labels[i],
addresses[i],
resolver,
fuses,
uint64(block.timestamp) + duration,
records[i]
);
}
}
function register(
bytes32 parentNode,
string calldata label,
address newOwner,
address resolver,
uint32 fuses,
uint64 duration,
bytes[] calldata records
) internal {
if (!names[parentNode].active) {
revert ParentNameNotSetup(parentNode);
}
(address token, uint256 fee) = ISubdomainPricer(
names[parentNode].pricer
).price(parentNode, label, duration);
_checkParent(parentNode, duration);
if (fee > 0) {
IERC20(token).transferFrom(
msg.sender,
address(names[parentNode].beneficiary),
fee
);
}
_register(
parentNode,
label,
newOwner,
resolver,
fuses,
uint64(block.timestamp) + duration,
records
);
}
function _register(
bytes32 parentNode,
string calldata label,
address newOwner,
address resolver,
uint32 fuses,
uint64 expiry,
bytes[] calldata records
) internal {
bytes32 node = keccak256(
abi.encodePacked(parentNode, keccak256(bytes(label)))
);
if (!available(node)) {
revert Unavailable();
}
if (records.length > 0) {
wrapper.setSubnodeOwner(
parentNode,
label,
address(this),
0,
expiry
);
_setRecords(node, resolver, records);
}
wrapper.setSubnodeRecord(
parentNode,
label,
newOwner,
resolver,
0,
fuses | PARENT_CANNOT_CONTROL,
expiry
);
emit NameRegistered(node, expiry);
}
function _batchPayBeneficiary(
bytes32 parentNode,
string[] calldata labels,
uint64 duration
) internal {
ISubdomainPricer pricer = names[parentNode].pricer;
for (uint256 i = 0; i < labels.length; i++) {
(address token, uint256 price) = pricer.price(
parentNode,
labels[i],
duration
);
IERC20(token).transferFrom(
msg.sender,
names[parentNode].beneficiary,
price
);
}
}
function _setRecords(
bytes32 node,
address resolver,
bytes[] calldata records
) internal {
for (uint256 i = 0; i < records.length; i++) {
bytes32 txNamehash = bytes32(records[i][4:36]);
require(
txNamehash == node,
"SubdomainRegistrar: Namehash on record do not match the name being registered"
);
resolver.functionCall(
records[i],
"SubdomainRegistrar: Failed to set Record"
);
}
}
function _checkParent(bytes32 parentNode, uint64 duration) internal view {
uint64 parentExpiry;
try wrapper.getData(uint256(parentNode)) returns (
address,
uint32 fuses,
uint64 expiry
) {
if (fuses & IS_DOT_ETH == IS_DOT_ETH) {
expiry = expiry - GRACE_PERIOD;
}
if (block.timestamp > expiry) {
revert ParentExpired(parentNode);
}
parentExpiry = expiry;
} catch {
revert ParentNotWrapped(parentNode);
}
if (duration + block.timestamp > parentExpiry) {
revert DurationTooLong(parentNode);
}
}
}
文件 3 的 18:ENS.sol
pragma solidity >=0.8.4;
interface ENS {
event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);
event Transfer(bytes32 indexed node, address owner);
event NewResolver(bytes32 indexed node, address resolver);
event NewTTL(bytes32 indexed node, uint64 ttl);
event ApprovalForAll(
address indexed owner,
address indexed operator,
bool approved
);
function setRecord(
bytes32 node,
address owner,
address resolver,
uint64 ttl
) external;
function setSubnodeRecord(
bytes32 node,
bytes32 label,
address owner,
address resolver,
uint64 ttl
) external;
function setSubnodeOwner(
bytes32 node,
bytes32 label,
address owner
) external returns (bytes32);
function setResolver(bytes32 node, address resolver) external;
function setOwner(bytes32 node, address owner) external;
function setTTL(bytes32 node, uint64 ttl) external;
function setApprovalForAll(address operator, bool approved) external;
function owner(bytes32 node) external view returns (address);
function resolver(bytes32 node) external view returns (address);
function ttl(bytes32 node) external view returns (uint64);
function recordExists(bytes32 node) external view returns (bool);
function isApprovedForAll(
address owner,
address operator
) external view returns (bool);
}
文件 4 的 18:ERC1155Holder.sol
pragma solidity ^0.8.0;
import "./ERC1155Receiver.sol";
contract ERC1155Holder is ERC1155Receiver {
function onERC1155Received(
address,
address,
uint256,
uint256,
bytes memory
) public virtual override returns (bytes4) {
return this.onERC1155Received.selector;
}
function onERC1155BatchReceived(
address,
address,
uint256[] memory,
uint256[] memory,
bytes memory
) public virtual override returns (bytes4) {
return this.onERC1155BatchReceived.selector;
}
}
文件 5 的 18:ERC1155Receiver.sol
pragma solidity ^0.8.0;
import "../IERC1155Receiver.sol";
import "../../../utils/introspection/ERC165.sol";
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);
}
}
文件 6 的 18:ERC165.sol
pragma solidity ^0.8.0;
import "./IERC165.sol";
abstract contract ERC165 is IERC165 {
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
文件 7 的 18:ForeverSubdomainRegistrar.sol
pragma solidity ^0.8.17;
import {INameWrapper, IS_DOT_ETH, PARENT_CANNOT_CONTROL, CAN_EXTEND_EXPIRY} from "../wrapper/INameWrapper.sol";
import {Address} from "@openzeppelin/contracts/utils/Address.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {ERC1155Holder} from "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";
import {BaseSubdomainRegistrar, DataMissing, Unavailable, NameNotRegistered} from "./BaseSubdomainRegistrar.sol";
import {IForeverSubdomainRegistrar} from "./IForeverSubdomainRegistrar.sol";
import {ISubdomainPricer} from "./pricers/ISubdomainPricer.sol";
error ParentNameNotSetup(bytes32 parentNode);
contract ForeverSubdomainRegistrar is
BaseSubdomainRegistrar,
ERC1155Holder,
IForeverSubdomainRegistrar
{
constructor(address wrapper) BaseSubdomainRegistrar(wrapper) {}
bytes32 private constant ETH_NODE =
0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae;
function register(
bytes32 parentNode,
string calldata label,
address newOwner,
address resolver,
uint16 fuses,
bytes[] calldata records
) public payable {
(, uint32 parentFuses, uint64 expiry) = wrapper.getData(
uint256(parentNode)
);
uint64 duration = expiry - uint64(block.timestamp);
if (parentFuses & IS_DOT_ETH == IS_DOT_ETH) {
duration = duration - GRACE_PERIOD;
}
super.register(
parentNode,
label,
newOwner,
resolver,
CAN_EXTEND_EXPIRY | PARENT_CANNOT_CONTROL | uint32(fuses),
duration,
records
);
}
function setupDomain(
bytes32 node,
ISubdomainPricer pricer,
address beneficiary,
bool active
) public override authorised(node) {
_setupDomain(node, pricer, beneficiary, active);
}
function available(
bytes32 node
)
public
view
override(BaseSubdomainRegistrar, IForeverSubdomainRegistrar)
returns (bool)
{
return super.available(node);
}
}
文件 8 的 18:IBaseRegistrar.sol
pragma solidity ^0.8.17;
import "../registry/ENS.sol";
import "./IBaseRegistrar.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
interface IBaseRegistrar is IERC721 {
event ControllerAdded(address indexed controller);
event ControllerRemoved(address indexed controller);
event NameMigrated(
uint256 indexed id,
address indexed owner,
uint256 expires
);
event NameRegistered(
uint256 indexed id,
address indexed owner,
uint256 expires
);
event NameRenewed(uint256 indexed id, uint256 expires);
function addController(address controller) external;
function removeController(address controller) external;
function setResolver(address resolver) external;
function nameExpires(uint256 id) external view returns (uint256);
function available(uint256 id) external view returns (bool);
function register(
uint256 id,
address owner,
uint256 duration
) external returns (uint256);
function renew(uint256 id, uint256 duration) external returns (uint256);
function reclaim(uint256 id, address owner) external;
}
文件 9 的 18:IERC1155.sol
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
interface IERC1155 is IERC165 {
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
event TransferBatch(
address indexed operator,
address indexed from,
address indexed to,
uint256[] ids,
uint256[] values
);
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
event URI(string value, uint256 indexed id);
function balanceOf(address account, uint256 id) external view returns (uint256);
function balanceOfBatch(
address[] calldata accounts,
uint256[] calldata ids
) external view returns (uint256[] memory);
function setApprovalForAll(address operator, bool approved) external;
function isApprovedForAll(address account, address operator) external view returns (bool);
function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;
function safeBatchTransferFrom(
address from,
address to,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) external;
}
文件 10 的 18:IERC1155Receiver.sol
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
interface IERC1155Receiver is IERC165 {
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
) external returns (bytes4);
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
) external returns (bytes4);
}
文件 11 的 18:IERC165.sol
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 12 的 18:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
文件 13 的 18:IERC721.sol
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
interface IERC721 is IERC165 {
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
function balanceOf(address owner) external view returns (uint256 balance);
function ownerOf(uint256 tokenId) external view returns (address owner);
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
function safeTransferFrom(address from, address to, uint256 tokenId) external;
function transferFrom(address from, address to, uint256 tokenId) external;
function approve(address to, uint256 tokenId) external;
function setApprovalForAll(address operator, bool approved) external;
function getApproved(uint256 tokenId) external view returns (address operator);
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
文件 14 的 18:IForeverSubdomainRegistrar.sol
pragma solidity ^0.8.15;
import {ISubdomainPricer} from "./pricers/ISubdomainPricer.sol";
interface IForeverSubdomainRegistrar {
function setupDomain(
bytes32 node,
ISubdomainPricer pricer,
address beneficiary,
bool active
) external;
function register(
bytes32 parentNode,
string calldata label,
address newOwner,
address resolver,
uint16 ownerControlledfuses,
bytes[] calldata records
) external payable;
function available(bytes32 node) external view returns (bool);
}
文件 15 的 18:IMetadataService.sol
pragma solidity ~0.8.17;
interface IMetadataService {
function uri(uint256) external view returns (string memory);
}
文件 16 的 18:INameWrapper.sol
pragma solidity ~0.8.17;
import "../registry/ENS.sol";
import "../ethregistrar/IBaseRegistrar.sol";
import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import "./IMetadataService.sol";
import "./INameWrapperUpgrade.sol";
uint32 constant CANNOT_UNWRAP = 1;
uint32 constant CANNOT_BURN_FUSES = 2;
uint32 constant CANNOT_TRANSFER = 4;
uint32 constant CANNOT_SET_RESOLVER = 8;
uint32 constant CANNOT_SET_TTL = 16;
uint32 constant CANNOT_CREATE_SUBDOMAIN = 32;
uint32 constant CANNOT_APPROVE = 64;
uint32 constant PARENT_CANNOT_CONTROL = 1 << 16;
uint32 constant IS_DOT_ETH = 1 << 17;
uint32 constant CAN_EXTEND_EXPIRY = 1 << 18;
uint32 constant CAN_DO_EVERYTHING = 0;
uint32 constant PARENT_CONTROLLED_FUSES = 0xFFFF0000;
uint32 constant USER_SETTABLE_FUSES = 0xFFFDFFFF;
interface INameWrapper is IERC1155 {
event NameWrapped(
bytes32 indexed node,
bytes name,
address owner,
uint32 fuses,
uint64 expiry
);
event NameUnwrapped(bytes32 indexed node, address owner);
event FusesSet(bytes32 indexed node, uint32 fuses);
event ExpiryExtended(bytes32 indexed node, uint64 expiry);
function ens() external view returns (ENS);
function registrar() external view returns (IBaseRegistrar);
function metadataService() external view returns (IMetadataService);
function names(bytes32) external view returns (bytes memory);
function name() external view returns (string memory);
function upgradeContract() external view returns (INameWrapperUpgrade);
function supportsInterface(bytes4 interfaceID) external view returns (bool);
function wrap(
bytes calldata name,
address wrappedOwner,
address resolver
) external;
function wrapETH2LD(
string calldata label,
address wrappedOwner,
uint16 ownerControlledFuses,
address resolver
) external returns (uint64 expires);
function registerAndWrapETH2LD(
string calldata label,
address wrappedOwner,
uint256 duration,
address resolver,
uint16 ownerControlledFuses
) external returns (uint256 registrarExpiry);
function renew(
uint256 labelHash,
uint256 duration
) external returns (uint256 expires);
function unwrap(bytes32 node, bytes32 label, address owner) external;
function unwrapETH2LD(
bytes32 label,
address newRegistrant,
address newController
) external;
function upgrade(bytes calldata name, bytes calldata extraData) external;
function setFuses(
bytes32 node,
uint16 ownerControlledFuses
) external returns (uint32 newFuses);
function setChildFuses(
bytes32 parentNode,
bytes32 labelhash,
uint32 fuses,
uint64 expiry
) external;
function setSubnodeRecord(
bytes32 node,
string calldata label,
address owner,
address resolver,
uint64 ttl,
uint32 fuses,
uint64 expiry
) external returns (bytes32);
function setRecord(
bytes32 node,
address owner,
address resolver,
uint64 ttl
) external;
function setSubnodeOwner(
bytes32 node,
string calldata label,
address newOwner,
uint32 fuses,
uint64 expiry
) external returns (bytes32);
function extendExpiry(
bytes32 node,
bytes32 labelhash,
uint64 expiry
) external returns (uint64);
function canModifyName(
bytes32 node,
address addr
) external view returns (bool);
function setResolver(bytes32 node, address resolver) external;
function setTTL(bytes32 node, uint64 ttl) external;
function ownerOf(uint256 id) external view returns (address owner);
function approve(address to, uint256 tokenId) external;
function getApproved(uint256 tokenId) external view returns (address);
function getData(
uint256 id
) external view returns (address, uint32, uint64);
function setMetadataService(IMetadataService _metadataService) external;
function uri(uint256 tokenId) external view returns (string memory);
function setUpgradeContract(INameWrapperUpgrade _upgradeAddress) external;
function allFusesBurned(
bytes32 node,
uint32 fuseMask
) external view returns (bool);
function isWrapped(bytes32) external view returns (bool);
function isWrapped(bytes32, bytes32) external view returns (bool);
}
文件 17 的 18:INameWrapperUpgrade.sol
pragma solidity ~0.8.17;
interface INameWrapperUpgrade {
function wrapFromUpgrade(
bytes calldata name,
address wrappedOwner,
uint32 fuses,
uint64 expiry,
address approved,
bytes calldata extraData
) external;
}
文件 18 的 18:ISubdomainPricer.sol
pragma solidity ^0.8.17;
interface ISubdomainPricer {
function price(
bytes32 parentNode,
string calldata label,
uint256 duration
) external view returns (address token, uint256 price);
}
{
"compilationTarget": {
"project:/contracts/ForeverSubdomainRegistrar.sol": "ForeverSubdomainRegistrar"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"wrapper","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"DurationTooLong","type":"error"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"ParentExpired","type":"error"},{"inputs":[{"internalType":"bytes32","name":"parentNode","type":"bytes32"}],"name":"ParentNameNotSetup","type":"error"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"ParentNotWrapped","type":"error"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"Unauthorised","type":"error"},{"inputs":[],"name":"Unavailable","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"expiry","type":"uint256"}],"name":"NameRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"expiry","type":"uint256"}],"name":"NameRenewed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"pricer","type":"address"},{"indexed":false,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"bool","name":"active","type":"bool"}],"name":"NameSetup","type":"event"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"available","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"names","outputs":[{"internalType":"contract ISubdomainPricer","name":"pricer","type":"address"},{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"parentNode","type":"bytes32"},{"internalType":"string","name":"label","type":"string"},{"internalType":"address","name":"newOwner","type":"address"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"uint16","name":"fuses","type":"uint16"},{"internalType":"bytes[]","name":"records","type":"bytes[]"}],"name":"register","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"contract ISubdomainPricer","name":"pricer","type":"address"},{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"bool","name":"active","type":"bool"}],"name":"setupDomain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wrapper","outputs":[{"internalType":"contract INameWrapper","name":"","type":"address"}],"stateMutability":"view","type":"function"}]