ETH Price: $3,806.99 (+4.88%)

Token

RKL Rookies (ROOKIES)
 

Overview

Max Total Supply

10,000 ROOKIES

Holders

1,730

Market

Volume (24H)

0.013 ETH

Min Price (24H)

$49.49 @ 0.013000 ETH

Max Price (24H)

$49.49 @ 0.013000 ETH
Balance
15 ROOKIES
0xDc87f26F526505E2d13Cd3d7ECC0e4E1BEDe386C
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
RookiesClaim

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-11
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;

// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

// OpenZeppelin Contracts v4.4.1 (utils/structs/BitMaps.sol)

/**
 * @dev Library for managing uint256 to bool mapping in a compact and efficient way, providing the keys are sequential.
 * Largelly inspired by Uniswap's https://github.com/Uniswap/merkle-distributor/blob/master/contracts/MerkleDistributor.sol[merkle-distributor].
 */
library BitMaps {
    struct BitMap {
        mapping(uint256 => uint256) _data;
    }

    /**
     * @dev Returns whether the bit at `index` is set.
     */
    function get(BitMap storage bitmap, uint256 index) internal view returns (bool) {
        uint256 bucket = index >> 8;
        uint256 mask = 1 << (index & 0xff);
        return bitmap._data[bucket] & mask != 0;
    }

    /**
     * @dev Sets the bit at `index` to the boolean `value`.
     */
    function setTo(
        BitMap storage bitmap,
        uint256 index,
        bool value
    ) internal {
        if (value) {
            set(bitmap, index);
        } else {
            unset(bitmap, index);
        }
    }

    /**
     * @dev Sets the bit at `index`.
     */
    function set(BitMap storage bitmap, uint256 index) internal {
        uint256 bucket = index >> 8;
        uint256 mask = 1 << (index & 0xff);
        bitmap._data[bucket] |= mask;
    }

    /**
     * @dev Unsets the bit at `index`.
     */
    function unset(BitMap storage bitmap, uint256 index) internal {
        uint256 bucket = index >> 8;
        uint256 mask = 1 << (index & 0xff);
        bitmap._data[bucket] &= ~mask;
    }
}

// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // 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;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error TokenDataQueryForNonexistentToken();
error OwnerQueryForNonexistentToken();
error OperatorQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

contract Rookies is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    struct TokenData {
        address owner;
        bytes12 aux;
    }

    uint256 private immutable MAX_SUPPLY;
    uint256 private constant maxBatchSize = 5;

    mapping(uint256 => TokenData) private tokens;

    uint256 public currentSupply;
    string public override name = "RKL Rookies";
    string public override symbol = "ROOKIES";
    string public baseURI;
    address private admin;

    mapping(uint256 => address) private tokenApprovals;
    mapping(address => mapping(address => bool)) private operatorApprovals;

    constructor(uint256 maxSupply) {
        MAX_SUPPLY = maxSupply;
        admin = address(msg.sender);
    }

    /// EFFECTS ///

    function mint(uint256 amount, address to) internal {
        require(currentSupply + amount <= MAX_SUPPLY, "Exceeds max supply");
        _safeMint(to, amount);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    )
        public
        virtual
        override
    {
        TokenData memory token = _tokenData(tokenId);
        if (!_isApprovedOrOwner(_msgSender(), tokenId, token.owner)) {
            revert TransferCallerNotOwnerNorApproved();
        }
        _safeTransfer(from, to, tokenId, token, data);
    }

    function transferFrom(address from, address to, uint256 tokenId)
        public
        virtual
        override
    {
        TokenData memory token = _tokenData(tokenId);
        if (!_isApprovedOrOwner(_msgSender(), tokenId, token.owner)) {
            revert TransferCallerNotOwnerNorApproved();
        }
        _transfer(from, to, tokenId, token);
    }

    function approve(address to, uint256 tokenId) public virtual override {
        TokenData memory token = _tokenData(tokenId);
        address owner = token.owner;
        if (to == owner) {
            revert ApprovalToCurrentOwner();
        }
        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }
        _approve(to, tokenId, token);
    }

    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        if (operator == _msgSender()) {
            revert ApproveToCaller();
        }
        operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        TokenData memory token,
        bytes memory data
    )
        internal
        virtual
    {
        _transfer(from, to, tokenId, token);
        if (to.isContract() && !_checkOnERC721Received(from, to, tokenId, data))
        {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    function _safeMint(address to, uint256 quantity, bytes memory data)
        internal
        virtual
    {
        _mint(to, quantity);
        if (to.isContract()) {
            unchecked {
                for (uint256 i; i < quantity; ++i) {
                    if (
                        !_checkOnERC721Received(address(0), to, currentSupply + i, data)
                    ) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                }
            }
        }
    }

    function _mint(address to, uint256 quantity) internal virtual {
        if (to == address(0)) {
            revert MintToZeroAddress();
        }
        if (quantity == 0) {
            revert MintZeroQuantity();
        }
        unchecked {
            for (uint256 i; i < quantity; ++i) {
                if (i % maxBatchSize == 0) {
                    TokenData storage token = tokens[currentSupply + i];
                    token.owner = to;
                    token.aux =
                        _calculateAux(address(0), to, currentSupply + i, 0);
                }
                emit Transfer(address(0), to, currentSupply + i);
            }
            currentSupply += quantity;
        }
    }

    function _transfer(
        address from,
        address to,
        uint256 tokenId,
        TokenData memory token
    )
        internal
        virtual
    {
        if (token.owner != from) {
            revert TransferFromIncorrectOwner();
        }
        if (to == address(0)) {
            revert TransferToZeroAddress();
        }
        _approve(address(0), tokenId, token);
        unchecked {
            uint256 nextTokenId = tokenId + 1;
            if (_exists(nextTokenId)) {
                TokenData storage nextToken = tokens[nextTokenId];
                if (nextToken.owner == address(0)) {
                    nextToken.owner = token.owner;
                    nextToken.aux = token.aux;
                }
            }
        }
        TokenData storage newToken = tokens[tokenId];
        newToken.owner = to;
        newToken.aux = _calculateAux(from, to, tokenId, token.aux);
        emit Transfer(from, to, tokenId);
    }

    function _approve(address to, uint256 tokenId, TokenData memory token)
        internal
        virtual
    {
        tokenApprovals[tokenId] = to;
        emit Approval(token.owner, to, tokenId);
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    )
        private
        returns (bool)
    {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data)
        returns (bytes4 retval) {
            return retval == IERC721Receiver.onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, "");
    }

    function safeTransferFrom(address from, address to, uint256 tokenId)
        public
        virtual
        override
    {
        safeTransferFrom(from, to, tokenId, "");
    }

    /// INTERNAL READ ///

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return tokenId < currentSupply;
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId, address owner)
        internal
        view
        virtual
        returns (bool)
    {
        return (
            spender == owner || isApprovedForAll(owner, spender)
                || getApproved(tokenId) == spender
        );
    }

    function _tokenData(uint256 tokenId)
        internal
        view
        returns (TokenData storage)
    {
        if (!_exists(tokenId)) {
            revert TokenDataQueryForNonexistentToken();
        }
        TokenData storage token = tokens[tokenId];
        uint256 currentIndex = tokenId;
        while (token.owner == address(0)) {
            unchecked {
                --currentIndex;
            }
            token = tokens[currentIndex];
        }
        return token;
    }

    function _calculateAux(
        address from,
        address to,
        uint256 tokenId,
        bytes12 current
    )
        internal
        view
        virtual
        returns (bytes12)
    {
        return
            from == address(0)
            ? bytes12(
                keccak256(abi.encodePacked(tokenId, to, block.difficulty, block.timestamp))
            )
            : current;
    }

    function setBaseURI(string calldata uri) external {
        require(msg.sender == admin);
        baseURI = uri;
    }

    function renounceOwnership() external {
        require(msg.sender == admin);
        admin = address(0);
    }

    /// PUBLIC READ ///

    function totalSupply() public view returns (uint256) {
        return MAX_SUPPLY;
    }

    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        if (!_exists(tokenId)) {
            revert ApprovalQueryForNonexistentToken();
        }
        return tokenApprovals[tokenId];
    }

    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return operatorApprovals[owner][operator];
    }

    function balanceOf(address owner)
        public
        view
        virtual
        override
        returns (uint256)
    {
        if (owner == address(0)) {
            revert BalanceQueryForZeroAddress();
        }
        uint256 count;
        address lastOwner;
        for (uint256 i; i < currentSupply; ++i) {
            address tokenOwner = tokens[i].owner;
            if (tokenOwner != address(0)) {
                lastOwner = tokenOwner;
            }
            if (lastOwner == owner) {
                ++count;
            }
        }
        return count;
    }

    function ownerOf(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        if (!_exists(tokenId)) {
            revert OwnerQueryForNonexistentToken();
        }
        return _tokenData(tokenId).owner;
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override (ERC165, IERC165)
        returns (bool)
    {
        return interfaceId == type(IERC721).interfaceId
            || interfaceId == type(IERC721Metadata).interfaceId
            || super.supportsInterface(interfaceId);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        if (!_exists(tokenId)) {
            revert URIQueryForNonexistentToken();
        }
        return
            bytes(baseURI).length > 0
            ? string(abi.encodePacked(baseURI, tokenId.toString()))
            : "";
    }
}

