ETH Price: $3,451.90 (+0.07%)
Gas: 6 Gwei

Token

SumSwap Collection (SSC)
 

Overview

Max Total Supply

0 SSC

Holders

2,485

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 SSC
0xb251bff01c1b5c3dd67f28a59bf503353f70253b
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:
SumItem

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-06-27
*/

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol



pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol



pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol



pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol



pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol



pragma solidity ^0.8.0;








/**
 * @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}. 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 {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(address from, address to, uint256 tokenId) public virtual override {
        //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);
    }

    /**
     * @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);
    }

    /**
     * @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 of token that is not own");
        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);
    }

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol



pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping (uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: @openzeppelin/contracts/utils/Counters.sol



pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol



pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: contracts/SumItem.sol

pragma solidity ^0.8.0;






contract OwnableDelegateProxy { }

contract ProxyRegistry {
  mapping(address => OwnableDelegateProxy) public proxies;
}
/**
*On Rinkeby: "0xf57b2c51ded3a29e6891aba85459d600256cf317"
*On mainnet: "0xa5409ec958c83c3f309868babaca7c86dcb077c1"
**/
contract SumItem is ERC721URIStorage, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;
    address proxyRegistryAddress;
    constructor(address _proxyRegistryAddress) ERC721("SumSwap Collection", "SSC") {
        proxyRegistryAddress = _proxyRegistryAddress;
    }

    function isApprovedForAll(address owner,address operator) override public view returns (bool) {
        // Whitelist OpenSea proxy contract for easy trading.
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }

        return super.isApprovedForAll(owner, operator);
   }

    function awardItem(address player, string memory tokenURI)
        public onlyOwner
        returns (uint256)
    {
        _tokenIds.increment();

        uint256 newItemId = _tokenIds.current();
        _mint(player, newItemId);
        _setTokenURI(newItemId, tokenURI);

        return newItemId;
    }

    function withdrawETH() public onlyOwner{
        payable(msg.sender).transfer(address(this).balance);
    }

    function withdrawToken(address addr) public onlyOwner{
        IERC20(addr).transfer(_msgSender(), IERC20(addr).balanceOf(address(this)));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"string","name":"tokenURI","type":"string"}],"name":"awardItem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"}],"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":"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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162001f7d38038062001f7d8339810160408190526200003491620001d2565b604080518082018252601281527129bab6a9bbb0b81021b7b63632b1ba34b7b760711b60208083019182528351808501909452600384526253534360e81b90840152815191929162000089916000916200012c565b5080516200009f9060019060208401906200012c565b5050506000620000b46200012860201b60201c565b600780546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600980546001600160a01b0319166001600160a01b03929092169190911790556200023f565b3390565b8280546200013a9062000202565b90600052602060002090601f0160209004810192826200015e5760008555620001a9565b82601f106200017957805160ff1916838001178555620001a9565b82800160010185558215620001a9579182015b82811115620001a95782518255916020019190600101906200018c565b50620001b7929150620001bb565b5090565b5b80821115620001b75760008155600101620001bc565b600060208284031215620001e4578081fd5b81516001600160a01b0381168114620001fb578182fd5b9392505050565b6002810460018216806200021757607f821691505b602082108114156200023957634e487b7160e01b600052602260045260246000fd5b50919050565b611d2e806200024f6000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c806389476069116100ad578063c87b56dd11610071578063c87b56dd14610243578063cf37834314610256578063e086e5ec14610269578063e985e9c514610271578063f2fde38b1461028457610121565b806389476069146101fa5780638da5cb5b1461020d57806395d89b4114610215578063a22cb4651461021d578063b88d4fde1461023057610121565b806323b872dd116100f457806323b872dd1461019957806342842e0e146101ac5780636352211e146101bf57806370a08231146101d2578063715018a6146101f257610121565b806301ffc9a71461012657806306fdde031461014f578063081812fc14610164578063095ea7b314610184575b600080fd5b61013961013436600461152f565b610297565b6040516101469190611678565b60405180910390f35b6101576102df565b6040516101469190611683565b610177610172366004611583565b610371565b604051610146919061160e565b6101976101923660046114e8565b6103bd565b005b6101976101a736600461139d565b610455565b6101976101ba36600461139d565b61048d565b6101776101cd366004611583565b6104a8565b6101e56101e0366004611349565b6104dd565b6040516101469190611b9b565b610197610521565b610197610208366004611349565b6105aa565b6101776106ef565b6101576106fe565b61019761022b36600461145a565b61070d565b61019761023e3660046113dd565b6107db565b610157610251366004611583565b61081a565b6101e5610264366004611487565b61093b565b6101976109b1565b61013961027f366004611365565b610a1f565b610197610292366004611349565b610acb565b60006001600160e01b031982166380ac58cd60e01b14806102c857506001600160e01b03198216635b5e139f60e01b145b806102d757506102d782610b8c565b90505b919050565b6060600080546102ee90611c13565b80601f016020809104026020016040519081016040528092919081815260200182805461031a90611c13565b80156103675780601f1061033c57610100808354040283529160200191610367565b820191906000526020600020905b81548152906001019060200180831161034a57829003601f168201915b5050505050905090565b600061037c82610ba5565b6103a15760405162461bcd60e51b8152600401610398906119f0565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006103c8826104a8565b9050806001600160a01b0316836001600160a01b031614156103fc5760405162461bcd60e51b815260040161039890611b09565b806001600160a01b031661040e610bc2565b6001600160a01b0316148061042a575061042a8161027f610bc2565b6104465760405162461bcd60e51b81526004016103989061182c565b6104508383610bc6565b505050565b610466610460610bc2565b82610c34565b6104825760405162461bcd60e51b815260040161039890611b4a565b610450838383610cb1565b610450838383604051806020016040528060008152506107db565b6000818152600260205260408120546001600160a01b0316806102d75760405162461bcd60e51b8152600401610398906118d3565b60006001600160a01b0382166105055760405162461bcd60e51b815260040161039890611889565b506001600160a01b031660009081526003602052604090205490565b610529610bc2565b6001600160a01b031661053a6106ef565b6001600160a01b0316146105605760405162461bcd60e51b815260040161039890611a3c565b6007546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600780546001600160a01b0319169055565b6105b2610bc2565b6001600160a01b03166105c36106ef565b6001600160a01b0316146105e95760405162461bcd60e51b815260040161039890611a3c565b806001600160a01b031663a9059cbb610600610bc2565b6040516370a0823160e01b81526001600160a01b038516906370a082319061062c90309060040161160e565b60206040518083038186803b15801561064457600080fd5b505afa158015610658573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067c919061159b565b6040518363ffffffff1660e01b815260040161069992919061165f565b602060405180830381600087803b1580156106b357600080fd5b505af11580156106c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106eb9190611513565b5050565b6007546001600160a01b031690565b6060600180546102ee90611c13565b610715610bc2565b6001600160a01b0316826001600160a01b031614156107465760405162461bcd60e51b8152600401610398906117a9565b8060056000610753610bc2565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610797610bc2565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516107cf9190611678565b60405180910390a35050565b6107ec6107e6610bc2565b83610c34565b6108085760405162461bcd60e51b815260040161039890611b4a565b61081484848484610dde565b50505050565b606061082582610ba5565b6108415760405162461bcd60e51b81526004016103989061199f565b6000828152600660205260408120805461085a90611c13565b80601f016020809104026020016040519081016040528092919081815260200182805461088690611c13565b80156108d35780601f106108a8576101008083540402835291602001916108d3565b820191906000526020600020905b8154815290600101906020018083116108b657829003601f168201915b5050505050905060006108e4610e11565b90508051600014156108f8575090506102da565b81511561092a5780826040516020016109129291906115df565b604051602081830303815290604052925050506102da565b61093384610e23565b949350505050565b6000610945610bc2565b6001600160a01b03166109566106ef565b6001600160a01b03161461097c5760405162461bcd60e51b815260040161039890611a3c565b6109866008610ea6565b60006109926008610eaf565b905061099e8482610eb3565b6109a88184610f92565b90505b92915050565b6109b9610bc2565b6001600160a01b03166109ca6106ef565b6001600160a01b0316146109f05760405162461bcd60e51b815260040161039890611a3c565b60405133904780156108fc02916000818181858888f19350505050158015610a1c573d6000803e3d6000fd5b50565b60095460405163c455279160e01b81526000916001600160a01b039081169190841690829063c455279190610a5890889060040161160e565b60206040518083038186803b158015610a7057600080fd5b505afa158015610a84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa89190611567565b6001600160a01b03161415610ac15760019150506109ab565b6109338484610fd6565b610ad3610bc2565b6001600160a01b0316610ae46106ef565b6001600160a01b031614610b0a5760405162461bcd60e51b815260040161039890611a3c565b6001600160a01b038116610b305760405162461bcd60e51b8152600401610398906116e8565b6007546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160e01b031981166301ffc9a760e01b14919050565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610bfb826104a8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610c3f82610ba5565b610c5b5760405162461bcd60e51b8152600401610398906117e0565b6000610c66836104a8565b9050806001600160a01b0316846001600160a01b03161480610ca15750836001600160a01b0316610c9684610371565b6001600160a01b0316145b8061093357506109338185610a1f565b826001600160a01b0316610cc4826104a8565b6001600160a01b031614610cea5760405162461bcd60e51b815260040161039890611a71565b6001600160a01b038216610d105760405162461bcd60e51b815260040161039890611765565b610d1b838383610450565b610d26600082610bc6565b6001600160a01b0383166000908152600360205260408120805460019290610d4f908490611bd0565b90915550506001600160a01b0382166000908152600360205260408120805460019290610d7d908490611ba4565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610de9848484610cb1565b610df584848484611004565b6108145760405162461bcd60e51b815260040161039890611696565b60408051602081019091526000815290565b6060610e2e82610ba5565b610e4a5760405162461bcd60e51b815260040161039890611aba565b6000610e54610e11565b90506000815111610e745760405180602001604052806000815250610e9f565b80610e7e8461111f565b604051602001610e8f9291906115df565b6040516020818303038152906040525b9392505050565b80546001019055565b5490565b6001600160a01b038216610ed95760405162461bcd60e51b81526004016103989061196a565b610ee281610ba5565b15610eff5760405162461bcd60e51b81526004016103989061172e565b610f0b60008383610450565b6001600160a01b0382166000908152600360205260408120805460019290610f34908490611ba4565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b610f9b82610ba5565b610fb75760405162461bcd60e51b81526004016103989061191c565b6000828152600660209081526040909120825161045092840190611240565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6000611018846001600160a01b031661123a565b1561111457836001600160a01b031663150b7a02611034610bc2565b8786866040518563ffffffff1660e01b81526004016110569493929190611622565b602060405180830381600087803b15801561107057600080fd5b505af19250505080156110a0575060408051601f3d908101601f1916820190925261109d9181019061154b565b60015b6110fa573d8080156110ce576040519150601f19603f3d011682016040523d82523d6000602084013e6110d3565b606091505b5080516110f25760405162461bcd60e51b815260040161039890611696565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610933565b506001949350505050565b60608161114457506040805180820190915260018152600360fc1b60208201526102da565b8160005b811561116e578061115881611c4e565b91506111679050600a83611bbc565b9150611148565b60008167ffffffffffffffff81111561119757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156111c1576020820181803683370190505b5090505b8415610933576111d6600183611bd0565b91506111e3600a86611c69565b6111ee906030611ba4565b60f81b81838151811061121157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611233600a86611bbc565b94506111c5565b3b151590565b82805461124c90611c13565b90600052602060002090601f01602090048101928261126e57600085556112b4565b82601f1061128757805160ff19168380011785556112b4565b828001600101855582156112b4579182015b828111156112b4578251825591602001919060010190611299565b506112c09291506112c4565b5090565b5b808211156112c057600081556001016112c5565b600067ffffffffffffffff808411156112f4576112f4611ca9565b604051601f8501601f19168101602001828111828210171561131857611318611ca9565b60405284815291508183850186101561133057600080fd5b8484602083013760006020868301015250509392505050565b60006020828403121561135a578081fd5b81356109a881611cbf565b60008060408385031215611377578081fd5b823561138281611cbf565b9150602083013561139281611cbf565b809150509250929050565b6000806000606084860312156113b1578081fd5b83356113bc81611cbf565b925060208401356113cc81611cbf565b929592945050506040919091013590565b600080600080608085870312156113f2578081fd5b84356113fd81611cbf565b9350602085013561140d81611cbf565b925060408501359150606085013567ffffffffffffffff81111561142f578182fd5b8501601f8101871361143f578182fd5b61144e878235602084016112d9565b91505092959194509250565b6000806040838503121561146c578182fd5b823561147781611cbf565b9150602083013561139281611cd4565b60008060408385031215611499578182fd5b82356114a481611cbf565b9150602083013567ffffffffffffffff8111156114bf578182fd5b8301601f810185136114cf578182fd5b6114de858235602084016112d9565b9150509250929050565b600080604083850312156114fa578182fd5b823561150581611cbf565b946020939093013593505050565b600060208284031215611524578081fd5b81516109a881611cd4565b600060208284031215611540578081fd5b81356109a881611ce2565b60006020828403121561155c578081fd5b81516109a881611ce2565b600060208284031215611578578081fd5b81516109a881611cbf565b600060208284031215611594578081fd5b5035919050565b6000602082840312156115ac578081fd5b5051919050565b600081518084526115cb816020860160208601611be7565b601f01601f19169290920160200192915050565b600083516115f1818460208801611be7565b835190830190611605818360208801611be7565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611655908301846115b3565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b600060208252610e9f60208301846115b3565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252602e908201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60408201526d32bc34b9ba32b73a103a37b5b2b760911b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526031908201527f45524337323155524953746f726167653a2055524920717565727920666f72206040820152703737b732bc34b9ba32b73a103a37b5b2b760791b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b90815260200190565b60008219821115611bb757611bb7611c7d565b500190565b600082611bcb57611bcb611c93565b500490565b600082821015611be257611be2611c7d565b500390565b60005b83811015611c02578181015183820152602001611bea565b838111156108145750506000910152565b600281046001821680611c2757607f821691505b60208210811415611c4857634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611c6257611c62611c7d565b5060010190565b600082611c7857611c78611c93565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610a1c57600080fd5b8015158114610a1c57600080fd5b6001600160e01b031981168114610a1c57600080fdfea2646970667358221220657c89de26ee51224af4278e985776ac087158c96018ba0afe1358d7962d7ba464736f6c63430008000033000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101215760003560e01c806389476069116100ad578063c87b56dd11610071578063c87b56dd14610243578063cf37834314610256578063e086e5ec14610269578063e985e9c514610271578063f2fde38b1461028457610121565b806389476069146101fa5780638da5cb5b1461020d57806395d89b4114610215578063a22cb4651461021d578063b88d4fde1461023057610121565b806323b872dd116100f457806323b872dd1461019957806342842e0e146101ac5780636352211e146101bf57806370a08231146101d2578063715018a6146101f257610121565b806301ffc9a71461012657806306fdde031461014f578063081812fc14610164578063095ea7b314610184575b600080fd5b61013961013436600461152f565b610297565b6040516101469190611678565b60405180910390f35b6101576102df565b6040516101469190611683565b610177610172366004611583565b610371565b604051610146919061160e565b6101976101923660046114e8565b6103bd565b005b6101976101a736600461139d565b610455565b6101976101ba36600461139d565b61048d565b6101776101cd366004611583565b6104a8565b6101e56101e0366004611349565b6104dd565b6040516101469190611b9b565b610197610521565b610197610208366004611349565b6105aa565b6101776106ef565b6101576106fe565b61019761022b36600461145a565b61070d565b61019761023e3660046113dd565b6107db565b610157610251366004611583565b61081a565b6101e5610264366004611487565b61093b565b6101976109b1565b61013961027f366004611365565b610a1f565b610197610292366004611349565b610acb565b60006001600160e01b031982166380ac58cd60e01b14806102c857506001600160e01b03198216635b5e139f60e01b145b806102d757506102d782610b8c565b90505b919050565b6060600080546102ee90611c13565b80601f016020809104026020016040519081016040528092919081815260200182805461031a90611c13565b80156103675780601f1061033c57610100808354040283529160200191610367565b820191906000526020600020905b81548152906001019060200180831161034a57829003601f168201915b5050505050905090565b600061037c82610ba5565b6103a15760405162461bcd60e51b8152600401610398906119f0565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006103c8826104a8565b9050806001600160a01b0316836001600160a01b031614156103fc5760405162461bcd60e51b815260040161039890611b09565b806001600160a01b031661040e610bc2565b6001600160a01b0316148061042a575061042a8161027f610bc2565b6104465760405162461bcd60e51b81526004016103989061182c565b6104508383610bc6565b505050565b610466610460610bc2565b82610c34565b6104825760405162461bcd60e51b815260040161039890611b4a565b610450838383610cb1565b610450838383604051806020016040528060008152506107db565b6000818152600260205260408120546001600160a01b0316806102d75760405162461bcd60e51b8152600401610398906118d3565b60006001600160a01b0382166105055760405162461bcd60e51b815260040161039890611889565b506001600160a01b031660009081526003602052604090205490565b610529610bc2565b6001600160a01b031661053a6106ef565b6001600160a01b0316146105605760405162461bcd60e51b815260040161039890611a3c565b6007546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600780546001600160a01b0319169055565b6105b2610bc2565b6001600160a01b03166105c36106ef565b6001600160a01b0316146105e95760405162461bcd60e51b815260040161039890611a3c565b806001600160a01b031663a9059cbb610600610bc2565b6040516370a0823160e01b81526001600160a01b038516906370a082319061062c90309060040161160e565b60206040518083038186803b15801561064457600080fd5b505afa158015610658573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061067c919061159b565b6040518363ffffffff1660e01b815260040161069992919061165f565b602060405180830381600087803b1580156106b357600080fd5b505af11580156106c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106eb9190611513565b5050565b6007546001600160a01b031690565b6060600180546102ee90611c13565b610715610bc2565b6001600160a01b0316826001600160a01b031614156107465760405162461bcd60e51b8152600401610398906117a9565b8060056000610753610bc2565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610797610bc2565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516107cf9190611678565b60405180910390a35050565b6107ec6107e6610bc2565b83610c34565b6108085760405162461bcd60e51b815260040161039890611b4a565b61081484848484610dde565b50505050565b606061082582610ba5565b6108415760405162461bcd60e51b81526004016103989061199f565b6000828152600660205260408120805461085a90611c13565b80601f016020809104026020016040519081016040528092919081815260200182805461088690611c13565b80156108d35780601f106108a8576101008083540402835291602001916108d3565b820191906000526020600020905b8154815290600101906020018083116108b657829003601f168201915b5050505050905060006108e4610e11565b90508051600014156108f8575090506102da565b81511561092a5780826040516020016109129291906115df565b604051602081830303815290604052925050506102da565b61093384610e23565b949350505050565b6000610945610bc2565b6001600160a01b03166109566106ef565b6001600160a01b03161461097c5760405162461bcd60e51b815260040161039890611a3c565b6109866008610ea6565b60006109926008610eaf565b905061099e8482610eb3565b6109a88184610f92565b90505b92915050565b6109b9610bc2565b6001600160a01b03166109ca6106ef565b6001600160a01b0316146109f05760405162461bcd60e51b815260040161039890611a3c565b60405133904780156108fc02916000818181858888f19350505050158015610a1c573d6000803e3d6000fd5b50565b60095460405163c455279160e01b81526000916001600160a01b039081169190841690829063c455279190610a5890889060040161160e565b60206040518083038186803b158015610a7057600080fd5b505afa158015610a84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa89190611567565b6001600160a01b03161415610ac15760019150506109ab565b6109338484610fd6565b610ad3610bc2565b6001600160a01b0316610ae46106ef565b6001600160a01b031614610b0a5760405162461bcd60e51b815260040161039890611a3c565b6001600160a01b038116610b305760405162461bcd60e51b8152600401610398906116e8565b6007546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160e01b031981166301ffc9a760e01b14919050565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610bfb826104a8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610c3f82610ba5565b610c5b5760405162461bcd60e51b8152600401610398906117e0565b6000610c66836104a8565b9050806001600160a01b0316846001600160a01b03161480610ca15750836001600160a01b0316610c9684610371565b6001600160a01b0316145b8061093357506109338185610a1f565b826001600160a01b0316610cc4826104a8565b6001600160a01b031614610cea5760405162461bcd60e51b815260040161039890611a71565b6001600160a01b038216610d105760405162461bcd60e51b815260040161039890611765565b610d1b838383610450565b610d26600082610bc6565b6001600160a01b0383166000908152600360205260408120805460019290610d4f908490611bd0565b90915550506001600160a01b0382166000908152600360205260408120805460019290610d7d908490611ba4565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610de9848484610cb1565b610df584848484611004565b6108145760405162461bcd60e51b815260040161039890611696565b60408051602081019091526000815290565b6060610e2e82610ba5565b610e4a5760405162461bcd60e51b815260040161039890611aba565b6000610e54610e11565b90506000815111610e745760405180602001604052806000815250610e9f565b80610e7e8461111f565b604051602001610e8f9291906115df565b6040516020818303038152906040525b9392505050565b80546001019055565b5490565b6001600160a01b038216610ed95760405162461bcd60e51b81526004016103989061196a565b610ee281610ba5565b15610eff5760405162461bcd60e51b81526004016103989061172e565b610f0b60008383610450565b6001600160a01b0382166000908152600360205260408120805460019290610f34908490611ba4565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b610f9b82610ba5565b610fb75760405162461bcd60e51b81526004016103989061191c565b6000828152600660209081526040909120825161045092840190611240565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6000611018846001600160a01b031661123a565b1561111457836001600160a01b031663150b7a02611034610bc2565b8786866040518563ffffffff1660e01b81526004016110569493929190611622565b602060405180830381600087803b15801561107057600080fd5b505af19250505080156110a0575060408051601f3d908101601f1916820190925261109d9181019061154b565b60015b6110fa573d8080156110ce576040519150601f19603f3d011682016040523d82523d6000602084013e6110d3565b606091505b5080516110f25760405162461bcd60e51b815260040161039890611696565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610933565b506001949350505050565b60608161114457506040805180820190915260018152600360fc1b60208201526102da565b8160005b811561116e578061115881611c4e565b91506111679050600a83611bbc565b9150611148565b60008167ffffffffffffffff81111561119757634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156111c1576020820181803683370190505b5090505b8415610933576111d6600183611bd0565b91506111e3600a86611c69565b6111ee906030611ba4565b60f81b81838151811061121157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611233600a86611bbc565b94506111c5565b3b151590565b82805461124c90611c13565b90600052602060002090601f01602090048101928261126e57600085556112b4565b82601f1061128757805160ff19168380011785556112b4565b828001600101855582156112b4579182015b828111156112b4578251825591602001919060010190611299565b506112c09291506112c4565b5090565b5b808211156112c057600081556001016112c5565b600067ffffffffffffffff808411156112f4576112f4611ca9565b604051601f8501601f19168101602001828111828210171561131857611318611ca9565b60405284815291508183850186101561133057600080fd5b8484602083013760006020868301015250509392505050565b60006020828403121561135a578081fd5b81356109a881611cbf565b60008060408385031215611377578081fd5b823561138281611cbf565b9150602083013561139281611cbf565b809150509250929050565b6000806000606084860312156113b1578081fd5b83356113bc81611cbf565b925060208401356113cc81611cbf565b929592945050506040919091013590565b600080600080608085870312156113f2578081fd5b84356113fd81611cbf565b9350602085013561140d81611cbf565b925060408501359150606085013567ffffffffffffffff81111561142f578182fd5b8501601f8101871361143f578182fd5b61144e878235602084016112d9565b91505092959194509250565b6000806040838503121561146c578182fd5b823561147781611cbf565b9150602083013561139281611cd4565b60008060408385031215611499578182fd5b82356114a481611cbf565b9150602083013567ffffffffffffffff8111156114bf578182fd5b8301601f810185136114cf578182fd5b6114de858235602084016112d9565b9150509250929050565b600080604083850312156114fa578182fd5b823561150581611cbf565b946020939093013593505050565b600060208284031215611524578081fd5b81516109a881611cd4565b600060208284031215611540578081fd5b81356109a881611ce2565b60006020828403121561155c578081fd5b81516109a881611ce2565b600060208284031215611578578081fd5b81516109a881611cbf565b600060208284031215611594578081fd5b5035919050565b6000602082840312156115ac578081fd5b5051919050565b600081518084526115cb816020860160208601611be7565b601f01601f19169290920160200192915050565b600083516115f1818460208801611be7565b835190830190611605818360208801611be7565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611655908301846115b3565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b600060208252610e9f60208301846115b3565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252602e908201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60408201526d32bc34b9ba32b73a103a37b5b2b760911b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526031908201527f45524337323155524953746f726167653a2055524920717565727920666f72206040820152703737b732bc34b9ba32b73a103a37b5b2b760791b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b90815260200190565b60008219821115611bb757611bb7611c7d565b500190565b600082611bcb57611bcb611c93565b500490565b600082821015611be257611be2611c7d565b500390565b60005b83811015611c02578181015183820152602001611bea565b838111156108145750506000910152565b600281046001821680611c2757607f821691505b60208210811415611c4857634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611c6257611c62611c7d565b5060010190565b600082611c7857611c78611c93565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610a1c57600080fd5b8015158114610a1c57600080fd5b6001600160e01b031981168114610a1c57600080fdfea2646970667358221220657c89de26ee51224af4278e985776ac087158c96018ba0afe1358d7962d7ba464736f6c63430008000033

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

