Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 294 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Register | 21708462 | 27 hrs ago | IN | 0 ETH | 0.00026992 | ||||
Register | 21708461 | 27 hrs ago | IN | 0 ETH | 0.00027569 | ||||
Register | 21708461 | 27 hrs ago | IN | 0 ETH | 0.00071274 | ||||
Register | 21668431 | 6 days ago | IN | 0 ETH | 0.00412589 | ||||
Register | 21133363 | 81 days ago | IN | 0 ETH | 0.0026889 | ||||
Register | 21100593 | 86 days ago | IN | 0 ETH | 0.00147683 | ||||
Register | 21100565 | 86 days ago | IN | 0 ETH | 0.00140314 | ||||
Register | 20703411 | 141 days ago | IN | 0 ETH | 0.00030032 | ||||
Register | 20612463 | 154 days ago | IN | 0 ETH | 0.00043935 | ||||
Register | 20507201 | 168 days ago | IN | 0 ETH | 0.00037372 | ||||
Register | 20507162 | 168 days ago | IN | 0 ETH | 0.00027132 | ||||
Register | 20502567 | 169 days ago | IN | 0 ETH | 0.00021037 | ||||
Setup Domain | 20502426 | 169 days ago | IN | 0 ETH | 0.0000706 | ||||
Register | 20444178 | 177 days ago | IN | 0 ETH | 0.00050696 | ||||
Register | 20386017 | 185 days ago | IN | 0 ETH | 0.00087685 | ||||
Register | 20381145 | 186 days ago | IN | 0 ETH | 0.00079923 | ||||
Register | 20355892 | 189 days ago | IN | 0 ETH | 0.00116655 | ||||
Register | 20355886 | 189 days ago | IN | 0 ETH | 0.00120938 | ||||
Register | 20355882 | 189 days ago | IN | 0 ETH | 0.00126267 | ||||
Register | 20355876 | 189 days ago | IN | 0 ETH | 0.00125195 | ||||
Register | 20355867 | 189 days ago | IN | 0 ETH | 0.00121421 | ||||
Register | 20355861 | 189 days ago | IN | 0 ETH | 0.00122458 | ||||
Register | 20355854 | 189 days ago | IN | 0 ETH | 0.00123327 | ||||
Register | 20355843 | 189 days ago | IN | 0 ETH | 0.00123628 | ||||
Register | 20355835 | 189 days ago | IN | 0 ETH | 0.00115416 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
ForeverSubdomainRegistrar
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
No with 200 runs
Other Settings:
london EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT 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); } }
//SPDX-License-Identifier: MIT pragma solidity ~0.8.17; interface INameWrapperUpgrade { function wrapFromUpgrade( bytes calldata name, address wrappedOwner, uint32 fuses, uint64 expiry, address approved, bytes calldata extraData ) external; }
//SPDX-License-Identifier: MIT 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; //uint16 reserved for parent controlled fuses from bit 17 to bit 32 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; // all fuses apart from IS_DOT_ETH 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); }
//SPDX-License-Identifier: MIT pragma solidity ~0.8.17; interface IMetadataService { function uri(uint256) external view returns (string memory); }
//SPDX-License-Identifier: MIT pragma solidity >=0.8.4; interface ENS { // Logged when the owner of a node assigns a new owner to a subnode. event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner); // Logged when the owner of a node transfers ownership to a new account. event Transfer(bytes32 indexed node, address owner); // Logged when the resolver for a node changes. event NewResolver(bytes32 indexed node, address resolver); // Logged when the TTL of a node changes event NewTTL(bytes32 indexed node, uint64 ttl); // Logged when an operator is added or removed. 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); }
//SPDX-License-Identifier: MIT 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); // Authorises a controller, who can register and renew domains. function addController(address controller) external; // Revoke controller permission for an address. function removeController(address controller) external; // Set the resolver for the TLD this registrar manages. function setResolver(address resolver) external; // Returns the expiration timestamp of the specified label hash. function nameExpires(uint256 id) external view returns (uint256); // Returns true if the specified name is available for registration. function available(uint256 id) external view returns (bool); /** * @dev Register a name. */ function register( uint256 id, address owner, uint256 duration ) external returns (uint256); function renew(uint256 id, uint256 duration) external returns (uint256); /** * @dev Reclaim ownership of a name in ENS, if you own it in the registrar. */ function reclaim(uint256 id, address owner) external; }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.17; interface ISubdomainPricer { function price( bytes32 parentNode, string calldata label, uint256 duration ) external view returns (address token, uint256 price); }
//SPDX-License-Identifier: MIT 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); }
//SPDX-License-Identifier: MIT 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); //double loop to prevent re-entrancy because _register calls user supplied functions 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 ); } /* Internal Functions */ 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, // burn the ability for the parent to 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++) { // check first few bytes are namehash 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); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ 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"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ 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"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ 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); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ 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); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ 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); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ 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 { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol) pragma solidity ^0.8.0; import "../IERC1155Receiver.sol"; import "../../../utils/introspection/ERC165.sol"; /** * @dev _Available since v3.1._ */ abstract contract ERC1155Receiver is ERC165, IERC1155Receiver { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/utils/ERC1155Holder.sol) pragma solidity ^0.8.0; import "./ERC1155Receiver.sol"; /** * Simple implementation of `ERC1155Receiver` that will allow a contract to hold ERC1155 tokens. * * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be * stuck. * * @dev _Available since v3.1._ */ 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch( address[] calldata accounts, uint256[] calldata ids ) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
{ "remappings": [], "optimizer": { "enabled": false, "runs": 200 }, "evmVersion": "london", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
60a06040526276a700600160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055503480156200003d57600080fd5b50604051620027793803806200277983398181016040528101906200006391906200010a565b808073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505050506200013c565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000d282620000a5565b9050919050565b620000e481620000c5565b8114620000f057600080fd5b50565b6000815190506200010481620000d9565b92915050565b600060208284031215620001235762000122620000a0565b5b60006200013384828501620000f3565b91505092915050565b6080516125f062000189600039600081816103290152818161041901528181610455015281816105f4015281816106b001528181610af101528181610d550152610e0a01526125f06000f3fe60806040526004361061007b5760003560e01c8063ac210cc71161004e578063ac210cc714610162578063bc197c811461018d578063ee423a65146101ca578063f23a6e61146101e65761007b565b806301ffc9a71461008057806320c38e2b146100bd5780636932854f146100fc5780639625e02014610139575b600080fd5b34801561008c57600080fd5b506100a760048036038101906100a29190611293565b610223565b6040516100b491906112db565b60405180910390f35b3480156100c957600080fd5b506100e460048036038101906100df919061132c565b61029d565b6040516100f3939291906113f9565b60405180910390f35b34801561010857600080fd5b50610123600480360381019061011e919061132c565b610314565b60405161013091906112db565b60405180910390f35b34801561014557600080fd5b50610160600480360381019061015b91906114c6565b610326565b005b34801561016e57600080fd5b50610177610417565b604051610184919061154e565b60405180910390f35b34801561019957600080fd5b506101b460048036038101906101af91906117ad565b61043b565b6040516101c1919061188b565b60405180910390f35b6101e460048036038101906101df9190611991565b610450565b005b3480156101f257600080fd5b5061020d60048036038101906102089190611a60565b610571565b60405161021a919061188b565b60405180910390f35b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610296575061029582610586565b5b9050919050565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160149054906101000a900460ff16905083565b600061031f826105f0565b9050919050565b837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166341415eab82336040518363ffffffff1660e01b8152600401610382929190611b06565b602060405180830381865afa15801561039f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c39190611b44565b61040457806040517fe4fd57ae0000000000000000000000000000000000000000000000000000000081526004016103fb9190611b71565b60405180910390fd5b610410858585856106ad565b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063bc197c8160e01b905095945050505050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630178fe3f8b60001c6040518263ffffffff1660e01b81526004016104af9190611b9b565b606060405180830381865afa1580156104cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f09190611c47565b9250925050600042826105039190611cc9565b90506202000063ffffffff1662020000841663ffffffff160361054557600160009054906101000a900467ffffffffffffffff16816105429190611cc9565b90505b6105648b8b8b8b8b8b61ffff1662010000620400001717878c8c6108db565b5050505050505050505050565b600063f23a6e6160e01b905095945050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630178fe3f8360001c6040518263ffffffff1660e01b815260040161064e9190611b9b565b606060405180830381865afa92505050801561068857506040513d601f19601f820116820180604052508101906106859190611c47565b60015b61069557600190506106a8565b428167ffffffffffffffff161093505050505b919050565b837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166341415eab82336040518363ffffffff1660e01b8152600401610709929190611b06565b602060405180830381865afa158015610726573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074a9190611b44565b61078b57806040517fe4fd57ae0000000000000000000000000000000000000000000000000000000081526004016107829190611b71565b60405180910390fd5b60405180606001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183151581525060008087815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160146101000a81548160ff0219169083151502179055509050507f32d5b5044e29ac0aed3aa0563341507ed6a591bf10837678ce9ba4ee06b4a4b9858585856040516108cc9493929190611d05565b60405180910390a15050505050565b6000808a815260200190815260200160002060010160149054906101000a900460ff1661093f57886040517f7f09c7c80000000000000000000000000000000000000000000000000000000081526004016109369190611b71565b60405180910390fd5b6000806000808c815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638847fbc98c8c8c896040518563ffffffff1660e01b81526004016109b69493929190611db9565b6040805180830381865afa1580156109d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f69190611e0e565b91509150610a048b86610aed565b6000811115610ac4578173ffffffffffffffffffffffffffffffffffffffff166323b872dd336000808f815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b8152600401610a7f93929190611e4e565b6020604051808303816000875af1158015610a9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac29190611b44565b505b610ae08b8b8b8b8b8b8b42610ad99190611e85565b8b8b610cc4565b5050505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630178fe3f8460001c6040518263ffffffff1660e01b8152600401610b4b9190611b9b565b606060405180830381865afa925050508015610b8557506040513d601f19601f82011682018060405250810190610b829190611c47565b60015b610bc657826040517fe237ec53000000000000000000000000000000000000000000000000000000008152600401610bbd9190611b71565b60405180910390fd5b6202000063ffffffff1662020000831663ffffffff1603610c0657600160009054906101000a900467ffffffffffffffff1681610c039190611cc9565b90505b8067ffffffffffffffff16421115610c5557856040517f3476d65d000000000000000000000000000000000000000000000000000000008152600401610c4c9190611b71565b60405180910390fd5b8093505050508067ffffffffffffffff16428367ffffffffffffffff16610c7c9190611ec1565b1115610cbf57826040517f50a34530000000000000000000000000000000000000000000000000000000008152600401610cb69190611b71565b60405180910390fd5b505050565b6000898989604051610cd7929190611f25565b6040518091039020604051602001610cf0929190611f5f565b604051602081830303815290604052805190602001209050610d1181610314565b610d47576040517fa3b8915f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838390501115610e08577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c658e0868b8b8b3060008a6040518763ffffffff1660e01b8152600401610db796959493929190611fd5565b6020604051808303816000875af1158015610dd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfa9190612046565b50610e0781878585610efe565b5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166324c1af448b8b8b8b8b6000620100008d178c6040518963ffffffff1660e01b8152600401610e759897969594939291906120b3565b6020604051808303816000875af1158015610e94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb89190612046565b507fabce831762b197a806fc33373c356d5ff4d7d0d34ad31f6eb2ace003e27958cd8185604051610eea92919061212b565b60405180910390a150505050505050505050565b60005b82829050811015611053576000838383818110610f2157610f20612154565b5b9050602002810190610f339190612192565b600490602492610f45939291906121ff565b90610f509190612252565b9050858114610f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8b90612349565b60405180910390fd5b61103e848484818110610faa57610fa9612154565b5b9050602002810190610fbc9190612192565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050604051806060016040528060288152602001612593602891398773ffffffffffffffffffffffffffffffffffffffff1661105a9092919063ffffffff16565b5050808061104b90612369565b915050610f01565b5050505050565b60606110698484600085611072565b90509392505050565b6060824710156110b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ae90612423565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516110e091906124a9565b60006040518083038185875af1925050503d806000811461111d576040519150601f19603f3d011682016040523d82523d6000602084013e611122565b606091505b50915091506111338783838761113f565b92505050949350505050565b606083156111a157600083510361119957611159856111b4565b611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f9061250c565b60405180910390fd5b5b8290506111ac565b6111ab83836111d7565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000825111156111ea5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e9190612570565b60405180910390fd5b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6112708161123b565b811461127b57600080fd5b50565b60008135905061128d81611267565b92915050565b6000602082840312156112a9576112a8611231565b5b60006112b78482850161127e565b91505092915050565b60008115159050919050565b6112d5816112c0565b82525050565b60006020820190506112f060008301846112cc565b92915050565b6000819050919050565b611309816112f6565b811461131457600080fd5b50565b60008135905061132681611300565b92915050565b60006020828403121561134257611341611231565b5b600061135084828501611317565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061139e61139961139484611359565b611379565b611359565b9050919050565b60006113b082611383565b9050919050565b60006113c2826113a5565b9050919050565b6113d2816113b7565b82525050565b60006113e382611359565b9050919050565b6113f3816113d8565b82525050565b600060608201905061140e60008301866113c9565b61141b60208301856113ea565b61142860408301846112cc565b949350505050565b600061143b826113d8565b9050919050565b61144b81611430565b811461145657600080fd5b50565b60008135905061146881611442565b92915050565b611477816113d8565b811461148257600080fd5b50565b6000813590506114948161146e565b92915050565b6114a3816112c0565b81146114ae57600080fd5b50565b6000813590506114c08161149a565b92915050565b600080600080608085870312156114e0576114df611231565b5b60006114ee87828801611317565b94505060206114ff87828801611459565b935050604061151087828801611485565b9250506060611521878288016114b1565b91505092959194509250565b6000611538826113a5565b9050919050565b6115488161152d565b82525050565b6000602082019050611563600083018461153f565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6115b78261156e565b810181811067ffffffffffffffff821117156115d6576115d561157f565b5b80604052505050565b60006115e9611227565b90506115f582826115ae565b919050565b600067ffffffffffffffff8211156116155761161461157f565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b61163e8161162b565b811461164957600080fd5b50565b60008135905061165b81611635565b92915050565b600061167461166f846115fa565b6115df565b9050808382526020820190506020840283018581111561169757611696611626565b5b835b818110156116c057806116ac888261164c565b845260208401935050602081019050611699565b5050509392505050565b600082601f8301126116df576116de611569565b5b81356116ef848260208601611661565b91505092915050565b600080fd5b600067ffffffffffffffff8211156117185761171761157f565b5b6117218261156e565b9050602081019050919050565b82818337600083830152505050565b600061175061174b846116fd565b6115df565b90508281526020810184848401111561176c5761176b6116f8565b5b61177784828561172e565b509392505050565b600082601f83011261179457611793611569565b5b81356117a484826020860161173d565b91505092915050565b600080600080600060a086880312156117c9576117c8611231565b5b60006117d788828901611485565b95505060206117e888828901611485565b945050604086013567ffffffffffffffff81111561180957611808611236565b5b611815888289016116ca565b935050606086013567ffffffffffffffff81111561183657611835611236565b5b611842888289016116ca565b925050608086013567ffffffffffffffff81111561186357611862611236565b5b61186f8882890161177f565b9150509295509295909350565b6118858161123b565b82525050565b60006020820190506118a0600083018461187c565b92915050565b600080fd5b60008083601f8401126118c1576118c0611569565b5b8235905067ffffffffffffffff8111156118de576118dd6118a6565b5b6020830191508360018202830111156118fa576118f9611626565b5b9250929050565b600061ffff82169050919050565b61191881611901565b811461192357600080fd5b50565b6000813590506119358161190f565b92915050565b60008083601f84011261195157611950611569565b5b8235905067ffffffffffffffff81111561196e5761196d6118a6565b5b60208301915083602082028301111561198a57611989611626565b5b9250929050565b60008060008060008060008060c0898b0312156119b1576119b0611231565b5b60006119bf8b828c01611317565b985050602089013567ffffffffffffffff8111156119e0576119df611236565b5b6119ec8b828c016118ab565b975097505060406119ff8b828c01611485565b9550506060611a108b828c01611485565b9450506080611a218b828c01611926565b93505060a089013567ffffffffffffffff811115611a4257611a41611236565b5b611a4e8b828c0161193b565b92509250509295985092959890939650565b600080600080600060a08688031215611a7c57611a7b611231565b5b6000611a8a88828901611485565b9550506020611a9b88828901611485565b9450506040611aac8882890161164c565b9350506060611abd8882890161164c565b925050608086013567ffffffffffffffff811115611ade57611add611236565b5b611aea8882890161177f565b9150509295509295909350565b611b00816112f6565b82525050565b6000604082019050611b1b6000830185611af7565b611b2860208301846113ea565b9392505050565b600081519050611b3e8161149a565b92915050565b600060208284031215611b5a57611b59611231565b5b6000611b6884828501611b2f565b91505092915050565b6000602082019050611b866000830184611af7565b92915050565b611b958161162b565b82525050565b6000602082019050611bb06000830184611b8c565b92915050565b600081519050611bc58161146e565b92915050565b600063ffffffff82169050919050565b611be481611bcb565b8114611bef57600080fd5b50565b600081519050611c0181611bdb565b92915050565b600067ffffffffffffffff82169050919050565b611c2481611c07565b8114611c2f57600080fd5b50565b600081519050611c4181611c1b565b92915050565b600080600060608486031215611c6057611c5f611231565b5b6000611c6e86828701611bb6565b9350506020611c7f86828701611bf2565b9250506040611c9086828701611c32565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611cd482611c07565b9150611cdf83611c07565b9250828203905067ffffffffffffffff811115611cff57611cfe611c9a565b5b92915050565b6000608082019050611d1a6000830187611af7565b611d2760208301866113ea565b611d3460408301856113ea565b611d4160608301846112cc565b95945050505050565b600082825260208201905092915050565b6000611d678385611d4a565b9350611d7483858461172e565b611d7d8361156e565b840190509392505050565b6000611da3611d9e611d9984611c07565b611379565b61162b565b9050919050565b611db381611d88565b82525050565b6000606082019050611dce6000830187611af7565b8181036020830152611de1818587611d5b565b9050611df06040830184611daa565b95945050505050565b600081519050611e0881611635565b92915050565b60008060408385031215611e2557611e24611231565b5b6000611e3385828601611bb6565b9250506020611e4485828601611df9565b9150509250929050565b6000606082019050611e6360008301866113ea565b611e7060208301856113ea565b611e7d6040830184611b8c565b949350505050565b6000611e9082611c07565b9150611e9b83611c07565b9250828201905067ffffffffffffffff811115611ebb57611eba611c9a565b5b92915050565b6000611ecc8261162b565b9150611ed78361162b565b9250828201905080821115611eef57611eee611c9a565b5b92915050565b600081905092915050565b6000611f0c8385611ef5565b9350611f1983858461172e565b82840190509392505050565b6000611f32828486611f00565b91508190509392505050565b6000819050919050565b611f59611f54826112f6565b611f3e565b82525050565b6000611f6b8285611f48565b602082019150611f7b8284611f48565b6020820191508190509392505050565b6000819050919050565b6000611fb0611fab611fa684611f8b565b611379565b611bcb565b9050919050565b611fc081611f95565b82525050565b611fcf81611c07565b82525050565b600060a082019050611fea6000830189611af7565b8181036020830152611ffd818789611d5b565b905061200c60408301866113ea565b6120196060830185611fb7565b6120266080830184611fc6565b979650505050505050565b60008151905061204081611300565b92915050565b60006020828403121561205c5761205b611231565b5b600061206a84828501612031565b91505092915050565b600061208e61208961208484611f8b565b611379565b611c07565b9050919050565b61209e81612073565b82525050565b6120ad81611bcb565b82525050565b600060e0820190506120c8600083018b611af7565b81810360208301526120db81898b611d5b565b90506120ea60408301886113ea565b6120f760608301876113ea565b6121046080830186612095565b61211160a08301856120a4565b61211e60c0830184611fc6565b9998505050505050505050565b60006040820190506121406000830185611af7565b61214d6020830184611daa565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126121af576121ae612183565b5b80840192508235915067ffffffffffffffff8211156121d1576121d0612188565b5b6020830192506001820236038313156121ed576121ec61218d565b5b509250929050565b600080fd5b600080fd5b60008085851115612213576122126121f5565b5b83861115612224576122236121fa565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b600061225e838361223a565b8261226981356112f6565b925060208210156122a9576122a47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802612245565b831692505b505092915050565b7f537562646f6d61696e5265676973747261723a204e616d6568617368206f6e2060008201527f7265636f726420646f206e6f74206d6174636820746865206e616d652062656960208201527f6e67207265676973746572656400000000000000000000000000000000000000604082015250565b6000612333604d83611d4a565b915061233e826122b1565b606082019050919050565b6000602082019050818103600083015261236281612326565b9050919050565b60006123748261162b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036123a6576123a5611c9a565b5b600182019050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061240d602683611d4a565b9150612418826123b1565b604082019050919050565b6000602082019050818103600083015261243c81612400565b9050919050565b600081519050919050565b60005b8381101561246c578082015181840152602081019050612451565b60008484015250505050565b600061248382612443565b61248d8185611ef5565b935061249d81856020860161244e565b80840191505092915050565b60006124b58284612478565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006124f6601d83611d4a565b9150612501826124c0565b602082019050919050565b60006020820190508181036000830152612525816124e9565b9050919050565b600081519050919050565b60006125428261252c565b61254c8185611d4a565b935061255c81856020860161244e565b6125658161156e565b840191505092915050565b6000602082019050818103600083015261258a8184612537565b90509291505056fe537562646f6d61696e5265676973747261723a204661696c656420746f20736574205265636f7264a2646970667358221220868efda0b0b3de893b3f2d12110f381af8d0d2fa54d207fe97a67f1831f71c6564736f6c63430008110033000000000000000000000000d4416b13d2b3a9abae7acd5d6c2bbdbe25686401
Deployed Bytecode
0x60806040526004361061007b5760003560e01c8063ac210cc71161004e578063ac210cc714610162578063bc197c811461018d578063ee423a65146101ca578063f23a6e61146101e65761007b565b806301ffc9a71461008057806320c38e2b146100bd5780636932854f146100fc5780639625e02014610139575b600080fd5b34801561008c57600080fd5b506100a760048036038101906100a29190611293565b610223565b6040516100b491906112db565b60405180910390f35b3480156100c957600080fd5b506100e460048036038101906100df919061132c565b61029d565b6040516100f3939291906113f9565b60405180910390f35b34801561010857600080fd5b50610123600480360381019061011e919061132c565b610314565b60405161013091906112db565b60405180910390f35b34801561014557600080fd5b50610160600480360381019061015b91906114c6565b610326565b005b34801561016e57600080fd5b50610177610417565b604051610184919061154e565b60405180910390f35b34801561019957600080fd5b506101b460048036038101906101af91906117ad565b61043b565b6040516101c1919061188b565b60405180910390f35b6101e460048036038101906101df9190611991565b610450565b005b3480156101f257600080fd5b5061020d60048036038101906102089190611a60565b610571565b60405161021a919061188b565b60405180910390f35b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610296575061029582610586565b5b9050919050565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160149054906101000a900460ff16905083565b600061031f826105f0565b9050919050565b837f000000000000000000000000d4416b13d2b3a9abae7acd5d6c2bbdbe2568640173ffffffffffffffffffffffffffffffffffffffff166341415eab82336040518363ffffffff1660e01b8152600401610382929190611b06565b602060405180830381865afa15801561039f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c39190611b44565b61040457806040517fe4fd57ae0000000000000000000000000000000000000000000000000000000081526004016103fb9190611b71565b60405180910390fd5b610410858585856106ad565b5050505050565b7f000000000000000000000000d4416b13d2b3a9abae7acd5d6c2bbdbe2568640181565b600063bc197c8160e01b905095945050505050565b6000807f000000000000000000000000d4416b13d2b3a9abae7acd5d6c2bbdbe2568640173ffffffffffffffffffffffffffffffffffffffff16630178fe3f8b60001c6040518263ffffffff1660e01b81526004016104af9190611b9b565b606060405180830381865afa1580156104cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f09190611c47565b9250925050600042826105039190611cc9565b90506202000063ffffffff1662020000841663ffffffff160361054557600160009054906101000a900467ffffffffffffffff16816105429190611cc9565b90505b6105648b8b8b8b8b8b61ffff1662010000620400001717878c8c6108db565b5050505050505050505050565b600063f23a6e6160e01b905095945050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60007f000000000000000000000000d4416b13d2b3a9abae7acd5d6c2bbdbe2568640173ffffffffffffffffffffffffffffffffffffffff16630178fe3f8360001c6040518263ffffffff1660e01b815260040161064e9190611b9b565b606060405180830381865afa92505050801561068857506040513d601f19601f820116820180604052508101906106859190611c47565b60015b61069557600190506106a8565b428167ffffffffffffffff161093505050505b919050565b837f000000000000000000000000d4416b13d2b3a9abae7acd5d6c2bbdbe2568640173ffffffffffffffffffffffffffffffffffffffff166341415eab82336040518363ffffffff1660e01b8152600401610709929190611b06565b602060405180830381865afa158015610726573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074a9190611b44565b61078b57806040517fe4fd57ae0000000000000000000000000000000000000000000000000000000081526004016107829190611b71565b60405180910390fd5b60405180606001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183151581525060008087815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160146101000a81548160ff0219169083151502179055509050507f32d5b5044e29ac0aed3aa0563341507ed6a591bf10837678ce9ba4ee06b4a4b9858585856040516108cc9493929190611d05565b60405180910390a15050505050565b6000808a815260200190815260200160002060010160149054906101000a900460ff1661093f57886040517f7f09c7c80000000000000000000000000000000000000000000000000000000081526004016109369190611b71565b60405180910390fd5b6000806000808c815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638847fbc98c8c8c896040518563ffffffff1660e01b81526004016109b69493929190611db9565b6040805180830381865afa1580156109d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f69190611e0e565b91509150610a048b86610aed565b6000811115610ac4578173ffffffffffffffffffffffffffffffffffffffff166323b872dd336000808f815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b8152600401610a7f93929190611e4e565b6020604051808303816000875af1158015610a9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac29190611b44565b505b610ae08b8b8b8b8b8b8b42610ad99190611e85565b8b8b610cc4565b5050505050505050505050565b60007f000000000000000000000000d4416b13d2b3a9abae7acd5d6c2bbdbe2568640173ffffffffffffffffffffffffffffffffffffffff16630178fe3f8460001c6040518263ffffffff1660e01b8152600401610b4b9190611b9b565b606060405180830381865afa925050508015610b8557506040513d601f19601f82011682018060405250810190610b829190611c47565b60015b610bc657826040517fe237ec53000000000000000000000000000000000000000000000000000000008152600401610bbd9190611b71565b60405180910390fd5b6202000063ffffffff1662020000831663ffffffff1603610c0657600160009054906101000a900467ffffffffffffffff1681610c039190611cc9565b90505b8067ffffffffffffffff16421115610c5557856040517f3476d65d000000000000000000000000000000000000000000000000000000008152600401610c4c9190611b71565b60405180910390fd5b8093505050508067ffffffffffffffff16428367ffffffffffffffff16610c7c9190611ec1565b1115610cbf57826040517f50a34530000000000000000000000000000000000000000000000000000000008152600401610cb69190611b71565b60405180910390fd5b505050565b6000898989604051610cd7929190611f25565b6040518091039020604051602001610cf0929190611f5f565b604051602081830303815290604052805190602001209050610d1181610314565b610d47576040517fa3b8915f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838390501115610e08577f000000000000000000000000d4416b13d2b3a9abae7acd5d6c2bbdbe2568640173ffffffffffffffffffffffffffffffffffffffff1663c658e0868b8b8b3060008a6040518763ffffffff1660e01b8152600401610db796959493929190611fd5565b6020604051808303816000875af1158015610dd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dfa9190612046565b50610e0781878585610efe565b5b7f000000000000000000000000d4416b13d2b3a9abae7acd5d6c2bbdbe2568640173ffffffffffffffffffffffffffffffffffffffff166324c1af448b8b8b8b8b6000620100008d178c6040518963ffffffff1660e01b8152600401610e759897969594939291906120b3565b6020604051808303816000875af1158015610e94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb89190612046565b507fabce831762b197a806fc33373c356d5ff4d7d0d34ad31f6eb2ace003e27958cd8185604051610eea92919061212b565b60405180910390a150505050505050505050565b60005b82829050811015611053576000838383818110610f2157610f20612154565b5b9050602002810190610f339190612192565b600490602492610f45939291906121ff565b90610f509190612252565b9050858114610f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8b90612349565b60405180910390fd5b61103e848484818110610faa57610fa9612154565b5b9050602002810190610fbc9190612192565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050604051806060016040528060288152602001612593602891398773ffffffffffffffffffffffffffffffffffffffff1661105a9092919063ffffffff16565b5050808061104b90612369565b915050610f01565b5050505050565b60606110698484600085611072565b90509392505050565b6060824710156110b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ae90612423565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516110e091906124a9565b60006040518083038185875af1925050503d806000811461111d576040519150601f19603f3d011682016040523d82523d6000602084013e611122565b606091505b50915091506111338783838761113f565b92505050949350505050565b606083156111a157600083510361119957611159856111b4565b611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f9061250c565b60405180910390fd5b5b8290506111ac565b6111ab83836111d7565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000825111156111ea5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121e9190612570565b60405180910390fd5b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6112708161123b565b811461127b57600080fd5b50565b60008135905061128d81611267565b92915050565b6000602082840312156112a9576112a8611231565b5b60006112b78482850161127e565b91505092915050565b60008115159050919050565b6112d5816112c0565b82525050565b60006020820190506112f060008301846112cc565b92915050565b6000819050919050565b611309816112f6565b811461131457600080fd5b50565b60008135905061132681611300565b92915050565b60006020828403121561134257611341611231565b5b600061135084828501611317565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061139e61139961139484611359565b611379565b611359565b9050919050565b60006113b082611383565b9050919050565b60006113c2826113a5565b9050919050565b6113d2816113b7565b82525050565b60006113e382611359565b9050919050565b6113f3816113d8565b82525050565b600060608201905061140e60008301866113c9565b61141b60208301856113ea565b61142860408301846112cc565b949350505050565b600061143b826113d8565b9050919050565b61144b81611430565b811461145657600080fd5b50565b60008135905061146881611442565b92915050565b611477816113d8565b811461148257600080fd5b50565b6000813590506114948161146e565b92915050565b6114a3816112c0565b81146114ae57600080fd5b50565b6000813590506114c08161149a565b92915050565b600080600080608085870312156114e0576114df611231565b5b60006114ee87828801611317565b94505060206114ff87828801611459565b935050604061151087828801611485565b9250506060611521878288016114b1565b91505092959194509250565b6000611538826113a5565b9050919050565b6115488161152d565b82525050565b6000602082019050611563600083018461153f565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6115b78261156e565b810181811067ffffffffffffffff821117156115d6576115d561157f565b5b80604052505050565b60006115e9611227565b90506115f582826115ae565b919050565b600067ffffffffffffffff8211156116155761161461157f565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b61163e8161162b565b811461164957600080fd5b50565b60008135905061165b81611635565b92915050565b600061167461166f846115fa565b6115df565b9050808382526020820190506020840283018581111561169757611696611626565b5b835b818110156116c057806116ac888261164c565b845260208401935050602081019050611699565b5050509392505050565b600082601f8301126116df576116de611569565b5b81356116ef848260208601611661565b91505092915050565b600080fd5b600067ffffffffffffffff8211156117185761171761157f565b5b6117218261156e565b9050602081019050919050565b82818337600083830152505050565b600061175061174b846116fd565b6115df565b90508281526020810184848401111561176c5761176b6116f8565b5b61177784828561172e565b509392505050565b600082601f83011261179457611793611569565b5b81356117a484826020860161173d565b91505092915050565b600080600080600060a086880312156117c9576117c8611231565b5b60006117d788828901611485565b95505060206117e888828901611485565b945050604086013567ffffffffffffffff81111561180957611808611236565b5b611815888289016116ca565b935050606086013567ffffffffffffffff81111561183657611835611236565b5b611842888289016116ca565b925050608086013567ffffffffffffffff81111561186357611862611236565b5b61186f8882890161177f565b9150509295509295909350565b6118858161123b565b82525050565b60006020820190506118a0600083018461187c565b92915050565b600080fd5b60008083601f8401126118c1576118c0611569565b5b8235905067ffffffffffffffff8111156118de576118dd6118a6565b5b6020830191508360018202830111156118fa576118f9611626565b5b9250929050565b600061ffff82169050919050565b61191881611901565b811461192357600080fd5b50565b6000813590506119358161190f565b92915050565b60008083601f84011261195157611950611569565b5b8235905067ffffffffffffffff81111561196e5761196d6118a6565b5b60208301915083602082028301111561198a57611989611626565b5b9250929050565b60008060008060008060008060c0898b0312156119b1576119b0611231565b5b60006119bf8b828c01611317565b985050602089013567ffffffffffffffff8111156119e0576119df611236565b5b6119ec8b828c016118ab565b975097505060406119ff8b828c01611485565b9550506060611a108b828c01611485565b9450506080611a218b828c01611926565b93505060a089013567ffffffffffffffff811115611a4257611a41611236565b5b611a4e8b828c0161193b565b92509250509295985092959890939650565b600080600080600060a08688031215611a7c57611a7b611231565b5b6000611a8a88828901611485565b9550506020611a9b88828901611485565b9450506040611aac8882890161164c565b9350506060611abd8882890161164c565b925050608086013567ffffffffffffffff811115611ade57611add611236565b5b611aea8882890161177f565b9150509295509295909350565b611b00816112f6565b82525050565b6000604082019050611b1b6000830185611af7565b611b2860208301846113ea565b9392505050565b600081519050611b3e8161149a565b92915050565b600060208284031215611b5a57611b59611231565b5b6000611b6884828501611b2f565b91505092915050565b6000602082019050611b866000830184611af7565b92915050565b611b958161162b565b82525050565b6000602082019050611bb06000830184611b8c565b92915050565b600081519050611bc58161146e565b92915050565b600063ffffffff82169050919050565b611be481611bcb565b8114611bef57600080fd5b50565b600081519050611c0181611bdb565b92915050565b600067ffffffffffffffff82169050919050565b611c2481611c07565b8114611c2f57600080fd5b50565b600081519050611c4181611c1b565b92915050565b600080600060608486031215611c6057611c5f611231565b5b6000611c6e86828701611bb6565b9350506020611c7f86828701611bf2565b9250506040611c9086828701611c32565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611cd482611c07565b9150611cdf83611c07565b9250828203905067ffffffffffffffff811115611cff57611cfe611c9a565b5b92915050565b6000608082019050611d1a6000830187611af7565b611d2760208301866113ea565b611d3460408301856113ea565b611d4160608301846112cc565b95945050505050565b600082825260208201905092915050565b6000611d678385611d4a565b9350611d7483858461172e565b611d7d8361156e565b840190509392505050565b6000611da3611d9e611d9984611c07565b611379565b61162b565b9050919050565b611db381611d88565b82525050565b6000606082019050611dce6000830187611af7565b8181036020830152611de1818587611d5b565b9050611df06040830184611daa565b95945050505050565b600081519050611e0881611635565b92915050565b60008060408385031215611e2557611e24611231565b5b6000611e3385828601611bb6565b9250506020611e4485828601611df9565b9150509250929050565b6000606082019050611e6360008301866113ea565b611e7060208301856113ea565b611e7d6040830184611b8c565b949350505050565b6000611e9082611c07565b9150611e9b83611c07565b9250828201905067ffffffffffffffff811115611ebb57611eba611c9a565b5b92915050565b6000611ecc8261162b565b9150611ed78361162b565b9250828201905080821115611eef57611eee611c9a565b5b92915050565b600081905092915050565b6000611f0c8385611ef5565b9350611f1983858461172e565b82840190509392505050565b6000611f32828486611f00565b91508190509392505050565b6000819050919050565b611f59611f54826112f6565b611f3e565b82525050565b6000611f6b8285611f48565b602082019150611f7b8284611f48565b6020820191508190509392505050565b6000819050919050565b6000611fb0611fab611fa684611f8b565b611379565b611bcb565b9050919050565b611fc081611f95565b82525050565b611fcf81611c07565b82525050565b600060a082019050611fea6000830189611af7565b8181036020830152611ffd818789611d5b565b905061200c60408301866113ea565b6120196060830185611fb7565b6120266080830184611fc6565b979650505050505050565b60008151905061204081611300565b92915050565b60006020828403121561205c5761205b611231565b5b600061206a84828501612031565b91505092915050565b600061208e61208961208484611f8b565b611379565b611c07565b9050919050565b61209e81612073565b82525050565b6120ad81611bcb565b82525050565b600060e0820190506120c8600083018b611af7565b81810360208301526120db81898b611d5b565b90506120ea60408301886113ea565b6120f760608301876113ea565b6121046080830186612095565b61211160a08301856120a4565b61211e60c0830184611fc6565b9998505050505050505050565b60006040820190506121406000830185611af7565b61214d6020830184611daa565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b600080fd5b600080fd5b600080833560016020038436030381126121af576121ae612183565b5b80840192508235915067ffffffffffffffff8211156121d1576121d0612188565b5b6020830192506001820236038313156121ed576121ec61218d565b5b509250929050565b600080fd5b600080fd5b60008085851115612213576122126121f5565b5b83861115612224576122236121fa565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b600061225e838361223a565b8261226981356112f6565b925060208210156122a9576122a47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802612245565b831692505b505092915050565b7f537562646f6d61696e5265676973747261723a204e616d6568617368206f6e2060008201527f7265636f726420646f206e6f74206d6174636820746865206e616d652062656960208201527f6e67207265676973746572656400000000000000000000000000000000000000604082015250565b6000612333604d83611d4a565b915061233e826122b1565b606082019050919050565b6000602082019050818103600083015261236281612326565b9050919050565b60006123748261162b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036123a6576123a5611c9a565b5b600182019050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061240d602683611d4a565b9150612418826123b1565b604082019050919050565b6000602082019050818103600083015261243c81612400565b9050919050565b600081519050919050565b60005b8381101561246c578082015181840152602081019050612451565b60008484015250505050565b600061248382612443565b61248d8185611ef5565b935061249d81856020860161244e565b80840191505092915050565b60006124b58284612478565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006124f6601d83611d4a565b9150612501826124c0565b602082019050919050565b60006020820190508181036000830152612525816124e9565b9050919050565b600081519050919050565b60006125428261252c565b61254c8185611d4a565b935061255c81856020860161244e565b6125658161156e565b840191505092915050565b6000602082019050818103600083015261258a8184612537565b90509291505056fe537562646f6d61696e5265676973747261723a204661696c656420746f20736574205265636f7264a2646970667358221220868efda0b0b3de893b3f2d12110f381af8d0d2fa54d207fe97a67f1831f71c6564736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d4416b13d2b3a9abae7acd5d6c2bbdbe25686401
-----Decoded View---------------
Arg [0] : wrapper (address): 0xD4416b13d2b3a9aBae7AcD5D6C2BbDBE25686401
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000d4416b13d2b3a9abae7acd5d6c2bbdbe25686401
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.