ERC-721
Overview
Max Total Supply
500 TMRC
Holders
44
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
29 TMRCLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TheMoggieRescueClub
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-30 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: contracts/erc721a.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); 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 _startTokenId() (defaults to 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_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 1; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @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) { 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) { 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) { 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 { _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 (_startTokenId() <= curr && 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 virtual 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 (to.isContract() && !_checkContractOnERC721Received(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 _startTokenId() <= tokenId && 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; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _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); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // 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; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.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; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev This is equivalent to _burn(tokenId, false) */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // 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 storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.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; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, 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 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { 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)) } } } } /** * @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 {} } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev 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); } } // File: contracts/contract.sol pragma solidity ^0.8.4; contract TheMoggieRescueClub is Ownable, ERC721A { using Strings for uint256; string private baseTokenURI; uint256 public cost = 0.08 ether; uint128 public maxSupply = 10000; bool public saleActive = false; constructor() ERC721A("The Moggie Rescue Club", "TMRC") {} modifier mintCompliance(uint256 _mintAmount) { require(_mintAmount > 0 , "Invalid mint amount!"); require(totalMinted() + _mintAmount <= maxSupply, "Max supply exceeded!"); _; } ///Allows any address to mint when the public sale is open function mint(uint64 _mintAmount) public payable mintCompliance(_mintAmount) { require(saleActive, "Sale is not Active"); require(msg.value == cost * _mintAmount, "Insufficient funds!"); _safeMint(msg.sender, _mintAmount); } ///Allows owner of the collection to airdrop a token to any address function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner { _safeMint(_receiver, _mintAmount); } //@return token ids owned by an address in the collection function walletOfOwner(address _owner) external view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount); uint256 currentTokenId = 1; uint256 ownedTokenIndex = 0; while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) { if(exists(currentTokenId) == true) { address currentTokenOwner = ownerOf(currentTokenId); if (currentTokenOwner == _owner) { ownedTokenIds[ownedTokenIndex] = currentTokenId; ownedTokenIndex++; } } currentTokenId++; } return ownedTokenIds; } //@return full url for passed in token id function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require( _exists(_tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), ".json")) : ""; } //@return amount an address has minted during all sales function numberMinted(address _owner) public view returns (uint256) { return _numberMinted(_owner); } //@return all NFT's minted including burned tokens function totalMinted() public view returns (uint256) { return _totalMinted(); } function exists(uint256 _tokenId) public view returns (bool) { return _exists(_tokenId); } //@return url for the nft metadata function _baseURI() internal view virtual override returns (string memory) { return baseTokenURI; } function setBaseURI(string calldata _URI) external onlyOwner { baseTokenURI = _URI; } function setCost(uint256 _cost) public onlyOwner { cost = _cost; } function setSaleActive(bool _saleActive) public onlyOwner { saleActive = _saleActive; } function setMaxSupply(uint128 _maxSupply) public onlyOwner { maxSupply = _maxSupply; } function withdraw() public onlyOwner { uint256 initialBalance = address(this).balance; (bool t1, ) = payable(0x1c4291025b08B27dC67DA947334857fF543f8Ce4).call{value: initialBalance * 50 / 100}(""); require(t1); (bool t2, ) = payable(0x952A5C17c2246C8463A29D1d772031c54C988870).call{value: initialBalance * 50 / 100}(""); require(t2); } /// Fallbacks receive() external payable { } fallback() external payable { } }
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":"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":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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"_mintAmount","type":"uint64"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_maxSupply","type":"uint128"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_saleActive","type":"bool"}],"name":"setSaleActive","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":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405267011c37937e080000600a55600b80546001600160881b0319166127101790553480156200003157600080fd5b506040518060400160405280601681526020017f546865204d6f676769652052657363756520436c75620000000000000000000081525060405180604001604052806004815260200163544d524360e01b8152506200009f62000099620000d760201b60201c565b620000db565b8151620000b49060039060208501906200012b565b508051620000ca9060049060208401906200012b565b505060018055506200020e565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200013990620001d1565b90600052602060002090601f0160209004810192826200015d5760008555620001a8565b82601f106200017857805160ff1916838001178555620001a8565b82800160010185558215620001a8579182015b82811115620001a85782518255916020019190600101906200018b565b50620001b6929150620001ba565b5090565b5b80821115620001b65760008155600101620001bb565b600181811c90821680620001e657607f821691505b602082108114156200020857634e487b7160e01b600052602260045260246000fd5b50919050565b611eb2806200021e6000396000f3fe6080604052600436106101b95760003560e01c806370a08231116100eb578063b88d4fde1161008f578063e985e9c511610061578063e985e9c514610535578063efbd73f41461057e578063f2fde38b1461059e578063fb9d09c8146105be57005b8063b88d4fde1461049d578063c87b56dd146104bd578063d5abeb01146104dd578063dc33e6811461051557005b80638da5cb5b116100c85780638da5cb5b1461043557806395d89b4114610453578063a22cb46514610468578063a2309ff81461048857005b806370a08231146103d5578063841718a6146103f55780638ac068a21461041557005b80633ccfd60b1161015d5780634f558e791161012f5780634f558e791461035457806355f804b3146103745780636352211e1461039457806368428a1b146103b457005b80633ccfd60b146102d257806342842e0e146102e7578063438b63001461030757806344a0d68a1461033457005b8063095ea7b311610196578063095ea7b31461025157806313faede61461027157806318160ddd1461029557806323b872dd146102b257005b806301ffc9a7146101c257806306fdde03146101f7578063081812fc1461021957005b366101c057005b005b3480156101ce57600080fd5b506101e26101dd366004611aa9565b6105d1565b60405190151581526020015b60405180910390f35b34801561020357600080fd5b5061020c610623565b6040516101ee9190611cce565b34801561022557600080fd5b50610239610234366004611b7d565b6106b5565b6040516001600160a01b0390911681526020016101ee565b34801561025d57600080fd5b506101c061026c366004611a64565b6106f9565b34801561027d57600080fd5b50610287600a5481565b6040519081526020016101ee565b3480156102a157600080fd5b506002546001540360001901610287565b3480156102be57600080fd5b506101c06102cd366004611923565b610787565b3480156102de57600080fd5b506101c0610792565b3480156102f357600080fd5b506101c0610302366004611923565b6108c0565b34801561031357600080fd5b506103276103223660046118d5565b6108db565b6040516101ee9190611c8a565b34801561034057600080fd5b506101c061034f366004611b7d565b6109d8565b34801561036057600080fd5b506101e261036f366004611b7d565b610a07565b34801561038057600080fd5b506101c061038f366004611ae3565b610a12565b3480156103a057600080fd5b506102396103af366004611b7d565b610a48565b3480156103c057600080fd5b50600b546101e290600160801b900460ff1681565b3480156103e157600080fd5b506102876103f03660046118d5565b610a5a565b34801561040157600080fd5b506101c0610410366004611a8e565b610aa8565b34801561042157600080fd5b506101c0610430366004611b54565b610af0565b34801561044157600080fd5b506000546001600160a01b0316610239565b34801561045f57600080fd5b5061020c610b3c565b34801561047457600080fd5b506101c0610483366004611a3a565b610b4b565b34801561049457600080fd5b50610287610be1565b3480156104a957600080fd5b506101c06104b836600461195f565b610bf5565b3480156104c957600080fd5b5061020c6104d8366004611b7d565b610c46565b3480156104e957600080fd5b50600b546104fd906001600160801b031681565b6040516001600160801b0390911681526020016101ee565b34801561052157600080fd5b506102876105303660046118d5565b610d11565b34801561054157600080fd5b506101e26105503660046118f0565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561058a57600080fd5b506101c0610599366004611b96565b610d3f565b3480156105aa57600080fd5b506101c06105b93660046118d5565b610e1f565b6101c06105cc366004611bb9565b610eba565b60006001600160e01b031982166380ac58cd60e01b148061060257506001600160e01b03198216635b5e139f60e01b145b8061061d57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461063290611da4565b80601f016020809104026020016040519081016040528092919081815260200182805461065e90611da4565b80156106ab5780601f10610680576101008083540402835291602001916106ab565b820191906000526020600020905b81548152906001019060200180831161068e57829003601f168201915b5050505050905090565b60006106c08261102f565b6106dd576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b600061070482610a48565b9050806001600160a01b0316836001600160a01b031614156107395760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061075957506107578133610550565b155b15610777576040516367d9dca160e11b815260040160405180910390fd5b610782838383611068565b505050565b6107828383836110c4565b6000546001600160a01b031633146107c55760405162461bcd60e51b81526004016107bc90611ce1565b60405180910390fd5b476000731c4291025b08b27dc67da947334857ff543f8ce460646107ea846032611d42565b6107f49190611d2e565b604051600081818185875af1925050503d8060008114610830576040519150601f19603f3d011682016040523d82523d6000602084013e610835565b606091505b505090508061084357600080fd5b600073952a5c17c2246c8463a29d1d772031c54c9888706064610867856032611d42565b6108719190611d2e565b604051600081818185875af1925050503d80600081146108ad576040519150601f19603f3d011682016040523d82523d6000602084013e6108b2565b606091505b505090508061078257600080fd5b61078283838360405180602001604052806000815250610bf5565b606060006108e883610a5a565b90506000816001600160401b0381111561090457610904611e50565b60405190808252806020026020018201604052801561092d578160200160208202803683370190505b509050600160005b838110801561094f5750600b546001600160801b03168211155b156109ce5761095d82610a07565b1515600114156109bc57600061097283610a48565b9050866001600160a01b0316816001600160a01b031614156109ba57828483815181106109a1576109a1611e3a565b6020908102919091010152816109b681611ddf565b9250505b505b816109c681611ddf565b925050610935565b5090949350505050565b6000546001600160a01b03163314610a025760405162461bcd60e51b81526004016107bc90611ce1565b600a55565b600061061d8261102f565b6000546001600160a01b03163314610a3c5760405162461bcd60e51b81526004016107bc90611ce1565b61078260098383611810565b6000610a53826112b2565b5192915050565b60006001600160a01b038216610a83576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b6000546001600160a01b03163314610ad25760405162461bcd60e51b81526004016107bc90611ce1565b600b8054911515600160801b0260ff60801b19909216919091179055565b6000546001600160a01b03163314610b1a5760405162461bcd60e51b81526004016107bc90611ce1565b600b80546001600160801b0319166001600160801b0392909216919091179055565b60606004805461063290611da4565b6001600160a01b038216331415610b755760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000610bf06001546000190190565b905090565b610c008484846110c4565b6001600160a01b0383163b15158015610c225750610c20848484846113d9565b155b15610c40576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610c518261102f565b610cb55760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107bc565b6000610cbf6114d1565b90506000815111610cdf5760405180602001604052806000815250610d0a565b80610ce9846114e0565b604051602001610cfa929190611c0e565b6040516020818303038152906040525b9392505050565b6001600160a01b038116600090815260066020526040812054600160401b90046001600160401b031661061d565b8160008111610d875760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b60448201526064016107bc565b600b546001600160801b031681610d9c610be1565b610da69190611d16565b1115610deb5760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b60448201526064016107bc565b6000546001600160a01b03163314610e155760405162461bcd60e51b81526004016107bc90611ce1565b61078282846115dd565b6000546001600160a01b03163314610e495760405162461bcd60e51b81526004016107bc90611ce1565b6001600160a01b038116610eae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107bc565b610eb7816115f7565b50565b806001600160401b031660008111610f0b5760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b60448201526064016107bc565b600b546001600160801b031681610f20610be1565b610f2a9190611d16565b1115610f6f5760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b60448201526064016107bc565b600b54600160801b900460ff16610fbd5760405162461bcd60e51b815260206004820152601260248201527153616c65206973206e6f742041637469766560701b60448201526064016107bc565b816001600160401b0316600a54610fd49190611d42565b34146110185760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016107bc565b61102b33836001600160401b03166115dd565b5050565b600081600111158015611043575060015482105b801561061d575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006110cf826112b2565b9050836001600160a01b031681600001516001600160a01b0316146111065760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061112457506111248533610550565b8061113f575033611134846106b5565b6001600160a01b0316145b90508061115f57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661118657604051633a954ecd60e21b815260040160405180910390fd5b61119260008487611068565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661126657600154821461126657805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b604080516060810182526000808252602082018190529181019190915281806001111580156112e2575060015481105b156113c057600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906113be5780516001600160a01b031615611355579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156113b9579392505050565b611355565b505b604051636f96cda160e11b815260040160405180910390fd5b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061140e903390899088908890600401611c4d565b602060405180830381600087803b15801561142857600080fd5b505af1925050508015611458575060408051601f3d908101601f1916820190925261145591810190611ac6565b60015b6114b3573d808015611486576040519150601f19603f3d011682016040523d82523d6000602084013e61148b565b606091505b5080516114ab576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60606009805461063290611da4565b6060816115045750506040805180820190915260018152600360fc1b602082015290565b8160005b811561152e578061151881611ddf565b91506115279050600a83611d2e565b9150611508565b6000816001600160401b0381111561154857611548611e50565b6040519080825280601f01601f191660200182016040528015611572576020820181803683370190505b5090505b84156114c957611587600183611d61565b9150611594600a86611dfa565b61159f906030611d16565b60f81b8183815181106115b4576115b4611e3a565b60200101906001600160f81b031916908160001a9053506115d6600a86611d2e565b9450611576565b61102b828260405180602001604052806000815250611647565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610782838383600180546001600160a01b03851661167757604051622e076360e81b815260040160405180910390fd5b836116955760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260066020908152604080832080546001600160801b031981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600590925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561173857506001600160a01b0387163b15155b156117c1575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461178960008884806001019550886113d9565b6117a6576040516368d2bf6b60e11b815260040160405180910390fd5b8082141561173e5782600154146117bc57600080fd5b611807565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808214156117c2575b506001556112ab565b82805461181c90611da4565b90600052602060002090601f01602090048101928261183e5760008555611884565b82601f106118575782800160ff19823516178555611884565b82800160010185558215611884579182015b82811115611884578235825591602001919060010190611869565b50611890929150611894565b5090565b5b808211156118905760008155600101611895565b80356001600160a01b03811681146118c057600080fd5b919050565b803580151581146118c057600080fd5b6000602082840312156118e757600080fd5b610d0a826118a9565b6000806040838503121561190357600080fd5b61190c836118a9565b915061191a602084016118a9565b90509250929050565b60008060006060848603121561193857600080fd5b611941846118a9565b925061194f602085016118a9565b9150604084013590509250925092565b6000806000806080858703121561197557600080fd5b61197e856118a9565b935061198c602086016118a9565b92506040850135915060608501356001600160401b03808211156119af57600080fd5b818701915087601f8301126119c357600080fd5b8135818111156119d5576119d5611e50565b604051601f8201601f19908116603f011681019083821181831017156119fd576119fd611e50565b816040528281528a6020848701011115611a1657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611a4d57600080fd5b611a56836118a9565b915061191a602084016118c5565b60008060408385031215611a7757600080fd5b611a80836118a9565b946020939093013593505050565b600060208284031215611aa057600080fd5b610d0a826118c5565b600060208284031215611abb57600080fd5b8135610d0a81611e66565b600060208284031215611ad857600080fd5b8151610d0a81611e66565b60008060208385031215611af657600080fd5b82356001600160401b0380821115611b0d57600080fd5b818501915085601f830112611b2157600080fd5b813581811115611b3057600080fd5b866020828501011115611b4257600080fd5b60209290920196919550909350505050565b600060208284031215611b6657600080fd5b81356001600160801b0381168114610d0a57600080fd5b600060208284031215611b8f57600080fd5b5035919050565b60008060408385031215611ba957600080fd5b8235915061191a602084016118a9565b600060208284031215611bcb57600080fd5b81356001600160401b0381168114610d0a57600080fd5b60008151808452611bfa816020860160208601611d78565b601f01601f19169290920160200192915050565b60008351611c20818460208801611d78565b835190830190611c34818360208801611d78565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611c8090830184611be2565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015611cc257835183529284019291840191600101611ca6565b50909695505050505050565b602081526000610d0a6020830184611be2565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611d2957611d29611e0e565b500190565b600082611d3d57611d3d611e24565b500490565b6000816000190483118215151615611d5c57611d5c611e0e565b500290565b600082821015611d7357611d73611e0e565b500390565b60005b83811015611d93578181015183820152602001611d7b565b83811115610c405750506000910152565b600181811c90821680611db857607f821691505b60208210811415611dd957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611df357611df3611e0e565b5060010190565b600082611e0957611e09611e24565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610eb757600080fdfea2646970667358221220aafc7b2dc0e335daa9295448ce5df05acf5fbc063748cb42c0fc70f747a4913a64736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101b95760003560e01c806370a08231116100eb578063b88d4fde1161008f578063e985e9c511610061578063e985e9c514610535578063efbd73f41461057e578063f2fde38b1461059e578063fb9d09c8146105be57005b8063b88d4fde1461049d578063c87b56dd146104bd578063d5abeb01146104dd578063dc33e6811461051557005b80638da5cb5b116100c85780638da5cb5b1461043557806395d89b4114610453578063a22cb46514610468578063a2309ff81461048857005b806370a08231146103d5578063841718a6146103f55780638ac068a21461041557005b80633ccfd60b1161015d5780634f558e791161012f5780634f558e791461035457806355f804b3146103745780636352211e1461039457806368428a1b146103b457005b80633ccfd60b146102d257806342842e0e146102e7578063438b63001461030757806344a0d68a1461033457005b8063095ea7b311610196578063095ea7b31461025157806313faede61461027157806318160ddd1461029557806323b872dd146102b257005b806301ffc9a7146101c257806306fdde03146101f7578063081812fc1461021957005b366101c057005b005b3480156101ce57600080fd5b506101e26101dd366004611aa9565b6105d1565b60405190151581526020015b60405180910390f35b34801561020357600080fd5b5061020c610623565b6040516101ee9190611cce565b34801561022557600080fd5b50610239610234366004611b7d565b6106b5565b6040516001600160a01b0390911681526020016101ee565b34801561025d57600080fd5b506101c061026c366004611a64565b6106f9565b34801561027d57600080fd5b50610287600a5481565b6040519081526020016101ee565b3480156102a157600080fd5b506002546001540360001901610287565b3480156102be57600080fd5b506101c06102cd366004611923565b610787565b3480156102de57600080fd5b506101c0610792565b3480156102f357600080fd5b506101c0610302366004611923565b6108c0565b34801561031357600080fd5b506103276103223660046118d5565b6108db565b6040516101ee9190611c8a565b34801561034057600080fd5b506101c061034f366004611b7d565b6109d8565b34801561036057600080fd5b506101e261036f366004611b7d565b610a07565b34801561038057600080fd5b506101c061038f366004611ae3565b610a12565b3480156103a057600080fd5b506102396103af366004611b7d565b610a48565b3480156103c057600080fd5b50600b546101e290600160801b900460ff1681565b3480156103e157600080fd5b506102876103f03660046118d5565b610a5a565b34801561040157600080fd5b506101c0610410366004611a8e565b610aa8565b34801561042157600080fd5b506101c0610430366004611b54565b610af0565b34801561044157600080fd5b506000546001600160a01b0316610239565b34801561045f57600080fd5b5061020c610b3c565b34801561047457600080fd5b506101c0610483366004611a3a565b610b4b565b34801561049457600080fd5b50610287610be1565b3480156104a957600080fd5b506101c06104b836600461195f565b610bf5565b3480156104c957600080fd5b5061020c6104d8366004611b7d565b610c46565b3480156104e957600080fd5b50600b546104fd906001600160801b031681565b6040516001600160801b0390911681526020016101ee565b34801561052157600080fd5b506102876105303660046118d5565b610d11565b34801561054157600080fd5b506101e26105503660046118f0565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561058a57600080fd5b506101c0610599366004611b96565b610d3f565b3480156105aa57600080fd5b506101c06105b93660046118d5565b610e1f565b6101c06105cc366004611bb9565b610eba565b60006001600160e01b031982166380ac58cd60e01b148061060257506001600160e01b03198216635b5e139f60e01b145b8061061d57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606003805461063290611da4565b80601f016020809104026020016040519081016040528092919081815260200182805461065e90611da4565b80156106ab5780601f10610680576101008083540402835291602001916106ab565b820191906000526020600020905b81548152906001019060200180831161068e57829003601f168201915b5050505050905090565b60006106c08261102f565b6106dd576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b600061070482610a48565b9050806001600160a01b0316836001600160a01b031614156107395760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061075957506107578133610550565b155b15610777576040516367d9dca160e11b815260040160405180910390fd5b610782838383611068565b505050565b6107828383836110c4565b6000546001600160a01b031633146107c55760405162461bcd60e51b81526004016107bc90611ce1565b60405180910390fd5b476000731c4291025b08b27dc67da947334857ff543f8ce460646107ea846032611d42565b6107f49190611d2e565b604051600081818185875af1925050503d8060008114610830576040519150601f19603f3d011682016040523d82523d6000602084013e610835565b606091505b505090508061084357600080fd5b600073952a5c17c2246c8463a29d1d772031c54c9888706064610867856032611d42565b6108719190611d2e565b604051600081818185875af1925050503d80600081146108ad576040519150601f19603f3d011682016040523d82523d6000602084013e6108b2565b606091505b505090508061078257600080fd5b61078283838360405180602001604052806000815250610bf5565b606060006108e883610a5a565b90506000816001600160401b0381111561090457610904611e50565b60405190808252806020026020018201604052801561092d578160200160208202803683370190505b509050600160005b838110801561094f5750600b546001600160801b03168211155b156109ce5761095d82610a07565b1515600114156109bc57600061097283610a48565b9050866001600160a01b0316816001600160a01b031614156109ba57828483815181106109a1576109a1611e3a565b6020908102919091010152816109b681611ddf565b9250505b505b816109c681611ddf565b925050610935565b5090949350505050565b6000546001600160a01b03163314610a025760405162461bcd60e51b81526004016107bc90611ce1565b600a55565b600061061d8261102f565b6000546001600160a01b03163314610a3c5760405162461bcd60e51b81526004016107bc90611ce1565b61078260098383611810565b6000610a53826112b2565b5192915050565b60006001600160a01b038216610a83576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600660205260409020546001600160401b031690565b6000546001600160a01b03163314610ad25760405162461bcd60e51b81526004016107bc90611ce1565b600b8054911515600160801b0260ff60801b19909216919091179055565b6000546001600160a01b03163314610b1a5760405162461bcd60e51b81526004016107bc90611ce1565b600b80546001600160801b0319166001600160801b0392909216919091179055565b60606004805461063290611da4565b6001600160a01b038216331415610b755760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000610bf06001546000190190565b905090565b610c008484846110c4565b6001600160a01b0383163b15158015610c225750610c20848484846113d9565b155b15610c40576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610c518261102f565b610cb55760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107bc565b6000610cbf6114d1565b90506000815111610cdf5760405180602001604052806000815250610d0a565b80610ce9846114e0565b604051602001610cfa929190611c0e565b6040516020818303038152906040525b9392505050565b6001600160a01b038116600090815260066020526040812054600160401b90046001600160401b031661061d565b8160008111610d875760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b60448201526064016107bc565b600b546001600160801b031681610d9c610be1565b610da69190611d16565b1115610deb5760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b60448201526064016107bc565b6000546001600160a01b03163314610e155760405162461bcd60e51b81526004016107bc90611ce1565b61078282846115dd565b6000546001600160a01b03163314610e495760405162461bcd60e51b81526004016107bc90611ce1565b6001600160a01b038116610eae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107bc565b610eb7816115f7565b50565b806001600160401b031660008111610f0b5760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b60448201526064016107bc565b600b546001600160801b031681610f20610be1565b610f2a9190611d16565b1115610f6f5760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b60448201526064016107bc565b600b54600160801b900460ff16610fbd5760405162461bcd60e51b815260206004820152601260248201527153616c65206973206e6f742041637469766560701b60448201526064016107bc565b816001600160401b0316600a54610fd49190611d42565b34146110185760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016107bc565b61102b33836001600160401b03166115dd565b5050565b600081600111158015611043575060015482105b801561061d575050600090815260056020526040902054600160e01b900460ff161590565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006110cf826112b2565b9050836001600160a01b031681600001516001600160a01b0316146111065760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061112457506111248533610550565b8061113f575033611134846106b5565b6001600160a01b0316145b90508061115f57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661118657604051633a954ecd60e21b815260040160405180910390fd5b61119260008487611068565b6001600160a01b038581166000908152600660209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600590945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661126657600154821461126657805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b604080516060810182526000808252602082018190529181019190915281806001111580156112e2575060015481105b156113c057600081815260056020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906113be5780516001600160a01b031615611355579392505050565b5060001901600081815260056020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156113b9579392505050565b611355565b505b604051636f96cda160e11b815260040160405180910390fd5b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061140e903390899088908890600401611c4d565b602060405180830381600087803b15801561142857600080fd5b505af1925050508015611458575060408051601f3d908101601f1916820190925261145591810190611ac6565b60015b6114b3573d808015611486576040519150601f19603f3d011682016040523d82523d6000602084013e61148b565b606091505b5080516114ab576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60606009805461063290611da4565b6060816115045750506040805180820190915260018152600360fc1b602082015290565b8160005b811561152e578061151881611ddf565b91506115279050600a83611d2e565b9150611508565b6000816001600160401b0381111561154857611548611e50565b6040519080825280601f01601f191660200182016040528015611572576020820181803683370190505b5090505b84156114c957611587600183611d61565b9150611594600a86611dfa565b61159f906030611d16565b60f81b8183815181106115b4576115b4611e3a565b60200101906001600160f81b031916908160001a9053506115d6600a86611d2e565b9450611576565b61102b828260405180602001604052806000815250611647565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610782838383600180546001600160a01b03851661167757604051622e076360e81b815260040160405180910390fd5b836116955760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260066020908152604080832080546001600160801b031981166001600160401b038083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600590925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561173857506001600160a01b0387163b15155b156117c1575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461178960008884806001019550886113d9565b6117a6576040516368d2bf6b60e11b815260040160405180910390fd5b8082141561173e5782600154146117bc57600080fd5b611807565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808214156117c2575b506001556112ab565b82805461181c90611da4565b90600052602060002090601f01602090048101928261183e5760008555611884565b82601f106118575782800160ff19823516178555611884565b82800160010185558215611884579182015b82811115611884578235825591602001919060010190611869565b50611890929150611894565b5090565b5b808211156118905760008155600101611895565b80356001600160a01b03811681146118c057600080fd5b919050565b803580151581146118c057600080fd5b6000602082840312156118e757600080fd5b610d0a826118a9565b6000806040838503121561190357600080fd5b61190c836118a9565b915061191a602084016118a9565b90509250929050565b60008060006060848603121561193857600080fd5b611941846118a9565b925061194f602085016118a9565b9150604084013590509250925092565b6000806000806080858703121561197557600080fd5b61197e856118a9565b935061198c602086016118a9565b92506040850135915060608501356001600160401b03808211156119af57600080fd5b818701915087601f8301126119c357600080fd5b8135818111156119d5576119d5611e50565b604051601f8201601f19908116603f011681019083821181831017156119fd576119fd611e50565b816040528281528a6020848701011115611a1657600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611a4d57600080fd5b611a56836118a9565b915061191a602084016118c5565b60008060408385031215611a7757600080fd5b611a80836118a9565b946020939093013593505050565b600060208284031215611aa057600080fd5b610d0a826118c5565b600060208284031215611abb57600080fd5b8135610d0a81611e66565b600060208284031215611ad857600080fd5b8151610d0a81611e66565b60008060208385031215611af657600080fd5b82356001600160401b0380821115611b0d57600080fd5b818501915085601f830112611b2157600080fd5b813581811115611b3057600080fd5b866020828501011115611b4257600080fd5b60209290920196919550909350505050565b600060208284031215611b6657600080fd5b81356001600160801b0381168114610d0a57600080fd5b600060208284031215611b8f57600080fd5b5035919050565b60008060408385031215611ba957600080fd5b8235915061191a602084016118a9565b600060208284031215611bcb57600080fd5b81356001600160401b0381168114610d0a57600080fd5b60008151808452611bfa816020860160208601611d78565b601f01601f19169290920160200192915050565b60008351611c20818460208801611d78565b835190830190611c34818360208801611d78565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611c8090830184611be2565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015611cc257835183529284019291840191600101611ca6565b50909695505050505050565b602081526000610d0a6020830184611be2565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611d2957611d29611e0e565b500190565b600082611d3d57611d3d611e24565b500490565b6000816000190483118215151615611d5c57611d5c611e0e565b500290565b600082821015611d7357611d73611e0e565b500390565b60005b83811015611d93578181015183820152602001611d7b565b83811115610c405750506000910152565b600181811c90821680611db857607f821691505b60208210811415611dd957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611df357611df3611e0e565b5060010190565b600082611e0957611e09611e24565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610eb757600080fdfea2646970667358221220aafc7b2dc0e335daa9295448ce5df05acf5fbc063748cb42c0fc70f747a4913a64736f6c63430008070033
Deployed Bytecode Sourcemap
45603:4041:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24709:315;;;;;;;;;;-1:-1:-1;24709:315:0;;;;;:::i;:::-;;:::i;:::-;;;7749:14:1;;7742:22;7724:41;;7712:2;7697:18;24709:315:0;;;;;;;;27992:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29589:212::-;;;;;;;;;;-1:-1:-1;29589:212:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6410:32:1;;;6392:51;;6380:2;6365:18;29589:212:0;6246:203:1;29124:389:0;;;;;;;;;;-1:-1:-1;29124:389:0;;;;;:::i;:::-;;:::i;45735:32::-;;;;;;;;;;;;;;;;;;;10946:25:1;;;10934:2;10919:18;45735:32:0;10800:177:1;23914:315:0;;;;;;;;;;-1:-1:-1;24176:12:0;;23759:1;24160:13;:28;-1:-1:-1;;24160:46:0;23914:315;;30506:182;;;;;;;;;;-1:-1:-1;30506:182:0;;;;;:::i;:::-;;:::i;49150:396::-;;;;;;;;;;;;;:::i;30769:197::-;;;;;;;;;;-1:-1:-1;30769:197:0;;;;;:::i;:::-;;:::i;46772:802::-;;;;;;;;;;-1:-1:-1;46772:802:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;48843:80::-;;;;;;;;;;-1:-1:-1;48843:80:0;;;;;:::i;:::-;;:::i;48463:104::-;;;;;;;;;;-1:-1:-1;48463:104:0;;;;;:::i;:::-;;:::i;48736:99::-;;;;;;;;;;-1:-1:-1;48736:99:0;;;;;:::i;:::-;;:::i;27786:129::-;;;;;;;;;;-1:-1:-1;27786:129:0;;;;;:::i;:::-;;:::i;45817:30::-;;;;;;;;;;-1:-1:-1;45817:30:0;;;;-1:-1:-1;;;45817:30:0;;;;;;25098:212;;;;;;;;;;-1:-1:-1;25098:212:0;;;;;:::i;:::-;;:::i;48933:101::-;;;;;;;;;;-1:-1:-1;48933:101:0;;;;;:::i;:::-;;:::i;49042:100::-;;;;;;;;;;-1:-1:-1;49042:100:0;;;;;:::i;:::-;;:::i;44523:87::-;;;;;;;;;;-1:-1:-1;44569:7:0;44596:6;-1:-1:-1;;;;;44596:6:0;44523:87;;28175:108;;;;;;;;;;;;;:::i;29883:297::-;;;;;;;;;;-1:-1:-1;29883:297:0;;;;;:::i;:::-;;:::i;48362:93::-;;;;;;;;;;;;;:::i;31047:389::-;;;;;;;;;;-1:-1:-1;31047:389:0;;;;;:::i;:::-;;:::i;47630:484::-;;;;;;;;;;-1:-1:-1;47630:484:0;;;;;:::i;:::-;;:::i;45776:32::-;;;;;;;;;;-1:-1:-1;45776:32:0;;;;-1:-1:-1;;;;;45776:32:0;;;;;;-1:-1:-1;;;;;10741:47:1;;;10723:66;;10711:2;10696:18;45776:32:0;10577:218:1;48183:115:0;;;;;;;;;;-1:-1:-1;48183:115:0;;;;;:::i;:::-;;:::i;30261:168::-;;;;;;;;;;-1:-1:-1;30261:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;30384:25:0;;;30358:4;30384:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30261:168;46540:161;;;;;;;;;;-1:-1:-1;46540:161:0;;;;;:::i;:::-;;:::i;44978:201::-;;;;;;;;;;-1:-1:-1;44978:201:0;;;;;:::i;:::-;;:::i;46203:256::-;;;;;;:::i;:::-;;:::i;24709:315::-;24811:4;-1:-1:-1;;;;;;24852:40:0;;-1:-1:-1;;;24852:40:0;;:107;;-1:-1:-1;;;;;;;24911:48:0;;-1:-1:-1;;;24911:48:0;24852:107;:162;;;-1:-1:-1;;;;;;;;;;13584:40:0;;;24978:36;24830:184;24709:315;-1:-1:-1;;24709:315:0:o;27992:104::-;28046:13;28081:5;28074:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27992:104;:::o;29589:212::-;29657:7;29684:16;29692:7;29684;:16::i;:::-;29679:64;;29709:34;;-1:-1:-1;;;29709:34:0;;;;;;;;;;;29679:64;-1:-1:-1;29767:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29767:24:0;;29589:212::o;29124:389::-;29199:13;29215:24;29231:7;29215:15;:24::i;:::-;29199:40;;29262:5;-1:-1:-1;;;;;29256:11:0;:2;-1:-1:-1;;;;;29256:11:0;;29252:48;;;29276:24;;-1:-1:-1;;;29276:24:0;;;;;;;;;;;29252:48;20073:10;-1:-1:-1;;;;;29321:21:0;;;;;;:63;;-1:-1:-1;29347:37:0;29364:5;20073:10;30261:168;:::i;29347:37::-;29346:38;29321:63;29317:142;;;29410:35;;-1:-1:-1;;;29410:35:0;;;;;;;;;;;29317:142;29475:28;29484:2;29488:7;29497:5;29475:8;:28::i;:::-;29186:327;29124:389;;:::o;30506:182::-;30650:28;30660:4;30666:2;30670:7;30650:9;:28::i;49150:396::-;44569:7;44596:6;-1:-1:-1;;;;;44596:6:0;20073:10;44743:23;44735:68;;;;-1:-1:-1;;;44735:68:0;;;;;;;:::i;:::-;;;;;;;;;49223:21:::1;49198:22;49279:42;49357:3;49335:19;49223:21:::0;49352:2:::1;49335:19;:::i;:::-;:25;;;;:::i;:::-;49271:94;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49257:108;;;49384:2;49376:11;;;::::0;::::1;;49409:7;49430:42;49508:3;49486:19;:14:::0;49503:2:::1;49486:19;:::i;:::-;:25;;;;:::i;:::-;49422:94;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49408:108;;;49535:2;49527:11;;;::::0;::::1;30769:197:::0;30917:39;30934:4;30940:2;30944:7;30917:39;;;;;;;;;;;;:16;:39::i;46772:802::-;46861:16;46895:23;46921:17;46931:6;46921:9;:17::i;:::-;46895:43;;46949:30;46996:15;-1:-1:-1;;;;;46982:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46982:30:0;-1:-1:-1;46949:63:0;-1:-1:-1;47048:1:0;47023:22;47100:434;47125:15;47107;:33;:64;;;;-1:-1:-1;47162:9:0;;-1:-1:-1;;;;;47162:9:0;47144:27;;;47107:64;47100:434;;;47191:22;47198:14;47191:6;:22::i;:::-;:30;;47217:4;47191:30;47188:304;;;47242:25;47270:23;47278:14;47270:7;:23::i;:::-;47242:51;;47339:6;-1:-1:-1;;;;;47318:27:0;:17;-1:-1:-1;;;;;47318:27:0;;47314:163;;;47403:14;47370:13;47384:15;47370:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;47440:17;;;;:::i;:::-;;;;47314:163;47223:269;47188:304;47506:16;;;;:::i;:::-;;;;47100:434;;;-1:-1:-1;47553:13:0;;46772:802;-1:-1:-1;;;;46772:802:0:o;48843:80::-;44569:7;44596:6;-1:-1:-1;;;;;44596:6:0;20073:10;44743:23;44735:68;;;;-1:-1:-1;;;44735:68:0;;;;;;;:::i;:::-;48903:4:::1;:12:::0;48843:80::o;48463:104::-;48518:4;48542:17;48550:8;48542:7;:17::i;48736:99::-;44569:7;44596:6;-1:-1:-1;;;;;44596:6:0;20073:10;44743:23;44735:68;;;;-1:-1:-1;;;44735:68:0;;;;;;;:::i;:::-;48808:19:::1;:12;48823:4:::0;;48808:19:::1;:::i;27786:129::-:0;27850:7;27879:21;27892:7;27879:12;:21::i;:::-;:26;;27786:129;-1:-1:-1;;27786:129:0:o;25098:212::-;25162:7;-1:-1:-1;;;;;25188:19:0;;25184:60;;25216:28;;-1:-1:-1;;;25216:28:0;;;;;;;;;;;25184:60;-1:-1:-1;;;;;;25272:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;25272:27:0;;25098:212::o;48933:101::-;44569:7;44596:6;-1:-1:-1;;;;;44596:6:0;20073:10;44743:23;44735:68;;;;-1:-1:-1;;;44735:68:0;;;;;;;:::i;:::-;49002:10:::1;:24:::0;;;::::1;;-1:-1:-1::0;;;49002:24:0::1;-1:-1:-1::0;;;;49002:24:0;;::::1;::::0;;;::::1;::::0;;48933:101::o;49042:100::-;44569:7;44596:6;-1:-1:-1;;;;;44596:6:0;20073:10;44743:23;44735:68;;;;-1:-1:-1;;;44735:68:0;;;;;;;:::i;:::-;49112:9:::1;:22:::0;;-1:-1:-1;;;;;;49112:22:0::1;-1:-1:-1::0;;;;;49112:22:0;;;::::1;::::0;;;::::1;::::0;;49042:100::o;28175:108::-;28231:13;28266:7;28259:14;;;;;:::i;29883:297::-;-1:-1:-1;;;;;29984:24:0;;20073:10;29984:24;29980:54;;;30017:17;;-1:-1:-1;;;30017:17:0;;;;;;;;;;;29980:54;20073:10;30051:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;30051:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;30051:53:0;;;;;;;;;;30122:48;;7724:41:1;;;30051:42:0;;20073:10;30122:48;;7697:18:1;30122:48:0;;;;;;;29883:297;;:::o;48362:93::-;48406:7;48433:14;23759:1;24573:13;-1:-1:-1;;24573:31:0;;24332:295;48433:14;48426:21;;48362:93;:::o;31047:389::-;31226:28;31236:4;31242:2;31246:7;31226:9;:28::i;:::-;-1:-1:-1;;;;;31271:13:0;;3687:19;:23;;31271:76;;;;;31291:56;31322:4;31328:2;31332:7;31341:5;31291:30;:56::i;:::-;31290:57;31271:76;31267:160;;;31373:40;;-1:-1:-1;;;31373:40:0;;;;;;;;;;;31267:160;31047:389;;;;:::o;47630:484::-;47751:13;47804:17;47812:8;47804:7;:17::i;:::-;47786:106;;;;-1:-1:-1;;;47786:106:0;;9666:2:1;47786:106:0;;;9648:21:1;9705:2;9685:18;;;9678:30;9744:34;9724:18;;;9717:62;-1:-1:-1;;;9795:18:1;;;9788:45;9850:19;;47786:106:0;9464:411:1;47786:106:0;47905:28;47936:10;:8;:10::i;:::-;47905:41;;47997:1;47972:14;47966:28;:32;:140;;;;;;;;;;;;;;;;;48040:14;48056:19;:8;:17;:19::i;:::-;48023:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47966:140;47959:147;47630:484;-1:-1:-1;;;47630:484:0:o;48183:115::-;-1:-1:-1;;;;;25500:19:0;;48242:7;25500:19;;;:12;:19;;;;;:32;-1:-1:-1;;;25500:32:0;;-1:-1:-1;;;;;25500:32:0;48269:21;25402:141;46540:161;46626:11;46000:1;45986:11;:15;45978:49;;;;-1:-1:-1;;;45978:49:0;;8609:2:1;45978:49:0;;;8591:21:1;8648:2;8628:18;;;8621:30;-1:-1:-1;;;8667:18:1;;;8660:50;8727:18;;45978:49:0;8407:344:1;45978:49:0;46077:9;;-1:-1:-1;;;;;46077:9:0;46062:11;46046:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;46038:73;;;;-1:-1:-1;;;46038:73:0;;10082:2:1;46038:73:0;;;10064:21:1;10121:2;10101:18;;;10094:30;-1:-1:-1;;;10140:18:1;;;10133:50;10200:18;;46038:73:0;9880:344:1;46038:73:0;44569:7;44596:6;-1:-1:-1;;;;;44596:6:0;20073:10;44743:23:::1;44735:68;;;;-1:-1:-1::0;;;44735:68:0::1;;;;;;;:::i;:::-;46660:33:::2;46670:9;46681:11;46660:9;:33::i;44978:201::-:0;44569:7;44596:6;-1:-1:-1;;;;;44596:6:0;20073:10;44743:23;44735:68;;;;-1:-1:-1;;;44735:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45067:22:0;::::1;45059:73;;;::::0;-1:-1:-1;;;45059:73:0;;8202:2:1;45059:73:0::1;::::0;::::1;8184:21:1::0;8241:2;8221:18;;;8214:30;8280:34;8260:18;;;8253:62;-1:-1:-1;;;8331:18:1;;;8324:36;8377:19;;45059:73:0::1;8000:402:1::0;45059:73:0::1;45143:28;45162:8;45143:18;:28::i;:::-;44978:201:::0;:::o;46203:256::-;46267:11;-1:-1:-1;;;;;45922:209:0;46000:1;45986:11;:15;45978:49;;;;-1:-1:-1;;;45978:49:0;;8609:2:1;45978:49:0;;;8591:21:1;8648:2;8628:18;;;8621:30;-1:-1:-1;;;8667:18:1;;;8660:50;8727:18;;45978:49:0;8407:344:1;45978:49:0;46077:9;;-1:-1:-1;;;;;46077:9:0;46062:11;46046:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;46038:73;;;;-1:-1:-1;;;46038:73:0;;10082:2:1;46038:73:0;;;10064:21:1;10121:2;10101:18;;;10094:30;-1:-1:-1;;;10140:18:1;;;10133:50;10200:18;;46038:73:0;9880:344:1;46038:73:0;46299:10:::1;::::0;-1:-1:-1;;;46299:10:0;::::1;;;46291:41;;;::::0;-1:-1:-1;;;46291:41:0;;8958:2:1;46291:41:0::1;::::0;::::1;8940:21:1::0;8997:2;8977:18;;;8970:30;-1:-1:-1;;;9016:18:1;;;9009:48;9074:18;;46291:41:0::1;8756:342:1::0;46291:41:0::1;46371:11;-1:-1:-1::0;;;;;46364:18:0::1;:4;;:18;;;;:::i;:::-;46351:9;:31;46343:63;;;::::0;-1:-1:-1;;;46343:63:0;;10431:2:1;46343:63:0::1;::::0;::::1;10413:21:1::0;10470:2;10450:18;;;10443:30;-1:-1:-1;;;10489:18:1;;;10482:49;10548:18;;46343:63:0::1;10229:343:1::0;46343:63:0::1;46417:34;46427:10;46439:11;-1:-1:-1::0;;;;;46417:34:0::1;:9;:34::i;:::-;46203:256:::0;;:::o;31709:193::-;31766:4;31811:7;23759:1;31792:26;;:53;;;;;31832:13;;31822:7;:23;31792:53;:100;;;;-1:-1:-1;;31865:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;31865:27:0;;;;31864:28;;31709:193::o;40315:210::-;40440:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;40440:29:0;-1:-1:-1;;;;;40440:29:0;;;;;;;;;40487:28;;40440:24;;40487:28;;;;;;;40315:210;;;:::o;35004:2226::-;35129:35;35167:21;35180:7;35167:12;:21::i;:::-;35129:59;;35231:4;-1:-1:-1;;;;;35209:26:0;:13;:18;;;-1:-1:-1;;;;;35209:26:0;;35205:67;;35244:28;;-1:-1:-1;;;35244:28:0;;;;;;;;;;;35205:67;35289:22;20073:10;-1:-1:-1;;;;;35315:20:0;;;;:75;;-1:-1:-1;35354:36:0;35371:4;20073:10;30261:168;:::i;35354:36::-;35315:130;;;-1:-1:-1;20073:10:0;35409:20;35421:7;35409:11;:20::i;:::-;-1:-1:-1;;;;;35409:36:0;;35315:130;35289:157;;35468:17;35463:66;;35494:35;;-1:-1:-1;;;35494:35:0;;;;;;;;;;;35463:66;-1:-1:-1;;;;;35546:16:0;;35542:52;;35571:23;;-1:-1:-1;;;35571:23:0;;;;;;;;;;;35542:52;35725:35;35742:1;35746:7;35755:4;35725:8;:35::i;:::-;-1:-1:-1;;;;;36068:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;36068:31:0;;;-1:-1:-1;;;;;36068:31:0;;;-1:-1:-1;;36068:31:0;;;;;;;36116:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;36116:29:0;;;;;;;;;;;36200:20;;;:11;:20;;;;;;36237:18;;-1:-1:-1;;;;;;36272:49:0;;;;-1:-1:-1;;;36305:15:0;36272:49;;;;;;;;;;36603:11;;36665:24;;;;;36710:13;;36200:20;;36665:24;;36710:13;36706:398;;36926:13;;36911:11;:28;36907:180;;36966:20;;37037:28;;;;-1:-1:-1;;;;;37011:54:0;-1:-1:-1;;;37011:54:0;-1:-1:-1;;;;;;37011:54:0;;;-1:-1:-1;;;;;36966:20:0;;37011:54;;;;36907:180;36041:1076;;;37157:7;37153:2;-1:-1:-1;;;;;37138:27:0;37147:4;-1:-1:-1;;;;;37138:27:0;;;;;;;;;;;37178:42;35116:2114;;35004:2226;;;:::o;26555:1159::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;26668:7:0;;23759:1;26723:23;;:47;;;;;26757:13;;26750:4;:20;26723:47;26719:922;;;26793:31;26827:17;;;:11;:17;;;;;;;;;26793:51;;;;;;;;;-1:-1:-1;;;;;26793:51:0;;;;-1:-1:-1;;;26793:51:0;;-1:-1:-1;;;;;26793:51:0;;;;;;;;-1:-1:-1;;;26793:51:0;;;;;;;;;;;;;;26865:759;;26917:14;;-1:-1:-1;;;;;26917:28:0;;26913:105;;26983:9;26555:1159;-1:-1:-1;;;26555:1159:0:o;26913:105::-;-1:-1:-1;;;27372:6:0;27419:17;;;;:11;:17;;;;;;;;;27407:29;;;;;;;;;-1:-1:-1;;;;;27407:29:0;;;;;-1:-1:-1;;;27407:29:0;;-1:-1:-1;;;;;27407:29:0;;;;;;;;-1:-1:-1;;;27407:29:0;;;;;;;;;;;;;27469:28;27465:113;;27539:9;26555:1159;-1:-1:-1;;;26555:1159:0:o;27465:113::-;27330:273;;;26772:869;26719:922;27673:31;;-1:-1:-1;;;27673:31:0;;;;;;;;;;;41039:701;41235:72;;-1:-1:-1;;;41235:72:0;;41212:4;;-1:-1:-1;;;;;41235:36:0;;;;;:72;;20073:10;;41286:4;;41292:7;;41301:5;;41235:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41235:72:0;;;;;;;;-1:-1:-1;;41235:72:0;;;;;;;;;;;;:::i;:::-;;;41231:500;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41475:13:0;;41471:247;;41523:40;;-1:-1:-1;;;41523:40:0;;;;;;;;;;;41471:247;41672:6;41666:13;41657:6;41653:2;41649:15;41642:38;41231:500;-1:-1:-1;;;;;;41356:55:0;-1:-1:-1;;;41356:55:0;;-1:-1:-1;41231:500:0;41039:701;;;;;;:::o;48615:113::-;48675:13;48708:12;48701:19;;;;;:::i;400:723::-;456:13;677:10;673:53;;-1:-1:-1;;704:10:0;;;;;;;;;;;;-1:-1:-1;;;704:10:0;;;;;400:723::o;673:53::-;751:5;736:12;792:78;799:9;;792:78;;825:8;;;;:::i;:::-;;-1:-1:-1;848:10:0;;-1:-1:-1;856:2:0;848:10;;:::i;:::-;;;792:78;;;880:19;912:6;-1:-1:-1;;;;;902:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;902:17:0;;880:39;;930:154;937:10;;930:154;;964:11;974:1;964:11;;:::i;:::-;;-1:-1:-1;1033:10:0;1041:2;1033:5;:10;:::i;:::-;1020:24;;:2;:24;:::i;:::-;1007:39;;990:6;997;990:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;990:56:0;;;;;;;;-1:-1:-1;1061:11:0;1070:2;1061:11;;:::i;:::-;;;930:154;;31914:108;31985:27;31995:2;31999:8;31985:27;;;;;;;;;;;;:9;:27::i;45339:191::-;45413:16;45432:6;;-1:-1:-1;;;;;45449:17:0;;;-1:-1:-1;;;;;;45449:17:0;;;;;;45482:40;;45432:6;;;;;;;45482:40;;45413:16;45482:40;45402:128;45339:191;:::o;32409:175::-;32542:32;32548:2;32552:8;32562:5;32569:4;33041:13;;-1:-1:-1;;;;;33071:16:0;;33067:48;;33096:19;;-1:-1:-1;;;33096:19:0;;;;;;;;;;;33067:48;33132:13;33128:44;;33154:18;;-1:-1:-1;;;33154:18:0;;;;;;;;;;;33128:44;-1:-1:-1;;;;;33539:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;;;;;33600:49:0;;-1:-1:-1;;;;;33539:44:0;;;;;;;33600:49;;;-1:-1:-1;;;;;33539:44:0;;;;;;33600:49;;;;;;;;;;;;;;;;33670:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;33722:66:0;;;;-1:-1:-1;;;33772:15:0;33722:66;;;;;;;;;;33670:25;33875:23;;;33923:4;:23;;;;-1:-1:-1;;;;;;33931:13:0;;3687:19;:23;;33931:15;33919:667;;;33969:324;34002:38;;34027:12;;-1:-1:-1;;;;;34002:38:0;;;34019:1;;34002:38;;34019:1;;34002:38;34070:69;34109:1;34113:2;34117:14;;;;;;34133:5;34070:30;:69::i;:::-;34065:178;;34177:40;;-1:-1:-1;;;34177:40:0;;;;;;;;;;;34065:178;34288:3;34272:12;:19;;33969:324;;34378:12;34361:13;;:29;34357:43;;34392:8;;;34357:43;33919:667;;;34445:124;34478:40;;34503:14;;;;;-1:-1:-1;;;;;34478:40:0;;;34495:1;;34478:40;;34495:1;;34478:40;34564:3;34548:12;:19;;34445:124;;33919:667;-1:-1:-1;34602:13:0;:28;34656:60;31047:389;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:160::-;257:20;;313:13;;306:21;296:32;;286:60;;342:1;339;332:12;357:186;416:6;469:2;457:9;448:7;444:23;440:32;437:52;;;485:1;482;475:12;437:52;508:29;527:9;508:29;:::i;548:260::-;616:6;624;677:2;665:9;656:7;652:23;648:32;645:52;;;693:1;690;683:12;645:52;716:29;735:9;716:29;:::i;:::-;706:39;;764:38;798:2;787:9;783:18;764:38;:::i;:::-;754:48;;548:260;;;;;:::o;813:328::-;890:6;898;906;959:2;947:9;938:7;934:23;930:32;927:52;;;975:1;972;965:12;927:52;998:29;1017:9;998:29;:::i;:::-;988:39;;1046:38;1080:2;1069:9;1065:18;1046:38;:::i;:::-;1036:48;;1131:2;1120:9;1116:18;1103:32;1093:42;;813:328;;;;;:::o;1146:1138::-;1241:6;1249;1257;1265;1318:3;1306:9;1297:7;1293:23;1289:33;1286:53;;;1335:1;1332;1325:12;1286:53;1358:29;1377:9;1358:29;:::i;:::-;1348:39;;1406:38;1440:2;1429:9;1425:18;1406:38;:::i;:::-;1396:48;;1491:2;1480:9;1476:18;1463:32;1453:42;;1546:2;1535:9;1531:18;1518:32;-1:-1:-1;;;;;1610:2:1;1602:6;1599:14;1596:34;;;1626:1;1623;1616:12;1596:34;1664:6;1653:9;1649:22;1639:32;;1709:7;1702:4;1698:2;1694:13;1690:27;1680:55;;1731:1;1728;1721:12;1680:55;1767:2;1754:16;1789:2;1785;1782:10;1779:36;;;1795:18;;:::i;:::-;1870:2;1864:9;1838:2;1924:13;;-1:-1:-1;;1920:22:1;;;1944:2;1916:31;1912:40;1900:53;;;1968:18;;;1988:22;;;1965:46;1962:72;;;2014:18;;:::i;:::-;2054:10;2050:2;2043:22;2089:2;2081:6;2074:18;2129:7;2124:2;2119;2115;2111:11;2107:20;2104:33;2101:53;;;2150:1;2147;2140:12;2101:53;2206:2;2201;2197;2193:11;2188:2;2180:6;2176:15;2163:46;2251:1;2246:2;2241;2233:6;2229:15;2225:24;2218:35;2272:6;2262:16;;;;;;;1146:1138;;;;;;;:::o;2289:254::-;2354:6;2362;2415:2;2403:9;2394:7;2390:23;2386:32;2383:52;;;2431:1;2428;2421:12;2383:52;2454:29;2473:9;2454:29;:::i;:::-;2444:39;;2502:35;2533:2;2522:9;2518:18;2502:35;:::i;2548:254::-;2616:6;2624;2677:2;2665:9;2656:7;2652:23;2648:32;2645:52;;;2693:1;2690;2683:12;2645:52;2716:29;2735:9;2716:29;:::i;:::-;2706:39;2792:2;2777:18;;;;2764:32;;-1:-1:-1;;;2548:254:1:o;2807:180::-;2863:6;2916:2;2904:9;2895:7;2891:23;2887:32;2884:52;;;2932:1;2929;2922:12;2884:52;2955:26;2971:9;2955:26;:::i;2992:245::-;3050:6;3103:2;3091:9;3082:7;3078:23;3074:32;3071:52;;;3119:1;3116;3109:12;3071:52;3158:9;3145:23;3177:30;3201:5;3177:30;:::i;3242:249::-;3311:6;3364:2;3352:9;3343:7;3339:23;3335:32;3332:52;;;3380:1;3377;3370:12;3332:52;3412:9;3406:16;3431:30;3455:5;3431:30;:::i;3496:592::-;3567:6;3575;3628:2;3616:9;3607:7;3603:23;3599:32;3596:52;;;3644:1;3641;3634:12;3596:52;3684:9;3671:23;-1:-1:-1;;;;;3754:2:1;3746:6;3743:14;3740:34;;;3770:1;3767;3760:12;3740:34;3808:6;3797:9;3793:22;3783:32;;3853:7;3846:4;3842:2;3838:13;3834:27;3824:55;;3875:1;3872;3865:12;3824:55;3915:2;3902:16;3941:2;3933:6;3930:14;3927:34;;;3957:1;3954;3947:12;3927:34;4002:7;3997:2;3988:6;3984:2;3980:15;3976:24;3973:37;3970:57;;;4023:1;4020;4013:12;3970:57;4054:2;4046:11;;;;;4076:6;;-1:-1:-1;3496:592:1;;-1:-1:-1;;;;3496:592:1:o;4093:301::-;4152:6;4205:2;4193:9;4184:7;4180:23;4176:32;4173:52;;;4221:1;4218;4211:12;4173:52;4260:9;4247:23;-1:-1:-1;;;;;4303:5:1;4299:46;4292:5;4289:57;4279:85;;4360:1;4357;4350:12;4399:180;4458:6;4511:2;4499:9;4490:7;4486:23;4482:32;4479:52;;;4527:1;4524;4517:12;4479:52;-1:-1:-1;4550:23:1;;4399:180;-1:-1:-1;4399:180:1:o;4584:254::-;4652:6;4660;4713:2;4701:9;4692:7;4688:23;4684:32;4681:52;;;4729:1;4726;4719:12;4681:52;4765:9;4752:23;4742:33;;4794:38;4828:2;4817:9;4813:18;4794:38;:::i;4843:284::-;4901:6;4954:2;4942:9;4933:7;4929:23;4925:32;4922:52;;;4970:1;4967;4960:12;4922:52;5009:9;4996:23;-1:-1:-1;;;;;5052:5:1;5048:30;5041:5;5038:41;5028:69;;5093:1;5090;5083:12;5132:257;5173:3;5211:5;5205:12;5238:6;5233:3;5226:19;5254:63;5310:6;5303:4;5298:3;5294:14;5287:4;5280:5;5276:16;5254:63;:::i;:::-;5371:2;5350:15;-1:-1:-1;;5346:29:1;5337:39;;;;5378:4;5333:50;;5132:257;-1:-1:-1;;5132:257:1:o;5394:637::-;5674:3;5712:6;5706:13;5728:53;5774:6;5769:3;5762:4;5754:6;5750:17;5728:53;:::i;:::-;5844:13;;5803:16;;;;5866:57;5844:13;5803:16;5900:4;5888:17;;5866:57;:::i;:::-;-1:-1:-1;;;5945:20:1;;5974:22;;;6023:1;6012:13;;5394:637;-1:-1:-1;;;;5394:637:1:o;6454:488::-;-1:-1:-1;;;;;6723:15:1;;;6705:34;;6775:15;;6770:2;6755:18;;6748:43;6822:2;6807:18;;6800:34;;;6870:3;6865:2;6850:18;;6843:31;;;6648:4;;6891:45;;6916:19;;6908:6;6891:45;:::i;:::-;6883:53;6454:488;-1:-1:-1;;;;;;6454:488:1:o;6947:632::-;7118:2;7170:21;;;7240:13;;7143:18;;;7262:22;;;7089:4;;7118:2;7341:15;;;;7315:2;7300:18;;;7089:4;7384:169;7398:6;7395:1;7392:13;7384:169;;;7459:13;;7447:26;;7528:15;;;;7493:12;;;;7420:1;7413:9;7384:169;;;-1:-1:-1;7570:3:1;;6947:632;-1:-1:-1;;;;;;6947:632:1:o;7776:219::-;7925:2;7914:9;7907:21;7888:4;7945:44;7985:2;7974:9;7970:18;7962:6;7945:44;:::i;9103:356::-;9305:2;9287:21;;;9324:18;;;9317:30;9383:34;9378:2;9363:18;;9356:62;9450:2;9435:18;;9103:356::o;10982:128::-;11022:3;11053:1;11049:6;11046:1;11043:13;11040:39;;;11059:18;;:::i;:::-;-1:-1:-1;11095:9:1;;10982:128::o;11115:120::-;11155:1;11181;11171:35;;11186:18;;:::i;:::-;-1:-1:-1;11220:9:1;;11115:120::o;11240:168::-;11280:7;11346:1;11342;11338:6;11334:14;11331:1;11328:21;11323:1;11316:9;11309:17;11305:45;11302:71;;;11353:18;;:::i;:::-;-1:-1:-1;11393:9:1;;11240:168::o;11413:125::-;11453:4;11481:1;11478;11475:8;11472:34;;;11486:18;;:::i;:::-;-1:-1:-1;11523:9:1;;11413:125::o;11543:258::-;11615:1;11625:113;11639:6;11636:1;11633:13;11625:113;;;11715:11;;;11709:18;11696:11;;;11689:39;11661:2;11654:10;11625:113;;;11756:6;11753:1;11750:13;11747:48;;;-1:-1:-1;;11791:1:1;11773:16;;11766:27;11543:258::o;11806:380::-;11885:1;11881:12;;;;11928;;;11949:61;;12003:4;11995:6;11991:17;11981:27;;11949:61;12056:2;12048:6;12045:14;12025:18;12022:38;12019:161;;;12102:10;12097:3;12093:20;12090:1;12083:31;12137:4;12134:1;12127:15;12165:4;12162:1;12155:15;12019:161;;11806:380;;;:::o;12191:135::-;12230:3;-1:-1:-1;;12251:17:1;;12248:43;;;12271:18;;:::i;:::-;-1:-1:-1;12318:1:1;12307:13;;12191:135::o;12331:112::-;12363:1;12389;12379:35;;12394:18;;:::i;:::-;-1:-1:-1;12428:9:1;;12331:112::o;12448:127::-;12509:10;12504:3;12500:20;12497:1;12490:31;12540:4;12537:1;12530:15;12564:4;12561:1;12554:15;12580:127;12641:10;12636:3;12632:20;12629:1;12622:31;12672:4;12669:1;12662:15;12696:4;12693:1;12686:15;12712:127;12773:10;12768:3;12764:20;12761:1;12754:31;12804:4;12801:1;12794:15;12828:4;12825:1;12818:15;12844:127;12905:10;12900:3;12896:20;12893:1;12886:31;12936:4;12933:1;12926:15;12960:4;12957:1;12950:15;12976:131;-1:-1:-1;;;;;;13050:32:1;;13040:43;;13030:71;;13097:1;13094;13087:12
Swarm Source
ipfs://aafc7b2dc0e335daa9295448ce5df05acf5fbc063748cb42c0fc70f747a4913a
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.