Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
0 E3EB
Holders
90
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 E3EBLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
Easy3EarlyBird
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-04-09 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } /** * @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 Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @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 Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. 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. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @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) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) { // 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 (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): 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. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @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) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @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 Message, created from `s`. 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(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @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)); } } abstract contract SignerValidator { address public remoteSigner; constructor(address remoteSigner_) { _setRemoteSigner(remoteSigner_); } function _setRemoteSigner(address remoteSigner_) internal { remoteSigner = remoteSigner_; } function _validSignature(bytes32 msgHash, bytes memory signature) internal view { address signer = ECDSA.recover(ECDSA.toEthSignedMessageHash(msgHash), signature); require(signer == remoteSigner, "invalid signature"); } } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: 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 Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @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); } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all"); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner nor approved"); _safeTransfer(from, to, tokenId, data); } /** * @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. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 tokenId) internal virtual {} } contract Easy3EarlyBird is ERC721, SignerValidator, Ownable { uint256 public constant MAX_SUPPLY = 1000; uint256 public constant MAX_MINT = 500; uint256 public mintCounter = 0; uint256 public reserveCounter = MAX_SUPPLY - MAX_MINT; mapping(address account => bool minted) public isMinted; string private _uri; constructor(address remoteSigner_, string memory uri_) ERC721("Easy3 Early Bird NFT", "E3EB") SignerValidator(remoteSigner_) { _uri = uri_; } function setBaseURI(string memory uri_) external onlyOwner { _uri = uri_; } function setRemoteSigner(address remoteSigner_) external onlyOwner { _setRemoteSigner(remoteSigner_); } function mint(address to, bool isReserved, bytes memory signature) external { require(!isMinted[to], "already minted"); isMinted[to] = true; bytes32 msgHash = keccak256(abi.encode(to, isReserved)); _validSignature(msgHash, signature); uint256 tokenId; if (isReserved) { tokenId = reserveCounter; require(tokenId < MAX_SUPPLY, "max reserve reached"); reserveCounter = tokenId + 1; } else { tokenId = mintCounter; require(tokenId < MAX_MINT, "max mint reached"); mintCounter = tokenId + 1; } _safeMint(to, tokenId); } function _baseURI() internal view virtual override returns (string memory) { return _uri; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"remoteSigner_","type":"address"},{"internalType":"string","name":"uri_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinted","outputs":[{"internalType":"bool","name":"minted","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"isReserved","type":"bool"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remoteSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"remoteSigner_","type":"address"}],"name":"setRemoteSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600855620000196101f46103e86200016b565b6009553480156200002957600080fd5b506040516200283f3803806200283f8339810160408190526200004c91620001a9565b816040518060400160405280601481526020017f4561737933204561726c792042697264204e4654000000000000000000000000815250604051806040016040528060048152602001632299a2a160e11b8152508160009081620000b191906200032e565b506001620000c082826200032e565b505050620000d481620000f760201b60201c565b50620000e03362000119565b600b620000ee82826200032e565b505050620003fa565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b818103818111156200018d57634e487b7160e01b600052601160045260246000fd5b92915050565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215620001bd57600080fd5b82516001600160a01b0381168114620001d557600080fd5b602084810151919350906001600160401b0380821115620001f557600080fd5b818601915086601f8301126200020a57600080fd5b8151818111156200021f576200021f62000193565b604051601f8201601f19908116603f011681019083821181831017156200024a576200024a62000193565b8160405282815289868487010111156200026357600080fd5b600093505b8284101562000287578484018601518185018701529285019262000268565b60008684830101528096505050505050509250929050565b600181811c90821680620002b457607f821691505b602082108103620002d557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200032957600081815260208120601f850160051c81016020861015620003045750805b601f850160051c820191505b81811015620003255782815560010162000310565b5050505b505050565b81516001600160401b038111156200034a576200034a62000193565b62000362816200035b84546200029f565b84620002db565b602080601f8311600181146200039a5760008415620003815750858301515b600019600386901b1c1916600185901b17855562000325565b600085815260208120601f198616915b82811015620003cb57888601518255948401946001909101908401620003aa565b5085821015620003ea5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612435806200040a6000396000f3fe608060405234801561001057600080fd5b50600436106101a35760003560e01c806370a08231116100ee578063b88d4fde11610097578063f0292a0311610071578063f0292a031461039d578063f2fde38b146103a6578063f9f2a7ce146103b9578063fce5ec95146103dc57600080fd5b8063b88d4fde1461032e578063c87b56dd14610341578063e985e9c51461035457600080fd5b80638da5cb5b116100c85780638da5cb5b146102f557806395d89b4114610313578063a22cb4651461031b57600080fd5b806370a08231146102c7578063715018a6146102da5780638b87da4b146102e257600080fd5b806332cb6b0c1161015057806346aa52ce1161012a57806346aa52ce1461029857806355f804b3146102a15780636352211e146102b457600080fd5b806332cb6b0c1461025c5780633408a2371461026557806342842e0e1461028557600080fd5b8063081812fc11610181578063081812fc146101fc578063095ea7b31461023457806323b872dd1461024957600080fd5b806301ffc9a7146101a8578063058e2994146101d057806306fdde03146101e7575b600080fd5b6101bb6101b6366004611d07565b6103ef565b60405190151581526020015b60405180910390f35b6101d960095481565b6040519081526020016101c7565b6101ef6104d4565b6040516101c79190611d74565b61020f61020a366004611d87565b610566565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c7565b610247610242366004611dc9565b61059a565b005b610247610257366004611df3565b610722565b6101d96103e881565b60065461020f9073ffffffffffffffffffffffffffffffffffffffff1681565b610247610293366004611df3565b6107a9565b6101d960085481565b6102476102af366004611ed4565b6107c4565b61020f6102c2366004611d87565b6107dc565b6101d96102d5366004611f1d565b61084e565b610247610902565b6102476102f0366004611f1d565b610916565b60075473ffffffffffffffffffffffffffffffffffffffff1661020f565b6101ef610964565b610247610329366004611f48565b610973565b61024761033c366004611f9b565b61097e565b6101ef61034f366004611d87565b610a0c565b6101bb610362366004612003565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b6101d96101f481565b6102476103b4366004611f1d565b610a73565b6101bb6103c7366004611f1d565b600a6020526000908152604090205460ff1681565b6102476103ea36600461202d565b610b0d565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061048257507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806104ce57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060600080546104e39061208b565b80601f016020809104026020016040519081016040528092919081815260200182805461050f9061208b565b801561055c5780601f106105315761010080835404028352916020019161055c565b820191906000526020600020905b81548152906001019060200180831161053f57829003601f168201915b5050505050905090565b600061057182610d0d565b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60006105a5826107dc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361064d5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821614806106a1575073ffffffffffffffffffffffffffffffffffffffff8116600090815260056020908152604080832033845290915290205460ff165b6107135760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610644565b61071d8383610d7e565b505050565b61072c3382610e1e565b61079e5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f7665640000000000000000000000000000000000006064820152608401610644565b61071d838383610ede565b61071d8383836040518060200160405280600081525061097e565b6107cc611111565b600b6107d8828261212c565b5050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16806104ce5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610644565b600073ffffffffffffffffffffffffffffffffffffffff82166108d95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152608401610644565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b61090a611111565b6109146000611178565b565b61091e611111565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831617905550565b50565b6060600180546104e39061208b565b6107d83383836111ef565b6109883383610e1e565b6109fa5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f7665640000000000000000000000000000000000006064820152608401610644565b610a0684848484611302565b50505050565b6060610a1782610d0d565b6000610a2161138b565b90506000815111610a415760405180602001604052806000815250610a6c565b80610a4b8461139a565b604051602001610a5c929190612228565b6040516020818303038152906040525b9392505050565b610a7b611111565b73ffffffffffffffffffffffffffffffffffffffff8116610b045760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610644565b61096181611178565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600a602052604090205460ff1615610b835760405162461bcd60e51b815260206004820152600e60248201527f616c7265616479206d696e7465640000000000000000000000000000000000006044820152606401610644565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600a6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905551610c0691869186910173ffffffffffffffffffffffffffffffffffffffff9290921682521515602082015260400190565b604051602081830303815290604052805190602001209050610c2881836114cf565b60008315610c9857506009546103e88110610c855760405162461bcd60e51b815260206004820152601360248201527f6d617820726573657276652072656163686564000000000000000000000000006044820152606401610644565b610c90816001612286565b600955610cfc565b506008546101f48110610ced5760405162461bcd60e51b815260206004820152601060248201527f6d6178206d696e742072656163686564000000000000000000000000000000006044820152606401610644565b610cf8816001612286565b6008555b610d06858261159e565b5050505050565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff166109615760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610644565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190610dd8826107dc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610e2a836107dc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610e98575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b80610ed657508373ffffffffffffffffffffffffffffffffffffffff16610ebe84610566565b73ffffffffffffffffffffffffffffffffffffffff16145b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff16610efe826107dc565b73ffffffffffffffffffffffffffffffffffffffff1614610f875760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610644565b73ffffffffffffffffffffffffffffffffffffffff821661100f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610644565b61101a600082610d7e565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120805460019290611050908490612299565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040812080546001929061108b908490612286565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60075473ffffffffffffffffffffffffffffffffffffffff1633146109145760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610644565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361126a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610644565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61130d848484610ede565b611319848484846115b8565b610a065760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610644565b6060600b80546104e39061208b565b6060816000036113dd57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561140757806113f1816122ac565b91506114009050600a83612313565b91506113e1565b60008167ffffffffffffffff81111561142257611422611e2f565b6040519080825280601f01601f19166020018201604052801561144c576020820181803683370190505b5090505b8415610ed657611461600183612299565b915061146e600a86612327565b611479906030612286565b60f81b81838151811061148e5761148e61233b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506114c8600a86612313565b9450611450565b600061153161152b846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b83611773565b60065490915073ffffffffffffffffffffffffffffffffffffffff80831691161461071d5760405162461bcd60e51b815260206004820152601160248201527f696e76616c6964207369676e61747572650000000000000000000000000000006044820152606401610644565b6107d8828260405180602001604052806000815250611797565b600073ffffffffffffffffffffffffffffffffffffffff84163b15611768576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061162f90339089908890889060040161236a565b6020604051808303816000875af192505050801561166a575060408051601f3d908101601f19168201909252611667918101906123b3565b60015b61171d573d808015611698576040519150601f19603f3d011682016040523d82523d6000602084013e61169d565b606091505b5080516000036117155760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610644565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050610ed6565b506001949350505050565b60008060006117828585611820565b9150915061178f81611865565b509392505050565b6117a18383611a51565b6117ae60008484846115b8565b61071d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610644565b60008082516041036118565760208301516040840151606085015160001a61184a87828585611bdf565b9450945050505061185e565b506000905060025b9250929050565b6000816004811115611879576118796123d0565b036118815750565b6001816004811115611895576118956123d0565b036118e25760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610644565b60028160048111156118f6576118f66123d0565b036119435760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610644565b6003816004811115611957576119576123d0565b036119ca5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610644565b60048160048111156119de576119de6123d0565b036109615760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610644565b73ffffffffffffffffffffffffffffffffffffffff8216611ab45760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610644565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1615611b265760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610644565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805460019290611b5c908490612286565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611c165750600090506003611cd0565b8460ff16601b14158015611c2e57508460ff16601c14155b15611c3f5750600090506004611cd0565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611c93573d6000803e3d6000fd5b5050604051601f19015191505073ffffffffffffffffffffffffffffffffffffffff8116611cc957600060019250925050611cd0565b9150600090505b94509492505050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461096157600080fd5b600060208284031215611d1957600080fd5b8135610a6c81611cd9565b60005b83811015611d3f578181015183820152602001611d27565b50506000910152565b60008151808452611d60816020860160208601611d24565b601f01601f19169290920160200192915050565b602081526000610a6c6020830184611d48565b600060208284031215611d9957600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611dc457600080fd5b919050565b60008060408385031215611ddc57600080fd5b611de583611da0565b946020939093013593505050565b600080600060608486031215611e0857600080fd5b611e1184611da0565b9250611e1f60208501611da0565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115611e7957611e79611e2f565b604051601f8501601f19908116603f01168101908282118183101715611ea157611ea1611e2f565b81604052809350858152868686011115611eba57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611ee657600080fd5b813567ffffffffffffffff811115611efd57600080fd5b8201601f81018413611f0e57600080fd5b610ed684823560208401611e5e565b600060208284031215611f2f57600080fd5b610a6c82611da0565b80358015158114611dc457600080fd5b60008060408385031215611f5b57600080fd5b611f6483611da0565b9150611f7260208401611f38565b90509250929050565b600082601f830112611f8c57600080fd5b610a6c83833560208501611e5e565b60008060008060808587031215611fb157600080fd5b611fba85611da0565b9350611fc860208601611da0565b925060408501359150606085013567ffffffffffffffff811115611feb57600080fd5b611ff787828801611f7b565b91505092959194509250565b6000806040838503121561201657600080fd5b61201f83611da0565b9150611f7260208401611da0565b60008060006060848603121561204257600080fd5b61204b84611da0565b925061205960208501611f38565b9150604084013567ffffffffffffffff81111561207557600080fd5b61208186828701611f7b565b9150509250925092565b600181811c9082168061209f57607f821691505b6020821081036120d8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561071d57600081815260208120601f850160051c810160208610156121055750805b601f850160051c820191505b8181101561212457828155600101612111565b505050505050565b815167ffffffffffffffff81111561214657612146611e2f565b61215a81612154845461208b565b846120de565b602080601f8311600181146121ad57600084156121775750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612124565b600085815260208120601f198616915b828110156121dc578886015182559484019460019091019084016121bd565b508582101561221857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000835161223a818460208801611d24565b83519083019061224e818360208801611d24565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104ce576104ce612257565b818103818111156104ce576104ce612257565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036122dd576122dd612257565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612322576123226122e4565b500490565b600082612336576123366122e4565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526123a96080830184611d48565b9695505050505050565b6000602082840312156123c557600080fd5b8151610a6c81611cd9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea2646970667358221220ee7a3cebd1cfd7b3055aded12f278f82b4b43c684c3bd344c3998b0475a65ebf64736f6c63430008130033000000000000000000000000423e3e1de6dcdafdae15b4bb13b32db7dd671dec0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003868747470733a2f2f6170692e65617379332e6170703a31353030312f6170692f66726f6e74656e642f6561726c7942697264746f6b656e2f0000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101a35760003560e01c806370a08231116100ee578063b88d4fde11610097578063f0292a0311610071578063f0292a031461039d578063f2fde38b146103a6578063f9f2a7ce146103b9578063fce5ec95146103dc57600080fd5b8063b88d4fde1461032e578063c87b56dd14610341578063e985e9c51461035457600080fd5b80638da5cb5b116100c85780638da5cb5b146102f557806395d89b4114610313578063a22cb4651461031b57600080fd5b806370a08231146102c7578063715018a6146102da5780638b87da4b146102e257600080fd5b806332cb6b0c1161015057806346aa52ce1161012a57806346aa52ce1461029857806355f804b3146102a15780636352211e146102b457600080fd5b806332cb6b0c1461025c5780633408a2371461026557806342842e0e1461028557600080fd5b8063081812fc11610181578063081812fc146101fc578063095ea7b31461023457806323b872dd1461024957600080fd5b806301ffc9a7146101a8578063058e2994146101d057806306fdde03146101e7575b600080fd5b6101bb6101b6366004611d07565b6103ef565b60405190151581526020015b60405180910390f35b6101d960095481565b6040519081526020016101c7565b6101ef6104d4565b6040516101c79190611d74565b61020f61020a366004611d87565b610566565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c7565b610247610242366004611dc9565b61059a565b005b610247610257366004611df3565b610722565b6101d96103e881565b60065461020f9073ffffffffffffffffffffffffffffffffffffffff1681565b610247610293366004611df3565b6107a9565b6101d960085481565b6102476102af366004611ed4565b6107c4565b61020f6102c2366004611d87565b6107dc565b6101d96102d5366004611f1d565b61084e565b610247610902565b6102476102f0366004611f1d565b610916565b60075473ffffffffffffffffffffffffffffffffffffffff1661020f565b6101ef610964565b610247610329366004611f48565b610973565b61024761033c366004611f9b565b61097e565b6101ef61034f366004611d87565b610a0c565b6101bb610362366004612003565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b6101d96101f481565b6102476103b4366004611f1d565b610a73565b6101bb6103c7366004611f1d565b600a6020526000908152604090205460ff1681565b6102476103ea36600461202d565b610b0d565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061048257507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806104ce57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060600080546104e39061208b565b80601f016020809104026020016040519081016040528092919081815260200182805461050f9061208b565b801561055c5780601f106105315761010080835404028352916020019161055c565b820191906000526020600020905b81548152906001019060200180831161053f57829003601f168201915b5050505050905090565b600061057182610d0d565b5060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60006105a5826107dc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361064d5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821614806106a1575073ffffffffffffffffffffffffffffffffffffffff8116600090815260056020908152604080832033845290915290205460ff165b6107135760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610644565b61071d8383610d7e565b505050565b61072c3382610e1e565b61079e5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f7665640000000000000000000000000000000000006064820152608401610644565b61071d838383610ede565b61071d8383836040518060200160405280600081525061097e565b6107cc611111565b600b6107d8828261212c565b5050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff16806104ce5760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610644565b600073ffffffffffffffffffffffffffffffffffffffff82166108d95760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f74206120766160448201527f6c6964206f776e657200000000000000000000000000000000000000000000006064820152608401610644565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b61090a611111565b6109146000611178565b565b61091e611111565b600680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831617905550565b50565b6060600180546104e39061208b565b6107d83383836111ef565b6109883383610e1e565b6109fa5760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201527f72206e6f7220617070726f7665640000000000000000000000000000000000006064820152608401610644565b610a0684848484611302565b50505050565b6060610a1782610d0d565b6000610a2161138b565b90506000815111610a415760405180602001604052806000815250610a6c565b80610a4b8461139a565b604051602001610a5c929190612228565b6040516020818303038152906040525b9392505050565b610a7b611111565b73ffffffffffffffffffffffffffffffffffffffff8116610b045760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610644565b61096181611178565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600a602052604090205460ff1615610b835760405162461bcd60e51b815260206004820152600e60248201527f616c7265616479206d696e7465640000000000000000000000000000000000006044820152606401610644565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600a6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905551610c0691869186910173ffffffffffffffffffffffffffffffffffffffff9290921682521515602082015260400190565b604051602081830303815290604052805190602001209050610c2881836114cf565b60008315610c9857506009546103e88110610c855760405162461bcd60e51b815260206004820152601360248201527f6d617820726573657276652072656163686564000000000000000000000000006044820152606401610644565b610c90816001612286565b600955610cfc565b506008546101f48110610ced5760405162461bcd60e51b815260206004820152601060248201527f6d6178206d696e742072656163686564000000000000000000000000000000006044820152606401610644565b610cf8816001612286565b6008555b610d06858261159e565b5050505050565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff166109615760405162461bcd60e51b815260206004820152601860248201527f4552433732313a20696e76616c696420746f6b656e20494400000000000000006044820152606401610644565b600081815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091558190610dd8826107dc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610e2a836107dc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480610e98575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209388168352929052205460ff165b80610ed657508373ffffffffffffffffffffffffffffffffffffffff16610ebe84610566565b73ffffffffffffffffffffffffffffffffffffffff16145b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff16610efe826107dc565b73ffffffffffffffffffffffffffffffffffffffff1614610f875760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610644565b73ffffffffffffffffffffffffffffffffffffffff821661100f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610644565b61101a600082610d7e565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360205260408120805460019290611050908490612299565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260036020526040812080546001929061108b908490612286565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60075473ffffffffffffffffffffffffffffffffffffffff1633146109145760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610644565b6007805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361126a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610644565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61130d848484610ede565b611319848484846115b8565b610a065760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610644565b6060600b80546104e39061208b565b6060816000036113dd57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561140757806113f1816122ac565b91506114009050600a83612313565b91506113e1565b60008167ffffffffffffffff81111561142257611422611e2f565b6040519080825280601f01601f19166020018201604052801561144c576020820181803683370190505b5090505b8415610ed657611461600183612299565b915061146e600a86612327565b611479906030612286565b60f81b81838151811061148e5761148e61233b565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506114c8600a86612313565b9450611450565b600061153161152b846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b83611773565b60065490915073ffffffffffffffffffffffffffffffffffffffff80831691161461071d5760405162461bcd60e51b815260206004820152601160248201527f696e76616c6964207369676e61747572650000000000000000000000000000006044820152606401610644565b6107d8828260405180602001604052806000815250611797565b600073ffffffffffffffffffffffffffffffffffffffff84163b15611768576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061162f90339089908890889060040161236a565b6020604051808303816000875af192505050801561166a575060408051601f3d908101601f19168201909252611667918101906123b3565b60015b61171d573d808015611698576040519150601f19603f3d011682016040523d82523d6000602084013e61169d565b606091505b5080516000036117155760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610644565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050610ed6565b506001949350505050565b60008060006117828585611820565b9150915061178f81611865565b509392505050565b6117a18383611a51565b6117ae60008484846115b8565b61071d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610644565b60008082516041036118565760208301516040840151606085015160001a61184a87828585611bdf565b9450945050505061185e565b506000905060025b9250929050565b6000816004811115611879576118796123d0565b036118815750565b6001816004811115611895576118956123d0565b036118e25760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610644565b60028160048111156118f6576118f66123d0565b036119435760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610644565b6003816004811115611957576119576123d0565b036119ca5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610644565b60048160048111156119de576119de6123d0565b036109615760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610644565b73ffffffffffffffffffffffffffffffffffffffff8216611ab45760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610644565b60008181526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1615611b265760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610644565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600360205260408120805460019290611b5c908490612286565b909155505060008181526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611c165750600090506003611cd0565b8460ff16601b14158015611c2e57508460ff16601c14155b15611c3f5750600090506004611cd0565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611c93573d6000803e3d6000fd5b5050604051601f19015191505073ffffffffffffffffffffffffffffffffffffffff8116611cc957600060019250925050611cd0565b9150600090505b94509492505050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461096157600080fd5b600060208284031215611d1957600080fd5b8135610a6c81611cd9565b60005b83811015611d3f578181015183820152602001611d27565b50506000910152565b60008151808452611d60816020860160208601611d24565b601f01601f19169290920160200192915050565b602081526000610a6c6020830184611d48565b600060208284031215611d9957600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611dc457600080fd5b919050565b60008060408385031215611ddc57600080fd5b611de583611da0565b946020939093013593505050565b600080600060608486031215611e0857600080fd5b611e1184611da0565b9250611e1f60208501611da0565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600067ffffffffffffffff80841115611e7957611e79611e2f565b604051601f8501601f19908116603f01168101908282118183101715611ea157611ea1611e2f565b81604052809350858152868686011115611eba57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611ee657600080fd5b813567ffffffffffffffff811115611efd57600080fd5b8201601f81018413611f0e57600080fd5b610ed684823560208401611e5e565b600060208284031215611f2f57600080fd5b610a6c82611da0565b80358015158114611dc457600080fd5b60008060408385031215611f5b57600080fd5b611f6483611da0565b9150611f7260208401611f38565b90509250929050565b600082601f830112611f8c57600080fd5b610a6c83833560208501611e5e565b60008060008060808587031215611fb157600080fd5b611fba85611da0565b9350611fc860208601611da0565b925060408501359150606085013567ffffffffffffffff811115611feb57600080fd5b611ff787828801611f7b565b91505092959194509250565b6000806040838503121561201657600080fd5b61201f83611da0565b9150611f7260208401611da0565b60008060006060848603121561204257600080fd5b61204b84611da0565b925061205960208501611f38565b9150604084013567ffffffffffffffff81111561207557600080fd5b61208186828701611f7b565b9150509250925092565b600181811c9082168061209f57607f821691505b6020821081036120d8577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561071d57600081815260208120601f850160051c810160208610156121055750805b601f850160051c820191505b8181101561212457828155600101612111565b505050505050565b815167ffffffffffffffff81111561214657612146611e2f565b61215a81612154845461208b565b846120de565b602080601f8311600181146121ad57600084156121775750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555612124565b600085815260208120601f198616915b828110156121dc578886015182559484019460019091019084016121bd565b508582101561221857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000835161223a818460208801611d24565b83519083019061224e818360208801611d24565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156104ce576104ce612257565b818103818111156104ce576104ce612257565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036122dd576122dd612257565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612322576123226122e4565b500490565b600082612336576123366122e4565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff8087168352808616602084015250836040830152608060608301526123a96080830184611d48565b9695505050505050565b6000602082840312156123c557600080fd5b8151610a6c81611cd9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea2646970667358221220ee7a3cebd1cfd7b3055aded12f278f82b4b43c684c3bd344c3998b0475a65ebf64736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000423e3e1de6dcdafdae15b4bb13b32db7dd671dec0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003868747470733a2f2f6170692e65617379332e6170703a31353030312f6170692f66726f6e74656e642f6561726c7942697264746f6b656e2f0000000000000000
-----Decoded View---------------
Arg [0] : remoteSigner_ (address): 0x423e3E1de6dCdaFdae15b4BB13B32db7dd671Dec
Arg [1] : uri_ (string): https://api.easy3.app:15001/api/frontend/earlyBirdtoken/
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000423e3e1de6dcdafdae15b4bb13b32db7dd671dec
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000038
Arg [3] : 68747470733a2f2f6170692e65617379332e6170703a31353030312f6170692f
Arg [4] : 66726f6e74656e642f6561726c7942697264746f6b656e2f0000000000000000
Deployed Bytecode Sourcemap
44427:1533:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31725:266;;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;31725:266:0;;;;;;;;44624:53;;;;;;;;;784:25:1;;;772:2;757:18;44624:53:0;638:177:1;32613:100:0;;;:::i;:::-;;;;;;;:::i;34089:171::-;;;;;;:::i;:::-;;:::i;:::-;;;1996:42:1;1984:55;;;1966:74;;1954:2;1939:18;34089:171:0;1820:226:1;33643:380:0;;;;;;:::i;:::-;;:::i;:::-;;34789:302;;;;;;:::i;:::-;;:::i;44494:41::-;;44531:4;44494:41;;23967:27;;;;;;;;;35162:151;;;;;;:::i;:::-;;:::i;44587:30::-;;;;;;44941:89;;;;;;:::i;:::-;;:::i;32324:222::-;;;;;;:::i;:::-;;:::i;32055:207::-;;;;;;:::i;:::-;;:::i;14680:103::-;;;:::i;45038:117::-;;;;;;:::i;:::-;;:::i;14032:87::-;14105:6;;;;14032:87;;32782:104;;;:::i;34332:155::-;;;;;;:::i;:::-;;:::i;35384:280::-;;;;;;:::i;:::-;;:::i;32957:281::-;;;;;;:::i;:::-;;:::i;34558:164::-;;;;;;:::i;:::-;34679:25;;;;34655:4;34679:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34558:164;44542:38;;44577:3;44542:38;;14938:201;;;;;;:::i;:::-;;:::i;44686:55::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;45163:681;;;;;;:::i;:::-;;:::i;31725:266::-;31827:4;31851:40;;;31866:25;31851:40;;:92;;-1:-1:-1;31895:48:0;;;31910:33;31895:48;31851:92;:132;;;-1:-1:-1;9818:25:0;9803:40;;;;31947:36;31844:139;31725:266;-1:-1:-1;;31725:266:0:o;32613:100::-;32667:13;32700:5;32693:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32613:100;:::o;34089:171::-;34165:7;34185:23;34200:7;34185:14;:23::i;:::-;-1:-1:-1;34228:24:0;;;;:15;:24;;;;;;;;;34089:171::o;33643:380::-;33724:13;33740:23;33755:7;33740:14;:23::i;:::-;33724:39;;33788:5;33782:11;;:2;:11;;;33774:57;;;;-1:-1:-1;;;33774:57:0;;6944:2:1;33774:57:0;;;6926:21:1;6983:2;6963:18;;;6956:30;7022:34;7002:18;;;6995:62;7093:3;7073:18;;;7066:31;7114:19;;33774:57:0;;;;;;;;;12821:10;33852:21;;;;;:62;;-1:-1:-1;34679:25:0;;;34655:4;34679:25;;;:18;:25;;;;;;;;12821:10;34679:35;;;;;;;;;;33877:37;33844:137;;;;-1:-1:-1;;;33844:137:0;;7346:2:1;33844:137:0;;;7328:21:1;7385:2;7365:18;;;7358:30;7424:34;7404:18;;;7397:62;7495:32;7475:18;;;7468:60;7545:19;;33844:137:0;7144:426:1;33844:137:0;33994:21;34003:2;34007:7;33994:8;:21::i;:::-;33713:310;33643:380;;:::o;34789:302::-;34950:41;12821:10;34983:7;34950:18;:41::i;:::-;34942:100;;;;-1:-1:-1;;;34942:100:0;;7777:2:1;34942:100:0;;;7759:21:1;7816:2;7796:18;;;7789:30;7855:34;7835:18;;;7828:62;7926:16;7906:18;;;7899:44;7960:19;;34942:100:0;7575:410:1;34942:100:0;35055:28;35065:4;35071:2;35075:7;35055:9;:28::i;35162:151::-;35266:39;35283:4;35289:2;35293:7;35266:39;;;;;;;;;;;;:16;:39::i;44941:89::-;13918:13;:11;:13::i;:::-;45011:4:::1;:11;45018:4:::0;45011;:11:::1;:::i;:::-;;44941:89:::0;:::o;32324:222::-;32396:7;32432:16;;;:7;:16;;;;;;;;;32459:56;;;;-1:-1:-1;;;32459:56:0;;10575:2:1;32459:56:0;;;10557:21:1;10614:2;10594:18;;;10587:30;10653:26;10633:18;;;10626:54;10697:18;;32459:56:0;10373:348:1;32055:207:0;32127:7;32155:19;;;32147:73;;;;-1:-1:-1;;;32147:73:0;;10928:2:1;32147:73:0;;;10910:21:1;10967:2;10947:18;;;10940:30;11006:34;10986:18;;;10979:62;11077:11;11057:18;;;11050:39;11106:19;;32147:73:0;10726:405:1;32147:73:0;-1:-1:-1;32238:16:0;;;;;;:9;:16;;;;;;;32055:207::o;14680:103::-;13918:13;:11;:13::i;:::-;14745:30:::1;14772:1;14745:18;:30::i;:::-;14680:103::o:0;45038:117::-;13918:13;:11;:13::i;:::-;24165:12;:28;;;;;;;;;;45038:117;:::o;45116:31::-:1;45038:117:::0;:::o;32782:104::-;32838:13;32871:7;32864:14;;;;;:::i;34332:155::-;34427:52;12821:10;34460:8;34470;34427:18;:52::i;35384:280::-;35515:41;12821:10;35548:7;35515:18;:41::i;:::-;35507:100;;;;-1:-1:-1;;;35507:100:0;;7777:2:1;35507:100:0;;;7759:21:1;7816:2;7796:18;;;7789:30;7855:34;7835:18;;;7828:62;7926:16;7906:18;;;7899:44;7960:19;;35507:100:0;7575:410:1;35507:100:0;35618:38;35632:4;35638:2;35642:7;35651:4;35618:13;:38::i;:::-;35384:280;;;;:::o;32957:281::-;33030:13;33056:23;33071:7;33056:14;:23::i;:::-;33092:21;33116:10;:8;:10::i;:::-;33092:34;;33168:1;33150:7;33144:21;:25;:86;;;;;;;;;;;;;;;;;33196:7;33205:18;:7;:16;:18::i;:::-;33179:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33144:86;33137:93;32957:281;-1:-1:-1;;;32957:281:0:o;14938:201::-;13918:13;:11;:13::i;:::-;15027:22:::1;::::0;::::1;15019:73;;;::::0;-1:-1:-1;;;15019:73:0;;11839:2:1;15019:73:0::1;::::0;::::1;11821:21:1::0;11878:2;11858:18;;;11851:30;11917:34;11897:18;;;11890:62;11988:8;11968:18;;;11961:36;12014:19;;15019:73:0::1;11637:402:1::0;15019:73:0::1;15103:28;15122:8;15103:18;:28::i;45163:681::-:0;45259:12;;;;;;;:8;:12;;;;;;;;45258:13;45250:40;;;;-1:-1:-1;;;45250:40:0;;12246:2:1;45250:40:0;;;12228:21:1;12285:2;12265:18;;;12258:30;12324:16;12304:18;;;12297:44;12358:18;;45250:40:0;12044:338:1;45250:40:0;45301:12;;;;;;;:8;:12;;;;;;;;:19;;;;45316:4;45301:19;;;45361:26;;;45310:2;;45376:10;;45361:26;12585:42:1;12573:55;;;;12555:74;;12672:14;12665:22;12660:2;12645:18;;12638:50;12543:2;12528:18;;12387:307;45361:26:0;;;;;;;;;;;;;45351:37;;;;;;45333:55;;45399:35;45415:7;45424:9;45399:15;:35::i;:::-;45445:15;45475:10;45471:333;;;-1:-1:-1;45512:14:0;;44531:4;45549:20;;45541:52;;;;-1:-1:-1;;;45541:52:0;;12901:2:1;45541:52:0;;;12883:21:1;12940:2;12920:18;;;12913:30;12979:21;12959:18;;;12952:49;13018:18;;45541:52:0;12699:343:1;45541:52:0;45625:11;:7;45635:1;45625:11;:::i;:::-;45608:14;:28;45471:333;;;-1:-1:-1;45679:11:0;;44577:3;45713:18;;45705:47;;;;-1:-1:-1;;;45705:47:0;;13568:2:1;45705:47:0;;;13550:21:1;13607:2;13587:18;;;13580:30;13646:18;13626;;;13619:46;13682:18;;45705:47:0;13366:340:1;45705:47:0;45781:11;:7;45791:1;45781:11;:::i;:::-;45767;:25;45471:333;45814:22;45824:2;45828:7;45814:9;:22::i;:::-;45239:605;;45163:681;;;:::o;41771:135::-;37193:4;37217:16;;;:7;:16;;;;;;:30;:16;41845:53;;;;-1:-1:-1;;;41845:53:0;;10575:2:1;41845:53:0;;;10557:21:1;10614:2;10594:18;;;10587:30;10653:26;10633:18;;;10626:54;10697:18;;41845:53:0;10373:348:1;41084:174:0;41159:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;41213:23;41159:24;41213:14;:23::i;:::-;41204:46;;;;;;;;;;;;41084:174;;:::o;37422:264::-;37515:4;37532:13;37548:23;37563:7;37548:14;:23::i;:::-;37532:39;;37601:5;37590:16;;:7;:16;;;:52;;;-1:-1:-1;34679:25:0;;;;34655:4;34679:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;37610:32;37590:87;;;;37670:7;37646:31;;:20;37658:7;37646:11;:20::i;:::-;:31;;;37590:87;37582:96;37422:264;-1:-1:-1;;;;37422:264:0:o;40374:591::-;40499:4;40472:31;;:23;40487:7;40472:14;:23::i;:::-;:31;;;40464:81;;;;-1:-1:-1;;;40464:81:0;;13913:2:1;40464:81:0;;;13895:21:1;13952:2;13932:18;;;13925:30;13991:34;13971:18;;;13964:62;14062:7;14042:18;;;14035:35;14087:19;;40464:81:0;13711:401:1;40464:81:0;40564:16;;;40556:65;;;;-1:-1:-1;;;40556:65:0;;14319:2:1;40556:65:0;;;14301:21:1;14358:2;14338:18;;;14331:30;14397:34;14377:18;;;14370:62;14468:6;14448:18;;;14441:34;14492:19;;40556:65:0;14117:400:1;40556:65:0;40738:29;40755:1;40759:7;40738:8;:29::i;:::-;40780:15;;;;;;;:9;:15;;;;;:20;;40799:1;;40780:15;:20;;40799:1;;40780:20;:::i;:::-;;;;-1:-1:-1;;40811:13:0;;;;;;;:9;:13;;;;;:18;;40828:1;;40811:13;:18;;40828:1;;40811:18;:::i;:::-;;;;-1:-1:-1;;40840:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;;40879:27;;40840:16;;40879:27;;;;;;;33713:310;33643:380;;:::o;14197:132::-;14105:6;;14261:23;14105:6;12821:10;14261:23;14253:68;;;;-1:-1:-1;;;14253:68:0;;14857:2:1;14253:68:0;;;14839:21:1;;;14876:18;;;14869:30;14935:34;14915:18;;;14908:62;14987:18;;14253:68:0;14655:356:1;15299:191:0;15392:6;;;;15409:17;;;;;;;;;;;15442:40;;15392:6;;;15409:17;15392:6;;15442:40;;15373:16;;15442:40;15362:128;15299:191;:::o;41401:281::-;41522:8;41513:17;;:5;:17;;;41505:55;;;;-1:-1:-1;;;41505:55:0;;15218:2:1;41505:55:0;;;15200:21:1;15257:2;15237:18;;;15230:30;15296:27;15276:18;;;15269:55;15341:18;;41505:55:0;15016:349:1;41505:55:0;41571:25;;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;41633:41;;586::1;;;41633::0;;559:18:1;41633:41:0;;;;;;;41401:281;;;:::o;36545:270::-;36658:28;36668:4;36674:2;36678:7;36658:9;:28::i;:::-;36705:47;36728:4;36734:2;36738:7;36747:4;36705:22;:47::i;:::-;36697:110;;;;-1:-1:-1;;;36697:110:0;;15572:2:1;36697:110:0;;;15554:21:1;15611:2;15591:18;;;15584:30;15650:34;15630:18;;;15623:62;15721:20;15701:18;;;15694:48;15759:19;;36697:110:0;15370:414:1;45852:105:0;45912:13;45945:4;45938:11;;;;;:::i;10134:723::-;10190:13;10411:5;10420:1;10411:10;10407:53;;-1:-1:-1;;10438:10:0;;;;;;;;;;;;;;;;;;10134:723::o;10407:53::-;10485:5;10470:12;10526:78;10533:9;;10526:78;;10559:8;;;;:::i;:::-;;-1:-1:-1;10582:10:0;;-1:-1:-1;10590:2:0;10582:10;;:::i;:::-;;;10526:78;;;10614:19;10646:6;10636:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10636:17:0;;10614:39;;10664:154;10671:10;;10664:154;;10698:11;10708:1;10698:11;;:::i;:::-;;-1:-1:-1;10767:10:0;10775:2;10767:5;:10;:::i;:::-;10754:24;;:2;:24;:::i;:::-;10741:39;;10724:6;10731;10724:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;10795:11:0;10804:2;10795:11;;:::i;:::-;;;10664:154;;24209:242;24300:14;24317:63;24331:37;24360:7;22813:58;;17968:66:1;22813:58:0;;;17956:79:1;18051:12;;;18044:28;;;22680:7:0;;18088:12:1;;22813:58:0;;;;;;;;;;;;22803:69;;;;;;22796:76;;22611:269;;;;24331:37;24370:9;24317:13;:63::i;:::-;24409:12;;24300:80;;-1:-1:-1;24409:12:0;24399:22;;;24409:12;;24399:22;24391:52;;;;-1:-1:-1;;;24391:52:0;;16811:2:1;24391:52:0;;;16793:21:1;16850:2;16830:18;;;16823:30;16889:19;16869:18;;;16862:47;16926:18;;24391:52:0;16609:341:1;38028:110:0;38104:26;38114:2;38118:7;38104:26;;;;;;;;;;;;:9;:26::i;42470:810::-;42581:4;42602:13;;;1434:19;:23;42598:675;;42638:71;;;;;:36;;;;;;:71;;12821:10;;42689:4;;42695:7;;42704:4;;42638:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42638:71:0;;;;;;;;-1:-1:-1;;42638:71:0;;;;;;;;;;;;:::i;:::-;;;42634:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42879:6;:13;42896:1;42879:18;42875:328;;42922:60;;-1:-1:-1;;;42922:60:0;;15572:2:1;42922:60:0;;;15554:21:1;15611:2;15591:18;;;15584:30;15650:34;15630:18;;;15623:62;15721:20;15701:18;;;15694:48;15759:19;;42922:60:0;15370:414:1;42875:328:0;43153:6;43147:13;43138:6;43134:2;43130:15;43123:38;42634:584;42760:51;;42770:41;42760:51;;-1:-1:-1;42753:58:0;;42598:675;-1:-1:-1;43257:4:0;42470:810;;;;;;:::o;18963:231::-;19041:7;19062:17;19081:18;19103:27;19114:4;19120:9;19103:10;:27::i;:::-;19061:69;;;;19141:18;19153:5;19141:11;:18::i;:::-;-1:-1:-1;19177:9:0;18963:231;-1:-1:-1;;;18963:231:0:o;38365:248::-;38460:18;38466:2;38470:7;38460:5;:18::i;:::-;38497:53;38528:1;38532:2;38536:7;38545:4;38497:22;:53::i;:::-;38489:116;;;;-1:-1:-1;;;38489:116:0;;15572:2:1;38489:116:0;;;15554:21:1;15611:2;15591:18;;;15584:30;15650:34;15630:18;;;15623:62;15721:20;15701:18;;;15694:48;15759:19;;38489:116:0;15370:414:1;17414:747:0;17495:7;17504:12;17533:9;:16;17553:2;17533:22;17529:625;;17877:4;17862:20;;17856:27;17927:4;17912:20;;17906:27;17985:4;17970:20;;17964:27;17572:9;17956:36;18028:25;18039:4;17956:36;17856:27;17906;18028:10;:25::i;:::-;18021:32;;;;;;;;;17529:625;-1:-1:-1;18102:1:0;;-1:-1:-1;18106:35:0;17529:625;17414:747;;;;;:::o;15685:643::-;15763:20;15754:5;:29;;;;;;;;:::i;:::-;;15750:571;;15685:643;:::o;15750:571::-;15861:29;15852:5;:38;;;;;;;;:::i;:::-;;15848:473;;15907:34;;-1:-1:-1;;;15907:34:0;;18502:2:1;15907:34:0;;;18484:21:1;18541:2;18521:18;;;18514:30;18580:26;18560:18;;;18553:54;18624:18;;15907:34:0;18300:348:1;15848:473:0;15972:35;15963:5;:44;;;;;;;;:::i;:::-;;15959:362;;16024:41;;-1:-1:-1;;;16024:41:0;;18855:2:1;16024:41:0;;;18837:21:1;18894:2;18874:18;;;18867:30;18933:33;18913:18;;;18906:61;18984:18;;16024:41:0;18653:355:1;15959:362:0;16096:30;16087:5;:39;;;;;;;;:::i;:::-;;16083:238;;16143:44;;-1:-1:-1;;;16143:44:0;;19215:2:1;16143:44:0;;;19197:21:1;19254:2;19234:18;;;19227:30;19293:34;19273:18;;;19266:62;19364:4;19344:18;;;19337:32;19386:19;;16143:44:0;19013:398:1;16083:238:0;16218:30;16209:5;:39;;;;;;;;:::i;:::-;;16205:116;;16265:44;;-1:-1:-1;;;16265:44:0;;19618:2:1;16265:44:0;;;19600:21:1;19657:2;19637:18;;;19630:30;19696:34;19676:18;;;19669:62;19767:4;19747:18;;;19740:32;19789:19;;16265:44:0;19416:398:1;38949:439:0;39029:16;;;39021:61;;;;-1:-1:-1;;;39021:61:0;;20021:2:1;39021:61:0;;;20003:21:1;;;20040:18;;;20033:30;20099:34;20079:18;;;20072:62;20151:18;;39021:61:0;19819:356:1;39021:61:0;37193:4;37217:16;;;:7;:16;;;;;;:30;:16;:30;39093:58;;;;-1:-1:-1;;;39093:58:0;;20382:2:1;39093:58:0;;;20364:21:1;20421:2;20401:18;;;20394:30;20460;20440:18;;;20433:58;20508:18;;39093:58:0;20180:352:1;39093:58:0;39222:13;;;;;;;:9;:13;;;;;:18;;39239:1;;39222:13;:18;;39239:1;;39222:18;:::i;:::-;;;;-1:-1:-1;;39251:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;39290:33;;39251:16;;;39290:33;;39251:16;;39290:33;45011:11:::1;44941:89:::0;:::o;20347:1589::-;20435:7;;21369:66;21356:79;;21352:163;;;-1:-1:-1;21468:1:0;;-1:-1:-1;21472:30:0;21452:51;;21352:163;21529:1;:7;;21534:2;21529:7;;:18;;;;;21540:1;:7;;21545:2;21540:7;;21529:18;21525:102;;;-1:-1:-1;21580:1:0;;-1:-1:-1;21584:30:0;21564:51;;21525:102;21741:24;;;21724:14;21741:24;;;;;;;;;20764:25:1;;;20837:4;20825:17;;20805:18;;;20798:45;;;;20859:18;;;20852:34;;;20902:18;;;20895:34;;;21741:24:0;;20736:19:1;;21741:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21741:24:0;;-1:-1:-1;;21741:24:0;;;-1:-1:-1;;21780:20:0;;;21776:103;;21833:1;21837:29;21817:50;;;;;;;21776:103;21899:6;-1:-1:-1;21907:20:0;;-1:-1:-1;20347:1589:0;;;;;;;;:::o;14:177:1:-;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;820:250::-;905:1;915:113;929:6;926:1;923:13;915:113;;;1005:11;;;999:18;986:11;;;979:39;951:2;944:10;915:113;;;-1:-1:-1;;1062:1:1;1044:16;;1037:27;820:250::o;1075:330::-;1117:3;1155:5;1149:12;1182:6;1177:3;1170:19;1198:76;1267:6;1260:4;1255:3;1251:14;1244:4;1237:5;1233:16;1198:76;:::i;:::-;1319:2;1307:15;-1:-1:-1;;1303:88:1;1294:98;;;;1394:4;1290:109;;1075:330;-1:-1:-1;;1075:330:1:o;1410:220::-;1559:2;1548:9;1541:21;1522:4;1579:45;1620:2;1609:9;1605:18;1597:6;1579:45;:::i;1635:180::-;1694:6;1747:2;1735:9;1726:7;1722:23;1718:32;1715:52;;;1763:1;1760;1753:12;1715:52;-1:-1:-1;1786:23:1;;1635:180;-1:-1:-1;1635:180:1:o;2051:196::-;2119:20;;2179:42;2168:54;;2158:65;;2148:93;;2237:1;2234;2227:12;2148:93;2051:196;;;:::o;2252:254::-;2320:6;2328;2381:2;2369:9;2360:7;2356:23;2352:32;2349:52;;;2397:1;2394;2387:12;2349:52;2420:29;2439:9;2420:29;:::i;:::-;2410:39;2496:2;2481:18;;;;2468:32;;-1:-1:-1;;;2252:254:1:o;2511:328::-;2588:6;2596;2604;2657:2;2645:9;2636:7;2632:23;2628:32;2625:52;;;2673:1;2670;2663:12;2625:52;2696:29;2715:9;2696:29;:::i;:::-;2686:39;;2744:38;2778:2;2767:9;2763:18;2744:38;:::i;:::-;2734:48;;2829:2;2818:9;2814:18;2801:32;2791:42;;2511:328;;;;;:::o;2844:184::-;2896:77;2893:1;2886:88;2993:4;2990:1;2983:15;3017:4;3014:1;3007:15;3033:691;3098:5;3128:18;3169:2;3161:6;3158:14;3155:40;;;3175:18;;:::i;:::-;3309:2;3303:9;3375:2;3363:15;;-1:-1:-1;;3359:24:1;;;3385:2;3355:33;3351:42;3339:55;;;3409:18;;;3429:22;;;3406:46;3403:72;;;3455:18;;:::i;:::-;3495:10;3491:2;3484:22;3524:6;3515:15;;3554:6;3546;3539:22;3594:3;3585:6;3580:3;3576:16;3573:25;3570:45;;;3611:1;3608;3601:12;3570:45;3661:6;3656:3;3649:4;3641:6;3637:17;3624:44;3716:1;3709:4;3700:6;3692;3688:19;3684:30;3677:41;;;;3033:691;;;;;:::o;3729:451::-;3798:6;3851:2;3839:9;3830:7;3826:23;3822:32;3819:52;;;3867:1;3864;3857:12;3819:52;3907:9;3894:23;3940:18;3932:6;3929:30;3926:50;;;3972:1;3969;3962:12;3926:50;3995:22;;4048:4;4040:13;;4036:27;-1:-1:-1;4026:55:1;;4077:1;4074;4067:12;4026:55;4100:74;4166:7;4161:2;4148:16;4143:2;4139;4135:11;4100:74;:::i;4185:186::-;4244:6;4297:2;4285:9;4276:7;4272:23;4268:32;4265:52;;;4313:1;4310;4303:12;4265:52;4336:29;4355:9;4336:29;:::i;4376:160::-;4441:20;;4497:13;;4490:21;4480:32;;4470:60;;4526:1;4523;4516:12;4541:254;4606:6;4614;4667:2;4655:9;4646:7;4642:23;4638:32;4635:52;;;4683:1;4680;4673:12;4635:52;4706:29;4725:9;4706:29;:::i;:::-;4696:39;;4754:35;4785:2;4774:9;4770:18;4754:35;:::i;:::-;4744:45;;4541:254;;;;;:::o;4800:221::-;4842:5;4895:3;4888:4;4880:6;4876:17;4872:27;4862:55;;4913:1;4910;4903:12;4862:55;4935:80;5011:3;5002:6;4989:20;4982:4;4974:6;4970:17;4935:80;:::i;5026:537::-;5121:6;5129;5137;5145;5198:3;5186:9;5177:7;5173:23;5169:33;5166:53;;;5215:1;5212;5205:12;5166:53;5238:29;5257:9;5238:29;:::i;:::-;5228:39;;5286:38;5320:2;5309:9;5305:18;5286:38;:::i;:::-;5276:48;;5371:2;5360:9;5356:18;5343:32;5333:42;;5426:2;5415:9;5411:18;5398:32;5453:18;5445:6;5442:30;5439:50;;;5485:1;5482;5475:12;5439:50;5508:49;5549:7;5540:6;5529:9;5525:22;5508:49;:::i;:::-;5498:59;;;5026:537;;;;;;;:::o;5568:260::-;5636:6;5644;5697:2;5685:9;5676:7;5672:23;5668:32;5665:52;;;5713:1;5710;5703:12;5665:52;5736:29;5755:9;5736:29;:::i;:::-;5726:39;;5784:38;5818:2;5807:9;5803:18;5784:38;:::i;5833:462::-;5916:6;5924;5932;5985:2;5973:9;5964:7;5960:23;5956:32;5953:52;;;6001:1;5998;5991:12;5953:52;6024:29;6043:9;6024:29;:::i;:::-;6014:39;;6072:35;6103:2;6092:9;6088:18;6072:35;:::i;:::-;6062:45;;6158:2;6147:9;6143:18;6130:32;6185:18;6177:6;6174:30;6171:50;;;6217:1;6214;6207:12;6171:50;6240:49;6281:7;6272:6;6261:9;6257:22;6240:49;:::i;:::-;6230:59;;;5833:462;;;;;:::o;6300:437::-;6379:1;6375:12;;;;6422;;;6443:61;;6497:4;6489:6;6485:17;6475:27;;6443:61;6550:2;6542:6;6539:14;6519:18;6516:38;6513:218;;6587:77;6584:1;6577:88;6688:4;6685:1;6678:15;6716:4;6713:1;6706:15;6513:218;;6300:437;;;:::o;8116:545::-;8218:2;8213:3;8210:11;8207:448;;;8254:1;8279:5;8275:2;8268:17;8324:4;8320:2;8310:19;8394:2;8382:10;8378:19;8375:1;8371:27;8365:4;8361:38;8430:4;8418:10;8415:20;8412:47;;;-1:-1:-1;8453:4:1;8412:47;8508:2;8503:3;8499:12;8496:1;8492:20;8486:4;8482:31;8472:41;;8563:82;8581:2;8574:5;8571:13;8563:82;;;8626:17;;;8607:1;8596:13;8563:82;;;8567:3;;;8116:545;;;:::o;8897:1471::-;9023:3;9017:10;9050:18;9042:6;9039:30;9036:56;;;9072:18;;:::i;:::-;9101:97;9191:6;9151:38;9183:4;9177:11;9151:38;:::i;:::-;9145:4;9101:97;:::i;:::-;9253:4;;9317:2;9306:14;;9334:1;9329:782;;;;10155:1;10172:6;10169:89;;;-1:-1:-1;10224:19:1;;;10218:26;10169:89;8803:66;8794:1;8790:11;;;8786:84;8782:89;8772:100;8878:1;8874:11;;;8769:117;10271:81;;9299:1063;;9329:782;8063:1;8056:14;;;8100:4;8087:18;;-1:-1:-1;;9365:79:1;;;9542:236;9556:7;9553:1;9550:14;9542:236;;;9645:19;;;9639:26;9624:42;;9737:27;;;;9705:1;9693:14;;;;9572:19;;9542:236;;;9546:3;9806:6;9797:7;9794:19;9791:261;;;9867:19;;;9861:26;9968:66;9950:1;9946:14;;;9962:3;9942:24;9938:97;9934:102;9919:118;9904:134;;9791:261;-1:-1:-1;;;;;10098:1:1;10082:14;;;10078:22;10065:36;;-1:-1:-1;8897:1471:1:o;11136:496::-;11315:3;11353:6;11347:13;11369:66;11428:6;11423:3;11416:4;11408:6;11404:17;11369:66;:::i;:::-;11498:13;;11457:16;;;;11520:70;11498:13;11457:16;11567:4;11555:17;;11520:70;:::i;:::-;11606:20;;11136:496;-1:-1:-1;;;;11136:496:1:o;13047:184::-;13099:77;13096:1;13089:88;13196:4;13193:1;13186:15;13220:4;13217:1;13210:15;13236:125;13301:9;;;13322:10;;;13319:36;;;13335:18;;:::i;14522:128::-;14589:9;;;14610:11;;;14607:37;;;14624:18;;:::i;15789:195::-;15828:3;15859:66;15852:5;15849:77;15846:103;;15929:18;;:::i;:::-;-1:-1:-1;15976:1:1;15965:13;;15789:195::o;15989:184::-;16041:77;16038:1;16031:88;16138:4;16135:1;16128:15;16162:4;16159:1;16152:15;16178:120;16218:1;16244;16234:35;;16249:18;;:::i;:::-;-1:-1:-1;16283:9:1;;16178:120::o;16303:112::-;16335:1;16361;16351:35;;16366:18;;:::i;:::-;-1:-1:-1;16400:9:1;;16303:112::o;16420:184::-;16472:77;16469:1;16462:88;16569:4;16566:1;16559:15;16593:4;16590:1;16583:15;16955:512;17149:4;17178:42;17259:2;17251:6;17247:15;17236:9;17229:34;17311:2;17303:6;17299:15;17294:2;17283:9;17279:18;17272:43;;17351:6;17346:2;17335:9;17331:18;17324:34;17394:3;17389:2;17378:9;17374:18;17367:31;17415:46;17456:3;17445:9;17441:19;17433:6;17415:46;:::i;:::-;17407:54;16955:512;-1:-1:-1;;;;;;16955:512:1:o;17472:249::-;17541:6;17594:2;17582:9;17573:7;17569:23;17565:32;17562:52;;;17610:1;17607;17600:12;17562:52;17642:9;17636:16;17661:30;17685:5;17661:30;:::i;18111:184::-;18163:77;18160:1;18153:88;18260:4;18257:1;18250:15;18284:4;18281:1;18274:15
Swarm Source
ipfs://ee7a3cebd1cfd7b3055aded12f278f82b4b43c684c3bd344c3998b0475a65ebf
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.