ERC-721
Overview
Max Total Supply
315 QQ
Holders
75
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 QQLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
QittyQats
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-02 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.5; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @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); } } // ERC721A Contracts v4.2.3 // Creator: Chiru Labs /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @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, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` 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 payable; /** * @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 payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @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); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // ERC721A Contracts v4.2.3 // Creator: Chiru Labs /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _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 {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary 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 virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ 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, _toString(tokenId))) : ''; } /** * @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, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @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) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @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) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @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. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // 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 { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @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 memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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 {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @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 for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, 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. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev 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 { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // 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 { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * 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 _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } contract QittyQats is ERC721A, Ownable, ReentrancyGuard { using Strings for uint256; uint256 public constant MAX_Qats = 5555; uint256 public price = .27 ether; // 0.06 Eth uint256 private QatsOnFloor = 0; uint256 public reservedTokens = 0; string private _baseTokenURI; bool public hasSaleStarted = false; bool public presaleMinted; bool public devMinted; constructor(string memory baseURI) ERC721A("QittyQats","QQ") { } //A constructor is an optional funtion and is used to initialize state variables of a contract. In this case, it sets the base URI from the moment the contract is launched. // The Base URI is the folder that holds the JSON files on the node. modifier callerIsUser() { require(tx.origin == msg.sender, "Qitty Qats Can't be called by other contracts"); _; } function mint(uint256 numberOfTokens) public payable callerIsUser { require(hasSaleStarted == true, "Sale hasn't started"); require(numberOfTokens <= 20, "Can only mint 20 tokens at a time"); require((totalSupply() + numberOfTokens) <= MAX_Qats, "Exceeds Max Qats Available"); require((price * numberOfTokens) <= msg.value, "Ether value sent is not correct"); _safeMint(msg.sender, numberOfTokens); QatsOnFloor += numberOfTokens; } //This function is for the owner to mint tokens to be used for promotions function promoMint() external onlyOwner{ _safeMint(msg.sender, 1); QatsOnFloor += 1; } //This function is to get 4 of the unique Qats to be used for advertisement function devMint() external onlyOwner{ require(!devMinted, "Dev already Minted"); devMinted = true; _safeMint(0xA348094e5C1a1176aF98145BE4869744ef0F44CE, 4); QatsOnFloor += 4; } //This will allow the people who already bought the NFT's to get theirs. function presaleMint() external onlyOwner{ require(!presaleMinted, "PreSale already Minted"); presaleMinted = true; _safeMint(0x4c88c30CDF53929Aee3fFce4e8f1cA2D113Fa596, 1); _safeMint(0xb2E56B8fF6A40C229f374cf6394775593D9d69Ff, 1); _safeMint(0x6977ED24823f7060c8bD7200c3685DcA0C714760, 1); _safeMint(0xf73542B7556eF9C0Cd3ff21C292501a0633e9031, 1); _safeMint(0x8778b3120Ba60fc831844c3Dd2c5948c3fc6bC86, 1); _safeMint(0x914EEB5796c194B2684c4415E804BcD603d00136, 1); _safeMint(0x240f22968869A4c22C9D75ce088FD6A7bb5F3A75, 1); _safeMint(0xb333Cf49216410B5684C9083E44C68069bbe57B7, 1); _safeMint(0x38521806E5D7678bBd13f3A20A09E0bac45C5a1B, 1); _safeMint(0xcCd80ff94e89309638470d15ff45914Ad0d16F4D, 1); _safeMint(0x39180fE40BACA6052FE63fdFFb4e59a34dBbf298, 1); _safeMint(0xCcc9553A9eDd6F3bD6d7d96489f3bca9f96C8309, 1); _safeMint(0x35CF44aC9bb2C06b2940f67DC72043A71e886d76, 1); _safeMint(0x986Fa39765cB22C7d59d4546398EB18CeCba22DF, 1); _safeMint(0x957Fad6b41028bB9cC80649d805716641759512F, 1); _safeMint(0x175f42D0B7743F7368EC016c4CE9E6eB5aEf785c, 1); _safeMint(0xd0417d73916f02beBAfa615f6c3766f6A13A5b4b, 1); _safeMint(0xe3d3DFDa5D754Ac2609a98274D246C765634c049, 1); _safeMint(0xc7C02c1C69aC677f0D889dCcaD5B8b15d33d0046, 1); _safeMint(0xFD366E282A3B2F92075227656F4575fa03C4E674, 1); _safeMint(0xf5D4E29eeb695648cf06078eF777f3459Eaa7dDB, 1); _safeMint(0x111527fFEF918088dAA72b4B834C8c33A175aEE0, 1); _safeMint(0xB4b0641BBCD89127B7467C362467e3960aD58aEd, 1); _safeMint(0x4ab12Ba93bd2f8cfd3353234F808cE4dddAf922D, 1); _safeMint(0x8C9E32091Bb5cE292e7Aa9997580d99C564A0257, 1); _safeMint(0xAF6DcD0514a0bdEF90283B4c12E85bB9ecF12996, 1); _safeMint(0x28fd58b7C826AE92456847eF7365417e75aD09F2, 1); _safeMint(0x58d70BFa5B7dEf2B44c2B6c6e1F50bed4950B4D6, 1); _safeMint(0x397795f9f76c745DBccF823df0B281E98068EB8E, 1); _safeMint(0x17add1DAB9d8FBD8562fe19396e8Df5Fe4B5D800, 1); _safeMint(0x4eFeF990097F5be3A48eD3D43744AA2BFF01C8D7, 1); _safeMint(0x4C53F61f682E415D93E95307871703B10dd76B06, 1); _safeMint(0x277Ac49900Be1ab23A028b0dbFCe42a804781E53, 1); _safeMint(0xD1A6ebe0e7B38964bCb08B8d404B594076CEe9B1, 1); _safeMint(0xCA9161189C7570A8d26388D01069C19D22852C87, 1); _safeMint(0x6e6BDc931708CF273698c52C699C06196a7c8566, 1); _safeMint(0x39180fE40BACA6052FE63fdFFb4e59a34dBbf298, 1); _safeMint(0x5151E387486195c31399bb589c7666950e671338, 1); _safeMint(0x7c27188B645289e6CE14c8c2574CDCb48c08b416, 1); _safeMint(0xBe84903E4170602c5833142E1C55c224024f397C, 1); _safeMint(0x88AD8713B67FC67e1BaA4bA76C236732E7E6b360, 1); _safeMint(0x0266a7cbF0299A7A50A9d7A66Cc753e8159Df41f, 1); _safeMint(0xcCd80ff94e89309638470d15ff45914Ad0d16F4D, 2); _safeMint(0x65d5caE985f36a5fC441e8e4Bb1D5d31B21CCBF6, 2); _safeMint(0xD1101f4A8be1302dcF84FC9b62f2930e299f5Da8, 2); _safeMint(0x2E118A67C83899d028f51d6DE9dd746B540A5272, 2); _safeMint(0xED8528DDDbe0aC6FE7863A01eb78B6e2Fa930Fc0, 2); _safeMint(0x5Fe35d8d3aEe72C8176CE02CDF39799D8e36fEB0, 2); _safeMint(0xce0E98aE24eaC1059c4Dc5136c5E35Cb9021b6C1, 2); _safeMint(0x806eee2f932E947ef90e456458d8C6AeE8d4bc4d, 2); _safeMint(0x8feAe3b460F9cD2D0759fe111Ae198FC42822d8F, 2); _safeMint(0xa24B3b55dF8D6F6E3D0a3eabbDf6Fc5F70db37e9, 2); _safeMint(0x4E27172D582E8c582E05d2d26A8FAca915D86ef6, 2); _safeMint(0x0311045C7A75Fd96B17f6DBE9b716A1db3A2B214, 2); _safeMint(0x1bf83d74Eb2F6Ff440754a970aFafDDc63Bfc187, 2); _safeMint(0x0266a7cbF0299A7A50A9d7A66Cc753e8159Df41f, 2); _safeMint(0x204937a0Df9E8018a5CEB8FdfB0A1F0089f0Be2b, 2); _safeMint(0xD0c06e7A3F69c8C2F635e80083E186066D83dB1a, 2); _safeMint(0xa49F695F5A330c3C81b2703df07880f517959d4f, 2); _safeMint(0xCcc9553A9eDd6F3bD6d7d96489f3bca9f96C8309, 2); _safeMint(0x30F32a394d193183AC85F89Af51fb40Ae890f9fE, 3); _safeMint(0xD1E2CdfaA9b87e05F9B668a0e0238948dDE6aa39, 3); _safeMint(0x13ED55E9DD2068121A347D8aA99A8A2cd2504067, 3); _safeMint(0x5Ae0B622D18491E4D121b7491DFB91013e9208FC, 3); _safeMint(0xA383cccE4fbeEB07fd11fda4204300606a1c2373, 3); _safeMint(0xC567BbF95CDfeb6A22a2864649649FAe0BBa2B1b, 3); _safeMint(0x4272bb09E6b4c509aa32812F695C2Df488CE33E2, 4); _safeMint(0x25f2F40B9901F05EEF77a74A8c3Be63615B7053E, 4); _safeMint(0xb9b74E2b1791BD24D2c3B6e908842589739Ae0Ca, 4); _safeMint(0xBac6AB445Ec81E9A3E9Fdd7264A5d79Cf569a07A, 4); _safeMint(0xd15FBa714eaB4A82761BE0f1fDC90Ba0cC5Cfd63, 4); _safeMint(0x1717eF5499c5Cd8ee217BD94e998933D7cE0555E, 5); _safeMint(0x543B5aB4244178F2975e95361b6c2F72cE5732Da, 5); _safeMint(0x87Da83A6975599c1eCB05043DFA6FeB88c33775C, 6); _safeMint(0xBB09124a645E689bAce9DE386eAaE0fD333b7ee9, 8); _safeMint(0x8d1180E8A72757BEeCBe9E16AE46695f9166C5e0, 14); _safeMint(0x03A1B7Bee26704463dd80081513e1eB0Dc86F0F2, 27); _safeMint(0xA348094e5C1a1176aF98145BE4869744ef0F44CE, 130); QatsOnFloor += 311; } function getQatsOnFloor() public view returns(uint256) { return QatsOnFloor; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function startSale() public onlyOwner { hasSaleStarted = true; } function pauseSale() public onlyOwner { hasSaleStarted = false; } function withdrawAll() public onlyOwner nonReentrant { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "Transfer failed."); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_Qats","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devMinted","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":[],"name":"getQatsOnFloor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasSaleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"presaleMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"presaleMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"promoMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526703bf3b91c95b0000600a556000600b819055600c55600e805460ff191690553480156200003157600080fd5b5060405162002640380380620026408339810160408190526200005491620001d5565b6040518060400160405280600981526020016851697474795161747360b81b81525060405180604001604052806002815260200161515160f01b8152508160029080519060200190620000a99291906200012f565b508051620000bf9060039060208401906200012f565b50506000805550620000d133620000dd565b50600160095562000304565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200013d90620002b1565b90600052602060002090601f016020900481019282620001615760008555620001ac565b82601f106200017c57805160ff1916838001178555620001ac565b82800160010185558215620001ac579182015b82811115620001ac5782518255916020019190600101906200018f565b50620001ba929150620001be565b5090565b5b80821115620001ba5760008155600101620001bf565b60006020808385031215620001e957600080fd5b82516001600160401b03808211156200020157600080fd5b818501915085601f8301126200021657600080fd5b8151818111156200022b576200022b620002ee565b604051601f8201601f19908116603f01168101908382118183101715620002565762000256620002ee565b8160405282815288868487010111156200026f57600080fd5b600093505b8284101562000293578484018601518185018701529285019262000274565b82841115620002a55760008684830101525b98975050505050505050565b600181811c90821680620002c657607f821691505b60208210811415620002e857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61232c80620003146000396000f3fe6080604052600436106101e35760003560e01c80637c69e20711610102578063b66a0e5d11610095578063e73a091311610064578063e73a0913146104ea578063e985e9c5146104ff578063f2fde38b14610548578063f9fb8acd1461056857600080fd5b8063b66a0e5d1461048d578063b88d4fde146104a2578063c87b56dd146104b5578063cb82b4be146104d557600080fd5b8063a035b1fe116100d1578063a035b1fe14610424578063a0712d681461043a578063a22cb4651461044d578063adf2131b1461046d57600080fd5b80637c69e207146103c7578063853828b6146103dc5780638da5cb5b146103f157806395d89b411461040f57600080fd5b806342842e0e1161017a5780636352211e116101495780636352211e1461035357806370a0823114610373578063715018a61461039357806373aee929146103a857600080fd5b806342842e0e146102f657806355367ba91461030957806355f804b31461031e57806359533d6c1461033e57600080fd5b806315a55347116101b657806315a553471461028c57806318160ddd146102b05780631c8b232d146102c957806323b872dd146102e357600080fd5b806301ffc9a7146101e857806306fdde031461021d578063081812fc1461023f578063095ea7b314610277575b600080fd5b3480156101f457600080fd5b50610208610203366004612071565b61057e565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b506102326105d0565b60405161021491906121ce565b34801561024b57600080fd5b5061025f61025a36600461211d565b610662565b6040516001600160a01b039091168152602001610214565b61028a610285366004612047565b6106a6565b005b34801561029857600080fd5b506102a2600c5481565b604051908152602001610214565b3480156102bc57600080fd5b50600154600054036102a2565b3480156102d557600080fd5b50600e546102089060ff1681565b61028a6102f1366004611ef3565b610746565b61028a610304366004611ef3565b6108d7565b34801561031557600080fd5b5061028a6108f7565b34801561032a57600080fd5b5061028a6103393660046120ab565b610936565b34801561034a57600080fd5b5061028a61096c565b34801561035f57600080fd5b5061025f61036e36600461211d565b611383565b34801561037f57600080fd5b506102a261038e366004611ea5565b61138e565b34801561039f57600080fd5b5061028a6113dd565b3480156103b457600080fd5b50600e5461020890610100900460ff1681565b3480156103d357600080fd5b5061028a611413565b3480156103e857600080fd5b5061028a6114ce565b3480156103fd57600080fd5b506008546001600160a01b031661025f565b34801561041b57600080fd5b506102326115e3565b34801561043057600080fd5b506102a2600a5481565b61028a61044836600461211d565b6115f2565b34801561045957600080fd5b5061028a61046836600461200b565b6117e9565b34801561047957600080fd5b50600e546102089062010000900460ff1681565b34801561049957600080fd5b5061028a611855565b61028a6104b0366004611f2f565b61188e565b3480156104c157600080fd5b506102326104d036600461211d565b6118d8565b3480156104e157600080fd5b5061028a61195d565b3480156104f657600080fd5b50600b546102a2565b34801561050b57600080fd5b5061020861051a366004611ec0565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561055457600080fd5b5061028a610563366004611ea5565b6119a5565b34801561057457600080fd5b506102a26115b381565b60006301ffc9a760e01b6001600160e01b0319831614806105af57506380ac58cd60e01b6001600160e01b03198316145b806105ca5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546105df90612279565b80601f016020809104026020016040519081016040528092919081815260200182805461060b90612279565b80156106585780601f1061062d57610100808354040283529160200191610658565b820191906000526020600020905b81548152906001019060200180831161063b57829003601f168201915b5050505050905090565b600061066d82611a40565b61068a576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006106b182611383565b9050336001600160a01b038216146106ea576106cd813361051a565b6106ea576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061075182611a67565b9050836001600160a01b0316816001600160a01b0316146107845760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b038816909114176107d1576107b4863361051a565b6107d157604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166107f857604051633a954ecd60e21b815260040160405180910390fd5b801561080357600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040902055600160e11b831661088e576001840160008181526004602052604090205461088c57600054811461088c5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6108f28383836040518060200160405280600081525061188e565b505050565b6008546001600160a01b0316331461092a5760405162461bcd60e51b8152600401610921906121e1565b60405180910390fd5b600e805460ff19169055565b6008546001600160a01b031633146109605760405162461bcd60e51b8152600401610921906121e1565b6108f2600d8383611df0565b6008546001600160a01b031633146109965760405162461bcd60e51b8152600401610921906121e1565b600e54610100900460ff16156109e75760405162461bcd60e51b8152602060048201526016602482015275141c9954d85b1948185b1c9958591e48135a5b9d195960521b6044820152606401610921565b600e805461ff001916610100179055610a15734c88c30cdf53929aee3ffce4e8f1ca2d113fa5966001611ac8565b610a3473b2e56b8ff6a40c229f374cf6394775593d9d69ff6001611ac8565b610a53736977ed24823f7060c8bd7200c3685dca0c7147606001611ac8565b610a7273f73542b7556ef9c0cd3ff21c292501a0633e90316001611ac8565b610a91738778b3120ba60fc831844c3dd2c5948c3fc6bc866001611ac8565b610ab073914eeb5796c194b2684c4415e804bcd603d001366001611ac8565b610acf73240f22968869a4c22c9d75ce088fd6a7bb5f3a756001611ac8565b610aee73b333cf49216410b5684c9083e44c68069bbe57b76001611ac8565b610b0d7338521806e5d7678bbd13f3a20a09e0bac45c5a1b6001611ac8565b610b2c73ccd80ff94e89309638470d15ff45914ad0d16f4d6001611ac8565b610b4b7339180fe40baca6052fe63fdffb4e59a34dbbf2986001611ac8565b610b6a73ccc9553a9edd6f3bd6d7d96489f3bca9f96c83096001611ac8565b610b897335cf44ac9bb2c06b2940f67dc72043a71e886d766001611ac8565b610ba873986fa39765cb22c7d59d4546398eb18cecba22df6001611ac8565b610bc773957fad6b41028bb9cc80649d805716641759512f6001611ac8565b610be673175f42d0b7743f7368ec016c4ce9e6eb5aef785c6001611ac8565b610c0573d0417d73916f02bebafa615f6c3766f6a13a5b4b6001611ac8565b610c2473e3d3dfda5d754ac2609a98274d246c765634c0496001611ac8565b610c4373c7c02c1c69ac677f0d889dccad5b8b15d33d00466001611ac8565b610c6273fd366e282a3b2f92075227656f4575fa03c4e6746001611ac8565b610c8173f5d4e29eeb695648cf06078ef777f3459eaa7ddb6001611ac8565b610ca073111527ffef918088daa72b4b834c8c33a175aee06001611ac8565b610cbf73b4b0641bbcd89127b7467c362467e3960ad58aed6001611ac8565b610cde734ab12ba93bd2f8cfd3353234f808ce4dddaf922d6001611ac8565b610cfd738c9e32091bb5ce292e7aa9997580d99c564a02576001611ac8565b610d1c73af6dcd0514a0bdef90283b4c12e85bb9ecf129966001611ac8565b610d3b7328fd58b7c826ae92456847ef7365417e75ad09f26001611ac8565b610d5a7358d70bfa5b7def2b44c2b6c6e1f50bed4950b4d66001611ac8565b610d7973397795f9f76c745dbccf823df0b281e98068eb8e6001611ac8565b610d987317add1dab9d8fbd8562fe19396e8df5fe4b5d8006001611ac8565b610db7734efef990097f5be3a48ed3d43744aa2bff01c8d76001611ac8565b610dd6734c53f61f682e415d93e95307871703b10dd76b066001611ac8565b610df573277ac49900be1ab23a028b0dbfce42a804781e536001611ac8565b610e1473d1a6ebe0e7b38964bcb08b8d404b594076cee9b16001611ac8565b610e3373ca9161189c7570a8d26388d01069c19d22852c876001611ac8565b610e52736e6bdc931708cf273698c52c699c06196a7c85666001611ac8565b610e717339180fe40baca6052fe63fdffb4e59a34dbbf2986001611ac8565b610e90735151e387486195c31399bb589c7666950e6713386001611ac8565b610eaf737c27188b645289e6ce14c8c2574cdcb48c08b4166001611ac8565b610ece73be84903e4170602c5833142e1c55c224024f397c6001611ac8565b610eed7388ad8713b67fc67e1baa4ba76c236732e7e6b3606001611ac8565b610f0c730266a7cbf0299a7a50a9d7a66cc753e8159df41f6001611ac8565b610f2b73ccd80ff94e89309638470d15ff45914ad0d16f4d6002611ac8565b610f4a7365d5cae985f36a5fc441e8e4bb1d5d31b21ccbf66002611ac8565b610f6973d1101f4a8be1302dcf84fc9b62f2930e299f5da86002611ac8565b610f88732e118a67c83899d028f51d6de9dd746b540a52726002611ac8565b610fa773ed8528dddbe0ac6fe7863a01eb78b6e2fa930fc06002611ac8565b610fc6735fe35d8d3aee72c8176ce02cdf39799d8e36feb06002611ac8565b610fe573ce0e98ae24eac1059c4dc5136c5e35cb9021b6c16002611ac8565b61100473806eee2f932e947ef90e456458d8c6aee8d4bc4d6002611ac8565b611023738feae3b460f9cd2d0759fe111ae198fc42822d8f6002611ac8565b61104273a24b3b55df8d6f6e3d0a3eabbdf6fc5f70db37e96002611ac8565b611061734e27172d582e8c582e05d2d26a8faca915d86ef66002611ac8565b611080730311045c7a75fd96b17f6dbe9b716a1db3a2b2146002611ac8565b61109f731bf83d74eb2f6ff440754a970afafddc63bfc1876002611ac8565b6110be730266a7cbf0299a7a50a9d7a66cc753e8159df41f6002611ac8565b6110dd73204937a0df9e8018a5ceb8fdfb0a1f0089f0be2b6002611ac8565b6110fc73d0c06e7a3f69c8c2f635e80083e186066d83db1a6002611ac8565b61111b73a49f695f5a330c3c81b2703df07880f517959d4f6002611ac8565b61113a73ccc9553a9edd6f3bd6d7d96489f3bca9f96c83096002611ac8565b6111597330f32a394d193183ac85f89af51fb40ae890f9fe6003611ac8565b61117873d1e2cdfaa9b87e05f9b668a0e0238948dde6aa396003611ac8565b6111977313ed55e9dd2068121a347d8aa99a8a2cd25040676003611ac8565b6111b6735ae0b622d18491e4d121b7491dfb91013e9208fc6003611ac8565b6111d573a383ccce4fbeeb07fd11fda4204300606a1c23736003611ac8565b6111f473c567bbf95cdfeb6a22a2864649649fae0bba2b1b6003611ac8565b611213734272bb09e6b4c509aa32812f695c2df488ce33e26004611ac8565b6112327325f2f40b9901f05eef77a74a8c3be63615b7053e6004611ac8565b61125173b9b74e2b1791bd24d2c3b6e908842589739ae0ca6004611ac8565b61127073bac6ab445ec81e9a3e9fdd7264a5d79cf569a07a6004611ac8565b61128f73d15fba714eab4a82761be0f1fdc90ba0cc5cfd636004611ac8565b6112ae731717ef5499c5cd8ee217bd94e998933d7ce0555e6005611ac8565b6112cd73543b5ab4244178f2975e95361b6c2f72ce5732da6005611ac8565b6112ec7387da83a6975599c1ecb05043dfa6feb88c33775c6006611ac8565b61130b73bb09124a645e689bace9de386eaae0fd333b7ee96008611ac8565b61132a738d1180e8a72757beecbe9e16ae46695f9166c5e0600e611ac8565b6113497303a1b7bee26704463dd80081513e1eb0dc86f0f2601b611ac8565b61136873a348094e5c1a1176af98145be4869744ef0f44ce6082611ac8565b610137600b600082825461137c9190612216565b9091555050565b60006105ca82611a67565b60006001600160a01b0382166113b7576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b031633146114075760405162461bcd60e51b8152600401610921906121e1565b6114116000611ae6565b565b6008546001600160a01b0316331461143d5760405162461bcd60e51b8152600401610921906121e1565b600e5462010000900460ff161561148b5760405162461bcd60e51b815260206004820152601260248201527111195d88185b1c9958591e48135a5b9d195960721b6044820152606401610921565b600e805462ff00001916620100001790556114bb73a348094e5c1a1176af98145be4869744ef0f44ce6004611ac8565b6004600b600082825461137c9190612216565b6008546001600160a01b031633146114f85760405162461bcd60e51b8152600401610921906121e1565b6002600954141561154b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610921565b6002600955604051600090339047908381818185875af1925050503d8060008114611592576040519150601f19603f3d011682016040523d82523d6000602084013e611597565b606091505b50509050806115db5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610921565b506001600955565b6060600380546105df90612279565b3233146116575760405162461bcd60e51b815260206004820152602d60248201527f516974747920516174732043616e27742062652063616c6c6564206279206f7460448201526c68657220636f6e74726163747360981b6064820152608401610921565b600e5460ff1615156001146116a45760405162461bcd60e51b815260206004820152601360248201527214d85b19481a185cdb89dd081cdd185c9d1959606a1b6044820152606401610921565b60148111156116ff5760405162461bcd60e51b815260206004820152602160248201527f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d6044820152606560f81b6064820152608401610921565b6115b3816117106001546000540390565b61171a9190612216565b11156117685760405162461bcd60e51b815260206004820152601a60248201527f45786365656473204d6178205161747320417661696c61626c650000000000006044820152606401610921565b3481600a54611777919061222e565b11156117c55760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610921565b6117cf3382611ac8565b80600b60008282546117e19190612216565b909155505050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b0316331461187f5760405162461bcd60e51b8152600401610921906121e1565b600e805460ff19166001179055565b611899848484610746565b6001600160a01b0383163b156118d2576118b584848484611b38565b6118d2576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60606118e382611a40565b61190057604051630a14c4b560e41b815260040160405180910390fd5b600061190a611c2f565b905080516000141561192b5760405180602001604052806000815250611956565b8061193584611c3e565b604051602001611946929190612162565b6040516020818303038152906040525b9392505050565b6008546001600160a01b031633146119875760405162461bcd60e51b8152600401610921906121e1565b611992336001611ac8565b6001600b600082825461137c9190612216565b6008546001600160a01b031633146119cf5760405162461bcd60e51b8152600401610921906121e1565b6001600160a01b038116611a345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610921565b611a3d81611ae6565b50565b60008054821080156105ca575050600090815260046020526040902054600160e01b161590565b600081600054811015611aaf57600081815260046020526040902054600160e01b8116611aad575b80611956575060001901600081815260046020526040902054611a8f565b505b604051636f96cda160e11b815260040160405180910390fd5b611ae2828260405180602001604052806000815250611c8c565b5050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611b6d903390899088908890600401612191565b602060405180830381600087803b158015611b8757600080fd5b505af1925050508015611bb7575060408051601f3d908101601f19168201909252611bb49181019061208e565b60015b611c12573d808015611be5576040519150601f19603f3d011682016040523d82523d6000602084013e611bea565b606091505b508051611c0a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6060600d80546105df90612279565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480611c7557611c7a565b611c58565b50819003601f19909101908152919050565b611c968383611cf9565b6001600160a01b0383163b156108f2576000548281035b611cc06000868380600101945086611b38565b611cdd576040516368d2bf6b60e11b815260040160405180910390fd5b818110611cad578160005414611cf257600080fd5b5050505050565b60005481611d1a5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114611dc957808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611d91565b5081611de757604051622e076360e81b815260040160405180910390fd5b60005550505050565b828054611dfc90612279565b90600052602060002090601f016020900481019282611e1e5760008555611e64565b82601f10611e375782800160ff19823516178555611e64565b82800160010185558215611e64579182015b82811115611e64578235825591602001919060010190611e49565b50611e70929150611e74565b5090565b5b80821115611e705760008155600101611e75565b80356001600160a01b0381168114611ea057600080fd5b919050565b600060208284031215611eb757600080fd5b61195682611e89565b60008060408385031215611ed357600080fd5b611edc83611e89565b9150611eea60208401611e89565b90509250929050565b600080600060608486031215611f0857600080fd5b611f1184611e89565b9250611f1f60208501611e89565b9150604084013590509250925092565b60008060008060808587031215611f4557600080fd5b611f4e85611e89565b9350611f5c60208601611e89565b925060408501359150606085013567ffffffffffffffff80821115611f8057600080fd5b818701915087601f830112611f9457600080fd5b813581811115611fa657611fa66122ca565b604051601f8201601f19908116603f01168101908382118183101715611fce57611fce6122ca565b816040528281528a6020848701011115611fe757600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561201e57600080fd5b61202783611e89565b91506020830135801515811461203c57600080fd5b809150509250929050565b6000806040838503121561205a57600080fd5b61206383611e89565b946020939093013593505050565b60006020828403121561208357600080fd5b8135611956816122e0565b6000602082840312156120a057600080fd5b8151611956816122e0565b600080602083850312156120be57600080fd5b823567ffffffffffffffff808211156120d657600080fd5b818501915085601f8301126120ea57600080fd5b8135818111156120f957600080fd5b86602082850101111561210b57600080fd5b60209290920196919550909350505050565b60006020828403121561212f57600080fd5b5035919050565b6000815180845261214e81602086016020860161224d565b601f01601f19169290920160200192915050565b6000835161217481846020880161224d565b83519083019061218881836020880161224d565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906121c490830184612136565b9695505050505050565b6020815260006119566020830184612136565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115612229576122296122b4565b500190565b6000816000190483118215151615612248576122486122b4565b500290565b60005b83811015612268578181015183820152602001612250565b838111156118d25750506000910152565b600181811c9082168061228d57607f821691505b602082108114156122ae57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611a3d57600080fdfea264697066735822122050956cfc7c1877d04880bda143125464ff5ac5e8ee9e9ff76b241c1ae10661be64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5246627450363333674150467a76614e446d7878446d65567452765a415135353935353256786865336658382f00000000000000000000
Deployed Bytecode
0x6080604052600436106101e35760003560e01c80637c69e20711610102578063b66a0e5d11610095578063e73a091311610064578063e73a0913146104ea578063e985e9c5146104ff578063f2fde38b14610548578063f9fb8acd1461056857600080fd5b8063b66a0e5d1461048d578063b88d4fde146104a2578063c87b56dd146104b5578063cb82b4be146104d557600080fd5b8063a035b1fe116100d1578063a035b1fe14610424578063a0712d681461043a578063a22cb4651461044d578063adf2131b1461046d57600080fd5b80637c69e207146103c7578063853828b6146103dc5780638da5cb5b146103f157806395d89b411461040f57600080fd5b806342842e0e1161017a5780636352211e116101495780636352211e1461035357806370a0823114610373578063715018a61461039357806373aee929146103a857600080fd5b806342842e0e146102f657806355367ba91461030957806355f804b31461031e57806359533d6c1461033e57600080fd5b806315a55347116101b657806315a553471461028c57806318160ddd146102b05780631c8b232d146102c957806323b872dd146102e357600080fd5b806301ffc9a7146101e857806306fdde031461021d578063081812fc1461023f578063095ea7b314610277575b600080fd5b3480156101f457600080fd5b50610208610203366004612071565b61057e565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b506102326105d0565b60405161021491906121ce565b34801561024b57600080fd5b5061025f61025a36600461211d565b610662565b6040516001600160a01b039091168152602001610214565b61028a610285366004612047565b6106a6565b005b34801561029857600080fd5b506102a2600c5481565b604051908152602001610214565b3480156102bc57600080fd5b50600154600054036102a2565b3480156102d557600080fd5b50600e546102089060ff1681565b61028a6102f1366004611ef3565b610746565b61028a610304366004611ef3565b6108d7565b34801561031557600080fd5b5061028a6108f7565b34801561032a57600080fd5b5061028a6103393660046120ab565b610936565b34801561034a57600080fd5b5061028a61096c565b34801561035f57600080fd5b5061025f61036e36600461211d565b611383565b34801561037f57600080fd5b506102a261038e366004611ea5565b61138e565b34801561039f57600080fd5b5061028a6113dd565b3480156103b457600080fd5b50600e5461020890610100900460ff1681565b3480156103d357600080fd5b5061028a611413565b3480156103e857600080fd5b5061028a6114ce565b3480156103fd57600080fd5b506008546001600160a01b031661025f565b34801561041b57600080fd5b506102326115e3565b34801561043057600080fd5b506102a2600a5481565b61028a61044836600461211d565b6115f2565b34801561045957600080fd5b5061028a61046836600461200b565b6117e9565b34801561047957600080fd5b50600e546102089062010000900460ff1681565b34801561049957600080fd5b5061028a611855565b61028a6104b0366004611f2f565b61188e565b3480156104c157600080fd5b506102326104d036600461211d565b6118d8565b3480156104e157600080fd5b5061028a61195d565b3480156104f657600080fd5b50600b546102a2565b34801561050b57600080fd5b5061020861051a366004611ec0565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561055457600080fd5b5061028a610563366004611ea5565b6119a5565b34801561057457600080fd5b506102a26115b381565b60006301ffc9a760e01b6001600160e01b0319831614806105af57506380ac58cd60e01b6001600160e01b03198316145b806105ca5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6060600280546105df90612279565b80601f016020809104026020016040519081016040528092919081815260200182805461060b90612279565b80156106585780601f1061062d57610100808354040283529160200191610658565b820191906000526020600020905b81548152906001019060200180831161063b57829003601f168201915b5050505050905090565b600061066d82611a40565b61068a576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006106b182611383565b9050336001600160a01b038216146106ea576106cd813361051a565b6106ea576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061075182611a67565b9050836001600160a01b0316816001600160a01b0316146107845760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b038816909114176107d1576107b4863361051a565b6107d157604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166107f857604051633a954ecd60e21b815260040160405180910390fd5b801561080357600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040902055600160e11b831661088e576001840160008181526004602052604090205461088c57600054811461088c5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6108f28383836040518060200160405280600081525061188e565b505050565b6008546001600160a01b0316331461092a5760405162461bcd60e51b8152600401610921906121e1565b60405180910390fd5b600e805460ff19169055565b6008546001600160a01b031633146109605760405162461bcd60e51b8152600401610921906121e1565b6108f2600d8383611df0565b6008546001600160a01b031633146109965760405162461bcd60e51b8152600401610921906121e1565b600e54610100900460ff16156109e75760405162461bcd60e51b8152602060048201526016602482015275141c9954d85b1948185b1c9958591e48135a5b9d195960521b6044820152606401610921565b600e805461ff001916610100179055610a15734c88c30cdf53929aee3ffce4e8f1ca2d113fa5966001611ac8565b610a3473b2e56b8ff6a40c229f374cf6394775593d9d69ff6001611ac8565b610a53736977ed24823f7060c8bd7200c3685dca0c7147606001611ac8565b610a7273f73542b7556ef9c0cd3ff21c292501a0633e90316001611ac8565b610a91738778b3120ba60fc831844c3dd2c5948c3fc6bc866001611ac8565b610ab073914eeb5796c194b2684c4415e804bcd603d001366001611ac8565b610acf73240f22968869a4c22c9d75ce088fd6a7bb5f3a756001611ac8565b610aee73b333cf49216410b5684c9083e44c68069bbe57b76001611ac8565b610b0d7338521806e5d7678bbd13f3a20a09e0bac45c5a1b6001611ac8565b610b2c73ccd80ff94e89309638470d15ff45914ad0d16f4d6001611ac8565b610b4b7339180fe40baca6052fe63fdffb4e59a34dbbf2986001611ac8565b610b6a73ccc9553a9edd6f3bd6d7d96489f3bca9f96c83096001611ac8565b610b897335cf44ac9bb2c06b2940f67dc72043a71e886d766001611ac8565b610ba873986fa39765cb22c7d59d4546398eb18cecba22df6001611ac8565b610bc773957fad6b41028bb9cc80649d805716641759512f6001611ac8565b610be673175f42d0b7743f7368ec016c4ce9e6eb5aef785c6001611ac8565b610c0573d0417d73916f02bebafa615f6c3766f6a13a5b4b6001611ac8565b610c2473e3d3dfda5d754ac2609a98274d246c765634c0496001611ac8565b610c4373c7c02c1c69ac677f0d889dccad5b8b15d33d00466001611ac8565b610c6273fd366e282a3b2f92075227656f4575fa03c4e6746001611ac8565b610c8173f5d4e29eeb695648cf06078ef777f3459eaa7ddb6001611ac8565b610ca073111527ffef918088daa72b4b834c8c33a175aee06001611ac8565b610cbf73b4b0641bbcd89127b7467c362467e3960ad58aed6001611ac8565b610cde734ab12ba93bd2f8cfd3353234f808ce4dddaf922d6001611ac8565b610cfd738c9e32091bb5ce292e7aa9997580d99c564a02576001611ac8565b610d1c73af6dcd0514a0bdef90283b4c12e85bb9ecf129966001611ac8565b610d3b7328fd58b7c826ae92456847ef7365417e75ad09f26001611ac8565b610d5a7358d70bfa5b7def2b44c2b6c6e1f50bed4950b4d66001611ac8565b610d7973397795f9f76c745dbccf823df0b281e98068eb8e6001611ac8565b610d987317add1dab9d8fbd8562fe19396e8df5fe4b5d8006001611ac8565b610db7734efef990097f5be3a48ed3d43744aa2bff01c8d76001611ac8565b610dd6734c53f61f682e415d93e95307871703b10dd76b066001611ac8565b610df573277ac49900be1ab23a028b0dbfce42a804781e536001611ac8565b610e1473d1a6ebe0e7b38964bcb08b8d404b594076cee9b16001611ac8565b610e3373ca9161189c7570a8d26388d01069c19d22852c876001611ac8565b610e52736e6bdc931708cf273698c52c699c06196a7c85666001611ac8565b610e717339180fe40baca6052fe63fdffb4e59a34dbbf2986001611ac8565b610e90735151e387486195c31399bb589c7666950e6713386001611ac8565b610eaf737c27188b645289e6ce14c8c2574cdcb48c08b4166001611ac8565b610ece73be84903e4170602c5833142e1c55c224024f397c6001611ac8565b610eed7388ad8713b67fc67e1baa4ba76c236732e7e6b3606001611ac8565b610f0c730266a7cbf0299a7a50a9d7a66cc753e8159df41f6001611ac8565b610f2b73ccd80ff94e89309638470d15ff45914ad0d16f4d6002611ac8565b610f4a7365d5cae985f36a5fc441e8e4bb1d5d31b21ccbf66002611ac8565b610f6973d1101f4a8be1302dcf84fc9b62f2930e299f5da86002611ac8565b610f88732e118a67c83899d028f51d6de9dd746b540a52726002611ac8565b610fa773ed8528dddbe0ac6fe7863a01eb78b6e2fa930fc06002611ac8565b610fc6735fe35d8d3aee72c8176ce02cdf39799d8e36feb06002611ac8565b610fe573ce0e98ae24eac1059c4dc5136c5e35cb9021b6c16002611ac8565b61100473806eee2f932e947ef90e456458d8c6aee8d4bc4d6002611ac8565b611023738feae3b460f9cd2d0759fe111ae198fc42822d8f6002611ac8565b61104273a24b3b55df8d6f6e3d0a3eabbdf6fc5f70db37e96002611ac8565b611061734e27172d582e8c582e05d2d26a8faca915d86ef66002611ac8565b611080730311045c7a75fd96b17f6dbe9b716a1db3a2b2146002611ac8565b61109f731bf83d74eb2f6ff440754a970afafddc63bfc1876002611ac8565b6110be730266a7cbf0299a7a50a9d7a66cc753e8159df41f6002611ac8565b6110dd73204937a0df9e8018a5ceb8fdfb0a1f0089f0be2b6002611ac8565b6110fc73d0c06e7a3f69c8c2f635e80083e186066d83db1a6002611ac8565b61111b73a49f695f5a330c3c81b2703df07880f517959d4f6002611ac8565b61113a73ccc9553a9edd6f3bd6d7d96489f3bca9f96c83096002611ac8565b6111597330f32a394d193183ac85f89af51fb40ae890f9fe6003611ac8565b61117873d1e2cdfaa9b87e05f9b668a0e0238948dde6aa396003611ac8565b6111977313ed55e9dd2068121a347d8aa99a8a2cd25040676003611ac8565b6111b6735ae0b622d18491e4d121b7491dfb91013e9208fc6003611ac8565b6111d573a383ccce4fbeeb07fd11fda4204300606a1c23736003611ac8565b6111f473c567bbf95cdfeb6a22a2864649649fae0bba2b1b6003611ac8565b611213734272bb09e6b4c509aa32812f695c2df488ce33e26004611ac8565b6112327325f2f40b9901f05eef77a74a8c3be63615b7053e6004611ac8565b61125173b9b74e2b1791bd24d2c3b6e908842589739ae0ca6004611ac8565b61127073bac6ab445ec81e9a3e9fdd7264a5d79cf569a07a6004611ac8565b61128f73d15fba714eab4a82761be0f1fdc90ba0cc5cfd636004611ac8565b6112ae731717ef5499c5cd8ee217bd94e998933d7ce0555e6005611ac8565b6112cd73543b5ab4244178f2975e95361b6c2f72ce5732da6005611ac8565b6112ec7387da83a6975599c1ecb05043dfa6feb88c33775c6006611ac8565b61130b73bb09124a645e689bace9de386eaae0fd333b7ee96008611ac8565b61132a738d1180e8a72757beecbe9e16ae46695f9166c5e0600e611ac8565b6113497303a1b7bee26704463dd80081513e1eb0dc86f0f2601b611ac8565b61136873a348094e5c1a1176af98145be4869744ef0f44ce6082611ac8565b610137600b600082825461137c9190612216565b9091555050565b60006105ca82611a67565b60006001600160a01b0382166113b7576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b031633146114075760405162461bcd60e51b8152600401610921906121e1565b6114116000611ae6565b565b6008546001600160a01b0316331461143d5760405162461bcd60e51b8152600401610921906121e1565b600e5462010000900460ff161561148b5760405162461bcd60e51b815260206004820152601260248201527111195d88185b1c9958591e48135a5b9d195960721b6044820152606401610921565b600e805462ff00001916620100001790556114bb73a348094e5c1a1176af98145be4869744ef0f44ce6004611ac8565b6004600b600082825461137c9190612216565b6008546001600160a01b031633146114f85760405162461bcd60e51b8152600401610921906121e1565b6002600954141561154b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610921565b6002600955604051600090339047908381818185875af1925050503d8060008114611592576040519150601f19603f3d011682016040523d82523d6000602084013e611597565b606091505b50509050806115db5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610921565b506001600955565b6060600380546105df90612279565b3233146116575760405162461bcd60e51b815260206004820152602d60248201527f516974747920516174732043616e27742062652063616c6c6564206279206f7460448201526c68657220636f6e74726163747360981b6064820152608401610921565b600e5460ff1615156001146116a45760405162461bcd60e51b815260206004820152601360248201527214d85b19481a185cdb89dd081cdd185c9d1959606a1b6044820152606401610921565b60148111156116ff5760405162461bcd60e51b815260206004820152602160248201527f43616e206f6e6c79206d696e7420323020746f6b656e7320617420612074696d6044820152606560f81b6064820152608401610921565b6115b3816117106001546000540390565b61171a9190612216565b11156117685760405162461bcd60e51b815260206004820152601a60248201527f45786365656473204d6178205161747320417661696c61626c650000000000006044820152606401610921565b3481600a54611777919061222e565b11156117c55760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f7272656374006044820152606401610921565b6117cf3382611ac8565b80600b60008282546117e19190612216565b909155505050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b0316331461187f5760405162461bcd60e51b8152600401610921906121e1565b600e805460ff19166001179055565b611899848484610746565b6001600160a01b0383163b156118d2576118b584848484611b38565b6118d2576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b60606118e382611a40565b61190057604051630a14c4b560e41b815260040160405180910390fd5b600061190a611c2f565b905080516000141561192b5760405180602001604052806000815250611956565b8061193584611c3e565b604051602001611946929190612162565b6040516020818303038152906040525b9392505050565b6008546001600160a01b031633146119875760405162461bcd60e51b8152600401610921906121e1565b611992336001611ac8565b6001600b600082825461137c9190612216565b6008546001600160a01b031633146119cf5760405162461bcd60e51b8152600401610921906121e1565b6001600160a01b038116611a345760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610921565b611a3d81611ae6565b50565b60008054821080156105ca575050600090815260046020526040902054600160e01b161590565b600081600054811015611aaf57600081815260046020526040902054600160e01b8116611aad575b80611956575060001901600081815260046020526040902054611a8f565b505b604051636f96cda160e11b815260040160405180910390fd5b611ae2828260405180602001604052806000815250611c8c565b5050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611b6d903390899088908890600401612191565b602060405180830381600087803b158015611b8757600080fd5b505af1925050508015611bb7575060408051601f3d908101601f19168201909252611bb49181019061208e565b60015b611c12573d808015611be5576040519150601f19603f3d011682016040523d82523d6000602084013e611bea565b606091505b508051611c0a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6060600d80546105df90612279565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480611c7557611c7a565b611c58565b50819003601f19909101908152919050565b611c968383611cf9565b6001600160a01b0383163b156108f2576000548281035b611cc06000868380600101945086611b38565b611cdd576040516368d2bf6b60e11b815260040160405180910390fd5b818110611cad578160005414611cf257600080fd5b5050505050565b60005481611d1a5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114611dc957808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611d91565b5081611de757604051622e076360e81b815260040160405180910390fd5b60005550505050565b828054611dfc90612279565b90600052602060002090601f016020900481019282611e1e5760008555611e64565b82601f10611e375782800160ff19823516178555611e64565b82800160010185558215611e64579182015b82811115611e64578235825591602001919060010190611e49565b50611e70929150611e74565b5090565b5b80821115611e705760008155600101611e75565b80356001600160a01b0381168114611ea057600080fd5b919050565b600060208284031215611eb757600080fd5b61195682611e89565b60008060408385031215611ed357600080fd5b611edc83611e89565b9150611eea60208401611e89565b90509250929050565b600080600060608486031215611f0857600080fd5b611f1184611e89565b9250611f1f60208501611e89565b9150604084013590509250925092565b60008060008060808587031215611f4557600080fd5b611f4e85611e89565b9350611f5c60208601611e89565b925060408501359150606085013567ffffffffffffffff80821115611f8057600080fd5b818701915087601f830112611f9457600080fd5b813581811115611fa657611fa66122ca565b604051601f8201601f19908116603f01168101908382118183101715611fce57611fce6122ca565b816040528281528a6020848701011115611fe757600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561201e57600080fd5b61202783611e89565b91506020830135801515811461203c57600080fd5b809150509250929050565b6000806040838503121561205a57600080fd5b61206383611e89565b946020939093013593505050565b60006020828403121561208357600080fd5b8135611956816122e0565b6000602082840312156120a057600080fd5b8151611956816122e0565b600080602083850312156120be57600080fd5b823567ffffffffffffffff808211156120d657600080fd5b818501915085601f8301126120ea57600080fd5b8135818111156120f957600080fd5b86602082850101111561210b57600080fd5b60209290920196919550909350505050565b60006020828403121561212f57600080fd5b5035919050565b6000815180845261214e81602086016020860161224d565b601f01601f19169290920160200192915050565b6000835161217481846020880161224d565b83519083019061218881836020880161224d565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906121c490830184612136565b9695505050505050565b6020815260006119566020830184612136565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115612229576122296122b4565b500190565b6000816000190483118215151615612248576122486122b4565b500290565b60005b83811015612268578181015183820152602001612250565b838111156118d25750506000910152565b600181811c9082168061228d57607f821691505b602082108114156122ae57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611a3d57600080fdfea264697066735822122050956cfc7c1877d04880bda143125464ff5ac5e8ee9e9ff76b241c1ae10661be64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5246627450363333674150467a76614e446d7878446d65567452765a415135353935353256786865336658382f00000000000000000000
-----Decoded View---------------
Arg [0] : baseURI (string): ipfs://QmRFbtP633gAPFzvaNDmxxDmeVtRvZAQ559552Vxhe3fX8/
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d5246627450363333674150467a76614e446d7878446d65
Arg [3] : 567452765a415135353935353256786865336658382f00000000000000000000
Deployed Bytecode Sourcemap
58888:8130:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25853:639;;;;;;;;;;-1:-1:-1;25853:639:0;;;;;:::i;:::-;;:::i;:::-;;;5834:14:1;;5827:22;5809:41;;5797:2;5782:18;25853:639:0;;;;;;;;26755:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33246:218::-;;;;;;;;;;-1:-1:-1;33246:218:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;5132:32:1;;;5114:51;;5102:2;5087:18;33246:218:0;4968:203:1;32679:408:0;;;;;;:::i;:::-;;:::i;:::-;;59121:33;;;;;;;;;;;;;;;;;;;10281:25:1;;;10269:2;10254:18;59121:33:0;10135:177:1;22506:323:0;;;;;;;;;;-1:-1:-1;22780:12:0;;22567:7;22764:13;:28;22506:323;;59199:34;;;;;;;;;;-1:-1:-1;59199:34:0;;;;;;;;36885:2825;;;;;;:::i;:::-;;:::i;39806:193::-;;;;;;:::i;:::-;;:::i;66738:79::-;;;;;;;;;;;;;:::i;66538:100::-;;;;;;;;;;-1:-1:-1;66538:100:0;;;;;:::i;:::-;;:::i;60911:5407::-;;;;;;;;;;;;;:::i;28148:152::-;;;;;;;;;;-1:-1:-1;28148:152:0;;;;;:::i;:::-;;:::i;23690:233::-;;;;;;;;;;-1:-1:-1;23690:233:0;;;;;:::i;:::-;;:::i;4974:94::-;;;;;;;;;;;;;:::i;59240:25::-;;;;;;;;;;-1:-1:-1;59240:25:0;;;;;;;;;;;60605:220;;;;;;;;;;;;;:::i;66828:179::-;;;;;;;;;;;;;:::i;4323:87::-;;;;;;;;;;-1:-1:-1;4396:6:0;;-1:-1:-1;;;;;4396:6:0;4323:87;;26931:104;;;;;;;;;;;;;:::i;59031:32::-;;;;;;;;;;;;;;;;59794:524;;;;;;:::i;:::-;;:::i;33804:234::-;;;;;;;;;;-1:-1:-1;33804:234:0;;;;;:::i;:::-;;:::i;59272:21::-;;;;;;;;;;-1:-1:-1;59272:21:0;;;;;;;;;;;66648:78;;;;;;;;;;;;;:::i;40597:407::-;;;;;;:::i;:::-;;:::i;27141:318::-;;;;;;;;;;-1:-1:-1;27141:318:0;;;;;:::i;:::-;;:::i;60409:109::-;;;;;;;;;;;;;:::i;66326:92::-;;;;;;;;;;-1:-1:-1;66399:11:0;;66326:92;;34195:164;;;;;;;;;;-1:-1:-1;34195:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;34316:25:0;;;34292:4;34316:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34195:164;5223:192;;;;;;;;;;-1:-1:-1;5223:192:0;;;;;:::i;:::-;;:::i;58984:39::-;;;;;;;;;;;;59019:4;58984:39;;25853:639;25938:4;-1:-1:-1;;;;;;;;;26262:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;26339:25:0;;;26262:102;:179;;;-1:-1:-1;;;;;;;;;;26416:25:0;;;26262:179;26242:199;25853:639;-1:-1:-1;;25853:639:0:o;26755:100::-;26809:13;26842:5;26835:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26755:100;:::o;33246:218::-;33322:7;33347:16;33355:7;33347;:16::i;:::-;33342:64;;33372:34;;-1:-1:-1;;;33372:34:0;;;;;;;;;;;33342:64;-1:-1:-1;33426:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;33426:30:0;;33246:218::o;32679:408::-;32768:13;32784:16;32792:7;32784;:16::i;:::-;32768:32;-1:-1:-1;57012:10:0;-1:-1:-1;;;;;32817:28:0;;;32813:175;;32865:44;32882:5;57012:10;34195:164;:::i;32865:44::-;32860:128;;32937:35;;-1:-1:-1;;;32937:35:0;;;;;;;;;;;32860:128;33000:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;33000:35:0;-1:-1:-1;;;;;33000:35:0;;;;;;;;;33051:28;;33000:24;;33051:28;;;;;;;32757:330;32679:408;;:::o;36885:2825::-;37027:27;37057;37076:7;37057:18;:27::i;:::-;37027:57;;37142:4;-1:-1:-1;;;;;37101:45:0;37117:19;-1:-1:-1;;;;;37101:45:0;;37097:86;;37155:28;;-1:-1:-1;;;37155:28:0;;;;;;;;;;;37097:86;37197:27;35993:24;;;:15;:24;;;;;36221:26;;57012:10;35618:30;;;-1:-1:-1;;;;;35311:28:0;;35596:20;;;35593:56;37383:180;;37476:43;37493:4;57012:10;34195:164;:::i;37476:43::-;37471:92;;37528:35;;-1:-1:-1;;;37528:35:0;;;;;;;;;;;37471:92;-1:-1:-1;;;;;37580:16:0;;37576:52;;37605:23;;-1:-1:-1;;;37605:23:0;;;;;;;;;;;37576:52;37777:15;37774:160;;;37917:1;37896:19;37889:30;37774:160;-1:-1:-1;;;;;38314:24:0;;;;;;;:18;:24;;;;;;38312:26;;-1:-1:-1;;38312:26:0;;;38383:22;;;;;;;;;38381:24;;-1:-1:-1;38381:24:0;;;31537:11;31512:23;31508:41;31495:63;-1:-1:-1;;;31495:63:0;38676:26;;;;:17;:26;;;;;:175;-1:-1:-1;;;38971:47:0;;38967:627;;39076:1;39066:11;;39044:19;39199:30;;;:17;:30;;;;;;39195:384;;39337:13;;39322:11;:28;39318:242;;39484:30;;;;:17;:30;;;;;:52;;;39318:242;39025:569;38967:627;39641:7;39637:2;-1:-1:-1;;;;;39622:27:0;39631:4;-1:-1:-1;;;;;39622:27:0;;;;;;;;;;;37016:2694;;;36885:2825;;;:::o;39806:193::-;39952:39;39969:4;39975:2;39979:7;39952:39;;;;;;;;;;;;:16;:39::i;:::-;39806:193;;;:::o;66738:79::-;4396:6;;-1:-1:-1;;;;;4396:6:0;57012:10;4543:23;4535:68;;;;-1:-1:-1;;;4535:68:0;;;;;;;:::i;:::-;;;;;;;;;66787:14:::1;:22:::0;;-1:-1:-1;;66787:22:0::1;::::0;;66738:79::o;66538:100::-;4396:6;;-1:-1:-1;;;;;4396:6:0;57012:10;4543:23;4535:68;;;;-1:-1:-1;;;4535:68:0;;;;;;;:::i;:::-;66609:23:::1;:13;66625:7:::0;;66609:23:::1;:::i;60911:5407::-:0;4396:6;;-1:-1:-1;;;;;4396:6:0;57012:10;4543:23;4535:68;;;;-1:-1:-1;;;4535:68:0;;;;;;;:::i;:::-;60972:13:::1;::::0;::::1;::::0;::::1;;;60971:14;60963:49;;;::::0;-1:-1:-1;;;60963:49:0;;8231:2:1;60963:49:0::1;::::0;::::1;8213:21:1::0;8270:2;8250:18;;;8243:30;-1:-1:-1;;;8289:18:1;;;8282:52;8351:18;;60963:49:0::1;8029:346:1::0;60963:49:0::1;61023:13;:20:::0;;-1:-1:-1;;61023:20:0::1;;;::::0;;61054:56:::1;61064:42;61039:4;61054:9;:56::i;:::-;61121;61131:42;61175:1;61121:9;:56::i;:::-;61188;61198:42;61242:1;61188:9;:56::i;:::-;61255;61265:42;61309:1;61255:9;:56::i;:::-;61322;61332:42;61376:1;61322:9;:56::i;:::-;61389;61399:42;61443:1;61389:9;:56::i;:::-;61456;61466:42;61510:1;61456:9;:56::i;:::-;61523;61533:42;61577:1;61523:9;:56::i;:::-;61590;61600:42;61644:1;61590:9;:56::i;:::-;61657;61667:42;61711:1;61657:9;:56::i;:::-;61724;61734:42;61778:1;61724:9;:56::i;:::-;61791;61801:42;61845:1;61791:9;:56::i;:::-;61858;61868:42;61912:1;61858:9;:56::i;:::-;61925;61935:42;61979:1;61925:9;:56::i;:::-;61992;62002:42;62046:1;61992:9;:56::i;:::-;62059;62069:42;62113:1;62059:9;:56::i;:::-;62126;62136:42;62180:1;62126:9;:56::i;:::-;62193;62203:42;62247:1;62193:9;:56::i;:::-;62260;62270:42;62314:1;62260:9;:56::i;:::-;62327;62337:42;62381:1;62327:9;:56::i;:::-;62394;62404:42;62448:1;62394:9;:56::i;:::-;62461;62471:42;62515:1;62461:9;:56::i;:::-;62528;62538:42;62582:1;62528:9;:56::i;:::-;62595;62605:42;62649:1;62595:9;:56::i;:::-;62662;62672:42;62716:1;62662:9;:56::i;:::-;62729;62739:42;62783:1;62729:9;:56::i;:::-;62796;62806:42;62850:1;62796:9;:56::i;:::-;62863;62873:42;62917:1;62863:9;:56::i;:::-;62930;62940:42;62984:1;62930:9;:56::i;:::-;62997;63007:42;63051:1;62997:9;:56::i;:::-;63064;63074:42;63118:1;63064:9;:56::i;:::-;63131;63141:42;63185:1;63131:9;:56::i;:::-;63198;63208:42;63252:1;63198:9;:56::i;:::-;63265;63275:42;63319:1;63265:9;:56::i;:::-;63332;63342:42;63386:1;63332:9;:56::i;:::-;63399;63409:42;63453:1;63399:9;:56::i;:::-;63466;63476:42;63520:1;63466:9;:56::i;:::-;63533;63543:42;63587:1;63533:9;:56::i;:::-;63600;63610:42;63654:1;63600:9;:56::i;:::-;63667;63677:42;63721:1;63667:9;:56::i;:::-;63734;63744:42;63788:1;63734:9;:56::i;:::-;63801;63811:42;63855:1;63801:9;:56::i;:::-;63868;63878:42;63922:1;63868:9;:56::i;:::-;63935;63945:42;63989:1;63935:9;:56::i;:::-;64002;64012:42;64056:1;64002:9;:56::i;:::-;64069;64079:42;64123:1;64069:9;:56::i;:::-;64136;64146:42;64190:1;64136:9;:56::i;:::-;64203;64213:42;64257:1;64203:9;:56::i;:::-;64270;64280:42;64324:1;64270:9;:56::i;:::-;64337;64347:42;64391:1;64337:9;:56::i;:::-;64404;64414:42;64458:1;64404:9;:56::i;:::-;64471;64481:42;64525:1;64471:9;:56::i;:::-;64538;64548:42;64592:1;64538:9;:56::i;:::-;64605;64615:42;64659:1;64605:9;:56::i;:::-;64672;64682:42;64726:1;64672:9;:56::i;:::-;64739;64749:42;64793:1;64739:9;:56::i;:::-;64806;64816:42;64860:1;64806:9;:56::i;:::-;64873;64883:42;64927:1;64873:9;:56::i;:::-;64940;64950:42;64994:1;64940:9;:56::i;:::-;65007;65017:42;65061:1;65007:9;:56::i;:::-;65074;65084:42;65128:1;65074:9;:56::i;:::-;65141;65151:42;65195:1;65141:9;:56::i;:::-;65208;65218:42;65262:1;65208:9;:56::i;:::-;65275;65285:42;65329:1;65275:9;:56::i;:::-;65342;65352:42;65396:1;65342:9;:56::i;:::-;65409;65419:42;65463:1;65409:9;:56::i;:::-;65476;65486:42;65530:1;65476:9;:56::i;:::-;65550;65560:42;65604:1;65550:9;:56::i;:::-;65617;65627:42;65671:1;65617:9;:56::i;:::-;65684;65694:42;65738:1;65684:9;:56::i;:::-;65751;65761:42;65805:1;65751:9;:56::i;:::-;65818;65828:42;65872:1;65818:9;:56::i;:::-;65885;65895:42;65939:1;65885:9;:56::i;:::-;65952;65962:42;66006:1;65952:9;:56::i;:::-;66019;66029:42;66073:1;66019:9;:56::i;:::-;66086:57;66096:42;66140:2;66086:9;:57::i;:::-;66154;66164:42;66208:2;66154:9;:57::i;:::-;66222:58;66232:42;66276:3;66222:9;:58::i;:::-;66306:3;66291:11;;:18;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;60911:5407:0:o;28148:152::-;28220:7;28263:27;28282:7;28263:18;:27::i;23690:233::-;23762:7;-1:-1:-1;;;;;23786:19:0;;23782:60;;23814:28;;-1:-1:-1;;;23814:28:0;;;;;;;;;;;23782:60;-1:-1:-1;;;;;;23860:25:0;;;;;:18;:25;;;;;;17849:13;23860:55;;23690:233::o;4974:94::-;4396:6;;-1:-1:-1;;;;;4396:6:0;57012:10;4543:23;4535:68;;;;-1:-1:-1;;;4535:68:0;;;;;;;:::i;:::-;5039:21:::1;5057:1;5039:9;:21::i;:::-;4974:94::o:0;60605:220::-;4396:6;;-1:-1:-1;;;;;4396:6:0;57012:10;4543:23;4535:68;;;;-1:-1:-1;;;4535:68:0;;;;;;;:::i;:::-;60662:9:::1;::::0;;;::::1;;;60661:10;60653:41;;;::::0;-1:-1:-1;;;60653:41:0;;9282:2:1;60653:41:0::1;::::0;::::1;9264:21:1::0;9321:2;9301:18;;;9294:30;-1:-1:-1;;;9340:18:1;;;9333:48;9398:18;;60653:41:0::1;9080:342:1::0;60653:41:0::1;60705:9;:16:::0;;-1:-1:-1;;60705:16:0::1;::::0;::::1;::::0;;60734:56:::1;60744:42;60788:1;60734:9;:56::i;:::-;60816:1;60801:11;;:16;;;;;;;:::i;66828:179::-:0;4396:6;;-1:-1:-1;;;;;4396:6:0;57012:10;4543:23;4535:68;;;;-1:-1:-1;;;4535:68:0;;;;;;;:::i;:::-;1715:1:::1;2311:7;;:19;;2303:63;;;::::0;-1:-1:-1;;;2303:63:0;;9977:2:1;2303:63:0::1;::::0;::::1;9959:21:1::0;10016:2;9996:18;;;9989:30;10055:33;10035:18;;;10028:61;10106:18;;2303:63:0::1;9775:355:1::0;2303:63:0::1;1715:1;2444:7;:18:::0;66907:49:::2;::::0;66889:12:::2;::::0;66907:10:::2;::::0;66930:21:::2;::::0;66889:12;66907:49;66889:12;66907:49;66930:21;66907:10;:49:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66888:68;;;66971:7;66963:36;;;::::0;-1:-1:-1;;;66963:36:0;;8582:2:1;66963:36:0::2;::::0;::::2;8564:21:1::0;8621:2;8601:18;;;8594:30;-1:-1:-1;;;8640:18:1;;;8633:46;8696:18;;66963:36:0::2;8380:340:1::0;66963:36:0::2;-1:-1:-1::0;1671:1:0::1;2623:7;:22:::0;66828:179::o;26931:104::-;26987:13;27020:7;27013:14;;;;;:::i;59794:524::-;59690:9;59703:10;59690:23;59682:81;;;;-1:-1:-1;;;59682:81:0;;7456:2:1;59682:81:0;;;7438:21:1;7495:2;7475:18;;;7468:30;7534:34;7514:18;;;7507:62;-1:-1:-1;;;7585:18:1;;;7578:43;7638:19;;59682:81:0;7254:409:1;59682:81:0;59879:14:::1;::::0;::::1;;:22;;:14:::0;:22:::1;59871:54;;;::::0;-1:-1:-1;;;59871:54:0;;9629:2:1;59871:54:0::1;::::0;::::1;9611:21:1::0;9668:2;9648:18;;;9641:30;-1:-1:-1;;;9687:18:1;;;9680:49;9746:18;;59871:54:0::1;9427:343:1::0;59871:54:0::1;59962:2;59944:14;:20;;59936:66;;;::::0;-1:-1:-1;;;59936:66:0;;7054:2:1;59936:66:0::1;::::0;::::1;7036:21:1::0;7093:2;7073:18;;;7066:30;7132:34;7112:18;;;7105:62;-1:-1:-1;;;7183:18:1;;;7176:31;7224:19;;59936:66:0::1;6852:397:1::0;59936:66:0::1;59019:4;60038:14;60022:13;22780:12:::0;;22567:7;22764:13;:28;;22506:323;60022:13:::1;:30;;;;:::i;:::-;60021:44;;60013:83;;;::::0;-1:-1:-1;;;60013:83:0;;8927:2:1;60013:83:0::1;::::0;::::1;8909:21:1::0;8966:2;8946:18;;;8939:30;9005:28;8985:18;;;8978:56;9051:18;;60013:83:0::1;8725:350:1::0;60013:83:0::1;60143:9;60124:14;60116:5;;:22;;;;:::i;:::-;60115:37;;60107:81;;;::::0;-1:-1:-1;;;60107:81:0;;6694:2:1;60107:81:0::1;::::0;::::1;6676:21:1::0;6733:2;6713:18;;;6706:30;6772:33;6752:18;;;6745:61;6823:18;;60107:81:0::1;6492:355:1::0;60107:81:0::1;60219:37;60229:10;60241:14;60219:9;:37::i;:::-;60286:14;60271:11;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;59794:524:0:o;33804:234::-;57012:10;33899:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;33899:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;33899:60:0;;;;;;;;;;33975:55;;5809:41:1;;;33899:49:0;;57012:10;33975:55;;5782:18:1;33975:55:0;;;;;;;33804:234;;:::o;66648:78::-;4396:6;;-1:-1:-1;;;;;4396:6:0;57012:10;4543:23;4535:68;;;;-1:-1:-1;;;4535:68:0;;;;;;;:::i;:::-;66697:14:::1;:21:::0;;-1:-1:-1;;66697:21:0::1;66714:4;66697:21;::::0;;66648:78::o;40597:407::-;40772:31;40785:4;40791:2;40795:7;40772:12;:31::i;:::-;-1:-1:-1;;;;;40818:14:0;;;:19;40814:183;;40857:56;40888:4;40894:2;40898:7;40907:5;40857:30;:56::i;:::-;40852:145;;40941:40;;-1:-1:-1;;;40941:40:0;;;;;;;;;;;40852:145;40597:407;;;;:::o;27141:318::-;27214:13;27245:16;27253:7;27245;:16::i;:::-;27240:59;;27270:29;;-1:-1:-1;;;27270:29:0;;;;;;;;;;;27240:59;27312:21;27336:10;:8;:10::i;:::-;27312:34;;27370:7;27364:21;27389:1;27364:26;;:87;;;;;;;;;;;;;;;;;27417:7;27426:18;27436:7;27426:9;:18::i;:::-;27400:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27364:87;27357:94;27141:318;-1:-1:-1;;;27141:318:0:o;60409:109::-;4396:6;;-1:-1:-1;;;;;4396:6:0;57012:10;4543:23;4535:68;;;;-1:-1:-1;;;4535:68:0;;;;;;;:::i;:::-;60459:24:::1;60469:10;60481:1;60459:9;:24::i;:::-;60509:1;60494:11;;:16;;;;;;;:::i;5223:192::-:0;4396:6;;-1:-1:-1;;;;;4396:6:0;57012:10;4543:23;4535:68;;;;-1:-1:-1;;;4535:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5312:22:0;::::1;5304:73;;;::::0;-1:-1:-1;;;5304:73:0;;6287:2:1;5304:73:0::1;::::0;::::1;6269:21:1::0;6326:2;6306:18;;;6299:30;6365:34;6345:18;;;6338:62;-1:-1:-1;;;6416:18:1;;;6409:36;6462:19;;5304:73:0::1;6085:402:1::0;5304:73:0::1;5388:19;5398:8;5388:9;:19::i;:::-;5223:192:::0;:::o;34617:282::-;34682:4;34772:13;;34762:7;:23;34719:153;;;;-1:-1:-1;;34823:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;34823:44:0;:49;;34617:282::o;29303:1275::-;29370:7;29405;29507:13;;29500:4;:20;29496:1015;;;29545:14;29562:23;;;:17;:23;;;;;;-1:-1:-1;;;29651:24:0;;29647:845;;30316:113;30323:11;30316:113;;-1:-1:-1;;;30394:6:0;30376:25;;;;:17;:25;;;;;;30316:113;;29647:845;29522:989;29496:1015;30539:31;;-1:-1:-1;;;30539:31:0;;;;;;;;;;;50757:112;50834:27;50844:2;50848:8;50834:27;;;;;;;;;;;;:9;:27::i;:::-;50757:112;;:::o;5423:173::-;5498:6;;;-1:-1:-1;;;;;5515:17:0;;;-1:-1:-1;;;;;;5515:17:0;;;;;;;5548:40;;5498:6;;;5515:17;5498:6;;5548:40;;5479:16;;5548:40;5468:128;5423:173;:::o;43088:716::-;43272:88;;-1:-1:-1;;;43272:88:0;;43251:4;;-1:-1:-1;;;;;43272:45:0;;;;;:88;;57012:10;;43339:4;;43345:7;;43354:5;;43272:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43272:88:0;;;;;;;;-1:-1:-1;;43272:88:0;;;;;;;;;;;;:::i;:::-;;;43268:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43555:13:0;;43551:235;;43601:40;;-1:-1:-1;;;43601:40:0;;;;;;;;;;;43551:235;43744:6;43738:13;43729:6;43725:2;43721:15;43714:38;43268:529;-1:-1:-1;;;;;;43431:64:0;-1:-1:-1;;;43431:64:0;;-1:-1:-1;43088:716:0;;;;;;:::o;66424:108::-;66484:13;66513;66506:20;;;;;:::i;57132:1745::-;57197:17;57631:4;57624;57618:11;57614:22;57723:1;57717:4;57710:15;57798:4;57795:1;57791:12;57784:19;;;57880:1;57875:3;57868:14;57984:3;58223:5;58205:428;58271:1;58266:3;58262:11;58255:18;;58442:2;58436:4;58432:13;58428:2;58424:22;58419:3;58411:36;58536:2;58526:13;;;58593:25;;58611:5;;58593:25;58205:428;;;-1:-1:-1;58663:13:0;;;-1:-1:-1;;58778:14:0;;;58840:19;;;58778:14;57132:1745;-1:-1:-1;57132:1745:0:o;49984:689::-;50115:19;50121:2;50125:8;50115:5;:19::i;:::-;-1:-1:-1;;;;;50176:14:0;;;:19;50172:483;;50216:11;50230:13;50278:14;;;50311:233;50342:62;50381:1;50385:2;50389:7;;;;;;50398:5;50342:30;:62::i;:::-;50337:167;;50440:40;;-1:-1:-1;;;50440:40:0;;;;;;;;;;;50337:167;50539:3;50531:5;:11;50311:233;;50626:3;50609:13;;:20;50605:34;;50631:8;;;50605:34;50197:458;;49984:689;;;:::o;44266:2966::-;44339:20;44362:13;44390;44386:44;;44412:18;;-1:-1:-1;;;44412:18:0;;;;;;;;;;;44386:44;-1:-1:-1;;;;;44918:22:0;;;;;;:18;:22;;;;17987:2;44918:22;;;:71;;44956:32;44944:45;;44918:71;;;45232:31;;;:17;:31;;;;;-1:-1:-1;31968:15:0;;31942:24;31938:46;31537:11;31512:23;31508:41;31505:52;31495:63;;45232:173;;45467:23;;;;45232:31;;44918:22;;46232:25;44918:22;;46085:335;46746:1;46732:12;46728:20;46686:346;46787:3;46778:7;46775:16;46686:346;;47005:7;46995:8;46992:1;46965:25;46962:1;46959;46954:59;46840:1;46827:15;46686:346;;;-1:-1:-1;47065:13:0;47061:45;;47087:19;;-1:-1:-1;;;47087:19:0;;;;;;;;;;;47061:45;47123:13;:19;-1:-1:-1;39806:193:0;;;:::o;-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:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:1138::-;1076:6;1084;1092;1100;1153:3;1141:9;1132:7;1128:23;1124:33;1121:53;;;1170:1;1167;1160:12;1121:53;1193:29;1212:9;1193:29;:::i;:::-;1183:39;;1241:38;1275:2;1264:9;1260:18;1241:38;:::i;:::-;1231:48;;1326:2;1315:9;1311:18;1298:32;1288:42;;1381:2;1370:9;1366:18;1353:32;1404:18;1445:2;1437:6;1434:14;1431:34;;;1461:1;1458;1451:12;1431:34;1499:6;1488:9;1484:22;1474:32;;1544:7;1537:4;1533:2;1529:13;1525:27;1515:55;;1566:1;1563;1556:12;1515:55;1602:2;1589:16;1624:2;1620;1617:10;1614:36;;;1630:18;;:::i;:::-;1705:2;1699:9;1673:2;1759:13;;-1:-1:-1;;1755:22:1;;;1779:2;1751:31;1747:40;1735:53;;;1803:18;;;1823:22;;;1800:46;1797:72;;;1849:18;;:::i;:::-;1889:10;1885:2;1878:22;1924:2;1916:6;1909:18;1964:7;1959:2;1954;1950;1946:11;1942:20;1939:33;1936:53;;;1985:1;1982;1975:12;1936:53;2041:2;2036;2032;2028:11;2023:2;2015:6;2011:15;1998:46;2086:1;2081:2;2076;2068:6;2064:15;2060:24;2053:35;2107:6;2097:16;;;;;;;981:1138;;;;;;;:::o;2124:347::-;2189:6;2197;2250:2;2238:9;2229:7;2225:23;2221:32;2218:52;;;2266:1;2263;2256:12;2218:52;2289:29;2308:9;2289:29;:::i;:::-;2279:39;;2368:2;2357:9;2353:18;2340:32;2415:5;2408:13;2401:21;2394:5;2391:32;2381:60;;2437:1;2434;2427:12;2381:60;2460:5;2450:15;;;2124:347;;;;;:::o;2476:254::-;2544:6;2552;2605:2;2593:9;2584:7;2580:23;2576:32;2573:52;;;2621:1;2618;2611:12;2573:52;2644:29;2663:9;2644:29;:::i;:::-;2634:39;2720:2;2705:18;;;;2692:32;;-1:-1:-1;;;2476:254:1:o;2735:245::-;2793:6;2846:2;2834:9;2825:7;2821:23;2817:32;2814:52;;;2862:1;2859;2852:12;2814:52;2901:9;2888:23;2920:30;2944:5;2920:30;:::i;2985:249::-;3054:6;3107:2;3095:9;3086:7;3082:23;3078:32;3075:52;;;3123:1;3120;3113:12;3075:52;3155:9;3149:16;3174:30;3198:5;3174:30;:::i;3239:592::-;3310:6;3318;3371:2;3359:9;3350:7;3346:23;3342:32;3339:52;;;3387:1;3384;3377:12;3339:52;3427:9;3414:23;3456:18;3497:2;3489:6;3486:14;3483:34;;;3513:1;3510;3503:12;3483:34;3551:6;3540:9;3536:22;3526:32;;3596:7;3589:4;3585:2;3581:13;3577:27;3567:55;;3618:1;3615;3608:12;3567:55;3658:2;3645:16;3684:2;3676:6;3673:14;3670:34;;;3700:1;3697;3690:12;3670:34;3745:7;3740:2;3731:6;3727:2;3723:15;3719:24;3716:37;3713:57;;;3766:1;3763;3756:12;3713:57;3797:2;3789:11;;;;;3819:6;;-1:-1:-1;3239:592:1;;-1:-1:-1;;;;3239:592:1:o;3836:180::-;3895:6;3948:2;3936:9;3927:7;3923:23;3919:32;3916:52;;;3964:1;3961;3954:12;3916:52;-1:-1:-1;3987:23:1;;3836:180;-1:-1:-1;3836:180:1:o;4021:257::-;4062:3;4100:5;4094:12;4127:6;4122:3;4115:19;4143:63;4199:6;4192:4;4187:3;4183:14;4176:4;4169:5;4165:16;4143:63;:::i;:::-;4260:2;4239:15;-1:-1:-1;;4235:29:1;4226:39;;;;4267:4;4222:50;;4021:257;-1:-1:-1;;4021:257:1:o;4283:470::-;4462:3;4500:6;4494:13;4516:53;4562:6;4557:3;4550:4;4542:6;4538:17;4516:53;:::i;:::-;4632:13;;4591:16;;;;4654:57;4632:13;4591:16;4688:4;4676:17;;4654:57;:::i;:::-;4727:20;;4283:470;-1:-1:-1;;;;4283:470:1:o;5176:488::-;-1:-1:-1;;;;;5445:15:1;;;5427:34;;5497:15;;5492:2;5477:18;;5470:43;5544:2;5529:18;;5522:34;;;5592:3;5587:2;5572:18;;5565:31;;;5370:4;;5613:45;;5638:19;;5630:6;5613:45;:::i;:::-;5605:53;5176:488;-1:-1:-1;;;;;;5176:488:1:o;5861:219::-;6010:2;5999:9;5992:21;5973:4;6030:44;6070:2;6059:9;6055:18;6047:6;6030:44;:::i;7668:356::-;7870:2;7852:21;;;7889:18;;;7882:30;7948:34;7943:2;7928:18;;7921:62;8015:2;8000:18;;7668:356::o;10317:128::-;10357:3;10388:1;10384:6;10381:1;10378:13;10375:39;;;10394:18;;:::i;:::-;-1:-1:-1;10430:9:1;;10317:128::o;10450:168::-;10490:7;10556:1;10552;10548:6;10544:14;10541:1;10538:21;10533:1;10526:9;10519:17;10515:45;10512:71;;;10563:18;;:::i;:::-;-1:-1:-1;10603:9:1;;10450:168::o;10623:258::-;10695:1;10705:113;10719:6;10716:1;10713:13;10705:113;;;10795:11;;;10789:18;10776:11;;;10769:39;10741:2;10734:10;10705:113;;;10836:6;10833:1;10830:13;10827:48;;;-1:-1:-1;;10871:1:1;10853:16;;10846:27;10623:258::o;10886:380::-;10965:1;10961:12;;;;11008;;;11029:61;;11083:4;11075:6;11071:17;11061:27;;11029:61;11136:2;11128:6;11125:14;11105:18;11102:38;11099:161;;;11182:10;11177:3;11173:20;11170:1;11163:31;11217:4;11214:1;11207:15;11245:4;11242:1;11235:15;11099:161;;10886:380;;;:::o;11271:127::-;11332:10;11327:3;11323:20;11320:1;11313:31;11363:4;11360:1;11353:15;11387:4;11384:1;11377:15;11403:127;11464:10;11459:3;11455:20;11452:1;11445:31;11495:4;11492:1;11485:15;11519:4;11516:1;11509:15;11535:131;-1:-1:-1;;;;;;11609:32:1;;11599:43;;11589:71;;11656:1;11653;11646:12
Swarm Source
ipfs://50956cfc7c1877d04880bda143125464ff5ac5e8ee9e9ff76b241c1ae10661be
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.