ETH Price: $3,447.46 (-0.86%)
Gas: 3 Gwei

Token

Boom Pinoeer Card (BPC)
 

Overview

Max Total Supply

162 BPC

Holders

155

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
bokababa413119.eth
Balance
1 BPC
0xaD2FF20a49F9eEc8529fa31c8d9Ec66E4949A808
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:
Boom

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 14 : Boom.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.4;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";

/*
    ,---,.                                  ____
    ,'  .'  \                               ,'  , `.
    ,---.' .' |    ,---.      ,---.        ,-+-,.' _ |
    |   |  |: |   '   ,'\    '   ,'\    ,-+-. ;   , ||
    :   :  :  /  /   /   |  /   /   |  ,--.'|'   |  ||
    :   |    ;  .   ; ,. : .   ; ,. : |   |  ,', |  |,
    |   :     \ '   | |: : '   | |: : |   | /  | |--'
    |   |   . | '   | .; : '   | .; : |   : |  | ,
    '   :  '; | |   :    | |   :    | |   : |  |/
    |   |  | ;   \   \  /   \   \  /  |   | |`-'
    |   :   /     `----'     `----'   |   ;/
    |   | ,'                          '---'
    `----'
*/

contract Boom is ERC721, ERC721Enumerable, Ownable {
    using ECDSA for bytes32;

    string private _baseTokenURI;
    address private _signer;
    string private _contractURI;

    uint256 public constant MAX_SUPPLY = 500;
    bool public publicClaim = false;

    constructor(
        address signer,
        string memory _initialBaseURI,
        string memory _initialContractURI
    ) ERC721("Boom Pinoeer Card", "BPC") {
        _signer = signer;
        _baseTokenURI = _initialBaseURI;
        _contractURI = _initialContractURI;
    }

    function claim(uint256 tokenId, bytes memory signature) external {
        require(publicClaim, "Boom: claim is not active.");
        require(
            tx.origin == msg.sender,
            "Boom: contract is not allowed to claim."
        );
        require(
            _verify(msg.sender, tokenId, signature),
            "Boom: invalid signature."
        );
        require(totalSupply() + 1 <= MAX_SUPPLY, "Boom: Max supply exceeded.");
        _safeMint(msg.sender, tokenId);
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    // View Contract-level URI
    function contractURI() public view returns (string memory) {
        return _contractURI;
    }

    function _baseURI() internal view override returns (string memory) {
        return _baseTokenURI;
    }

    function withdraw() external onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

    function setBaseURI(string calldata baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }

    // Set Contract-level URI
    function setContractURI(string memory contractURI_) external onlyOwner {
        _contractURI = contractURI_;
    }

    function setSigner(address signer) external onlyOwner {
        _signer = signer;
    }

    function flipClaimState() external onlyOwner {
        publicClaim = !publicClaim;
    }

    function _verify(
        address _sender,
        uint256 _tokenId,
        bytes memory _signature
    ) internal view returns (bool) {
        return
            keccak256(abi.encodePacked(_sender, _tokenId))
                .toEthSignedMessageHash()
                .recover(_signature) == _signer;
    }
}

File 2 of 14 : ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 3 of 14 : ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 4 of 14 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 5 of 14 : ECDSA.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

import "../Strings.sol";

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

File 6 of 14 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 7 of 14 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 8 of 14 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.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);
}

File 9 of 14 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 10 of 14 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 11 of 14 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

File 12 of 14 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.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;
    }
}

