ERC-721
Overview
Max Total Supply
214 TDL
Holders
86
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 TDLLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Toadles
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-12 */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/Context.sol) pragma solidity ^0.8.0; /** * @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; } } // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @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`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @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); } // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @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 `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @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; } } // OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } pragma solidity ^0.8.6; library Address { function isContract(address account) internal view returns (bool) { uint size; assembly { size := extcodesize(account) } return size > 0; } } // OpenZeppelin Contracts v4.4.0 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } pragma solidity ^0.8.7; abstract contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; string private _name; string private _symbol; // Mapping from token ID to owner address address[] internal _owners; mapping(uint256 => address) private _tokenApprovals; 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 (uint) { require(owner != address(0), "ERC721: balance query for the zero address"); uint count; for( uint i; i < _owners.length; ++i ){ if( owner == _owners[i] ) ++count; } return count; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require( owner != address(0), "ERC721: owner query for nonexistent token" ); 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 {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 owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require( _exists(tokenId), "ERC721: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_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: transfer caller is not 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: transfer caller is not 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 tokenId < _owners.length && _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) { require( _exists(tokenId), "ERC721: operator query for nonexistent token" ); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, 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); _owners.push(to); emit Transfer(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); _owners[tokenId] = address(0); emit Transfer(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 of token that is not own" ); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @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 { 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 {} } pragma solidity ^0.8.7; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account but rips out the core of the gas-wasting processing that comes from OpenZeppelin. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _owners.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < _owners.length, "ERC721Enumerable: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256 tokenId) { require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); uint count; for(uint i; i < _owners.length; i++){ if(owner == _owners[i]){ if(count == index) return i; else count++; } } revert("ERC721Enumerable: owner index out of bounds"); } } // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _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); } } pragma solidity ^0.8.11; pragma abicoder v2; contract Toadles is ERC721Enumerable, Ownable, ReentrancyGuard { using SafeMath for uint256; bool public saleIsActive = true; string public final_provenance = ""; address public proxyRegistryAddress; string public baseURI; uint256 public constant TOKEN_PRICE = 44000000000000000; uint256 public constant MAX_TOKENS = 4444; constructor() ERC721("Toadles", "TDL") { setBaseURI("ipfs://Qmbex7y1o6MfGVg4j6x4b1RsBvjFmZX7HZ9ZXiJoNZFpjV/"); proxyRegistryAddress = address(0xa5409ec958C83C3f309868babACA7c86DCB077c1); } function setProxyRegistryAddress(address _proxyRegistryAddress) external onlyOwner { proxyRegistryAddress = _proxyRegistryAddress; } function withdraw() public onlyOwner nonReentrant { (bool ownerSuccess, ) = _msgSender().call{value: address(this).balance}(""); require(ownerSuccess, "Failed to send to Owner."); } function setProvenanceHash(string memory provenanceHash) public onlyOwner { final_provenance = provenanceHash; } function setBaseURI(string memory _baseURI) public onlyOwner { baseURI = _baseURI; } function flipSaleState() public onlyOwner { saleIsActive = !saleIsActive; } function tokensOfOwner(address _owner) external view returns(uint256[] memory ) { uint256 tokenCount = balanceOf(_owner); if (tokenCount == 0) { // Return an empty array return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); uint256 index; for (index = 0; index < tokenCount; index++) { result[index] = tokenOfOwnerByIndex(_owner, index); } return result; } } function mintToken(uint numberOfTokens) public payable nonReentrant { require(saleIsActive, "Sale must be active to mint"); require(numberOfTokens > 0, "Must mint more than 0 tokens."); require(totalSupply().add(numberOfTokens) <= MAX_TOKENS, "Purchase would exceed max supply"); require(msg.value >= TOKEN_PRICE.mul(numberOfTokens), "Ether value sent is not correct"); for(uint i = 0; i < numberOfTokens; i++) { _safeMint(msg.sender, totalSupply()); } } function tokenURI(uint256 _tokenId) external view returns (string memory) { require(_exists(_tokenId), "Token does not exist."); return string(abi.encodePacked(baseURI, Strings.toString(_tokenId))); } function isApprovedForAll(address _owner, address operator) public view override returns (bool) { OpenSeaProxyRegistry proxyRegistry = OpenSeaProxyRegistry(proxyRegistryAddress); if (address(proxyRegistry.proxies(_owner)) == operator) return true; return super.isApprovedForAll(_owner, operator); } function airdrop(address to, uint256 airdropAmount) external onlyOwner { require(totalSupply().add(airdropAmount) <= MAX_TOKENS, "Purchase would exceed max supply"); for (uint i = 0; i < airdropAmount; i++) { _safeMint(to, totalSupply()); } } } contract OwnableDelegateProxy {} contract OpenSeaProxyRegistry { mapping(address => OwnableDelegateProxy) public proxies; }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"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_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"airdropAmount","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"final_provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintToken","outputs":[],"stateMutability":"payable","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":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"name":"setProxyRegistryAddress","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"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":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","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":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6007805460ff1916600117905560a06040819052600060808190526200002891600891620001da565b503480156200003657600080fd5b506040805180820182526007815266546f61646c657360c81b60208083019182528351808501909452600384526215111360ea1b9084015281519192916200008191600091620001da565b50805162000097906001906020840190620001da565b505050620000b4620000ae6200010c60201b60201c565b62000110565b6001600681905550620000e0604051806060016040528060368152602001620025e36036913962000162565b600980546001600160a01b03191673a5409ec958c83c3f309868babaca7c86dcb077c1179055620002bd565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6005546001600160a01b03163314620001c15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b8051620001d690600a906020840190620001da565b5050565b828054620001e89062000280565b90600052602060002090601f0160209004810192826200020c576000855562000257565b82601f106200022757805160ff191683800117855562000257565b8280016001018555821562000257579182015b82811115620002575782518255916020019190600101906200023a565b506200026592915062000269565b5090565b5b808211156200026557600081556001016200026a565b600181811c908216806200029557607f821691505b60208210811415620002b757634e487b7160e01b600052602260045260246000fd5b50919050565b61231680620002cd6000396000f3fe6080604052600436106101ee5760003560e01c8063715018a61161010d578063c634d032116100a0578063d2d8cb671161006f578063d2d8cb671461055f578063e985e9c51461057a578063eb8d24441461059a578063f2fde38b146105b4578063f47c84c5146105d457600080fd5b8063c634d032146104ec578063c87b56dd146104ff578063cd7c03261461051f578063d26ea6c01461053f57600080fd5b806395d89b41116100dc57806395d89b4114610482578063a22cb46514610497578063b2462be5146104b7578063b88d4fde146104cc57600080fd5b8063715018a6146104025780638462151c146104175780638ba4cc3c146104445780638da5cb5b1461046457600080fd5b806334918dfd1161018557806355f804b31161015457806355f804b31461038d5780636352211e146103ad5780636c0360eb146103cd57806370a08231146103e257600080fd5b806334918dfd146103235780633ccfd60b1461033857806342842e0e1461034d5780634f6ccce71461036d57600080fd5b806310969523116101c157806310969523146102a457806318160ddd146102c457806323b872dd146102e35780632f745c591461030357600080fd5b806301ffc9a7146101f357806306fdde0314610228578063081812fc1461024a578063095ea7b314610282575b600080fd5b3480156101ff57600080fd5b5061021361020e366004611c36565b6105ea565b60405190151581526020015b60405180910390f35b34801561023457600080fd5b5061023d610615565b60405161021f9190611cab565b34801561025657600080fd5b5061026a610265366004611cbe565b6106a7565b6040516001600160a01b03909116815260200161021f565b34801561028e57600080fd5b506102a261029d366004611cec565b610734565b005b3480156102b057600080fd5b506102a26102bf366004611da4565b61084a565b3480156102d057600080fd5b506002545b60405190815260200161021f565b3480156102ef57600080fd5b506102a26102fe366004611ded565b61088b565b34801561030f57600080fd5b506102d561031e366004611cec565b6108bc565b34801561032f57600080fd5b506102a261096f565b34801561034457600080fd5b506102a26109ad565b34801561035957600080fd5b506102a2610368366004611ded565b610acf565b34801561037957600080fd5b506102d5610388366004611cbe565b610aea565b34801561039957600080fd5b506102a26103a8366004611da4565b610b57565b3480156103b957600080fd5b5061026a6103c8366004611cbe565b610b94565b3480156103d957600080fd5b5061023d610c20565b3480156103ee57600080fd5b506102d56103fd366004611e2e565b610cae565b34801561040e57600080fd5b506102a2610d7c565b34801561042357600080fd5b50610437610432366004611e2e565b610db2565b60405161021f9190611e4b565b34801561045057600080fd5b506102a261045f366004611cec565b610e71565b34801561047057600080fd5b506005546001600160a01b031661026a565b34801561048e57600080fd5b5061023d610f2e565b3480156104a357600080fd5b506102a26104b2366004611e8f565b610f3d565b3480156104c357600080fd5b5061023d611002565b3480156104d857600080fd5b506102a26104e7366004611ecd565b61100f565b6102a26104fa366004611cbe565b611047565b34801561050b57600080fd5b5061023d61051a366004611cbe565b611232565b34801561052b57600080fd5b5060095461026a906001600160a01b031681565b34801561054b57600080fd5b506102a261055a366004611e2e565b6112b3565b34801561056b57600080fd5b506102d5669c51c4521e000081565b34801561058657600080fd5b50610213610595366004611f4d565b6112ff565b3480156105a657600080fd5b506007546102139060ff1681565b3480156105c057600080fd5b506102a26105cf366004611e2e565b6113c0565b3480156105e057600080fd5b506102d561115c81565b60006001600160e01b0319821663780e9d6360e01b148061060f575061060f8261145b565b92915050565b60606000805461062490611f7b565b80601f016020809104026020016040519081016040528092919081815260200182805461065090611f7b565b801561069d5780601f106106725761010080835404028352916020019161069d565b820191906000526020600020905b81548152906001019060200180831161068057829003601f168201915b5050505050905090565b60006106b2826114ab565b6107185760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b600061073f82610b94565b9050806001600160a01b0316836001600160a01b031614156107ad5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161070f565b336001600160a01b03821614806107c957506107c981336112ff565b61083b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161070f565b61084583836114f5565b505050565b6005546001600160a01b031633146108745760405162461bcd60e51b815260040161070f90611fb0565b8051610887906008906020840190611b90565b5050565b6108953382611563565b6108b15760405162461bcd60e51b815260040161070f90611fe5565b610845838383611625565b60006108c783610cae565b82106108e55760405162461bcd60e51b815260040161070f90612036565b6000805b600254811015610956576002818154811061090657610906612081565b6000918252602090912001546001600160a01b0386811691161415610944578382141561093657915061060f9050565b81610940816120ad565b9250505b8061094e816120ad565b9150506108e9565b5060405162461bcd60e51b815260040161070f90612036565b6005546001600160a01b031633146109995760405162461bcd60e51b815260040161070f90611fb0565b6007805460ff19811660ff90911615179055565b6005546001600160a01b031633146109d75760405162461bcd60e51b815260040161070f90611fb0565b60026006541415610a2a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161070f565b6002600655604051600090339047908381818185875af1925050503d8060008114610a71576040519150601f19603f3d011682016040523d82523d6000602084013e610a76565b606091505b5050905080610ac75760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f2073656e6420746f204f776e65722e0000000000000000604482015260640161070f565b506001600655565b6108458383836040518060200160405280600081525061100f565b6002546000908210610b535760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161070f565b5090565b6005546001600160a01b03163314610b815760405162461bcd60e51b815260040161070f90611fb0565b805161088790600a906020840190611b90565b60008060028381548110610baa57610baa612081565b6000918252602090912001546001600160a01b031690508061060f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161070f565b600a8054610c2d90611f7b565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5990611f7b565b8015610ca65780601f10610c7b57610100808354040283529160200191610ca6565b820191906000526020600020905b815481529060010190602001808311610c8957829003601f168201915b505050505081565b60006001600160a01b038216610d195760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161070f565b6000805b600254811015610d755760028181548110610d3a57610d3a612081565b6000918252602090912001546001600160a01b0385811691161415610d6557610d62826120ad565b91505b610d6e816120ad565b9050610d1d565b5092915050565b6005546001600160a01b03163314610da65760405162461bcd60e51b815260040161070f90611fb0565b610db0600061177b565b565b60606000610dbf83610cae565b905080610de05760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff811115610dfb57610dfb611d18565b604051908082528060200260200182016040528015610e24578160200160208202803683370190505b50905060005b82811015610dd857610e3c85826108bc565b828281518110610e4e57610e4e612081565b602090810291909101015280610e63816120ad565b915050610e2a565b50919050565b6005546001600160a01b03163314610e9b5760405162461bcd60e51b815260040161070f90611fb0565b61115c610eb182610eab60025490565b906117cd565b1115610eff5760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c79604482015260640161070f565b60005b8181101561084557610f1c83610f1760025490565b6117e0565b80610f26816120ad565b915050610f02565b60606001805461062490611f7b565b6001600160a01b038216331415610f965760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161070f565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60088054610c2d90611f7b565b6110193383611563565b6110355760405162461bcd60e51b815260040161070f90611fe5565b611041848484846117fa565b50505050565b6002600654141561109a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161070f565b600260065560075460ff166110f15760405162461bcd60e51b815260206004820152601b60248201527f53616c65206d7573742062652061637469766520746f206d696e740000000000604482015260640161070f565b600081116111415760405162461bcd60e51b815260206004820152601d60248201527f4d757374206d696e74206d6f7265207468616e203020746f6b656e732e000000604482015260640161070f565b61115c61115182610eab60025490565b111561119f5760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c79604482015260640161070f565b6111b0669c51c4521e00008261182d565b3410156111ff5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161070f565b60005b818110156112295761121733610f1760025490565b80611221816120ad565b915050611202565b50506001600655565b606061123d826114ab565b6112815760405162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604482015260640161070f565b600a61128c83611839565b60405160200161129d9291906120e4565b6040516020818303038152906040529050919050565b6005546001600160a01b031633146112dd5760405162461bcd60e51b815260040161070f90611fb0565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b60095460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa158015611351573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611375919061218b565b6001600160a01b0316141561138e57600191505061060f565b6001600160a01b0380851660009081526004602090815260408083209387168352929052205460ff165b949350505050565b6005546001600160a01b031633146113ea5760405162461bcd60e51b815260040161070f90611fb0565b6001600160a01b03811661144f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161070f565b6114588161177b565b50565b60006001600160e01b031982166380ac58cd60e01b148061148c57506001600160e01b03198216635b5e139f60e01b145b8061060f57506301ffc9a760e01b6001600160e01b031983161461060f565b6002546000908210801561060f575060006001600160a01b0316600283815481106114d8576114d8612081565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b038416908117909155819061152a82610b94565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061156e826114ab565b6115cf5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161070f565b60006115da83610b94565b9050806001600160a01b0316846001600160a01b031614806116155750836001600160a01b031661160a846106a7565b6001600160a01b0316145b806113b857506113b881856112ff565b826001600160a01b031661163882610b94565b6001600160a01b0316146116a05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161070f565b6001600160a01b0382166117025760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161070f565b61170d6000826114f5565b816002828154811061172157611721612081565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006117d982846121a8565b9392505050565b610887828260405180602001604052806000815250611937565b611805848484611625565b6118118484848461196a565b6110415760405162461bcd60e51b815260040161070f906121c0565b60006117d98284612212565b60608161185d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156118875780611871816120ad565b91506118809050600a83612247565b9150611861565b60008167ffffffffffffffff8111156118a2576118a2611d18565b6040519080825280601f01601f1916602001820160405280156118cc576020820181803683370190505b5090505b84156113b8576118e160018361225b565b91506118ee600a86612272565b6118f99060306121a8565b60f81b81838151811061190e5761190e612081565b60200101906001600160f81b031916908160001a905350611930600a86612247565b94506118d0565b6119418383611a68565b61194e600084848461196a565b6108455760405162461bcd60e51b815260040161070f906121c0565b60006001600160a01b0384163b15611a5d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906119ae903390899088908890600401612286565b6020604051808303816000875af19250505080156119e9575060408051601f3d908101601f191682019092526119e6918101906122c3565b60015b611a43573d808015611a17576040519150601f19603f3d011682016040523d82523d6000602084013e611a1c565b606091505b508051611a3b5760405162461bcd60e51b815260040161070f906121c0565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506113b8565b506001949350505050565b6001600160a01b038216611abe5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161070f565b611ac7816114ab565b15611b145760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161070f565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611b9c90611f7b565b90600052602060002090601f016020900481019282611bbe5760008555611c04565b82601f10611bd757805160ff1916838001178555611c04565b82800160010185558215611c04579182015b82811115611c04578251825591602001919060010190611be9565b50610b539291505b80821115610b535760008155600101611c0c565b6001600160e01b03198116811461145857600080fd5b600060208284031215611c4857600080fd5b81356117d981611c20565b60005b83811015611c6e578181015183820152602001611c56565b838111156110415750506000910152565b60008151808452611c97816020860160208601611c53565b601f01601f19169290920160200192915050565b6020815260006117d96020830184611c7f565b600060208284031215611cd057600080fd5b5035919050565b6001600160a01b038116811461145857600080fd5b60008060408385031215611cff57600080fd5b8235611d0a81611cd7565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611d4957611d49611d18565b604051601f8501601f19908116603f01168101908282118183101715611d7157611d71611d18565b81604052809350858152868686011115611d8a57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611db657600080fd5b813567ffffffffffffffff811115611dcd57600080fd5b8201601f81018413611dde57600080fd5b6113b884823560208401611d2e565b600080600060608486031215611e0257600080fd5b8335611e0d81611cd7565b92506020840135611e1d81611cd7565b929592945050506040919091013590565b600060208284031215611e4057600080fd5b81356117d981611cd7565b6020808252825182820181905260009190848201906040850190845b81811015611e8357835183529284019291840191600101611e67565b50909695505050505050565b60008060408385031215611ea257600080fd5b8235611ead81611cd7565b915060208301358015158114611ec257600080fd5b809150509250929050565b60008060008060808587031215611ee357600080fd5b8435611eee81611cd7565b93506020850135611efe81611cd7565b925060408501359150606085013567ffffffffffffffff811115611f2157600080fd5b8501601f81018713611f3257600080fd5b611f4187823560208401611d2e565b91505092959194509250565b60008060408385031215611f6057600080fd5b8235611f6b81611cd7565b91506020830135611ec281611cd7565b600181811c90821680611f8f57607f821691505b60208210811415610e6b57634e487b7160e01b600052602260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156120c1576120c1612097565b5060010190565b600081516120da818560208601611c53565b9290920192915050565b600080845481600182811c91508083168061210057607f831692505b602080841082141561212057634e487b7160e01b86526022600452602486fd5b818015612134576001811461214557612172565b60ff19861689528489019650612172565b60008b81526020902060005b8681101561216a5781548b820152908501908301612151565b505084890196505b50505050505061218281856120c8565b95945050505050565b60006020828403121561219d57600080fd5b81516117d981611cd7565b600082198211156121bb576121bb612097565b500190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600081600019048311821515161561222c5761222c612097565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261225657612256612231565b500490565b60008282101561226d5761226d612097565b500390565b60008261228157612281612231565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906122b990830184611c7f565b9695505050505050565b6000602082840312156122d557600080fd5b81516117d981611c2056fea2646970667358221220385206803fabd653e5e8874eb9ea0674168ffa97aa688a09dcbc5b18675394bf64736f6c634300080b0033697066733a2f2f516d6265783779316f364d66475667346a3678346231527342766a466d5a5837485a395a58694a6f4e5a46706a562f
Deployed Bytecode
0x6080604052600436106101ee5760003560e01c8063715018a61161010d578063c634d032116100a0578063d2d8cb671161006f578063d2d8cb671461055f578063e985e9c51461057a578063eb8d24441461059a578063f2fde38b146105b4578063f47c84c5146105d457600080fd5b8063c634d032146104ec578063c87b56dd146104ff578063cd7c03261461051f578063d26ea6c01461053f57600080fd5b806395d89b41116100dc57806395d89b4114610482578063a22cb46514610497578063b2462be5146104b7578063b88d4fde146104cc57600080fd5b8063715018a6146104025780638462151c146104175780638ba4cc3c146104445780638da5cb5b1461046457600080fd5b806334918dfd1161018557806355f804b31161015457806355f804b31461038d5780636352211e146103ad5780636c0360eb146103cd57806370a08231146103e257600080fd5b806334918dfd146103235780633ccfd60b1461033857806342842e0e1461034d5780634f6ccce71461036d57600080fd5b806310969523116101c157806310969523146102a457806318160ddd146102c457806323b872dd146102e35780632f745c591461030357600080fd5b806301ffc9a7146101f357806306fdde0314610228578063081812fc1461024a578063095ea7b314610282575b600080fd5b3480156101ff57600080fd5b5061021361020e366004611c36565b6105ea565b60405190151581526020015b60405180910390f35b34801561023457600080fd5b5061023d610615565b60405161021f9190611cab565b34801561025657600080fd5b5061026a610265366004611cbe565b6106a7565b6040516001600160a01b03909116815260200161021f565b34801561028e57600080fd5b506102a261029d366004611cec565b610734565b005b3480156102b057600080fd5b506102a26102bf366004611da4565b61084a565b3480156102d057600080fd5b506002545b60405190815260200161021f565b3480156102ef57600080fd5b506102a26102fe366004611ded565b61088b565b34801561030f57600080fd5b506102d561031e366004611cec565b6108bc565b34801561032f57600080fd5b506102a261096f565b34801561034457600080fd5b506102a26109ad565b34801561035957600080fd5b506102a2610368366004611ded565b610acf565b34801561037957600080fd5b506102d5610388366004611cbe565b610aea565b34801561039957600080fd5b506102a26103a8366004611da4565b610b57565b3480156103b957600080fd5b5061026a6103c8366004611cbe565b610b94565b3480156103d957600080fd5b5061023d610c20565b3480156103ee57600080fd5b506102d56103fd366004611e2e565b610cae565b34801561040e57600080fd5b506102a2610d7c565b34801561042357600080fd5b50610437610432366004611e2e565b610db2565b60405161021f9190611e4b565b34801561045057600080fd5b506102a261045f366004611cec565b610e71565b34801561047057600080fd5b506005546001600160a01b031661026a565b34801561048e57600080fd5b5061023d610f2e565b3480156104a357600080fd5b506102a26104b2366004611e8f565b610f3d565b3480156104c357600080fd5b5061023d611002565b3480156104d857600080fd5b506102a26104e7366004611ecd565b61100f565b6102a26104fa366004611cbe565b611047565b34801561050b57600080fd5b5061023d61051a366004611cbe565b611232565b34801561052b57600080fd5b5060095461026a906001600160a01b031681565b34801561054b57600080fd5b506102a261055a366004611e2e565b6112b3565b34801561056b57600080fd5b506102d5669c51c4521e000081565b34801561058657600080fd5b50610213610595366004611f4d565b6112ff565b3480156105a657600080fd5b506007546102139060ff1681565b3480156105c057600080fd5b506102a26105cf366004611e2e565b6113c0565b3480156105e057600080fd5b506102d561115c81565b60006001600160e01b0319821663780e9d6360e01b148061060f575061060f8261145b565b92915050565b60606000805461062490611f7b565b80601f016020809104026020016040519081016040528092919081815260200182805461065090611f7b565b801561069d5780601f106106725761010080835404028352916020019161069d565b820191906000526020600020905b81548152906001019060200180831161068057829003601f168201915b5050505050905090565b60006106b2826114ab565b6107185760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600360205260409020546001600160a01b031690565b600061073f82610b94565b9050806001600160a01b0316836001600160a01b031614156107ad5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161070f565b336001600160a01b03821614806107c957506107c981336112ff565b61083b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161070f565b61084583836114f5565b505050565b6005546001600160a01b031633146108745760405162461bcd60e51b815260040161070f90611fb0565b8051610887906008906020840190611b90565b5050565b6108953382611563565b6108b15760405162461bcd60e51b815260040161070f90611fe5565b610845838383611625565b60006108c783610cae565b82106108e55760405162461bcd60e51b815260040161070f90612036565b6000805b600254811015610956576002818154811061090657610906612081565b6000918252602090912001546001600160a01b0386811691161415610944578382141561093657915061060f9050565b81610940816120ad565b9250505b8061094e816120ad565b9150506108e9565b5060405162461bcd60e51b815260040161070f90612036565b6005546001600160a01b031633146109995760405162461bcd60e51b815260040161070f90611fb0565b6007805460ff19811660ff90911615179055565b6005546001600160a01b031633146109d75760405162461bcd60e51b815260040161070f90611fb0565b60026006541415610a2a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161070f565b6002600655604051600090339047908381818185875af1925050503d8060008114610a71576040519150601f19603f3d011682016040523d82523d6000602084013e610a76565b606091505b5050905080610ac75760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f2073656e6420746f204f776e65722e0000000000000000604482015260640161070f565b506001600655565b6108458383836040518060200160405280600081525061100f565b6002546000908210610b535760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161070f565b5090565b6005546001600160a01b03163314610b815760405162461bcd60e51b815260040161070f90611fb0565b805161088790600a906020840190611b90565b60008060028381548110610baa57610baa612081565b6000918252602090912001546001600160a01b031690508061060f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161070f565b600a8054610c2d90611f7b565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5990611f7b565b8015610ca65780601f10610c7b57610100808354040283529160200191610ca6565b820191906000526020600020905b815481529060010190602001808311610c8957829003601f168201915b505050505081565b60006001600160a01b038216610d195760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161070f565b6000805b600254811015610d755760028181548110610d3a57610d3a612081565b6000918252602090912001546001600160a01b0385811691161415610d6557610d62826120ad565b91505b610d6e816120ad565b9050610d1d565b5092915050565b6005546001600160a01b03163314610da65760405162461bcd60e51b815260040161070f90611fb0565b610db0600061177b565b565b60606000610dbf83610cae565b905080610de05760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff811115610dfb57610dfb611d18565b604051908082528060200260200182016040528015610e24578160200160208202803683370190505b50905060005b82811015610dd857610e3c85826108bc565b828281518110610e4e57610e4e612081565b602090810291909101015280610e63816120ad565b915050610e2a565b50919050565b6005546001600160a01b03163314610e9b5760405162461bcd60e51b815260040161070f90611fb0565b61115c610eb182610eab60025490565b906117cd565b1115610eff5760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c79604482015260640161070f565b60005b8181101561084557610f1c83610f1760025490565b6117e0565b80610f26816120ad565b915050610f02565b60606001805461062490611f7b565b6001600160a01b038216331415610f965760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161070f565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60088054610c2d90611f7b565b6110193383611563565b6110355760405162461bcd60e51b815260040161070f90611fe5565b611041848484846117fa565b50505050565b6002600654141561109a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161070f565b600260065560075460ff166110f15760405162461bcd60e51b815260206004820152601b60248201527f53616c65206d7573742062652061637469766520746f206d696e740000000000604482015260640161070f565b600081116111415760405162461bcd60e51b815260206004820152601d60248201527f4d757374206d696e74206d6f7265207468616e203020746f6b656e732e000000604482015260640161070f565b61115c61115182610eab60025490565b111561119f5760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c79604482015260640161070f565b6111b0669c51c4521e00008261182d565b3410156111ff5760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161070f565b60005b818110156112295761121733610f1760025490565b80611221816120ad565b915050611202565b50506001600655565b606061123d826114ab565b6112815760405162461bcd60e51b81526020600482015260156024820152742a37b5b2b7103237b2b9903737ba1032bc34b9ba1760591b604482015260640161070f565b600a61128c83611839565b60405160200161129d9291906120e4565b6040516020818303038152906040529050919050565b6005546001600160a01b031633146112dd5760405162461bcd60e51b815260040161070f90611fb0565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b60095460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa158015611351573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611375919061218b565b6001600160a01b0316141561138e57600191505061060f565b6001600160a01b0380851660009081526004602090815260408083209387168352929052205460ff165b949350505050565b6005546001600160a01b031633146113ea5760405162461bcd60e51b815260040161070f90611fb0565b6001600160a01b03811661144f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161070f565b6114588161177b565b50565b60006001600160e01b031982166380ac58cd60e01b148061148c57506001600160e01b03198216635b5e139f60e01b145b8061060f57506301ffc9a760e01b6001600160e01b031983161461060f565b6002546000908210801561060f575060006001600160a01b0316600283815481106114d8576114d8612081565b6000918252602090912001546001600160a01b0316141592915050565b600081815260036020526040902080546001600160a01b0319166001600160a01b038416908117909155819061152a82610b94565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061156e826114ab565b6115cf5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161070f565b60006115da83610b94565b9050806001600160a01b0316846001600160a01b031614806116155750836001600160a01b031661160a846106a7565b6001600160a01b0316145b806113b857506113b881856112ff565b826001600160a01b031661163882610b94565b6001600160a01b0316146116a05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161070f565b6001600160a01b0382166117025760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161070f565b61170d6000826114f5565b816002828154811061172157611721612081565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006117d982846121a8565b9392505050565b610887828260405180602001604052806000815250611937565b611805848484611625565b6118118484848461196a565b6110415760405162461bcd60e51b815260040161070f906121c0565b60006117d98284612212565b60608161185d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156118875780611871816120ad565b91506118809050600a83612247565b9150611861565b60008167ffffffffffffffff8111156118a2576118a2611d18565b6040519080825280601f01601f1916602001820160405280156118cc576020820181803683370190505b5090505b84156113b8576118e160018361225b565b91506118ee600a86612272565b6118f99060306121a8565b60f81b81838151811061190e5761190e612081565b60200101906001600160f81b031916908160001a905350611930600a86612247565b94506118d0565b6119418383611a68565b61194e600084848461196a565b6108455760405162461bcd60e51b815260040161070f906121c0565b60006001600160a01b0384163b15611a5d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906119ae903390899088908890600401612286565b6020604051808303816000875af19250505080156119e9575060408051601f3d908101601f191682019092526119e6918101906122c3565b60015b611a43573d808015611a17576040519150601f19603f3d011682016040523d82523d6000602084013e611a1c565b606091505b508051611a3b5760405162461bcd60e51b815260040161070f906121c0565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506113b8565b506001949350505050565b6001600160a01b038216611abe5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161070f565b611ac7816114ab565b15611b145760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161070f565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611b9c90611f7b565b90600052602060002090601f016020900481019282611bbe5760008555611c04565b82601f10611bd757805160ff1916838001178555611c04565b82800160010185558215611c04579182015b82811115611c04578251825591602001919060010190611be9565b50610b539291505b80821115610b535760008155600101611c0c565b6001600160e01b03198116811461145857600080fd5b600060208284031215611c4857600080fd5b81356117d981611c20565b60005b83811015611c6e578181015183820152602001611c56565b838111156110415750506000910152565b60008151808452611c97816020860160208601611c53565b601f01601f19169290920160200192915050565b6020815260006117d96020830184611c7f565b600060208284031215611cd057600080fd5b5035919050565b6001600160a01b038116811461145857600080fd5b60008060408385031215611cff57600080fd5b8235611d0a81611cd7565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611d4957611d49611d18565b604051601f8501601f19908116603f01168101908282118183101715611d7157611d71611d18565b81604052809350858152868686011115611d8a57600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611db657600080fd5b813567ffffffffffffffff811115611dcd57600080fd5b8201601f81018413611dde57600080fd5b6113b884823560208401611d2e565b600080600060608486031215611e0257600080fd5b8335611e0d81611cd7565b92506020840135611e1d81611cd7565b929592945050506040919091013590565b600060208284031215611e4057600080fd5b81356117d981611cd7565b6020808252825182820181905260009190848201906040850190845b81811015611e8357835183529284019291840191600101611e67565b50909695505050505050565b60008060408385031215611ea257600080fd5b8235611ead81611cd7565b915060208301358015158114611ec257600080fd5b809150509250929050565b60008060008060808587031215611ee357600080fd5b8435611eee81611cd7565b93506020850135611efe81611cd7565b925060408501359150606085013567ffffffffffffffff811115611f2157600080fd5b8501601f81018713611f3257600080fd5b611f4187823560208401611d2e565b91505092959194509250565b60008060408385031215611f6057600080fd5b8235611f6b81611cd7565b91506020830135611ec281611cd7565b600181811c90821680611f8f57607f821691505b60208210811415610e6b57634e487b7160e01b600052602260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156120c1576120c1612097565b5060010190565b600081516120da818560208601611c53565b9290920192915050565b600080845481600182811c91508083168061210057607f831692505b602080841082141561212057634e487b7160e01b86526022600452602486fd5b818015612134576001811461214557612172565b60ff19861689528489019650612172565b60008b81526020902060005b8681101561216a5781548b820152908501908301612151565b505084890196505b50505050505061218281856120c8565b95945050505050565b60006020828403121561219d57600080fd5b81516117d981611cd7565b600082198211156121bb576121bb612097565b500190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600081600019048311821515161561222c5761222c612097565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261225657612256612231565b500490565b60008282101561226d5761226d612097565b500390565b60008261228157612281612231565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906122b990830184611c7f565b9695505050505050565b6000602082840312156122d557600080fd5b81516117d981611c2056fea2646970667358221220385206803fabd653e5e8874eb9ea0674168ffa97aa688a09dcbc5b18675394bf64736f6c634300080b0033
Deployed Bytecode Sourcemap
39323:3193:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35530:224;;;;;;;;;;-1:-1:-1;35530:224:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;35530:224:0;;;;;;;;24147:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24959:308::-;;;;;;;;;;-1:-1:-1;24959:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1714:32:1;;;1696:51;;1684:2;1669:18;24959:308:0;1550:203:1;24482:411:0;;;;;;;;;;-1:-1:-1;24482:411:0;;;;;:::i;:::-;;:::i;:::-;;40404:120;;;;;;;;;;-1:-1:-1;40404:120:0;;;;;:::i;:::-;;:::i;35830:110::-;;;;;;;;;;-1:-1:-1;35918:7:0;:14;35830:110;;;3585:25:1;;;3573:2;3558:18;35830:110:0;3439:177:1;26018:376:0;;;;;;;;;;-1:-1:-1;26018:376:0;;;;;:::i;:::-;;:::i;36306:490::-;;;;;;;;;;-1:-1:-1;36306:490:0;;;;;:::i;:::-;;:::i;40628:83::-;;;;;;;;;;;;;:::i;40204:194::-;;;;;;;;;;;;;:::i;26465:185::-;;;;;;;;;;-1:-1:-1;26465:185:0;;;;;:::i;:::-;;:::i;36017:205::-;;;;;;;;;;-1:-1:-1;36017:205:0;;;;;:::i;:::-;;:::i;40530:92::-;;;;;;;;;;-1:-1:-1;40530:92:0;;;;;:::i;:::-;;:::i;23754:326::-;;;;;;;;;;-1:-1:-1;23754:326:0;;;;;:::i;:::-;;:::i;39633:51::-;;;;;;;;;;;;;:::i;23300:392::-;;;;;;;;;;-1:-1:-1;23300:392:0;;;;;:::i;:::-;;:::i;38457:103::-;;;;;;;;;;;;;:::i;40719:472::-;;;;;;;;;;-1:-1:-1;40719:472:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;42246:267::-;;;;;;;;;;-1:-1:-1;42246:267:0;;;;;:::i;:::-;;:::i;37806:87::-;;;;;;;;;;-1:-1:-1;37879:6:0;;-1:-1:-1;;;;;37879:6:0;37806:87;;24316:104;;;;;;;;;;;;;:::i;25339:327::-;;;;;;;;;;-1:-1:-1;25339:327:0;;;;;:::i;:::-;;:::i;39494:65::-;;;;;;;;;;;;;:::i;26721:365::-;;;;;;;;;;-1:-1:-1;26721:365:0;;;;;:::i;:::-;;:::i;41199:500::-;;;;;;:::i;:::-;;:::i;41705:213::-;;;;;;;;;;-1:-1:-1;41705:213:0;;;;;:::i;:::-;;:::i;39564:64::-;;;;;;;;;;-1:-1:-1;39564:64:0;;;;-1:-1:-1;;;;;39564:64:0;;;40054:140;;;;;;;;;;-1:-1:-1;40054:140:0;;;;;:::i;:::-;;:::i;39689:75::-;;;;;;;;;;;;39747:17;39689:75;;41924:316;;;;;;;;;;-1:-1:-1;41924:316:0;;;;;:::i;:::-;;:::i;39426:63::-;;;;;;;;;;-1:-1:-1;39426:63:0;;;;;;;;38715:201;;;;;;;;;;-1:-1:-1;38715:201:0;;;;;:::i;:::-;;:::i;39769:61::-;;;;;;;;;;;;39826:4;39769:61;;35530:224;35632:4;-1:-1:-1;;;;;;35656:50:0;;-1:-1:-1;;;35656:50:0;;:90;;;35710:36;35734:11;35710:23;:36::i;:::-;35649:97;35530:224;-1:-1:-1;;35530:224:0:o;24147:100::-;24201:13;24234:5;24227:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24147:100;:::o;24959:308::-;25080:7;25127:16;25135:7;25127;:16::i;:::-;25105:110;;;;-1:-1:-1;;;25105:110:0;;7172:2:1;25105:110:0;;;7154:21:1;7211:2;7191:18;;;7184:30;7250:34;7230:18;;;7223:62;-1:-1:-1;;;7301:18:1;;;7294:42;7353:19;;25105:110:0;;;;;;;;;-1:-1:-1;25235:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;25235:24:0;;24959:308::o;24482:411::-;24563:13;24579:23;24594:7;24579:14;:23::i;:::-;24563:39;;24627:5;-1:-1:-1;;;;;24621:11:0;:2;-1:-1:-1;;;;;24621:11:0;;;24613:57;;;;-1:-1:-1;;;24613:57:0;;7585:2:1;24613:57:0;;;7567:21:1;7624:2;7604:18;;;7597:30;7663:34;7643:18;;;7636:62;-1:-1:-1;;;7714:18:1;;;7707:31;7755:19;;24613:57:0;7383:397:1;24613:57:0;738:10;-1:-1:-1;;;;;24705:21:0;;;;:62;;-1:-1:-1;24730:37:0;24747:5;738:10;41924:316;:::i;24730:37::-;24683:168;;;;-1:-1:-1;;;24683:168:0;;7987:2:1;24683:168:0;;;7969:21:1;8026:2;8006:18;;;7999:30;8065:34;8045:18;;;8038:62;8136:26;8116:18;;;8109:54;8180:19;;24683:168:0;7785:420:1;24683:168:0;24864:21;24873:2;24877:7;24864:8;:21::i;:::-;24552:341;24482:411;;:::o;40404:120::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;40485:33;;::::1;::::0;:16:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;:::-;;40404:120:::0;:::o;26018:376::-;26227:41;738:10;26260:7;26227:18;:41::i;:::-;26205:140;;;;-1:-1:-1;;;26205:140:0;;;;;;;:::i;:::-;26358:28;26368:4;26374:2;26378:7;26358:9;:28::i;36306:490::-;36403:15;36447:16;36457:5;36447:9;:16::i;:::-;36439:5;:24;36431:80;;;;-1:-1:-1;;;36431:80:0;;;;;;;:::i;:::-;36524:10;36549:6;36545:178;36561:7;:14;36557:18;;36545:178;;;36608:7;36616:1;36608:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;36599:19:0;;;36608:10;;36599:19;36596:116;;;36650:5;36641;:14;36638:58;;;36664:1;-1:-1:-1;36657:8:0;;-1:-1:-1;36657:8:0;36638:58;36689:7;;;;:::i;:::-;;;;36638:58;36577:3;;;;:::i;:::-;;;;36545:178;;;;36735:53;;-1:-1:-1;;;36735:53:0;;;;;;;:::i;40628:83::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;40693:12:::1;::::0;;-1:-1:-1;;40677:28:0;::::1;40693:12;::::0;;::::1;40692:13;40677:28;::::0;;40628:83::o;40204:194::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;2617:1:::1;3215:7;;:19;;3207:63;;;::::0;-1:-1:-1;;;3207:63:0;;10007:2:1;3207:63:0::1;::::0;::::1;9989:21:1::0;10046:2;10026:18;;;10019:30;10085:33;10065:18;;;10058:61;10136:18;;3207:63:0::1;9805:355:1::0;3207:63:0::1;2617:1;3348:7;:18:::0;40285:51:::2;::::0;40262:17:::2;::::0;738:10;;40310:21:::2;::::0;40262:17;40285:51;40262:17;40285:51;40310:21;738:10;40285:51:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40261:75;;;40351:12;40343:49;;;::::0;-1:-1:-1;;;40343:49:0;;10577:2:1;40343:49:0::2;::::0;::::2;10559:21:1::0;10616:2;10596:18;;;10589:30;10655:26;10635:18;;;10628:54;10699:18;;40343:49:0::2;10375:348:1::0;40343:49:0::2;-1:-1:-1::0;2573:1:0::1;3527:7;:22:::0;40204:194::o;26465:185::-;26603:39;26620:4;26626:2;26630:7;26603:39;;;;;;;;;;;;:16;:39::i;36017:205::-;36128:7;:14;36092:7;;36120:22;;36112:79;;;;-1:-1:-1;;;36112:79:0;;10930:2:1;36112:79:0;;;10912:21:1;10969:2;10949:18;;;10942:30;11008:34;10988:18;;;10981:62;-1:-1:-1;;;11059:18:1;;;11052:42;11111:19;;36112:79:0;10728:408:1;36112:79:0;-1:-1:-1;36209:5:0;36017:205::o;40530:92::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;40598:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;23754:326::-:0;23871:7;23896:13;23912:7;23920;23912:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;23912:16:0;;-1:-1:-1;23961:19:0;23939:110;;;;-1:-1:-1;;;23939:110:0;;11343:2:1;23939:110:0;;;11325:21:1;11382:2;11362:18;;;11355:30;11421:34;11401:18;;;11394:62;-1:-1:-1;;;11472:18:1;;;11465:39;11521:19;;23939:110:0;11141:405:1;39633:51:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23300:392::-;23422:4;-1:-1:-1;;;;;23453:19:0;;23445:74;;;;-1:-1:-1;;;23445:74:0;;11753:2:1;23445:74:0;;;11735:21:1;11792:2;11772:18;;;11765:30;11831:34;11811:18;;;11804:62;-1:-1:-1;;;11882:18:1;;;11875:40;11932:19;;23445:74:0;11551:406:1;23445:74:0;23532:10;23558:6;23553:109;23570:7;:14;23566:18;;23553:109;;;23617:7;23625:1;23617:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;23608:19:0;;;23617:10;;23608:19;23604:46;;;23643:7;;;:::i;:::-;;;23604:46;23586:3;;;:::i;:::-;;;23553:109;;;-1:-1:-1;23679:5:0;23300:392;-1:-1:-1;;23300:392:0:o;38457:103::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;38522:30:::1;38549:1;38522:18;:30::i;:::-;38457:103::o:0;40719:472::-;40780:16;40806:18;40827:17;40837:6;40827:9;:17::i;:::-;40806:38;-1:-1:-1;40855:15:0;40851:335;;40920:16;;;40934:1;40920:16;;;;;;;;;;;-1:-1:-1;40913:23:0;40719:472;-1:-1:-1;;;40719:472:0:o;40851:335::-;40959:23;40999:10;40985:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40985:25:0;;40959:51;;41019:13;41041:116;41065:10;41057:5;:18;41041:116;;;41113:34;41133:6;41141:5;41113:19;:34::i;:::-;41097:6;41104:5;41097:13;;;;;;;;:::i;:::-;;;;;;;;;;:50;41077:7;;;;:::i;:::-;;;;41041:116;;40851:335;40799:392;40719:472;;;:::o;42246:267::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;39826:4:::1;42332:32;42350:13;42332;35918:7:::0;:14;;35830:110;42332:13:::1;:17:::0;::::1;:32::i;:::-;:46;;42324:91;;;::::0;-1:-1:-1;;;42324:91:0;;12164:2:1;42324:91:0::1;::::0;::::1;12146:21:1::0;;;12183:18;;;12176:30;12242:34;12222:18;;;12215:62;12294:18;;42324:91:0::1;11962:356:1::0;42324:91:0::1;42427:6;42422:86;42443:13;42439:1;:17;42422:86;;;42472:28;42482:2;42486:13;35918:7:::0;:14;;35830:110;42486:13:::1;42472:9;:28::i;:::-;42458:3:::0;::::1;::::0;::::1;:::i;:::-;;;;42422:86;;24316:104:::0;24372:13;24405:7;24398:14;;;;;:::i;25339:327::-;-1:-1:-1;;;;;25474:24:0;;738:10;25474:24;;25466:62;;;;-1:-1:-1;;;25466:62:0;;12525:2:1;25466:62:0;;;12507:21:1;12564:2;12544:18;;;12537:30;12603:27;12583:18;;;12576:55;12648:18;;25466:62:0;12323:349:1;25466:62:0;738:10;25541:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;25541:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;25541:53:0;;;;;;;;;;25610:48;;540:41:1;;;25541:42:0;;738:10;25610:48;;513:18:1;25610:48:0;;;;;;;25339:327;;:::o;39494:65::-;;;;;;;:::i;26721:365::-;26910:41;738:10;26943:7;26910:18;:41::i;:::-;26888:140;;;;-1:-1:-1;;;26888:140:0;;;;;;;:::i;:::-;27039:39;27053:4;27059:2;27063:7;27072:5;27039:13;:39::i;:::-;26721:365;;;;:::o;41199:500::-;2617:1;3215:7;;:19;;3207:63;;;;-1:-1:-1;;;3207:63:0;;10007:2:1;3207:63:0;;;9989:21:1;10046:2;10026:18;;;10019:30;10085:33;10065:18;;;10058:61;10136:18;;3207:63:0;9805:355:1;3207:63:0;2617:1;3348:7;:18;41282:12:::1;::::0;::::1;;41274:52;;;::::0;-1:-1:-1;;;41274:52:0;;12879:2:1;41274:52:0::1;::::0;::::1;12861:21:1::0;12918:2;12898:18;;;12891:30;12957:29;12937:18;;;12930:57;13004:18;;41274:52:0::1;12677:351:1::0;41274:52:0::1;41358:1;41341:14;:18;41333:60;;;::::0;-1:-1:-1;;;41333:60:0;;13235:2:1;41333:60:0::1;::::0;::::1;13217:21:1::0;13274:2;13254:18;;;13247:30;13313:31;13293:18;;;13286:59;13362:18;;41333:60:0::1;13033:353:1::0;41333:60:0::1;39826:4;41408:33;41426:14;41408:13;35918:7:::0;:14;;35830:110;41408:33:::1;:47;;41400:92;;;::::0;-1:-1:-1;;;41400:92:0;;12164:2:1;41400:92:0::1;::::0;::::1;12146:21:1::0;;;12183:18;;;12176:30;12242:34;12222:18;;;12215:62;12294:18;;41400:92:0::1;11962:356:1::0;41400:92:0::1;41520:31;39747:17;41536:14:::0;41520:15:::1;:31::i;:::-;41507:9;:44;;41499:88;;;::::0;-1:-1:-1;;;41499:88:0;;13593:2:1;41499:88:0::1;::::0;::::1;13575:21:1::0;13632:2;13612:18;;;13605:30;13671:33;13651:18;;;13644:61;13722:18;;41499:88:0::1;13391:355:1::0;41499:88:0::1;41604:6;41600:94;41620:14;41616:1;:18;41600:94;;;41650:36;41660:10;41672:13;35918:7:::0;:14;;35830:110;41650:36:::1;41636:3:::0;::::1;::::0;::::1;:::i;:::-;;;;41600:94;;;-1:-1:-1::0;;2573:1:0;3527:7;:22;41199:500::o;41705:213::-;41764:13;41794:17;41802:8;41794:7;:17::i;:::-;41786:51;;;;-1:-1:-1;;;41786:51:0;;13953:2:1;41786:51:0;;;13935:21:1;13992:2;13972:18;;;13965:30;-1:-1:-1;;;14011:18:1;;;14004:51;14072:18;;41786:51:0;13751:345:1;41786:51:0;41875:7;41884:26;41901:8;41884:16;:26::i;:::-;41858:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41844:68;;41705:213;;;:::o;40054:140::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;40144:20:::1;:44:::0;;-1:-1:-1;;;;;;40144:44:0::1;-1:-1:-1::0;;;;;40144:44:0;;;::::1;::::0;;;::::1;::::0;;40054:140::o;41924:316::-;42085:20;;42125:29;;-1:-1:-1;;;42125:29:0;;-1:-1:-1;;;;;1714:32:1;;;42125:29:0;;;1696:51:1;42014:4:0;;42085:20;;;42117:50;;;;42085:20;;42125:21;;1669:18:1;;42125:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;42117:50:0;;42113:67;;;42176:4;42169:11;;;;;42113:67;-1:-1:-1;;;;;25908:25:0;;;25879:4;25908:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;42194:40;42187:47;41924:316;-1:-1:-1;;;;41924:316:0:o;38715:201::-;37879:6;;-1:-1:-1;;;;;37879:6:0;738:10;38026:23;38018:68;;;;-1:-1:-1;;;38018:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38804:22:0;::::1;38796:73;;;::::0;-1:-1:-1;;;38796:73:0;;16083:2:1;38796:73:0::1;::::0;::::1;16065:21:1::0;16122:2;16102:18;;;16095:30;16161:34;16141:18;;;16134:62;-1:-1:-1;;;16212:18:1;;;16205:36;16258:19;;38796:73:0::1;15881:402:1::0;38796:73:0::1;38880:28;38899:8;38880:18;:28::i;:::-;38715:201:::0;:::o;22881:355::-;23028:4;-1:-1:-1;;;;;;23070:40:0;;-1:-1:-1;;;23070:40:0;;:105;;-1:-1:-1;;;;;;;23127:48:0;;-1:-1:-1;;;23127:48:0;23070:105;:158;;;-1:-1:-1;;;;;;;;;;12787:40:0;;;23192:36;12678:157;28633:155;28732:7;:14;28698:4;;28722:24;;:58;;;;;28778:1;-1:-1:-1;;;;;28750:30:0;:7;28758;28750:16;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;28750:16:0;:30;;28715:65;28633:155;-1:-1:-1;;28633:155:0:o;32658:174::-;32733:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;32733:29:0;-1:-1:-1;;;;;32733:29:0;;;;;;;;:24;;32787:23;32733:24;32787:14;:23::i;:::-;-1:-1:-1;;;;;32778:46:0;;;;;;;;;;;32658:174;;:::o;28955:452::-;29084:4;29128:16;29136:7;29128;:16::i;:::-;29106:110;;;;-1:-1:-1;;;29106:110:0;;16490:2:1;29106:110:0;;;16472:21:1;16529:2;16509:18;;;16502:30;16568:34;16548:18;;;16541:62;-1:-1:-1;;;16619:18:1;;;16612:42;16671:19;;29106:110:0;16288:408:1;29106:110:0;29227:13;29243:23;29258:7;29243:14;:23::i;:::-;29227:39;;29296:5;-1:-1:-1;;;;;29285:16:0;:7;-1:-1:-1;;;;;29285:16:0;;:64;;;;29342:7;-1:-1:-1;;;;;29318:31:0;:20;29330:7;29318:11;:20::i;:::-;-1:-1:-1;;;;;29318:31:0;;29285:64;:113;;;;29366:32;29383:5;29390:7;29366:16;:32::i;31987:553::-;32160:4;-1:-1:-1;;;;;32133:31:0;:23;32148:7;32133:14;:23::i;:::-;-1:-1:-1;;;;;32133:31:0;;32111:122;;;;-1:-1:-1;;;32111:122:0;;16903:2:1;32111:122:0;;;16885:21:1;16942:2;16922:18;;;16915:30;16981:34;16961:18;;;16954:62;-1:-1:-1;;;17032:18:1;;;17025:39;17081:19;;32111:122:0;16701:405:1;32111:122:0;-1:-1:-1;;;;;32252:16:0;;32244:65;;;;-1:-1:-1;;;32244:65:0;;17313:2:1;32244:65:0;;;17295:21:1;17352:2;17332:18;;;17325:30;17391:34;17371:18;;;17364:62;-1:-1:-1;;;17442:18:1;;;17435:34;17486:19;;32244:65:0;17111:400:1;32244:65:0;32426:29;32443:1;32447:7;32426:8;:29::i;:::-;32485:2;32466:7;32474;32466:16;;;;;;;;:::i;:::-;;;;;;;;;:21;;-1:-1:-1;;;;;;32466:21:0;-1:-1:-1;;;;;32466:21:0;;;;;;32505:27;;32524:7;;32505:27;;;;;;;;;;32466:16;32505:27;31987:553;;;:::o;39076:191::-;39169:6;;;-1:-1:-1;;;;;39186:17:0;;;-1:-1:-1;;;;;;39186:17:0;;;;;;;39219:40;;39169:6;;;39186:17;39169:6;;39219:40;;39150:16;;39219:40;39139:128;39076:191;:::o;15642:98::-;15700:7;15727:5;15731:1;15727;:5;:::i;:::-;15720:12;15642:98;-1:-1:-1;;;15642:98:0:o;29749:110::-;29825:26;29835:2;29839:7;29825:26;;;;;;;;;;;;:9;:26::i;27968:352::-;28125:28;28135:4;28141:2;28145:7;28125:9;:28::i;:::-;28186:48;28209:4;28215:2;28219:7;28228:5;28186:22;:48::i;:::-;28164:148;;;;-1:-1:-1;;;28164:148:0;;;;;;;:::i;16380:98::-;16438:7;16465:5;16469:1;16465;:5;:::i;20366:723::-;20422:13;20643:10;20639:53;;-1:-1:-1;;20670:10:0;;;;;;;;;;;;-1:-1:-1;;;20670:10:0;;;;;20366:723::o;20639:53::-;20717:5;20702:12;20758:78;20765:9;;20758:78;;20791:8;;;;:::i;:::-;;-1:-1:-1;20814:10:0;;-1:-1:-1;20822:2:0;20814:10;;:::i;:::-;;;20758:78;;;20846:19;20878:6;20868:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20868:17:0;;20846:39;;20896:154;20903:10;;20896:154;;20930:11;20940:1;20930:11;;:::i;:::-;;-1:-1:-1;20999:10:0;21007:2;20999:5;:10;:::i;:::-;20986:24;;:2;:24;:::i;:::-;20973:39;;20956:6;20963;20956:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;20956:56:0;;;;;;;;-1:-1:-1;21027:11:0;21036:2;21027:11;;:::i;:::-;;;20896:154;;30086:321;30216:18;30222:2;30226:7;30216:5;:18::i;:::-;30267:54;30298:1;30302:2;30306:7;30315:5;30267:22;:54::i;:::-;30245:154;;;;-1:-1:-1;;;30245:154:0;;;;;;;:::i;33397:980::-;33552:4;-1:-1:-1;;;;;33573:13:0;;19986:20;20034:8;33569:801;;33626:175;;-1:-1:-1;;;33626:175:0;;-1:-1:-1;;;;;33626:36:0;;;;;:175;;738:10;;33720:4;;33747:7;;33777:5;;33626:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33626:175:0;;;;;;;;-1:-1:-1;;33626:175:0;;;;;;;;;;;;:::i;:::-;;;33605:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33984:13:0;;33980:320;;34027:108;;-1:-1:-1;;;34027:108:0;;;;;;;:::i;33980:320::-;34250:6;34244:13;34235:6;34231:2;34227:15;34220:38;33605:710;-1:-1:-1;;;;;;33865:51:0;-1:-1:-1;;;33865:51:0;;-1:-1:-1;33858:58:0;;33569:801;-1:-1:-1;34354:4:0;33397:980;;;;;;:::o;30743:346::-;-1:-1:-1;;;;;30823:16:0;;30815:61;;;;-1:-1:-1;;;30815:61:0;;19706:2:1;30815:61:0;;;19688:21:1;;;19725:18;;;19718:30;19784:34;19764:18;;;19757:62;19836:18;;30815:61:0;19504:356:1;30815:61:0;30896:16;30904:7;30896;:16::i;:::-;30895:17;30887:58;;;;-1:-1:-1;;;30887:58:0;;20067:2:1;30887:58:0;;;20049:21:1;20106:2;20086:18;;;20079:30;20145;20125:18;;;20118:58;20193:18;;30887:58:0;19865:352:1;30887:58:0;31014:7;:16;;;;;;;-1:-1:-1;31014:16:0;;;;;;;-1:-1:-1;;;;;;31014:16:0;-1:-1:-1;;;;;31014:16:0;;;;;;;;31048:33;;31073:7;;-1:-1:-1;31048:33:0;;-1:-1:-1;;31048:33:0;30743:346;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:269::-;908:3;946:5;940:12;973:6;968:3;961:19;989:63;1045:6;1038:4;1033:3;1029:14;1022:4;1015:5;1011:16;989:63;:::i;:::-;1106:2;1085:15;-1:-1:-1;;1081:29:1;1072:39;;;;1113:4;1068:50;;855:269;-1:-1:-1;;855:269:1:o;1129:231::-;1278:2;1267:9;1260:21;1241:4;1298:56;1350:2;1339:9;1335:18;1327:6;1298:56;:::i;1365:180::-;1424:6;1477:2;1465:9;1456:7;1452:23;1448:32;1445:52;;;1493:1;1490;1483:12;1445:52;-1:-1:-1;1516:23:1;;1365:180;-1:-1:-1;1365:180:1:o;1758:131::-;-1:-1:-1;;;;;1833:31:1;;1823:42;;1813:70;;1879:1;1876;1869:12;1894:315;1962:6;1970;2023:2;2011:9;2002:7;1998:23;1994:32;1991:52;;;2039:1;2036;2029:12;1991:52;2078:9;2065:23;2097:31;2122:5;2097:31;:::i;:::-;2147:5;2199:2;2184:18;;;;2171:32;;-1:-1:-1;;;1894:315:1:o;2214:127::-;2275:10;2270:3;2266:20;2263:1;2256:31;2306:4;2303:1;2296:15;2330:4;2327:1;2320:15;2346:632;2411:5;2441:18;2482:2;2474:6;2471:14;2468:40;;;2488:18;;:::i;:::-;2563:2;2557:9;2531:2;2617:15;;-1:-1:-1;;2613:24:1;;;2639:2;2609:33;2605:42;2593:55;;;2663:18;;;2683:22;;;2660:46;2657:72;;;2709:18;;:::i;:::-;2749:10;2745:2;2738:22;2778:6;2769:15;;2808:6;2800;2793:22;2848:3;2839:6;2834:3;2830:16;2827:25;2824:45;;;2865:1;2862;2855:12;2824:45;2915:6;2910:3;2903:4;2895:6;2891:17;2878:44;2970:1;2963:4;2954:6;2946;2942:19;2938:30;2931:41;;;;2346:632;;;;;:::o;2983:451::-;3052:6;3105:2;3093:9;3084:7;3080:23;3076:32;3073:52;;;3121:1;3118;3111:12;3073:52;3161:9;3148:23;3194:18;3186:6;3183:30;3180:50;;;3226:1;3223;3216:12;3180:50;3249:22;;3302:4;3294:13;;3290:27;-1:-1:-1;3280:55:1;;3331:1;3328;3321:12;3280:55;3354:74;3420:7;3415:2;3402:16;3397:2;3393;3389:11;3354:74;:::i;3621:456::-;3698:6;3706;3714;3767:2;3755:9;3746:7;3742:23;3738:32;3735:52;;;3783:1;3780;3773:12;3735:52;3822:9;3809:23;3841:31;3866:5;3841:31;:::i;:::-;3891:5;-1:-1:-1;3948:2:1;3933:18;;3920:32;3961:33;3920:32;3961:33;:::i;:::-;3621:456;;4013:7;;-1:-1:-1;;;4067:2:1;4052:18;;;;4039:32;;3621:456::o;4082:247::-;4141:6;4194:2;4182:9;4173:7;4169:23;4165:32;4162:52;;;4210:1;4207;4200:12;4162:52;4249:9;4236:23;4268:31;4293:5;4268:31;:::i;4334:632::-;4505:2;4557:21;;;4627:13;;4530:18;;;4649:22;;;4476:4;;4505:2;4728:15;;;;4702:2;4687:18;;;4476:4;4771:169;4785:6;4782:1;4779:13;4771:169;;;4846:13;;4834:26;;4915:15;;;;4880:12;;;;4807:1;4800:9;4771:169;;;-1:-1:-1;4957:3:1;;4334:632;-1:-1:-1;;;;;;4334:632:1:o;4971:416::-;5036:6;5044;5097:2;5085:9;5076:7;5072:23;5068:32;5065:52;;;5113:1;5110;5103:12;5065:52;5152:9;5139:23;5171:31;5196:5;5171:31;:::i;:::-;5221:5;-1:-1:-1;5278:2:1;5263:18;;5250:32;5320:15;;5313:23;5301:36;;5291:64;;5351:1;5348;5341:12;5291:64;5374:7;5364:17;;;4971:416;;;;;:::o;5392:795::-;5487:6;5495;5503;5511;5564:3;5552:9;5543:7;5539:23;5535:33;5532:53;;;5581:1;5578;5571:12;5532:53;5620:9;5607:23;5639:31;5664:5;5639:31;:::i;:::-;5689:5;-1:-1:-1;5746:2:1;5731:18;;5718:32;5759:33;5718:32;5759:33;:::i;:::-;5811:7;-1:-1:-1;5865:2:1;5850:18;;5837:32;;-1:-1:-1;5920:2:1;5905:18;;5892:32;5947:18;5936:30;;5933:50;;;5979:1;5976;5969:12;5933:50;6002:22;;6055:4;6047:13;;6043:27;-1:-1:-1;6033:55:1;;6084:1;6081;6074:12;6033:55;6107:74;6173:7;6168:2;6155:16;6150:2;6146;6142:11;6107:74;:::i;:::-;6097:84;;;5392:795;;;;;;;:::o;6192:388::-;6260:6;6268;6321:2;6309:9;6300:7;6296:23;6292:32;6289:52;;;6337:1;6334;6327:12;6289:52;6376:9;6363:23;6395:31;6420:5;6395:31;:::i;:::-;6445:5;-1:-1:-1;6502:2:1;6487:18;;6474:32;6515:33;6474:32;6515:33;:::i;6585:380::-;6664:1;6660:12;;;;6707;;;6728:61;;6782:4;6774:6;6770:17;6760:27;;6728:61;6835:2;6827:6;6824:14;6804:18;6801:38;6798:161;;;6881:10;6876:3;6872:20;6869:1;6862:31;6916:4;6913:1;6906:15;6944:4;6941:1;6934:15;8210:356;8412:2;8394:21;;;8431:18;;;8424:30;8490:34;8485:2;8470:18;;8463:62;8557:2;8542:18;;8210:356::o;8571:413::-;8773:2;8755:21;;;8812:2;8792:18;;;8785:30;8851:34;8846:2;8831:18;;8824:62;-1:-1:-1;;;8917:2:1;8902:18;;8895:47;8974:3;8959:19;;8571:413::o;8989:407::-;9191:2;9173:21;;;9230:2;9210:18;;;9203:30;9269:34;9264:2;9249:18;;9242:62;-1:-1:-1;;;9335:2:1;9320:18;;9313:41;9386:3;9371:19;;8989:407::o;9401:127::-;9462:10;9457:3;9453:20;9450:1;9443:31;9493:4;9490:1;9483:15;9517:4;9514:1;9507:15;9533:127;9594:10;9589:3;9585:20;9582:1;9575:31;9625:4;9622:1;9615:15;9649:4;9646:1;9639:15;9665:135;9704:3;-1:-1:-1;;9725:17:1;;9722:43;;;9745:18;;:::i;:::-;-1:-1:-1;9792:1:1;9781:13;;9665:135::o;14227:185::-;14269:3;14307:5;14301:12;14322:52;14367:6;14362:3;14355:4;14348:5;14344:16;14322:52;:::i;:::-;14390:16;;;;;14227:185;-1:-1:-1;;14227:185:1:o;14417:1174::-;14593:3;14622:1;14655:6;14649:13;14685:3;14707:1;14735:9;14731:2;14727:18;14717:28;;14795:2;14784:9;14780:18;14817;14807:61;;14861:4;14853:6;14849:17;14839:27;;14807:61;14887:2;14935;14927:6;14924:14;14904:18;14901:38;14898:165;;;-1:-1:-1;;;14962:33:1;;15018:4;15015:1;15008:15;15048:4;14969:3;15036:17;14898:165;15079:18;15106:104;;;;15224:1;15219:320;;;;15072:467;;15106:104;-1:-1:-1;;15139:24:1;;15127:37;;15184:16;;;;-1:-1:-1;15106:104:1;;15219:320;14174:1;14167:14;;;14211:4;14198:18;;15314:1;15328:165;15342:6;15339:1;15336:13;15328:165;;;15420:14;;15407:11;;;15400:35;15463:16;;;;15357:10;;15328:165;;;15332:3;;15522:6;15517:3;15513:16;15506:23;;15072:467;;;;;;;15555:30;15581:3;15573:6;15555:30;:::i;:::-;15548:37;14417:1174;-1:-1:-1;;;;;14417:1174:1:o;15596:280::-;15695:6;15748:2;15736:9;15727:7;15723:23;15719:32;15716:52;;;15764:1;15761;15754:12;15716:52;15796:9;15790:16;15815:31;15840:5;15815:31;:::i;17516:128::-;17556:3;17587:1;17583:6;17580:1;17577:13;17574:39;;;17593:18;;:::i;:::-;-1:-1:-1;17629:9:1;;17516:128::o;17649:414::-;17851:2;17833:21;;;17890:2;17870:18;;;17863:30;17929:34;17924:2;17909:18;;17902:62;-1:-1:-1;;;17995:2:1;17980:18;;17973:48;18053:3;18038:19;;17649:414::o;18068:168::-;18108:7;18174:1;18170;18166:6;18162:14;18159:1;18156:21;18151:1;18144:9;18137:17;18133:45;18130:71;;;18181:18;;:::i;:::-;-1:-1:-1;18221:9:1;;18068:168::o;18241:127::-;18302:10;18297:3;18293:20;18290:1;18283:31;18333:4;18330:1;18323:15;18357:4;18354:1;18347:15;18373:120;18413:1;18439;18429:35;;18444:18;;:::i;:::-;-1:-1:-1;18478:9:1;;18373:120::o;18498:125::-;18538:4;18566:1;18563;18560:8;18557:34;;;18571:18;;:::i;:::-;-1:-1:-1;18608:9:1;;18498:125::o;18628:112::-;18660:1;18686;18676:35;;18691:18;;:::i;:::-;-1:-1:-1;18725:9:1;;18628:112::o;18745:500::-;-1:-1:-1;;;;;19014:15:1;;;18996:34;;19066:15;;19061:2;19046:18;;19039:43;19113:2;19098:18;;19091:34;;;19161:3;19156:2;19141:18;;19134:31;;;18939:4;;19182:57;;19219:19;;19211:6;19182:57;:::i;:::-;19174:65;18745:500;-1:-1:-1;;;;;;18745:500:1:o;19250:249::-;19319:6;19372:2;19360:9;19351:7;19347:23;19343:32;19340:52;;;19388:1;19385;19378:12;19340:52;19420:9;19414:16;19439:30;19463:5;19439:30;:::i
Swarm Source
ipfs://385206803fabd653e5e8874eb9ea0674168ffa97aa688a09dcbc5b18675394bf
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.