ERC-721
NFT
Overview
Max Total Supply
777 SlothNFT
Holders
415
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 SlothNFTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
SlothNFT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-11 */ // SPDX-License-Identifier: MIT 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; } } /** * @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); } } /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev 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; } /** * @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); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @title 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); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @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); } } /** * @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; } } error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintedQueryForZeroAddress(); error BurnedQueryForZeroAddress(); error AuxQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex times unchecked { return _currentIndex - _burnCounter; } } /** * @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 override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { if (owner == address(0)) revert MintedQueryForZeroAddress(); return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { if (owner == address(0)) revert AuxQueryForZeroAddress(); return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { if (owner == address(0)) revert AuxQueryForZeroAddress(); _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { if (operator == _msgSender()) revert ApproveToCaller(); _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 { _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 { _transfer(from, to, tokenId); if (!_checkOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) { revert TransferToNonERC721ReceiverImplementer(); } updatedIndex++; } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @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 { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, 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(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } interface INFT { function mintedNunber(address addr) external returns(uint256); } contract SlothNFT is ERC721A, Ownable, INFT { using Strings for uint256; event PurchaseEvent(address purchaseWallet, uint256 nftID, uint256 purchaseTimestamp); uint256 public constant INVENTORY = 38777; uint256 private anti_hacker_limit = 0.002 ether; uint8 private _free_mint_available = 1; uint256 private _free_mint_start = 1655038800; //2022-06-12 13:00(UTC) uint256 private MINT_LIMIT = 2; bool private _is_revealed = false; string private _base_uri = ""; string private _blindbox_uri = "https://ipfs.slothnft.org/sloth/blind/"; function _baseURI() internal view override returns (string memory) { return _base_uri; } constructor() ERC721A("Sloth NFT", "SlothNFT") { mintTo(msg.sender, 1); } function freeMint(uint256 amount) external payable { freeMintValidator(msg.sender, amount); mintTo(msg.sender, amount); } function freeMintValidator(address mintUser, uint256 amount) private { require(_free_mint_available == 1, "free mint not available now!"); require(block.timestamp >= _free_mint_start, "free mint not start yet!"); require(msg.value >= anti_hacker_limit * amount, "value less than anti_hacker_limit!"); require(isEnough(amount), "free mint limit reached!"); require((_numberMinted(mintUser) + amount) <= MINT_LIMIT, "free mint over limit"); } function startFreeMint() external onlyOwner{ _free_mint_available = 1; } function stopFreeMint() external onlyOwner{ _free_mint_available = 0; } function updateFreeMintTime(uint256 time_) external onlyOwner{ _free_mint_start = time_; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); if (!_is_revealed) { return bytes(_blindbox_uri).length > 0 ? string(abi.encodePacked(_blindbox_uri, tokenId.toString())) : ""; } string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } function isEnough(uint256 amount) private view returns (bool enough) { uint256 solded = totalSupply(); uint256 afterPurchased = solded + amount; enough = true; require(afterPurchased <= INVENTORY, "Max limit"); } function isOwner(uint256 nftID, address owner) external view returns(bool isNFTOwner) { address tokenOwner = ownerOf(nftID); isNFTOwner = (tokenOwner == owner); } function mintedNunber(address addr) external override view returns(uint256) { return _numberMinted(addr); } function listMyNFT(address owner) external view returns (uint256[] memory tokens) { uint256 owned = balanceOf(owner); tokens = new uint256[](owned); uint256 start = 0; for (uint i=0; i<totalSupply(); i++) { if (ownerOf(i) == owner) { tokens[start] = i; start ++; } } } function mintTo(address purchaseUser, uint256 amount) private { _safeMint(purchaseUser, amount); } function supportsInterface(bytes4 interfaceId) public view override returns (bool) { return super.supportsInterface(interfaceId); } function setBaseData(bool isRevealed, string memory uri) external onlyOwner { _base_uri = uri; _is_revealed = isRevealed; } function setReveal(bool reveal_) external onlyOwner { _is_revealed = reveal_; } function withdrawETH(address wallet) external onlyOwner { payable(wallet).transfer(address(this).balance); } function withdrawTo(address wallet, uint256 amount) external onlyOwner { payable(wallet).transfer(amount); } function updateBlindboxURI(string memory url) external onlyOwner { _blindbox_uri = url; } function updateAntiHacker(uint256 price_) external onlyOwner { anti_hacker_limit = price_; } function updateMintLimit(uint256 limit_) external onlyOwner { MINT_LIMIT = limit_; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MintedQueryForZeroAddress","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"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":false,"internalType":"address","name":"purchaseWallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"nftID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"purchaseTimestamp","type":"uint256"}],"name":"PurchaseEvent","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":"INVENTORY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"payable","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":"nftID","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"isNFTOwner","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"listMyNFT","outputs":[{"internalType":"uint256[]","name":"tokens","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"mintedNunber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isRevealed","type":"bool"},{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"reveal_","type":"bool"}],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":[{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"updateAntiHacker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"url","type":"string"}],"name":"updateBlindboxURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"time_","type":"uint256"}],"name":"updateFreeMintTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit_","type":"uint256"}],"name":"updateMintLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
66071afd498d0000600955600a805460ff199081166001179091556362a5e350600b556002600c55600d8054909116905560a06040819052600060808190526200004c91600e916200045f565b50604051806060016040528060268152602001620026576026913980516200007d91600f916020909101906200045f565b503480156200008b57600080fd5b50604080518082018252600981526814db1bdd1a0813919560ba1b60208083019182528351808501909452600884526714db1bdd1a13919560c21b908401528151919291620000dd916002916200045f565b508051620000f39060039060208401906200045f565b505050620001106200010a6200012360201b60201c565b62000127565b6200011d33600162000179565b620005f0565b3390565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62000185828262000189565b5050565b62000185828260405180602001604052806000815250620001ab60201b60201c565b620001ba8383836001620001bf565b505050565b6000546001600160a01b038516620001e957604051622e076360e81b815260040160405180910390fd5b83620002085760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546001600160801b031981166001600160401b038083168c018116918217680100000000000000006001600160401b031990941690921783900481168c018116909202179091558584526004909252822080546001600160e01b031916909317600160a01b42909216919091021790915581905b858110156200031f5760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4838015620002f35750620002f160008884886200032a565b155b1562000312576040516368d2bf6b60e11b815260040160405180910390fd5b6001918201910162000298565b506000555050505050565b60006200034b846001600160a01b03166200045960201b62000e8d1760201c565b156200044d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906200038590339089908890889060040162000538565b602060405180830381600087803b158015620003a057600080fd5b505af1925050508015620003d3575060408051601f3d908101601f19168201909252620003d09181019062000505565b60015b62000432573d80801562000404576040519150601f19603f3d011682016040523d82523d6000602084013e62000409565b606091505b5080516200042a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905062000451565b5060015b949350505050565b3b151590565b8280546200046d90620005b3565b90600052602060002090601f016020900481019282620004915760008555620004dc565b82601f10620004ac57805160ff1916838001178555620004dc565b82800160010185558215620004dc579182015b82811115620004dc578251825591602001919060010190620004bf565b50620004ea929150620004ee565b5090565b5b80821115620004ea5760008155600101620004ef565b6000602082840312156200051857600080fd5b81516001600160e01b0319811681146200053157600080fd5b9392505050565b600060018060a01b038087168352602081871681850152856040850152608060608501528451915081608085015260005b82811015620005875785810182015185820160a00152810162000569565b828111156200059a57600060a084870101525b5050601f01601f19169190910160a00195945050505050565b600181811c90821680620005c857607f821691505b60208210811415620005ea57634e487b7160e01b600052602260045260246000fd5b50919050565b61205780620006006000396000f3fe6080604052600436106101e35760003560e01c806370a0823111610102578063a2a8f53911610095578063de5d547e11610064578063de5d547e1461056e578063e01d55c514610584578063e985e9c5146105a4578063f2fde38b146105ed57600080fd5b8063a2a8f539146104f9578063b88d4fde14610519578063c87b56dd14610539578063d8a4169e1461055957600080fd5b80638da5cb5b116100d15780638da5cb5b14610486578063901588fd146104a457806395d89b41146104c4578063a22cb465146104d957600080fd5b806370a082311461041e578063715018a61461043e5780637c928fe9146104535780638a316ea31461046657600080fd5b80632a3f300c1161017a57806342842e0e1161014957806342842e0e1461039e5780635a5d096c146103be5780636352211e146103de578063690d8320146103fe57600080fd5b80632a3f300c1461031c5780632b65dc5e1461033c5780632e1ea10d146103515780633f14e8d51461037157600080fd5b806318160ddd116101b657806318160ddd146102995780631f2833cc146102bc578063205c2878146102dc57806323b872dd146102fc57600080fd5b806301ffc9a7146101e857806306fdde031461021d578063081812fc1461023f578063095ea7b314610277575b600080fd5b3480156101f457600080fd5b50610208610203366004611c2a565b61060d565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b5061023261061e565b6040516102149190611e73565b34801561024b57600080fd5b5061025f61025a366004611c98565b6106b0565b6040516001600160a01b039091168152602001610214565b34801561028357600080fd5b50610297610292366004611b98565b6106f4565b005b3480156102a557600080fd5b50600154600054035b604051908152602001610214565b3480156102c857600080fd5b506102ae6102d7366004611a69565b610782565b3480156102e857600080fd5b506102976102f7366004611b98565b61078d565b34801561030857600080fd5b50610297610317366004611ab7565b6107f6565b34801561032857600080fd5b50610297610337366004611bc2565b610801565b34801561034857600080fd5b5061029761083e565b34801561035d57600080fd5b5061029761036c366004611c64565b610877565b34801561037d57600080fd5b5061039161038c366004611a69565b6108b8565b6040516102149190611e2f565b3480156103aa57600080fd5b506102976103b9366004611ab7565b610985565b3480156103ca57600080fd5b506102086103d9366004611cb1565b6109a0565b3480156103ea57600080fd5b5061025f6103f9366004611c98565b6109c4565b34801561040a57600080fd5b50610297610419366004611a69565b6109d6565b34801561042a57600080fd5b506102ae610439366004611a69565b610a35565b34801561044a57600080fd5b50610297610a83565b610297610461366004611c98565b610ab9565b34801561047257600080fd5b50610297610481366004611bdd565b610ad0565b34801561049257600080fd5b506008546001600160a01b031661025f565b3480156104b057600080fd5b506102976104bf366004611c98565b610b22565b3480156104d057600080fd5b50610232610b51565b3480156104e557600080fd5b506102976104f4366004611b6e565b610b60565b34801561050557600080fd5b50610297610514366004611c98565b610bf6565b34801561052557600080fd5b50610297610534366004611af3565b610c25565b34801561054557600080fd5b50610232610554366004611c98565b610c5f565b34801561056557600080fd5b50610297610d90565b34801561057a57600080fd5b506102ae61977981565b34801561059057600080fd5b5061029761059f366004611c98565b610dc6565b3480156105b057600080fd5b506102086105bf366004611a84565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156105f957600080fd5b50610297610608366004611a69565b610df5565b600061061882610e93565b92915050565b60606002805461062d90611f49565b80601f016020809104026020016040519081016040528092919081815260200182805461065990611f49565b80156106a65780601f1061067b576101008083540402835291602001916106a6565b820191906000526020600020905b81548152906001019060200180831161068957829003601f168201915b5050505050905090565b60006106bb82610ee3565b6106d8576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006106ff826109c4565b9050806001600160a01b0316836001600160a01b031614156107345760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610754575061075281336105bf565b155b15610772576040516367d9dca160e11b815260040160405180910390fd5b61077d838383610f0e565b505050565b600061061882610f6a565b6008546001600160a01b031633146107c05760405162461bcd60e51b81526004016107b790611e86565b60405180910390fd5b6040516001600160a01b0383169082156108fc029083906000818181858888f1935050505015801561077d573d6000803e3d6000fd5b61077d838383610fbf565b6008546001600160a01b0316331461082b5760405162461bcd60e51b81526004016107b790611e86565b600d805460ff1916911515919091179055565b6008546001600160a01b031633146108685760405162461bcd60e51b81526004016107b790611e86565b600a805460ff19166001179055565b6008546001600160a01b031633146108a15760405162461bcd60e51b81526004016107b790611e86565b80516108b490600f90602084019061190f565b5050565b606060006108c583610a35565b9050806001600160401b038111156108df576108df611ff5565b604051908082528060200260200182016040528015610908578160200160208202803683370190505b5091506000805b6001546000540381101561097d57846001600160a01b0316610930826109c4565b6001600160a01b0316141561096b578084838151811061095257610952611fdf565b60209081029190910101528161096781611f84565b9250505b8061097581611f84565b91505061090f565b505050919050565b61077d83838360405180602001604052806000815250610c25565b6000806109ac846109c4565b6001600160a01b039081169316929092149392505050565b60006109cf826111d3565b5192915050565b6008546001600160a01b03163314610a005760405162461bcd60e51b81526004016107b790611e86565b6040516001600160a01b038216904780156108fc02916000818181858888f193505050501580156108b4573d6000803e3d6000fd5b60006001600160a01b038216610a5e576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b03163314610aad5760405162461bcd60e51b81526004016107b790611e86565b610ab760006112ec565b565b610ac3338261133e565b610acd33826114fe565b50565b6008546001600160a01b03163314610afa5760405162461bcd60e51b81526004016107b790611e86565b8051610b0d90600e90602084019061190f565b5050600d805460ff1916911515919091179055565b6008546001600160a01b03163314610b4c5760405162461bcd60e51b81526004016107b790611e86565b600955565b60606003805461062d90611f49565b6001600160a01b038216331415610b8a5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b03163314610c205760405162461bcd60e51b81526004016107b790611e86565b600b55565b610c30848484610fbf565b610c3c84848484611508565b610c59576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610c6a82610ee3565b610cce5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107b7565b600d5460ff16610d34576000600f8054610ce790611f49565b905011610d035760405180602001604052806000815250610618565b600f610d0e83611617565b604051602001610d1f929190611d4b565b60405160208183030381529060405292915050565b6000610d3e611714565b90506000815111610d5e5760405180602001604052806000815250610d89565b80610d6884611617565b604051602001610d79929190611d1c565b6040516020818303038152906040525b9392505050565b6008546001600160a01b03163314610dba5760405162461bcd60e51b81526004016107b790611e86565b600a805460ff19169055565b6008546001600160a01b03163314610df05760405162461bcd60e51b81526004016107b790611e86565b600c55565b6008546001600160a01b03163314610e1f5760405162461bcd60e51b81526004016107b790611e86565b6001600160a01b038116610e845760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107b7565b610acd816112ec565b3b151590565b60006001600160e01b031982166380ac58cd60e01b1480610ec457506001600160e01b03198216635b5e139f60e01b145b8061061857506301ffc9a760e01b6001600160e01b0319831614610618565b6000805482108015610618575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006001600160a01b038216610f93576040516335ebb31960e01b815260040160405180910390fd5b506001600160a01b0316600090815260056020526040902054600160401b90046001600160401b031690565b6000610fca826111d3565b80519091506000906001600160a01b0316336001600160a01b03161480610ff857508151610ff890336105bf565b80611013575033611008846106b0565b6001600160a01b0316145b90508061103357604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146110685760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661108f57604051633a954ecd60e21b815260040160405180910390fd5b61109f6000848460000151610f0e565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102179092559086018083529120549091166111895760005481101561118957825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60408051606081018252600080825260208201819052918101829052905482908110156112d357600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906112d15780516001600160a01b031615611268579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156112cc579392505050565b611268565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a5460ff166001146113935760405162461bcd60e51b815260206004820152601c60248201527f66726565206d696e74206e6f7420617661696c61626c65206e6f77210000000060448201526064016107b7565b600b544210156113e55760405162461bcd60e51b815260206004820152601860248201527f66726565206d696e74206e6f742073746172742079657421000000000000000060448201526064016107b7565b806009546113f39190611ee7565b34101561144d5760405162461bcd60e51b815260206004820152602260248201527f76616c7565206c657373207468616e20616e74695f6861636b65725f6c696d69604482015261742160f01b60648201526084016107b7565b61145681611723565b6114a25760405162461bcd60e51b815260206004820152601860248201527f66726565206d696e74206c696d6974207265616368656421000000000000000060448201526064016107b7565b600c54816114af84610f6a565b6114b99190611ebb565b11156108b45760405162461bcd60e51b8152602060048201526014602482015273199c9959481b5a5b9d081bdd995c881b1a5b5a5d60621b60448201526064016107b7565b6108b4828261178c565b60006001600160a01b0384163b1561160b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061154c903390899088908890600401611df2565b602060405180830381600087803b15801561156657600080fd5b505af1925050508015611596575060408051601f3d908101601f1916820190925261159391810190611c47565b60015b6115f1573d8080156115c4576040519150601f19603f3d011682016040523d82523d6000602084013e6115c9565b606091505b5080516115e9576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061160f565b5060015b949350505050565b60608161163b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611665578061164f81611f84565b915061165e9050600a83611ed3565b915061163f565b6000816001600160401b0381111561167f5761167f611ff5565b6040519080825280601f01601f1916602001820160405280156116a9576020820181803683370190505b5090505b841561160f576116be600183611f06565b91506116cb600a86611f9f565b6116d6906030611ebb565b60f81b8183815181106116eb576116eb611fdf565b60200101906001600160f81b031916908160001a90535061170d600a86611ed3565b94506116ad565b6060600e805461062d90611f49565b6000806117336001546000540390565b905060006117418483611ebb565b9050600192506197798111156117855760405162461bcd60e51b815260206004820152600960248201526813585e081b1a5b5a5d60ba1b60448201526064016107b7565b5050919050565b6108b482826040518060200160405280600081525061077d83838360016000546001600160a01b0385166117d257604051622e076360e81b815260040160405180910390fd5b836117f05760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c018116909202179091558584526004909252822080546001600160e01b031916909317600160a01b42909216919091021790915581905b858110156119065760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48380156118dc57506118da6000888488611508565b155b156118fa576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101611885565b506000556111cc565b82805461191b90611f49565b90600052602060002090601f01602090048101928261193d5760008555611983565b82601f1061195657805160ff1916838001178555611983565b82800160010185558215611983579182015b82811115611983578251825591602001919060010190611968565b5061198f929150611993565b5090565b5b8082111561198f5760008155600101611994565b60006001600160401b03808411156119c2576119c2611ff5565b604051601f8501601f19908116603f011681019082821181831017156119ea576119ea611ff5565b81604052809350858152868686011115611a0357600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611a3457600080fd5b919050565b80358015158114611a3457600080fd5b600082601f830112611a5a57600080fd5b610d89838335602085016119a8565b600060208284031215611a7b57600080fd5b610d8982611a1d565b60008060408385031215611a9757600080fd5b611aa083611a1d565b9150611aae60208401611a1d565b90509250929050565b600080600060608486031215611acc57600080fd5b611ad584611a1d565b9250611ae360208501611a1d565b9150604084013590509250925092565b60008060008060808587031215611b0957600080fd5b611b1285611a1d565b9350611b2060208601611a1d565b92506040850135915060608501356001600160401b03811115611b4257600080fd5b8501601f81018713611b5357600080fd5b611b62878235602084016119a8565b91505092959194509250565b60008060408385031215611b8157600080fd5b611b8a83611a1d565b9150611aae60208401611a39565b60008060408385031215611bab57600080fd5b611bb483611a1d565b946020939093013593505050565b600060208284031215611bd457600080fd5b610d8982611a39565b60008060408385031215611bf057600080fd5b611bf983611a39565b915060208301356001600160401b03811115611c1457600080fd5b611c2085828601611a49565b9150509250929050565b600060208284031215611c3c57600080fd5b8135610d898161200b565b600060208284031215611c5957600080fd5b8151610d898161200b565b600060208284031215611c7657600080fd5b81356001600160401b03811115611c8c57600080fd5b61160f84828501611a49565b600060208284031215611caa57600080fd5b5035919050565b60008060408385031215611cc457600080fd5b82359150611aae60208401611a1d565b60008151808452611cec816020860160208601611f1d565b601f01601f19169290920160200192915050565b60008151611d12818560208601611f1d565b9290920192915050565b60008351611d2e818460208801611f1d565b835190830190611d42818360208801611f1d565b01949350505050565b600080845481600182811c915080831680611d6757607f831692505b6020808410821415611d8757634e487b7160e01b86526022600452602486fd5b818015611d9b5760018114611dac57611dd9565b60ff19861689528489019650611dd9565b60008b81526020902060005b86811015611dd15781548b820152908501908301611db8565b505084890196505b505050505050611de98185611d00565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611e2590830184611cd4565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015611e6757835183529284019291840191600101611e4b565b50909695505050505050565b602081526000610d896020830184611cd4565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611ece57611ece611fb3565b500190565b600082611ee257611ee2611fc9565b500490565b6000816000190483118215151615611f0157611f01611fb3565b500290565b600082821015611f1857611f18611fb3565b500390565b60005b83811015611f38578181015183820152602001611f20565b83811115610c595750506000910152565b600181811c90821680611f5d57607f821691505b60208210811415611f7e57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611f9857611f98611fb3565b5060010190565b600082611fae57611fae611fc9565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610acd57600080fdfea2646970667358221220a7ead4391bddb152a8c35d99c87a74fc099080577c1b5225180d9c6af6c6865564736f6c6343000807003368747470733a2f2f697066732e736c6f74686e66742e6f72672f736c6f74682f626c696e642f
Deployed Bytecode
0x6080604052600436106101e35760003560e01c806370a0823111610102578063a2a8f53911610095578063de5d547e11610064578063de5d547e1461056e578063e01d55c514610584578063e985e9c5146105a4578063f2fde38b146105ed57600080fd5b8063a2a8f539146104f9578063b88d4fde14610519578063c87b56dd14610539578063d8a4169e1461055957600080fd5b80638da5cb5b116100d15780638da5cb5b14610486578063901588fd146104a457806395d89b41146104c4578063a22cb465146104d957600080fd5b806370a082311461041e578063715018a61461043e5780637c928fe9146104535780638a316ea31461046657600080fd5b80632a3f300c1161017a57806342842e0e1161014957806342842e0e1461039e5780635a5d096c146103be5780636352211e146103de578063690d8320146103fe57600080fd5b80632a3f300c1461031c5780632b65dc5e1461033c5780632e1ea10d146103515780633f14e8d51461037157600080fd5b806318160ddd116101b657806318160ddd146102995780631f2833cc146102bc578063205c2878146102dc57806323b872dd146102fc57600080fd5b806301ffc9a7146101e857806306fdde031461021d578063081812fc1461023f578063095ea7b314610277575b600080fd5b3480156101f457600080fd5b50610208610203366004611c2a565b61060d565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b5061023261061e565b6040516102149190611e73565b34801561024b57600080fd5b5061025f61025a366004611c98565b6106b0565b6040516001600160a01b039091168152602001610214565b34801561028357600080fd5b50610297610292366004611b98565b6106f4565b005b3480156102a557600080fd5b50600154600054035b604051908152602001610214565b3480156102c857600080fd5b506102ae6102d7366004611a69565b610782565b3480156102e857600080fd5b506102976102f7366004611b98565b61078d565b34801561030857600080fd5b50610297610317366004611ab7565b6107f6565b34801561032857600080fd5b50610297610337366004611bc2565b610801565b34801561034857600080fd5b5061029761083e565b34801561035d57600080fd5b5061029761036c366004611c64565b610877565b34801561037d57600080fd5b5061039161038c366004611a69565b6108b8565b6040516102149190611e2f565b3480156103aa57600080fd5b506102976103b9366004611ab7565b610985565b3480156103ca57600080fd5b506102086103d9366004611cb1565b6109a0565b3480156103ea57600080fd5b5061025f6103f9366004611c98565b6109c4565b34801561040a57600080fd5b50610297610419366004611a69565b6109d6565b34801561042a57600080fd5b506102ae610439366004611a69565b610a35565b34801561044a57600080fd5b50610297610a83565b610297610461366004611c98565b610ab9565b34801561047257600080fd5b50610297610481366004611bdd565b610ad0565b34801561049257600080fd5b506008546001600160a01b031661025f565b3480156104b057600080fd5b506102976104bf366004611c98565b610b22565b3480156104d057600080fd5b50610232610b51565b3480156104e557600080fd5b506102976104f4366004611b6e565b610b60565b34801561050557600080fd5b50610297610514366004611c98565b610bf6565b34801561052557600080fd5b50610297610534366004611af3565b610c25565b34801561054557600080fd5b50610232610554366004611c98565b610c5f565b34801561056557600080fd5b50610297610d90565b34801561057a57600080fd5b506102ae61977981565b34801561059057600080fd5b5061029761059f366004611c98565b610dc6565b3480156105b057600080fd5b506102086105bf366004611a84565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156105f957600080fd5b50610297610608366004611a69565b610df5565b600061061882610e93565b92915050565b60606002805461062d90611f49565b80601f016020809104026020016040519081016040528092919081815260200182805461065990611f49565b80156106a65780601f1061067b576101008083540402835291602001916106a6565b820191906000526020600020905b81548152906001019060200180831161068957829003601f168201915b5050505050905090565b60006106bb82610ee3565b6106d8576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006106ff826109c4565b9050806001600160a01b0316836001600160a01b031614156107345760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610754575061075281336105bf565b155b15610772576040516367d9dca160e11b815260040160405180910390fd5b61077d838383610f0e565b505050565b600061061882610f6a565b6008546001600160a01b031633146107c05760405162461bcd60e51b81526004016107b790611e86565b60405180910390fd5b6040516001600160a01b0383169082156108fc029083906000818181858888f1935050505015801561077d573d6000803e3d6000fd5b61077d838383610fbf565b6008546001600160a01b0316331461082b5760405162461bcd60e51b81526004016107b790611e86565b600d805460ff1916911515919091179055565b6008546001600160a01b031633146108685760405162461bcd60e51b81526004016107b790611e86565b600a805460ff19166001179055565b6008546001600160a01b031633146108a15760405162461bcd60e51b81526004016107b790611e86565b80516108b490600f90602084019061190f565b5050565b606060006108c583610a35565b9050806001600160401b038111156108df576108df611ff5565b604051908082528060200260200182016040528015610908578160200160208202803683370190505b5091506000805b6001546000540381101561097d57846001600160a01b0316610930826109c4565b6001600160a01b0316141561096b578084838151811061095257610952611fdf565b60209081029190910101528161096781611f84565b9250505b8061097581611f84565b91505061090f565b505050919050565b61077d83838360405180602001604052806000815250610c25565b6000806109ac846109c4565b6001600160a01b039081169316929092149392505050565b60006109cf826111d3565b5192915050565b6008546001600160a01b03163314610a005760405162461bcd60e51b81526004016107b790611e86565b6040516001600160a01b038216904780156108fc02916000818181858888f193505050501580156108b4573d6000803e3d6000fd5b60006001600160a01b038216610a5e576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b03163314610aad5760405162461bcd60e51b81526004016107b790611e86565b610ab760006112ec565b565b610ac3338261133e565b610acd33826114fe565b50565b6008546001600160a01b03163314610afa5760405162461bcd60e51b81526004016107b790611e86565b8051610b0d90600e90602084019061190f565b5050600d805460ff1916911515919091179055565b6008546001600160a01b03163314610b4c5760405162461bcd60e51b81526004016107b790611e86565b600955565b60606003805461062d90611f49565b6001600160a01b038216331415610b8a5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b03163314610c205760405162461bcd60e51b81526004016107b790611e86565b600b55565b610c30848484610fbf565b610c3c84848484611508565b610c59576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610c6a82610ee3565b610cce5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107b7565b600d5460ff16610d34576000600f8054610ce790611f49565b905011610d035760405180602001604052806000815250610618565b600f610d0e83611617565b604051602001610d1f929190611d4b565b60405160208183030381529060405292915050565b6000610d3e611714565b90506000815111610d5e5760405180602001604052806000815250610d89565b80610d6884611617565b604051602001610d79929190611d1c565b6040516020818303038152906040525b9392505050565b6008546001600160a01b03163314610dba5760405162461bcd60e51b81526004016107b790611e86565b600a805460ff19169055565b6008546001600160a01b03163314610df05760405162461bcd60e51b81526004016107b790611e86565b600c55565b6008546001600160a01b03163314610e1f5760405162461bcd60e51b81526004016107b790611e86565b6001600160a01b038116610e845760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107b7565b610acd816112ec565b3b151590565b60006001600160e01b031982166380ac58cd60e01b1480610ec457506001600160e01b03198216635b5e139f60e01b145b8061061857506301ffc9a760e01b6001600160e01b0319831614610618565b6000805482108015610618575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006001600160a01b038216610f93576040516335ebb31960e01b815260040160405180910390fd5b506001600160a01b0316600090815260056020526040902054600160401b90046001600160401b031690565b6000610fca826111d3565b80519091506000906001600160a01b0316336001600160a01b03161480610ff857508151610ff890336105bf565b80611013575033611008846106b0565b6001600160a01b0316145b90508061103357604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146110685760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661108f57604051633a954ecd60e21b815260040160405180910390fd5b61109f6000848460000151610f0e565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102179092559086018083529120549091166111895760005481101561118957825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60408051606081018252600080825260208201819052918101829052905482908110156112d357600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906112d15780516001600160a01b031615611268579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156112cc579392505050565b611268565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a5460ff166001146113935760405162461bcd60e51b815260206004820152601c60248201527f66726565206d696e74206e6f7420617661696c61626c65206e6f77210000000060448201526064016107b7565b600b544210156113e55760405162461bcd60e51b815260206004820152601860248201527f66726565206d696e74206e6f742073746172742079657421000000000000000060448201526064016107b7565b806009546113f39190611ee7565b34101561144d5760405162461bcd60e51b815260206004820152602260248201527f76616c7565206c657373207468616e20616e74695f6861636b65725f6c696d69604482015261742160f01b60648201526084016107b7565b61145681611723565b6114a25760405162461bcd60e51b815260206004820152601860248201527f66726565206d696e74206c696d6974207265616368656421000000000000000060448201526064016107b7565b600c54816114af84610f6a565b6114b99190611ebb565b11156108b45760405162461bcd60e51b8152602060048201526014602482015273199c9959481b5a5b9d081bdd995c881b1a5b5a5d60621b60448201526064016107b7565b6108b4828261178c565b60006001600160a01b0384163b1561160b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061154c903390899088908890600401611df2565b602060405180830381600087803b15801561156657600080fd5b505af1925050508015611596575060408051601f3d908101601f1916820190925261159391810190611c47565b60015b6115f1573d8080156115c4576040519150601f19603f3d011682016040523d82523d6000602084013e6115c9565b606091505b5080516115e9576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061160f565b5060015b949350505050565b60608161163b5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611665578061164f81611f84565b915061165e9050600a83611ed3565b915061163f565b6000816001600160401b0381111561167f5761167f611ff5565b6040519080825280601f01601f1916602001820160405280156116a9576020820181803683370190505b5090505b841561160f576116be600183611f06565b91506116cb600a86611f9f565b6116d6906030611ebb565b60f81b8183815181106116eb576116eb611fdf565b60200101906001600160f81b031916908160001a90535061170d600a86611ed3565b94506116ad565b6060600e805461062d90611f49565b6000806117336001546000540390565b905060006117418483611ebb565b9050600192506197798111156117855760405162461bcd60e51b815260206004820152600960248201526813585e081b1a5b5a5d60ba1b60448201526064016107b7565b5050919050565b6108b482826040518060200160405280600081525061077d83838360016000546001600160a01b0385166117d257604051622e076360e81b815260040160405180910390fd5b836117f05760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c018116909202179091558584526004909252822080546001600160e01b031916909317600160a01b42909216919091021790915581905b858110156119065760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48380156118dc57506118da6000888488611508565b155b156118fa576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101611885565b506000556111cc565b82805461191b90611f49565b90600052602060002090601f01602090048101928261193d5760008555611983565b82601f1061195657805160ff1916838001178555611983565b82800160010185558215611983579182015b82811115611983578251825591602001919060010190611968565b5061198f929150611993565b5090565b5b8082111561198f5760008155600101611994565b60006001600160401b03808411156119c2576119c2611ff5565b604051601f8501601f19908116603f011681019082821181831017156119ea576119ea611ff5565b81604052809350858152868686011115611a0357600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611a3457600080fd5b919050565b80358015158114611a3457600080fd5b600082601f830112611a5a57600080fd5b610d89838335602085016119a8565b600060208284031215611a7b57600080fd5b610d8982611a1d565b60008060408385031215611a9757600080fd5b611aa083611a1d565b9150611aae60208401611a1d565b90509250929050565b600080600060608486031215611acc57600080fd5b611ad584611a1d565b9250611ae360208501611a1d565b9150604084013590509250925092565b60008060008060808587031215611b0957600080fd5b611b1285611a1d565b9350611b2060208601611a1d565b92506040850135915060608501356001600160401b03811115611b4257600080fd5b8501601f81018713611b5357600080fd5b611b62878235602084016119a8565b91505092959194509250565b60008060408385031215611b8157600080fd5b611b8a83611a1d565b9150611aae60208401611a39565b60008060408385031215611bab57600080fd5b611bb483611a1d565b946020939093013593505050565b600060208284031215611bd457600080fd5b610d8982611a39565b60008060408385031215611bf057600080fd5b611bf983611a39565b915060208301356001600160401b03811115611c1457600080fd5b611c2085828601611a49565b9150509250929050565b600060208284031215611c3c57600080fd5b8135610d898161200b565b600060208284031215611c5957600080fd5b8151610d898161200b565b600060208284031215611c7657600080fd5b81356001600160401b03811115611c8c57600080fd5b61160f84828501611a49565b600060208284031215611caa57600080fd5b5035919050565b60008060408385031215611cc457600080fd5b82359150611aae60208401611a1d565b60008151808452611cec816020860160208601611f1d565b601f01601f19169290920160200192915050565b60008151611d12818560208601611f1d565b9290920192915050565b60008351611d2e818460208801611f1d565b835190830190611d42818360208801611f1d565b01949350505050565b600080845481600182811c915080831680611d6757607f831692505b6020808410821415611d8757634e487b7160e01b86526022600452602486fd5b818015611d9b5760018114611dac57611dd9565b60ff19861689528489019650611dd9565b60008b81526020902060005b86811015611dd15781548b820152908501908301611db8565b505084890196505b505050505050611de98185611d00565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611e2590830184611cd4565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015611e6757835183529284019291840191600101611e4b565b50909695505050505050565b602081526000610d896020830184611cd4565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611ece57611ece611fb3565b500190565b600082611ee257611ee2611fc9565b500490565b6000816000190483118215151615611f0157611f01611fb3565b500290565b600082821015611f1857611f18611fb3565b500390565b60005b83811015611f38578181015183820152602001611f20565b83811115610c595750506000910152565b600181811c90821680611f5d57607f821691505b60208210811415611f7e57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611f9857611f98611fb3565b5060010190565b600082611fae57611fae611fc9565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610acd57600080fdfea2646970667358221220a7ead4391bddb152a8c35d99c87a74fc099080577c1b5225180d9c6af6c6865564736f6c63430008070033
Deployed Bytecode Sourcemap
42774:4335:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46115:145;;;;;;;;;;-1:-1:-1;46115:145:0;;;;;:::i;:::-;;:::i;:::-;;;8661:14:1;;8654:22;8636:41;;8624:2;8609:18;46115:145:0;;;;;;;;28837:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30340:204::-;;;;;;;;;;-1:-1:-1;30340:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7322:32:1;;;7304:51;;7292:2;7277:18;30340:204:0;7158:203:1;29903:371:0;;;;;;;;;;-1:-1:-1;29903:371:0;;;;;:::i;:::-;;:::i;:::-;;25134:271;;;;;;;;;;-1:-1:-1;25370:12:0;;25178:7;25354:13;:28;25134:271;;;12394:25:1;;;12382:2;12367:18;25134:271:0;12248:177:1;45480:121:0;;;;;;;;;;-1:-1:-1;45480:121:0;;;;;:::i;:::-;;:::i;46653:122::-;;;;;;;;;;-1:-1:-1;46653:122:0;;;;;:::i;:::-;;:::i;31197:170::-;;;;;;;;;;-1:-1:-1;31197:170:0;;;;;:::i;:::-;;:::i;46422:93::-;;;;;;;;;;-1:-1:-1;46422:93:0;;;;;:::i;:::-;;:::i;44226:86::-;;;;;;;;;;;;;:::i;46783:103::-;;;;;;;;;;-1:-1:-1;46783:103:0;;;;;:::i;:::-;;:::i;45609:378::-;;;;;;;;;;-1:-1:-1;45609:378:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;31438:185::-;;;;;;;;;;-1:-1:-1;31438:185:0;;;;;:::i;:::-;;:::i;45287:::-;;;;;;;;;;-1:-1:-1;45287:185:0;;;;;:::i;:::-;;:::i;28646:124::-;;;;;;;;;;-1:-1:-1;28646:124:0;;;;;:::i;:::-;;:::i;46523:122::-;;;;;;;;;;-1:-1:-1;46523:122:0;;;;;:::i;:::-;;:::i;25846:206::-;;;;;;;;;;-1:-1:-1;25846:206:0;;;;;:::i;:::-;;:::i;2384:103::-;;;;;;;;;;;;;:::i;43575:144::-;;;;;;:::i;:::-;;:::i;46268:146::-;;;;;;;;;;-1:-1:-1;46268:146:0;;;;;:::i;:::-;;:::i;1733:87::-;;;;;;;;;;-1:-1:-1;1806:6:0;;-1:-1:-1;;;;;1806:6:0;1733:87;;46894:106;;;;;;;;;;-1:-1:-1;46894:106:0;;;;;:::i;:::-;;:::i;29006:104::-;;;;;;;;;;;;;:::i;30616:279::-;;;;;;;;;;-1:-1:-1;30616:279:0;;;;;:::i;:::-;;:::i;44413:104::-;;;;;;;;;;-1:-1:-1;44413:104:0;;;;;:::i;:::-;;:::i;31694:342::-;;;;;;;;;;-1:-1:-1;31694:342:0;;;;;:::i;:::-;;:::i;44525:493::-;;;;;;;;;;-1:-1:-1;44525:493:0;;;;;:::i;:::-;;:::i;44320:85::-;;;;;;;;;;;;;:::i;42949:41::-;;;;;;;;;;;;42985:5;42949:41;;47008:98;;;;;;;;;;-1:-1:-1;47008:98:0;;;;;:::i;:::-;;:::i;30966:164::-;;;;;;;;;;-1:-1:-1;30966:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;31087:25:0;;;31063:4;31087:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30966:164;2642:201;;;;;;;;;;-1:-1:-1;2642:201:0;;;;;:::i;:::-;;:::i;46115:145::-;46192:4;46216:36;46240:11;46216:23;:36::i;:::-;46209:43;46115:145;-1:-1:-1;;46115:145:0:o;28837:100::-;28891:13;28924:5;28917:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28837:100;:::o;30340:204::-;30408:7;30433:16;30441:7;30433;:16::i;:::-;30428:64;;30458:34;;-1:-1:-1;;;30458:34:0;;;;;;;;;;;30428:64;-1:-1:-1;30512:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;30512:24:0;;30340:204::o;29903:371::-;29976:13;29992:24;30008:7;29992:15;:24::i;:::-;29976:40;;30037:5;-1:-1:-1;;;;;30031:11:0;:2;-1:-1:-1;;;;;30031:11:0;;30027:48;;;30051:24;;-1:-1:-1;;;30051:24:0;;;;;;;;;;;30027:48;680:10;-1:-1:-1;;;;;30092:21:0;;;;;;:63;;-1:-1:-1;30118:37:0;30135:5;680:10;30966:164;:::i;30118:37::-;30117:38;30092:63;30088:138;;;30179:35;;-1:-1:-1;;;30179:35:0;;;;;;;;;;;30088:138;30238:28;30247:2;30251:7;30260:5;30238:8;:28::i;:::-;29965:309;29903:371;;:::o;45480:121::-;45547:7;45574:19;45588:4;45574:13;:19::i;46653:122::-;1806:6;;-1:-1:-1;;;;;1806:6:0;680:10;1953:23;1945:68;;;;-1:-1:-1;;;1945:68:0;;;;;;;:::i;:::-;;;;;;;;;46735:32:::1;::::0;-1:-1:-1;;;;;46735:24:0;::::1;::::0;:32;::::1;;;::::0;46760:6;;46735:32:::1;::::0;;;46760:6;46735:24;:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;31197:170:::0;31331:28;31341:4;31347:2;31351:7;31331:9;:28::i;46422:93::-;1806:6;;-1:-1:-1;;;;;1806:6:0;680:10;1953:23;1945:68;;;;-1:-1:-1;;;1945:68:0;;;;;;;:::i;:::-;46485:12:::1;:22:::0;;-1:-1:-1;;46485:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46422:93::o;44226:86::-;1806:6;;-1:-1:-1;;;;;1806:6:0;680:10;1953:23;1945:68;;;;-1:-1:-1;;;1945:68:0;;;;;;;:::i;:::-;44280:20:::1;:24:::0;;-1:-1:-1;;44280:24:0::1;44303:1;44280:24;::::0;;44226:86::o;46783:103::-;1806:6;;-1:-1:-1;;;;;1806:6:0;680:10;1953:23;1945:68;;;;-1:-1:-1;;;1945:68:0;;;;;;;:::i;:::-;46859:19;;::::1;::::0;:13:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;:::-;;46783:103:::0;:::o;45609:378::-;45666:23;45702:13;45718:16;45728:5;45718:9;:16::i;:::-;45702:32;;45768:5;-1:-1:-1;;;;;45754:20:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45754:20:0;;45745:29;;45785:13;45818:6;45813:167;25370:12;;25178:7;25354:13;:28;45828:1;:15;45813:167;;;45883:5;-1:-1:-1;;;;;45869:19:0;:10;45877:1;45869:7;:10::i;:::-;-1:-1:-1;;;;;45869:19:0;;45865:104;;;45925:1;45909:6;45916:5;45909:13;;;;;;;;:::i;:::-;;;;;;;;;;:17;45945:8;;;;:::i;:::-;;;;45865:104;45845:3;;;;:::i;:::-;;;;45813:167;;;;45691:296;;45609:378;;;:::o;31438:185::-;31576:39;31593:4;31599:2;31603:7;31576:39;;;;;;;;;;;;:16;:39::i;45287:185::-;45356:15;45384:18;45405:14;45413:5;45405:7;:14::i;:::-;-1:-1:-1;;;;;45444:19:0;;;;;;;;;;45287:185;-1:-1:-1;;;45287:185:0:o;28646:124::-;28710:7;28737:20;28749:7;28737:11;:20::i;:::-;:25;;28646:124;-1:-1:-1;;28646:124:0:o;46523:122::-;1806:6;;-1:-1:-1;;;;;1806:6:0;680:10;1953:23;1945:68;;;;-1:-1:-1;;;1945:68:0;;;;;;;:::i;:::-;46590:47:::1;::::0;-1:-1:-1;;;;;46590:24:0;::::1;::::0;46615:21:::1;46590:47:::0;::::1;;;::::0;::::1;::::0;;;46615:21;46590:24;:47;::::1;;;;;;;;;;;;;::::0;::::1;;;;25846:206:::0;25910:7;-1:-1:-1;;;;;25934:19:0;;25930:60;;25962:28;;-1:-1:-1;;;25962:28:0;;;;;;;;;;;25930:60;-1:-1:-1;;;;;;26016:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;26016:27:0;;25846:206::o;2384:103::-;1806:6;;-1:-1:-1;;;;;1806:6:0;680:10;1953:23;1945:68;;;;-1:-1:-1;;;1945:68:0;;;;;;;:::i;:::-;2449:30:::1;2476:1;2449:18;:30::i;:::-;2384:103::o:0;43575:144::-;43637:37;43655:10;43667:6;43637:17;:37::i;:::-;43685:26;43692:10;43704:6;43685;:26::i;:::-;43575:144;:::o;46268:146::-;1806:6;;-1:-1:-1;;;;;1806:6:0;680:10;1953:23;1945:68;;;;-1:-1:-1;;;1945:68:0;;;;;;;:::i;:::-;46355:15;;::::1;::::0;:9:::1;::::0;:15:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;46381:12:0::1;:25:::0;;-1:-1:-1;;46381:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46268:146::o;46894:106::-;1806:6;;-1:-1:-1;;;;;1806:6:0;680:10;1953:23;1945:68;;;;-1:-1:-1;;;1945:68:0;;;;;;;:::i;:::-;46966:17:::1;:26:::0;46894:106::o;29006:104::-;29062:13;29095:7;29088:14;;;;;:::i;30616:279::-;-1:-1:-1;;;;;30707:24:0;;680:10;30707:24;30703:54;;;30740:17;;-1:-1:-1;;;30740:17:0;;;;;;;;;;;30703:54;680:10;30770:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;30770:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;30770:53:0;;;;;;;;;;30839:48;;8636:41:1;;;30770:42:0;;680:10;30839:48;;8609:18:1;30839:48:0;;;;;;;30616:279;;:::o;44413:104::-;1806:6;;-1:-1:-1;;;;;1806:6:0;680:10;1953:23;1945:68;;;;-1:-1:-1;;;1945:68:0;;;;;;;:::i;:::-;44485:16:::1;:24:::0;44413:104::o;31694:342::-;31861:28;31871:4;31877:2;31881:7;31861:9;:28::i;:::-;31905:48;31928:4;31934:2;31938:7;31947:5;31905:22;:48::i;:::-;31900:129;;31977:40;;-1:-1:-1;;;31977:40:0;;;;;;;;;;;31900:129;31694:342;;;;:::o;44525:493::-;44598:13;44632:16;44640:7;44632;:16::i;:::-;44624:76;;;;-1:-1:-1;;;44624:76:0;;11278:2:1;44624:76:0;;;11260:21:1;11317:2;11297:18;;;11290:30;11356:34;11336:18;;;11329:62;-1:-1:-1;;;11407:18:1;;;11400:45;11462:19;;44624:76:0;11076:411:1;44624:76:0;44716:12;;;;44711:151;;44782:1;44758:13;44752:27;;;;;:::i;:::-;;;:31;:98;;;;;;;;;;;;;;;;;44810:13;44825:18;:7;:16;:18::i;:::-;44793:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44745:105;44525:493;-1:-1:-1;;44525:493:0:o;44711:151::-;44872:21;44896:10;:8;:10::i;:::-;44872:34;;44948:1;44930:7;44924:21;:25;:86;;;;;;;;;;;;;;;;;44976:7;44985:18;:7;:16;:18::i;:::-;44959:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44924:86;44917:93;44525:493;-1:-1:-1;;;44525:493:0:o;44320:85::-;1806:6;;-1:-1:-1;;;;;1806:6:0;680:10;1953:23;1945:68;;;;-1:-1:-1;;;1945:68:0;;;;;;;:::i;:::-;44373:20:::1;:24:::0;;-1:-1:-1;;44373:24:0::1;::::0;;44320:85::o;47008:98::-;1806:6;;-1:-1:-1;;;;;1806:6:0;680:10;1953:23;1945:68;;;;-1:-1:-1;;;1945:68:0;;;;;;;:::i;:::-;47079:10:::1;:19:::0;47008:98::o;2642:201::-;1806:6;;-1:-1:-1;;;;;1806:6:0;680:10;1953:23;1945:68;;;;-1:-1:-1;;;1945:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2731:22:0;::::1;2723:73;;;::::0;-1:-1:-1;;;2723:73:0;;9114:2:1;2723:73:0::1;::::0;::::1;9096:21:1::0;9153:2;9133:18;;;9126:30;9192:34;9172:18;;;9165:62;-1:-1:-1;;;9243:18:1;;;9236:36;9289:19;;2723:73:0::1;8912:402:1::0;2723:73:0::1;2807:28;2826:8;2807:18;:28::i;11697:387::-:0;12020:20;12068:8;;;11697:387::o;25477:305::-;25579:4;-1:-1:-1;;;;;;25616:40:0;;-1:-1:-1;;;25616:40:0;;:105;;-1:-1:-1;;;;;;;25673:48:0;;-1:-1:-1;;;25673:48:0;25616:105;:158;;;-1:-1:-1;;;;;;;;;;21820:40:0;;;25738:36;21711:157;32291:144;32348:4;32382:13;;32372:7;:23;:55;;;;-1:-1:-1;;32400:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;32400:27:0;;;;32399:28;;32291:144::o;39497:196::-;39612:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;39612:29:0;-1:-1:-1;;;;;39612:29:0;;;;;;;;;39657:28;;39612:24;;39657:28;;;;;;;39497:196;;;:::o;26134:207::-;26195:7;-1:-1:-1;;;;;26219:19:0;;26215:59;;26247:27;;-1:-1:-1;;;26247:27:0;;;;;;;;;;;26215:59;-1:-1:-1;;;;;;26300:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;26300:32:0;;-1:-1:-1;;;;;26300:32:0;;26134:207::o;34998:2112::-;35113:35;35151:20;35163:7;35151:11;:20::i;:::-;35226:18;;35113:58;;-1:-1:-1;35184:22:0;;-1:-1:-1;;;;;35210:34:0;680:10;-1:-1:-1;;;;;35210:34:0;;:101;;;-1:-1:-1;35278:18:0;;35261:50;;680:10;30966:164;:::i;35261:50::-;35210:154;;;-1:-1:-1;680:10:0;35328:20;35340:7;35328:11;:20::i;:::-;-1:-1:-1;;;;;35328:36:0;;35210:154;35184:181;;35383:17;35378:66;;35409:35;;-1:-1:-1;;;35409:35:0;;;;;;;;;;;35378:66;35481:4;-1:-1:-1;;;;;35459:26:0;:13;:18;;;-1:-1:-1;;;;;35459:26:0;;35455:67;;35494:28;;-1:-1:-1;;;35494:28:0;;;;;;;;;;;35455:67;-1:-1:-1;;;;;35537:16:0;;35533:52;;35562:23;;-1:-1:-1;;;35562:23:0;;;;;;;;;;;35533:52;35706:49;35723:1;35727:7;35736:13;:18;;;35706:8;:49::i;:::-;-1:-1:-1;;;;;36051:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;36051:31:0;;;-1:-1:-1;;;;;36051:31:0;;;-1:-1:-1;;36051:31:0;;;;;;;36097:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;36097:29:0;;;;;;;;;;;36143:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;36188:61:0;;;;-1:-1:-1;;;36233:15:0;36188:61;;;;;;;;;;;36523:11;;;36553:24;;;;;:29;36523:11;;36553:29;36549:445;;36778:13;;36764:11;:27;36760:219;;;36848:18;;;36816:24;;;:11;:24;;;;;;;;:50;;36931:28;;;;-1:-1:-1;;;;;36889:70:0;-1:-1:-1;;;36889:70:0;-1:-1:-1;;;;;;36889:70:0;;;-1:-1:-1;;;;;36816:50:0;;;36889:70;;;;;;;36760:219;36026:979;37041:7;37037:2;-1:-1:-1;;;;;37022:27:0;37031:4;-1:-1:-1;;;;;37022:27:0;;;;;;;;;;;37060:42;35102:2008;;34998:2112;;;:::o;27501:1083::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;27667:13:0;;27611:7;;27660:20;;27656:861;;;27701:31;27735:17;;;:11;:17;;;;;;;;;27701:51;;;;;;;;;-1:-1:-1;;;;;27701:51:0;;;;-1:-1:-1;;;27701:51:0;;-1:-1:-1;;;;;27701:51:0;;;;;;;;-1:-1:-1;;;27701:51:0;;;;;;;;;;;;;;27771:731;;27821:14;;-1:-1:-1;;;;;27821:28:0;;27817:101;;27885:9;27501:1083;-1:-1:-1;;;27501:1083:0:o;27817:101::-;-1:-1:-1;;;28262:6:0;28307:17;;;;:11;:17;;;;;;;;;28295:29;;;;;;;;;-1:-1:-1;;;;;28295:29:0;;;;;-1:-1:-1;;;28295:29:0;;-1:-1:-1;;;;;28295:29:0;;;;;;;;-1:-1:-1;;;28295:29:0;;;;;;;;;;;;;28355:28;28351:109;;28423:9;27501:1083;-1:-1:-1;;;27501:1083:0:o;28351:109::-;28222:261;;;27682:835;27656:861;28545:31;;-1:-1:-1;;;28545:31:0;;;;;;;;;;;3003:191;3096:6;;;-1:-1:-1;;;;;3113:17:0;;;-1:-1:-1;;;;;;3113:17:0;;;;;;;3146:40;;3096:6;;;3113:17;3096:6;;3146:40;;3077:16;;3146:40;3066:128;3003:191;:::o;43727:490::-;43815:20;;;;;:25;43807:66;;;;-1:-1:-1;;;43807:66:0;;10207:2:1;43807:66:0;;;10189:21:1;10246:2;10226:18;;;10219:30;10285;10265:18;;;10258:58;10333:18;;43807:66:0;10005:352:1;43807:66:0;43911:16;;43892:15;:35;;43884:72;;;;-1:-1:-1;;;43884:72:0;;12097:2:1;43884:72:0;;;12079:21:1;12136:2;12116:18;;;12109:30;12175:26;12155:18;;;12148:54;12219:18;;43884:72:0;11895:348:1;43884:72:0;44008:6;43988:17;;:26;;;;:::i;:::-;43975:9;:39;;43967:86;;;;-1:-1:-1;;;43967:86:0;;11694:2:1;43967:86:0;;;11676:21:1;11733:2;11713:18;;;11706:30;11772:34;11752:18;;;11745:62;-1:-1:-1;;;11823:18:1;;;11816:32;11865:19;;43967:86:0;11492:398:1;43967:86:0;44072:16;44081:6;44072:8;:16::i;:::-;44064:53;;;;-1:-1:-1;;;44064:53:0;;10925:2:1;44064:53:0;;;10907:21:1;10964:2;10944:18;;;10937:30;11003:26;10983:18;;;10976:54;11047:18;;44064:53:0;10723:348:1;44064:53:0;44174:10;;44163:6;44137:23;44151:8;44137:13;:23::i;:::-;:32;;;;:::i;:::-;44136:48;;44128:81;;;;-1:-1:-1;;;44128:81:0;;9521:2:1;44128:81:0;;;9503:21:1;9560:2;9540:18;;;9533:30;-1:-1:-1;;;9579:18:1;;;9572:50;9639:18;;44128:81:0;9319:344:1;45995:112:0;46068:31;46078:12;46092:6;46068:9;:31::i;40258:790::-;40413:4;-1:-1:-1;;;;;40434:13:0;;12020:20;12068:8;40430:611;;40470:72;;-1:-1:-1;;;40470:72:0;;-1:-1:-1;;;;;40470:36:0;;;;;:72;;680:10;;40521:4;;40527:7;;40536:5;;40470:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40470:72:0;;;;;;;;-1:-1:-1;;40470:72:0;;;;;;;;;;;;:::i;:::-;;;40466:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40716:13:0;;40712:259;;40766:40;;-1:-1:-1;;;40766:40:0;;;;;;;;;;;40712:259;40921:6;40915:13;40906:6;40902:2;40898:15;40891:38;40466:520;-1:-1:-1;;;;;;40593:55:0;-1:-1:-1;;;40593:55:0;;-1:-1:-1;40586:62:0;;40430:611;-1:-1:-1;41025:4:0;40430:611;40258:790;;;;;;:::o;19254:723::-;19310:13;19531:10;19527:53;;-1:-1:-1;;19558:10:0;;;;;;;;;;;;-1:-1:-1;;;19558:10:0;;;;;19254:723::o;19527:53::-;19605:5;19590:12;19646:78;19653:9;;19646:78;;19679:8;;;;:::i;:::-;;-1:-1:-1;19702:10:0;;-1:-1:-1;19710:2:0;19702:10;;:::i;:::-;;;19646:78;;;19734:19;19766:6;-1:-1:-1;;;;;19756:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19756:17:0;;19734:39;;19784:154;19791:10;;19784:154;;19818:11;19828:1;19818:11;;:::i;:::-;;-1:-1:-1;19887:10:0;19895:2;19887:5;:10;:::i;:::-;19874:24;;:2;:24;:::i;:::-;19861:39;;19844:6;19851;19844:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;19844:56:0;;;;;;;;-1:-1:-1;19915:11:0;19924:2;19915:11;;:::i;:::-;;;19784:154;;43369:102;43421:13;43454:9;43447:16;;;;;:::i;45026:253::-;45082:11;45106:14;45123:13;25370:12;;25178:7;25354:13;:28;;25134:271;45123:13;45106:30;-1:-1:-1;45147:22:0;45172:15;45181:6;45106:30;45172:15;:::i;:::-;45147:40;;45207:4;45198:13;;42985:5;45230:14;:27;;45222:49;;;;-1:-1:-1;;;45222:49:0;;9870:2:1;45222:49:0;;;9852:21:1;9909:1;9889:18;;;9882:29;-1:-1:-1;;;9927:18:1;;;9920:39;9976:18;;45222:49:0;9668:332:1;45222:49:0;45095:184;;45026:253;;;:::o;32443:104::-;32512:27;32522:2;32526:8;32512:27;;;;;;;;;;;;33033:32;33039:2;33043:8;33053:5;33060:4;33471:20;33494:13;-1:-1:-1;;;;;33522:16:0;;33518:48;;33547:19;;-1:-1:-1;;;33547:19:0;;;;;;;;;;;33518:48;33581:13;33577:44;;33603:18;;-1:-1:-1;;;33603:18:0;;;;;;;;;;;33577:44;-1:-1:-1;;;;;33972:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;34031:49:0;;-1:-1:-1;;;;;33972:44:0;;;;;;;34031:49;;;-1:-1:-1;;;;;33972:44:0;;;;;;34031:49;;;;;;;;;;;;;;;;34097:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;34147:66:0;;;;-1:-1:-1;;;34197:15:0;34147:66;;;;;;;;;;;34097:25;;34282:328;34302:8;34298:1;:12;34282:328;;;34341:38;;34366:12;;-1:-1:-1;;;;;34341:38:0;;;34358:1;;34341:38;;34358:1;;34341:38;34402:4;:68;;;;;34411:59;34442:1;34446:2;34450:12;34464:5;34411:22;:59::i;:::-;34410:60;34402:68;34398:164;;;34502:40;;-1:-1:-1;;;34502:40:0;;;;;;;;;;;34398:164;34580:14;;;;;34312:3;34282:328;;;-1:-1:-1;34626:13:0;:28;34676:60;31694:342;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;-1:-1:-1;;;;;149:2:1;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:160::-;893:20;;949:13;;942:21;932:32;;922:60;;978:1;975;968:12;993:221;1036:5;1089:3;1082:4;1074:6;1070:17;1066:27;1056:55;;1107:1;1104;1097:12;1056:55;1129:79;1204:3;1195:6;1182:20;1175:4;1167:6;1163:17;1129:79;:::i;1219:186::-;1278:6;1331:2;1319:9;1310:7;1306:23;1302:32;1299:52;;;1347:1;1344;1337:12;1299:52;1370:29;1389:9;1370:29;:::i;1410:260::-;1478:6;1486;1539:2;1527:9;1518:7;1514:23;1510:32;1507:52;;;1555:1;1552;1545:12;1507:52;1578:29;1597:9;1578:29;:::i;:::-;1568:39;;1626:38;1660:2;1649:9;1645:18;1626:38;:::i;:::-;1616:48;;1410:260;;;;;:::o;1675:328::-;1752:6;1760;1768;1821:2;1809:9;1800:7;1796:23;1792:32;1789:52;;;1837:1;1834;1827:12;1789:52;1860:29;1879:9;1860:29;:::i;:::-;1850:39;;1908:38;1942:2;1931:9;1927:18;1908:38;:::i;:::-;1898:48;;1993:2;1982:9;1978:18;1965:32;1955:42;;1675:328;;;;;:::o;2008:666::-;2103:6;2111;2119;2127;2180:3;2168:9;2159:7;2155:23;2151:33;2148:53;;;2197:1;2194;2187:12;2148:53;2220:29;2239:9;2220:29;:::i;:::-;2210:39;;2268:38;2302:2;2291:9;2287:18;2268:38;:::i;:::-;2258:48;;2353:2;2342:9;2338:18;2325:32;2315:42;;2408:2;2397:9;2393:18;2380:32;-1:-1:-1;;;;;2427:6:1;2424:30;2421:50;;;2467:1;2464;2457:12;2421:50;2490:22;;2543:4;2535:13;;2531:27;-1:-1:-1;2521:55:1;;2572:1;2569;2562:12;2521:55;2595:73;2660:7;2655:2;2642:16;2637:2;2633;2629:11;2595:73;:::i;:::-;2585:83;;;2008:666;;;;;;;:::o;2679:254::-;2744:6;2752;2805:2;2793:9;2784:7;2780:23;2776:32;2773:52;;;2821:1;2818;2811:12;2773:52;2844:29;2863:9;2844:29;:::i;:::-;2834:39;;2892:35;2923:2;2912:9;2908:18;2892:35;:::i;2938:254::-;3006:6;3014;3067:2;3055:9;3046:7;3042:23;3038:32;3035:52;;;3083:1;3080;3073:12;3035:52;3106:29;3125:9;3106:29;:::i;:::-;3096:39;3182:2;3167:18;;;;3154:32;;-1:-1:-1;;;2938:254:1:o;3197:180::-;3253:6;3306:2;3294:9;3285:7;3281:23;3277:32;3274:52;;;3322:1;3319;3312:12;3274:52;3345:26;3361:9;3345:26;:::i;3382:390::-;3457:6;3465;3518:2;3506:9;3497:7;3493:23;3489:32;3486:52;;;3534:1;3531;3524:12;3486:52;3557:26;3573:9;3557:26;:::i;:::-;3547:36;;3634:2;3623:9;3619:18;3606:32;-1:-1:-1;;;;;3653:6:1;3650:30;3647:50;;;3693:1;3690;3683:12;3647:50;3716;3758:7;3749:6;3738:9;3734:22;3716:50;:::i;:::-;3706:60;;;3382:390;;;;;:::o;3777:245::-;3835:6;3888:2;3876:9;3867:7;3863:23;3859:32;3856:52;;;3904:1;3901;3894:12;3856:52;3943:9;3930:23;3962:30;3986:5;3962:30;:::i;4027:249::-;4096:6;4149:2;4137:9;4128:7;4124:23;4120:32;4117:52;;;4165:1;4162;4155:12;4117:52;4197:9;4191:16;4216:30;4240:5;4216:30;:::i;4281:322::-;4350:6;4403:2;4391:9;4382:7;4378:23;4374:32;4371:52;;;4419:1;4416;4409:12;4371:52;4459:9;4446:23;-1:-1:-1;;;;;4484:6:1;4481:30;4478:50;;;4524:1;4521;4514:12;4478:50;4547;4589:7;4580:6;4569:9;4565:22;4547:50;:::i;4608:180::-;4667:6;4720:2;4708:9;4699:7;4695:23;4691:32;4688:52;;;4736:1;4733;4726:12;4688:52;-1:-1:-1;4759:23:1;;4608:180;-1:-1:-1;4608:180:1:o;4793:254::-;4861:6;4869;4922:2;4910:9;4901:7;4897:23;4893:32;4890:52;;;4938:1;4935;4928:12;4890:52;4974:9;4961:23;4951:33;;5003:38;5037:2;5026:9;5022:18;5003:38;:::i;5052:257::-;5093:3;5131:5;5125:12;5158:6;5153:3;5146:19;5174:63;5230:6;5223:4;5218:3;5214:14;5207:4;5200:5;5196:16;5174:63;:::i;:::-;5291:2;5270:15;-1:-1:-1;;5266:29:1;5257:39;;;;5298:4;5253:50;;5052:257;-1:-1:-1;;5052:257:1:o;5314:185::-;5356:3;5394:5;5388:12;5409:52;5454:6;5449:3;5442:4;5435:5;5431:16;5409:52;:::i;:::-;5477:16;;;;;5314:185;-1:-1:-1;;5314:185:1:o;5504:470::-;5683:3;5721:6;5715:13;5737:53;5783:6;5778:3;5771:4;5763:6;5759:17;5737:53;:::i;:::-;5853:13;;5812:16;;;;5875:57;5853:13;5812:16;5909:4;5897:17;;5875:57;:::i;:::-;5948:20;;5504:470;-1:-1:-1;;;;5504:470:1:o;5979:1174::-;6155:3;6184:1;6217:6;6211:13;6247:3;6269:1;6297:9;6293:2;6289:18;6279:28;;6357:2;6346:9;6342:18;6379;6369:61;;6423:4;6415:6;6411:17;6401:27;;6369:61;6449:2;6497;6489:6;6486:14;6466:18;6463:38;6460:165;;;-1:-1:-1;;;6524:33:1;;6580:4;6577:1;6570:15;6610:4;6531:3;6598:17;6460:165;6641:18;6668:104;;;;6786:1;6781:320;;;;6634:467;;6668:104;-1:-1:-1;;6701:24:1;;6689:37;;6746:16;;;;-1:-1:-1;6668:104:1;;6781:320;12503:1;12496:14;;;12540:4;12527:18;;6876:1;6890:165;6904:6;6901:1;6898:13;6890:165;;;6982:14;;6969:11;;;6962:35;7025:16;;;;6919:10;;6890:165;;;6894:3;;7084:6;7079:3;7075:16;7068:23;;6634:467;;;;;;;7117:30;7143:3;7135:6;7117:30;:::i;:::-;7110:37;5979:1174;-1:-1:-1;;;;;5979:1174:1:o;7366:488::-;-1:-1:-1;;;;;7635:15:1;;;7617:34;;7687:15;;7682:2;7667:18;;7660:43;7734:2;7719:18;;7712:34;;;7782:3;7777:2;7762:18;;7755:31;;;7560:4;;7803:45;;7828:19;;7820:6;7803:45;:::i;:::-;7795:53;7366:488;-1:-1:-1;;;;;;7366:488:1:o;7859:632::-;8030:2;8082:21;;;8152:13;;8055:18;;;8174:22;;;8001:4;;8030:2;8253:15;;;;8227:2;8212:18;;;8001:4;8296:169;8310:6;8307:1;8304:13;8296:169;;;8371:13;;8359:26;;8440:15;;;;8405:12;;;;8332:1;8325:9;8296:169;;;-1:-1:-1;8482:3:1;;7859:632;-1:-1:-1;;;;;;7859:632:1:o;8688:219::-;8837:2;8826:9;8819:21;8800:4;8857:44;8897:2;8886:9;8882:18;8874:6;8857:44;:::i;10362:356::-;10564:2;10546:21;;;10583:18;;;10576:30;10642:34;10637:2;10622:18;;10615:62;10709:2;10694:18;;10362:356::o;12556:128::-;12596:3;12627:1;12623:6;12620:1;12617:13;12614:39;;;12633:18;;:::i;:::-;-1:-1:-1;12669:9:1;;12556:128::o;12689:120::-;12729:1;12755;12745:35;;12760:18;;:::i;:::-;-1:-1:-1;12794:9:1;;12689:120::o;12814:168::-;12854:7;12920:1;12916;12912:6;12908:14;12905:1;12902:21;12897:1;12890:9;12883:17;12879:45;12876:71;;;12927:18;;:::i;:::-;-1:-1:-1;12967:9:1;;12814:168::o;12987:125::-;13027:4;13055:1;13052;13049:8;13046:34;;;13060:18;;:::i;:::-;-1:-1:-1;13097:9:1;;12987:125::o;13117:258::-;13189:1;13199:113;13213:6;13210:1;13207:13;13199:113;;;13289:11;;;13283:18;13270:11;;;13263:39;13235:2;13228:10;13199:113;;;13330:6;13327:1;13324:13;13321:48;;;-1:-1:-1;;13365:1:1;13347:16;;13340:27;13117:258::o;13380:380::-;13459:1;13455:12;;;;13502;;;13523:61;;13577:4;13569:6;13565:17;13555:27;;13523:61;13630:2;13622:6;13619:14;13599:18;13596:38;13593:161;;;13676:10;13671:3;13667:20;13664:1;13657:31;13711:4;13708:1;13701:15;13739:4;13736:1;13729:15;13593:161;;13380:380;;;:::o;13765:135::-;13804:3;-1:-1:-1;;13825:17:1;;13822:43;;;13845:18;;:::i;:::-;-1:-1:-1;13892:1:1;13881:13;;13765:135::o;13905:112::-;13937:1;13963;13953:35;;13968:18;;:::i;:::-;-1:-1:-1;14002:9:1;;13905:112::o;14022:127::-;14083:10;14078:3;14074:20;14071:1;14064:31;14114:4;14111:1;14104:15;14138:4;14135:1;14128:15;14154:127;14215:10;14210:3;14206:20;14203:1;14196:31;14246:4;14243:1;14236:15;14270:4;14267:1;14260:15;14286:127;14347:10;14342:3;14338:20;14335:1;14328:31;14378:4;14375:1;14368:15;14402:4;14399:1;14392:15;14418:127;14479:10;14474:3;14470:20;14467:1;14460:31;14510:4;14507:1;14500:15;14534:4;14531:1;14524:15;14550:131;-1:-1:-1;;;;;;14624:32:1;;14614:43;;14604:71;;14671:1;14668;14661:12
Swarm Source
ipfs://a7ead4391bddb152a8c35d99c87a74fc099080577c1b5225180d9c6af6c68655
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.