File 13 of 14 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 14 of 14 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"string","name":"_initialBaseURI","type":"string"},{"internalType":"string","name":"_initialContractURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipClaimState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"contractURI_","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600e805460ff191690553480156200001b57600080fd5b5060405162002828380380620028288339810160408190526200003e91620002c4565b6040805180820182526011815270109bdbdb48141a5b9bd9595c8810d85c99607a1b60208083019182528351808501909452600384526242504360e81b90840152815191929162000092916000916200016b565b508051620000a89060019060208401906200016b565b505050620000c5620000bf6200011560201b60201c565b62000119565b600c80546001600160a01b0319166001600160a01b0385161790558151620000f590600b9060208501906200016b565b5080516200010b90600d9060208401906200016b565b505050506200039d565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000179906200034a565b90600052602060002090601f0160209004810192826200019d5760008555620001e8565b82601f10620001b857805160ff1916838001178555620001e8565b82800160010185558215620001e8579182015b82811115620001e8578251825591602001919060010190620001cb565b50620001f6929150620001fa565b5090565b5b80821115620001f65760008155600101620001fb565b600082601f83011262000222578081fd5b81516001600160401b03808211156200023f576200023f62000387565b604051601f8301601f19908116603f011681019082821181831017156200026a576200026a62000387565b8160405283815260209250868385880101111562000286578485fd5b8491505b83821015620002a957858201830151818301840152908201906200028a565b83821115620002ba57848385830101525b9695505050505050565b600080600060608486031215620002d9578283fd5b83516001600160a01b0381168114620002f0578384fd5b60208501519093506001600160401b03808211156200030d578384fd5b6200031b8783880162000211565b9350604086015191508082111562000331578283fd5b50620003408682870162000211565b9150509250925092565b600181811c908216806200035f57607f821691505b602082108114156200038157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61247b80620003ad6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80636352211e116100f957806395d89b4111610097578063c87b56dd11610071578063c87b56dd14610383578063e8a3d48514610396578063e985e9c51461039e578063f2fde38b146103da57600080fd5b806395d89b4114610355578063a22cb4651461035d578063b88d4fde1461037057600080fd5b806370a08231116100d357806370a0823114610316578063715018a6146103295780638da5cb5b14610331578063938e3d7b1461034257600080fd5b80636352211e146102e85780636c19e783146102fb5780636d60e6c11461030e57600080fd5b80632f745c59116101665780633ccfd60b116101405780633ccfd60b146102a757806342842e0e146102af5780634f6ccce7146102c257806355f804b3146102d557600080fd5b80632f745c591461027857806332cb6b0c1461028b57806338926b6d1461029457600080fd5b8063095ea7b3116101a2578063095ea7b31461023157806318160ddd146102465780631b4152391461025857806323b872dd1461026557600080fd5b806301ffc9a7146101c957806306fdde03146101f1578063081812fc14610206575b600080fd5b6101dc6101d7366004612049565b6103ed565b60405190151581526020015b60405180910390f35b6101f96103fe565b6040516101e89190612229565b610219610214366004612134565b610490565b6040516001600160a01b0390911681526020016101e8565b61024461023f366004612020565b61052a565b005b6008545b6040519081526020016101e8565b600e546101dc9060ff1681565b610244610273366004611f45565b610640565b61024a610286366004612020565b610671565b61024a6101f481565b6102446102a236600461214c565b610707565b610244610882565b6102446102bd366004611f45565b6108db565b61024a6102d0366004612134565b6108f6565b6102446102e3366004612081565b610997565b6102196102f6366004612134565b6109cd565b610244610309366004611ef9565b610a44565b610244610a90565b61024a610324366004611ef9565b610ace565b610244610b55565b600a546001600160a01b0316610219565b6102446103503660046120ee565b610b8b565b6101f9610bc8565b61024461036b366004611fe6565b610bd7565b61024461037e366004611f80565b610be2565b6101f9610391366004612134565b610c1a565b6101f9610cf5565b6101dc6103ac366004611f13565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6102446103e8366004611ef9565b610d04565b60006103f882610d9c565b92915050565b60606000805461040d90612383565b80601f016020809104026020016040519081016040528092919081815260200182805461043990612383565b80156104865780601f1061045b57610100808354040283529160200191610486565b820191906000526020600020905b81548152906001019060200180831161046957829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661050e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610535826109cd565b9050806001600160a01b0316836001600160a01b031614156105a35760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610505565b336001600160a01b03821614806105bf57506105bf81336103ac565b6106315760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610505565b61063b8383610dc1565b505050565b61064a3382610e2f565b6106665760405162461bcd60e51b8152600401610505906122c3565b61063b838383610f26565b600061067c83610ace565b82106106de5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610505565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600e5460ff166107595760405162461bcd60e51b815260206004820152601a60248201527f426f6f6d3a20636c61696d206973206e6f74206163746976652e0000000000006044820152606401610505565b3233146107b85760405162461bcd60e51b815260206004820152602760248201527f426f6f6d3a20636f6e7472616374206973206e6f7420616c6c6f77656420746f6044820152661031b630b4b69760c91b6064820152608401610505565b6107c33383836110cd565b61080f5760405162461bcd60e51b815260206004820152601860248201527f426f6f6d3a20696e76616c6964207369676e61747572652e00000000000000006044820152606401610505565b6101f461081b60085490565b610826906001612314565b11156108745760405162461bcd60e51b815260206004820152601a60248201527f426f6f6d3a204d617820737570706c792065786365656465642e0000000000006044820152606401610505565b61087e338361118e565b5050565b600a546001600160a01b031633146108ac5760405162461bcd60e51b81526004016105059061228e565b60405133904780156108fc02916000818181858888f193505050501580156108d8573d6000803e3d6000fd5b50565b61063b83838360405180602001604052806000815250610be2565b600061090160085490565b82106109645760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610505565b6008828154811061098557634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b031633146109c15760405162461bcd60e51b81526004016105059061228e565b61063b600b8383611d3b565b6000818152600260205260408120546001600160a01b0316806103f85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610505565b600a546001600160a01b03163314610a6e5760405162461bcd60e51b81526004016105059061228e565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b03163314610aba5760405162461bcd60e51b81526004016105059061228e565b600e805460ff19811660ff90911615179055565b60006001600160a01b038216610b395760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610505565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610b7f5760405162461bcd60e51b81526004016105059061228e565b610b8960006111a8565b565b600a546001600160a01b03163314610bb55760405162461bcd60e51b81526004016105059061228e565b805161087e90600d906020840190611dbf565b60606001805461040d90612383565b61087e3383836111fa565b610bec3383610e2f565b610c085760405162461bcd60e51b8152600401610505906122c3565b610c14848484846112c9565b50505050565b6000818152600260205260409020546060906001600160a01b0316610c995760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610505565b6000610ca36112fc565b90506000815111610cc35760405180602001604052806000815250610cee565b80610ccd8461130b565b604051602001610cde9291906121bd565b6040516020818303038152906040525b9392505050565b6060600d805461040d90612383565b600a546001600160a01b03163314610d2e5760405162461bcd60e51b81526004016105059061228e565b6001600160a01b038116610d935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610505565b6108d8816111a8565b60006001600160e01b0319821663780e9d6360e01b14806103f857506103f882611425565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610df6826109cd565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316610ea85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610505565b6000610eb3836109cd565b9050806001600160a01b0316846001600160a01b03161480610eee5750836001600160a01b0316610ee384610490565b6001600160a01b0316145b80610f1e57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316610f39826109cd565b6001600160a01b031614610f9d5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610505565b6001600160a01b038216610fff5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610505565b61100a838383611475565b611015600082610dc1565b6001600160a01b038316600090815260036020526040812080546001929061103e908490612340565b90915550506001600160a01b038216600090815260036020526040812080546001929061106c908490612314565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600c546040516bffffffffffffffffffffffff19606086901b166020820152603481018490526000916001600160a01b03169061117c90849061117690605401604051602081830303815290604052805190602001206040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90611480565b6001600160a01b031614949350505050565b61087e8282604051806020016040528060008152506114a4565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316141561125c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610505565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6112d4848484610f26565b6112e0848484846114d7565b610c145760405162461bcd60e51b81526004016105059061223c565b6060600b805461040d90612383565b60608161132f5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156113595780611343816123be565b91506113529050600a8361232c565b9150611333565b60008167ffffffffffffffff81111561138257634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156113ac576020820181803683370190505b5090505b8415610f1e576113c1600183612340565b91506113ce600a866123d9565b6113d9906030612314565b60f81b8183815181106113fc57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061141e600a8661232c565b94506113b0565b60006001600160e01b031982166380ac58cd60e01b148061145657506001600160e01b03198216635b5e139f60e01b145b806103f857506301ffc9a760e01b6001600160e01b03198316146103f8565b61063b8383836115e4565b600080600061148f858561169c565b9150915061149c8161170c565b509392505050565b6114ae838361190d565b6114bb60008484846114d7565b61063b5760405162461bcd60e51b81526004016105059061223c565b60006001600160a01b0384163b156115d957604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061151b9033908990889088906004016121ec565b602060405180830381600087803b15801561153557600080fd5b505af1925050508015611565575060408051601f3d908101601f1916820190925261156291810190612065565b60015b6115bf573d808015611593576040519150601f19603f3d011682016040523d82523d6000602084013e611598565b606091505b5080516115b75760405162461bcd60e51b81526004016105059061223c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610f1e565b506001949350505050565b6001600160a01b03831661163f5761163a81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611662565b816001600160a01b0316836001600160a01b031614611662576116628382611a5b565b6001600160a01b0382166116795761063b81611af8565b826001600160a01b0316826001600160a01b03161461063b5761063b8282611bd1565b6000808251604114156116d35760208301516040840151606085015160001a6116c787828585611c15565b94509450505050611705565b8251604014156116fd57602083015160408401516116f2868383611d02565b935093505050611705565b506000905060025b9250929050565b600081600481111561172e57634e487b7160e01b600052602160045260246000fd5b14156117375750565b600181600481111561175957634e487b7160e01b600052602160045260246000fd5b14156117a75760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610505565b60028160048111156117c957634e487b7160e01b600052602160045260246000fd5b14156118175760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610505565b600381600481111561183957634e487b7160e01b600052602160045260246000fd5b14156118925760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610505565b60048160048111156118b457634e487b7160e01b600052602160045260246000fd5b14156108d85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610505565b6001600160a01b0382166119635760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610505565b6000818152600260205260409020546001600160a01b0316156119c85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610505565b6119d460008383611475565b6001600160a01b03821660009081526003602052604081208054600192906119fd908490612314565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001611a6884610ace565b611a729190612340565b600083815260076020526040902054909150808214611ac5576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611b0a90600190612340565b60008381526009602052604081205460088054939450909284908110611b4057634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110611b6f57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611bb557634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000611bdc83610ace565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611c4c5750600090506003611cf9565b8460ff16601b14158015611c6457508460ff16601c14155b15611c755750600090506004611cf9565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611cc9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611cf257600060019250925050611cf9565b9150600090505b94509492505050565b6000806001600160ff1b03831681611d1f60ff86901c601b612314565b9050611d2d87828885611c15565b935093505050935093915050565b828054611d4790612383565b90600052602060002090601f016020900481019282611d695760008555611daf565b82601f10611d825782800160ff19823516178555611daf565b82800160010185558215611daf579182015b82811115611daf578235825591602001919060010190611d94565b50611dbb929150611e33565b5090565b828054611dcb90612383565b90600052602060002090601f016020900481019282611ded5760008555611daf565b82601f10611e0657805160ff1916838001178555611daf565b82800160010185558215611daf579182015b82811115611daf578251825591602001919060010190611e18565b5b80821115611dbb5760008155600101611e34565b600067ffffffffffffffff80841115611e6357611e63612419565b604051601f8501601f19908116603f01168101908282118183101715611e8b57611e8b612419565b81604052809350858152868686011115611ea457600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611ed557600080fd5b919050565b600082601f830112611eea578081fd5b610cee83833560208501611e48565b600060208284031215611f0a578081fd5b610cee82611ebe565b60008060408385031215611f25578081fd5b611f2e83611ebe565b9150611f3c60208401611ebe565b90509250929050565b600080600060608486031215611f59578081fd5b611f6284611ebe565b9250611f7060208501611ebe565b9150604084013590509250925092565b60008060008060808587031215611f95578081fd5b611f9e85611ebe565b9350611fac60208601611ebe565b925060408501359150606085013567ffffffffffffffff811115611fce578182fd5b611fda87828801611eda565b91505092959194509250565b60008060408385031215611ff8578182fd5b61200183611ebe565b915060208301358015158114612015578182fd5b809150509250929050565b60008060408385031215612032578182fd5b61203b83611ebe565b946020939093013593505050565b60006020828403121561205a578081fd5b8135610cee8161242f565b600060208284031215612076578081fd5b8151610cee8161242f565b60008060208385031215612093578182fd5b823567ffffffffffffffff808211156120aa578384fd5b818501915085601f8301126120bd578384fd5b8135818111156120cb578485fd5b8660208285010111156120dc578485fd5b60209290920196919550909350505050565b6000602082840312156120ff578081fd5b813567ffffffffffffffff811115612115578182fd5b8201601f81018413612125578182fd5b610f1e84823560208401611e48565b600060208284031215612145578081fd5b5035919050565b6000806040838503121561215e578182fd5b82359150602083013567ffffffffffffffff81111561217b578182fd5b61218785828601611eda565b9150509250929050565b600081518084526121a9816020860160208601612357565b601f01601f19169290920160200192915050565b600083516121cf818460208801612357565b8351908301906121e3818360208801612357565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061221f90830184612191565b9695505050505050565b602081526000610cee6020830184612191565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612327576123276123ed565b500190565b60008261233b5761233b612403565b500490565b600082821015612352576123526123ed565b500390565b60005b8381101561237257818101518382015260200161235a565b83811115610c145750506000910152565b600181811c9082168061239757607f821691505b602082108114156123b857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156123d2576123d26123ed565b5060010190565b6000826123e8576123e8612403565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146108d857600080fdfea26469706673582212202e816a652f8ba23f1333762f5dc0593eeadb37da5920e6e45d874fa18ccaa31a64736f6c63430008040033000000000000000000000000595bc8b8e1f68741588d478f4395b83aec062509000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000004d68747470733a2f2f697066732e626f6f6d6170702e6f72672f697066732f516d5738384662464d68683134373364724a3639513945543167366d6147733175776a5554656766466d6e37565a2f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c68747470733a2f2f697066732e626f6f6d6170702e6f72672f697066732f516d626647796e335a73314763716565366576506d62486733504a54577764556948626351623468674339614d4b0000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c80636352211e116100f957806395d89b4111610097578063c87b56dd11610071578063c87b56dd14610383578063e8a3d48514610396578063e985e9c51461039e578063f2fde38b146103da57600080fd5b806395d89b4114610355578063a22cb4651461035d578063b88d4fde1461037057600080fd5b806370a08231116100d357806370a0823114610316578063715018a6146103295780638da5cb5b14610331578063938e3d7b1461034257600080fd5b80636352211e146102e85780636c19e783146102fb5780636d60e6c11461030e57600080fd5b80632f745c59116101665780633ccfd60b116101405780633ccfd60b146102a757806342842e0e146102af5780634f6ccce7146102c257806355f804b3146102d557600080fd5b80632f745c591461027857806332cb6b0c1461028b57806338926b6d1461029457600080fd5b8063095ea7b3116101a2578063095ea7b31461023157806318160ddd146102465780631b4152391461025857806323b872dd1461026557600080fd5b806301ffc9a7146101c957806306fdde03146101f1578063081812fc14610206575b600080fd5b6101dc6101d7366004612049565b6103ed565b60405190151581526020015b60405180910390f35b6101f96103fe565b6040516101e89190612229565b610219610214366004612134565b610490565b6040516001600160a01b0390911681526020016101e8565b61024461023f366004612020565b61052a565b005b6008545b6040519081526020016101e8565b600e546101dc9060ff1681565b610244610273366004611f45565b610640565b61024a610286366004612020565b610671565b61024a6101f481565b6102446102a236600461214c565b610707565b610244610882565b6102446102bd366004611f45565b6108db565b61024a6102d0366004612134565b6108f6565b6102446102e3366004612081565b610997565b6102196102f6366004612134565b6109cd565b610244610309366004611ef9565b610a44565b610244610a90565b61024a610324366004611ef9565b610ace565b610244610b55565b600a546001600160a01b0316610219565b6102446103503660046120ee565b610b8b565b6101f9610bc8565b61024461036b366004611fe6565b610bd7565b61024461037e366004611f80565b610be2565b6101f9610391366004612134565b610c1a565b6101f9610cf5565b6101dc6103ac366004611f13565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6102446103e8366004611ef9565b610d04565b60006103f882610d9c565b92915050565b60606000805461040d90612383565b80601f016020809104026020016040519081016040528092919081815260200182805461043990612383565b80156104865780601f1061045b57610100808354040283529160200191610486565b820191906000526020600020905b81548152906001019060200180831161046957829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661050e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610535826109cd565b9050806001600160a01b0316836001600160a01b031614156105a35760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610505565b336001600160a01b03821614806105bf57506105bf81336103ac565b6106315760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610505565b61063b8383610dc1565b505050565b61064a3382610e2f565b6106665760405162461bcd60e51b8152600401610505906122c3565b61063b838383610f26565b600061067c83610ace565b82106106de5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610505565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600e5460ff166107595760405162461bcd60e51b815260206004820152601a60248201527f426f6f6d3a20636c61696d206973206e6f74206163746976652e0000000000006044820152606401610505565b3233146107b85760405162461bcd60e51b815260206004820152602760248201527f426f6f6d3a20636f6e7472616374206973206e6f7420616c6c6f77656420746f6044820152661031b630b4b69760c91b6064820152608401610505565b6107c33383836110cd565b61080f5760405162461bcd60e51b815260206004820152601860248201527f426f6f6d3a20696e76616c6964207369676e61747572652e00000000000000006044820152606401610505565b6101f461081b60085490565b610826906001612314565b11156108745760405162461bcd60e51b815260206004820152601a60248201527f426f6f6d3a204d617820737570706c792065786365656465642e0000000000006044820152606401610505565b61087e338361118e565b5050565b600a546001600160a01b031633146108ac5760405162461bcd60e51b81526004016105059061228e565b60405133904780156108fc02916000818181858888f193505050501580156108d8573d6000803e3d6000fd5b50565b61063b83838360405180602001604052806000815250610be2565b600061090160085490565b82106109645760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610505565b6008828154811061098557634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b031633146109c15760405162461bcd60e51b81526004016105059061228e565b61063b600b8383611d3b565b6000818152600260205260408120546001600160a01b0316806103f85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610505565b600a546001600160a01b03163314610a6e5760405162461bcd60e51b81526004016105059061228e565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b03163314610aba5760405162461bcd60e51b81526004016105059061228e565b600e805460ff19811660ff90911615179055565b60006001600160a01b038216610b395760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610505565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610b7f5760405162461bcd60e51b81526004016105059061228e565b610b8960006111a8565b565b600a546001600160a01b03163314610bb55760405162461bcd60e51b81526004016105059061228e565b805161087e90600d906020840190611dbf565b60606001805461040d90612383565b61087e3383836111fa565b610bec3383610e2f565b610c085760405162461bcd60e51b8152600401610505906122c3565b610c14848484846112c9565b50505050565b6000818152600260205260409020546060906001600160a01b0316610c995760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610505565b6000610ca36112fc565b90506000815111610cc35760405180602001604052806000815250610cee565b80610ccd8461130b565b604051602001610cde9291906121bd565b6040516020818303038152906040525b9392505050565b6060600d805461040d90612383565b600a546001600160a01b03163314610d2e5760405162461bcd60e51b81526004016105059061228e565b6001600160a01b038116610d935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610505565b6108d8816111a8565b60006001600160e01b0319821663780e9d6360e01b14806103f857506103f882611425565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610df6826109cd565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316610ea85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610505565b6000610eb3836109cd565b9050806001600160a01b0316846001600160a01b03161480610eee5750836001600160a01b0316610ee384610490565b6001600160a01b0316145b80610f1e57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316610f39826109cd565b6001600160a01b031614610f9d5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610505565b6001600160a01b038216610fff5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610505565b61100a838383611475565b611015600082610dc1565b6001600160a01b038316600090815260036020526040812080546001929061103e908490612340565b90915550506001600160a01b038216600090815260036020526040812080546001929061106c908490612314565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600c546040516bffffffffffffffffffffffff19606086901b166020820152603481018490526000916001600160a01b03169061117c90849061117690605401604051602081830303815290604052805190602001206040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90611480565b6001600160a01b031614949350505050565b61087e8282604051806020016040528060008152506114a4565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316141561125c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610505565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6112d4848484610f26565b6112e0848484846114d7565b610c145760405162461bcd60e51b81526004016105059061223c565b6060600b805461040d90612383565b60608161132f5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156113595780611343816123be565b91506113529050600a8361232c565b9150611333565b60008167ffffffffffffffff81111561138257634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156113ac576020820181803683370190505b5090505b8415610f1e576113c1600183612340565b91506113ce600a866123d9565b6113d9906030612314565b60f81b8183815181106113fc57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061141e600a8661232c565b94506113b0565b60006001600160e01b031982166380ac58cd60e01b148061145657506001600160e01b03198216635b5e139f60e01b145b806103f857506301ffc9a760e01b6001600160e01b03198316146103f8565b61063b8383836115e4565b600080600061148f858561169c565b9150915061149c8161170c565b509392505050565b6114ae838361190d565b6114bb60008484846114d7565b61063b5760405162461bcd60e51b81526004016105059061223c565b60006001600160a01b0384163b156115d957604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061151b9033908990889088906004016121ec565b602060405180830381600087803b15801561153557600080fd5b505af1925050508015611565575060408051601f3d908101601f1916820190925261156291810190612065565b60015b6115bf573d808015611593576040519150601f19603f3d011682016040523d82523d6000602084013e611598565b606091505b5080516115b75760405162461bcd60e51b81526004016105059061223c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610f1e565b506001949350505050565b6001600160a01b03831661163f5761163a81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611662565b816001600160a01b0316836001600160a01b031614611662576116628382611a5b565b6001600160a01b0382166116795761063b81611af8565b826001600160a01b0316826001600160a01b03161461063b5761063b8282611bd1565b6000808251604114156116d35760208301516040840151606085015160001a6116c787828585611c15565b94509450505050611705565b8251604014156116fd57602083015160408401516116f2868383611d02565b935093505050611705565b506000905060025b9250929050565b600081600481111561172e57634e487b7160e01b600052602160045260246000fd5b14156117375750565b600181600481111561175957634e487b7160e01b600052602160045260246000fd5b14156117a75760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610505565b60028160048111156117c957634e487b7160e01b600052602160045260246000fd5b14156118175760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610505565b600381600481111561183957634e487b7160e01b600052602160045260246000fd5b14156118925760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610505565b60048160048111156118b457634e487b7160e01b600052602160045260246000fd5b14156108d85760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610505565b6001600160a01b0382166119635760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610505565b6000818152600260205260409020546001600160a01b0316156119c85760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610505565b6119d460008383611475565b6001600160a01b03821660009081526003602052604081208054600192906119fd908490612314565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001611a6884610ace565b611a729190612340565b600083815260076020526040902054909150808214611ac5576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611b0a90600190612340565b60008381526009602052604081205460088054939450909284908110611b4057634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110611b6f57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611bb557634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000611bdc83610ace565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611c4c5750600090506003611cf9565b8460ff16601b14158015611c6457508460ff16601c14155b15611c755750600090506004611cf9565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611cc9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611cf257600060019250925050611cf9565b9150600090505b94509492505050565b6000806001600160ff1b03831681611d1f60ff86901c601b612314565b9050611d2d87828885611c15565b935093505050935093915050565b828054611d4790612383565b90600052602060002090601f016020900481019282611d695760008555611daf565b82601f10611d825782800160ff19823516178555611daf565b82800160010185558215611daf579182015b82811115611daf578235825591602001919060010190611d94565b50611dbb929150611e33565b5090565b828054611dcb90612383565b90600052602060002090601f016020900481019282611ded5760008555611daf565b82601f10611e0657805160ff1916838001178555611daf565b82800160010185558215611daf579182015b82811115611daf578251825591602001919060010190611e18565b5b80821115611dbb5760008155600101611e34565b600067ffffffffffffffff80841115611e6357611e63612419565b604051601f8501601f19908116603f01168101908282118183101715611e8b57611e8b612419565b81604052809350858152868686011115611ea457600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611ed557600080fd5b919050565b600082601f830112611eea578081fd5b610cee83833560208501611e48565b600060208284031215611f0a578081fd5b610cee82611ebe565b60008060408385031215611f25578081fd5b611f2e83611ebe565b9150611f3c60208401611ebe565b90509250929050565b600080600060608486031215611f59578081fd5b611f6284611ebe565b9250611f7060208501611ebe565b9150604084013590509250925092565b60008060008060808587031215611f95578081fd5b611f9e85611ebe565b9350611fac60208601611ebe565b925060408501359150606085013567ffffffffffffffff811115611fce578182fd5b611fda87828801611eda565b91505092959194509250565b60008060408385031215611ff8578182fd5b61200183611ebe565b915060208301358015158114612015578182fd5b809150509250929050565b60008060408385031215612032578182fd5b61203b83611ebe565b946020939093013593505050565b60006020828403121561205a578081fd5b8135610cee8161242f565b600060208284031215612076578081fd5b8151610cee8161242f565b60008060208385031215612093578182fd5b823567ffffffffffffffff808211156120aa578384fd5b818501915085601f8301126120bd578384fd5b8135818111156120cb578485fd5b8660208285010111156120dc578485fd5b60209290920196919550909350505050565b6000602082840312156120ff578081fd5b813567ffffffffffffffff811115612115578182fd5b8201601f81018413612125578182fd5b610f1e84823560208401611e48565b600060208284031215612145578081fd5b5035919050565b6000806040838503121561215e578182fd5b82359150602083013567ffffffffffffffff81111561217b578182fd5b61218785828601611eda565b9150509250929050565b600081518084526121a9816020860160208601612357565b601f01601f19169290920160200192915050565b600083516121cf818460208801612357565b8351908301906121e3818360208801612357565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061221f90830184612191565b9695505050505050565b602081526000610cee6020830184612191565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612327576123276123ed565b500190565b60008261233b5761233b612403565b500490565b600082821015612352576123526123ed565b500390565b60005b8381101561237257818101518382015260200161235a565b83811115610c145750506000910152565b600181811c9082168061239757607f821691505b602082108114156123b857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156123d2576123d26123ed565b5060010190565b6000826123e8576123e8612403565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146108d857600080fdfea26469706673582212202e816a652f8ba23f1333762f5dc0593eeadb37da5920e6e45d874fa18ccaa31a64736f6c63430008040033

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

000000000000000000000000595bc8b8e1f68741588d478f4395b83aec062509000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000004d68747470733a2f2f697066732e626f6f6d6170702e6f72672f697066732f516d5738384662464d68683134373364724a3639513945543167366d6147733175776a5554656766466d6e37565a2f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004c68747470733a2f2f697066732e626f6f6d6170702e6f72672f697066732f516d626647796e335a73314763716565366576506d62486733504a54577764556948626351623468674339614d4b0000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : signer (address): 0x595BC8B8E1F68741588d478F4395b83Aec062509
Arg [1] : _initialBaseURI (string): https://ipfs.boomapp.org/ipfs/QmW88FbFMhh1473drJ69Q9ET1g6maGs1uwjUTegfFmn7VZ/
Arg [2] : _initialContractURI (string): https://ipfs.boomapp.org/ipfs/QmbfGyn3Zs1Gcqee6evPmbHg3PJTWwdUiHbcQb4hgC9aMK

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 000000000000000000000000595bc8b8e1f68741588d478f4395b83aec062509
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 000000000000000000000000000000000000000000000000000000000000004d
Arg [4] : 68747470733a2f2f697066732e626f6f6d6170702e6f72672f697066732f516d
Arg [5] : 5738384662464d68683134373364724a3639513945543167366d614773317577
Arg [6] : 6a5554656766466d6e37565a2f00000000000000000000000000000000000000
Arg [7] : 000000000000000000000000000000000000000000000000000000000000004c
Arg [8] : 68747470733a2f2f697066732e626f6f6d6170702e6f72672f697066732f516d
Arg [9] : 626647796e335a73314763716565366576506d62486733504a54577764556948
Arg [10] : 626351623468674339614d4b0000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

944:2603:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2207:221;;;;;;:::i;:::-;;:::i;:::-;;;7634:14:14;;7627:22;7609:41;;7597:2;7582:18;2207:221:13;;;;;;;;2488:98:1;;;:::i;:::-;;;;;;;:::i;3999:217::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6932:32:14;;;6914:51;;6902:2;6887:18;3999:217:1;6869:102:14;3537:401:1;;;;;;:::i;:::-;;:::i;:::-;;1615:111:4;1702:10;:17;1615:111;;;18627:25:14;;;18615:2;18600:18;1615:111:4;18582:76:14;1174:31:13;;;;;;;;;4726:330:1;;;;;;:::i;:::-;;:::i;1291:253:4:-;;;;;;:::i;:::-;;:::i;1128:40:13:-;;1165:3;1128:40;;1495:491;;;;;;:::i;:::-;;:::i;2676:107::-;;;:::i;5122:179:1:-;;;;;;:::i;:::-;;:::i;1798:230:4:-;;;;;;:::i;:::-;;:::i;2789:104:13:-;;;;;;:::i;:::-;;:::i;2191:235:1:-;;;;;;:::i;:::-;;:::i;3050:87:13:-;;;;;;:::i;:::-;;:::i;3143:88::-;;;:::i;1929:205:1:-;;;;;;:::i;:::-;;:::i;1668:101:0:-;;;:::i;1036:85::-;1108:6;;-1:-1:-1;;;;;1108:6:0;1036:85;;2929:115:13;;;;;;:::i;:::-;;:::i;2650:102:1:-;;;:::i;4283:153::-;;;;;;:::i;:::-;;:::i;5367:320::-;;;;;;:::i;:::-;;:::i;2818:329::-;;;;;;:::i;:::-;;:::i;2465:95:13:-;;;:::i;4502:162:1:-;;;;;;:::i;:::-;-1:-1:-1;;;;;4622:25:1;;;4599:4;4622:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4502:162;1918:198:0;;;;;;:::i;:::-;;:::i;2207:221:13:-;2358:4;2385:36;2409:11;2385:23;:36::i;:::-;2378:43;2207:221;-1:-1:-1;;2207:221:13:o;2488:98:1:-;2542:13;2574:5;2567:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:98;:::o;3999:217::-;4075:7;7247:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7247:16:1;4094:73;;;;-1:-1:-1;;;4094:73:1;;15552:2:14;4094:73:1;;;15534:21:14;15591:2;15571:18;;;15564:30;15630:34;15610:18;;;15603:62;-1:-1:-1;;;15681:18:14;;;15674:42;15733:19;;4094:73:1;;;;;;;;;-1:-1:-1;4185:24:1;;;;:15;:24;;;;;;-1:-1:-1;;;;;4185:24:1;;3999:217::o;3537:401::-;3617:13;3633:23;3648:7;3633:14;:23::i;:::-;3617:39;;3680:5;-1:-1:-1;;;;;3674:11:1;:2;-1:-1:-1;;;;;3674:11:1;;;3666:57;;;;-1:-1:-1;;;3666:57:1;;16742:2:14;3666:57:1;;;16724:21:14;16781:2;16761:18;;;16754:30;16820:34;16800:18;;;16793:62;-1:-1:-1;;;16871:18:14;;;16864:31;16912:19;;3666:57:1;16714:223:14;3666:57:1;719:10:8;-1:-1:-1;;;;;3755:21:1;;;;:62;;-1:-1:-1;3780:37:1;3797:5;719:10:8;4502:162:1;:::i;3780:37::-;3734:165;;;;-1:-1:-1;;;3734:165:1;;13542:2:14;3734:165:1;;;13524:21:14;13581:2;13561:18;;;13554:30;13620:34;13600:18;;;13593:62;13691:26;13671:18;;;13664:54;13735:19;;3734:165:1;13514:246:14;3734:165:1;3910:21;3919:2;3923:7;3910:8;:21::i;:::-;3537:401;;;:::o;4726:330::-;4915:41;719:10:8;4948:7:1;4915:18;:41::i;:::-;4907:103;;;;-1:-1:-1;;;4907:103:1;;;;;;;:::i;:::-;5021:28;5031:4;5037:2;5041:7;5021:9;:28::i;1291:253:4:-;1388:7;1423:23;1440:5;1423:16;:23::i;:::-;1415:5;:31;1407:87;;;;-1:-1:-1;;;1407:87:4;;9203:2:14;1407:87:4;;;9185:21:14;9242:2;9222:18;;;9215:30;9281:34;9261:18;;;9254:62;-1:-1:-1;;;9332:18:14;;;9325:41;9383:19;;1407:87:4;9175:233:14;1407:87:4;-1:-1:-1;;;;;;1511:19:4;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1291:253::o;1495:491:13:-;1578:11;;;;1570:50;;;;-1:-1:-1;;;1570:50:13;;18328:2:14;1570:50:13;;;18310:21:14;18367:2;18347:18;;;18340:30;18406:28;18386:18;;;18379:56;18452:18;;1570:50:13;18300:176:14;1570:50:13;1651:9;1664:10;1651:23;1630:109;;;;-1:-1:-1;;;1630:109:13;;11559:2:14;1630:109:13;;;11541:21:14;11598:2;11578:18;;;11571:30;11637:34;11617:18;;;11610:62;-1:-1:-1;;;11688:18:14;;;11681:37;11735:19;;1630:109:13;11531:229:14;1630:109:13;1770:39;1778:10;1790:7;1799:9;1770:7;:39::i;:::-;1749:110;;;;-1:-1:-1;;;1749:110:13;;17975:2:14;1749:110:13;;;17957:21:14;18014:2;17994:18;;;17987:30;18053:26;18033:18;;;18026:54;18097:18;;1749:110:13;17947:174:14;1749:110:13;1165:3;1877:13;1702:10:4;:17;;1615:111;1877:13:13;:17;;1893:1;1877:17;:::i;:::-;:31;;1869:70;;;;-1:-1:-1;;;1869:70:13;;10034:2:14;1869:70:13;;;10016:21:14;10073:2;10053:18;;;10046:30;10112:28;10092:18;;;10085:56;10158:18;;1869:70:13;10006:176:14;1869:70:13;1949:30;1959:10;1971:7;1949:9;:30::i;:::-;1495:491;;:::o;2676:107::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;2725:51:13::1;::::0;2733:10:::1;::::0;2754:21:::1;2725:51:::0;::::1;;;::::0;::::1;::::0;;;2754:21;2733:10;2725:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;2676:107::o:0;5122:179:1:-;5255:39;5272:4;5278:2;5282:7;5255:39;;;;;;;;;;;;:16;:39::i;1798:230:4:-;1873:7;1908:30;1702:10;:17;;1615:111;1908:30;1900:5;:38;1892:95;;;;-1:-1:-1;;;1892:95:4;;17562:2:14;1892:95:4;;;17544:21:14;17601:2;17581:18;;;17574:30;17640:34;17620:18;;;17613:62;-1:-1:-1;;;17691:18:14;;;17684:42;17743:19;;1892:95:4;17534:234:14;1892:95:4;2004:10;2015:5;2004:17;;;;;;-1:-1:-1;;;2004:17:4;;;;;;;;;;;;;;;;;1997:24;;1798:230;;;:::o;2789:104:13:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;2863:23:13::1;:13;2879:7:::0;;2863:23:::1;:::i;2191:235:1:-:0;2263:7;2298:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2298:16:1;2332:19;2324:73;;;;-1:-1:-1;;;2324:73:1;;14378:2:14;2324:73:1;;;14360:21:14;14417:2;14397:18;;;14390:30;14456:34;14436:18;;;14429:62;-1:-1:-1;;;14507:18:14;;;14500:39;14556:19;;2324:73:1;14350:231:14;3050:87:13;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;3114:7:13::1;:16:::0;;-1:-1:-1;;;;;;3114:16:13::1;-1:-1:-1::0;;;;;3114:16:13;;;::::1;::::0;;;::::1;::::0;;3050:87::o;3143:88::-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;3213:11:13::1;::::0;;-1:-1:-1;;3198:26:13;::::1;3213:11;::::0;;::::1;3212:12;3198:26;::::0;;3143:88::o;1929:205:1:-;2001:7;-1:-1:-1;;;;;2028:19:1;;2020:74;;;;-1:-1:-1;;;2020:74:1;;13967:2:14;2020:74:1;;;13949:21:14;14006:2;13986:18;;;13979:30;14045:34;14025:18;;;14018:62;-1:-1:-1;;;14096:18:14;;;14089:40;14146:19;;2020:74:1;13939:232:14;2020:74:1;-1:-1:-1;;;;;;2111:16:1;;;;;:9;:16;;;;;;;1929:205::o;1668:101:0:-;1108:6;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;2929:115:13:-;1108:6:0;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;3010:27:13;;::::1;::::0;:12:::1;::::0;:27:::1;::::0;::::1;::::0;::::1;:::i;2650:102:1:-:0;2706:13;2738:7;2731:14;;;;;:::i;4283:153::-;4377:52;719:10:8;4410:8:1;4420;4377:18;:52::i;5367:320::-;5536:41;719:10:8;5569:7:1;5536:18;:41::i;:::-;5528:103;;;;-1:-1:-1;;;5528:103:1;;;;;;;:::i;:::-;5641:39;5655:4;5661:2;5665:7;5674:5;5641:13;:39::i;:::-;5367:320;;;;:::o;2818:329::-;7224:4;7247:16;;;:7;:16;;;;;;2891:13;;-1:-1:-1;;;;;7247:16:1;2916:76;;;;-1:-1:-1;;;2916:76:1;;16326:2:14;2916:76:1;;;16308:21:14;16365:2;16345:18;;;16338:30;16404:34;16384:18;;;16377:62;-1:-1:-1;;;16455:18:14;;;16448:45;16510:19;;2916:76:1;16298:237:14;2916:76:1;3003:21;3027:10;:8;:10::i;:::-;3003:34;;3078:1;3060:7;3054:21;:25;:86;;;;;;;;;;;;;;;;;3106:7;3115:18;:7;:16;:18::i;:::-;3089:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3054:86;3047:93;2818:329;-1:-1:-1;;;2818:329:1:o;2465:95:13:-;2509:13;2541:12;2534:19;;;;;:::i;1918:198:0:-;1108:6;;-1:-1:-1;;;;;1108:6:0;719:10:8;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2006:22:0;::::1;1998:73;;;::::0;-1:-1:-1;;;1998:73:0;;10389:2:14;1998:73:0::1;::::0;::::1;10371:21:14::0;10428:2;10408:18;;;10401:30;10467:34;10447:18;;;10440:62;-1:-1:-1;;;10518:18:14;;;10511:36;10564:19;;1998:73:0::1;10361:228:14::0;1998:73:0::1;2081:28;2100:8;2081:18;:28::i;990:222:4:-:0;1092:4;-1:-1:-1;;;;;;1115:50:4;;-1:-1:-1;;;1115:50:4;;:90;;;1169:36;1193:11;1169:23;:36::i;11168:171:1:-;11242:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11242:29:1;-1:-1:-1;;;;;11242:29:1;;;;;;;;:24;;11295:23;11242:24;11295:14;:23::i;:::-;-1:-1:-1;;;;;11286:46:1;;;;;;;;;;;11168:171;;:::o;7442:344::-;7535:4;7247:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7247:16:1;7551:73;;;;-1:-1:-1;;;7551:73:1;;13129:2:14;7551:73:1;;;13111:21:14;13168:2;13148:18;;;13141:30;13207:34;13187:18;;;13180:62;-1:-1:-1;;;13258:18:14;;;13251:42;13310:19;;7551:73:1;13101:234:14;7551:73:1;7634:13;7650:23;7665:7;7650:14;:23::i;:::-;7634:39;;7702:5;-1:-1:-1;;;;;7691:16:1;:7;-1:-1:-1;;;;;7691:16:1;;:51;;;;7735:7;-1:-1:-1;;;;;7711:31:1;:20;7723:7;7711:11;:20::i;:::-;-1:-1:-1;;;;;7711:31:1;;7691:51;:87;;;-1:-1:-1;;;;;;4622:25:1;;;4599:4;4622:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7746:32;7683:96;7442:344;-1:-1:-1;;;;7442:344:1:o;10452:605::-;10606:4;-1:-1:-1;;;;;10579:31:1;:23;10594:7;10579:14;:23::i;:::-;-1:-1:-1;;;;;10579:31:1;;10571:81;;;;-1:-1:-1;;;10571:81:1;;10796:2:14;10571:81:1;;;10778:21:14;10835:2;10815:18;;;10808:30;10874:34;10854:18;;;10847:62;-1:-1:-1;;;10925:18:14;;;10918:35;10970:19;;10571:81:1;10768:227:14;10571:81:1;-1:-1:-1;;;;;10670:16:1;;10662:65;;;;-1:-1:-1;;;10662:65:1;;11967:2:14;10662:65:1;;;11949:21:14;12006:2;11986:18;;;11979:30;12045:34;12025:18;;;12018:62;-1:-1:-1;;;12096:18:14;;;12089:34;12140:19;;10662:65:1;11939:226:14;10662:65:1;10738:39;10759:4;10765:2;10769:7;10738:20;:39::i;:::-;10839:29;10856:1;10860:7;10839:8;:29::i;:::-;-1:-1:-1;;;;;10879:15:1;;;;;;:9;:15;;;;;:20;;10898:1;;10879:15;:20;;10898:1;;10879:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10909:13:1;;;;;;:9;:13;;;;;:18;;10926:1;;10909:13;:18;;10926:1;;10909:18;:::i;:::-;;;;-1:-1:-1;;10937:16:1;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10937:21:1;-1:-1:-1;;;;;10937:21:1;;;;;;;;;10974:27;;10937:16;;10974:27;;;;;;;3537:401;;;:::o;3237:308:13:-;3531:7;;3412:35;;-1:-1:-1;;5786:2:14;5782:15;;;5778:53;3412:35:13;;;5766:66:14;5848:12;;;5841:28;;;3367:4:13;;-1:-1:-1;;;;;3531:7:13;;3402:125;;3516:10;;3402:88;;5885:12:14;;3412:35:13;;;;;;;;;;;;3402:46;;;;;;8211:58:10;;6625:66:14;8211:58:10;;;6613:79:14;6708:12;;;6701:28;;;8081:7:10;;6745:12:14;;8211:58:10;;;;;;;;;;;;8201:69;;;;;;8194:76;;8012:265;;;;3402:88:13;:113;;:125::i;:::-;-1:-1:-1;;;;;3402:136:13;;;3237:308;-1:-1:-1;;;;3237:308:13:o;8116:108:1:-;8191:26;8201:2;8205:7;8191:26;;;;;;;;;;;;:9;:26::i;2270:187:0:-;2362:6;;;-1:-1:-1;;;;;2378:17:0;;;-1:-1:-1;;;;;;2378:17:0;;;;;;;2410:40;;2362:6;;;2378:17;2362:6;;2410:40;;2343:16;;2410:40;2270:187;;:::o;11474:307:1:-;11624:8;-1:-1:-1;;;;;11615:17:1;:5;-1:-1:-1;;;;;11615:17:1;;;11607:55;;;;-1:-1:-1;;;11607:55:1;;12372:2:14;11607:55:1;;;12354:21:14;12411:2;12391:18;;;12384:30;12450:27;12430:18;;;12423:55;12495:18;;11607:55:1;12344:175:14;11607:55:1;-1:-1:-1;;;;;11672:25:1;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11672:46:1;;;;;;;;;;11733:41;;7609::14;;;11733::1;;7582:18:14;11733:41:1;;;;;;;11474:307;;;:::o;6549:::-;6700:28;6710:4;6716:2;6720:7;6700:9;:28::i;:::-;6746:48;6769:4;6775:2;6779:7;6788:5;6746:22;:48::i;:::-;6738:111;;;;-1:-1:-1;;;6738:111:1;;;;;;;:::i;2566:104:13:-;2618:13;2650;2643:20;;;;;:::i;328:703:9:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:9;;;;;;;;;;;;-1:-1:-1;;;627:10:9;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:9;;-1:-1:-1;773:2:9;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;-1:-1:-1;;;817:17:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:9;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:9;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;-1:-1:-1;;;902:14:9;;;;;;;;;;;;:56;-1:-1:-1;;;;;902:56:9;;;;;;;;-1:-1:-1;972:11:9;981:2;972:11;;:::i;:::-;;;844:150;;1570:300:1;1672:4;-1:-1:-1;;;;;;1707:40:1;;-1:-1:-1;;;1707:40:1;;:104;;-1:-1:-1;;;;;;;1763:48:1;;-1:-1:-1;;;1763:48:1;1707:104;:156;;;-1:-1:-1;;;;;;;;;;937:40:11;;;1827:36:1;829:155:11;1992:209:13;2149:45;2176:4;2182:2;2186:7;2149:26;:45::i;4308:227:10:-;4386:7;4406:17;4425:18;4447:27;4458:4;4464:9;4447:10;:27::i;:::-;4405:69;;;;4484:18;4496:5;4484:11;:18::i;:::-;-1:-1:-1;4519:9:10;4308:227;-1:-1:-1;;;4308:227:10:o;8445:311:1:-;8570:18;8576:2;8580:7;8570:5;:18::i;:::-;8619:54;8650:1;8654:2;8658:7;8667:5;8619:22;:54::i;:::-;8598:151;;;;-1:-1:-1;;;8598:151:1;;;;;;;:::i;12334:778::-;12484:4;-1:-1:-1;;;;;12504:13:1;;1465:19:7;:23;12500:606:1;;12539:72;;-1:-1:-1;;;12539:72:1;;-1:-1:-1;;;;;12539:36:1;;;;;:72;;719:10:8;;12590:4:1;;12596:7;;12605:5;;12539:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12539:72:1;;;;;;;;-1:-1:-1;;12539:72:1;;;;;;;;;;;;:::i;:::-;;;12535:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12778:13:1;;12774:266;;12820:60;;-1:-1:-1;;;12820:60:1;;;;;;;:::i;12774:266::-;12992:6;12986:13;12977:6;12973:2;12969:15;12962:38;12535:519;-1:-1:-1;;;;;;12661:51:1;-1:-1:-1;;;12661:51:1;;-1:-1:-1;12654:58:1;;12500:606;-1:-1:-1;13091:4:1;12334:778;;;;;;:::o;2624:572:4:-;-1:-1:-1;;;;;2823:18:4;;2819:183;;2857:40;2889:7;4005:10;:17;;3978:24;;;;:15;:24;;;;;:44;;;4032:24;;;;;;;;;;;;3902:161;2857:40;2819:183;;;2926:2;-1:-1:-1;;;;;2918:10:4;:4;-1:-1:-1;;;;;2918:10:4;;2914:88;;2944:47;2977:4;2983:7;2944:32;:47::i;:::-;-1:-1:-1;;;;;3015:16:4;;3011:179;;3047:45;3084:7;3047:36;:45::i;3011:179::-;3119:4;-1:-1:-1;;;;;3113:10:4;:2;-1:-1:-1;;;;;3113:10:4;;3109:81;;3139:40;3167:2;3171:7;3139:27;:40::i;2243:1279:10:-;2324:7;2333:12;2554:9;:16;2574:2;2554:22;2550:966;;;2843:4;2828:20;;2822:27;2892:4;2877:20;;2871:27;2949:4;2934:20;;2928:27;2592:9;2920:36;2990:25;3001:4;2920:36;2822:27;2871;2990:10;:25::i;:::-;2983:32;;;;;;;;;2550:966;3036:9;:16;3056:2;3036:22;3032:484;;;3305:4;3290:20;;3284:27;3355:4;3340:20;;3334:27;3395:23;3406:4;3284:27;3334;3395:10;:23::i;:::-;3388:30;;;;;;;;3032:484;-1:-1:-1;3465:1:10;;-1:-1:-1;3469:35:10;3032:484;2243:1279;;;;;:::o;548:631::-;625:20;616:5;:29;;;;;;-1:-1:-1;;;616:29:10;;;;;;;;;;612:561;;;548:631;:::o;612:561::-;721:29;712:5;:38;;;;;;-1:-1:-1;;;712:38:10;;;;;;;;;;708:465;;;766:34;;-1:-1:-1;;;766:34:10;;8490:2:14;766:34:10;;;8472:21:14;8529:2;8509:18;;;8502:30;8568:26;8548:18;;;8541:54;8612:18;;766:34:10;8462:174:14;708:465:10;830:35;821:5;:44;;;;;;-1:-1:-1;;;821:44:10;;;;;;;;;;817:356;;;881:41;;-1:-1:-1;;;881:41:10;;8843:2:14;881:41:10;;;8825:21:14;8882:2;8862:18;;;8855:30;8921:33;8901:18;;;8894:61;8972:18;;881:41:10;8815:181:14;817:356:10;952:30;943:5;:39;;;;;;-1:-1:-1;;;943:39:10;;;;;;;;;;939:234;;;998:44;;-1:-1:-1;;;998:44:10;;12726:2:14;998:44:10;;;12708:21:14;12765:2;12745:18;;;12738:30;12804:34;12784:18;;;12777:62;-1:-1:-1;;;12855:18:14;;;12848:32;12897:19;;998:44:10;12698:224:14;939:234:10;1072:30;1063:5;:39;;;;;;-1:-1:-1;;;1063:39:10;;;;;;;;;;1059:114;;;1118:44;;-1:-1:-1;;;1118:44:10;;14788:2:14;1118:44:10;;;14770:21:14;14827:2;14807:18;;;14800:30;14866:34;14846:18;;;14839:62;-1:-1:-1;;;14917:18:14;;;14910:32;14959:19;;1118:44:10;14760:224:14;9078:427:1;-1:-1:-1;;;;;9157:16:1;;9149:61;;;;-1:-1:-1;;;9149:61:1;;15191:2:14;9149:61:1;;;15173:21:14;;;15210:18;;;15203:30;15269:34;15249:18;;;15242:62;15321:18;;9149:61:1;15163:182:14;9149:61:1;7224:4;7247:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7247:16:1;:30;9220:58;;;;-1:-1:-1;;;9220:58:1;;11202:2:14;9220:58:1;;;11184:21:14;11241:2;11221:18;;;11214:30;11280;11260:18;;;11253:58;11328:18;;9220:58:1;11174:178:14;9220:58:1;9289:45;9318:1;9322:2;9326:7;9289:20;:45::i;:::-;-1:-1:-1;;;;;9345:13:1;;;;;;:9;:13;;;;;:18;;9362:1;;9345:13;:18;;9362:1;;9345:18;:::i;:::-;;;;-1:-1:-1;;9373:16:1;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9373:21:1;-1:-1:-1;;;;;9373:21:1;;;;;;;;9410:33;;9373:16;;;9410:33;;9373:16;;9410:33;1495:491:13;;:::o;4680:970:4:-;4942:22;4992:1;4967:22;4984:4;4967:16;:22::i;:::-;:26;;;;:::i;:::-;5003:18;5024:26;;;:17;:26;;;;;;4942:51;;-1:-1:-1;5154:28:4;;;5150:323;;-1:-1:-1;;;;;5220:18:4;;5198:19;5220:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5269:30;;;;;;:44;;;5385:30;;:17;:30;;;;;:43;;;5150:323;-1:-1:-1;5566:26:4;;;;:17;:26;;;;;;;;5559:33;;;-1:-1:-1;;;;;5609:18:4;;;;;:12;:18;;;;;:34;;;;;;;5602:41;4680:970::o;5938:1061::-;6212:10;:17;6187:22;;6212:21;;6232:1;;6212:21;:::i;:::-;6243:18;6264:24;;;:15;:24;;;;;;6632:10;:26;;6187:46;;-1:-1:-1;6264:24:4;;6187:46;;6632:26;;;;-1:-1:-1;;;6632:26:4;;;;;;;;;;;;;;;;;6610:48;;6694:11;6669:10;6680;6669:22;;;;;;-1:-1:-1;;;6669:22:4;;;;;;;;;;;;;;;;;;;;:36;;;;6773:28;;;:15;:28;;;;;;;:41;;;6942:24;;;;;6935:31;6976:10;:16;;;;;-1:-1:-1;;;6976:16:4;;;;;;;;;;;;;;;;;;;;;;;;;;5938:1061;;;;:::o;3490:217::-;3574:14;3591:20;3608:2;3591:16;:20::i;:::-;-1:-1:-1;;;;;3621:16:4;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3665:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3490:217:4:o;5716:1603:10:-;5842:7;;6766:66;6753:79;;6749:161;;;-1:-1:-1;6864:1:10;;-1:-1:-1;6868:30:10;6848:51;;6749:161;6923:1;:7;;6928:2;6923:7;;:18;;;;;6934:1;:7;;6939:2;6934:7;;6923:18;6919:100;;;-1:-1:-1;6973:1:10;;-1:-1:-1;6977:30:10;6957:51;;6919:100;7130:24;;;7113:14;7130:24;;;;;;;;;7888:25:14;;;7961:4;7949:17;;7929:18;;;7922:45;;;;7983:18;;;7976:34;;;8026:18;;;8019:34;;;7130:24:10;;7860:19:14;;7130:24:10;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7130:24:10;;-1:-1:-1;;7130:24:10;;;-1:-1:-1;;;;;;;7168:20:10;;7164:101;;7220:1;7224:29;7204:50;;;;;;;7164:101;7283:6;-1:-1:-1;7291:20:10;;-1:-1:-1;5716:1603:10;;;;;;;;:::o;4789:336::-;4899:7;;-1:-1:-1;;;;;4944:80:10;;4899:7;5050:25;5066:3;5051:18;;;5073:2;5050:25;:::i;:::-;5034:42;;5093:25;5104:4;5110:1;5113;5116;5093:10;:25::i;:::-;5086:32;;;;;;4789:336;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:14;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:14;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:14;;757:42;;747:2;;813:1;810;803:12;747:2;699:124;;;:::o;828:228::-;870:5;923:3;916:4;908:6;904:17;900:27;890:2;;945:5;938;931:20;890:2;971:79;1046:3;1037:6;1024:20;1017:4;1009:6;1005:17;971:79;:::i;1061:196::-;1120:6;1173:2;1161:9;1152:7;1148:23;1144:32;1141:2;;;1194:6;1186;1179:22;1141:2;1222:29;1241:9;1222:29;:::i;1262:270::-;1330:6;1338;1391:2;1379:9;1370:7;1366:23;1362:32;1359:2;;;1412:6;1404;1397:22;1359:2;1440:29;1459:9;1440:29;:::i;:::-;1430:39;;1488:38;1522:2;1511:9;1507:18;1488:38;:::i;:::-;1478:48;;1349:183;;;;;:::o;1537:338::-;1614:6;1622;1630;1683:2;1671:9;1662:7;1658:23;1654:32;1651:2;;;1704:6;1696;1689:22;1651:2;1732:29;1751:9;1732:29;:::i;:::-;1722:39;;1780:38;1814:2;1803:9;1799:18;1780:38;:::i;:::-;1770:48;;1865:2;1854:9;1850:18;1837:32;1827:42;;1641:234;;;;;:::o;1880:557::-;1975:6;1983;1991;1999;2052:3;2040:9;2031:7;2027:23;2023:33;2020:2;;;2074:6;2066;2059:22;2020:2;2102:29;2121:9;2102:29;:::i;:::-;2092:39;;2150:38;2184:2;2173:9;2169:18;2150:38;:::i;:::-;2140:48;;2235:2;2224:9;2220:18;2207:32;2197:42;;2290:2;2279:9;2275:18;2262:32;2317:18;2309:6;2306:30;2303:2;;;2354:6;2346;2339:22;2303:2;2382:49;2423:7;2414:6;2403:9;2399:22;2382:49;:::i;:::-;2372:59;;;2010:427;;;;;;;:::o;2442:367::-;2507:6;2515;2568:2;2556:9;2547:7;2543:23;2539:32;2536:2;;;2589:6;2581;2574:22;2536:2;2617:29;2636:9;2617:29;:::i;:::-;2607:39;;2696:2;2685:9;2681:18;2668:32;2743:5;2736:13;2729:21;2722:5;2719:32;2709:2;;2770:6;2762;2755:22;2709:2;2798:5;2788:15;;;2526:283;;;;;:::o;2814:264::-;2882:6;2890;2943:2;2931:9;2922:7;2918:23;2914:32;2911:2;;;2964:6;2956;2949:22;2911:2;2992:29;3011:9;2992:29;:::i;:::-;2982:39;3068:2;3053:18;;;;3040:32;;-1:-1:-1;;;2901:177:14:o;3083:255::-;3141:6;3194:2;3182:9;3173:7;3169:23;3165:32;3162:2;;;3215:6;3207;3200:22;3162:2;3259:9;3246:23;3278:30;3302:5;3278:30;:::i;3343:259::-;3412:6;3465:2;3453:9;3444:7;3440:23;3436:32;3433:2;;;3486:6;3478;3471:22;3433:2;3523:9;3517:16;3542:30;3566:5;3542:30;:::i;3607:642::-;3678:6;3686;3739:2;3727:9;3718:7;3714:23;3710:32;3707:2;;;3760:6;3752;3745:22;3707:2;3805:9;3792:23;3834:18;3875:2;3867:6;3864:14;3861:2;;;3896:6;3888;3881:22;3861:2;3939:6;3928:9;3924:22;3914:32;;3984:7;3977:4;3973:2;3969:13;3965:27;3955:2;;4011:6;4003;3996:22;3955:2;4056;4043:16;4082:2;4074:6;4071:14;4068:2;;;4103:6;4095;4088:22;4068:2;4153:7;4148:2;4139:6;4135:2;4131:15;4127:24;4124:37;4121:2;;;4179:6;4171;4164:22;4121:2;4215;4207:11;;;;;4237:6;;-1:-1:-1;3697:552:14;;-1:-1:-1;;;;3697:552:14:o;4254:480::-;4323:6;4376:2;4364:9;4355:7;4351:23;4347:32;4344:2;;;4397:6;4389;4382:22;4344:2;4442:9;4429:23;4475:18;4467:6;4464:30;4461:2;;;4512:6;4504;4497:22;4461:2;4540:22;;4593:4;4585:13;;4581:27;-1:-1:-1;4571:2:14;;4627:6;4619;4612:22;4571:2;4655:73;4720:7;4715:2;4702:16;4697:2;4693;4689:11;4655:73;:::i;4739:190::-;4798:6;4851:2;4839:9;4830:7;4826:23;4822:32;4819:2;;;4872:6;4864;4857:22;4819:2;-1:-1:-1;4900:23:14;;4809:120;-1:-1:-1;4809:120:14:o;4934:408::-;5011:6;5019;5072:2;5060:9;5051:7;5047:23;5043:32;5040:2;;;5093:6;5085;5078:22;5040:2;5134:9;5121:23;5111:33;;5195:2;5184:9;5180:18;5167:32;5222:18;5214:6;5211:30;5208:2;;;5259:6;5251;5244:22;5208:2;5287:49;5328:7;5319:6;5308:9;5304:22;5287:49;:::i;:::-;5277:59;;;5030:312;;;;;:::o;5347:257::-;5388:3;5426:5;5420:12;5453:6;5448:3;5441:19;5469:63;5525:6;5518:4;5513:3;5509:14;5502:4;5495:5;5491:16;5469:63;:::i;:::-;5586:2;5565:15;-1:-1:-1;;5561:29:14;5552:39;;;;5593:4;5548:50;;5396:208;-1:-1:-1;;5396:208:14:o;5908:470::-;6087:3;6125:6;6119:13;6141:53;6187:6;6182:3;6175:4;6167:6;6163:17;6141:53;:::i;:::-;6257:13;;6216:16;;;;6279:57;6257:13;6216:16;6313:4;6301:17;;6279:57;:::i;:::-;6352:20;;6095:283;-1:-1:-1;;;;6095:283:14:o;6976:488::-;-1:-1:-1;;;;;7245:15:14;;;7227:34;;7297:15;;7292:2;7277:18;;7270:43;7344:2;7329:18;;7322:34;;;7392:3;7387:2;7372:18;;7365:31;;;7170:4;;7413:45;;7438:19;;7430:6;7413:45;:::i;:::-;7405:53;7179:285;-1:-1:-1;;;;;;7179:285:14:o;8064:219::-;8213:2;8202:9;8195:21;8176:4;8233:44;8273:2;8262:9;8258:18;8250:6;8233:44;:::i;9413:414::-;9615:2;9597:21;;;9654:2;9634:18;;;9627:30;9693:34;9688:2;9673:18;;9666:62;-1:-1:-1;;;9759:2:14;9744:18;;9737:48;9817:3;9802:19;;9587:240::o;15763:356::-;15965:2;15947:21;;;15984:18;;;15977:30;16043:34;16038:2;16023:18;;16016:62;16110:2;16095:18;;15937:182::o;16942:413::-;17144:2;17126:21;;;17183:2;17163:18;;;17156:30;17222:34;17217:2;17202:18;;17195:62;-1:-1:-1;;;17288:2:14;17273:18;;17266:47;17345:3;17330:19;;17116:239::o;18663:128::-;18703:3;18734:1;18730:6;18727:1;18724:13;18721:2;;;18740:18;;:::i;:::-;-1:-1:-1;18776:9:14;;18711:80::o;18796:120::-;18836:1;18862;18852:2;;18867:18;;:::i;:::-;-1:-1:-1;18901:9:14;;18842:74::o;18921:125::-;18961:4;18989:1;18986;18983:8;18980:2;;;18994:18;;:::i;:::-;-1:-1:-1;19031:9:14;;18970:76::o;19051:258::-;19123:1;19133:113;19147:6;19144:1;19141:13;19133:113;;;19223:11;;;19217:18;19204:11;;;19197:39;19169:2;19162:10;19133:113;;;19264:6;19261:1;19258:13;19255:2;;;-1:-1:-1;;19299:1:14;19281:16;;19274:27;19104:205::o;19314:380::-;19393:1;19389:12;;;;19436;;;19457:2;;19511:4;19503:6;19499:17;19489:27;;19457:2;19564;19556:6;19553:14;19533:18;19530:38;19527:2;;;19610:10;19605:3;19601:20;19598:1;19591:31;19645:4;19642:1;19635:15;19673:4;19670:1;19663:15;19527:2;;19369:325;;;:::o;19699:135::-;19738:3;-1:-1:-1;;19759:17:14;;19756:2;;;19779:18;;:::i;:::-;-1:-1:-1;19826:1:14;19815:13;;19746:88::o;19839:112::-;19871:1;19897;19887:2;;19902:18;;:::i;:::-;-1:-1:-1;19936:9:14;;19877:74::o;19956:127::-;20017:10;20012:3;20008:20;20005:1;19998:31;20048:4;20045:1;20038:15;20072:4;20069:1;20062:15;20088:127;20149:10;20144:3;20140:20;20137:1;20130:31;20180:4;20177:1;20170:15;20204:4;20201:1;20194:15;20220:127;20281:10;20276:3;20272:20;20269:1;20262:31;20312:4;20309:1;20302:15;20336:4;20333:1;20326:15;20352:131;-1:-1:-1;;;;;;20426:32:14;;20416:43;;20406:2;;20473:1;20470;20463:12

Swarm Source

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