contract RookiesClaim is Rookies(10000), ReentrancyGuard {
    using BitMaps for BitMaps.BitMap;

    uint256 public immutable startClaimTimestamp;
    uint256 public immutable endClaimTimestamp;
    uint256 public constant FOUR_WEEKS = 4 * 7 * 24 * 60 * 60;

    BitMaps.BitMap private claimable;
    address private immutable admin;
    address private expiredRookiesClaimer;
    IERC721 private kongs;

    event Claimed(uint256 indexed kongTokenId);

    constructor(uint256 startClaimTmstp, address kongCollection) {
        startClaimTimestamp = startClaimTmstp;
        endClaimTimestamp = startClaimTmstp + FOUR_WEEKS;
        kongs = IERC721(kongCollection);
        admin = msg.sender;
    }

    function redeem(uint256[] calldata kongTokenIds) external nonReentrant {
        require(block.timestamp >= startClaimTimestamp, "Claim not yet started");
        require(block.timestamp <= endClaimTimestamp, "Claim has expired");
        for (uint256 i; i < kongTokenIds.length; i++) {
            require(canClaim(kongTokenIds[i]), "Cannot claim");
            claimable.set(kongTokenIds[i]);
            emit Claimed(kongTokenIds[i]);
        }
        mint(kongTokenIds.length, _msgSender());
    }

    function canClaim(uint256 kongTokenId) public view returns (bool) {
        bool isOwner = kongs.ownerOf(kongTokenId) == _msgSender();
        bool isClaimed = claimable.get(kongTokenId);
        return isOwner && !isClaimed;
    }

    /// Assumes the owner is valid
    /// Useful for checking whether a connected account can claim rookies
    /// on the frontend.
    function canClaimAll(uint256[] calldata kongTokenIds)
        external
        view
        returns (bool[] memory)
    {
        bool[] memory _canClaim = new bool[](kongTokenIds.length);
        for (uint256 i; i < kongTokenIds.length; i++) {
            _canClaim[i] = claimable.get(kongTokenIds[i]);
        }
        return _canClaim;
    }

    /// ADMIN ///

    // to trigger OS to show the collection
    function spawnOneRookie() external {
        require(msg.sender == admin, "Only admin can mint");
        require(claimable.get(0) == false, "Cannot mint again");
        mint(1, msg.sender);
        claimable.set(0);
        emit Claimed(0);
    }

    function setExpiredRookiesClaimer(address _expiredRookiesClaimer)
        external
    {
        require(msg.sender == admin, "Only admin can set expiredRookiesClaimer");
        expiredRookiesClaimer = _expiredRookiesClaimer;
    }

    function adminRedeem(uint256[] calldata kongTokenIds, address to)
        external
    {
        require(
            msg.sender == expiredRookiesClaimer,
            "Only expiredRookiesClaimer can redeem"
        );
        require(
            block.timestamp > endClaimTimestamp, "Claim has not expired yet"
        );
        bool isClaimed;
        for (uint256 i; i < kongTokenIds.length; i++) {
            isClaimed = claimable.get(kongTokenIds[i]);
            require(!isClaimed, "Cannot claim");
            claimable.set(kongTokenIds[i]);
            emit Claimed(kongTokenIds[i]);
        }
        mint(kongTokenIds.length, to);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"startClaimTmstp","type":"uint256"},{"internalType":"address","name":"kongCollection","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenDataQueryForNonexistentToken","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":"kongTokenId","type":"uint256"}],"name":"Claimed","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":"FOUR_WEEKS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"kongTokenIds","type":"uint256[]"},{"internalType":"address","name":"to","type":"address"}],"name":"adminRedeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"kongTokenId","type":"uint256"}],"name":"canClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"kongTokenIds","type":"uint256[]"}],"name":"canClaimAll","outputs":[{"internalType":"bool[]","name":"","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endClaimTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"kongTokenIds","type":"uint256[]"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_expiredRookiesClaimer","type":"address"}],"name":"setExpiredRookiesClaimer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"spawnOneRookie","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startClaimTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]

