Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MintingManager
Compiler Version
v0.8.0+commit.c7dfd78e
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// @author Unstoppable Domains, Inc. // @date June 16th, 2021 pragma solidity ^0.8.0; import '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol'; import '@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol'; import '@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol'; import '@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol'; import './cns/IResolver.sol'; import './cns/IMintingController.sol'; import './cns/IURIPrefixController.sol'; import './IMintingManager.sol'; import './IUNSRegistry.sol'; import './metatx/Relayer.sol'; import './roles/MinterRole.sol'; /** * @title MintingManager * @dev Defines the functions for distribution of Second Level Domains (SLD)s. */ contract MintingManager is Initializable, ContextUpgradeable, OwnableUpgradeable, MinterRole, Relayer, IMintingManager { string public constant NAME = 'UNS: Minting Manager'; string public constant VERSION = '0.1.0'; IUNSRegistry public unsRegistry; IMintingController public cnsMintingController; IURIPrefixController public cnsURIPrefixController; IResolver public cnsResolver; /** * @dev Mapping TLD `namehash` to TLD label * * `namehash` = uint256(keccak256(abi.encodePacked(uint256(0x0), keccak256(abi.encodePacked(label))))) */ mapping(uint256 => string) internal _tlds; /** * @dev bytes4(keccak256('mintSLD(address,uint256,string)')) == 0xae2ad903 */ bytes4 private constant _SIG_MINT = 0xae2ad903; /** * @dev bytes4(keccak256('safeMintSLD(address,uint256,string)')) == 0x4c1819e0 */ bytes4 private constant _SIG_SAFE_MINT = 0x4c1819e0; /** * @dev bytes4(keccak256('safeMintSLD(address,uint256,string,bytes)')) == 0x58839d6b */ bytes4 private constant _SIG_SAFE_MINT_DATA = 0x58839d6b; /** * @dev bytes4(keccak256('mintSLDWithRecords(address,uint256,string,string[],string[])')) == 0x39ccf4d0 */ bytes4 private constant _SIG_MINT_WITH_RECORDS = 0x39ccf4d0; /** * @dev bytes4(keccak256('safeMintSLDWithRecords(address,uint256,string,string[],string[])')) == 0x27bbd225 */ bytes4 private constant _SIG_SAFE_MINT_WITH_RECORDS = 0x27bbd225; /** * @dev bytes4(keccak256('safeMintSLDWithRecords(address,uint256,string,string[],string[],bytes)')) == 0x6a2d2256 */ bytes4 private constant _SIG_SAFE_MINT_WITH_RECORDS_DATA = 0x6a2d2256; modifier onlyRegisteredTld(uint256 tld) { require(bytes(_tlds[tld]).length > 0, 'MintingManager: TLD_NOT_REGISTERED'); _; } function initialize( IUNSRegistry unsRegistry_, IMintingController cnsMintingController_, IURIPrefixController cnsURIPrefixController_, IResolver cnsResolver_ ) public initializer { unsRegistry = unsRegistry_; cnsMintingController = cnsMintingController_; cnsURIPrefixController = cnsURIPrefixController_; cnsResolver = cnsResolver_; __Ownable_init_unchained(); __MinterRole_init_unchained(); // Relayer is required to be a minter _addMinter(address(this)); _tlds[0x0f4a10a4f46c288cea365fcf45cccf0e9d901b945b9829ccdb54c10dc3cb7a6f] = 'crypto'; string[8] memory tlds = ['wallet', 'coin', 'x', 'nft', 'blockchain', 'bitcoin', '888', 'dao']; for (uint256 i = 0; i < tlds.length; i++) { uint256 namehash = uint256(keccak256(abi.encodePacked(uint256(0x0), keccak256(abi.encodePacked(tlds[i]))))); _tlds[namehash] = tlds[i]; if (!unsRegistry.exists(namehash)) { unsRegistry.mint(address(0xdead), namehash, tlds[i]); } } } function mintSLD( address to, uint256 tld, string calldata label ) external override onlyMinter onlyRegisteredTld(tld) { _mintSLD(to, tld, label); } function safeMintSLD( address to, uint256 tld, string calldata label ) external override onlyMinter onlyRegisteredTld(tld) { _safeMintSLD(to, tld, label, ''); } function safeMintSLD( address to, uint256 tld, string calldata label, bytes calldata data ) external override onlyMinter onlyRegisteredTld(tld) { _safeMintSLD(to, tld, label, data); } function mintSLDWithRecords( address to, uint256 tld, string calldata label, string[] calldata keys, string[] calldata values ) external override onlyMinter onlyRegisteredTld(tld) { _mintSLDWithRecords(to, tld, label, keys, values); } function safeMintSLDWithRecords( address to, uint256 tld, string calldata label, string[] calldata keys, string[] calldata values ) external override onlyMinter onlyRegisteredTld(tld) { _safeMintSLDWithRecords(to, tld, label, keys, values, ''); } function safeMintSLDWithRecords( address to, uint256 tld, string calldata label, string[] calldata keys, string[] calldata values, bytes calldata data ) external override onlyMinter onlyRegisteredTld(tld) { _safeMintSLDWithRecords(to, tld, label, keys, values, data); } function claim(uint256 tld, string calldata label) external override onlyRegisteredTld(tld) { _mintSLD(_msgSender(), tld, _freeSLDLabel(label)); } function claimTo( address to, uint256 tld, string calldata label ) external override onlyRegisteredTld(tld) { _mintSLD(to, tld, _freeSLDLabel(label)); } function claimToWithRecords( address to, uint256 tld, string calldata label, string[] calldata keys, string[] calldata values ) external override onlyRegisteredTld(tld) { _mintSLDWithRecords(to, tld, _freeSLDLabel(label), keys, values); } function setResolver(address resolver) external onlyOwner { cnsResolver = IResolver(resolver); } function setTokenURIPrefix(string calldata prefix) external override onlyOwner { unsRegistry.setTokenURIPrefix(prefix); if (address(cnsURIPrefixController) != address(0x0)) { cnsURIPrefixController.setTokenURIPrefix(prefix); } } function _verifyRelaySigner(address signer) internal view override { super._verifyRelaySigner(signer); require(isMinter(signer), 'MintingManager: SIGNER_IS_NOT_MINTER'); } function _verifyRelayCall(bytes4 funcSig, bytes calldata) internal pure override { bool isSupported = funcSig == _SIG_MINT || funcSig == _SIG_SAFE_MINT || funcSig == _SIG_SAFE_MINT_DATA || funcSig == _SIG_MINT_WITH_RECORDS || funcSig == _SIG_SAFE_MINT_WITH_RECORDS || funcSig == _SIG_SAFE_MINT_WITH_RECORDS_DATA; require(isSupported, 'MintingManager: UNSUPPORTED_RELAY_CALL'); } function _mintSLD( address to, uint256 tld, string memory label ) private { if (tld == 0x0f4a10a4f46c288cea365fcf45cccf0e9d901b945b9829ccdb54c10dc3cb7a6f) { cnsMintingController.mintSLDWithResolver(to, label, address(cnsResolver)); } else { unsRegistry.mint(to, _childId(tld, label), _uri(tld, label)); } } function _safeMintSLD( address to, uint256 tld, string calldata label, bytes memory data ) private { if (tld == 0x0f4a10a4f46c288cea365fcf45cccf0e9d901b945b9829ccdb54c10dc3cb7a6f) { cnsMintingController.safeMintSLDWithResolver(to, label, address(cnsResolver), data); } else { unsRegistry.safeMint(to, _childId(tld, label), _uri(tld, label), data); } } function _mintSLDWithRecords( address to, uint256 tld, string memory label, string[] calldata keys, string[] calldata values ) private { uint256 tokenId = _childId(tld, label); if (tld == 0x0f4a10a4f46c288cea365fcf45cccf0e9d901b945b9829ccdb54c10dc3cb7a6f) { cnsMintingController.mintSLDWithResolver(to, label, address(cnsResolver)); if (keys.length > 0) { cnsResolver.preconfigure(keys, values, tokenId); } } else { unsRegistry.mintWithRecords(to, tokenId, _uri(tld, label), keys, values); } } function _safeMintSLDWithRecords( address to, uint256 tld, string memory label, string[] calldata keys, string[] calldata values, bytes memory data ) private { uint256 tokenId = _childId(tld, label); if (tld == 0x0f4a10a4f46c288cea365fcf45cccf0e9d901b945b9829ccdb54c10dc3cb7a6f) { cnsMintingController.safeMintSLDWithResolver(to, label, address(cnsResolver), data); if (keys.length > 0) { cnsResolver.preconfigure(keys, values, tokenId); } } else { unsRegistry.safeMintWithRecords(to, tokenId, _uri(tld, label), keys, values, data); } } function _childId(uint256 tokenId, string memory label) internal pure returns (uint256) { require(bytes(label).length != 0, 'MintingManager: LABEL_EMPTY'); return uint256(keccak256(abi.encodePacked(tokenId, keccak256(abi.encodePacked(label))))); } function _freeSLDLabel(string calldata label) private pure returns (string memory) { return string(abi.encodePacked('udtestdev-', label)); } function _uri(uint256 tld, string memory label) private view returns (string memory) { return string(abi.encodePacked(label, '.', _tlds[tld])); } // Reserved storage space to allow for layout changes in the future. uint256[50] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // solhint-disable-next-line compiler-version pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSAUpgradeable { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } } else if (signature.length == 64) { // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { let vs := mload(add(signature, 0x40)) r := mload(add(signature, 0x20)) s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } } else { revert("ECDSA: invalid signature length"); } return recover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value"); require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value"); // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); require(signer != address(0), "ECDSA: invalid signature"); return signer; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// @author Unstoppable Domains, Inc. // @date June 16th, 2021 pragma solidity ^0.8.0; interface IResolver { function preconfigure( string[] memory keys, string[] memory values, uint256 tokenId ) external; function get(string calldata key, uint256 tokenId) external view returns (string memory); function getMany(string[] calldata keys, uint256 tokenId) external view returns (string[] memory); function getByHash(uint256 keyHash, uint256 tokenId) external view returns (string memory key, string memory value); function getManyByHash(uint256[] calldata keyHashes, uint256 tokenId) external view returns (string[] memory keys, string[] memory values); function set( string calldata key, string calldata value, uint256 tokenId ) external; }
// @author Unstoppable Domains, Inc. // @date June 16th, 2021 pragma solidity ^0.8.0; interface IMintingController { function mintSLD(address to, string calldata label) external; function safeMintSLD(address to, string calldata label) external; function safeMintSLD( address to, string calldata label, bytes calldata data ) external; function mintSLDWithResolver( address to, string memory label, address resolver ) external; function safeMintSLDWithResolver( address to, string calldata label, address resolver ) external; function safeMintSLDWithResolver( address to, string calldata label, address resolver, bytes calldata data ) external; }
// @author Unstoppable Domains, Inc. // @date June 16th, 2021 pragma solidity ^0.8.0; interface IURIPrefixController { function setTokenURIPrefix(string calldata prefix) external; }
// @author Unstoppable Domains, Inc. // @date June 16th, 2021 pragma solidity ^0.8.0; interface IMintingManager { /** * @dev Mints a Second Level Domain (SLD). * @param to address to mint the new SLD to. * @param tld id of parent token. * @param label SLD label to mint. */ function mintSLD( address to, uint256 tld, string calldata label ) external; /** * @dev Safely mints a Second Level Domain (SLD). * Implements a ERC721Reciever check unlike mintSLD. * @param to address to mint the new SLD to. * @param tld id of parent token. * @param label SLD label to mint. */ function safeMintSLD( address to, uint256 tld, string calldata label ) external; /** * @dev Safely mints a Second Level Domain (SLD). * Implements a ERC721Reciever check unlike mintSLD. * @param to address to mint the new SLD to. * @param tld id of parent token. * @param label SLD label to mint. * @param data bytes data to send along with a safe transfer check. */ function safeMintSLD( address to, uint256 tld, string calldata label, bytes calldata data ) external; /** * @dev Mints a Second Level Domain (SLD) with records. * @param to address to mint the new SLD to. * @param tld id of parent token. * @param label SLD label to mint. * @param keys Record keys. * @param values Record values. */ function mintSLDWithRecords( address to, uint256 tld, string calldata label, string[] calldata keys, string[] calldata values ) external; /** * @dev Mints a Second Level Domain (SLD) with records. * Implements a ERC721Reciever check unlike mintSLD. * @param to address to mint the new SLD to. * @param tld id of parent token. * @param label SLD label to mint. * @param keys Record keys. * @param values Record values. */ function safeMintSLDWithRecords( address to, uint256 tld, string calldata label, string[] calldata keys, string[] calldata values ) external; /** * @dev Mints a Second Level Domain (SLD) with records. * Implements a ERC721Reciever check unlike mintSLD. * @param to address to mint the new SLD to. * @param tld id of parent token. * @param label SLD label to mint. * @param keys Record keys. * @param values Record values. * @param data bytes data to send along with a safe transfer check. */ function safeMintSLDWithRecords( address to, uint256 tld, string calldata label, string[] calldata keys, string[] calldata values, bytes calldata data ) external; /** * @dev Claims free domain. The fuction adds prefix `udtestdev-` to label. * @param tld id of parent token * @param label SLD label to mint */ function claim(uint256 tld, string calldata label) external; /** * @dev Claims free domain. The fuction adds prefix `udtestdev-` to label. * @param to address to mint the new SLD to * @param tld id of parent token * @param label SLD label to mint */ function claimTo( address to, uint256 tld, string calldata label ) external; /** * @dev Claims free domain. The fuction adds prefix `udtestdev-` to label. * @param to address to mint the new SLD to * @param tld id of parent token * @param label SLD label to mint */ function claimToWithRecords( address to, uint256 tld, string calldata label, string[] calldata keys, string[] calldata values ) external; /** * @dev Function to set the token URI Prefix for all tokens. * @param prefix string URI to assign */ function setTokenURIPrefix(string calldata prefix) external; }
// @author Unstoppable Domains, Inc. // @date June 16th, 2021 pragma solidity ^0.8.0; import '@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol'; import './IRecordStorage.sol'; interface IUNSRegistry is IERC721MetadataUpgradeable, IRecordStorage { event NewURI(uint256 indexed tokenId, string uri); event NewURIPrefix(string prefix); /** * @dev Function to set the token URI Prefix for all tokens. * @param prefix string URI to assign */ function setTokenURIPrefix(string calldata prefix) external; /** * @dev Returns whether the given spender can transfer a given token ID. * @param spender address of the spender to query * @param tokenId uint256 ID of the token to be transferred * @return bool whether the msg.sender is approved for the given token ID, * is an operator of the owner, or is the owner of the token */ function isApprovedOrOwner(address spender, uint256 tokenId) external view returns (bool); /** * @dev Gets the resolver of the specified token ID. * @param tokenId uint256 ID of the token to query the resolver of * @return address currently marked as the resolver of the given token ID */ function resolverOf(uint256 tokenId) external view returns (address); /** * @dev Provides child token (subdomain) of provided tokenId. * @param tokenId uint256 ID of the token * @param label label of subdomain (for `aaa.bbb.crypto` it will be `aaa`) */ function childIdOf(uint256 tokenId, string calldata label) external pure returns (uint256); /** * @dev Existence of token. * @param tokenId uint256 ID of the token */ function exists(uint256 tokenId) external view returns (bool); /** * @dev Transfer domain ownership without resetting domain records. * @param to address of new domain owner * @param tokenId uint256 ID of the token to be transferred */ function setOwner(address to, uint256 tokenId) external; /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) external; /** * @dev Mints token. * @param to address to mint the new SLD to. * @param tokenId id of token. * @param uri domain URI. */ function mint( address to, uint256 tokenId, string calldata uri ) external; /** * @dev Safely mints token. * Implements a ERC721Reciever check unlike mint. * @param to address to mint the new SLD to. * @param tokenId id of token. * @param uri domain URI. */ function safeMint( address to, uint256 tokenId, string calldata uri ) external; /** * @dev Safely mints token. * Implements a ERC721Reciever check unlike mint. * @param to address to mint the new SLD to. * @param tokenId id of token. * @param uri domain URI. * @param data bytes data to send along with a safe transfer check */ function safeMint( address to, uint256 tokenId, string calldata uri, bytes calldata data ) external; /** * @dev Mints token with records * @param to address to mint the new SLD to * @param tokenId id of token * @param keys New record keys * @param values New record values * @param uri domain URI */ function mintWithRecords( address to, uint256 tokenId, string calldata uri, string[] calldata keys, string[] calldata values ) external; /** * @dev Safely mints token with records * @param to address to mint the new SLD to * @param tokenId id of token * @param keys New record keys * @param values New record values * @param uri domain URI */ function safeMintWithRecords( address to, uint256 tokenId, string calldata uri, string[] calldata keys, string[] calldata values ) external; /** * @dev Safely mints token with records * @param to address to mint the new SLD to * @param tokenId id of token * @param keys New record keys * @param values New record values * @param uri domain URI * @param data bytes data to send along with a safe transfer check */ function safeMintWithRecords( address to, uint256 tokenId, string calldata uri, string[] calldata keys, string[] calldata values, bytes calldata data ) external; }
// @author Unstoppable Domains, Inc. // @date June 16th, 2021 pragma solidity ^0.8.0; import '@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol'; import '@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol'; abstract contract Relayer is ContextUpgradeable { using ECDSAUpgradeable for bytes32; event Relayed(address indexed sender, address indexed signer, bytes4 indexed funcSig, bytes32 digest); /** * Relay allows execute transaction on behalf of whitelisted minter. * The function verify signature of call data parameter before execution. * It allows anybody send transaction on-chain when minter has provided proper parameters. * The function allows to relaying calls of fixed functions. The restriction defined in function `verifyCall` */ function relay(bytes calldata data, bytes calldata signature) external returns (bytes memory) { bytes32 digest = keccak256(data); address signer = keccak256(abi.encodePacked(digest, address(this))).toEthSignedMessageHash().recover(signature); bytes4 funcSig; bytes memory _data = data; /* solium-disable-next-line security/no-inline-assembly */ assembly { funcSig := mload(add(_data, add(0x20, 0))) } _verifyRelaySigner(signer); _verifyRelayCall(funcSig, data); /* solium-disable-next-line security/no-low-level-calls */ (bool success, bytes memory result) = address(this).call(data); if (success == false) { /* solium-disable-next-line security/no-inline-assembly */ assembly { let ptr := mload(0x40) let size := returndatasize() returndatacopy(ptr, 0, size) revert(ptr, size) } } emit Relayed(_msgSender(), signer, funcSig, digest); return result; } function _verifyRelaySigner(address signer) internal view virtual { require(signer != address(0), 'Relayer: SIGNATURE_IS_INVALID'); } function _verifyRelayCall(bytes4 funcSig, bytes calldata data) internal pure virtual {} }
// @author Unstoppable Domains, Inc. // @date June 16th, 2021 pragma solidity ^0.8.0; import '@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol'; import '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol'; abstract contract MinterRole is OwnableUpgradeable, AccessControlUpgradeable { bytes32 public constant MINTER_ROLE = keccak256('MINTER_ROLE'); modifier onlyMinter() { require(isMinter(_msgSender()), 'MinterRole: CALLER_IS_NOT_MINTER'); _; } // solhint-disable-next-line func-name-mixedcase function __MinterRole_init() internal initializer { __Ownable_init_unchained(); __AccessControl_init_unchained(); __MinterRole_init_unchained(); } // solhint-disable-next-line func-name-mixedcase function __MinterRole_init_unchained() internal initializer {} function isMinter(address account) public view returns (bool) { return hasRole(MINTER_ROLE, account); } function addMinter(address account) public onlyOwner { _addMinter(account); } function addMinters(address[] memory accounts) public onlyOwner { for (uint256 index = 0; index < accounts.length; index++) { _addMinter(accounts[index]); } } function removeMinter(address account) public onlyOwner { _removeMinter(account); } function removeMinters(address[] memory accounts) public onlyOwner { for (uint256 index = 0; index < accounts.length; index++) { _removeMinter(accounts[index]); } } function renounceMinter() public { _removeMinter(_msgSender()); } /** * Renounce minter account with funds' forwarding */ function closeMinter(address payable receiver) external payable onlyMinter { require(receiver != address(0x0), 'MinterRole: RECEIVER_IS_EMPTY'); renounceMinter(); receiver.transfer(msg.value); } /** * Replace minter account by new account with funds' forwarding */ function rotateMinter(address payable receiver) external payable onlyMinter { require(receiver != address(0x0), 'MinterRole: RECEIVER_IS_EMPTY'); _addMinter(receiver); renounceMinter(); receiver.transfer(msg.value); } function _addMinter(address account) internal { _setupRole(MINTER_ROLE, account); } function _removeMinter(address account) internal { renounceRole(MINTER_ROLE, account); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC721Upgradeable.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721MetadataUpgradeable is IERC721Upgradeable { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// @author Unstoppable Domains, Inc. // @date June 16th, 2021 pragma solidity ^0.8.0; import './IRecordReader.sol'; interface IRecordStorage is IRecordReader { event Set(uint256 indexed tokenId, string indexed keyIndex, string indexed valueIndex, string key, string value); event NewKey(uint256 indexed tokenId, string indexed keyIndex, string key); event ResetRecords(uint256 indexed tokenId); /** * @dev Set record by key * @param key The key set the value of * @param value The value to set key to * @param tokenId ERC-721 token id to set */ function set( string calldata key, string calldata value, uint256 tokenId ) external; /** * @dev Set records by keys * @param keys The keys set the values of * @param values Records values * @param tokenId ERC-721 token id of the domain */ function setMany( string[] memory keys, string[] memory values, uint256 tokenId ) external; /** * @dev Set record by key hash * @param keyHash The key hash set the value of * @param value The value to set key to * @param tokenId ERC-721 token id to set */ function setByHash( uint256 keyHash, string calldata value, uint256 tokenId ) external; /** * @dev Set records by key hashes * @param keyHashes The key hashes set the values of * @param values Records values * @param tokenId ERC-721 token id of the domain */ function setManyByHash( uint256[] calldata keyHashes, string[] calldata values, uint256 tokenId ) external; /** * @dev Reset all domain records and set new ones * @param keys New record keys * @param values New record values * @param tokenId ERC-721 token id of the domain */ function reconfigure( string[] memory keys, string[] memory values, uint256 tokenId ) external; /** * @dev Function to reset all existing records on a domain. * @param tokenId ERC-721 token id to set. */ function reset(uint256 tokenId) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../../utils/introspection/IERC165Upgradeable.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721Upgradeable is IERC165Upgradeable { /** * @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`, 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 be 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: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; }
// SPDX-License-Identifier: MIT 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 IERC165Upgradeable { /** * @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); }
// @author Unstoppable Domains, Inc. // @date June 16th, 2021 pragma solidity ^0.8.0; interface IRecordReader { /** * @dev Function to get record. * @param key The key to query the value of. * @param tokenId The token id to fetch. * @return The value string. */ function get(string calldata key, uint256 tokenId) external view returns (string memory); /** * @dev Function to get multiple record. * @param keys The keys to query the value of. * @param tokenId The token id to fetch. * @return The values. */ function getMany(string[] calldata keys, uint256 tokenId) external view returns (string[] memory); /** * @dev Function get value by provied key hash. * @param keyHash The key to query the value of. * @param tokenId The token id to set. */ function getByHash(uint256 keyHash, uint256 tokenId) external view returns (string memory key, string memory value); /** * @dev Function get values by provied key hashes. * @param keyHashes The key to query the value of. * @param tokenId The token id to set. */ function getManyByHash(uint256[] calldata keyHashes, uint256 tokenId) external view returns (string[] memory keys, string[] memory values); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../utils/StringsUpgradeable.sol"; import "../utils/introspection/ERC165Upgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControlUpgradeable { function hasRole(bytes32 role, address account) external view returns (bool); function getRoleAdmin(bytes32 role) external view returns (bytes32); function grantRole(bytes32 role, address account) external; function revokeRole(bytes32 role, address account) external; function renounceRole(bytes32 role, address account) external; } /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable { function __AccessControl_init() internal initializer { __Context_init_unchained(); __ERC165_init_unchained(); __AccessControl_init_unchained(); } function __AccessControl_init_unchained() internal initializer { } struct RoleData { mapping (address => bool) members; bytes32 adminRole; } mapping (bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/ */ function _checkRole(bytes32 role, address account) internal view { if(!hasRole(role, account)) { revert(string(abi.encodePacked( "AccessControl: account ", StringsUpgradeable.toHexString(uint160(account), 20), " is missing role ", StringsUpgradeable.toHexString(uint256(role), 32) ))); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, getRoleAdmin(role), adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165Upgradeable.sol"; import "../../proxy/utils/Initializable.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 ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal initializer { __ERC165_init_unchained(); } function __ERC165_init_unchained() internal initializer { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } uint256[50] private __gap; }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"signer","type":"address"},{"indexed":true,"internalType":"bytes4","name":"funcSig","type":"bytes4"},{"indexed":false,"internalType":"bytes32","name":"digest","type":"bytes32"}],"name":"Relayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"addMinters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tld","type":"uint256"},{"internalType":"string","name":"label","type":"string"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tld","type":"uint256"},{"internalType":"string","name":"label","type":"string"}],"name":"claimTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tld","type":"uint256"},{"internalType":"string","name":"label","type":"string"},{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"}],"name":"claimToWithRecords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"receiver","type":"address"}],"name":"closeMinter","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"cnsMintingController","outputs":[{"internalType":"contract IMintingController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cnsResolver","outputs":[{"internalType":"contract IResolver","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cnsURIPrefixController","outputs":[{"internalType":"contract IURIPrefixController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IUNSRegistry","name":"unsRegistry_","type":"address"},{"internalType":"contract IMintingController","name":"cnsMintingController_","type":"address"},{"internalType":"contract IURIPrefixController","name":"cnsURIPrefixController_","type":"address"},{"internalType":"contract IResolver","name":"cnsResolver_","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tld","type":"uint256"},{"internalType":"string","name":"label","type":"string"}],"name":"mintSLD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tld","type":"uint256"},{"internalType":"string","name":"label","type":"string"},{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"}],"name":"mintSLDWithRecords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"relay","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"removeMinters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"receiver","type":"address"}],"name":"rotateMinter","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tld","type":"uint256"},{"internalType":"string","name":"label","type":"string"}],"name":"safeMintSLD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tld","type":"uint256"},{"internalType":"string","name":"label","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMintSLD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tld","type":"uint256"},{"internalType":"string","name":"label","type":"string"},{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"}],"name":"safeMintSLDWithRecords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tld","type":"uint256"},{"internalType":"string","name":"label","type":"string"},{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMintSLDWithRecords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"resolver","type":"address"}],"name":"setResolver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"prefix","type":"string"}],"name":"setTokenURIPrefix","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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unsRegistry","outputs":[{"internalType":"contract IUNSRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506137ea806100206000396000f3fe6080604052600436106102255760003560e01c806381c81d3511610123578063a849d65c116100ab578063d53913931161006f578063d53913931461060c578063d547741f14610621578063f2fde38b14610641578063f8c8765e14610661578063ffa1ad741461068157610225565b8063a849d65c14610582578063aa271e1a14610597578063ae2ad903146105b7578063cc2c3fc4146105d7578063ceeb4f50146105ec57610225565b8063983b2d56116100f2578063983b2d5614610503578063986502751461052357806399e0dd7c14610538578063a217fddf14610558578063a3f4df7e1461056d57610225565b806381c81d351461049b5780638da5cb5b146104ae578063906cecc1146104c357806391d14854146104e357610225565b80634c1819e0116101b15780635fc1964f116101755780635fc1964f14610413578063634486da146104335780636a2d225614610446578063715018a61461046657806371e2a6571461047b57610225565b80634c1819e0146103715780634e543b2614610391578063564a5158146103b157806358839d6b146103de5780635b6fa8db146103fe57610225565b80632f2ff15d116101f85780632f2ff15d146102cf5780633092afd5146102ef57806336568abe1461030f57806339ccf4d01461032f5780633f41b6141461034f57610225565b806301ffc9a71461022a578063248a9ca314610260578063268b15ed1461028d57806327bbd225146102af575b600080fd5b34801561023657600080fd5b5061024a610245366004612b92565b610696565b6040516102579190613211565b60405180910390f35b34801561026c57600080fd5b5061028061027b366004612b4b565b6106c3565b604051610257919061321c565b34801561029957600080fd5b506102ad6102a8366004612cb2565b6106d8565b005b3480156102bb57600080fd5b506102ad6102ca366004612853565b61073e565b3480156102db57600080fd5b506102ad6102ea366004612b63565b610801565b3480156102fb57600080fd5b506102ad61030a3660046127dd565b61082a565b34801561031b57600080fd5b506102ad61032a366004612b63565b610875565b34801561033b57600080fd5b506102ad61034a366004612853565b6108bb565b34801561035b57600080fd5b50610364610965565b6040516102579190612fc2565b34801561037d57600080fd5b506102ad61038c3660046127f9565b610974565b34801561039d57600080fd5b506102ad6103ac3660046127dd565b6109fa565b3480156103bd57600080fd5b506103d16103cc366004612bba565b610a5b565b6040516102579190613243565b3480156103ea57600080fd5b506102ad6103f93660046129e1565b610c26565b34801561040a57600080fd5b50610364610cd5565b34801561041f57600080fd5b506102ad61042e366004612a6a565b610ce4565b6102ad6104413660046127dd565b610d71565b34801561045257600080fd5b506102ad610461366004612905565b610e04565b34801561047257600080fd5b506102ad610ef1565b34801561048757600080fd5b506102ad610496366004612a6a565b610f7a565b6102ad6104a93660046127dd565b611007565b3480156104ba57600080fd5b50610364611054565b3480156104cf57600080fd5b506102ad6104de3660046127f9565b611063565b3480156104ef57600080fd5b5061024a6104fe366004612b63565b6110ae565b34801561050f57600080fd5b506102ad61051e3660046127dd565b6110d9565b34801561052f57600080fd5b506102ad611121565b34801561054457600080fd5b506102ad610553366004612c72565b611133565b34801561056457600080fd5b50610280611251565b34801561057957600080fd5b506103d1611256565b34801561058e57600080fd5b50610364611286565b3480156105a357600080fd5b5061024a6105b23660046127dd565b611295565b3480156105c357600080fd5b506102ad6105d23660046127f9565b6112af565b3480156105e357600080fd5b50610364611353565b3480156105f857600080fd5b506102ad610607366004612853565b611362565b34801561061857600080fd5b506102806113b6565b34801561062d57600080fd5b506102ad61063c366004612b63565b6113c8565b34801561064d57600080fd5b506102ad61065c3660046127dd565b6113e7565b34801561066d57600080fd5b506102ad61067c366004612c17565b6114a8565b34801561068d57600080fd5b506103d16118d6565b60006001600160e01b03198216637965db0b60e01b14806106bb57506106bb826118f7565b90505b919050565b60009081526097602052604090206001015490565b600083815260cd602052604081208054859291906106f5906136dd565b90501161071d5760405162461bcd60e51b8152600401610714906135c6565b60405180910390fd5b610738610728611910565b856107338686611914565b611940565b50505050565b6107496105b2611910565b6107655760405162461bcd60e51b81526004016107149061349f565b600087815260cd60205260408120805489929190610782906136dd565b9050116107a15760405162461bcd60e51b8152600401610714906135c6565b6107f6898989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525060408051602081019091529081528c93508b92508a91508990611a36565b505050505050505050565b61080a826106c3565b61081b81610816611910565b611bbf565b6108258383611c23565b505050565b610832611910565b6001600160a01b0316610843611054565b6001600160a01b0316146108695760405162461bcd60e51b81526004016107149061355a565b61087281611caa565b50565b61087d611910565b6001600160a01b0316816001600160a01b0316146108ad5760405162461bcd60e51b815260040161071490613608565b6108b78282611cc2565b5050565b6108c66105b2611910565b6108e25760405162461bcd60e51b81526004016107149061349f565b600087815260cd602052604081208054899291906108ff906136dd565b90501161091e5760405162461bcd60e51b8152600401610714906135c6565b6107f6898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b92508a915089905088611d47565b60c9546001600160a01b031681565b61097f6105b2611910565b61099b5760405162461bcd60e51b81526004016107149061349f565b600083815260cd602052604081208054859291906109b8906136dd565b9050116109d75760405162461bcd60e51b8152600401610714906135c6565b6109f38585858560405180602001604052806000815250611ecc565b5050505050565b610a02611910565b6001600160a01b0316610a13611054565b6001600160a01b031614610a395760405162461bcd60e51b81526004016107149061355a565b60cc80546001600160a01b0319166001600160a01b0392909216919091179055565b606060008585604051610a6f929190612dfd565b604051809103902090506000610aec85858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604051610ae69250610acb915086903090602001612ddd565b6040516020818303038152906040528051906020012061203a565b9061206a565b905060008088888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050602081015192509050610b39836120f0565b610b44828a8a61211e565b600080306001600160a01b03168b8b604051610b61929190612dfd565b6000604051808303816000865af19150503d8060008114610b9e576040519150601f19603f3d011682016040523d82523d6000602084013e610ba3565b606091505b50909250905081610bbb576040513d806000833e8082fd5b6001600160e01b031984166001600160a01b038616610bd8611910565b6001600160a01b03167f9490f91465d0d2c12728b9ad47d5f1dd2ac3ef39394796e54a48b94db0b3372589604051610c10919061321c565b60405180910390a49a9950505050505050505050565b610c316105b2611910565b610c4d5760405162461bcd60e51b81526004016107149061349f565b600085815260cd60205260408120805487929190610c6a906136dd565b905011610c895760405162461bcd60e51b8152600401610714906135c6565b610ccc8787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ecc92505050565b50505050505050565b60cc546001600160a01b031681565b610cec611910565b6001600160a01b0316610cfd611054565b6001600160a01b031614610d235760405162461bcd60e51b81526004016107149061355a565b60005b81518110156108b757610d5f828281518110610d5257634e487b7160e01b600052603260045260246000fd5b6020026020010151611caa565b80610d6981613718565b915050610d26565b610d7c6105b2611910565b610d985760405162461bcd60e51b81526004016107149061349f565b6001600160a01b038116610dbe5760405162461bcd60e51b8152600401610714906133d8565b610dc7816121da565b610dcf611121565b6040516001600160a01b038216903480156108fc02916000818181858888f193505050501580156108b7573d6000803e3d6000fd5b610e0f6105b2611910565b610e2b5760405162461bcd60e51b81526004016107149061349f565b600089815260cd6020526040812080548b929190610e48906136dd565b905011610e675760405162461bcd60e51b8152600401610714906135c6565b610ee48b8b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b018190048102820181019092528981528e93508d92508c918c91908c908c9081908401838280828437600092019190915250611a3692505050565b5050505050505050505050565b610ef9611910565b6001600160a01b0316610f0a611054565b6001600160a01b031614610f305760405162461bcd60e51b81526004016107149061355a565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b610f82611910565b6001600160a01b0316610f93611054565b6001600160a01b031614610fb95760405162461bcd60e51b81526004016107149061355a565b60005b81518110156108b757610ff5828281518110610fe857634e487b7160e01b600052603260045260246000fd5b60200260200101516121da565b80610fff81613718565b915050610fbc565b6110126105b2611910565b61102e5760405162461bcd60e51b81526004016107149061349f565b6001600160a01b038116610dc75760405162461bcd60e51b8152600401610714906133d8565b6033546001600160a01b031690565b600083815260cd60205260408120805485929190611080906136dd565b90501161109f5760405162461bcd60e51b8152600401610714906135c6565b6109f385856107338686611914565b60009182526097602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6110e1611910565b6001600160a01b03166110f2611054565b6001600160a01b0316146111185760405162461bcd60e51b81526004016107149061355a565b610872816121da565b61113161112c611910565b611caa565b565b61113b611910565b6001600160a01b031661114c611054565b6001600160a01b0316146111725760405162461bcd60e51b81526004016107149061355a565b60c954604051632678375f60e21b81526001600160a01b03909116906399e0dd7c906111a49085908590600401613256565b600060405180830381600087803b1580156111be57600080fd5b505af11580156111d2573d6000803e3d6000fd5b505060cb546001600160a01b03161591506108b790505760cb54604051632678375f60e21b81526001600160a01b03909116906399e0dd7c9061121b9085908590600401613256565b600060405180830381600087803b15801561123557600080fd5b505af1158015611249573d6000803e3d6000fd5b505050505050565b600081565b604051806040016040528060148152602001732aa7299d1026b4b73a34b7339026b0b730b3b2b960611b81525081565b60cb546001600160a01b031681565b60006106bb600080516020613775833981519152836110ae565b6112ba6105b2611910565b6112d65760405162461bcd60e51b81526004016107149061349f565b600083815260cd602052604081208054859291906112f3906136dd565b9050116113125760405162461bcd60e51b8152600401610714906135c6565b6109f3858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061194092505050565b60ca546001600160a01b031681565b600087815260cd6020526040812080548992919061137f906136dd565b90501161139e5760405162461bcd60e51b8152600401610714906135c6565b6107f689896113ad8a8a611914565b88888888611d47565b60008051602061377583398151915281565b6113d1826106c3565b6113dd81610816611910565b6108258383611cc2565b6113ef611910565b6001600160a01b0316611400611054565b6001600160a01b0316146114265760405162461bcd60e51b81526004016107149061355a565b6001600160a01b03811661144c5760405162461bcd60e51b81526004016107149061335b565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff16806114c1575060005460ff16155b6114dd5760405162461bcd60e51b815260040161071490613451565b600054610100900460ff16158015611508576000805460ff1961ff0019909116610100171660011790555b60c980546001600160a01b038088166001600160a01b03199283161790925560ca805487841690831617905560cb805486841690831617905560cc80549285169290911691909117905561155a6121f2565b6115626122be565b61156b306121da565b60408051808201909152600681526563727970746f60d01b602080830191825260008051602061379583398151915260005260cd905290516115ce917f9535d3ea47c5e1398d3405b4fadc73de6b1b1e6a66f674a8886ab7a6c873a390916126b0565b50604080516101408101825260066101008201908152651dd85b1b195d60d21b610120830152815281518083018352600481526331b7b4b760e11b602082810191909152808301919091528251808401845260018152600f60fb1b8183015282840152825180840184526003808252621b999d60ea1b82840152606084019190915283518085018552600a815269313637b1b5b1b430b4b760b11b8184015260808401528351808501855260078152663134ba31b7b4b760c91b8184015260a0840152835180850185528181526207070760eb1b8184015260c0840152835180850190945283526264616f60e81b9083015260e081019190915260005b60088110156118bc576000808383600881106116f757634e487b7160e01b600052603260045260246000fd5b602002015160405160200161170c9190612e0d565b60405160208183030381529060405280519060200120604051602001611733929190612fb4565b6040516020818303038152906040528051906020012060001c905082826008811061176e57634e487b7160e01b600052603260045260246000fd5b602002015160cd600083815260200190815260200160002090805190602001906117999291906126b0565b5060c954604051634f558e7960e01b81526001600160a01b0390911690634f558e79906117ca90849060040161321c565b60206040518083038186803b1580156117e257600080fd5b505afa1580156117f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181a9190612b2b565b6118a95760c9546001600160a01b031663d3fc986461dead8386866008811061185357634e487b7160e01b600052603260045260246000fd5b60200201516040518463ffffffff1660e01b81526004016118769392919061309d565b600060405180830381600087803b15801561189057600080fd5b505af11580156118a4573d6000803e3d6000fd5b505050505b50806118b481613718565b9150506116cb565b505080156109f3576000805461ff00191690555050505050565b604051806040016040528060058152602001640302e312e360dc1b81525081565b6001600160e01b031981166301ffc9a760e01b14919050565b3390565b60608282604051602001611929929190612f19565b604051602081830303815290604052905092915050565b8160008051602061379583398151915214156119c45760ca5460cc5460405163c36c212560e01b81526001600160a01b039283169263c36c21259261198d92889287921690600401613020565b600060405180830381600087803b1580156119a757600080fd5b505af11580156119bb573d6000803e3d6000fd5b50505050610825565b60c9546001600160a01b031663d3fc9864846119e08585612332565b6119ea86866123ae565b6040518463ffffffff1660e01b8152600401611a089392919061309d565b600060405180830381600087803b158015611a2257600080fd5b505af1158015610ccc573d6000803e3d6000fd5b6000611a428888612332565b9050876000805160206137958339815191521415611b3d5760ca5460cc54604051630f95e75b60e31b81526001600160a01b0392831692637caf3ad892611a93928e928d9216908890600401613055565b600060405180830381600087803b158015611aad57600080fd5b505af1158015611ac1573d6000803e3d6000fd5b505086159150611b3890505760cc54604051633a0deb9d60e21b81526001600160a01b039091169063e837ae7490611b0590899089908990899088906004016131d7565b600060405180830381600087803b158015611b1f57600080fd5b505af1158015611b33573d6000803e3d6000fd5b505050505b6107f6565b60c9546001600160a01b031663efda4d3e8a83611b5a8c8c6123ae565b8a8a8a8a8a6040518963ffffffff1660e01b8152600401611b82989796959493929190613121565b600060405180830381600087803b158015611b9c57600080fd5b505af1158015611bb0573d6000803e3d6000fd5b50505050505050505050505050565b611bc982826110ae565b6108b757611be1816001600160a01b031660146123d1565b611bec8360206123d1565b604051602001611bfd929190612f3f565b60408051601f198184030181529082905262461bcd60e51b825261071491600401613243565b611c2d82826110ae565b6108b75760008281526097602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611c66611910565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61087260008051602061377583398151915282610875565b611ccc82826110ae565b156108b75760008281526097602090815260408083206001600160a01b03851684529091529020805460ff19169055611d03611910565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b6000611d538787612332565b9050866000805160206137958339815191521415611e4c5760ca5460cc5460405163c36c212560e01b81526001600160a01b039283169263c36c212592611da2928d928c921690600401613020565b600060405180830381600087803b158015611dbc57600080fd5b505af1158015611dd0573d6000803e3d6000fd5b505085159150611e4790505760cc54604051633a0deb9d60e21b81526001600160a01b039091169063e837ae7490611e1490889088908890889088906004016131d7565b600060405180830381600087803b158015611e2e57600080fd5b505af1158015611e42573d6000803e3d6000fd5b505050505b611ec2565b60c9546001600160a01b031663b0f591778983611e698b8b6123ae565b898989896040518863ffffffff1660e01b8152600401611e8f97969594939291906130c4565b600060405180830381600087803b158015611ea957600080fd5b505af1158015611ebd573d6000803e3d6000fd5b505050505b5050505050505050565b836000805160206137958339815191521415611f555760ca5460cc54604051630f95e75b60e31b81526001600160a01b0392831692637caf3ad892611f1e928a92899289929116908890600401612fd6565b600060405180830381600087803b158015611f3857600080fd5b505af1158015611f4c573d6000803e3d6000fd5b505050506109f3565b60c954604080516020601f86018190048102820181019092528481526001600160a01b039092169163b55bc617918891611fac91899190899089908190840183828082843760009201919091525061233292505050565b611fec8888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506123ae92505050565b856040518563ffffffff1660e01b815260040161200c9493929190613193565b600060405180830381600087803b15801561202657600080fd5b505af11580156107f6573d6000803e3d6000fd5b60008160405160200161204d9190612ee8565b604051602081830303815290604052805190602001209050919050565b6000806000808451604114156120945750505060208201516040830151606084015160001a6120da565b8451604014156120c25750505060408201516020830151906001600160ff1b0381169060ff1c601b016120da565b60405162461bcd60e51b815260040161071490613324565b6120e68682858561258a565b9695505050505050565b6120f981612680565b61210281611295565b6108725760405162461bcd60e51b815260040161071490613516565b60006001600160e01b0319841663ae2ad90360e01b148061214f57506001600160e01b03198416630260c0cf60e51b145b8061216a57506001600160e01b031984166358839d6b60e01b145b8061218557506001600160e01b0319841663039ccf4d60e41b145b806121a057506001600160e01b031984166327bbd22560e01b145b806121bb57506001600160e01b03198416633516912b60e11b145b9050806107385760405162461bcd60e51b8152600401610714906132de565b610872600080516020613775833981519152826126a6565b600054610100900460ff168061220b575060005460ff16155b6122275760405162461bcd60e51b815260040161071490613451565b600054610100900460ff16158015612252576000805460ff1961ff0019909116610100171660011790555b600061225c611910565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610872576000805461ff001916905550565b600054610100900460ff16806122d7575060005460ff16155b6122f35760405162461bcd60e51b815260040161071490613451565b600054610100900460ff1615801561231e576000805460ff1961ff0019909116610100171660011790555b8015610872576000805461ff001916905550565b60008151600014156123565760405162461bcd60e51b81526004016107149061358f565b82826040516020016123689190612e0d565b6040516020818303038152906040528051906020012060405160200161238f929190612fb4565b60408051601f1981840301815291905280516020909101209392505050565b600082815260cd6020908152604091829020915160609261192992859201612e29565b606060006123e083600261367b565b6123eb906002613663565b67ffffffffffffffff81111561241157634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561243b576020820181803683370190505b509050600360fc1b8160008151811061246457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106124a157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060006124c584600261367b565b6124d0906001613663565b90505b6001811115612564576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061251257634e487b7160e01b600052603260045260246000fd5b1a60f81b82828151811061253657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c9361255d816136c6565b90506124d3565b5083156125835760405162461bcd60e51b8152600401610714906132a9565b9392505050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156125cc5760405162461bcd60e51b81526004016107149061340f565b8360ff16601b14806125e157508360ff16601c145b6125fd5760405162461bcd60e51b8152600401610714906134d4565b6000600186868686604051600081526020016040526040516126229493929190613225565b6020604051602081039080840390855afa158015612644573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166126775760405162461bcd60e51b815260040161071490613272565b95945050505050565b6001600160a01b0381166108725760405162461bcd60e51b8152600401610714906133a1565b6108b78282611c23565b8280546126bc906136dd565b90600052602060002090601f0160209004810192826126de5760008555612724565b82601f106126f757805160ff1916838001178555612724565b82800160010185558215612724579182015b82811115612724578251825591602001919060010190612709565b50612730929150612734565b5090565b5b808211156127305760008155600101612735565b80356106be8161375f565b60008083601f840112612765578182fd5b50813567ffffffffffffffff81111561277c578182fd5b602083019150836020808302850101111561279657600080fd5b9250929050565b60008083601f8401126127ae578182fd5b50813567ffffffffffffffff8111156127c5578182fd5b60208301915083602082850101111561279657600080fd5b6000602082840312156127ee578081fd5b81356125838161375f565b6000806000806060858703121561280e578283fd5b84356128198161375f565b935060208501359250604085013567ffffffffffffffff81111561283b578283fd5b6128478782880161279d565b95989497509550505050565b60008060008060008060008060a0898b03121561286e578384fd5b88356128798161375f565b975060208901359650604089013567ffffffffffffffff8082111561289c578586fd5b6128a88c838d0161279d565b909850965060608b01359150808211156128c0578586fd5b6128cc8c838d01612754565b909650945060808b01359150808211156128e4578384fd5b506128f18b828c01612754565b999c989b5096995094979396929594505050565b60008060008060008060008060008060c08b8d031215612923578182fd5b61292c8b612749565b995060208b0135985060408b013567ffffffffffffffff8082111561294f578384fd5b61295b8e838f0161279d565b909a50985060608d0135915080821115612973578384fd5b61297f8e838f01612754565b909850965060808d0135915080821115612997578384fd5b6129a38e838f01612754565b909650945060a08d01359150808211156129bb578384fd5b506129c88d828e0161279d565b915080935050809150509295989b9194979a5092959850565b600080600080600080608087890312156129f9578182fd5b8635612a048161375f565b955060208701359450604087013567ffffffffffffffff80821115612a27578384fd5b612a338a838b0161279d565b90965094506060890135915080821115612a4b578384fd5b50612a5889828a0161279d565b979a9699509497509295939492505050565b60006020808385031215612a7c578182fd5b823567ffffffffffffffff80821115612a93578384fd5b818501915085601f830112612aa6578384fd5b813581811115612ab857612ab8613749565b83810260405185828201018181108582111715612ad757612ad7613749565b604052828152858101935084860182860187018a1015612af5578788fd5b8795505b83861015612b1e57612b0a81612749565b855260019590950194938601938601612af9565b5098975050505050505050565b600060208284031215612b3c578081fd5b81518015158114612583578182fd5b600060208284031215612b5c578081fd5b5035919050565b60008060408385031215612b75578182fd5b823591506020830135612b878161375f565b809150509250929050565b600060208284031215612ba3578081fd5b81356001600160e01b031981168114612583578182fd5b60008060008060408587031215612bcf578182fd5b843567ffffffffffffffff80821115612be6578384fd5b612bf28883890161279d565b90965094506020870135915080821115612c0a578384fd5b506128478782880161279d565b60008060008060808587031215612c2c578182fd5b8435612c378161375f565b93506020850135612c478161375f565b92506040850135612c578161375f565b91506060850135612c678161375f565b939692955090935050565b60008060208385031215612c84578182fd5b823567ffffffffffffffff811115612c9a578283fd5b612ca68582860161279d565b90969095509350505050565b600080600060408486031215612cc6578081fd5b83359250602084013567ffffffffffffffff811115612ce3578182fd5b612cef8682870161279d565b9497909650939450505050565b818352602080840193600091908185020181018584845b87811015612d7a5782840389528135601e19883603018112612d33578687fd5b8701803567ffffffffffffffff811115612d4b578788fd5b803603891315612d59578788fd5b612d668682898501612db3565b9a87019a9550505090840190600101612d13565b5091979650505050505050565b60008151808452612d9f81602086016020860161369a565b601f01601f19169290920160200192915050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b91825260601b6bffffffffffffffffffffffff1916602082015260340190565b6000828483379101908152919050565b60008251612e1f81846020870161369a565b9190910192915050565b600083516020612e3c828583890161369a565b601760f91b918401918252845460019084906002810481841680612e6157607f821691505b858210811415612e7f57634e487b7160e01b88526022600452602488fd5b808015612e935760018114612ea857612ed8565b60ff1984168887015282880186019450612ed8565b612eb18b613657565b895b84811015612ece5781548a8201890152908701908801612eb3565b5050858389010194505b50929a9950505050505050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b6000697564746573746465762d60b01b82528284600a8401379101600a01908152919050565b60007f416363657373436f6e74726f6c3a206163636f756e742000000000000000000082528351612f7781601785016020880161369a565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612fa881602884016020880161369a565b01602801949350505050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b600060018060a01b03808816835260806020840152612ff9608084018789612db3565b818616604085015283810360608501526130138186612d87565b9998505050505050505050565b600060018060a01b038086168352606060208401526130426060840186612d87565b9150808416604084015250949350505050565b600060018060a01b038087168352608060208401526130776080840187612d87565b818616604085015283810360608501526130918186612d87565b98975050505050505050565b600060018060a01b0385168252836020830152606060408301526126776060830184612d87565b600060018060a01b038916825287602083015260a060408301526130eb60a0830188612d87565b82810360608401526130fe818789612cfc565b90508281036080840152613113818587612cfc565b9a9950505050505050505050565b600060018060a01b038a16825288602083015260c0604083015261314860c0830189612d87565b828103606084015261315b81888a612cfc565b90508281036080840152613170818688612cfc565b905082810360a08401526131848185612d87565b9b9a5050505050505050505050565b600060018060a01b0386168252846020830152608060408301526131ba6080830185612d87565b82810360608401526131cc8185612d87565b979650505050505050565b6000606082526131eb606083018789612cfc565b82810360208401526131fe818688612cfc565b9150508260408301529695505050505050565b901515815260200190565b90815260200190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526125836020830184612d87565b60006020825261326a602083018486612db3565b949350505050565b60208082526018908201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604082015260600190565b6020808252818101527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604082015260600190565b60208082526026908201527f4d696e74696e674d616e616765723a20554e535550504f525445445f52454c416040820152651657d0d0531360d21b606082015260800190565b6020808252601f908201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601d908201527f52656c617965723a205349474e41545552455f49535f494e56414c4944000000604082015260600190565b6020808252601d908201527f4d696e746572526f6c653a2052454345495645525f49535f454d505459000000604082015260600190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604082015261756560f01b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252818101527f4d696e746572526f6c653a2043414c4c45525f49535f4e4f545f4d494e544552604082015260600190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604082015261756560f01b606082015260800190565b60208082526024908201527f4d696e74696e674d616e616765723a205349474e45525f49535f4e4f545f4d49604082015263272a22a960e11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601b908201527f4d696e74696e674d616e616765723a204c4142454c5f454d5054590000000000604082015260600190565b60208082526022908201527f4d696e74696e674d616e616765723a20544c445f4e4f545f5245474953544552604082015261115160f21b606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201526e103937b632b9903337b91039b2b63360891b606082015260800190565b60009081526020902090565b6000821982111561367657613676613733565b500190565b600081600019048311821515161561369557613695613733565b500290565b60005b838110156136b557818101518382015260200161369d565b838111156107385750506000910152565b6000816136d5576136d5613733565b506000190190565b6002810460018216806136f157607f821691505b6020821081141561371257634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561372c5761372c613733565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461087257600080fdfe9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a60f4a10a4f46c288cea365fcf45cccf0e9d901b945b9829ccdb54c10dc3cb7a6fa2646970667358221220ca74e66ff0173a2047b9db3648ee9aaaf0f52881454770f60af021adb696370e64736f6c63430008000033
Deployed Bytecode
0x6080604052600436106102255760003560e01c806381c81d3511610123578063a849d65c116100ab578063d53913931161006f578063d53913931461060c578063d547741f14610621578063f2fde38b14610641578063f8c8765e14610661578063ffa1ad741461068157610225565b8063a849d65c14610582578063aa271e1a14610597578063ae2ad903146105b7578063cc2c3fc4146105d7578063ceeb4f50146105ec57610225565b8063983b2d56116100f2578063983b2d5614610503578063986502751461052357806399e0dd7c14610538578063a217fddf14610558578063a3f4df7e1461056d57610225565b806381c81d351461049b5780638da5cb5b146104ae578063906cecc1146104c357806391d14854146104e357610225565b80634c1819e0116101b15780635fc1964f116101755780635fc1964f14610413578063634486da146104335780636a2d225614610446578063715018a61461046657806371e2a6571461047b57610225565b80634c1819e0146103715780634e543b2614610391578063564a5158146103b157806358839d6b146103de5780635b6fa8db146103fe57610225565b80632f2ff15d116101f85780632f2ff15d146102cf5780633092afd5146102ef57806336568abe1461030f57806339ccf4d01461032f5780633f41b6141461034f57610225565b806301ffc9a71461022a578063248a9ca314610260578063268b15ed1461028d57806327bbd225146102af575b600080fd5b34801561023657600080fd5b5061024a610245366004612b92565b610696565b6040516102579190613211565b60405180910390f35b34801561026c57600080fd5b5061028061027b366004612b4b565b6106c3565b604051610257919061321c565b34801561029957600080fd5b506102ad6102a8366004612cb2565b6106d8565b005b3480156102bb57600080fd5b506102ad6102ca366004612853565b61073e565b3480156102db57600080fd5b506102ad6102ea366004612b63565b610801565b3480156102fb57600080fd5b506102ad61030a3660046127dd565b61082a565b34801561031b57600080fd5b506102ad61032a366004612b63565b610875565b34801561033b57600080fd5b506102ad61034a366004612853565b6108bb565b34801561035b57600080fd5b50610364610965565b6040516102579190612fc2565b34801561037d57600080fd5b506102ad61038c3660046127f9565b610974565b34801561039d57600080fd5b506102ad6103ac3660046127dd565b6109fa565b3480156103bd57600080fd5b506103d16103cc366004612bba565b610a5b565b6040516102579190613243565b3480156103ea57600080fd5b506102ad6103f93660046129e1565b610c26565b34801561040a57600080fd5b50610364610cd5565b34801561041f57600080fd5b506102ad61042e366004612a6a565b610ce4565b6102ad6104413660046127dd565b610d71565b34801561045257600080fd5b506102ad610461366004612905565b610e04565b34801561047257600080fd5b506102ad610ef1565b34801561048757600080fd5b506102ad610496366004612a6a565b610f7a565b6102ad6104a93660046127dd565b611007565b3480156104ba57600080fd5b50610364611054565b3480156104cf57600080fd5b506102ad6104de3660046127f9565b611063565b3480156104ef57600080fd5b5061024a6104fe366004612b63565b6110ae565b34801561050f57600080fd5b506102ad61051e3660046127dd565b6110d9565b34801561052f57600080fd5b506102ad611121565b34801561054457600080fd5b506102ad610553366004612c72565b611133565b34801561056457600080fd5b50610280611251565b34801561057957600080fd5b506103d1611256565b34801561058e57600080fd5b50610364611286565b3480156105a357600080fd5b5061024a6105b23660046127dd565b611295565b3480156105c357600080fd5b506102ad6105d23660046127f9565b6112af565b3480156105e357600080fd5b50610364611353565b3480156105f857600080fd5b506102ad610607366004612853565b611362565b34801561061857600080fd5b506102806113b6565b34801561062d57600080fd5b506102ad61063c366004612b63565b6113c8565b34801561064d57600080fd5b506102ad61065c3660046127dd565b6113e7565b34801561066d57600080fd5b506102ad61067c366004612c17565b6114a8565b34801561068d57600080fd5b506103d16118d6565b60006001600160e01b03198216637965db0b60e01b14806106bb57506106bb826118f7565b90505b919050565b60009081526097602052604090206001015490565b600083815260cd602052604081208054859291906106f5906136dd565b90501161071d5760405162461bcd60e51b8152600401610714906135c6565b60405180910390fd5b610738610728611910565b856107338686611914565b611940565b50505050565b6107496105b2611910565b6107655760405162461bcd60e51b81526004016107149061349f565b600087815260cd60205260408120805489929190610782906136dd565b9050116107a15760405162461bcd60e51b8152600401610714906135c6565b6107f6898989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092018290525060408051602081019091529081528c93508b92508a91508990611a36565b505050505050505050565b61080a826106c3565b61081b81610816611910565b611bbf565b6108258383611c23565b505050565b610832611910565b6001600160a01b0316610843611054565b6001600160a01b0316146108695760405162461bcd60e51b81526004016107149061355a565b61087281611caa565b50565b61087d611910565b6001600160a01b0316816001600160a01b0316146108ad5760405162461bcd60e51b815260040161071490613608565b6108b78282611cc2565b5050565b6108c66105b2611910565b6108e25760405162461bcd60e51b81526004016107149061349f565b600087815260cd602052604081208054899291906108ff906136dd565b90501161091e5760405162461bcd60e51b8152600401610714906135c6565b6107f6898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b92508a915089905088611d47565b60c9546001600160a01b031681565b61097f6105b2611910565b61099b5760405162461bcd60e51b81526004016107149061349f565b600083815260cd602052604081208054859291906109b8906136dd565b9050116109d75760405162461bcd60e51b8152600401610714906135c6565b6109f38585858560405180602001604052806000815250611ecc565b5050505050565b610a02611910565b6001600160a01b0316610a13611054565b6001600160a01b031614610a395760405162461bcd60e51b81526004016107149061355a565b60cc80546001600160a01b0319166001600160a01b0392909216919091179055565b606060008585604051610a6f929190612dfd565b604051809103902090506000610aec85858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604051610ae69250610acb915086903090602001612ddd565b6040516020818303038152906040528051906020012061203a565b9061206a565b905060008088888080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050602081015192509050610b39836120f0565b610b44828a8a61211e565b600080306001600160a01b03168b8b604051610b61929190612dfd565b6000604051808303816000865af19150503d8060008114610b9e576040519150601f19603f3d011682016040523d82523d6000602084013e610ba3565b606091505b50909250905081610bbb576040513d806000833e8082fd5b6001600160e01b031984166001600160a01b038616610bd8611910565b6001600160a01b03167f9490f91465d0d2c12728b9ad47d5f1dd2ac3ef39394796e54a48b94db0b3372589604051610c10919061321c565b60405180910390a49a9950505050505050505050565b610c316105b2611910565b610c4d5760405162461bcd60e51b81526004016107149061349f565b600085815260cd60205260408120805487929190610c6a906136dd565b905011610c895760405162461bcd60e51b8152600401610714906135c6565b610ccc8787878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611ecc92505050565b50505050505050565b60cc546001600160a01b031681565b610cec611910565b6001600160a01b0316610cfd611054565b6001600160a01b031614610d235760405162461bcd60e51b81526004016107149061355a565b60005b81518110156108b757610d5f828281518110610d5257634e487b7160e01b600052603260045260246000fd5b6020026020010151611caa565b80610d6981613718565b915050610d26565b610d7c6105b2611910565b610d985760405162461bcd60e51b81526004016107149061349f565b6001600160a01b038116610dbe5760405162461bcd60e51b8152600401610714906133d8565b610dc7816121da565b610dcf611121565b6040516001600160a01b038216903480156108fc02916000818181858888f193505050501580156108b7573d6000803e3d6000fd5b610e0f6105b2611910565b610e2b5760405162461bcd60e51b81526004016107149061349f565b600089815260cd6020526040812080548b929190610e48906136dd565b905011610e675760405162461bcd60e51b8152600401610714906135c6565b610ee48b8b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b018190048102820181019092528981528e93508d92508c918c91908c908c9081908401838280828437600092019190915250611a3692505050565b5050505050505050505050565b610ef9611910565b6001600160a01b0316610f0a611054565b6001600160a01b031614610f305760405162461bcd60e51b81526004016107149061355a565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b610f82611910565b6001600160a01b0316610f93611054565b6001600160a01b031614610fb95760405162461bcd60e51b81526004016107149061355a565b60005b81518110156108b757610ff5828281518110610fe857634e487b7160e01b600052603260045260246000fd5b60200260200101516121da565b80610fff81613718565b915050610fbc565b6110126105b2611910565b61102e5760405162461bcd60e51b81526004016107149061349f565b6001600160a01b038116610dc75760405162461bcd60e51b8152600401610714906133d8565b6033546001600160a01b031690565b600083815260cd60205260408120805485929190611080906136dd565b90501161109f5760405162461bcd60e51b8152600401610714906135c6565b6109f385856107338686611914565b60009182526097602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6110e1611910565b6001600160a01b03166110f2611054565b6001600160a01b0316146111185760405162461bcd60e51b81526004016107149061355a565b610872816121da565b61113161112c611910565b611caa565b565b61113b611910565b6001600160a01b031661114c611054565b6001600160a01b0316146111725760405162461bcd60e51b81526004016107149061355a565b60c954604051632678375f60e21b81526001600160a01b03909116906399e0dd7c906111a49085908590600401613256565b600060405180830381600087803b1580156111be57600080fd5b505af11580156111d2573d6000803e3d6000fd5b505060cb546001600160a01b03161591506108b790505760cb54604051632678375f60e21b81526001600160a01b03909116906399e0dd7c9061121b9085908590600401613256565b600060405180830381600087803b15801561123557600080fd5b505af1158015611249573d6000803e3d6000fd5b505050505050565b600081565b604051806040016040528060148152602001732aa7299d1026b4b73a34b7339026b0b730b3b2b960611b81525081565b60cb546001600160a01b031681565b60006106bb600080516020613775833981519152836110ae565b6112ba6105b2611910565b6112d65760405162461bcd60e51b81526004016107149061349f565b600083815260cd602052604081208054859291906112f3906136dd565b9050116113125760405162461bcd60e51b8152600401610714906135c6565b6109f3858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061194092505050565b60ca546001600160a01b031681565b600087815260cd6020526040812080548992919061137f906136dd565b90501161139e5760405162461bcd60e51b8152600401610714906135c6565b6107f689896113ad8a8a611914565b88888888611d47565b60008051602061377583398151915281565b6113d1826106c3565b6113dd81610816611910565b6108258383611cc2565b6113ef611910565b6001600160a01b0316611400611054565b6001600160a01b0316146114265760405162461bcd60e51b81526004016107149061355a565b6001600160a01b03811661144c5760405162461bcd60e51b81526004016107149061335b565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff16806114c1575060005460ff16155b6114dd5760405162461bcd60e51b815260040161071490613451565b600054610100900460ff16158015611508576000805460ff1961ff0019909116610100171660011790555b60c980546001600160a01b038088166001600160a01b03199283161790925560ca805487841690831617905560cb805486841690831617905560cc80549285169290911691909117905561155a6121f2565b6115626122be565b61156b306121da565b60408051808201909152600681526563727970746f60d01b602080830191825260008051602061379583398151915260005260cd905290516115ce917f9535d3ea47c5e1398d3405b4fadc73de6b1b1e6a66f674a8886ab7a6c873a390916126b0565b50604080516101408101825260066101008201908152651dd85b1b195d60d21b610120830152815281518083018352600481526331b7b4b760e11b602082810191909152808301919091528251808401845260018152600f60fb1b8183015282840152825180840184526003808252621b999d60ea1b82840152606084019190915283518085018552600a815269313637b1b5b1b430b4b760b11b8184015260808401528351808501855260078152663134ba31b7b4b760c91b8184015260a0840152835180850185528181526207070760eb1b8184015260c0840152835180850190945283526264616f60e81b9083015260e081019190915260005b60088110156118bc576000808383600881106116f757634e487b7160e01b600052603260045260246000fd5b602002015160405160200161170c9190612e0d565b60405160208183030381529060405280519060200120604051602001611733929190612fb4565b6040516020818303038152906040528051906020012060001c905082826008811061176e57634e487b7160e01b600052603260045260246000fd5b602002015160cd600083815260200190815260200160002090805190602001906117999291906126b0565b5060c954604051634f558e7960e01b81526001600160a01b0390911690634f558e79906117ca90849060040161321c565b60206040518083038186803b1580156117e257600080fd5b505afa1580156117f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061181a9190612b2b565b6118a95760c9546001600160a01b031663d3fc986461dead8386866008811061185357634e487b7160e01b600052603260045260246000fd5b60200201516040518463ffffffff1660e01b81526004016118769392919061309d565b600060405180830381600087803b15801561189057600080fd5b505af11580156118a4573d6000803e3d6000fd5b505050505b50806118b481613718565b9150506116cb565b505080156109f3576000805461ff00191690555050505050565b604051806040016040528060058152602001640302e312e360dc1b81525081565b6001600160e01b031981166301ffc9a760e01b14919050565b3390565b60608282604051602001611929929190612f19565b604051602081830303815290604052905092915050565b8160008051602061379583398151915214156119c45760ca5460cc5460405163c36c212560e01b81526001600160a01b039283169263c36c21259261198d92889287921690600401613020565b600060405180830381600087803b1580156119a757600080fd5b505af11580156119bb573d6000803e3d6000fd5b50505050610825565b60c9546001600160a01b031663d3fc9864846119e08585612332565b6119ea86866123ae565b6040518463ffffffff1660e01b8152600401611a089392919061309d565b600060405180830381600087803b158015611a2257600080fd5b505af1158015610ccc573d6000803e3d6000fd5b6000611a428888612332565b9050876000805160206137958339815191521415611b3d5760ca5460cc54604051630f95e75b60e31b81526001600160a01b0392831692637caf3ad892611a93928e928d9216908890600401613055565b600060405180830381600087803b158015611aad57600080fd5b505af1158015611ac1573d6000803e3d6000fd5b505086159150611b3890505760cc54604051633a0deb9d60e21b81526001600160a01b039091169063e837ae7490611b0590899089908990899088906004016131d7565b600060405180830381600087803b158015611b1f57600080fd5b505af1158015611b33573d6000803e3d6000fd5b505050505b6107f6565b60c9546001600160a01b031663efda4d3e8a83611b5a8c8c6123ae565b8a8a8a8a8a6040518963ffffffff1660e01b8152600401611b82989796959493929190613121565b600060405180830381600087803b158015611b9c57600080fd5b505af1158015611bb0573d6000803e3d6000fd5b50505050505050505050505050565b611bc982826110ae565b6108b757611be1816001600160a01b031660146123d1565b611bec8360206123d1565b604051602001611bfd929190612f3f565b60408051601f198184030181529082905262461bcd60e51b825261071491600401613243565b611c2d82826110ae565b6108b75760008281526097602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611c66611910565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61087260008051602061377583398151915282610875565b611ccc82826110ae565b156108b75760008281526097602090815260408083206001600160a01b03851684529091529020805460ff19169055611d03611910565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b6000611d538787612332565b9050866000805160206137958339815191521415611e4c5760ca5460cc5460405163c36c212560e01b81526001600160a01b039283169263c36c212592611da2928d928c921690600401613020565b600060405180830381600087803b158015611dbc57600080fd5b505af1158015611dd0573d6000803e3d6000fd5b505085159150611e4790505760cc54604051633a0deb9d60e21b81526001600160a01b039091169063e837ae7490611e1490889088908890889088906004016131d7565b600060405180830381600087803b158015611e2e57600080fd5b505af1158015611e42573d6000803e3d6000fd5b505050505b611ec2565b60c9546001600160a01b031663b0f591778983611e698b8b6123ae565b898989896040518863ffffffff1660e01b8152600401611e8f97969594939291906130c4565b600060405180830381600087803b158015611ea957600080fd5b505af1158015611ebd573d6000803e3d6000fd5b505050505b5050505050505050565b836000805160206137958339815191521415611f555760ca5460cc54604051630f95e75b60e31b81526001600160a01b0392831692637caf3ad892611f1e928a92899289929116908890600401612fd6565b600060405180830381600087803b158015611f3857600080fd5b505af1158015611f4c573d6000803e3d6000fd5b505050506109f3565b60c954604080516020601f86018190048102820181019092528481526001600160a01b039092169163b55bc617918891611fac91899190899089908190840183828082843760009201919091525061233292505050565b611fec8888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506123ae92505050565b856040518563ffffffff1660e01b815260040161200c9493929190613193565b600060405180830381600087803b15801561202657600080fd5b505af11580156107f6573d6000803e3d6000fd5b60008160405160200161204d9190612ee8565b604051602081830303815290604052805190602001209050919050565b6000806000808451604114156120945750505060208201516040830151606084015160001a6120da565b8451604014156120c25750505060408201516020830151906001600160ff1b0381169060ff1c601b016120da565b60405162461bcd60e51b815260040161071490613324565b6120e68682858561258a565b9695505050505050565b6120f981612680565b61210281611295565b6108725760405162461bcd60e51b815260040161071490613516565b60006001600160e01b0319841663ae2ad90360e01b148061214f57506001600160e01b03198416630260c0cf60e51b145b8061216a57506001600160e01b031984166358839d6b60e01b145b8061218557506001600160e01b0319841663039ccf4d60e41b145b806121a057506001600160e01b031984166327bbd22560e01b145b806121bb57506001600160e01b03198416633516912b60e11b145b9050806107385760405162461bcd60e51b8152600401610714906132de565b610872600080516020613775833981519152826126a6565b600054610100900460ff168061220b575060005460ff16155b6122275760405162461bcd60e51b815260040161071490613451565b600054610100900460ff16158015612252576000805460ff1961ff0019909116610100171660011790555b600061225c611910565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610872576000805461ff001916905550565b600054610100900460ff16806122d7575060005460ff16155b6122f35760405162461bcd60e51b815260040161071490613451565b600054610100900460ff1615801561231e576000805460ff1961ff0019909116610100171660011790555b8015610872576000805461ff001916905550565b60008151600014156123565760405162461bcd60e51b81526004016107149061358f565b82826040516020016123689190612e0d565b6040516020818303038152906040528051906020012060405160200161238f929190612fb4565b60408051601f1981840301815291905280516020909101209392505050565b600082815260cd6020908152604091829020915160609261192992859201612e29565b606060006123e083600261367b565b6123eb906002613663565b67ffffffffffffffff81111561241157634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561243b576020820181803683370190505b509050600360fc1b8160008151811061246457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106124a157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060006124c584600261367b565b6124d0906001613663565b90505b6001811115612564576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061251257634e487b7160e01b600052603260045260246000fd5b1a60f81b82828151811061253657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c9361255d816136c6565b90506124d3565b5083156125835760405162461bcd60e51b8152600401610714906132a9565b9392505050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156125cc5760405162461bcd60e51b81526004016107149061340f565b8360ff16601b14806125e157508360ff16601c145b6125fd5760405162461bcd60e51b8152600401610714906134d4565b6000600186868686604051600081526020016040526040516126229493929190613225565b6020604051602081039080840390855afa158015612644573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166126775760405162461bcd60e51b815260040161071490613272565b95945050505050565b6001600160a01b0381166108725760405162461bcd60e51b8152600401610714906133a1565b6108b78282611c23565b8280546126bc906136dd565b90600052602060002090601f0160209004810192826126de5760008555612724565b82601f106126f757805160ff1916838001178555612724565b82800160010185558215612724579182015b82811115612724578251825591602001919060010190612709565b50612730929150612734565b5090565b5b808211156127305760008155600101612735565b80356106be8161375f565b60008083601f840112612765578182fd5b50813567ffffffffffffffff81111561277c578182fd5b602083019150836020808302850101111561279657600080fd5b9250929050565b60008083601f8401126127ae578182fd5b50813567ffffffffffffffff8111156127c5578182fd5b60208301915083602082850101111561279657600080fd5b6000602082840312156127ee578081fd5b81356125838161375f565b6000806000806060858703121561280e578283fd5b84356128198161375f565b935060208501359250604085013567ffffffffffffffff81111561283b578283fd5b6128478782880161279d565b95989497509550505050565b60008060008060008060008060a0898b03121561286e578384fd5b88356128798161375f565b975060208901359650604089013567ffffffffffffffff8082111561289c578586fd5b6128a88c838d0161279d565b909850965060608b01359150808211156128c0578586fd5b6128cc8c838d01612754565b909650945060808b01359150808211156128e4578384fd5b506128f18b828c01612754565b999c989b5096995094979396929594505050565b60008060008060008060008060008060c08b8d031215612923578182fd5b61292c8b612749565b995060208b0135985060408b013567ffffffffffffffff8082111561294f578384fd5b61295b8e838f0161279d565b909a50985060608d0135915080821115612973578384fd5b61297f8e838f01612754565b909850965060808d0135915080821115612997578384fd5b6129a38e838f01612754565b909650945060a08d01359150808211156129bb578384fd5b506129c88d828e0161279d565b915080935050809150509295989b9194979a5092959850565b600080600080600080608087890312156129f9578182fd5b8635612a048161375f565b955060208701359450604087013567ffffffffffffffff80821115612a27578384fd5b612a338a838b0161279d565b90965094506060890135915080821115612a4b578384fd5b50612a5889828a0161279d565b979a9699509497509295939492505050565b60006020808385031215612a7c578182fd5b823567ffffffffffffffff80821115612a93578384fd5b818501915085601f830112612aa6578384fd5b813581811115612ab857612ab8613749565b83810260405185828201018181108582111715612ad757612ad7613749565b604052828152858101935084860182860187018a1015612af5578788fd5b8795505b83861015612b1e57612b0a81612749565b855260019590950194938601938601612af9565b5098975050505050505050565b600060208284031215612b3c578081fd5b81518015158114612583578182fd5b600060208284031215612b5c578081fd5b5035919050565b60008060408385031215612b75578182fd5b823591506020830135612b878161375f565b809150509250929050565b600060208284031215612ba3578081fd5b81356001600160e01b031981168114612583578182fd5b60008060008060408587031215612bcf578182fd5b843567ffffffffffffffff80821115612be6578384fd5b612bf28883890161279d565b90965094506020870135915080821115612c0a578384fd5b506128478782880161279d565b60008060008060808587031215612c2c578182fd5b8435612c378161375f565b93506020850135612c478161375f565b92506040850135612c578161375f565b91506060850135612c678161375f565b939692955090935050565b60008060208385031215612c84578182fd5b823567ffffffffffffffff811115612c9a578283fd5b612ca68582860161279d565b90969095509350505050565b600080600060408486031215612cc6578081fd5b83359250602084013567ffffffffffffffff811115612ce3578182fd5b612cef8682870161279d565b9497909650939450505050565b818352602080840193600091908185020181018584845b87811015612d7a5782840389528135601e19883603018112612d33578687fd5b8701803567ffffffffffffffff811115612d4b578788fd5b803603891315612d59578788fd5b612d668682898501612db3565b9a87019a9550505090840190600101612d13565b5091979650505050505050565b60008151808452612d9f81602086016020860161369a565b601f01601f19169290920160200192915050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b91825260601b6bffffffffffffffffffffffff1916602082015260340190565b6000828483379101908152919050565b60008251612e1f81846020870161369a565b9190910192915050565b600083516020612e3c828583890161369a565b601760f91b918401918252845460019084906002810481841680612e6157607f821691505b858210811415612e7f57634e487b7160e01b88526022600452602488fd5b808015612e935760018114612ea857612ed8565b60ff1984168887015282880186019450612ed8565b612eb18b613657565b895b84811015612ece5781548a8201890152908701908801612eb3565b5050858389010194505b50929a9950505050505050505050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b6000697564746573746465762d60b01b82528284600a8401379101600a01908152919050565b60007f416363657373436f6e74726f6c3a206163636f756e742000000000000000000082528351612f7781601785016020880161369a565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351612fa881602884016020880161369a565b01602801949350505050565b918252602082015260400190565b6001600160a01b0391909116815260200190565b600060018060a01b03808816835260806020840152612ff9608084018789612db3565b818616604085015283810360608501526130138186612d87565b9998505050505050505050565b600060018060a01b038086168352606060208401526130426060840186612d87565b9150808416604084015250949350505050565b600060018060a01b038087168352608060208401526130776080840187612d87565b818616604085015283810360608501526130918186612d87565b98975050505050505050565b600060018060a01b0385168252836020830152606060408301526126776060830184612d87565b600060018060a01b038916825287602083015260a060408301526130eb60a0830188612d87565b82810360608401526130fe818789612cfc565b90508281036080840152613113818587612cfc565b9a9950505050505050505050565b600060018060a01b038a16825288602083015260c0604083015261314860c0830189612d87565b828103606084015261315b81888a612cfc565b90508281036080840152613170818688612cfc565b905082810360a08401526131848185612d87565b9b9a5050505050505050505050565b600060018060a01b0386168252846020830152608060408301526131ba6080830185612d87565b82810360608401526131cc8185612d87565b979650505050505050565b6000606082526131eb606083018789612cfc565b82810360208401526131fe818688612cfc565b9150508260408301529695505050505050565b901515815260200190565b90815260200190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526125836020830184612d87565b60006020825261326a602083018486612db3565b949350505050565b60208082526018908201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604082015260600190565b6020808252818101527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604082015260600190565b60208082526026908201527f4d696e74696e674d616e616765723a20554e535550504f525445445f52454c416040820152651657d0d0531360d21b606082015260800190565b6020808252601f908201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601d908201527f52656c617965723a205349474e41545552455f49535f494e56414c4944000000604082015260600190565b6020808252601d908201527f4d696e746572526f6c653a2052454345495645525f49535f454d505459000000604082015260600190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604082015261756560f01b606082015260800190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252818101527f4d696e746572526f6c653a2043414c4c45525f49535f4e4f545f4d494e544552604082015260600190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604082015261756560f01b606082015260800190565b60208082526024908201527f4d696e74696e674d616e616765723a205349474e45525f49535f4e4f545f4d49604082015263272a22a960e11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601b908201527f4d696e74696e674d616e616765723a204c4142454c5f454d5054590000000000604082015260600190565b60208082526022908201527f4d696e74696e674d616e616765723a20544c445f4e4f545f5245474953544552604082015261115160f21b606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201526e103937b632b9903337b91039b2b63360891b606082015260800190565b60009081526020902090565b6000821982111561367657613676613733565b500190565b600081600019048311821515161561369557613695613733565b500290565b60005b838110156136b557818101518382015260200161369d565b838111156107385750506000910152565b6000816136d5576136d5613733565b506000190190565b6002810460018216806136f157607f821691505b6020821081141561371257634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561372c5761372c613733565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461087257600080fdfe9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a60f4a10a4f46c288cea365fcf45cccf0e9d901b945b9829ccdb54c10dc3cb7a6fa2646970667358221220ca74e66ff0173a2047b9db3648ee9aaaf0f52881454770f60af021adb696370e64736f6c63430008000033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.