000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1

-----Decoded View---------------
Arg [0] : _proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1


Deployed Bytecode Sourcemap

41038:1322:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20566:292;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21498:100;;;:::i;:::-;;;;;;;:::i;22958:221::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;22495:397::-;;;;;;:::i;:::-;;:::i;:::-;;23848:305;;;;;;:::i;:::-;;:::i;24224:151::-;;;;;;:::i;:::-;;:::i;21192:239::-;;;;;;:::i;:::-;;:::i;20922:208::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;37356:148::-;;;:::i;42211:146::-;;;;;;:::i;:::-;;:::i;36705:87::-;;;:::i;21667:104::-;;;:::i;23251:295::-;;;;;;:::i;:::-;;:::i;24446:285::-;;;;;;:::i;:::-;;:::i;32801:679::-;;;;;;:::i;:::-;;:::i;41769:317::-;;;;;;:::i;:::-;;:::i;42094:109::-;;;:::i;41359:402::-;;;;;;:::i;:::-;;:::i;37659:244::-;;;;;;:::i;:::-;;:::i;20566:292::-;20668:4;-1:-1:-1;;;;;;20692:40:0;;-1:-1:-1;;;20692:40:0;;:105;;-1:-1:-1;;;;;;;20749:48:0;;-1:-1:-1;;;20749:48:0;20692:105;:158;;;;20814:36;20838:11;20814:23;:36::i;:::-;20685:165;;20566:292;;;;:::o;21498:100::-;21552:13;21585:5;21578:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21498:100;:::o;22958:221::-;23034:7;23062:16;23070:7;23062;:16::i;:::-;23054:73;;;;-1:-1:-1;;;23054:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;23147:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23147:24:0;;22958:221::o;22495:397::-;22576:13;22592:23;22607:7;22592:14;:23::i;:::-;22576:39;;22640:5;-1:-1:-1;;;;;22634:11:0;:2;-1:-1:-1;;;;;22634:11:0;;;22626:57;;;;-1:-1:-1;;;22626:57:0;;;;;;;:::i;:::-;22720:5;-1:-1:-1;;;;;22704:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;22704:21:0;;:62;;;;22729:37;22746:5;22753:12;:10;:12::i;22729:37::-;22696:154;;;;-1:-1:-1;;;22696:154:0;;;;;;;:::i;:::-;22863:21;22872:2;22876:7;22863:8;:21::i;:::-;22495:397;;;:::o;23848:305::-;24009:41;24028:12;:10;:12::i;:::-;24042:7;24009:18;:41::i;:::-;24001:103;;;;-1:-1:-1;;;24001:103:0;;;;;;;:::i;:::-;24117:28;24127:4;24133:2;24137:7;24117:9;:28::i;24224:151::-;24328:39;24345:4;24351:2;24355:7;24328:39;;;;;;;;;;;;:16;:39::i;21192:239::-;21264:7;21300:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21300:16:0;21335:19;21327:73;;;;-1:-1:-1;;;21327:73:0;;;;;;;:::i;20922:208::-;20994:7;-1:-1:-1;;;;;21022:19:0;;21014:74;;;;-1:-1:-1;;;21014:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;21106:16:0;;;;;:9;:16;;;;;;;20922:208::o;37356:148::-;36936:12;:10;:12::i;:::-;-1:-1:-1;;;;;36925:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;36925:23:0;;36917:68;;;;-1:-1:-1;;;36917:68:0;;;;;;;:::i;:::-;37447:6:::1;::::0;37426:40:::1;::::0;37463:1:::1;::::0;-1:-1:-1;;;;;37447:6:0::1;::::0;37426:40:::1;::::0;37463:1;;37426:40:::1;37477:6;:19:::0;;-1:-1:-1;;;;;;37477:19:0::1;::::0;;37356:148::o;42211:146::-;36936:12;:10;:12::i;:::-;-1:-1:-1;;;;;36925:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;36925:23:0;;36917:68;;;;-1:-1:-1;;;36917:68:0;;;;;;;:::i;:::-;42282:4:::1;-1:-1:-1::0;;;;;42275:21:0::1;;42297:12;:10;:12::i;:::-;42311:37;::::0;-1:-1:-1;;;42311:37:0;;-1:-1:-1;;;;;42311:22:0;::::1;::::0;::::1;::::0;:37:::1;::::0;42342:4:::1;::::0;42311:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42275:74;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;42211:146:::0;:::o;36705:87::-;36778:6;;-1:-1:-1;;;;;36778:6:0;36705:87;:::o;21667:104::-;21723:13;21756:7;21749:14;;;;;:::i;23251:295::-;23366:12;:10;:12::i;:::-;-1:-1:-1;;;;;23354:24:0;:8;-1:-1:-1;;;;;23354:24:0;;;23346:62;;;;-1:-1:-1;;;23346:62:0;;;;;;;:::i;:::-;23466:8;23421:18;:32;23440:12;:10;:12::i;:::-;-1:-1:-1;;;;;23421:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;23421:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;23421:53:0;;;;;;;;;;;23505:12;:10;:12::i;:::-;-1:-1:-1;;;;;23490:48:0;;23529:8;23490:48;;;;;;:::i;:::-;;;;;;;;23251:295;;:::o;24446:285::-;24578:41;24597:12;:10;:12::i;:::-;24611:7;24578:18;:41::i;:::-;24570:103;;;;-1:-1:-1;;;24570:103:0;;;;;;;:::i;:::-;24684:39;24698:4;24704:2;24708:7;24717:5;24684:13;:39::i;:::-;24446:285;;;;:::o;32801:679::-;32874:13;32908:16;32916:7;32908;:16::i;:::-;32900:78;;;;-1:-1:-1;;;32900:78:0;;;;;;;:::i;:::-;32991:23;33017:19;;;:10;:19;;;;;32991:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33047:18;33068:10;:8;:10::i;:::-;33047:31;;33160:4;33154:18;33176:1;33154:23;33150:72;;;-1:-1:-1;33201:9:0;-1:-1:-1;33194:16:0;;33150:72;33326:23;;:27;33322:108;;33401:4;33407:9;33384:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33370:48;;;;;;33322:108;33449:23;33464:7;33449:14;:23::i;:::-;33442:30;32801:679;-1:-1:-1;;;;32801:679:0:o;41769:317::-;41872:7;36936:12;:10;:12::i;:::-;-1:-1:-1;;;;;36925:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;36925:23:0;;36917:68;;;;-1:-1:-1;;;36917:68:0;;;;;;;:::i;:::-;41897:21:::1;:9;:19;:21::i;:::-;41931:17;41951:19;:9;:17;:19::i;:::-;41931:39;;41981:24;41987:6;41995:9;41981:5;:24::i;:::-;42016:33;42029:9;42040:8;42016:12;:33::i;:::-;42069:9:::0;-1:-1:-1;36996:1:0::1;41769:317:::0;;;;:::o;42094:109::-;36936:12;:10;:12::i;:::-;-1:-1:-1;;;;;36925:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;36925:23:0;;36917:68;;;;-1:-1:-1;;;36917:68:0;;;;;;;:::i;:::-;42144:51:::1;::::0;42152:10:::1;::::0;42173:21:::1;42144:51:::0;::::1;;;::::0;::::1;::::0;;;42173:21;42152:10;42144:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;42094:109::o:0;41359:402::-;41571:20;;41615:28;;-1:-1:-1;;;41615:28:0;;41447:4;;-1:-1:-1;;;;;41571:20:0;;;;41607:49;;;;41571:20;;41615:21;;:28;;41637:5;;41615:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;41607:49:0;;41603:93;;;41680:4;41673:11;;;;;41603:93;41715:39;41738:5;41745:8;41715:22;:39::i;37659:244::-;36936:12;:10;:12::i;:::-;-1:-1:-1;;;;;36925:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;36925:23:0;;36917:68;;;;-1:-1:-1;;;36917:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37748:22:0;::::1;37740:73;;;;-1:-1:-1::0;;;37740:73:0::1;;;;;;;:::i;:::-;37850:6;::::0;37829:38:::1;::::0;-1:-1:-1;;;;;37829:38:0;;::::1;::::0;37850:6:::1;::::0;37829:38:::1;::::0;37850:6:::1;::::0;37829:38:::1;37878:6;:17:::0;;-1:-1:-1;;;;;;37878:17:0::1;-1:-1:-1::0;;;;;37878:17:0;;;::::1;::::0;;;::::1;::::0;;37659:244::o;19064:157::-;-1:-1:-1;;;;;;19173:40:0;;-1:-1:-1;;;19173:40:0;19064:157;;;:::o;26198:127::-;26263:4;26287:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26287:16:0;:30;;;26198:127::o;15854:98::-;15934:10;15854:98;:::o;30075:174::-;30150:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30150:29:0;-1:-1:-1;;;;;30150:29:0;;;;;;;;:24;;30204:23;30150:24;30204:14;:23::i;:::-;-1:-1:-1;;;;;30195:46:0;;;;;;;;;;;30075:174;;:::o;26492:348::-;26585:4;26610:16;26618:7;26610;:16::i;:::-;26602:73;;;;-1:-1:-1;;;26602:73:0;;;;;;;:::i;:::-;26686:13;26702:23;26717:7;26702:14;:23::i;:::-;26686:39;;26755:5;-1:-1:-1;;;;;26744:16:0;:7;-1:-1:-1;;;;;26744:16:0;;:51;;;;26788:7;-1:-1:-1;;;;;26764:31:0;:20;26776:7;26764:11;:20::i;:::-;-1:-1:-1;;;;;26764:31:0;;26744:51;:87;;;;26799:32;26816:5;26823:7;26799:16;:32::i;29413:544::-;29538:4;-1:-1:-1;;;;;29511:31:0;:23;29526:7;29511:14;:23::i;:::-;-1:-1:-1;;;;;29511:31:0;;29503:85;;;;-1:-1:-1;;;29503:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29607:16:0;;29599:65;;;;-1:-1:-1;;;29599:65:0;;;;;;;:::i;:::-;29677:39;29698:4;29704:2;29708:7;29677:20;:39::i;:::-;29781:29;29798:1;29802:7;29781:8;:29::i;:::-;-1:-1:-1;;;;;29823:15:0;;;;;;:9;:15;;;;;:20;;29842:1;;29823:15;:20;;29842:1;;29823:20;:::i;:::-;;;;-1:-1:-1;;;;;;;29854:13:0;;;;;;:9;:13;;;;;:18;;29871:1;;29854:13;:18;;29871:1;;29854:18;:::i;:::-;;;;-1:-1:-1;;29883:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29883:21:0;-1:-1:-1;;;;;29883:21:0;;;;;;;;;29922:27;;29883:16;;29922:27;;;;;;;29413:544;;;:::o;25613:272::-;25727:28;25737:4;25743:2;25747:7;25727:9;:28::i;:::-;25774:48;25797:4;25803:2;25807:7;25816:5;25774:22;:48::i;:::-;25766:111;;;;-1:-1:-1;;;25766:111:0;;;;;;;:::i;22339:94::-;22416:9;;;;;;;;;-1:-1:-1;22416:9:0;;22339:94;:::o;21842:360::-;21915:13;21949:16;21957:7;21949;:16::i;:::-;21941:76;;;;-1:-1:-1;;;21941:76:0;;;;;;;:::i;:::-;22030:21;22054:10;:8;:10::i;:::-;22030:34;;22106:1;22088:7;22082:21;:25;:112;;;;;;;;;;;;;;;;;22147:7;22156:18;:7;:16;:18::i;:::-;22130:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22082:112;22075:119;21842:360;-1:-1:-1;;;21842:360:0:o;35234:127::-;35323:19;;35341:1;35323:19;;;35234:127::o;35112:114::-;35204:14;;35112:114::o;28105:382::-;-1:-1:-1;;;;;28185:16:0;;28177:61;;;;-1:-1:-1;;;28177:61:0;;;;;;;:::i;:::-;28258:16;28266:7;28258;:16::i;:::-;28257:17;28249:58;;;;-1:-1:-1;;;28249:58:0;;;;;;;:::i;:::-;28320:45;28349:1;28353:2;28357:7;28320:20;:45::i;:::-;-1:-1:-1;;;;;28378:13:0;;;;;;:9;:13;;;;;:18;;28395:1;;28378:13;:18;;28395:1;;28378:18;:::i;:::-;;;;-1:-1:-1;;28407:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28407:21:0;-1:-1:-1;;;;;28407:21:0;;;;;;;;28446:33;;28407:16;;;28446:33;;28407:16;;28446:33;28105:382;;:::o;33636:217::-;33736:16;33744:7;33736;:16::i;:::-;33728:75;;;;-1:-1:-1;;;33728:75:0;;;;;;;:::i;:::-;33814:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;23617:164::-;-1:-1:-1;;;;;23738:25:0;;;23714:4;23738:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23617:164::o;30814:843::-;30935:4;30961:15;:2;-1:-1:-1;;;;;30961:13:0;;:15::i;:::-;30957:693;;;31013:2;-1:-1:-1;;;;;30997:36:0;;31034:12;:10;:12::i;:::-;31048:4;31054:7;31063:5;30997:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30997:72:0;;;;;;;;-1:-1:-1;;30997:72:0;;;;;;;;;;;;:::i;:::-;;;30993:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31243:13:0;;31239:341;;31286:60;;-1:-1:-1;;;31286:60:0;;;;;;;:::i;31239:341::-;31530:6;31524:13;31515:6;31511:2;31507:15;31500:38;30993:602;-1:-1:-1;;;;;;31120:55:0;-1:-1:-1;;;31120:55:0;;-1:-1:-1;31113:62:0;;30957:693;-1:-1:-1;31634:4:0;30814:843;;;;;;:::o;16509:723::-;16565:13;16786:10;16782:53;;-1:-1:-1;16813:10:0;;;;;;;;;;;;-1:-1:-1;;;16813:10:0;;;;;;16782:53;16860:5;16845:12;16901:78;16908:9;;16901:78;;16934:8;;;;:::i;:::-;;-1:-1:-1;16957:10:0;;-1:-1:-1;16965:2:0;16957:10;;:::i;:::-;;;16901:78;;;16989:19;17021:6;17011:17;;;;;;-1:-1:-1;;;17011:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17011:17:0;;16989:39;;17039:154;17046:10;;17039:154;;17073:11;17083:1;17073:11;;:::i;:::-;;-1:-1:-1;17142:10:0;17150:2;17142:5;:10;:::i;:::-;17129:24;;:2;:24;:::i;:::-;17116:39;;17099:6;17106;17099:14;;;;;;-1:-1:-1;;;17099:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;17099:56:0;;;;;;;;-1:-1:-1;17170:11:0;17179:2;17170:11;;:::i;:::-;;;17039:154;;7971:422;8338:20;8377:8;;;7971:422::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:607:1;;110:18;151:2;143:6;140:14;137:2;;;157:18;;:::i;:::-;206:2;200:9;279:2;256:17;;-1:-1:-1;;252:31:1;240:44;;286:4;236:55;306:18;;;326:22;;;303:46;300:2;;;352:18;;:::i;:::-;388:2;381:22;436;;;421:6;-1:-1:-1;421:6:1;473:16;;;470:25;-1:-1:-1;467:2:1;;;508:1;505;498:12;467:2;558:6;553:3;546:4;538:6;534:17;521:44;613:1;606:4;597:6;589;585:19;581:30;574:41;;;90:531;;;;;:::o;626:259::-;;738:2;726:9;717:7;713:23;709:32;706:2;;;759:6;751;744:22;706:2;803:9;790:23;822:33;849:5;822:33;:::i;890:402::-;;;1019:2;1007:9;998:7;994:23;990:32;987:2;;;1040:6;1032;1025:22;987:2;1084:9;1071:23;1103:33;1130:5;1103:33;:::i;:::-;1155:5;-1:-1:-1;1212:2:1;1197:18;;1184:32;1225:35;1184:32;1225:35;:::i;:::-;1279:7;1269:17;;;977:315;;;;;:::o;1297:470::-;;;;1443:2;1431:9;1422:7;1418:23;1414:32;1411:2;;;1464:6;1456;1449:22;1411:2;1508:9;1495:23;1527:33;1554:5;1527:33;:::i;:::-;1579:5;-1:-1:-1;1636:2:1;1621:18;;1608:32;1649:35;1608:32;1649:35;:::i;:::-;1401:366;;1703:7;;-1:-1:-1;;;1757:2:1;1742:18;;;;1729:32;;1401:366::o;1772:830::-;;;;;1944:3;1932:9;1923:7;1919:23;1915:33;1912:2;;;1966:6;1958;1951:22;1912:2;2010:9;1997:23;2029:33;2056:5;2029:33;:::i;:::-;2081:5;-1:-1:-1;2138:2:1;2123:18;;2110:32;2151:35;2110:32;2151:35;:::i;:::-;2205:7;-1:-1:-1;2259:2:1;2244:18;;2231:32;;-1:-1:-1;2314:2:1;2299:18;;2286:32;2341:18;2330:30;;2327:2;;;2378:6;2370;2363:22;2327:2;2406:22;;2459:4;2451:13;;2447:27;-1:-1:-1;2437:2:1;;2493:6;2485;2478:22;2437:2;2521:75;2588:7;2583:2;2570:16;2565:2;2561;2557:11;2521:75;:::i;:::-;2511:85;;;1902:700;;;;;;;:::o;2607:396::-;;;2733:2;2721:9;2712:7;2708:23;2704:32;2701:2;;;2754:6;2746;2739:22;2701:2;2798:9;2785:23;2817:33;2844:5;2817:33;:::i;:::-;2869:5;-1:-1:-1;2926:2:1;2911:18;;2898:32;2939;2898;2939;:::i;3008:619::-;;;3147:2;3135:9;3126:7;3122:23;3118:32;3115:2;;;3168:6;3160;3153:22;3115:2;3212:9;3199:23;3231:33;3258:5;3231:33;:::i;:::-;3283:5;-1:-1:-1;3339:2:1;3324:18;;3311:32;3366:18;3355:30;;3352:2;;;3403:6;3395;3388:22;3352:2;3431:22;;3484:4;3476:13;;3472:27;-1:-1:-1;3462:2:1;;3518:6;3510;3503:22;3462:2;3546:75;3613:7;3608:2;3595:16;3590:2;3586;3582:11;3546:75;:::i;:::-;3536:85;;;3105:522;;;;;:::o;3632:327::-;;;3761:2;3749:9;3740:7;3736:23;3732:32;3729:2;;;3782:6;3774;3767:22;3729:2;3826:9;3813:23;3845:33;3872:5;3845:33;:::i;:::-;3897:5;3949:2;3934:18;;;;3921:32;;-1:-1:-1;;;3719:240:1:o;3964:257::-;;4084:2;4072:9;4063:7;4059:23;4055:32;4052:2;;;4105:6;4097;4090:22;4052:2;4142:9;4136:16;4161:30;4185:5;4161:30;:::i;4226:257::-;;4337:2;4325:9;4316:7;4312:23;4308:32;4305:2;;;4358:6;4350;4343:22;4305:2;4402:9;4389:23;4421:32;4447:5;4421:32;:::i;4488:261::-;;4610:2;4598:9;4589:7;4585:23;4581:32;4578:2;;;4631:6;4623;4616:22;4578:2;4668:9;4662:16;4687:32;4713:5;4687:32;:::i;4754:292::-;;4906:2;4894:9;4885:7;4881:23;4877:32;4874:2;;;4927:6;4919;4912:22;4874:2;4964:9;4958:16;4983:33;5010:5;4983:33;:::i;5051:190::-;;5163:2;5151:9;5142:7;5138:23;5134:32;5131:2;;;5184:6;5176;5169:22;5131:2;-1:-1:-1;5212:23:1;;5121:120;-1:-1:-1;5121:120:1:o;5246:194::-;;5369:2;5357:9;5348:7;5344:23;5340:32;5337:2;;;5390:6;5382;5375:22;5337:2;-1:-1:-1;5418:16:1;;5327:113;-1:-1:-1;5327:113:1:o;5445:259::-;;5526:5;5520:12;5553:6;5548:3;5541:19;5569:63;5625:6;5618:4;5613:3;5609:14;5602:4;5595:5;5591:16;5569:63;:::i;:::-;5686:2;5665:15;-1:-1:-1;;5661:29:1;5652:39;;;;5693:4;5648:50;;5496:208;-1:-1:-1;;5496:208:1:o;5709:470::-;;5926:6;5920:13;5942:53;5988:6;5983:3;5976:4;5968:6;5964:17;5942:53;:::i;:::-;6058:13;;6017:16;;;;6080:57;6058:13;6017:16;6114:4;6102:17;;6080:57;:::i;:::-;6153:20;;5896:283;-1:-1:-1;;;;5896:283:1:o;6184:203::-;-1:-1:-1;;;;;6348:32:1;;;;6330:51;;6318:2;6303:18;;6285:102::o;6392:490::-;-1:-1:-1;;;;;6661:15:1;;;6643:34;;6713:15;;6708:2;6693:18;;6686:43;6760:2;6745:18;;6738:34;;;6808:3;6803:2;6788:18;;6781:31;;;6392:490;;6829:47;;6856:19;;6848:6;6829:47;:::i;:::-;6821:55;6595:287;-1:-1:-1;;;;;;6595:287:1:o;6887:274::-;-1:-1:-1;;;;;7079:32:1;;;;7061:51;;7143:2;7128:18;;7121:34;7049:2;7034:18;;7016:145::o;7166:187::-;7331:14;;7324:22;7306:41;;7294:2;7279:18;;7261:92::o;7358:221::-;;7507:2;7496:9;7489:21;7527:46;7569:2;7558:9;7554:18;7546:6;7527:46;:::i;7584:414::-;7786:2;7768:21;;;7825:2;7805:18;;;7798:30;7864:34;7859:2;7844:18;;7837:62;-1:-1:-1;;;7930:2:1;7915:18;;7908:48;7988:3;7973:19;;7758:240::o;8003:402::-;8205:2;8187:21;;;8244:2;8224:18;;;8217:30;8283:34;8278:2;8263:18;;8256:62;-1:-1:-1;;;8349:2:1;8334:18;;8327:36;8395:3;8380:19;;8177:228::o;8410:352::-;8612:2;8594:21;;;8651:2;8631:18;;;8624:30;8690;8685:2;8670:18;;8663:58;8753:2;8738:18;;8584:178::o;8767:400::-;8969:2;8951:21;;;9008:2;8988:18;;;8981:30;9047:34;9042:2;9027:18;;9020:62;-1:-1:-1;;;9113:2:1;9098:18;;9091:34;9157:3;9142:19;;8941:226::o;9172:349::-;9374:2;9356:21;;;9413:2;9393:18;;;9386:30;9452:27;9447:2;9432:18;;9425:55;9512:2;9497:18;;9346:175::o;9526:408::-;9728:2;9710:21;;;9767:2;9747:18;;;9740:30;9806:34;9801:2;9786:18;;9779:62;-1:-1:-1;;;9872:2:1;9857:18;;9850:42;9924:3;9909:19;;9700:234::o;9939:420::-;10141:2;10123:21;;;10180:2;10160:18;;;10153:30;10219:34;10214:2;10199:18;;10192:62;10290:26;10285:2;10270:18;;10263:54;10349:3;10334:19;;10113:246::o;10364:406::-;10566:2;10548:21;;;10605:2;10585:18;;;10578:30;10644:34;10639:2;10624:18;;10617:62;-1:-1:-1;;;10710:2:1;10695:18;;10688:40;10760:3;10745:19;;10538:232::o;10775:405::-;10977:2;10959:21;;;11016:2;10996:18;;;10989:30;11055:34;11050:2;11035:18;;11028:62;-1:-1:-1;;;11121:2:1;11106:18;;11099:39;11170:3;11155:19;;10949:231::o;11185:410::-;11387:2;11369:21;;;11426:2;11406:18;;;11399:30;11465:34;11460:2;11445:18;;11438:62;-1:-1:-1;;;11531:2:1;11516:18;;11509:44;11585:3;11570:19;;11359:236::o;11600:356::-;11802:2;11784:21;;;11821:18;;;11814:30;11880:34;11875:2;11860:18;;11853:62;11947:2;11932:18;;11774:182::o;11961:413::-;12163:2;12145:21;;;12202:2;12182:18;;;12175:30;12241:34;12236:2;12221:18;;12214:62;-1:-1:-1;;;12307:2:1;12292:18;;12285:47;12364:3;12349:19;;12135:239::o;12379:408::-;12581:2;12563:21;;;12620:2;12600:18;;;12593:30;12659:34;12654:2;12639:18;;12632:62;-1:-1:-1;;;12725:2:1;12710:18;;12703:42;12777:3;12762:19;;12553:234::o;12792:356::-;12994:2;12976:21;;;13013:18;;;13006:30;13072:34;13067:2;13052:18;;13045:62;13139:2;13124:18;;12966:182::o;13153:405::-;13355:2;13337:21;;;13394:2;13374:18;;;13367:30;13433:34;13428:2;13413:18;;13406:62;-1:-1:-1;;;13499:2:1;13484:18;;13477:39;13548:3;13533:19;;13327:231::o;13563:411::-;13765:2;13747:21;;;13804:2;13784:18;;;13777:30;13843:34;13838:2;13823:18;;13816:62;-1:-1:-1;;;13909:2:1;13894:18;;13887:45;13964:3;13949:19;;13737:237::o;13979:397::-;14181:2;14163:21;;;14220:2;14200:18;;;14193:30;14259:34;14254:2;14239:18;;14232:62;-1:-1:-1;;;14325:2:1;14310:18;;14303:31;14366:3;14351:19;;14153:223::o;14381:413::-;14583:2;14565:21;;;14622:2;14602:18;;;14595:30;14661:34;14656:2;14641:18;;14634:62;-1:-1:-1;;;14727:2:1;14712:18;;14705:47;14784:3;14769:19;;14555:239::o;14799:177::-;14945:25;;;14933:2;14918:18;;14900:76::o;14981:128::-;;15052:1;15048:6;15045:1;15042:13;15039:2;;;15058:18;;:::i;:::-;-1:-1:-1;15094:9:1;;15029:80::o;15114:120::-;;15180:1;15170:2;;15185:18;;:::i;:::-;-1:-1:-1;15219:9:1;;15160:74::o;15239:125::-;;15307:1;15304;15301:8;15298:2;;;15312:18;;:::i;:::-;-1:-1:-1;15349:9:1;;15288:76::o;15369:258::-;15441:1;15451:113;15465:6;15462:1;15459:13;15451:113;;;15541:11;;;15535:18;15522:11;;;15515:39;15487:2;15480:10;15451:113;;;15582:6;15579:1;15576:13;15573:2;;;-1:-1:-1;;15617:1:1;15599:16;;15592:27;15422:205::o;15632:380::-;15717:1;15707:12;;15764:1;15754:12;;;15775:2;;15829:4;15821:6;15817:17;15807:27;;15775:2;15882;15874:6;15871:14;15851:18;15848:38;15845:2;;;15928:10;15923:3;15919:20;15916:1;15909:31;15963:4;15960:1;15953:15;15991:4;15988:1;15981:15;15845:2;;15687:325;;;:::o;16017:135::-;;-1:-1:-1;;16077:17:1;;16074:2;;;16097:18;;:::i;:::-;-1:-1:-1;16144:1:1;16133:13;;16064:88::o;16157:112::-;;16215:1;16205:2;;16220:18;;:::i;:::-;-1:-1:-1;16254:9:1;;16195:74::o;16274:127::-;16335:10;16330:3;16326:20;16323:1;16316:31;16366:4;16363:1;16356:15;16390:4;16387:1;16380:15;16406:127;16467:10;16462:3;16458:20;16455:1;16448:31;16498:4;16495:1;16488:15;16522:4;16519:1;16512:15;16538:127;16599:10;16594:3;16590:20;16587:1;16580:31;16630:4;16627:1;16620:15;16654:4;16651:1;16644:15;16670:133;-1:-1:-1;;;;;16747:31:1;;16737:42;;16727:2;;16793:1;16790;16783:12;16808:120;16896:5;16889:13;16882:21;16875:5;16872:32;16862:2;;16918:1;16915;16908:12;16933:133;-1:-1:-1;;;;;;17009:32:1;;16999:43;;16989:2;;17056:1;17053;17046:12

Swarm Source

ipfs://657c89de26ee51224af4278e985776ac087158c96018ba0afe1358d7962d7ba4
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.