610140604052600b6101009081526a524b4c20526f6f6b69657360a81b610120526002906200002f908262000192565b50604080518082019091526007815266524f4f4b49455360c81b60208201526003906200005d908262000192565b503480156200006b57600080fd5b50604051620022ca380380620022ca8339810160408190526200008e916200025e565b612710608052600580546001600160a01b03191633179055600160085560a0829052620000bf6224ea00836200029d565b60c052600b80546001600160a01b0319166001600160a01b0392909216919091179055503360e052620002c4565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200011857607f821691505b6020821081036200013957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200018d57600081815260208120601f850160051c81016020861015620001685750805b601f850160051c820191505b81811015620001895782815560010162000174565b5050505b505050565b81516001600160401b03811115620001ae57620001ae620000ed565b620001c681620001bf845462000103565b846200013f565b602080601f831160018114620001fe5760008415620001e55750858301515b600019600386901b1c1916600185901b17855562000189565b600085815260208120601f198616915b828110156200022f578886015182559484019460019091019084016200020e565b50858210156200024e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600080604083850312156200027257600080fd5b825160208401519092506001600160a01b03811681146200029257600080fd5b809150509250929050565b60008219821115620002bf57634e487b7160e01b600052601160045260246000fd5b500190565b60805160a05160c05160e051611fa96200032160003960008181610695015261087c01526000818161030e01528181610a2c0152610f040152600081816103a10152610e9c01526000818161022d01526113000152611fa96000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c8063771282f6116100f9578063b88d4fde11610097578063d1e5587e11610071578063d1e5587e1461039c578063e985e9c5146103c3578063f6d6189e146103ff578063f9afb26a1461040957600080fd5b8063b88d4fde14610363578063c87b56dd14610376578063c95c0d891461038957600080fd5b80639737dd9d116100d35780639737dd9d146102f6578063a0ed264614610309578063a22cb46514610330578063ad3096521461034357600080fd5b8063771282f6146102dd57806387621bcb146102e657806395d89b41146102ee57600080fd5b806342842e0e116101665780636352211e116101405780636352211e146102a75780636c0360eb146102ba57806370a08231146102c2578063715018a6146102d557600080fd5b806342842e0e1461026e57806348ff28b61461028157806355f804b31461029457600080fd5b806301ffc9a7146101ae57806306fdde03146101d6578063081812fc146101eb578063095ea7b31461021657806318160ddd1461022b57806323b872dd1461025b575b600080fd5b6101c16101bc366004611835565b61041c565b60405190151581526020015b60405180910390f35b6101de61046e565b6040516101cd91906118b1565b6101fe6101f93660046118c4565b6104fc565b6040516001600160a01b0390911681526020016101cd565b6102296102243660046118f2565b610542565b005b7f00000000000000000000000000000000000000000000000000000000000000005b6040519081526020016101cd565b61022961026936600461191e565b6105f6565b61022961027c36600461191e565b61066a565b61022961028f36600461195f565b61068a565b6102296102a236600461197c565b61073a565b6101fe6102b53660046118c4565b61075e565b6101de6107a1565b61024d6102d036600461195f565b6107ae565b610229610848565b61024d60015481565b610229610871565b6101de6109b5565b610229610304366004611a3a565b6109c2565b61024d7f000000000000000000000000000000000000000000000000000000000000000081565b61022961033e366004611a91565b610b9e565b610356610351366004611acf565b610c33565b6040516101cd9190611b11565b610229610371366004611b6d565b610cd8565b6101de6103843660046118c4565b610d54565b6101c16103973660046118c4565b610dda565b61024d7f000000000000000000000000000000000000000000000000000000000000000081565b6101c16103d1366004611c4d565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b61024d6224ea0081565b610229610417366004611acf565b610e92565b60006001600160e01b031982166380ac58cd60e01b148061044d57506001600160e01b03198216635b5e139f60e01b145b8061046857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6002805461047b90611c7b565b80601f01602080910402602001604051908101604052809291908181526020018280546104a790611c7b565b80156104f45780601f106104c9576101008083540402835291602001916104f4565b820191906000526020600020905b8154815290600101906020018083116104d757829003601f168201915b505050505081565b6000610509826001541190565b610526576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061054d82611052565b6040805180820190915290546001600160a01b03808216808452600160a01b90920460a01b6001600160a01b03191660208401529192509084168190036105a75760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906105c757506105c581336103d1565b155b156105e5576040516367d9dca160e11b815260040160405180910390fd5b6105f08484846110bb565b50505050565b600061060182611052565b6040805180820190915290546001600160a01b0381168252600160a01b900460a01b6001600160a01b03191660208201529050610641338251849061111c565b61065e57604051632ce44b5f60e11b815260040160405180910390fd5b6105f08484848461118e565b61068583838360405180602001604052806000815250610cd8565b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107185760405162461bcd60e51b815260206004820152602860248201527f4f6e6c792061646d696e2063616e207365742065787069726564526f6f6b696560448201526739a1b630b4b6b2b960c11b60648201526084015b60405180910390fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461075157600080fd5b6004610685828483611d03565b600061076b826001541190565b61078857604051636f96cda160e11b815260040160405180910390fd5b61079182611052565b546001600160a01b031692915050565b6004805461047b90611c7b565b60006001600160a01b0382166107d7576040516323d3ad8160e21b815260040160405180910390fd5b60008060005b60015481101561083f576000818152602081905260409020546001600160a01b03168015610809578092505b856001600160a01b0316836001600160a01b03160361082e5761082b84611dd9565b93505b5061083881611dd9565b90506107dd565b50909392505050565b6005546001600160a01b0316331461085f57600080fd5b600580546001600160a01b0319169055565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108df5760405162461bcd60e51b815260206004820152601360248201527213db9b1e4818591b5a5b8818d85b881b5a5b9d606a1b604482015260640161070f565b6000805260096020527fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b546001161561094e5760405162461bcd60e51b815260206004820152601160248201527021b0b73737ba1036b4b73a1030b3b0b4b760791b604482015260640161070f565b6109596001336112fe565b600080805260096020527fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b805460011790556040517f7a355715549cfe7c1cba26304350343fbddc4b4f72d3ce3e7c27117dd20b5cb8908290a2565b6003805461047b90611c7b565b600a546001600160a01b03163314610a2a5760405162461bcd60e51b815260206004820152602560248201527f4f6e6c792065787069726564526f6f6b696573436c61696d65722063616e2072604482015264656465656d60d81b606482015260840161070f565b7f00000000000000000000000000000000000000000000000000000000000000004211610a995760405162461bcd60e51b815260206004820152601960248201527f436c61696d20686173206e6f7420657870697265642079657400000000000000604482015260640161070f565b6000805b83811015610b9357610ad1858583818110610aba57610aba611df2565b9050602002013560096112da90919063ffffffff16565b91508115610b105760405162461bcd60e51b815260206004820152600c60248201526b43616e6e6f7420636c61696d60a01b604482015260640161070f565b610b3c858583818110610b2557610b25611df2565b90506020020135600961137a90919063ffffffff16565b848482818110610b4e57610b4e611df2565b905060200201357f7a355715549cfe7c1cba26304350343fbddc4b4f72d3ce3e7c27117dd20b5cb860405160405180910390a280610b8b81611dd9565b915050610a9d565b506105f083836112fe565b336001600160a01b03831603610bc75760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b606060008267ffffffffffffffff811115610c5057610c50611b57565b604051908082528060200260200182016040528015610c79578160200160208202803683370190505b50905060005b83811015610cd057610c9c858583818110610aba57610aba611df2565b828281518110610cae57610cae611df2565b9115156020928302919091019091015280610cc881611dd9565b915050610c7f565b509392505050565b6000610ce383611052565b6040805180820190915290546001600160a01b0381168252600160a01b900460a01b6001600160a01b03191660208201529050610d23338251859061111c565b610d4057604051632ce44b5f60e11b815260040160405180910390fd5b610d4d85858584866113a3565b5050505050565b6060610d61826001541190565b610d7e57604051630a14c4b560e41b815260040160405180910390fd5b600060048054610d8d90611c7b565b905011610da95760405180602001604052806000815250610468565b6004610db4836113ef565b604051602001610dc5929190611e08565b60405160208183030381529060405292915050565b60008033600b546040516331a9108f60e11b8152600481018690526001600160a01b039283169290911690636352211e90602401602060405180830381865afa158015610e2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4f9190611e8f565b600885901c6000908152600960205260409020546001600160a01b0391909116919091149150600160ff85161b161515818015610e8a575080155b949350505050565b610e9a6114f0565b7f0000000000000000000000000000000000000000000000000000000000000000421015610f025760405162461bcd60e51b815260206004820152601560248201527410db185a5b481b9bdd081e595d081cdd185c9d1959605a1b604482015260640161070f565b7f0000000000000000000000000000000000000000000000000000000000000000421115610f665760405162461bcd60e51b815260206004820152601160248201527010db185a5b481a185cc8195e1c1a5c9959607a1b604482015260640161070f565b60005b8181101561103957610f92838383818110610f8657610f86611df2565b90506020020135610dda565b610fcd5760405162461bcd60e51b815260206004820152600c60248201526b43616e6e6f7420636c61696d60a01b604482015260640161070f565b610fe2838383818110610b2557610b25611df2565b828282818110610ff457610ff4611df2565b905060200201357f7a355715549cfe7c1cba26304350343fbddc4b4f72d3ce3e7c27117dd20b5cb860405160405180910390a28061103181611dd9565b915050610f69565b5061104481336112fe565b61104e6001600855565b5050565b600061105f826001541190565b61107c576040516319086e6360e11b815260040160405180910390fd5b6000828152602081905260409020825b81546001600160a01b03166110b457600019016000818152602081905260409020915061108c565b5092915050565b60008281526006602052604080822080546001600160a01b0319166001600160a01b038781169182179092558451925186949193909216917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a4505050565b6000816001600160a01b0316846001600160a01b0316148061116357506001600160a01b0380831660009081526007602090815260408083209388168352929052205460ff165b80610e8a5750836001600160a01b031661117c846104fc565b6001600160a01b031614949350505050565b836001600160a01b031681600001516001600160a01b0316146111c35760405162a1148160e81b815260040160405180910390fd5b6001600160a01b0383166111ea57604051633a954ecd60e21b815260040160405180910390fd5b6111f6600083836110bb565b60018201611205816001541190565b1561124857600081815260208190526040902080546001600160a01b0316611246578251602084015160a01c600160a01b026001600160a01b039091161781555b505b5060008281526020818152604090912080546001600160a01b0319166001600160a01b0386161781559082015161128490869086908690611549565b815460a09190911c600160a01b026001600160a01b03918216178255604051849186811691908816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90600090a45050505050565b600881901c600090815260208390526040902054600160ff83161b16151592915050565b7f00000000000000000000000000000000000000000000000000000000000000008260015461132d9190611eac565b11156113705760405162461bcd60e51b815260206004820152601260248201527145786365656473206d617820737570706c7960701b604482015260640161070f565b61104e81836115b5565b600881901c600090815260209290925260409091208054600160ff9093169290921b9091179055565b6113af8585858561118e565b6001600160a01b0384163b151580156113d157506113cf858585846115cf565b155b15610d4d576040516368d2bf6b60e11b815260040160405180910390fd5b6060816000036114165750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611440578061142a81611dd9565b91506114399050600a83611eda565b915061141a565b60008167ffffffffffffffff81111561145b5761145b611b57565b6040519080825280601f01601f191660200182016040528015611485576020820181803683370190505b5090505b8415610e8a5761149a600183611eee565b91506114a7600a86611f05565b6114b2906030611eac565b60f81b8183815181106114c7576114c7611df2565b60200101906001600160f81b031916908160001a9053506114e9600a86611eda565b9450611489565b6002600854036115425760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161070f565b6002600855565b60006001600160a01b0385161561156057816115ac565b60408051602081018590526bffffffffffffffffffffffff19606087901b1691810191909152446054820152426074820152609401604051602081830303815290604052805190602001205b95945050505050565b61104e8282604051806020016040528060008152506116b7565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611604903390899088908890600401611f19565b6020604051808303816000875af192505050801561163f575060408051601f3d908101601f1916820190925261163c91810190611f56565b60015b61169d573d80801561166d576040519150601f19603f3d011682016040523d82523d6000602084013e611672565b606091505b508051600003611695576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610e8a565b6116c18383611712565b6001600160a01b0383163b156106855760005b828110156105f0576116ed6000858360015401856115cf565b61170a576040516368d2bf6b60e11b815260040160405180910390fd5b6001016116d4565b6001600160a01b03821661173857604051622e076360e81b815260040160405180910390fd5b806000036117595760405163b562e8dd60e01b815260040160405180910390fd5b60005b8181101561180f57600581066000036117ca57600180548201600090815260208190526040812080546001600160a01b0319166001600160a01b03871617815591546117ad91908690850182611549565b815460a09190911c600160a01b026001600160a01b039091161790555b600154604051908201906001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a460010161175c565b5060018054909101905550565b6001600160e01b03198116811461183257600080fd5b50565b60006020828403121561184757600080fd5b81356118528161181c565b9392505050565b60005b8381101561187457818101518382015260200161185c565b838111156105f05750506000910152565b6000815180845261189d816020860160208601611859565b601f01601f19169290920160200192915050565b6020815260006118526020830184611885565b6000602082840312156118d657600080fd5b5035919050565b6001600160a01b038116811461183257600080fd5b6000806040838503121561190557600080fd5b8235611910816118dd565b946020939093013593505050565b60008060006060848603121561193357600080fd5b833561193e816118dd565b9250602084013561194e816118dd565b929592945050506040919091013590565b60006020828403121561197157600080fd5b8135611852816118dd565b6000806020838503121561198f57600080fd5b823567ffffffffffffffff808211156119a757600080fd5b818501915085601f8301126119bb57600080fd5b8135818111156119ca57600080fd5b8660208285010111156119dc57600080fd5b60209290920196919550909350505050565b60008083601f840112611a0057600080fd5b50813567ffffffffffffffff811115611a1857600080fd5b6020830191508360208260051b8501011115611a3357600080fd5b9250929050565b600080600060408486031215611a4f57600080fd5b833567ffffffffffffffff811115611a6657600080fd5b611a72868287016119ee565b9094509250506020840135611a86816118dd565b809150509250925092565b60008060408385031215611aa457600080fd5b8235611aaf816118dd565b915060208301358015158114611ac457600080fd5b809150509250929050565b60008060208385031215611ae257600080fd5b823567ffffffffffffffff811115611af957600080fd5b611b05858286016119ee565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b81811015611b4b578351151583529284019291840191600101611b2d565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215611b8357600080fd5b8435611b8e816118dd565b93506020850135611b9e816118dd565b925060408501359150606085013567ffffffffffffffff80821115611bc257600080fd5b818701915087601f830112611bd657600080fd5b813581811115611be857611be8611b57565b604051601f8201601f19908116603f01168101908382118183101715611c1057611c10611b57565b816040528281528a6020848701011115611c2957600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611c6057600080fd5b8235611c6b816118dd565b91506020830135611ac4816118dd565b600181811c90821680611c8f57607f821691505b602082108103611caf57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561068557600081815260208120601f850160051c81016020861015611cdc5750805b601f850160051c820191505b81811015611cfb57828155600101611ce8565b505050505050565b67ffffffffffffffff831115611d1b57611d1b611b57565b611d2f83611d298354611c7b565b83611cb5565b6000601f841160018114611d635760008515611d4b5750838201355b600019600387901b1c1916600186901b178355610d4d565b600083815260209020601f19861690835b82811015611d945786850135825560209485019460019092019101611d74565b5086821015611db15760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b634e487b7160e01b600052601160045260246000fd5b600060018201611deb57611deb611dc3565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6000808454611e1681611c7b565b60018281168015611e2e5760018114611e4357611e72565b60ff1984168752821515830287019450611e72565b8860005260208060002060005b85811015611e695781548a820152908401908201611e50565b50505082870194505b505050508351611e86818360208801611859565b01949350505050565b600060208284031215611ea157600080fd5b8151611852816118dd565b60008219821115611ebf57611ebf611dc3565b500190565b634e487b7160e01b600052601260045260246000fd5b600082611ee957611ee9611ec4565b500490565b600082821015611f0057611f00611dc3565b500390565b600082611f1457611f14611ec4565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611f4c90830184611885565b9695505050505050565b600060208284031215611f6857600080fd5b81516118528161181c56fea26469706673582212202b85ee69c3f5896ee4f953d2f40c43f94d8e36e820fa09f82bd8a7559ddea2bc64736f6c634300080f00330000000000000000000000000000000000000000000000000000000062f52780000000000000000000000000ef0182dc0574cd5874494a120750fd222fdb909a

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101a95760003560e01c8063771282f6116100f9578063b88d4fde11610097578063d1e5587e11610071578063d1e5587e1461039c578063e985e9c5146103c3578063f6d6189e146103ff578063f9afb26a1461040957600080fd5b8063b88d4fde14610363578063c87b56dd14610376578063c95c0d891461038957600080fd5b80639737dd9d116100d35780639737dd9d146102f6578063a0ed264614610309578063a22cb46514610330578063ad3096521461034357600080fd5b8063771282f6146102dd57806387621bcb146102e657806395d89b41146102ee57600080fd5b806342842e0e116101665780636352211e116101405780636352211e146102a75780636c0360eb146102ba57806370a08231146102c2578063715018a6146102d557600080fd5b806342842e0e1461026e57806348ff28b61461028157806355f804b31461029457600080fd5b806301ffc9a7146101ae57806306fdde03146101d6578063081812fc146101eb578063095ea7b31461021657806318160ddd1461022b57806323b872dd1461025b575b600080fd5b6101c16101bc366004611835565b61041c565b60405190151581526020015b60405180910390f35b6101de61046e565b6040516101cd91906118b1565b6101fe6101f93660046118c4565b6104fc565b6040516001600160a01b0390911681526020016101cd565b6102296102243660046118f2565b610542565b005b7f00000000000000000000000000000000000000000000000000000000000027105b6040519081526020016101cd565b61022961026936600461191e565b6105f6565b61022961027c36600461191e565b61066a565b61022961028f36600461195f565b61068a565b6102296102a236600461197c565b61073a565b6101fe6102b53660046118c4565b61075e565b6101de6107a1565b61024d6102d036600461195f565b6107ae565b610229610848565b61024d60015481565b610229610871565b6101de6109b5565b610229610304366004611a3a565b6109c2565b61024d7f00000000000000000000000000000000000000000000000000000000631a118081565b61022961033e366004611a91565b610b9e565b610356610351366004611acf565b610c33565b6040516101cd9190611b11565b610229610371366004611b6d565b610cd8565b6101de6103843660046118c4565b610d54565b6101c16103973660046118c4565b610dda565b61024d7f0000000000000000000000000000000000000000000000000000000062f5278081565b6101c16103d1366004611c4d565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b61024d6224ea0081565b610229610417366004611acf565b610e92565b60006001600160e01b031982166380ac58cd60e01b148061044d57506001600160e01b03198216635b5e139f60e01b145b8061046857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6002805461047b90611c7b565b80601f01602080910402602001604051908101604052809291908181526020018280546104a790611c7b565b80156104f45780601f106104c9576101008083540402835291602001916104f4565b820191906000526020600020905b8154815290600101906020018083116104d757829003601f168201915b505050505081565b6000610509826001541190565b610526576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061054d82611052565b6040805180820190915290546001600160a01b03808216808452600160a01b90920460a01b6001600160a01b03191660208401529192509084168190036105a75760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906105c757506105c581336103d1565b155b156105e5576040516367d9dca160e11b815260040160405180910390fd5b6105f08484846110bb565b50505050565b600061060182611052565b6040805180820190915290546001600160a01b0381168252600160a01b900460a01b6001600160a01b03191660208201529050610641338251849061111c565b61065e57604051632ce44b5f60e11b815260040160405180910390fd5b6105f08484848461118e565b61068583838360405180602001604052806000815250610cd8565b505050565b336001600160a01b037f000000000000000000000000000000724350d0b24747bd816dc5031acb7efe0b16146107185760405162461bcd60e51b815260206004820152602860248201527f4f6e6c792061646d696e2063616e207365742065787069726564526f6f6b696560448201526739a1b630b4b6b2b960c11b60648201526084015b60405180910390fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461075157600080fd5b6004610685828483611d03565b600061076b826001541190565b61078857604051636f96cda160e11b815260040160405180910390fd5b61079182611052565b546001600160a01b031692915050565b6004805461047b90611c7b565b60006001600160a01b0382166107d7576040516323d3ad8160e21b815260040160405180910390fd5b60008060005b60015481101561083f576000818152602081905260409020546001600160a01b03168015610809578092505b856001600160a01b0316836001600160a01b03160361082e5761082b84611dd9565b93505b5061083881611dd9565b90506107dd565b50909392505050565b6005546001600160a01b0316331461085f57600080fd5b600580546001600160a01b0319169055565b336001600160a01b037f000000000000000000000000000000724350d0b24747bd816dc5031acb7efe0b16146108df5760405162461bcd60e51b815260206004820152601360248201527213db9b1e4818591b5a5b8818d85b881b5a5b9d606a1b604482015260640161070f565b6000805260096020527fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b546001161561094e5760405162461bcd60e51b815260206004820152601160248201527021b0b73737ba1036b4b73a1030b3b0b4b760791b604482015260640161070f565b6109596001336112fe565b600080805260096020527fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b805460011790556040517f7a355715549cfe7c1cba26304350343fbddc4b4f72d3ce3e7c27117dd20b5cb8908290a2565b6003805461047b90611c7b565b600a546001600160a01b03163314610a2a5760405162461bcd60e51b815260206004820152602560248201527f4f6e6c792065787069726564526f6f6b696573436c61696d65722063616e2072604482015264656465656d60d81b606482015260840161070f565b7f00000000000000000000000000000000000000000000000000000000631a11804211610a995760405162461bcd60e51b815260206004820152601960248201527f436c61696d20686173206e6f7420657870697265642079657400000000000000604482015260640161070f565b6000805b83811015610b9357610ad1858583818110610aba57610aba611df2565b9050602002013560096112da90919063ffffffff16565b91508115610b105760405162461bcd60e51b815260206004820152600c60248201526b43616e6e6f7420636c61696d60a01b604482015260640161070f565b610b3c858583818110610b2557610b25611df2565b90506020020135600961137a90919063ffffffff16565b848482818110610b4e57610b4e611df2565b905060200201357f7a355715549cfe7c1cba26304350343fbddc4b4f72d3ce3e7c27117dd20b5cb860405160405180910390a280610b8b81611dd9565b915050610a9d565b506105f083836112fe565b336001600160a01b03831603610bc75760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b606060008267ffffffffffffffff811115610c5057610c50611b57565b604051908082528060200260200182016040528015610c79578160200160208202803683370190505b50905060005b83811015610cd057610c9c858583818110610aba57610aba611df2565b828281518110610cae57610cae611df2565b9115156020928302919091019091015280610cc881611dd9565b915050610c7f565b509392505050565b6000610ce383611052565b6040805180820190915290546001600160a01b0381168252600160a01b900460a01b6001600160a01b03191660208201529050610d23338251859061111c565b610d4057604051632ce44b5f60e11b815260040160405180910390fd5b610d4d85858584866113a3565b5050505050565b6060610d61826001541190565b610d7e57604051630a14c4b560e41b815260040160405180910390fd5b600060048054610d8d90611c7b565b905011610da95760405180602001604052806000815250610468565b6004610db4836113ef565b604051602001610dc5929190611e08565b60405160208183030381529060405292915050565b60008033600b546040516331a9108f60e11b8152600481018690526001600160a01b039283169290911690636352211e90602401602060405180830381865afa158015610e2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4f9190611e8f565b600885901c6000908152600960205260409020546001600160a01b0391909116919091149150600160ff85161b161515818015610e8a575080155b949350505050565b610e9a6114f0565b7f0000000000000000000000000000000000000000000000000000000062f52780421015610f025760405162461bcd60e51b815260206004820152601560248201527410db185a5b481b9bdd081e595d081cdd185c9d1959605a1b604482015260640161070f565b7f00000000000000000000000000000000000000000000000000000000631a1180421115610f665760405162461bcd60e51b815260206004820152601160248201527010db185a5b481a185cc8195e1c1a5c9959607a1b604482015260640161070f565b60005b8181101561103957610f92838383818110610f8657610f86611df2565b90506020020135610dda565b610fcd5760405162461bcd60e51b815260206004820152600c60248201526b43616e6e6f7420636c61696d60a01b604482015260640161070f565b610fe2838383818110610b2557610b25611df2565b828282818110610ff457610ff4611df2565b905060200201357f7a355715549cfe7c1cba26304350343fbddc4b4f72d3ce3e7c27117dd20b5cb860405160405180910390a28061103181611dd9565b915050610f69565b5061104481336112fe565b61104e6001600855565b5050565b600061105f826001541190565b61107c576040516319086e6360e11b815260040160405180910390fd5b6000828152602081905260409020825b81546001600160a01b03166110b457600019016000818152602081905260409020915061108c565b5092915050565b60008281526006602052604080822080546001600160a01b0319166001600160a01b038781169182179092558451925186949193909216917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a4505050565b6000816001600160a01b0316846001600160a01b0316148061116357506001600160a01b0380831660009081526007602090815260408083209388168352929052205460ff165b80610e8a5750836001600160a01b031661117c846104fc565b6001600160a01b031614949350505050565b836001600160a01b031681600001516001600160a01b0316146111c35760405162a1148160e81b815260040160405180910390fd5b6001600160a01b0383166111ea57604051633a954ecd60e21b815260040160405180910390fd5b6111f6600083836110bb565b60018201611205816001541190565b1561124857600081815260208190526040902080546001600160a01b0316611246578251602084015160a01c600160a01b026001600160a01b039091161781555b505b5060008281526020818152604090912080546001600160a01b0319166001600160a01b0386161781559082015161128490869086908690611549565b815460a09190911c600160a01b026001600160a01b03918216178255604051849186811691908816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90600090a45050505050565b600881901c600090815260208390526040902054600160ff83161b16151592915050565b7f00000000000000000000000000000000000000000000000000000000000027108260015461132d9190611eac565b11156113705760405162461bcd60e51b815260206004820152601260248201527145786365656473206d617820737570706c7960701b604482015260640161070f565b61104e81836115b5565b600881901c600090815260209290925260409091208054600160ff9093169290921b9091179055565b6113af8585858561118e565b6001600160a01b0384163b151580156113d157506113cf858585846115cf565b155b15610d4d576040516368d2bf6b60e11b815260040160405180910390fd5b6060816000036114165750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611440578061142a81611dd9565b91506114399050600a83611eda565b915061141a565b60008167ffffffffffffffff81111561145b5761145b611b57565b6040519080825280601f01601f191660200182016040528015611485576020820181803683370190505b5090505b8415610e8a5761149a600183611eee565b91506114a7600a86611f05565b6114b2906030611eac565b60f81b8183815181106114c7576114c7611df2565b60200101906001600160f81b031916908160001a9053506114e9600a86611eda565b9450611489565b6002600854036115425760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161070f565b6002600855565b60006001600160a01b0385161561156057816115ac565b60408051602081018590526bffffffffffffffffffffffff19606087901b1691810191909152446054820152426074820152609401604051602081830303815290604052805190602001205b95945050505050565b61104e8282604051806020016040528060008152506116b7565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611604903390899088908890600401611f19565b6020604051808303816000875af192505050801561163f575060408051601f3d908101601f1916820190925261163c91810190611f56565b60015b61169d573d80801561166d576040519150601f19603f3d011682016040523d82523d6000602084013e611672565b606091505b508051600003611695576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610e8a565b6116c18383611712565b6001600160a01b0383163b156106855760005b828110156105f0576116ed6000858360015401856115cf565b61170a576040516368d2bf6b60e11b815260040160405180910390fd5b6001016116d4565b6001600160a01b03821661173857604051622e076360e81b815260040160405180910390fd5b806000036117595760405163b562e8dd60e01b815260040160405180910390fd5b60005b8181101561180f57600581066000036117ca57600180548201600090815260208190526040812080546001600160a01b0319166001600160a01b03871617815591546117ad91908690850182611549565b815460a09190911c600160a01b026001600160a01b039091161790555b600154604051908201906001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a460010161175c565b5060018054909101905550565b6001600160e01b03198116811461183257600080fd5b50565b60006020828403121561184757600080fd5b81356118528161181c565b9392505050565b60005b8381101561187457818101518382015260200161185c565b838111156105f05750506000910152565b6000815180845261189d816020860160208601611859565b601f01601f19169290920160200192915050565b6020815260006118526020830184611885565b6000602082840312156118d657600080fd5b5035919050565b6001600160a01b038116811461183257600080fd5b6000806040838503121561190557600080fd5b8235611910816118dd565b946020939093013593505050565b60008060006060848603121561193357600080fd5b833561193e816118dd565b9250602084013561194e816118dd565b929592945050506040919091013590565b60006020828403121561197157600080fd5b8135611852816118dd565b6000806020838503121561198f57600080fd5b823567ffffffffffffffff808211156119a757600080fd5b818501915085601f8301126119bb57600080fd5b8135818111156119ca57600080fd5b8660208285010111156119dc57600080fd5b60209290920196919550909350505050565b60008083601f840112611a0057600080fd5b50813567ffffffffffffffff811115611a1857600080fd5b6020830191508360208260051b8501011115611a3357600080fd5b9250929050565b600080600060408486031215611a4f57600080fd5b833567ffffffffffffffff811115611a6657600080fd5b611a72868287016119ee565b9094509250506020840135611a86816118dd565b809150509250925092565b60008060408385031215611aa457600080fd5b8235611aaf816118dd565b915060208301358015158114611ac457600080fd5b809150509250929050565b60008060208385031215611ae257600080fd5b823567ffffffffffffffff811115611af957600080fd5b611b05858286016119ee565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b81811015611b4b578351151583529284019291840191600101611b2d565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215611b8357600080fd5b8435611b8e816118dd565b93506020850135611b9e816118dd565b925060408501359150606085013567ffffffffffffffff80821115611bc257600080fd5b818701915087601f830112611bd657600080fd5b813581811115611be857611be8611b57565b604051601f8201601f19908116603f01168101908382118183101715611c1057611c10611b57565b816040528281528a6020848701011115611c2957600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611c6057600080fd5b8235611c6b816118dd565b91506020830135611ac4816118dd565b600181811c90821680611c8f57607f821691505b602082108103611caf57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561068557600081815260208120601f850160051c81016020861015611cdc5750805b601f850160051c820191505b81811015611cfb57828155600101611ce8565b505050505050565b67ffffffffffffffff831115611d1b57611d1b611b57565b611d2f83611d298354611c7b565b83611cb5565b6000601f841160018114611d635760008515611d4b5750838201355b600019600387901b1c1916600186901b178355610d4d565b600083815260209020601f19861690835b82811015611d945786850135825560209485019460019092019101611d74565b5086821015611db15760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b634e487b7160e01b600052601160045260246000fd5b600060018201611deb57611deb611dc3565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6000808454611e1681611c7b565b60018281168015611e2e5760018114611e4357611e72565b60ff1984168752821515830287019450611e72565b8860005260208060002060005b85811015611e695781548a820152908401908201611e50565b50505082870194505b505050508351611e86818360208801611859565b01949350505050565b600060208284031215611ea157600080fd5b8151611852816118dd565b60008219821115611ebf57611ebf611dc3565b500190565b634e487b7160e01b600052601260045260246000fd5b600082611ee957611ee9611ec4565b500490565b600082821015611f0057611f00611dc3565b500390565b600082611f1457611f14611ec4565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611f4c90830184611885565b9695505050505050565b600060208284031215611f6857600080fd5b81516118528161181c56fea26469706673582212202b85ee69c3f5896ee4f953d2f40c43f94d8e36e820fa09f82bd8a7559ddea2bc64736f6c634300080f0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000000000000000000062f52780000000000000000000000000ef0182dc0574cd5874494a120750fd222fdb909a

