ETH Price: $3,424.06 (-1.61%)
Gas: 8 Gwei

Token

DemonPartyDragonEggs (DRAGONEGGS)
 

Overview

Max Total Supply

300 DRAGONEGGS

Holders

196

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 DRAGONEGGS
0x8D1bab837081EFcfE3469C8f99A334Fb0FE69cC9
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:
DemonPartyDragonEggs

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-14
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.6.0) (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`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

// File: contracts/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 and Enumerable extensions
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
  using Address for address;
  using Strings for uint256;

  string private _name;
  string private _symbol;

  // nft ownership + burns data
  address[] public owners;
  uint public burnedTokens;

  function totalSupply() public override view returns (uint256) {
    return owners.length - burnedTokens;
  }

  function tokenByIndex(uint256 id) public override pure returns (uint256) {
    return id;
  }
  function tokenOfOwnerByIndex(address user, uint256 id) public override view returns (uint256) {
    uint256 ownedCount = 0;
    for(uint i = 0; i < owners.length; i++) {
      if(owners[i] == user) {
        if(ownedCount == id) {
          return i;
        } else {
          ownedCount++;
        }
      }
    }

    revert("ID_TOO_HIGH");
  }

  // 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");
    uint count;
    for(uint i = 0; i < owners.length; i++) {
      if(owner == owners[i]) {
        count++;
      }
    }
    return count;
  }

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

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

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

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

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

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

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

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

    _approve(to, tokenId);
  }

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

    return _tokenApprovals[tokenId];
  }

  /**
  * @dev See {IERC721-setApprovalForAll}.
  */
  function setApprovalForAll(address operator, bool approved) public virtual override {
    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.length > tokenId && 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), "ALREADY_MINTED");

    owners.push(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);

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

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

    // delete owners[tokenId];
    owners[tokenId] = address(0);
    burnedTokens++;

    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");

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

    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
    /* TODO : MAKE PRIVATE */
  ) public returns (bool) {
    if (to.isContract()) {
      try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
        return retval == IERC721Receiver.onERC721Received.selector;
      } catch (bytes memory reason) {
        if (reason.length == 0) {
          revert("ERC721: transfer to non ERC721Receiver implementer");
        } else {
          assembly {
            revert(add(32, reason), mload(reason))
          }
        }
      }
    } else {
      return true;
    }
  }
}


// File: contracts/DemonPartyDragonEggs.sol


pragma solidity ^0.8.6;




contract DemonPartyDragonEggs is ERC721, Ownable {

  //---------------------------------------------------------------
  //  CONSTANTS
  //---------------------------------------------------------------
  uint256 public constant MAX_SUPPLY = 300;

  //---------------------------------------------------------------
  //  METADATA
  //---------------------------------------------------------------
  string public baseURI;
  uint256 public startTimestamp;

  function tokenURI(uint256 id) public view virtual override returns (string memory) {
    require(_exists(id), "ERC721Metadata: URI query for nonexistent token");
    return string(abi.encodePacked(baseURI, Strings.toString(id), ".json"));
  }

  //---------------------------------------------------------------
  //  CONSTRUCTOR
  //---------------------------------------------------------------

  constructor() ERC721("DemonPartyDragonEggs", "DRAGONEGGS") {
    for(uint i = 0; i < 10; i++) {
      _safeMint(0x08D4bCe80056c95b1C9bc38fEC63901e3b563186, owners.length);
    }
    startTimestamp = 1652544000;
  }

  function mint() public payable {
    require(owners.length + 1 <= MAX_SUPPLY, "TOO_MANY_MINTS");
    require(block.timestamp >= startTimestamp, "NOT_LIVE");

    minters[msg.sender] += 1;
    require( (minters[msg.sender] ) <= 1, "ADDRESS_MAX_REACHED");
    _safeMint(msg.sender, owners.length);
  }

  mapping (address => uint256) public minters;

  function burn(uint256 id) public {
    _burn(id);
  }

  //----------------------------------------------------------------
  //  ADMIN FUNCTIONS
  //----------------------------------------------------------------

  function setBaseURI(string memory uri) public onlyOwner {
    baseURI = uri;
  }
  function setStartTimestamp(uint256 timestamp) public onlyOwner {
    startTimestamp = timestamp;
  }

  //---------------------------------------------------------------
  // WITHDRAWAL
  //---------------------------------------------------------------

  function withdraw(address to, uint amount) public onlyOwner {
    (bool success, ) = payable(to).call{value: amount}("");
    require(success, "WITHDRAWAL_FAILED");
  }

  function donate() payable public returns (bool success) {
    return true;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"_checkOnERC721Received","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"donate","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","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":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"owners","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":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"setStartTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604080518082018252601481527f44656d6f6e5061727479447261676f6e4567677300000000000000000000000060208083019182528351808501909452600a845269445241474f4e4547475360b01b9084015281519192916200007991600091620004df565b5080516200008f906001906020840190620004df565b505050620000ac620000a66200010160201b60201c565b62000105565b60005b600a811015620000f257600254620000dd907308d4bce80056c95b1c9bc38fec63901e3b5631869062000157565b80620000e98162000670565b915050620000af565b5063627fd200600855620006b0565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620001798282604051806020016040528060008152506200017d60201b60201c565b5050565b620001898383620001f9565b62000198600084848462000318565b620001f45760405162461bcd60e51b81526020600482015260326024820152600080516020620025e783398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60648201526084015b60405180910390fd5b505050565b6001600160a01b038216620002515760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401620001eb565b6200025c8162000481565b156200029c5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401620001eb565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600062000339846001600160a01b0316620004d060201b6200111f1760201c565b156200047557604051630a85bd0160e11b81526001600160a01b0385169063150b7a029062000373903390899088908890600401620005b8565b602060405180830381600087803b1580156200038e57600080fd5b505af1925050508015620003c1575060408051601f3d908101601f19168201909252620003be9181019062000585565b60015b6200045a573d808015620003f2576040519150601f19603f3d011682016040523d82523d6000602084013e620003f7565b606091505b508051620004525760405162461bcd60e51b81526020600482015260326024820152600080516020620025e783398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401620001eb565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905062000479565b5060015b949350505050565b60025460009082108015620004ca575060006001600160a01b031660028381548110620004b257620004b26200069a565b6000918252602090912001546001600160a01b031614155b92915050565b6001600160a01b03163b151590565b828054620004ed9062000633565b90600052602060002090601f0160209004810192826200051157600085556200055c565b82601f106200052c57805160ff19168380011785556200055c565b828001600101855582156200055c579182015b828111156200055c5782518255916020019190600101906200053f565b506200056a9291506200056e565b5090565b5b808211156200056a57600081556001016200056f565b6000602082840312156200059857600080fd5b81516001600160e01b031981168114620005b157600080fd5b9392505050565b600060018060a01b038087168352602081871681850152856040850152608060608501528451915081608085015260005b82811015620006075785810182015185820160a001528101620005e9565b828111156200061a57600060a084870101525b5050601f01601f19169190910160a00195945050505050565b600181811c908216806200064857607f821691505b602082108114156200066a57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156200069357634e487b7160e01b600052601160045260246000fd5b5060010190565b634e487b7160e01b600052603260045260246000fd5b611f2780620006c06000396000f3fe6080604052600436106101e35760003560e01c80636352211e11610102578063c44bef7511610095578063ed88c68e11610064578063ed88c68e1461056a578063f2fde38b14610571578063f3fef3a314610591578063f46eccc4146105b157600080fd5b8063c44bef75146104cb578063c87b56dd146104eb578063e6fd48bc1461050b578063e985e9c51461052157600080fd5b80638da5cb5b116100d15780638da5cb5b1461045857806395d89b4114610476578063a22cb4651461048b578063b88d4fde146104ab57600080fd5b80636352211e146103ee5780636c0360eb1461040e57806370a0823114610423578063715018a61461044357600080fd5b806323b872dd1161017a57806342966c681161014957806342966c681461037a57806347b5dd541461039a5780634f6ccce7146103b057806355f804b3146103ce57600080fd5b806323b872dd146103045780632f745c591461032457806332cb6b0c1461034457806342842e0e1461035a57600080fd5b8063095ea7b3116101b6578063095ea7b3146102975780631249c58b146102b957806318160ddd146102c15780631fd01de1146102e457600080fd5b806301ffc9a7146101e8578063025e7c271461021d57806306fdde0314610255578063081812fc14610277575b600080fd5b3480156101f457600080fd5b50610208610203366004611a86565b6105de565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b5061023d610238366004611b09565b610630565b6040516001600160a01b039091168152602001610214565b34801561026157600080fd5b5061026a61065a565b6040516102149190611c62565b34801561028357600080fd5b5061023d610292366004611b09565b6106ec565b3480156102a357600080fd5b506102b76102b2366004611a5c565b610779565b005b6102b7610839565b3480156102cd57600080fd5b506102d6610952565b604051908152602001610214565b3480156102f057600080fd5b506102086102ff3660046119a4565b610969565b34801561031057600080fd5b506102b761031f366004611968565b610a77565b34801561033057600080fd5b506102d661033f366004611a5c565b610aa8565b34801561035057600080fd5b506102d661012c81565b34801561036657600080fd5b506102b7610375366004611968565b610b57565b34801561038657600080fd5b506102b7610395366004611b09565b610b72565b3480156103a657600080fd5b506102d660035481565b3480156103bc57600080fd5b506102d66103cb366004611b09565b90565b3480156103da57600080fd5b506102b76103e9366004611ac0565b610b7e565b3480156103fa57600080fd5b5061023d610409366004611b09565b610bbf565b34801561041a57600080fd5b5061026a610c56565b34801561042f57600080fd5b506102d661043e366004611913565b610ce4565b34801561044f57600080fd5b506102b7610db6565b34801561046457600080fd5b506006546001600160a01b031661023d565b34801561048257600080fd5b5061026a610dea565b34801561049757600080fd5b506102b76104a6366004611a20565b610df9565b3480156104b757600080fd5b506102b76104c63660046119a4565b610ebe565b3480156104d757600080fd5b506102b76104e6366004611b09565b610ef6565b3480156104f757600080fd5b5061026a610506366004611b09565b610f25565b34801561051757600080fd5b506102d660085481565b34801561052d57600080fd5b5061020861053c366004611935565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6001610208565b34801561057d57600080fd5b506102b761058c366004611913565b610fc6565b34801561059d57600080fd5b506102b76105ac366004611a5c565b61105e565b3480156105bd57600080fd5b506102d66105cc366004611913565b60096020526000908152604090205481565b60006001600160e01b031982166380ac58cd60e01b148061060f57506001600160e01b03198216635b5e139f60e01b145b8061062a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6002818154811061064057600080fd5b6000918252602090912001546001600160a01b0316905081565b60606000805461066990611e19565b80601f016020809104026020016040519081016040528092919081815260200182805461069590611e19565b80156106e25780601f106106b7576101008083540402835291602001916106e2565b820191906000526020600020905b8154815290600101906020018083116106c557829003601f168201915b5050505050905090565b60006106f78261112e565b61075d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061078482610bbf565b9050806001600160a01b0316836001600160a01b031614156107f25760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610754565b336001600160a01b038216148061080e575061080e813361053c565b61082a5760405162461bcd60e51b815260040161075490611cc7565b6108348383611178565b505050565b60025461012c9061084b906001611daa565b111561088a5760405162461bcd60e51b815260206004820152600e60248201526d544f4f5f4d414e595f4d494e545360901b6044820152606401610754565b6008544210156108c75760405162461bcd60e51b81526020600482015260086024820152674e4f545f4c49564560c01b6044820152606401610754565b3360009081526009602052604081208054600192906108e7908490611daa565b909155505033600090815260096020526040902054600110156109425760405162461bcd60e51b8152602060048201526013602482015272105111149154d4d7d3505617d4915050d21151606a1b6044820152606401610754565b6002546109509033906111e6565b565b60035460025460009161096491611dd6565b905090565b60006001600160a01b0384163b15610a6b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906109ad903390899088908890600401611c25565b602060405180830381600087803b1580156109c757600080fd5b505af19250505080156109f7575060408051601f3d908101601f191682019092526109f491810190611aa3565b60015b610a51573d808015610a25576040519150601f19603f3d011682016040523d82523d6000602084013e610a2a565b606091505b508051610a495760405162461bcd60e51b815260040161075490611c75565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610a6f565b5060015b949350505050565b610a813382611200565b610a9d5760405162461bcd60e51b815260040161075490611d59565b6108348383836112e6565b600080805b600254811015610b2057846001600160a01b031660028281548110610ad457610ad4611eaf565b6000918252602090912001546001600160a01b03161415610b0e5783821415610b0057915061062a9050565b81610b0a81611e54565b9250505b80610b1881611e54565b915050610aad565b5060405162461bcd60e51b815260206004820152600b60248201526a09288bea89e9ebe90928e960ab1b6044820152606401610754565b61083483838360405180602001604052806000815250610ebe565b610b7b8161143c565b50565b6006546001600160a01b03163314610ba85760405162461bcd60e51b815260040161075490611d24565b8051610bbb9060079060208401906117e8565b5050565b6002546000908210610c255760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610754565b600060028381548110610c3a57610c3a611eaf565b6000918252602090912001546001600160a01b03169392505050565b60078054610c6390611e19565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8f90611e19565b8015610cdc5780601f10610cb157610100808354040283529160200191610cdc565b820191906000526020600020905b815481529060010190602001808311610cbf57829003601f168201915b505050505081565b60006001600160a01b038216610d4f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610754565b6000805b600254811015610daf5760028181548110610d7057610d70611eaf565b6000918252602090912001546001600160a01b0385811691161415610d9d5781610d9981611e54565b9250505b80610da781611e54565b915050610d53565b5092915050565b6006546001600160a01b03163314610de05760405162461bcd60e51b815260040161075490611d24565b6109506000611519565b60606001805461066990611e19565b6001600160a01b038216331415610e525760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610754565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610ec83383611200565b610ee45760405162461bcd60e51b815260040161075490611d59565b610ef08484848461156b565b50505050565b6006546001600160a01b03163314610f205760405162461bcd60e51b815260040161075490611d24565b600855565b6060610f308261112e565b610f945760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610754565b6007610f9f8361159e565b604051602001610fb0929190611b6a565b6040516020818303038152906040529050919050565b6006546001600160a01b03163314610ff05760405162461bcd60e51b815260040161075490611d24565b6001600160a01b0381166110555760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610754565b610b7b81611519565b6006546001600160a01b031633146110885760405162461bcd60e51b815260040161075490611d24565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146110d5576040519150601f19603f3d011682016040523d82523d6000602084013e6110da565b606091505b50509050806108345760405162461bcd60e51b815260206004820152601160248201527015d2551211149055d05317d19052531151607a1b6044820152606401610754565b6001600160a01b03163b151590565b6002546000908210801561062a575060006001600160a01b03166002838154811061115b5761115b611eaf565b6000918252602090912001546001600160a01b0316141592915050565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906111ad82610bbf565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610bbb82826040518060200160405280600081525061169c565b600061120b8261112e565b61126c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610754565b600061127783610bbf565b9050806001600160a01b0316846001600160a01b031614806112b25750836001600160a01b03166112a7846106ec565b6001600160a01b0316145b80610a6f57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16610a6f565b826001600160a01b03166112f982610bbf565b6001600160a01b0316146113615760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610754565b6001600160a01b0382166113c35760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610754565b6113ce600082611178565b81600282815481106113e2576113e2611eaf565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b600061144782610bbf565b9050336001600160a01b03821614806114655750611465813361053c565b6114815760405162461bcd60e51b815260040161075490611cc7565b61148c600083611178565b6000600283815481106114a1576114a1611eaf565b6000918252602082200180546001600160a01b0319166001600160a01b03939093169290921790915560038054916114d883611e54565b909155505060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6115768484846112e6565b61158284848484610969565b610ef05760405162461bcd60e51b815260040161075490611c75565b6060816115c25750506040805180820190915260018152600360fc1b602082015290565b8160005b81156115ec57806115d681611e54565b91506115e59050600a83611dc2565b91506115c6565b60008167ffffffffffffffff81111561160757611607611ec5565b6040519080825280601f01601f191660200182016040528015611631576020820181803683370190505b5090505b8415610a6f57611646600183611dd6565b9150611653600a86611e6f565b61165e906030611daa565b60f81b81838151811061167357611673611eaf565b60200101906001600160f81b031916908160001a905350611695600a86611dc2565b9450611635565b6116a683836116cf565b6116b36000848484610969565b6108345760405162461bcd60e51b815260040161075490611c75565b6001600160a01b0382166117255760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610754565b61172e8161112e565b1561176c5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610754565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546117f490611e19565b90600052602060002090601f016020900481019282611816576000855561185c565b82601f1061182f57805160ff191683800117855561185c565b8280016001018555821561185c579182015b8281111561185c578251825591602001919060010190611841565b5061186892915061186c565b5090565b5b80821115611868576000815560010161186d565b600067ffffffffffffffff8084111561189c5761189c611ec5565b604051601f8501601f19908116603f011681019082821181831017156118c4576118c4611ec5565b816040528093508581528686860111156118dd57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461190e57600080fd5b919050565b60006020828403121561192557600080fd5b61192e826118f7565b9392505050565b6000806040838503121561194857600080fd5b611951836118f7565b915061195f602084016118f7565b90509250929050565b60008060006060848603121561197d57600080fd5b611986846118f7565b9250611994602085016118f7565b9150604084013590509250925092565b600080600080608085870312156119ba57600080fd5b6119c3856118f7565b93506119d1602086016118f7565b925060408501359150606085013567ffffffffffffffff8111156119f457600080fd5b8501601f81018713611a0557600080fd5b611a1487823560208401611881565b91505092959194509250565b60008060408385031215611a3357600080fd5b611a3c836118f7565b915060208301358015158114611a5157600080fd5b809150509250929050565b60008060408385031215611a6f57600080fd5b611a78836118f7565b946020939093013593505050565b600060208284031215611a9857600080fd5b813561192e81611edb565b600060208284031215611ab557600080fd5b815161192e81611edb565b600060208284031215611ad257600080fd5b813567ffffffffffffffff811115611ae957600080fd5b8201601f81018413611afa57600080fd5b610a6f84823560208401611881565b600060208284031215611b1b57600080fd5b5035919050565b60008151808452611b3a816020860160208601611ded565b601f01601f19169290920160200192915050565b60008151611b60818560208601611ded565b9290920192915050565b600080845481600182811c915080831680611b8657607f831692505b6020808410821415611ba657634e487b7160e01b86526022600452602486fd5b818015611bba5760018114611bcb57611bf8565b60ff19861689528489019650611bf8565b60008b81526020902060005b86811015611bf05781548b820152908501908301611bd7565b505084890196505b505050505050611c1c611c0b8286611b4e565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611c5890830184611b22565b9695505050505050565b60208152600061192e6020830184611b22565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115611dbd57611dbd611e83565b500190565b600082611dd157611dd1611e99565b500490565b600082821015611de857611de8611e83565b500390565b60005b83811015611e08578181015183820152602001611df0565b83811115610ef05750506000910152565b600181811c90821680611e2d57607f821691505b60208210811415611e4e57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611e6857611e68611e83565b5060010190565b600082611e7e57611e7e611e99565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610b7b57600080fdfea264697066735822122086e52b9df553cf0dc1ee06b619f79ab791584bc2e9e2626504ab08b51a20191d64736f6c634300080600334552433732313a207472616e7366657220746f206e6f6e204552433732315265

Deployed Bytecode

0x6080604052600436106101e35760003560e01c80636352211e11610102578063c44bef7511610095578063ed88c68e11610064578063ed88c68e1461056a578063f2fde38b14610571578063f3fef3a314610591578063f46eccc4146105b157600080fd5b8063c44bef75146104cb578063c87b56dd146104eb578063e6fd48bc1461050b578063e985e9c51461052157600080fd5b80638da5cb5b116100d15780638da5cb5b1461045857806395d89b4114610476578063a22cb4651461048b578063b88d4fde146104ab57600080fd5b80636352211e146103ee5780636c0360eb1461040e57806370a0823114610423578063715018a61461044357600080fd5b806323b872dd1161017a57806342966c681161014957806342966c681461037a57806347b5dd541461039a5780634f6ccce7146103b057806355f804b3146103ce57600080fd5b806323b872dd146103045780632f745c591461032457806332cb6b0c1461034457806342842e0e1461035a57600080fd5b8063095ea7b3116101b6578063095ea7b3146102975780631249c58b146102b957806318160ddd146102c15780631fd01de1146102e457600080fd5b806301ffc9a7146101e8578063025e7c271461021d57806306fdde0314610255578063081812fc14610277575b600080fd5b3480156101f457600080fd5b50610208610203366004611a86565b6105de565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b5061023d610238366004611b09565b610630565b6040516001600160a01b039091168152602001610214565b34801561026157600080fd5b5061026a61065a565b6040516102149190611c62565b34801561028357600080fd5b5061023d610292366004611b09565b6106ec565b3480156102a357600080fd5b506102b76102b2366004611a5c565b610779565b005b6102b7610839565b3480156102cd57600080fd5b506102d6610952565b604051908152602001610214565b3480156102f057600080fd5b506102086102ff3660046119a4565b610969565b34801561031057600080fd5b506102b761031f366004611968565b610a77565b34801561033057600080fd5b506102d661033f366004611a5c565b610aa8565b34801561035057600080fd5b506102d661012c81565b34801561036657600080fd5b506102b7610375366004611968565b610b57565b34801561038657600080fd5b506102b7610395366004611b09565b610b72565b3480156103a657600080fd5b506102d660035481565b3480156103bc57600080fd5b506102d66103cb366004611b09565b90565b3480156103da57600080fd5b506102b76103e9366004611ac0565b610b7e565b3480156103fa57600080fd5b5061023d610409366004611b09565b610bbf565b34801561041a57600080fd5b5061026a610c56565b34801561042f57600080fd5b506102d661043e366004611913565b610ce4565b34801561044f57600080fd5b506102b7610db6565b34801561046457600080fd5b506006546001600160a01b031661023d565b34801561048257600080fd5b5061026a610dea565b34801561049757600080fd5b506102b76104a6366004611a20565b610df9565b3480156104b757600080fd5b506102b76104c63660046119a4565b610ebe565b3480156104d757600080fd5b506102b76104e6366004611b09565b610ef6565b3480156104f757600080fd5b5061026a610506366004611b09565b610f25565b34801561051757600080fd5b506102d660085481565b34801561052d57600080fd5b5061020861053c366004611935565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6001610208565b34801561057d57600080fd5b506102b761058c366004611913565b610fc6565b34801561059d57600080fd5b506102b76105ac366004611a5c565b61105e565b3480156105bd57600080fd5b506102d66105cc366004611913565b60096020526000908152604090205481565b60006001600160e01b031982166380ac58cd60e01b148061060f57506001600160e01b03198216635b5e139f60e01b145b8061062a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6002818154811061064057600080fd5b6000918252602090912001546001600160a01b0316905081565b60606000805461066990611e19565b80601f016020809104026020016040519081016040528092919081815260200182805461069590611e19565b80156106e25780601f106106b7576101008083540402835291602001916106e2565b820191906000526020600020905b8154815290600101906020018083116106c557829003601f168201915b5050505050905090565b60006106f78261112e565b61075d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061078482610bbf565b9050806001600160a01b0316836001600160a01b031614156107f25760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610754565b336001600160a01b038216148061080e575061080e813361053c565b61082a5760405162461bcd60e51b815260040161075490611cc7565b6108348383611178565b505050565b60025461012c9061084b906001611daa565b111561088a5760405162461bcd60e51b815260206004820152600e60248201526d544f4f5f4d414e595f4d494e545360901b6044820152606401610754565b6008544210156108c75760405162461bcd60e51b81526020600482015260086024820152674e4f545f4c49564560c01b6044820152606401610754565b3360009081526009602052604081208054600192906108e7908490611daa565b909155505033600090815260096020526040902054600110156109425760405162461bcd60e51b8152602060048201526013602482015272105111149154d4d7d3505617d4915050d21151606a1b6044820152606401610754565b6002546109509033906111e6565b565b60035460025460009161096491611dd6565b905090565b60006001600160a01b0384163b15610a6b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906109ad903390899088908890600401611c25565b602060405180830381600087803b1580156109c757600080fd5b505af19250505080156109f7575060408051601f3d908101601f191682019092526109f491810190611aa3565b60015b610a51573d808015610a25576040519150601f19603f3d011682016040523d82523d6000602084013e610a2a565b606091505b508051610a495760405162461bcd60e51b815260040161075490611c75565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610a6f565b5060015b949350505050565b610a813382611200565b610a9d5760405162461bcd60e51b815260040161075490611d59565b6108348383836112e6565b600080805b600254811015610b2057846001600160a01b031660028281548110610ad457610ad4611eaf565b6000918252602090912001546001600160a01b03161415610b0e5783821415610b0057915061062a9050565b81610b0a81611e54565b9250505b80610b1881611e54565b915050610aad565b5060405162461bcd60e51b815260206004820152600b60248201526a09288bea89e9ebe90928e960ab1b6044820152606401610754565b61083483838360405180602001604052806000815250610ebe565b610b7b8161143c565b50565b6006546001600160a01b03163314610ba85760405162461bcd60e51b815260040161075490611d24565b8051610bbb9060079060208401906117e8565b5050565b6002546000908210610c255760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610754565b600060028381548110610c3a57610c3a611eaf565b6000918252602090912001546001600160a01b03169392505050565b60078054610c6390611e19565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8f90611e19565b8015610cdc5780601f10610cb157610100808354040283529160200191610cdc565b820191906000526020600020905b815481529060010190602001808311610cbf57829003601f168201915b505050505081565b60006001600160a01b038216610d4f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610754565b6000805b600254811015610daf5760028181548110610d7057610d70611eaf565b6000918252602090912001546001600160a01b0385811691161415610d9d5781610d9981611e54565b9250505b80610da781611e54565b915050610d53565b5092915050565b6006546001600160a01b03163314610de05760405162461bcd60e51b815260040161075490611d24565b6109506000611519565b60606001805461066990611e19565b6001600160a01b038216331415610e525760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610754565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610ec83383611200565b610ee45760405162461bcd60e51b815260040161075490611d59565b610ef08484848461156b565b50505050565b6006546001600160a01b03163314610f205760405162461bcd60e51b815260040161075490611d24565b600855565b6060610f308261112e565b610f945760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610754565b6007610f9f8361159e565b604051602001610fb0929190611b6a565b6040516020818303038152906040529050919050565b6006546001600160a01b03163314610ff05760405162461bcd60e51b815260040161075490611d24565b6001600160a01b0381166110555760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610754565b610b7b81611519565b6006546001600160a01b031633146110885760405162461bcd60e51b815260040161075490611d24565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146110d5576040519150601f19603f3d011682016040523d82523d6000602084013e6110da565b606091505b50509050806108345760405162461bcd60e51b815260206004820152601160248201527015d2551211149055d05317d19052531151607a1b6044820152606401610754565b6001600160a01b03163b151590565b6002546000908210801561062a575060006001600160a01b03166002838154811061115b5761115b611eaf565b6000918252602090912001546001600160a01b0316141592915050565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906111ad82610bbf565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610bbb82826040518060200160405280600081525061169c565b600061120b8261112e565b61126c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610754565b600061127783610bbf565b9050806001600160a01b0316846001600160a01b031614806112b25750836001600160a01b03166112a7846106ec565b6001600160a01b0316145b80610a6f57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16610a6f565b826001600160a01b03166112f982610bbf565b6001600160a01b0316146113615760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610754565b6001600160a01b0382166113c35760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610754565b6113ce600082611178565b81600282815481106113e2576113e2611eaf565b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051839285811692908716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9190a4505050565b600061144782610bbf565b9050336001600160a01b03821614806114655750611465813361053c565b6114815760405162461bcd60e51b815260040161075490611cc7565b61148c600083611178565b6000600283815481106114a1576114a1611eaf565b6000918252602082200180546001600160a01b0319166001600160a01b03939093169290921790915560038054916114d883611e54565b909155505060405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6115768484846112e6565b61158284848484610969565b610ef05760405162461bcd60e51b815260040161075490611c75565b6060816115c25750506040805180820190915260018152600360fc1b602082015290565b8160005b81156115ec57806115d681611e54565b91506115e59050600a83611dc2565b91506115c6565b60008167ffffffffffffffff81111561160757611607611ec5565b6040519080825280601f01601f191660200182016040528015611631576020820181803683370190505b5090505b8415610a6f57611646600183611dd6565b9150611653600a86611e6f565b61165e906030611daa565b60f81b81838151811061167357611673611eaf565b60200101906001600160f81b031916908160001a905350611695600a86611dc2565b9450611635565b6116a683836116cf565b6116b36000848484610969565b6108345760405162461bcd60e51b815260040161075490611c75565b6001600160a01b0382166117255760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610754565b61172e8161112e565b1561176c5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610754565b6002805460018101825560009182527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0385169081179091556040518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546117f490611e19565b90600052602060002090601f016020900481019282611816576000855561185c565b82601f1061182f57805160ff191683800117855561185c565b8280016001018555821561185c579182015b8281111561185c578251825591602001919060010190611841565b5061186892915061186c565b5090565b5b80821115611868576000815560010161186d565b600067ffffffffffffffff8084111561189c5761189c611ec5565b604051601f8501601f19908116603f011681019082821181831017156118c4576118c4611ec5565b816040528093508581528686860111156118dd57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461190e57600080fd5b919050565b60006020828403121561192557600080fd5b61192e826118f7565b9392505050565b6000806040838503121561194857600080fd5b611951836118f7565b915061195f602084016118f7565b90509250929050565b60008060006060848603121561197d57600080fd5b611986846118f7565b9250611994602085016118f7565b9150604084013590509250925092565b600080600080608085870312156119ba57600080fd5b6119c3856118f7565b93506119d1602086016118f7565b925060408501359150606085013567ffffffffffffffff8111156119f457600080fd5b8501601f81018713611a0557600080fd5b611a1487823560208401611881565b91505092959194509250565b60008060408385031215611a3357600080fd5b611a3c836118f7565b915060208301358015158114611a5157600080fd5b809150509250929050565b60008060408385031215611a6f57600080fd5b611a78836118f7565b946020939093013593505050565b600060208284031215611a9857600080fd5b813561192e81611edb565b600060208284031215611ab557600080fd5b815161192e81611edb565b600060208284031215611ad257600080fd5b813567ffffffffffffffff811115611ae957600080fd5b8201601f81018413611afa57600080fd5b610a6f84823560208401611881565b600060208284031215611b1b57600080fd5b5035919050565b60008151808452611b3a816020860160208601611ded565b601f01601f19169290920160200192915050565b60008151611b60818560208601611ded565b9290920192915050565b600080845481600182811c915080831680611b8657607f831692505b6020808410821415611ba657634e487b7160e01b86526022600452602486fd5b818015611bba5760018114611bcb57611bf8565b60ff19861689528489019650611bf8565b60008b81526020902060005b86811015611bf05781548b820152908501908301611bd7565b505084890196505b505050505050611c1c611c0b8286611b4e565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611c5890830184611b22565b9695505050505050565b60208152600061192e6020830184611b22565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115611dbd57611dbd611e83565b500190565b600082611dd157611dd1611e99565b500490565b600082821015611de857611de8611e83565b500390565b60005b83811015611e08578181015183820152602001611df0565b83811115610ef05750506000910152565b600181811c90821680611e2d57607f821691505b60208210811415611e4e57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611e6857611e68611e83565b5060010190565b600082611e7e57611e7e611e99565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610b7b57600080fdfea264697066735822122086e52b9df553cf0dc1ee06b619f79ab791584bc2e9e2626504ab08b51a20191d64736f6c63430008060033

Deployed Bytecode Sourcemap

36197:2308:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25447:279;;;;;;;;;;-1:-1:-1;25447:279:0;;;;;:::i;:::-;;:::i;:::-;;;6995:14:1;;6988:22;6970:41;;6958:2;6943:18;25447:279:0;;;;;;;;24300:23;;;;;;;;;;-1:-1:-1;24300:23:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6293:32:1;;;6275:51;;6263:2;6248:18;24300:23:0;6230:102:1;26434:94:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27873:211::-;;;;;;;;;;-1:-1:-1;27873:211:0;;;;;:::i;:::-;;:::i;27440:377::-;;;;;;;;;;-1:-1:-1;27440:377:0;;;;;:::i;:::-;;:::i;:::-;;37306:306;;;:::i;24359:110::-;;;;;;;;;;;;;:::i;:::-;;;15473:25:1;;;15461:2;15446:18;24359:110:0;15428:76:1;35407:699:0;;;;;;;;;;-1:-1:-1;35407:699:0;;;;;:::i;:::-;;:::i;28703:311::-;;;;;;;;;;-1:-1:-1;28703:311:0;;;;;:::i;:::-;;:::i;24574:360::-;;;;;;;;;;-1:-1:-1;24574:360:0;;;;;:::i;:::-;;:::i;36408:40::-;;;;;;;;;;;;36445:3;36408:40;;29075:165;;;;;;;;;;-1:-1:-1;29075:165:0;;;;;:::i;:::-;;:::i;37668:55::-;;;;;;;;;;-1:-1:-1;37668:55:0;;;;;:::i;:::-;;:::i;24328:24::-;;;;;;;;;;;;;;;;24475:95;;;;;;;;;;-1:-1:-1;24475:95:0;;;;;:::i;:::-;24562:2;24475:95;37894:82;;;;;;;;;;-1:-1:-1;37894:82:0;;;;;:::i;:::-;;:::i;26149:228::-;;;;;;;;;;-1:-1:-1;26149:228:0;;;;;:::i;:::-;;:::i;36609:21::-;;;;;;;;;;;;;:::i;25780:317::-;;;;;;;;;;-1:-1:-1;25780:317:0;;;;;:::i;:::-;;:::i;4730:103::-;;;;;;;;;;;;;:::i;4079:87::-;;;;;;;;;;-1:-1:-1;4152:6:0;;-1:-1:-1;;;;;4152:6:0;4079:87;;26587:98;;;;;;;;;;;;;:::i;28146:281::-;;;;;;;;;;-1:-1:-1;28146:281:0;;;;;:::i;:::-;;:::i;29301:300::-;;;;;;;;;;-1:-1:-1;29301:300:0;;;;;:::i;:::-;;:::i;37980:102::-;;;;;;;;;;-1:-1:-1;37980:102:0;;;;;:::i;:::-;;:::i;36671:245::-;;;;;;;;;;-1:-1:-1;36671:245:0;;;;;:::i;:::-;;:::i;36635:29::-;;;;;;;;;;;;;;;;28488:158;;;;;;;;;;-1:-1:-1;28488:158:0;;;;;:::i;:::-;-1:-1:-1;;;;;28605:25:0;;;28585:4;28605:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;28488:158;38422:80;38492:4;38422:80;;4988:201;;;;;;;;;;-1:-1:-1;4988:201:0;;;;;:::i;:::-;;:::i;38245:171::-;;;;;;;;;;-1:-1:-1;38245:171:0;;;;;:::i;:::-;;:::i;37618:43::-;;;;;;;;;;-1:-1:-1;37618:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;25447:279;25549:4;-1:-1:-1;;;;;;25574:40:0;;-1:-1:-1;;;25574:40:0;;:99;;-1:-1:-1;;;;;;;25625:48:0;;-1:-1:-1;;;25625:48:0;25574:99;:146;;;-1:-1:-1;;;;;;;;;;16995:40:0;;;25684:36;25562:158;25447:279;-1:-1:-1;;25447:279:0:o;24300:23::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24300:23:0;;-1:-1:-1;24300:23:0;:::o;26434:94::-;26488:13;26517:5;26510:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26434:94;:::o;27873:211::-;27949:7;27973:16;27981:7;27973;:16::i;:::-;27965:73;;;;-1:-1:-1;;;27965:73:0;;11744:2:1;27965:73:0;;;11726:21:1;11783:2;11763:18;;;11756:30;11822:34;11802:18;;;11795:62;-1:-1:-1;;;11873:18:1;;;11866:42;11925:19;;27965:73:0;;;;;;;;;-1:-1:-1;28054:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;28054:24:0;;27873:211::o;27440:377::-;27517:13;27533:23;27548:7;27533:14;:23::i;:::-;27517:39;;27577:5;-1:-1:-1;;;;;27571:11:0;:2;-1:-1:-1;;;;;27571:11:0;;;27563:57;;;;-1:-1:-1;;;27563:57:0;;13690:2:1;27563:57:0;;;13672:21:1;13729:2;13709:18;;;13702:30;13768:34;13748:18;;;13741:62;-1:-1:-1;;;13819:18:1;;;13812:31;13860:19;;27563:57:0;13662:223:1;27563:57:0;2883:10;-1:-1:-1;;;;;27645:21:0;;;;:62;;-1:-1:-1;27670:37:0;27687:5;2883:10;28488:158;:::i;27670:37::-;27629:152;;;;-1:-1:-1;;;27629:152:0;;;;;;;:::i;:::-;27790:21;27799:2;27803:7;27790:8;:21::i;:::-;27510:307;27440:377;;:::o;37306:306::-;37352:6;:13;36445:3;;37352:17;;37368:1;37352:17;:::i;:::-;:31;;37344:58;;;;-1:-1:-1;;;37344:58:0;;7448:2:1;37344:58:0;;;7430:21:1;7487:2;7467:18;;;7460:30;-1:-1:-1;;;7506:18:1;;;7499:44;7560:18;;37344:58:0;7420:164:1;37344:58:0;37436:14;;37417:15;:33;;37409:54;;;;-1:-1:-1;;;37409:54:0;;15193:2:1;37409:54:0;;;15175:21:1;15232:1;15212:18;;;15205:29;-1:-1:-1;;;15250:18:1;;;15243:38;15298:18;;37409:54:0;15165:157:1;37409:54:0;37480:10;37472:19;;;;:7;:19;;;;;:24;;37495:1;;37472:19;:24;;37495:1;;37472:24;:::i;:::-;;;;-1:-1:-1;;37521:10:0;37513:19;;;;:7;:19;;;;;;37538:1;-1:-1:-1;37512:27:0;37503:60;;;;-1:-1:-1;;;37503:60:0;;7791:2:1;37503:60:0;;;7773:21:1;7830:2;7810:18;;;7803:30;-1:-1:-1;;;7849:18:1;;;7842:49;7908:18;;37503:60:0;7763:169:1;37503:60:0;37592:6;:13;37570:36;;37580:10;;37570:9;:36::i;:::-;37306:306::o;24359:110::-;24451:12;;24435:6;:13;24412:7;;24435:28;;;:::i;:::-;24428:35;;24359:110;:::o;35407:699::-;35574:4;-1:-1:-1;;;;;35591:13:0;;7075:19;:23;35587:514;;35621:72;;-1:-1:-1;;;35621:72:0;;-1:-1:-1;;;;;35621:36:0;;;;;:72;;2883:10;;35672:4;;35678:7;;35687:5;;35621:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35621:72:0;;;;;;;;-1:-1:-1;;35621:72:0;;;;;;;;;;;;:::i;:::-;;;35617:443;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35841:13:0;;35837:214;;35874:60;;-1:-1:-1;;;35874:60:0;;;;;;;:::i;35837:214::-;36019:6;36013:13;36004:6;36000:2;35996:15;35989:38;35617:443;-1:-1:-1;;;;;;35736:51:0;-1:-1:-1;;;35736:51:0;;-1:-1:-1;35729:58:0;;35587:514;-1:-1:-1;36089:4:0;35587:514;35407:699;;;;;;:::o;28703:311::-;28876:41;2883:10;28909:7;28876:18;:41::i;:::-;28868:103;;;;-1:-1:-1;;;28868:103:0;;;;;;;:::i;:::-;28980:28;28990:4;28996:2;29000:7;28980:9;:28::i;24574:360::-;24659:7;;;24704:195;24724:6;:13;24720:17;;24704:195;;;24769:4;-1:-1:-1;;;;;24756:17:0;:6;24763:1;24756:9;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;24756:9:0;:17;24753:139;;;24803:2;24789:10;:16;24786:97;;;24827:1;-1:-1:-1;24820:8:0;;-1:-1:-1;24820:8:0;24786:97;24859:12;;;;:::i;:::-;;;;24786:97;24739:3;;;;:::i;:::-;;;;24704:195;;;-1:-1:-1;24907:21:0;;-1:-1:-1;;;24907:21:0;;14510:2:1;24907:21:0;;;14492::1;14549:2;14529:18;;;14522:30;-1:-1:-1;;;14568:18:1;;;14561:41;14619:18;;24907:21:0;14482:161:1;29075:165:0;29195:39;29212:4;29218:2;29222:7;29195:39;;;;;;;;;;;;:16;:39::i;37668:55::-;37708:9;37714:2;37708:5;:9::i;:::-;37668:55;:::o;37894:82::-;4152:6;;-1:-1:-1;;;;;4152:6:0;2883:10;4299:23;4291:68;;;;-1:-1:-1;;;4291:68:0;;;;;;;:::i;:::-;37957:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;;37894:82:::0;:::o;26149:228::-;26255:6;:13;26221:7;;26245:23;;26237:77;;;;-1:-1:-1;;;26237:77:0;;10973:2:1;26237:77:0;;;10955:21:1;11012:2;10992:18;;;10985:30;11051:34;11031:18;;;11024:62;-1:-1:-1;;;11102:18:1;;;11095:39;11151:19;;26237:77:0;10945:231:1;26237:77:0;26321:13;26337:6;26344:7;26337:15;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;26337:15:0;;26149:228;-1:-1:-1;;;26149:228:0:o;36609:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25780:317::-;25852:7;-1:-1:-1;;;;;25876:19:0;;25868:74;;;;-1:-1:-1;;;25868:74:0;;10562:2:1;25868:74:0;;;10544:21:1;10601:2;10581:18;;;10574:30;10640:34;10620:18;;;10613:62;-1:-1:-1;;;10691:18:1;;;10684:40;10741:19;;25868:74:0;10534:232:1;25868:74:0;25949:10;;25966:107;25986:6;:13;25982:17;;25966:107;;;26027:6;26034:1;26027:9;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;26018:18:0;;;26027:9;;26018:18;26015:51;;;26049:7;;;;:::i;:::-;;;;26015:51;26001:3;;;;:::i;:::-;;;;25966:107;;;-1:-1:-1;26086:5:0;25780:317;-1:-1:-1;;25780:317:0:o;4730:103::-;4152:6;;-1:-1:-1;;;;;4152:6:0;2883:10;4299:23;4291:68;;;;-1:-1:-1;;;4291:68:0;;;;;;;:::i;:::-;4795:30:::1;4822:1;4795:18;:30::i;26587:98::-:0;26643:13;26672:7;26665:14;;;;;:::i;28146:281::-;-1:-1:-1;;;;;28245:24:0;;2883:10;28245:24;;28237:62;;;;-1:-1:-1;;;28237:62:0;;9370:2:1;28237:62:0;;;9352:21:1;9409:2;9389:18;;;9382:30;9448:27;9428:18;;;9421:55;9493:18;;28237:62:0;9342:175:1;28237:62:0;2883:10;28308:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;28308:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;28308:53:0;;;;;;;;;;28373:48;;6970:41:1;;;28308:42:0;;2883:10;28373:48;;6943:18:1;28373:48:0;;;;;;;28146:281;;:::o;29301:300::-;29454:41;2883:10;29487:7;29454:18;:41::i;:::-;29446:103;;;;-1:-1:-1;;;29446:103:0;;;;;;;:::i;:::-;29556:39;29570:4;29576:2;29580:7;29589:5;29556:13;:39::i;:::-;29301:300;;;;:::o;37980:102::-;4152:6;;-1:-1:-1;;;;;4152:6:0;2883:10;4299:23;4291:68;;;;-1:-1:-1;;;4291:68:0;;;;;;;:::i;:::-;38050:14:::1;:26:::0;37980:102::o;36671:245::-;36739:13;36769:11;36777:2;36769:7;:11::i;:::-;36761:71;;;;-1:-1:-1;;;36761:71:0;;13274:2:1;36761:71:0;;;13256:21:1;13313:2;13293:18;;;13286:30;13352:34;13332:18;;;13325:62;-1:-1:-1;;;13403:18:1;;;13396:45;13458:19;;36761:71:0;13246:237:1;36761:71:0;36870:7;36879:20;36896:2;36879:16;:20::i;:::-;36853:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36839:71;;36671:245;;;:::o;4988:201::-;4152:6;;-1:-1:-1;;;;;4152:6:0;2883:10;4299:23;4291:68;;;;-1:-1:-1;;;4291:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5077:22:0;::::1;5069:73;;;::::0;-1:-1:-1;;;5069:73:0;;8558:2:1;5069:73:0::1;::::0;::::1;8540:21:1::0;8597:2;8577:18;;;8570:30;8636:34;8616:18;;;8609:62;-1:-1:-1;;;8687:18:1;;;8680:36;8733:19;;5069:73:0::1;8530:228:1::0;5069:73:0::1;5153:28;5172:8;5153:18;:28::i;38245:171::-:0;4152:6;;-1:-1:-1;;;;;4152:6:0;2883:10;4299:23;4291:68;;;;-1:-1:-1;;;4291:68:0;;;;;;;:::i;:::-;38313:12:::1;38339:2;-1:-1:-1::0;;;;;38331:16:0::1;38355:6;38331:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38312:54;;;38381:7;38373:37;;;::::0;-1:-1:-1;;;38373:37:0;;12518:2:1;38373:37:0::1;::::0;::::1;12500:21:1::0;12557:2;12537:18;;;12530:30;-1:-1:-1;;;12576:18:1;;;12569:47;12633:18;;38373:37:0::1;12490:167:1::0;6780:326:0;-1:-1:-1;;;;;7075:19:0;;:23;;;6780:326::o;31041:147::-;31126:6;:13;31106:4;;31126:23;-1:-1:-1;31126:56:0;;;;;31180:1;-1:-1:-1;;;;;31153:29:0;:6;31160:7;31153:15;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;31153:15:0;:29;;31119:63;31041:147;-1:-1:-1;;31041:147:0:o;34697:164::-;34768:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;34768:29:0;-1:-1:-1;;;;;34768:29:0;;;;;;;;:24;;34818:23;34768:24;34818:14;:23::i;:::-;-1:-1:-1;;;;;34809:46:0;;;;;;;;;;;34697:164;;:::o;32000:104::-;32072:26;32082:2;32086:7;32072:26;;;;;;;;;;;;:9;:26::i;31341:334::-;31434:4;31455:16;31463:7;31455;:16::i;:::-;31447:73;;;;-1:-1:-1;;;31447:73:0;;9724:2:1;31447:73:0;;;9706:21:1;9763:2;9743:18;;;9736:30;9802:34;9782:18;;;9775:62;-1:-1:-1;;;9853:18:1;;;9846:42;9905:19;;31447:73:0;9696:234:1;31447:73:0;31527:13;31543:23;31558:7;31543:14;:23::i;:::-;31527:39;;31592:5;-1:-1:-1;;;;;31581:16:0;:7;-1:-1:-1;;;;;31581:16:0;;:51;;;;31625:7;-1:-1:-1;;;;;31601:31:0;:20;31613:7;31601:11;:20::i;:::-;-1:-1:-1;;;;;31601:31:0;;31581:51;:87;;;-1:-1:-1;;;;;;28605:25:0;;;28585:4;28605:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;31636:32;28488:158;34166:425;34307:4;-1:-1:-1;;;;;34280:31:0;:23;34295:7;34280:14;:23::i;:::-;-1:-1:-1;;;;;34280:31:0;;34272:85;;;;-1:-1:-1;;;34272:85:0;;12864:2:1;34272:85:0;;;12846:21:1;12903:2;12883:18;;;12876:30;12942:34;12922:18;;;12915:62;-1:-1:-1;;;12993:18:1;;;12986:39;13042:19;;34272:85:0;12836:231:1;34272:85:0;-1:-1:-1;;;;;34372:16:0;;34364:65;;;;-1:-1:-1;;;34364:65:0;;8965:2:1;34364:65:0;;;8947:21:1;9004:2;8984:18;;;8977:30;9043:34;9023:18;;;9016:62;-1:-1:-1;;;9094:18:1;;;9087:34;9138:19;;34364:65:0;8937:226:1;34364:65:0;34486:29;34503:1;34507:7;34486:8;:29::i;:::-;34542:2;34524:6;34531:7;34524:15;;;;;;;;:::i;:::-;;;;;;;;;:20;;-1:-1:-1;;;;;;34524:20:0;-1:-1:-1;;;;;34524:20:0;;;;;;34558:27;;34577:7;;34558:27;;;;;;;;;;34524:15;34558:27;34166:425;;;:::o;33383:464::-;33439:13;33455:23;33470:7;33455:14;:23::i;:::-;33439:39;-1:-1:-1;2883:10:0;-1:-1:-1;;;;;33503:21:0;;;;:62;;-1:-1:-1;33528:37:0;33545:5;2883:10;28488:158;:::i;33528:37::-;33487:152;;;;-1:-1:-1;;;33487:152:0;;;;;;;:::i;:::-;33672:29;33689:1;33693:7;33672:8;:29::i;:::-;33768:1;33742:6;33749:7;33742:15;;;;;;;;:::i;:::-;;;;;;;;;:28;;-1:-1:-1;;;;;;33742:28:0;-1:-1:-1;;;;;33742:28:0;;;;;;;;;;;33777:12;:14;;;;;;:::i;:::-;;;;-1:-1:-1;;33805:36:0;;33833:7;;33829:1;;-1:-1:-1;;;;;33805:36:0;;;;;33829:1;;33805:36;33432:415;33383:464;:::o;5349:191::-;5442:6;;;-1:-1:-1;;;;;5459:17:0;;;-1:-1:-1;;;;;;5459:17:0;;;;;;;5492:40;;5442:6;;;5459:17;5442:6;;5492:40;;5423:16;;5492:40;5412:128;5349:191;:::o;30458:287::-;30593:28;30603:4;30609:2;30613:7;30593:9;:28::i;:::-;30636:48;30659:4;30665:2;30669:7;30678:5;30636:22;:48::i;:::-;30628:111;;;;-1:-1:-1;;;30628:111:0;;;;;;;:::i;365:723::-;421:13;642:10;638:53;;-1:-1:-1;;669:10:0;;;;;;;;;;;;-1:-1:-1;;;669:10:0;;;;;365:723::o;638:53::-;716:5;701:12;757:78;764:9;;757:78;;790:8;;;;:::i;:::-;;-1:-1:-1;813:10:0;;-1:-1:-1;821:2:0;813:10;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;867:17:0;;845:39;;895:154;902:10;;895:154;;929:11;939:1;929:11;;:::i;:::-;;-1:-1:-1;998:10:0;1006:2;998:5;:10;:::i;:::-;985:24;;:2;:24;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;955:56:0;;;;;;;;-1:-1:-1;1026:11:0;1035:2;1026:11;;:::i;:::-;;;895:154;;32320:281;32432:18;32438:2;32442:7;32432:5;:18::i;:::-;32473:54;32504:1;32508:2;32512:7;32521:5;32473:22;:54::i;:::-;32457:138;;;;-1:-1:-1;;;32457:138:0;;;;;;;:::i;32916:255::-;-1:-1:-1;;;;;32992:16:0;;32984:61;;;;-1:-1:-1;;;32984:61:0;;11383:2:1;32984:61:0;;;11365:21:1;;;11402:18;;;11395:30;11461:34;11441:18;;;11434:62;11513:18;;32984:61:0;11355:182:1;32984:61:0;33061:16;33069:7;33061;:16::i;:::-;33060:17;33052:44;;;;-1:-1:-1;;;33052:44:0;;14850:2:1;33052:44:0;;;14832:21:1;14889:2;14869:18;;;14862:30;-1:-1:-1;;;14908:18:1;;;14901:44;14962:18;;33052:44:0;14822:164:1;33052:44:0;33105:6;:15;;;;;;;-1:-1:-1;33105:15:0;;;;;;;-1:-1:-1;;;;;;33105:15:0;-1:-1:-1;;;;;33105:15:0;;;;;;;;33132:33;;33157:7;;-1:-1:-1;33132:33:0;;-1:-1:-1;;33132:33:0;32916:255;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:2;;813:1;810;803:12;747:2;699:124;;;:::o;828:186::-;887:6;940:2;928:9;919:7;915:23;911:32;908:2;;;956:1;953;946:12;908:2;979:29;998:9;979:29;:::i;:::-;969:39;898:116;-1:-1:-1;;;898:116:1:o;1019:260::-;1087:6;1095;1148:2;1136:9;1127:7;1123:23;1119:32;1116:2;;;1164:1;1161;1154:12;1116:2;1187:29;1206:9;1187:29;:::i;:::-;1177:39;;1235:38;1269:2;1258:9;1254:18;1235:38;:::i;:::-;1225:48;;1106:173;;;;;:::o;1284:328::-;1361:6;1369;1377;1430:2;1418:9;1409:7;1405:23;1401:32;1398:2;;;1446:1;1443;1436:12;1398:2;1469:29;1488:9;1469:29;:::i;:::-;1459:39;;1517:38;1551:2;1540:9;1536:18;1517:38;:::i;:::-;1507:48;;1602:2;1591:9;1587:18;1574:32;1564:42;;1388:224;;;;;:::o;1617:666::-;1712:6;1720;1728;1736;1789:3;1777:9;1768:7;1764:23;1760:33;1757:2;;;1806:1;1803;1796:12;1757:2;1829:29;1848:9;1829:29;:::i;:::-;1819:39;;1877:38;1911:2;1900:9;1896:18;1877:38;:::i;:::-;1867:48;;1962:2;1951:9;1947:18;1934:32;1924:42;;2017:2;2006:9;2002:18;1989:32;2044:18;2036:6;2033:30;2030:2;;;2076:1;2073;2066:12;2030:2;2099:22;;2152:4;2144:13;;2140:27;-1:-1:-1;2130:2:1;;2181:1;2178;2171:12;2130:2;2204:73;2269:7;2264:2;2251:16;2246:2;2242;2238:11;2204:73;:::i;:::-;2194:83;;;1747:536;;;;;;;:::o;2288:347::-;2353:6;2361;2414:2;2402:9;2393:7;2389:23;2385:32;2382:2;;;2430:1;2427;2420:12;2382:2;2453:29;2472:9;2453:29;:::i;:::-;2443:39;;2532:2;2521:9;2517:18;2504:32;2579:5;2572:13;2565:21;2558:5;2555:32;2545:2;;2601:1;2598;2591:12;2545:2;2624:5;2614:15;;;2372:263;;;;;:::o;2640:254::-;2708:6;2716;2769:2;2757:9;2748:7;2744:23;2740:32;2737:2;;;2785:1;2782;2775:12;2737:2;2808:29;2827:9;2808:29;:::i;:::-;2798:39;2884:2;2869:18;;;;2856:32;;-1:-1:-1;;;2727:167:1:o;2899:245::-;2957:6;3010:2;2998:9;2989:7;2985:23;2981:32;2978:2;;;3026:1;3023;3016:12;2978:2;3065:9;3052:23;3084:30;3108:5;3084:30;:::i;3149:249::-;3218:6;3271:2;3259:9;3250:7;3246:23;3242:32;3239:2;;;3287:1;3284;3277:12;3239:2;3319:9;3313:16;3338:30;3362:5;3338:30;:::i;3403:450::-;3472:6;3525:2;3513:9;3504:7;3500:23;3496:32;3493:2;;;3541:1;3538;3531:12;3493:2;3581:9;3568:23;3614:18;3606:6;3603:30;3600:2;;;3646:1;3643;3636:12;3600:2;3669:22;;3722:4;3714:13;;3710:27;-1:-1:-1;3700:2:1;;3751:1;3748;3741:12;3700:2;3774:73;3839:7;3834:2;3821:16;3816:2;3812;3808:11;3774:73;:::i;3858:180::-;3917:6;3970:2;3958:9;3949:7;3945:23;3941:32;3938:2;;;3986:1;3983;3976:12;3938:2;-1:-1:-1;4009:23:1;;3928:110;-1:-1:-1;3928:110:1:o;4043:257::-;4084:3;4122:5;4116:12;4149:6;4144:3;4137:19;4165:63;4221:6;4214:4;4209:3;4205:14;4198:4;4191:5;4187:16;4165:63;:::i;:::-;4282:2;4261:15;-1:-1:-1;;4257:29:1;4248:39;;;;4289:4;4244:50;;4092:208;-1:-1:-1;;4092:208:1:o;4305:185::-;4347:3;4385:5;4379:12;4400:52;4445:6;4440:3;4433:4;4426:5;4422:16;4400:52;:::i;:::-;4468:16;;;;;4355:135;-1:-1:-1;;4355:135:1:o;4613:1301::-;4890:3;4919:1;4952:6;4946:13;4982:3;5004:1;5032:9;5028:2;5024:18;5014:28;;5092:2;5081:9;5077:18;5114;5104:2;;5158:4;5150:6;5146:17;5136:27;;5104:2;5184;5232;5224:6;5221:14;5201:18;5198:38;5195:2;;;-1:-1:-1;;;5259:33:1;;5315:4;5312:1;5305:15;5345:4;5266:3;5333:17;5195:2;5376:18;5403:104;;;;5521:1;5516:320;;;;5369:467;;5403:104;-1:-1:-1;;5436:24:1;;5424:37;;5481:16;;;;-1:-1:-1;5403:104:1;;5516:320;15582:1;15575:14;;;15619:4;15606:18;;5611:1;5625:165;5639:6;5636:1;5633:13;5625:165;;;5717:14;;5704:11;;;5697:35;5760:16;;;;5654:10;;5625:165;;;5629:3;;5819:6;5814:3;5810:16;5803:23;;5369:467;;;;;;;5852:56;5877:30;5903:3;5895:6;5877:30;:::i;:::-;-1:-1:-1;;;4555:20:1;;4600:1;4591:11;;4545:63;5852:56;5845:63;4898:1016;-1:-1:-1;;;;;4898:1016:1:o;6337:488::-;-1:-1:-1;;;;;6606:15:1;;;6588:34;;6658:15;;6653:2;6638:18;;6631:43;6705:2;6690:18;;6683:34;;;6753:3;6748:2;6733:18;;6726:31;;;6531:4;;6774:45;;6799:19;;6791:6;6774:45;:::i;:::-;6766:53;6540:285;-1:-1:-1;;;;;;6540:285:1:o;7022:219::-;7171:2;7160:9;7153:21;7134:4;7191:44;7231:2;7220:9;7216:18;7208:6;7191:44;:::i;7937:414::-;8139:2;8121:21;;;8178:2;8158:18;;;8151:30;8217:34;8212:2;8197:18;;8190:62;-1:-1:-1;;;8283:2:1;8268:18;;8261:48;8341:3;8326:19;;8111:240::o;9935:420::-;10137:2;10119:21;;;10176:2;10156:18;;;10149:30;10215:34;10210:2;10195:18;;10188:62;10286:26;10281:2;10266:18;;10259:54;10345:3;10330:19;;10109:246::o;11955:356::-;12157:2;12139:21;;;12176:18;;;12169:30;12235:34;12230:2;12215:18;;12208:62;12302:2;12287:18;;12129:182::o;13890:413::-;14092:2;14074:21;;;14131:2;14111:18;;;14104:30;14170:34;14165:2;14150:18;;14143:62;-1:-1:-1;;;14236:2:1;14221:18;;14214:47;14293:3;14278:19;;14064:239::o;15635:128::-;15675:3;15706:1;15702:6;15699:1;15696:13;15693:2;;;15712:18;;:::i;:::-;-1:-1:-1;15748:9:1;;15683:80::o;15768:120::-;15808:1;15834;15824:2;;15839:18;;:::i;:::-;-1:-1:-1;15873:9:1;;15814:74::o;15893:125::-;15933:4;15961:1;15958;15955:8;15952:2;;;15966:18;;:::i;:::-;-1:-1:-1;16003:9:1;;15942:76::o;16023:258::-;16095:1;16105:113;16119:6;16116:1;16113:13;16105:113;;;16195:11;;;16189:18;16176:11;;;16169:39;16141:2;16134:10;16105:113;;;16236:6;16233:1;16230:13;16227:2;;;-1:-1:-1;;16271:1:1;16253:16;;16246:27;16076:205::o;16286:380::-;16365:1;16361:12;;;;16408;;;16429:2;;16483:4;16475:6;16471:17;16461:27;;16429:2;16536;16528:6;16525:14;16505:18;16502:38;16499:2;;;16582:10;16577:3;16573:20;16570:1;16563:31;16617:4;16614:1;16607:15;16645:4;16642:1;16635:15;16499:2;;16341:325;;;:::o;16671:135::-;16710:3;-1:-1:-1;;16731:17:1;;16728:2;;;16751:18;;:::i;:::-;-1:-1:-1;16798:1:1;16787:13;;16718:88::o;16811:112::-;16843:1;16869;16859:2;;16874:18;;:::i;:::-;-1:-1:-1;16908:9:1;;16849:74::o;16928:127::-;16989:10;16984:3;16980:20;16977:1;16970:31;17020:4;17017:1;17010:15;17044:4;17041:1;17034:15;17060:127;17121:10;17116:3;17112:20;17109:1;17102:31;17152:4;17149:1;17142:15;17176:4;17173:1;17166:15;17192:127;17253:10;17248:3;17244:20;17241:1;17234:31;17284:4;17281:1;17274:15;17308:4;17305:1;17298:15;17324:127;17385:10;17380:3;17376:20;17373:1;17366:31;17416:4;17413:1;17406:15;17440:4;17437:1;17430:15;17456:131;-1:-1:-1;;;;;;17530:32:1;;17520:43;;17510:2;;17577:1;17574;17567:12

Swarm Source

ipfs://86e52b9df553cf0dc1ee06b619f79ab791584bc2e9e2626504ab08b51a20191d
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.