-----Decoded View---------------
Arg [0] : startClaimTmstp (uint256): 1660233600
Arg [1] : kongCollection (address): 0xEf0182dc0574cd5874494a120750FD222FdB909a

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000062f52780
Arg [1] : 000000000000000000000000ef0182dc0574cd5874494a120750fd222fdb909a


Deployed Bytecode Sourcemap

36313:3233:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35570:343;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;35570:343:0;;;;;;;;26191:43;;;:::i;:::-;;;;;;;:::i;34155:285::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;34155:285:0;1528:203:1;27633:443:0;;;;;;:::i;:::-;;:::i;:::-;;34058:89;34129:10;34058:89;;;2338:25:1;;;2326:2;2311:18;34058:89:0;2192:177:1;27255:370:0;;;;;;:::i;:::-;;:::i;32169:183::-;;;;;;:::i;:::-;;:::i;38631:237::-;;;;;;:::i;:::-;;:::i;33780:121::-;;;;;;:::i;:::-;;:::i;35282:280::-;;;;;;:::i;:::-;;:::i;26289:21::-;;;:::i;34669:605::-;;;;;;:::i;:::-;;:::i;33909:114::-;;;:::i;26156:28::-;;;;;;38369:254;;;:::i;26241:41::-;;;:::i;38876:667::-;;;;;;:::i;:::-;;:::i;36469:42::-;;;;;28084:342;;;;;;:::i;:::-;;:::i;37940:355::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;26801:446::-;;;;;;:::i;:::-;;:::i;35921:385::-;;;;;;:::i;:::-;;:::i;37560:235::-;;;;;;:::i;:::-;;:::i;36418:44::-;;;;;34448:213;;;;;;:::i;:::-;-1:-1:-1;;;;;34619:24:0;;;34590:4;34619:24;;;:17;:24;;;;;;;;:34;;;;;;;;;;;;;;;34448:213;36518:57;;36555:20;36518:57;;37041:511;;;;;;:::i;:::-;;:::i;35570:343::-;35718:4;-1:-1:-1;;;;;;35747:40:0;;-1:-1:-1;;;35747:40:0;;:105;;-1:-1:-1;;;;;;;35804:48:0;;-1:-1:-1;;;35804:48:0;35747:105;:158;;;-1:-1:-1;;;;;;;;;;25174:40:0;;;35869:36;35740:165;35570:343;-1:-1:-1;;35570:343:0:o;26191:43::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34155:285::-;34276:7;34306:16;34314:7;32488:13;;-1:-1:-1;32478:23:0;32389:120;34306:16;34301:91;;34346:34;;-1:-1:-1;;;34346:34:0;;;;;;;;;;;34301:91;-1:-1:-1;34409:23:0;;;;:14;:23;;;;;;-1:-1:-1;;;;;34409:23:0;;34155:285::o;27633:443::-;27714:22;27739:19;27750:7;27739:10;:19::i;:::-;27714:44;;;;;;;;;;;-1:-1:-1;;;;;27714:44:0;;;;;;-1:-1:-1;;;27714:44:0;;;;;-1:-1:-1;;;;;;27714:44:0;;;;;;;-1:-1:-1;27714:44:0;27811:11;;;;;27807:75;;27846:24;;-1:-1:-1;;;27846:24:0;;;;;;;;;;;27807:75;21750:10;-1:-1:-1;;;;;27896:21:0;;;;;;:63;;-1:-1:-1;27922:37:0;27939:5;21750:10;34448:213;:::i;27922:37::-;27921:38;27896:63;27892:138;;;27983:35;;-1:-1:-1;;;27983:35:0;;;;;;;;;;;27892:138;28040:28;28049:2;28053:7;28062:5;28040:8;:28::i;:::-;27703:373;;27633:443;;:::o;27255:370::-;27387:22;27412:19;27423:7;27412:10;:19::i;:::-;27387:44;;;;;;;;;;;-1:-1:-1;;;;;27387:44:0;;;;-1:-1:-1;;;27387:44:0;;;;-1:-1:-1;;;;;;27387:44:0;;;;;;-1:-1:-1;27447:54:0;21750:10;27489:11;;27480:7;;27447:18;:54::i;:::-;27442:130;;27525:35;;-1:-1:-1;;;27525:35:0;;;;;;;;;;;27442:130;27582:35;27592:4;27598:2;27602:7;27611:5;27582:9;:35::i;32169:183::-;32305:39;32322:4;32328:2;32332:7;32305:39;;;;;;;;;;;;:16;:39::i;:::-;32169:183;;;:::o;38631:237::-;38739:10;-1:-1:-1;;;;;38753:5:0;38739:19;;38731:72;;;;-1:-1:-1;;;38731:72:0;;8526:2:1;38731:72:0;;;8508:21:1;8565:2;8545:18;;;8538:30;8604:34;8584:18;;;8577:62;-1:-1:-1;;;8655:18:1;;;8648:38;8703:19;;38731:72:0;;;;;;;;;38814:21;:46;;-1:-1:-1;;;;;;38814:46:0;-1:-1:-1;;;;;38814:46:0;;;;;;;;;;38631:237::o;33780:121::-;33863:5;;-1:-1:-1;;;;;33863:5:0;33849:10;:19;33841:28;;;;;;33880:7;:13;33890:3;;33880:7;:13;:::i;35282:280::-;35399:7;35429:16;35437:7;32488:13;;-1:-1:-1;32478:23:0;32389:120;35429:16;35424:88;;35469:31;;-1:-1:-1;;;35469:31:0;;;;;;;;;;;35424:88;35529:19;35540:7;35529:10;:19::i;:::-;:25;-1:-1:-1;;;;;35529:25:0;;35282:280;-1:-1:-1;;35282:280:0:o;26289:21::-;;;;;;;:::i;34669:605::-;34786:7;-1:-1:-1;;;;;34815:19:0;;34811:87;;34858:28;;-1:-1:-1;;;34858:28:0;;;;;;;;;;;34811:87;34908:13;34932:17;34965:9;34960:284;34980:13;;34976:1;:17;34960:284;;;35015:18;35036:9;;;;;;;;;;:15;-1:-1:-1;;;;;35036:15:0;35070:24;;35066:87;;35127:10;35115:22;;35066:87;35184:5;-1:-1:-1;;;;;35171:18:0;:9;-1:-1:-1;;;;;35171:18:0;;35167:66;;35210:7;;;:::i;:::-;;;35167:66;-1:-1:-1;34995:3:0;;;:::i;:::-;;;34960:284;;;-1:-1:-1;35261:5:0;;34669:605;-1:-1:-1;;;34669:605:0:o;33909:114::-;33980:5;;-1:-1:-1;;;;;33980:5:0;33966:10;:19;33958:28;;;;;;33997:5;:18;;-1:-1:-1;;;;;;33997:18:0;;;33909:114::o;38369:254::-;38423:10;-1:-1:-1;;;;;38437:5:0;38423:19;;38415:51;;;;-1:-1:-1;;;38415:51:0;;11265:2:1;38415:51:0;;;11247:21:1;11304:2;11284:18;;;11277:30;-1:-1:-1;;;11323:18:1;;;11316:49;11382:18;;38415:51:0;11063:343:1;38415:51:0;38499:1;6356:20;;38485:9;6356:20;;;;6319:1;6356:27;:32;38477:55;;;;-1:-1:-1;;;38477:55:0;;11613:2:1;38477:55:0;;;11595:21:1;11652:2;11632:18;;;11625:30;-1:-1:-1;;;11671:18:1;;;11664:47;11728:18;;38477:55:0;11411:341:1;38477:55:0;38543:19;38548:1;38551:10;38543:4;:19::i;:::-;38587:1;6936:20;;;38573:9;6936:20;;;:28;;6906:1;6936:28;;;38605:10;;;;38587:1;;38605:10;38369:254::o;26241:41::-;;;;;;;:::i;38876:667::-;39012:21;;-1:-1:-1;;;;;39012:21:0;38998:10;:35;38976:122;;;;-1:-1:-1;;;38976:122:0;;11959:2:1;38976:122:0;;;11941:21:1;11998:2;11978:18;;;11971:30;12037:34;12017:18;;;12010:62;-1:-1:-1;;;12088:18:1;;;12081:35;12133:19;;38976:122:0;11757:401:1;38976:122:0;39149:17;39131:15;:35;39109:97;;;;-1:-1:-1;;;39109:97:0;;12365:2:1;39109:97:0;;;12347:21:1;12404:2;12384:18;;;12377:30;12443:27;12423:18;;;12416:55;12488:18;;39109:97:0;12163:349:1;39109:97:0;39217:14;39247:9;39242:254;39258:23;;;39242:254;;;39315:30;39329:12;;39342:1;39329:15;;;;;;;:::i;:::-;;;;;;;39315:9;:13;;:30;;;;:::i;:::-;39303:42;;39369:9;39368:10;39360:35;;;;-1:-1:-1;;;39360:35:0;;12851:2:1;39360:35:0;;;12833:21:1;12890:2;12870:18;;;12863:30;-1:-1:-1;;;12909:18:1;;;12902:42;12961:18;;39360:35:0;12649:336:1;39360:35:0;39410:30;39424:12;;39437:1;39424:15;;;;;;;:::i;:::-;;;;;;;39410:9;:13;;:30;;;;:::i;:::-;39468:12;;39481:1;39468:15;;;;;;;:::i;:::-;;;;;;;39460:24;;;;;;;;;;39283:3;;;;:::i;:::-;;;;39242:254;;;-1:-1:-1;39506:29:0;39511:12;39532:2;39506:4;:29::i;28084:342::-;21750:10;-1:-1:-1;;;;;28215:24:0;;;28211:81;;28263:17;;-1:-1:-1;;;28263:17:0;;;;;;;;;;;28211:81;21750:10;28302:31;;;;:17;:31;;;;;;;;-1:-1:-1;;;;;28302:41:0;;;;;;;;;;;;:52;;-1:-1:-1;;28302:52:0;;;;;;;;;;28370:48;;540:41:1;;;28302::0;;21750:10;28370:48;;513:18:1;28370:48:0;;;;;;;28084:342;;:::o;37940:355::-;38044:13;38075:23;38112:12;38101:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38101:31:0;;38075:57;;38148:9;38143:118;38159:23;;;38143:118;;;38219:30;38233:12;;38246:1;38233:15;;;;;;;:::i;38219:30::-;38204:9;38214:1;38204:12;;;;;;;;:::i;:::-;:45;;;:12;;;;;;;;;;;:45;38184:3;;;;:::i;:::-;;;;38143:118;;;-1:-1:-1;38278:9:0;37940:355;-1:-1:-1;;;37940:355:0:o;26801:446::-;26999:22;27024:19;27035:7;27024:10;:19::i;:::-;26999:44;;;;;;;;;;;-1:-1:-1;;;;;26999:44:0;;;;-1:-1:-1;;;26999:44:0;;;;-1:-1:-1;;;;;;26999:44:0;;;;;;-1:-1:-1;27059:54:0;21750:10;27101:11;;27092:7;;27059:18;:54::i;:::-;27054:130;;27137:35;;-1:-1:-1;;;27137:35:0;;;;;;;;;;;27054:130;27194:45;27208:4;27214:2;27218:7;27227:5;27234:4;27194:13;:45::i;:::-;26988:259;26801:446;;;;:::o;35921:385::-;36039:13;36075:16;36083:7;32488:13;;-1:-1:-1;32478:23:0;32389:120;36075:16;36070:86;;36115:29;;-1:-1:-1;;;36115:29:0;;;;;;;;;;;36070:86;36210:1;36192:7;36186:21;;;;;:::i;:::-;;;:25;:112;;;;;;;;;;;;;;;;;36251:7;36260:18;:7;:16;:18::i;:::-;36234:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36166:132;35921:385;-1:-1:-1;;35921:385:0:o;37560:235::-;37620:4;;21750:10;37652:5;;:26;;-1:-1:-1;;;37652:26:0;;;;;2338:25:1;;;-1:-1:-1;;;;;37652:42:0;;;;:5;;;;:13;;2311:18:1;;37652:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6292:1;6283:10;;;37705:14;6356:20;;;37722:9;6356:20;;;;;;-1:-1:-1;;;;;37652:42:0;;;;;;;;;-1:-1:-1;6319:1:0;6333:4;6325:12;;6319:19;6356:27;:32;;37652:42;37766:21;;;;;37778:9;37777:10;37766:21;37759:28;37560:235;-1:-1:-1;;;;37560:235:0:o;37041:511::-;9474:21;:19;:21::i;:::-;37150:19:::1;37131:15;:38;;37123:72;;;::::0;-1:-1:-1;;;37123:72:0;;14460:2:1;37123:72:0::1;::::0;::::1;14442:21:1::0;14499:2;14479:18;;;14472:30;-1:-1:-1;;;14518:18:1;;;14511:51;14579:18;;37123:72:0::1;14258:345:1::0;37123:72:0::1;37233:17;37214:15;:36;;37206:66;;;::::0;-1:-1:-1;;;37206:66:0;;14810:2:1;37206:66:0::1;::::0;::::1;14792:21:1::0;14849:2;14829:18;;;14822:30;-1:-1:-1;;;14868:18:1;;;14861:47;14925:18;;37206:66:0::1;14608:341:1::0;37206:66:0::1;37288:9;37283:212;37299:23:::0;;::::1;37283:212;;;37352:25;37361:12;;37374:1;37361:15;;;;;;;:::i;:::-;;;;;;;37352:8;:25::i;:::-;37344:50;;;::::0;-1:-1:-1;;;37344:50:0;;12851:2:1;37344:50:0::1;::::0;::::1;12833:21:1::0;12890:2;12870:18;;;12863:30;-1:-1:-1;;;12909:18:1;;;12902:42;12961:18;;37344:50:0::1;12649:336:1::0;37344:50:0::1;37409:30;37423:12;;37436:1;37423:15;;;;;;;:::i;37409:30::-;37467:12;;37480:1;37467:15;;;;;;;:::i;:::-;;;;;;;37459:24;;;;;;;;;;37324:3:::0;::::1;::::0;::::1;:::i;:::-;;;;37283:212;;;-1:-1:-1::0;37505:39:0::1;37510:12:::0;21750:10;37505:4:::1;:39::i;:::-;9518:20:::0;8912:1;10034:7;:22;9851:213;9518:20;37041:511;;:::o;32836:509::-;32923:17;32963:16;32971:7;32488:13;;-1:-1:-1;32478:23:0;32389:120;32963:16;32958:92;;33003:35;;-1:-1:-1;;;33003:35:0;;;;;;;;;;;32958:92;33060:23;33086:15;;;;;;;;;;33093:7;33153:162;33160:11;;-1:-1:-1;;;;;33160:11:0;33153:162;;-1:-1:-1;;33231:14:0;33283:6;:20;;;;;;;;;;;-1:-1:-1;33153:162:0;;;-1:-1:-1;33332:5:0;32836:509;-1:-1:-1;;32836:509:0:o;31140:208::-;31262:23;;;;:14;:23;;;;;;:28;;-1:-1:-1;;;;;;31262:28:0;-1:-1:-1;;;;;31262:28:0;;;;;;;;;31315:11;;31306:34;;31262:23;;:28;;31306:34;;;;;;31262:23;31306:34;31140:208;;;:::o;32517:311::-;32661:4;32716:5;-1:-1:-1;;;;;32705:16:0;:7;-1:-1:-1;;;;;32705:16:0;;:52;;;-1:-1:-1;;;;;;34619:24:0;;;34590:4;34619:24;;;:17;:24;;;;;;;;:34;;;;;;;;;;;;32725:32;32705:104;;;;32802:7;-1:-1:-1;;;;;32778:31:0;:20;32790:7;32778:11;:20::i;:::-;-1:-1:-1;;;;;32778:31:0;;32683:137;32517:311;-1:-1:-1;;;;32517:311:0:o;30148:984::-;30347:4;-1:-1:-1;;;;;30332:19:0;:5;:11;;;-1:-1:-1;;;;;30332:19:0;;30328:87;;30375:28;;-1:-1:-1;;;30375:28:0;;;;;;;;;;;30328:87;-1:-1:-1;;;;;30429:16:0;;30425:79;;30469:23;;-1:-1:-1;;;30469:23:0;;;;;;;;;;;30425:79;30514:36;30531:1;30535:7;30544:5;30514:8;:36::i;:::-;30618:1;30608:11;;30638:20;30608:11;32488:13;;-1:-1:-1;32478:23:0;32389:120;30638:20;30634:283;;;30679:27;30709:19;;;;;;;;;;30751:15;;-1:-1:-1;;;;;30751:15:0;30747:155;;30823:11;;30873:9;;;;30857:25;;-1:-1:-1;;;30857:25:0;-1:-1:-1;;;;;30805:29:0;;;30857:25;;;30747:155;30660:257;30634:283;-1:-1:-1;30938:26:0;30967:15;;;;;;;;;;;30993:19;;-1:-1:-1;;;;;;30993:19:0;-1:-1:-1;;;;;30993:19:0;;;;;31071:9;;;;31038:43;;31052:4;;30993:19;;30967:15;;31038:13;:43::i;:::-;31023:58;;;;;;;-1:-1:-1;;;31023:58:0;-1:-1:-1;;;;;31023:58:0;;;;;;31097:27;;31116:7;;31097:27;;;;;;;;;;31023:12;;31097:27;30317:815;30148:984;;;;:::o;6175:221::-;6292:1;6283:10;;;6249:4;6356:20;;;;;;;;;;;6319:1;6333:4;6325:12;;6319:19;6356:27;:32;;6175:221;;;;:::o;26624:169::-;26720:10;26710:6;26694:13;;:22;;;;:::i;:::-;:36;;26686:67;;;;-1:-1:-1;;;26686:67:0;;15289:2:1;26686:67:0;;;15271:21:1;15328:2;15308:18;;;15301:30;-1:-1:-1;;;15347:18:1;;;15340:48;15405:18;;26686:67:0;15087:342:1;26686:67:0;26764:21;26774:2;26778:6;26764:9;:21::i;6782:190::-;6879:1;6870:10;;;6853:14;6936:20;;;;;;;;;;;;:28;;6906:1;6920:4;6912:12;;;6906:19;;;;6936:28;;;;;6782:190::o;28434:421::-;28646:35;28656:4;28662:2;28666:7;28675:5;28646:9;:35::i;:::-;-1:-1:-1;;;;;28696:13:0;;13174:19;:23;;28696:67;;;;;28716:47;28739:4;28745:2;28749:7;28758:4;28716:22;:47::i;:::-;28715:48;28696:67;28692:156;;;28796:40;;-1:-1:-1;;;28796:40:0;;;;;;;;;;;22231:723;22287:13;22508:5;22517:1;22508:10;22504:53;;-1:-1:-1;;22535:10:0;;;;;;;;;;;;-1:-1:-1;;;22535:10:0;;;;;22231:723::o;22504:53::-;22582:5;22567:12;22623:78;22630:9;;22623:78;;22656:8;;;;:::i;:::-;;-1:-1:-1;22679:10:0;;-1:-1:-1;22687:2:0;22679:10;;:::i;:::-;;;22623:78;;;22711:19;22743:6;22733:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22733:17:0;;22711:39;;22761:154;22768:10;;22761:154;;22795:11;22805:1;22795:11;;:::i;:::-;;-1:-1:-1;22864:10:0;22872:2;22864:5;:10;:::i;:::-;22851:24;;:2;:24;:::i;:::-;22838:39;;22821:6;22828;22821:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;22821:56:0;;;;;;;;-1:-1:-1;22892:11:0;22901:2;22892:11;;:::i;:::-;;;22761:154;;9554:289;8956:1;9684:7;;:19;9676:63;;;;-1:-1:-1;;;9676:63:0;;16140:2:1;9676:63:0;;;16122:21:1;16179:2;16159:18;;;16152:30;16218:33;16198:18;;;16191:61;16269:18;;9676:63:0;15938:355:1;9676:63:0;8956:1;9817:7;:18;9554:289::o;33353:419::-;33546:7;-1:-1:-1;;;;;33591:18:0;;;:173;;33757:7;33591:173;;;33661:64;;;;;;16511:19:1;;;-1:-1:-1;;16568:2:1;16564:15;;;16560:53;16546:12;;;16539:75;;;;33691:16:0;16630:12:1;;;16623:28;33709:15:0;16667:12:1;;;16660:28;16704:13;;33661:64:0;;;;;;;;;;;;33651:75;;;;;;33591:173;33571:193;33353:419;-1:-1:-1;;;;;33353:419:0:o;32049:112::-;32126:27;32136:2;32140:8;32126:27;;;;;;;;;;;;:9;:27::i;31356:685::-;31554:71;;-1:-1:-1;;;31554:71:0;;31528:4;;-1:-1:-1;;;;;31554:36:0;;;;;:71;;21750:10;;31605:4;;31611:7;;31620:4;;31554:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31554:71:0;;;;;;;;-1:-1:-1;;31554:71:0;;;;;;;;;;;;:::i;:::-;;;31550:484;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31792:6;:13;31809:1;31792:18;31788:235;;31838:40;;-1:-1:-1;;;31838:40:0;;;;;;;;;;;31788:235;31981:6;31975:13;31966:6;31962:2;31958:15;31951:38;31550:484;-1:-1:-1;;;;;;31681:51:0;-1:-1:-1;;;31681:51:0;;-1:-1:-1;31674:58:0;;28863:540;28982:19;28988:2;28992:8;28982:5;:19::i;:::-;-1:-1:-1;;;;;29016:13:0;;13174:19;:23;29012:384;;29082:9;29077:293;29097:8;29093:1;:12;29077:293;;;29166:63;29197:1;29201:2;29221:1;29205:13;;:17;29224:4;29166:22;:63::i;:::-;29135:216;;29287:40;;-1:-1:-1;;;29287:40:0;;;;;;;;;;;29135:216;29107:3;;29077:293;;29411:729;-1:-1:-1;;;;;29488:16:0;;29484:75;;29528:19;;-1:-1:-1;;;29528:19:0;;;;;;;;;;;29484:75;29573:8;29585:1;29573:13;29569:71;;29610:18;;-1:-1:-1;;;29610:18:0;;;;;;;;;;;29569:71;29680:9;29675:407;29695:8;29691:1;:12;29675:407;;;26093:1;29733;:16;29753:1;29733:21;29729:271;;29812:13;;;:17;;29779:23;29805:25;;;;;;;;;;29853:16;;-1:-1:-1;;;;;;29853:16:0;-1:-1:-1;;;;;29853:16:0;;;;;29959:13;;29929:51;;29779:23;29853:16;;29959:17;;29779:23;29929:13;:51::i;:::-;29892:88;;;;;;;-1:-1:-1;;;29892:88:0;-1:-1:-1;;;;;29892:88:0;;;;;;29729:271;30048:13;;30023:43;;30048:17;;;;-1:-1:-1;;;;;30023:43:0;;;30040:1;;30023:43;;30040:1;;30023:43;29705:3;;29675:407;;;-1:-1:-1;30096:13:0;:25;;;;;;;-1:-1:-1;29411:729:0:o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;68:71;14:131;:::o;150:245::-;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:131::-;-1:-1:-1;;;;;1811:31:1;;1801:42;;1791:70;;1857:1;1854;1847:12;1872:315;1940:6;1948;2001:2;1989:9;1980:7;1976:23;1972:32;1969:52;;;2017:1;2014;2007:12;1969:52;2056:9;2043:23;2075:31;2100:5;2075:31;:::i;:::-;2125:5;2177:2;2162:18;;;;2149:32;;-1:-1:-1;;;1872:315:1:o;2374:456::-;2451:6;2459;2467;2520:2;2508:9;2499:7;2495:23;2491:32;2488:52;;;2536:1;2533;2526:12;2488:52;2575:9;2562:23;2594:31;2619:5;2594:31;:::i;:::-;2644:5;-1:-1:-1;2701:2:1;2686:18;;2673:32;2714:33;2673:32;2714:33;:::i;:::-;2374:456;;2766:7;;-1:-1:-1;;;2820:2:1;2805:18;;;;2792:32;;2374:456::o;2835:247::-;2894:6;2947:2;2935:9;2926:7;2922:23;2918:32;2915:52;;;2963:1;2960;2953:12;2915:52;3002:9;2989:23;3021:31;3046:5;3021:31;:::i;3087:592::-;3158:6;3166;3219:2;3207:9;3198:7;3194:23;3190:32;3187:52;;;3235:1;3232;3225:12;3187:52;3275:9;3262:23;3304:18;3345:2;3337:6;3334:14;3331:34;;;3361:1;3358;3351:12;3331:34;3399:6;3388:9;3384:22;3374:32;;3444:7;3437:4;3433:2;3429:13;3425:27;3415:55;;3466:1;3463;3456:12;3415:55;3506:2;3493:16;3532:2;3524:6;3521:14;3518:34;;;3548:1;3545;3538:12;3518:34;3593:7;3588:2;3579:6;3575:2;3571:15;3567:24;3564:37;3561:57;;;3614:1;3611;3604:12;3561:57;3645:2;3637:11;;;;;3667:6;;-1:-1:-1;3087:592:1;;-1:-1:-1;;;;3087:592:1:o;3684:367::-;3747:8;3757:6;3811:3;3804:4;3796:6;3792:17;3788:27;3778:55;;3829:1;3826;3819:12;3778:55;-1:-1:-1;3852:20:1;;3895:18;3884:30;;3881:50;;;3927:1;3924;3917:12;3881:50;3964:4;3956:6;3952:17;3940:29;;4024:3;4017:4;4007:6;4004:1;4000:14;3992:6;3988:27;3984:38;3981:47;3978:67;;;4041:1;4038;4031:12;3978:67;3684:367;;;;;:::o;4056:572::-;4151:6;4159;4167;4220:2;4208:9;4199:7;4195:23;4191:32;4188:52;;;4236:1;4233;4226:12;4188:52;4276:9;4263:23;4309:18;4301:6;4298:30;4295:50;;;4341:1;4338;4331:12;4295:50;4380:70;4442:7;4433:6;4422:9;4418:22;4380:70;:::i;:::-;4469:8;;-1:-1:-1;4354:96:1;-1:-1:-1;;4554:2:1;4539:18;;4526:32;4567:31;4526:32;4567:31;:::i;:::-;4617:5;4607:15;;;4056:572;;;;;:::o;4633:416::-;4698:6;4706;4759:2;4747:9;4738:7;4734:23;4730:32;4727:52;;;4775:1;4772;4765:12;4727:52;4814:9;4801:23;4833:31;4858:5;4833:31;:::i;:::-;4883:5;-1:-1:-1;4940:2:1;4925:18;;4912:32;4982:15;;4975:23;4963:36;;4953:64;;5013:1;5010;5003:12;4953:64;5036:7;5026:17;;;4633:416;;;;;:::o;5054:437::-;5140:6;5148;5201:2;5189:9;5180:7;5176:23;5172:32;5169:52;;;5217:1;5214;5207:12;5169:52;5257:9;5244:23;5290:18;5282:6;5279:30;5276:50;;;5322:1;5319;5312:12;5276:50;5361:70;5423:7;5414:6;5403:9;5399:22;5361:70;:::i;:::-;5450:8;;5335:96;;-1:-1:-1;5054:437:1;-1:-1:-1;;;;5054:437:1:o;5496:642::-;5661:2;5713:21;;;5783:13;;5686:18;;;5805:22;;;5632:4;;5661:2;5884:15;;;;5858:2;5843:18;;;5632:4;5927:185;5941:6;5938:1;5935:13;5927:185;;;6016:13;;6009:21;6002:29;5990:42;;6087:15;;;;6052:12;;;;5963:1;5956:9;5927:185;;;-1:-1:-1;6129:3:1;;5496:642;-1:-1:-1;;;;;;5496:642:1:o;6143:127::-;6204:10;6199:3;6195:20;6192:1;6185:31;6235:4;6232:1;6225:15;6259:4;6256:1;6249:15;6275:1266;6370:6;6378;6386;6394;6447:3;6435:9;6426:7;6422:23;6418:33;6415:53;;;6464:1;6461;6454:12;6415:53;6503:9;6490:23;6522:31;6547:5;6522:31;:::i;:::-;6572:5;-1:-1:-1;6629:2:1;6614:18;;6601:32;6642:33;6601:32;6642:33;:::i;:::-;6694:7;-1:-1:-1;6748:2:1;6733:18;;6720:32;;-1:-1:-1;6803:2:1;6788:18;;6775:32;6826:18;6856:14;;;6853:34;;;6883:1;6880;6873:12;6853:34;6921:6;6910:9;6906:22;6896:32;;6966:7;6959:4;6955:2;6951:13;6947:27;6937:55;;6988:1;6985;6978:12;6937:55;7024:2;7011:16;7046:2;7042;7039:10;7036:36;;;7052:18;;:::i;:::-;7127:2;7121:9;7095:2;7181:13;;-1:-1:-1;;7177:22:1;;;7201:2;7173:31;7169:40;7157:53;;;7225:18;;;7245:22;;;7222:46;7219:72;;;7271:18;;:::i;:::-;7311:10;7307:2;7300:22;7346:2;7338:6;7331:18;7386:7;7381:2;7376;7372;7368:11;7364:20;7361:33;7358:53;;;7407:1;7404;7397:12;7358:53;7463:2;7458;7454;7450:11;7445:2;7437:6;7433:15;7420:46;7508:1;7503:2;7498;7490:6;7486:15;7482:24;7475:35;7529:6;7519:16;;;;;;;6275:1266;;;;;;;:::o;7546:388::-;7614:6;7622;7675:2;7663:9;7654:7;7650:23;7646:32;7643:52;;;7691:1;7688;7681:12;7643:52;7730:9;7717:23;7749:31;7774:5;7749:31;:::i;:::-;7799:5;-1:-1:-1;7856:2:1;7841:18;;7828:32;7869:33;7828:32;7869:33;:::i;7939:380::-;8018:1;8014:12;;;;8061;;;8082:61;;8136:4;8128:6;8124:17;8114:27;;8082:61;8189:2;8181:6;8178:14;8158:18;8155:38;8152:161;;8235:10;8230:3;8226:20;8223:1;8216:31;8270:4;8267:1;8260:15;8298:4;8295:1;8288:15;8152:161;;7939:380;;;:::o;8859:545::-;8961:2;8956:3;8953:11;8950:448;;;8997:1;9022:5;9018:2;9011:17;9067:4;9063:2;9053:19;9137:2;9125:10;9121:19;9118:1;9114:27;9108:4;9104:38;9173:4;9161:10;9158:20;9155:47;;;-1:-1:-1;9196:4:1;9155:47;9251:2;9246:3;9242:12;9239:1;9235:20;9229:4;9225:31;9215:41;;9306:82;9324:2;9317:5;9314:13;9306:82;;;9369:17;;;9350:1;9339:13;9306:82;;;9310:3;;;8859:545;;;:::o;9580:1206::-;9704:18;9699:3;9696:27;9693:53;;;9726:18;;:::i;:::-;9755:94;9845:3;9805:38;9837:4;9831:11;9805:38;:::i;:::-;9799:4;9755:94;:::i;:::-;9875:1;9900:2;9895:3;9892:11;9917:1;9912:616;;;;10572:1;10589:3;10586:93;;;-1:-1:-1;10645:19:1;;;10632:33;10586:93;-1:-1:-1;;9537:1:1;9533:11;;;9529:24;9525:29;9515:40;9561:1;9557:11;;;9512:57;10692:78;;9885:895;;9912:616;8806:1;8799:14;;;8843:4;8830:18;;-1:-1:-1;;9948:17:1;;;10049:9;10071:229;10085:7;10082:1;10079:14;10071:229;;;10174:19;;;10161:33;10146:49;;10281:4;10266:20;;;;10234:1;10222:14;;;;10101:12;10071:229;;;10075:3;10328;10319:7;10316:16;10313:159;;;10452:1;10448:6;10442:3;10436;10433:1;10429:11;10425:21;10421:34;10417:39;10404:9;10399:3;10395:19;10382:33;10378:79;10370:6;10363:95;10313:159;;;10515:1;10509:3;10506:1;10502:11;10498:19;10492:4;10485:33;9885:895;;9580:1206;;;:::o;10791:127::-;10852:10;10847:3;10843:20;10840:1;10833:31;10883:4;10880:1;10873:15;10907:4;10904:1;10897:15;10923:135;10962:3;10983:17;;;10980:43;;11003:18;;:::i;:::-;-1:-1:-1;11050:1:1;11039:13;;10923:135::o;12517:127::-;12578:10;12573:3;12569:20;12566:1;12559:31;12609:4;12606:1;12599:15;12633:4;12630:1;12623:15;12990:1007;13166:3;13195:1;13228:6;13222:13;13258:36;13284:9;13258:36;:::i;:::-;13313:1;13330:18;;;13357:133;;;;13504:1;13499:356;;;;13323:532;;13357:133;-1:-1:-1;;13390:24:1;;13378:37;;13463:14;;13456:22;13444:35;;13435:45;;;-1:-1:-1;13357:133:1;;13499:356;13530:6;13527:1;13520:17;13560:4;13605:2;13602:1;13592:16;13630:1;13644:165;13658:6;13655:1;13652:13;13644:165;;;13736:14;;13723:11;;;13716:35;13779:16;;;;13673:10;;13644:165;;;13648:3;;;13838:6;13833:3;13829:16;13822:23;;13323:532;;;;;13886:6;13880:13;13902:55;13948:8;13943:3;13936:4;13928:6;13924:17;13902:55;:::i;:::-;13973:18;;12990:1007;-1:-1:-1;;;;12990:1007:1:o;14002:251::-;14072:6;14125:2;14113:9;14104:7;14100:23;14096:32;14093:52;;;14141:1;14138;14131:12;14093:52;14173:9;14167:16;14192:31;14217:5;14192:31;:::i;14954:128::-;14994:3;15025:1;15021:6;15018:1;15015:13;15012:39;;;15031:18;;:::i;:::-;-1:-1:-1;15067:9:1;;14954:128::o;15434:127::-;15495:10;15490:3;15486:20;15483:1;15476:31;15526:4;15523:1;15516:15;15550:4;15547:1;15540:15;15566:120;15606:1;15632;15622:35;;15637:18;;:::i;:::-;-1:-1:-1;15671:9:1;;15566:120::o;15691:125::-;15731:4;15759:1;15756;15753:8;15750:34;;;15764:18;;:::i;:::-;-1:-1:-1;15801:9:1;;15691:125::o;15821:112::-;15853:1;15879;15869:35;;15884:18;;:::i;:::-;-1:-1:-1;15918:9:1;;15821:112::o;16728:489::-;-1:-1:-1;;;;;16997:15:1;;;16979:34;;17049:15;;17044:2;17029:18;;17022:43;17096:2;17081:18;;17074:34;;;17144:3;17139:2;17124:18;;17117:31;;;16922:4;;17165:46;;17191:19;;17183:6;17165:46;:::i;:::-;17157:54;16728:489;-1:-1:-1;;;;;;16728:489:1:o;17222:249::-;17291:6;17344:2;17332:9;17323:7;17319:23;17315:32;17312:52;;;17360:1;17357;17350:12;17312:52;17392:9;17386:16;17411:30;17435:5;17411:30;:::i

Swarm Source

ipfs://2b85ee69c3f5896ee4f953d2f40c43f94d8e36e820fa09f82bd8a7559ddea2bc
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.