ERC-721
Source Code
Overview
Max Total Supply
10,000 GRUBZ
Holders
1
Transfers
-
0 (0%)
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
| # | Exchange | Pair | Price | 24H Volume | % Volume |
|---|
Contract Name:
GrubzClub
Compiler Version
v0.8.1+commit.df193b15
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-10-20
*/
/**
GrubzClub NFT - Web3.0
Website: https://grubzclub.point.link
Discord: https://discord.io/grubzclub
Twitter: https://twitter.com/grubzclub
*/
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
pragma solidity ^0.8.1;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
pragma solidity ^0.8.0;
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
}
// File: @openzeppelin/contracts/token/ERC721/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 tokenId);
/**
* @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: @openzeppelin/contracts/utils/introspection/ERC165.sol
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// File: @openzeppelin/contracts/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/Address.sol
pragma solidity ^0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(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/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/IERC721Receiver.sol
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
// File: @openzeppelin/contracts/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/token/ERC721/ERC721.sol
pragma solidity ^0.8.0;
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;
// Mapping owner address to token count
mapping(address => uint256) private _balances;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: balance query for the zero address");
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _owners[tokenId];
require(owner != address(0), "ERC721: owner query for nonexistent token");
return owner;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}
/**
* @dev Base URI for computing {tokenURI}. 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[tokenId] != address(0);
}
/**
* @dev Returns whether `spender` is allowed to manage `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
require(_exists(tokenId), "ERC721: operator query for nonexistent token");
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, _data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId);
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId);
// Clear approvals
_approve(address(0), tokenId);
_balances[owner] -= 1;
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId);
// Clear approvals from the previous owner
_approve(address(0), tokenId);
_balances[from] -= 1;
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits a {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param _data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
if (to.isContract()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
return retval == IERC721Receiver.onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
}
// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol
pragma solidity ^0.8.0;
/**
* @dev This implements an optional extension of {ERC721} defined in the EIP that adds
* enumerability of all the token ids in the contract as well as all token ids owned by each
* account.
*/
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
// Mapping from owner to list of owned token IDs
mapping(address => mapping(uint256 => uint256)) private _ownedTokens;
// Mapping from token ID to index of the owner tokens list
mapping(uint256 => uint256) private _ownedTokensIndex;
// Array with all token ids, used for enumeration
uint256[] private _allTokens;
// Mapping from token id to position in the allTokens array
mapping(uint256 => uint256) private _allTokensIndex;
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
return _ownedTokens[owner][index];
}
/**
* @dev See {IERC721Enumerable-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _allTokens.length;
}
/**
* @dev See {IERC721Enumerable-tokenByIndex}.
*/
function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
return _allTokens[index];
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual override {
super._beforeTokenTransfer(from, to, tokenId);
if (from == address(0)) {
_addTokenToAllTokensEnumeration(tokenId);
} else if (from != to) {
_removeTokenFromOwnerEnumeration(from, tokenId);
}
if (to == address(0)) {
_removeTokenFromAllTokensEnumeration(tokenId);
} else if (to != from) {
_addTokenToOwnerEnumeration(to, tokenId);
}
}
/**
* @dev Private function to add a token to this extension's ownership-tracking data structures.
* @param to address representing the new owner of the given token ID
* @param tokenId uint256 ID of the token to be added to the tokens list of the given address
*/
function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
uint256 length = ERC721.balanceOf(to);
_ownedTokens[to][length] = tokenId;
_ownedTokensIndex[tokenId] = length;
}
/**
* @dev Private function to add a token to this extension's token tracking data structures.
* @param tokenId uint256 ID of the token to be added to the tokens list
*/
function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
_allTokensIndex[tokenId] = _allTokens.length;
_allTokens.push(tokenId);
}
/**
* @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
* while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
* gas optimizations e.g. when performing a transfer operation (avoiding double writes).
* This has O(1) time complexity, but alters the order of the _ownedTokens array.
* @param from address representing the previous owner of the given token ID
* @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
*/
function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
// To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
uint256 tokenIndex = _ownedTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary
if (tokenIndex != lastTokenIndex) {
uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];
_ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
}
// This also deletes the contents at the last position of the array
delete _ownedTokensIndex[tokenId];
delete _ownedTokens[from][lastTokenIndex];
}
/**
* @dev Private function to remove a token from this extension's token tracking data structures.
* This has O(1) time complexity, but alters the order of the _allTokens array.
* @param tokenId uint256 ID of the token to be removed from the tokens list
*/
function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
// To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
// then delete the last slot (swap and pop).
uint256 lastTokenIndex = _allTokens.length - 1;
uint256 tokenIndex = _allTokensIndex[tokenId];
// When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
// rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
// an 'if' statement (like in _removeTokenFromOwnerEnumeration)
uint256 lastTokenId = _allTokens[lastTokenIndex];
_allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
_allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
// This also deletes the contents at the last position of the array
delete _allTokensIndex[tokenId];
_allTokens.pop();
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
pragma solidity ^0.8.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_setOwner(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_setOwner(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
contract GrubzClub is ERC721("GrubzClub", "GRUBZ"), Ownable {
uint256 tokenCounter = 1;
uint256 public price = 25000000000000000;
uint256 public MAX_TOKENS = 10000; // maximum supply
string public baseURI = "https://grubzclub.point.link/prereveal/"; //METADATA
bool public mintstarted = false;
uint256 public maxMintAmount = 10;
string public baseExtension = ".json";
using Strings for uint256;
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual override(ERC721) {
super._beforeTokenTransfer(from, to, tokenId);
}
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721) returns (bool) {
return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
}
function _baseURI() internal view virtual override(ERC721) returns (string memory) {
return baseURI;
}
function setBaseURI(string memory baseURI_) external onlyOwner() {
baseURI = baseURI_;
}
function getUserBalance(address user) public view returns(uint256) {
return balanceOf(user);
}
function totalSupply() public view returns(uint256) {
return MAX_TOKENS;
}
function liveMintedSupply() public view returns(uint256) {
return tokenCounter - 1;
}
function mint(uint256 _mintAmount) public payable {
require(tokenCounter + _mintAmount <= MAX_TOKENS - 1, "ERC721: Max supply.");
require(_mintAmount > 0, "Mint amount can't be zero.");
if (_msgSender() != owner()) {
require(mintstarted, "ERC721: Mint not started.");
require(_mintAmount <= maxMintAmount, "Mint amount higher than limit.");
require(balanceOf(_msgSender()) + _mintAmount <= maxMintAmount , "Total holding is limited.");
require(msg.value >= price * _mintAmount, "Paid price under mint value.");
}
for (uint256 i = 1; i <= _mintAmount; i++) {
_safeMint(_msgSender(), tokenCounter);
tokenCounter = tokenCounter + 1;
}
}
function withdraw() onlyOwner external {
payable(owner()).transfer(address(this).balance);
}
function startMint(bool _state) public onlyOwner {
mintstarted = _state;
}
function setPrice(uint256 _price) public onlyOwner {
price = _price;
}
function maxMintAmountPublic(uint256 _maxmint) public onlyOwner {
maxMintAmount = _maxmint;
}
function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
baseExtension = _newBaseExtension;
}
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
string memory currentBaseURI = _baseURI();
return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) : "";
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"liveMintedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxmint","type":"uint256"}],"name":"maxMintAmountPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintstarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"startMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60016007556658d15e1762800060085561271060095560e06040526027608081815290620023b060a03980516200003f91600a9160209091019062000169565b50600b805460ff19169055600a600c5560408051808201909152600580825264173539b7b760d91b60209092019182526200007d91600d9162000169565b503480156200008b57600080fd5b50604080518082018252600981526823b93ab13d21b63ab160b91b60208083019182528351808501909452600584526423a92aa12d60d91b908401528151919291620000da9160009162000169565b508051620000f090600190602084019062000169565b5050506200010d620001076200011360201b60201c565b62000117565b6200024c565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805462000177906200020f565b90600052602060002090601f0160209004810192826200019b5760008555620001e6565b82601f10620001b657805160ff1916838001178555620001e6565b82800160010185558215620001e6579182015b82811115620001e6578251825591602001919060010190620001c9565b50620001f4929150620001f8565b5090565b5b80821115620001f45760008155600101620001f9565b6002810460018216806200022457607f821691505b602082108114156200024657634e487b7160e01b600052602260045260246000fd5b50919050565b612154806200025c6000396000f3fe6080604052600436106101e35760003560e01c80638da5cb5b11610102578063c668286211610095578063e225e88311610064578063e225e88314610516578063e985e9c514610536578063f2fde38b14610556578063f47c84c514610576576101e3565b8063c6682862146104ac578063c87b56dd146104c1578063d7ea6efa146104e1578063da3ef23f146104f6576101e3565b8063a0712d68116100d1578063a0712d6814610439578063a22cb4651461044c578063a3be4ff51461046c578063b88d4fde1461048c576101e3565b80638da5cb5b146103da57806391b7f5ed146103ef57806395d89b411461040f578063a035b1fe14610424576101e3565b806342842e0e1161017a5780636c0360eb116101495780636c0360eb1461037b57806370a0823114610390578063715018a6146103b05780638800cd21146103c5576101e3565b806342842e0e146102fb578063477348921461031b57806355f804b31461033b5780636352211e1461035b576101e3565b806318160ddd116101b657806318160ddd1461028f578063239c70ae146102b157806323b872dd146102c65780633ccfd60b146102e6576101e3565b806301ffc9a7146101e857806306fdde031461021e578063081812fc14610240578063095ea7b31461026d575b600080fd5b3480156101f457600080fd5b50610208610203366004611820565b61058b565b60405161021591906119f5565b60405180910390f35b34801561022a57600080fd5b506102336105b8565b6040516102159190611a00565b34801561024c57600080fd5b5061026061025b36600461189e565b61064a565b60405161021591906119a4565b34801561027957600080fd5b5061028d6102883660046117dd565b610696565b005b34801561029b57600080fd5b506102a461072e565b6040516102159190611fb9565b3480156102bd57600080fd5b506102a4610734565b3480156102d257600080fd5b5061028d6102e1366004611700565b61073a565b3480156102f257600080fd5b5061028d610772565b34801561030757600080fd5b5061028d610316366004611700565b6107f4565b34801561032757600080fd5b506102a46103363660046116b4565b61080f565b34801561034757600080fd5b5061028d610356366004611858565b61081a565b34801561036757600080fd5b5061026061037636600461189e565b610870565b34801561038757600080fd5b506102336108a5565b34801561039c57600080fd5b506102a46103ab3660046116b4565b610933565b3480156103bc57600080fd5b5061028d610977565b3480156103d157600080fd5b506102a46109c2565b3480156103e657600080fd5b506102606109d8565b3480156103fb57600080fd5b5061028d61040a36600461189e565b6109e7565b34801561041b57600080fd5b50610233610a2b565b34801561043057600080fd5b506102a4610a3a565b61028d61044736600461189e565b610a40565b34801561045857600080fd5b5061028d6104673660046117b4565b610baa565b34801561047857600080fd5b5061028d61048736600461189e565b610c78565b34801561049857600080fd5b5061028d6104a736600461173b565b610cbc565b3480156104b857600080fd5b50610233610cfb565b3480156104cd57600080fd5b506102336104dc36600461189e565b610d08565b3480156104ed57600080fd5b50610208610d8e565b34801561050257600080fd5b5061028d610511366004611858565b610d97565b34801561052257600080fd5b5061028d610531366004611806565b610de9565b34801561054257600080fd5b506102086105513660046116ce565b610e3b565b34801561056257600080fd5b5061028d6105713660046116b4565b610e69565b34801561058257600080fd5b506102a4610ed7565b60006001600160e01b0319821663780e9d6360e01b14806105b057506105b082610edd565b90505b919050565b6060600080546105c79061205c565b80601f01602080910402602001604051908101604052809291908181526020018280546105f39061205c565b80156106405780601f1061061557610100808354040283529160200191610640565b820191906000526020600020905b81548152906001019060200180831161062357829003601f168201915b5050505050905090565b600061065582610f1d565b61067a5760405162461bcd60e51b815260040161067190611d69565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006106a182610870565b9050806001600160a01b0316836001600160a01b031614156106d55760405162461bcd60e51b815260040161067190611f27565b806001600160a01b03166106e7610f3a565b6001600160a01b03161480610703575061070381610551610f3a565b61071f5760405162461bcd60e51b815260040161067190611bd6565b6107298383610f3e565b505050565b60095490565b600c5481565b61074b610745610f3a565b82610fac565b6107675760405162461bcd60e51b815260040161067190611f68565b610729838383611031565b61077a610f3a565b6001600160a01b031661078b6109d8565b6001600160a01b0316146107b15760405162461bcd60e51b815260040161067190611dec565b6107b96109d8565b6001600160a01b03166108fc479081150290604051600060405180830381858888f193505050501580156107f1573d6000803e3d6000fd5b50565b61072983838360405180602001604052806000815250610cbc565b60006105b082610933565b610822610f3a565b6001600160a01b03166108336109d8565b6001600160a01b0316146108595760405162461bcd60e51b815260040161067190611dec565b805161086c90600a90602084019061157e565b5050565b6000818152600260205260408120546001600160a01b0316806105b05760405162461bcd60e51b815260040161067190611cb4565b600a80546108b29061205c565b80601f01602080910402602001604051908101604052809291908181526020018280546108de9061205c565b801561092b5780601f106109005761010080835404028352916020019161092b565b820191906000526020600020905b81548152906001019060200180831161090e57829003601f168201915b505050505081565b60006001600160a01b03821661095b5760405162461bcd60e51b815260040161067190611c6a565b506001600160a01b031660009081526003602052604090205490565b61097f610f3a565b6001600160a01b03166109906109d8565b6001600160a01b0316146109b65760405162461bcd60e51b815260040161067190611dec565b6109c0600061115e565b565b600060016007546109d39190612019565b905090565b6006546001600160a01b031690565b6109ef610f3a565b6001600160a01b0316610a006109d8565b6001600160a01b031614610a265760405162461bcd60e51b815260040161067190611dec565b600855565b6060600180546105c79061205c565b60085481565b6001600954610a4f9190612019565b81600754610a5d9190611fce565b1115610a7b5760405162461bcd60e51b815260040161067190611ba9565b60008111610a9b5760405162461bcd60e51b815260040161067190611db5565b610aa36109d8565b6001600160a01b0316610ab4610f3a565b6001600160a01b031614610b6a57600b5460ff16610ae45760405162461bcd60e51b815260040161067190611d32565b600c54811115610b065760405162461bcd60e51b815260040161067190611eb9565b600c5481610b156103ab610f3a565b610b1f9190611fce565b1115610b3d5760405162461bcd60e51b815260040161067190611c33565b80600854610b4b9190611ffa565b341015610b6a5760405162461bcd60e51b815260040161067190611ef0565b60015b81811161086c57610b87610b7f610f3a565b6007546111b0565b600754610b95906001611fce565b60075580610ba281612097565b915050610b6d565b610bb2610f3a565b6001600160a01b0316826001600160a01b03161415610be35760405162461bcd60e51b815260040161067190611b26565b8060056000610bf0610f3a565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610c34610f3a565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610c6c91906119f5565b60405180910390a35050565b610c80610f3a565b6001600160a01b0316610c916109d8565b6001600160a01b031614610cb75760405162461bcd60e51b815260040161067190611dec565b600c55565b610ccd610cc7610f3a565b83610fac565b610ce95760405162461bcd60e51b815260040161067190611f68565b610cf5848484846111ca565b50505050565b600d80546108b29061205c565b6060610d1382610f1d565b610d2f5760405162461bcd60e51b815260040161067190611e6a565b6000610d396111fd565b90506000815111610d595760405180602001604052806000815250610d87565b80610d638461120c565b600d604051602001610d77939291906118e2565b6040516020818303038152906040525b9392505050565b600b5460ff1681565b610d9f610f3a565b6001600160a01b0316610db06109d8565b6001600160a01b031614610dd65760405162461bcd60e51b815260040161067190611dec565b805161086c90600d90602084019061157e565b610df1610f3a565b6001600160a01b0316610e026109d8565b6001600160a01b031614610e285760405162461bcd60e51b815260040161067190611dec565b600b805460ff1916911515919091179055565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610e71610f3a565b6001600160a01b0316610e826109d8565b6001600160a01b031614610ea85760405162461bcd60e51b815260040161067190611dec565b6001600160a01b038116610ece5760405162461bcd60e51b815260040161067190611a65565b6107f18161115e565b60095481565b60006001600160e01b031982166380ac58cd60e01b1480610f0e57506001600160e01b03198216635b5e139f60e01b145b806105b057506105b082611327565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610f7382610870565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610fb782610f1d565b610fd35760405162461bcd60e51b815260040161067190611b5d565b6000610fde83610870565b9050806001600160a01b0316846001600160a01b031614806110195750836001600160a01b031661100e8461064a565b6001600160a01b0316145b8061102957506110298185610e3b565b949350505050565b826001600160a01b031661104482610870565b6001600160a01b03161461106a5760405162461bcd60e51b815260040161067190611e21565b6001600160a01b0382166110905760405162461bcd60e51b815260040161067190611ae2565b61109b838383611340565b6110a6600082610f3e565b6001600160a01b03831660009081526003602052604081208054600192906110cf908490612019565b90915550506001600160a01b03821660009081526003602052604081208054600192906110fd908490611fce565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61086c82826040518060200160405280600081525061134b565b6111d5848484611031565b6111e18484848461137e565b610cf55760405162461bcd60e51b815260040161067190611a13565b6060600a80546105c79061205c565b60608161123157506040805180820190915260018152600360fc1b60208201526105b3565b8160005b811561125b578061124581612097565b91506112549050600a83611fe6565b9150611235565b60008167ffffffffffffffff81111561128457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156112ae576020820181803683370190505b5090505b8415611029576112c3600183612019565b91506112d0600a866120b2565b6112db906030611fce565b60f81b8183815181106112fe57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611320600a86611fe6565b94506112b2565b6001600160e01b031981166301ffc9a760e01b14919050565b610729838383610729565b6113558383611499565b611362600084848461137e565b6107295760405162461bcd60e51b815260040161067190611a13565b6000611392846001600160a01b0316611578565b1561148e57836001600160a01b031663150b7a026113ae610f3a565b8786866040518563ffffffff1660e01b81526004016113d094939291906119b8565b602060405180830381600087803b1580156113ea57600080fd5b505af192505050801561141a575060408051601f3d908101601f191682019092526114179181019061183c565b60015b611474573d808015611448576040519150601f19603f3d011682016040523d82523d6000602084013e61144d565b606091505b50805161146c5760405162461bcd60e51b815260040161067190611a13565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611029565b506001949350505050565b6001600160a01b0382166114bf5760405162461bcd60e51b815260040161067190611cfd565b6114c881610f1d565b156114e55760405162461bcd60e51b815260040161067190611aab565b6114f160008383611340565b6001600160a01b038216600090815260036020526040812080546001929061151a908490611fce565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b82805461158a9061205c565b90600052602060002090601f0160209004810192826115ac57600085556115f2565b82601f106115c557805160ff19168380011785556115f2565b828001600101855582156115f2579182015b828111156115f25782518255916020019190600101906115d7565b506115fe929150611602565b5090565b5b808211156115fe5760008155600101611603565b600067ffffffffffffffff80841115611632576116326120f2565b604051601f8501601f19908116603f0116810190828211818310171561165a5761165a6120f2565b8160405280935085815286868601111561167357600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146105b357600080fd5b803580151581146105b357600080fd5b6000602082840312156116c5578081fd5b610d878261168d565b600080604083850312156116e0578081fd5b6116e98361168d565b91506116f76020840161168d565b90509250929050565b600080600060608486031215611714578081fd5b61171d8461168d565b925061172b6020850161168d565b9150604084013590509250925092565b60008060008060808587031215611750578081fd5b6117598561168d565b93506117676020860161168d565b925060408501359150606085013567ffffffffffffffff811115611789578182fd5b8501601f81018713611799578182fd5b6117a887823560208401611617565b91505092959194509250565b600080604083850312156117c6578182fd5b6117cf8361168d565b91506116f7602084016116a4565b600080604083850312156117ef578182fd5b6117f88361168d565b946020939093013593505050565b600060208284031215611817578081fd5b610d87826116a4565b600060208284031215611831578081fd5b8135610d8781612108565b60006020828403121561184d578081fd5b8151610d8781612108565b600060208284031215611869578081fd5b813567ffffffffffffffff81111561187f578182fd5b8201601f8101841361188f578182fd5b61102984823560208401611617565b6000602082840312156118af578081fd5b5035919050565b600081518084526118ce816020860160208601612030565b601f01601f19169290920160200192915050565b6000845160206118f58285838a01612030565b8551918401916119088184848a01612030565b855492019183906002810460018083168061192457607f831692505b85831081141561194257634e487b7160e01b88526022600452602488fd5b808015611956576001811461196757611993565b60ff19851688528388019550611993565b6119708b611fc2565b895b8581101561198b5781548a820152908401908801611972565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906119eb908301846118b6565b9695505050505050565b901515815260200190565b600060208252610d8760208301846118b6565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526013908201527222a9219b99189d1026b0bc1039bab838363c9760691b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b60208082526019908201527f546f74616c20686f6c64696e67206973206c696d697465642e00000000000000604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526019908201527f4552433732313a204d696e74206e6f7420737461727465642e00000000000000604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252601a908201527f4d696e7420616d6f756e742063616e2774206265207a65726f2e000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b6020808252601e908201527f4d696e7420616d6f756e7420686967686572207468616e206c696d69742e0000604082015260600190565b6020808252601c908201527f5061696420707269636520756e646572206d696e742076616c75652e00000000604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b90815260200190565b60009081526020902090565b60008219821115611fe157611fe16120c6565b500190565b600082611ff557611ff56120dc565b500490565b6000816000190483118215151615612014576120146120c6565b500290565b60008282101561202b5761202b6120c6565b500390565b60005b8381101561204b578181015183820152602001612033565b83811115610cf55750506000910152565b60028104600182168061207057607f821691505b6020821081141561209157634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156120ab576120ab6120c6565b5060010190565b6000826120c1576120c16120dc565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146107f157600080fdfea2646970667358221220e72997bb0b1c3c84b47de9863f4b9a256d5873890a435e581b67b261af119aeb64736f6c6343000801003368747470733a2f2f677275627a636c75622e706f696e742e6c696e6b2f70726572657665616c2f
Deployed Bytecode
0x6080604052600436106101e35760003560e01c80638da5cb5b11610102578063c668286211610095578063e225e88311610064578063e225e88314610516578063e985e9c514610536578063f2fde38b14610556578063f47c84c514610576576101e3565b8063c6682862146104ac578063c87b56dd146104c1578063d7ea6efa146104e1578063da3ef23f146104f6576101e3565b8063a0712d68116100d1578063a0712d6814610439578063a22cb4651461044c578063a3be4ff51461046c578063b88d4fde1461048c576101e3565b80638da5cb5b146103da57806391b7f5ed146103ef57806395d89b411461040f578063a035b1fe14610424576101e3565b806342842e0e1161017a5780636c0360eb116101495780636c0360eb1461037b57806370a0823114610390578063715018a6146103b05780638800cd21146103c5576101e3565b806342842e0e146102fb578063477348921461031b57806355f804b31461033b5780636352211e1461035b576101e3565b806318160ddd116101b657806318160ddd1461028f578063239c70ae146102b157806323b872dd146102c65780633ccfd60b146102e6576101e3565b806301ffc9a7146101e857806306fdde031461021e578063081812fc14610240578063095ea7b31461026d575b600080fd5b3480156101f457600080fd5b50610208610203366004611820565b61058b565b60405161021591906119f5565b60405180910390f35b34801561022a57600080fd5b506102336105b8565b6040516102159190611a00565b34801561024c57600080fd5b5061026061025b36600461189e565b61064a565b60405161021591906119a4565b34801561027957600080fd5b5061028d6102883660046117dd565b610696565b005b34801561029b57600080fd5b506102a461072e565b6040516102159190611fb9565b3480156102bd57600080fd5b506102a4610734565b3480156102d257600080fd5b5061028d6102e1366004611700565b61073a565b3480156102f257600080fd5b5061028d610772565b34801561030757600080fd5b5061028d610316366004611700565b6107f4565b34801561032757600080fd5b506102a46103363660046116b4565b61080f565b34801561034757600080fd5b5061028d610356366004611858565b61081a565b34801561036757600080fd5b5061026061037636600461189e565b610870565b34801561038757600080fd5b506102336108a5565b34801561039c57600080fd5b506102a46103ab3660046116b4565b610933565b3480156103bc57600080fd5b5061028d610977565b3480156103d157600080fd5b506102a46109c2565b3480156103e657600080fd5b506102606109d8565b3480156103fb57600080fd5b5061028d61040a36600461189e565b6109e7565b34801561041b57600080fd5b50610233610a2b565b34801561043057600080fd5b506102a4610a3a565b61028d61044736600461189e565b610a40565b34801561045857600080fd5b5061028d6104673660046117b4565b610baa565b34801561047857600080fd5b5061028d61048736600461189e565b610c78565b34801561049857600080fd5b5061028d6104a736600461173b565b610cbc565b3480156104b857600080fd5b50610233610cfb565b3480156104cd57600080fd5b506102336104dc36600461189e565b610d08565b3480156104ed57600080fd5b50610208610d8e565b34801561050257600080fd5b5061028d610511366004611858565b610d97565b34801561052257600080fd5b5061028d610531366004611806565b610de9565b34801561054257600080fd5b506102086105513660046116ce565b610e3b565b34801561056257600080fd5b5061028d6105713660046116b4565b610e69565b34801561058257600080fd5b506102a4610ed7565b60006001600160e01b0319821663780e9d6360e01b14806105b057506105b082610edd565b90505b919050565b6060600080546105c79061205c565b80601f01602080910402602001604051908101604052809291908181526020018280546105f39061205c565b80156106405780601f1061061557610100808354040283529160200191610640565b820191906000526020600020905b81548152906001019060200180831161062357829003601f168201915b5050505050905090565b600061065582610f1d565b61067a5760405162461bcd60e51b815260040161067190611d69565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006106a182610870565b9050806001600160a01b0316836001600160a01b031614156106d55760405162461bcd60e51b815260040161067190611f27565b806001600160a01b03166106e7610f3a565b6001600160a01b03161480610703575061070381610551610f3a565b61071f5760405162461bcd60e51b815260040161067190611bd6565b6107298383610f3e565b505050565b60095490565b600c5481565b61074b610745610f3a565b82610fac565b6107675760405162461bcd60e51b815260040161067190611f68565b610729838383611031565b61077a610f3a565b6001600160a01b031661078b6109d8565b6001600160a01b0316146107b15760405162461bcd60e51b815260040161067190611dec565b6107b96109d8565b6001600160a01b03166108fc479081150290604051600060405180830381858888f193505050501580156107f1573d6000803e3d6000fd5b50565b61072983838360405180602001604052806000815250610cbc565b60006105b082610933565b610822610f3a565b6001600160a01b03166108336109d8565b6001600160a01b0316146108595760405162461bcd60e51b815260040161067190611dec565b805161086c90600a90602084019061157e565b5050565b6000818152600260205260408120546001600160a01b0316806105b05760405162461bcd60e51b815260040161067190611cb4565b600a80546108b29061205c565b80601f01602080910402602001604051908101604052809291908181526020018280546108de9061205c565b801561092b5780601f106109005761010080835404028352916020019161092b565b820191906000526020600020905b81548152906001019060200180831161090e57829003601f168201915b505050505081565b60006001600160a01b03821661095b5760405162461bcd60e51b815260040161067190611c6a565b506001600160a01b031660009081526003602052604090205490565b61097f610f3a565b6001600160a01b03166109906109d8565b6001600160a01b0316146109b65760405162461bcd60e51b815260040161067190611dec565b6109c0600061115e565b565b600060016007546109d39190612019565b905090565b6006546001600160a01b031690565b6109ef610f3a565b6001600160a01b0316610a006109d8565b6001600160a01b031614610a265760405162461bcd60e51b815260040161067190611dec565b600855565b6060600180546105c79061205c565b60085481565b6001600954610a4f9190612019565b81600754610a5d9190611fce565b1115610a7b5760405162461bcd60e51b815260040161067190611ba9565b60008111610a9b5760405162461bcd60e51b815260040161067190611db5565b610aa36109d8565b6001600160a01b0316610ab4610f3a565b6001600160a01b031614610b6a57600b5460ff16610ae45760405162461bcd60e51b815260040161067190611d32565b600c54811115610b065760405162461bcd60e51b815260040161067190611eb9565b600c5481610b156103ab610f3a565b610b1f9190611fce565b1115610b3d5760405162461bcd60e51b815260040161067190611c33565b80600854610b4b9190611ffa565b341015610b6a5760405162461bcd60e51b815260040161067190611ef0565b60015b81811161086c57610b87610b7f610f3a565b6007546111b0565b600754610b95906001611fce565b60075580610ba281612097565b915050610b6d565b610bb2610f3a565b6001600160a01b0316826001600160a01b03161415610be35760405162461bcd60e51b815260040161067190611b26565b8060056000610bf0610f3a565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610c34610f3a565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610c6c91906119f5565b60405180910390a35050565b610c80610f3a565b6001600160a01b0316610c916109d8565b6001600160a01b031614610cb75760405162461bcd60e51b815260040161067190611dec565b600c55565b610ccd610cc7610f3a565b83610fac565b610ce95760405162461bcd60e51b815260040161067190611f68565b610cf5848484846111ca565b50505050565b600d80546108b29061205c565b6060610d1382610f1d565b610d2f5760405162461bcd60e51b815260040161067190611e6a565b6000610d396111fd565b90506000815111610d595760405180602001604052806000815250610d87565b80610d638461120c565b600d604051602001610d77939291906118e2565b6040516020818303038152906040525b9392505050565b600b5460ff1681565b610d9f610f3a565b6001600160a01b0316610db06109d8565b6001600160a01b031614610dd65760405162461bcd60e51b815260040161067190611dec565b805161086c90600d90602084019061157e565b610df1610f3a565b6001600160a01b0316610e026109d8565b6001600160a01b031614610e285760405162461bcd60e51b815260040161067190611dec565b600b805460ff1916911515919091179055565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b610e71610f3a565b6001600160a01b0316610e826109d8565b6001600160a01b031614610ea85760405162461bcd60e51b815260040161067190611dec565b6001600160a01b038116610ece5760405162461bcd60e51b815260040161067190611a65565b6107f18161115e565b60095481565b60006001600160e01b031982166380ac58cd60e01b1480610f0e57506001600160e01b03198216635b5e139f60e01b145b806105b057506105b082611327565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610f7382610870565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610fb782610f1d565b610fd35760405162461bcd60e51b815260040161067190611b5d565b6000610fde83610870565b9050806001600160a01b0316846001600160a01b031614806110195750836001600160a01b031661100e8461064a565b6001600160a01b0316145b8061102957506110298185610e3b565b949350505050565b826001600160a01b031661104482610870565b6001600160a01b03161461106a5760405162461bcd60e51b815260040161067190611e21565b6001600160a01b0382166110905760405162461bcd60e51b815260040161067190611ae2565b61109b838383611340565b6110a6600082610f3e565b6001600160a01b03831660009081526003602052604081208054600192906110cf908490612019565b90915550506001600160a01b03821660009081526003602052604081208054600192906110fd908490611fce565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61086c82826040518060200160405280600081525061134b565b6111d5848484611031565b6111e18484848461137e565b610cf55760405162461bcd60e51b815260040161067190611a13565b6060600a80546105c79061205c565b60608161123157506040805180820190915260018152600360fc1b60208201526105b3565b8160005b811561125b578061124581612097565b91506112549050600a83611fe6565b9150611235565b60008167ffffffffffffffff81111561128457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156112ae576020820181803683370190505b5090505b8415611029576112c3600183612019565b91506112d0600a866120b2565b6112db906030611fce565b60f81b8183815181106112fe57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611320600a86611fe6565b94506112b2565b6001600160e01b031981166301ffc9a760e01b14919050565b610729838383610729565b6113558383611499565b611362600084848461137e565b6107295760405162461bcd60e51b815260040161067190611a13565b6000611392846001600160a01b0316611578565b1561148e57836001600160a01b031663150b7a026113ae610f3a565b8786866040518563ffffffff1660e01b81526004016113d094939291906119b8565b602060405180830381600087803b1580156113ea57600080fd5b505af192505050801561141a575060408051601f3d908101601f191682019092526114179181019061183c565b60015b611474573d808015611448576040519150601f19603f3d011682016040523d82523d6000602084013e61144d565b606091505b50805161146c5760405162461bcd60e51b815260040161067190611a13565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611029565b506001949350505050565b6001600160a01b0382166114bf5760405162461bcd60e51b815260040161067190611cfd565b6114c881610f1d565b156114e55760405162461bcd60e51b815260040161067190611aab565b6114f160008383611340565b6001600160a01b038216600090815260036020526040812080546001929061151a908490611fce565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b82805461158a9061205c565b90600052602060002090601f0160209004810192826115ac57600085556115f2565b82601f106115c557805160ff19168380011785556115f2565b828001600101855582156115f2579182015b828111156115f25782518255916020019190600101906115d7565b506115fe929150611602565b5090565b5b808211156115fe5760008155600101611603565b600067ffffffffffffffff80841115611632576116326120f2565b604051601f8501601f19908116603f0116810190828211818310171561165a5761165a6120f2565b8160405280935085815286868601111561167357600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b03811681146105b357600080fd5b803580151581146105b357600080fd5b6000602082840312156116c5578081fd5b610d878261168d565b600080604083850312156116e0578081fd5b6116e98361168d565b91506116f76020840161168d565b90509250929050565b600080600060608486031215611714578081fd5b61171d8461168d565b925061172b6020850161168d565b9150604084013590509250925092565b60008060008060808587031215611750578081fd5b6117598561168d565b93506117676020860161168d565b925060408501359150606085013567ffffffffffffffff811115611789578182fd5b8501601f81018713611799578182fd5b6117a887823560208401611617565b91505092959194509250565b600080604083850312156117c6578182fd5b6117cf8361168d565b91506116f7602084016116a4565b600080604083850312156117ef578182fd5b6117f88361168d565b946020939093013593505050565b600060208284031215611817578081fd5b610d87826116a4565b600060208284031215611831578081fd5b8135610d8781612108565b60006020828403121561184d578081fd5b8151610d8781612108565b600060208284031215611869578081fd5b813567ffffffffffffffff81111561187f578182fd5b8201601f8101841361188f578182fd5b61102984823560208401611617565b6000602082840312156118af578081fd5b5035919050565b600081518084526118ce816020860160208601612030565b601f01601f19169290920160200192915050565b6000845160206118f58285838a01612030565b8551918401916119088184848a01612030565b855492019183906002810460018083168061192457607f831692505b85831081141561194257634e487b7160e01b88526022600452602488fd5b808015611956576001811461196757611993565b60ff19851688528388019550611993565b6119708b611fc2565b895b8581101561198b5781548a820152908401908801611972565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906119eb908301846118b6565b9695505050505050565b901515815260200190565b600060208252610d8760208301846118b6565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526013908201527222a9219b99189d1026b0bc1039bab838363c9760691b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b60208082526019908201527f546f74616c20686f6c64696e67206973206c696d697465642e00000000000000604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526019908201527f4552433732313a204d696e74206e6f7420737461727465642e00000000000000604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252601a908201527f4d696e7420616d6f756e742063616e2774206265207a65726f2e000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b6020808252601e908201527f4d696e7420616d6f756e7420686967686572207468616e206c696d69742e0000604082015260600190565b6020808252601c908201527f5061696420707269636520756e646572206d696e742076616c75652e00000000604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b90815260200190565b60009081526020902090565b60008219821115611fe157611fe16120c6565b500190565b600082611ff557611ff56120dc565b500490565b6000816000190483118215151615612014576120146120c6565b500290565b60008282101561202b5761202b6120c6565b500390565b60005b8381101561204b578181015183820152602001612033565b83811115610cf55750506000910152565b60028104600182168061207057607f821691505b6020821081141561209157634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156120ab576120ab6120c6565b5060010190565b6000826120c1576120c16120dc565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146107f157600080fdfea2646970667358221220e72997bb0b1c3c84b47de9863f4b9a256d5873890a435e581b67b261af119aeb64736f6c63430008010033
Deployed Bytecode Sourcemap
43237:3215:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43912:215;;;;;;;;;;-1:-1:-1;43912:215:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22711:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24270:221::-;;;;;;;;;;-1:-1:-1;24270:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23793:411::-;;;;;;;;;;-1:-1:-1;23793:411:0;;;;;:::i;:::-;;:::i;:::-;;44489:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43567:33::-;;;;;;;;;;;;;:::i;25160:339::-;;;;;;;;;;-1:-1:-1;25160:339:0;;;;;:::i;:::-;;:::i;45516:106::-;;;;;;;;;;;;;:::i;25570:185::-;;;;;;;;;;-1:-1:-1;25570:185:0;;;;;:::i;:::-;;:::i;44373:108::-;;;;;;;;;;-1:-1:-1;44373:108:0;;;;;:::i;:::-;;:::i;44263:102::-;;;;;;;;;;-1:-1:-1;44263:102:0;;;;;:::i;:::-;;:::i;22405:239::-;;;;;;;;;;-1:-1:-1;22405:239:0;;;;;:::i;:::-;;:::i;43446:65::-;;;;;;;;;;;;;:::i;22135:208::-;;;;;;;;;;-1:-1:-1;22135:208:0;;;;;:::i;:::-;;:::i;42608:94::-;;;;;;;;;;;;;:::i;44586:99::-;;;;;;;;;;;;;:::i;41957:87::-;;;;;;;;;;;;;:::i;45728:84::-;;;;;;;;;;-1:-1:-1;45728:84:0;;;;;:::i;:::-;;:::i;22880:104::-;;;;;;;;;;;;;:::i;43341:40::-;;;;;;;;;;;;;:::i;44700:804::-;;;;;;:::i;:::-;;:::i;24563:295::-;;;;;;;;;;-1:-1:-1;24563:295:0;;;;;:::i;:::-;;:::i;45820:107::-;;;;;;;;;;-1:-1:-1;45820:107:0;;;;;:::i;:::-;;:::i;25826:328::-;;;;;;;;;;-1:-1:-1;25826:328:0;;;;;:::i;:::-;;:::i;43607:37::-;;;;;;;;;;;;;:::i;46075:368::-;;;;;;;;;;-1:-1:-1;46075:368:0;;;;;:::i;:::-;;:::i;43529:31::-;;;;;;;;;;;;;:::i;45939:128::-;;;;;;;;;;-1:-1:-1;45939:128:0;;;;;:::i;:::-;;:::i;45632:88::-;;;;;;;;;;-1:-1:-1;45632:88:0;;;;;:::i;:::-;;:::i;24929:164::-;;;;;;;;;;-1:-1:-1;24929:164:0;;;;;:::i;:::-;;:::i;42857:192::-;;;;;;;;;;-1:-1:-1;42857:192:0;;;;;:::i;:::-;;:::i;43388:33::-;;;;;;;;;;;;;:::i;43912:215::-;44005:4;-1:-1:-1;;;;;;44029:50:0;;-1:-1:-1;;;44029:50:0;;:90;;;44083:36;44107:11;44083:23;:36::i;:::-;44022:97;;43912:215;;;;:::o;22711:100::-;22765:13;22798:5;22791:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22711:100;:::o;24270:221::-;24346:7;24374:16;24382:7;24374;:16::i;:::-;24366:73;;;;-1:-1:-1;;;24366:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;24459:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;24459:24:0;;24270:221::o;23793:411::-;23874:13;23890:23;23905:7;23890:14;:23::i;:::-;23874:39;;23938:5;-1:-1:-1;;;;;23932:11:0;:2;-1:-1:-1;;;;;23932:11:0;;;23924:57;;;;-1:-1:-1;;;23924:57:0;;;;;;;:::i;:::-;24032:5;-1:-1:-1;;;;;24016:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;24016:21:0;;:62;;;;24041:37;24058:5;24065:12;:10;:12::i;24041:37::-;23994:168;;;;-1:-1:-1;;;23994:168:0;;;;;;;:::i;:::-;24175:21;24184:2;24188:7;24175:8;:21::i;:::-;23793:411;;;:::o;44489:88::-;44559:10;;44489:88;:::o;43567:33::-;;;;:::o;25160:339::-;25355:41;25374:12;:10;:12::i;:::-;25388:7;25355:18;:41::i;:::-;25347:103;;;;-1:-1:-1;;;25347:103:0;;;;;;;:::i;:::-;25463:28;25473:4;25479:2;25483:7;25463:9;:28::i;45516:106::-;42188:12;:10;:12::i;:::-;-1:-1:-1;;;;;42177:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42177:23:0;;42169:68;;;;-1:-1:-1;;;42169:68:0;;;;;;;:::i;:::-;45574:7:::1;:5;:7::i;:::-;-1:-1:-1::0;;;;;45566:25:0::1;:48;45592:21;45566:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;45516:106::o:0;25570:185::-;25708:39;25725:4;25731:2;25735:7;25708:39;;;;;;;;;;;;:16;:39::i;44373:108::-;44431:7;44458:15;44468:4;44458:9;:15::i;44263:102::-;42188:12;:10;:12::i;:::-;-1:-1:-1;;;;;42177:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42177:23:0;;42169:68;;;;-1:-1:-1;;;42169:68:0;;;;;;;:::i;:::-;44339:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;44263:102:::0;:::o;22405:239::-;22477:7;22513:16;;;:7;:16;;;;;;-1:-1:-1;;;;;22513:16:0;22548:19;22540:73;;;;-1:-1:-1;;;22540:73:0;;;;;;;:::i;43446:65::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22135:208::-;22207:7;-1:-1:-1;;;;;22235:19:0;;22227:74;;;;-1:-1:-1;;;22227:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;22319:16:0;;;;;:9;:16;;;;;;;22135:208::o;42608:94::-;42188:12;:10;:12::i;:::-;-1:-1:-1;;;;;42177:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42177:23:0;;42169:68;;;;-1:-1:-1;;;42169:68:0;;;;;;;:::i;:::-;42673:21:::1;42691:1;42673:9;:21::i;:::-;42608:94::o:0;44586:99::-;44634:7;44676:1;44661:12;;:16;;;;:::i;:::-;44654:23;;44586:99;:::o;41957:87::-;42030:6;;-1:-1:-1;;;;;42030:6:0;41957:87;:::o;45728:84::-;42188:12;:10;:12::i;:::-;-1:-1:-1;;;;;42177:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42177:23:0;;42169:68;;;;-1:-1:-1;;;42169:68:0;;;;;;;:::i;:::-;45790:5:::1;:14:::0;45728:84::o;22880:104::-;22936:13;22969:7;22962:14;;;;;:::i;43341:40::-;;;;:::o;44700:804::-;44812:1;44799:10;;:14;;;;:::i;:::-;44784:11;44769:12;;:26;;;;:::i;:::-;:44;;44761:76;;;;-1:-1:-1;;;44761:76:0;;;;;;;:::i;:::-;44870:1;44856:11;:15;44848:54;;;;-1:-1:-1;;;44848:54:0;;;;;;;:::i;:::-;44935:7;:5;:7::i;:::-;-1:-1:-1;;;;;44919:23:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;44919:23:0;;44915:407;;44972:11;;;;44964:49;;;;-1:-1:-1;;;44964:49:0;;;;;;;:::i;:::-;45055:13;;45040:11;:28;;45032:71;;;;-1:-1:-1;;;45032:71:0;;;;;;;:::i;:::-;45171:13;;45156:11;45130:23;45140:12;:10;:12::i;45130:23::-;:37;;;;:::i;:::-;:54;;45122:93;;;;-1:-1:-1;;;45122:93:0;;;;;;;:::i;:::-;45263:11;45255:5;;:19;;;;:::i;:::-;45242:9;:32;;45234:73;;;;-1:-1:-1;;;45234:73:0;;;;;;;:::i;:::-;45351:1;45334:153;45359:11;45354:1;:16;45334:153;;45392:37;45402:12;:10;:12::i;:::-;45416;;45392:9;:37::i;:::-;45459:12;;:16;;45474:1;45459:16;:::i;:::-;45444:12;:31;45372:3;;;;:::i;:::-;;;;45334:153;;24563:295;24678:12;:10;:12::i;:::-;-1:-1:-1;;;;;24666:24:0;:8;-1:-1:-1;;;;;24666:24:0;;;24658:62;;;;-1:-1:-1;;;24658:62:0;;;;;;;:::i;:::-;24778:8;24733:18;:32;24752:12;:10;:12::i;:::-;-1:-1:-1;;;;;24733:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;24733:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;24733:53:0;;;;;;;;;;;24817:12;:10;:12::i;:::-;-1:-1:-1;;;;;24802:48:0;;24841:8;24802:48;;;;;;:::i;:::-;;;;;;;;24563:295;;:::o;45820:107::-;42188:12;:10;:12::i;:::-;-1:-1:-1;;;;;42177:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42177:23:0;;42169:68;;;;-1:-1:-1;;;42169:68:0;;;;;;;:::i;:::-;45895:13:::1;:24:::0;45820:107::o;25826:328::-;26001:41;26020:12;:10;:12::i;:::-;26034:7;26001:18;:41::i;:::-;25993:103;;;;-1:-1:-1;;;25993:103:0;;;;;;;:::i;:::-;26107:39;26121:4;26127:2;26131:7;26140:5;26107:13;:39::i;:::-;25826:328;;;;:::o;43607:37::-;;;;;;;:::i;46075:368::-;46148:13;46182:16;46190:7;46182;:16::i;:::-;46174:76;;;;-1:-1:-1;;;46174:76:0;;;;;;;:::i;:::-;46261:28;46292:10;:8;:10::i;:::-;46261:41;;46351:1;46326:14;46320:28;:32;:115;;;;;;;;;;;;;;;;;46379:14;46395:18;:7;:16;:18::i;:::-;46415:13;46362:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46320:115;46313:122;46075:368;-1:-1:-1;;;46075:368:0:o;43529:31::-;;;;;;:::o;45939:128::-;42188:12;:10;:12::i;:::-;-1:-1:-1;;;;;42177:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42177:23:0;;42169:68;;;;-1:-1:-1;;;42169:68:0;;;;;;;:::i;:::-;46026:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;45632:88::-:0;42188:12;:10;:12::i;:::-;-1:-1:-1;;;;;42177:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42177:23:0;;42169:68;;;;-1:-1:-1;;;42169:68:0;;;;;;;:::i;:::-;45692:11:::1;:20:::0;;-1:-1:-1;;45692:20:0::1;::::0;::::1;;::::0;;;::::1;::::0;;45632:88::o;24929:164::-;-1:-1:-1;;;;;25050:25:0;;;25026:4;25050:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24929:164::o;42857:192::-;42188:12;:10;:12::i;:::-;-1:-1:-1;;;;;42177:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;42177:23:0;;42169:68;;;;-1:-1:-1;;;42169:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42946:22:0;::::1;42938:73;;;;-1:-1:-1::0;;;42938:73:0::1;;;;;;;:::i;:::-;43022:19;43032:8;43022:9;:19::i;43388:33::-:0;;;;:::o;21766:305::-;21868:4;-1:-1:-1;;;;;;21905:40:0;;-1:-1:-1;;;21905:40:0;;:105;;-1:-1:-1;;;;;;;21962:48:0;;-1:-1:-1;;;21962:48:0;21905:105;:158;;;;22027:36;22051:11;22027:23;:36::i;27664:127::-;27729:4;27753:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27753:16:0;:30;;;27664:127::o;20240:98::-;20320:10;20240:98;:::o;31646:174::-;31721:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;31721:29:0;-1:-1:-1;;;;;31721:29:0;;;;;;;;:24;;31775:23;31721:24;31775:14;:23::i;:::-;-1:-1:-1;;;;;31766:46:0;;;;;;;;;;;31646:174;;:::o;27958:348::-;28051:4;28076:16;28084:7;28076;:16::i;:::-;28068:73;;;;-1:-1:-1;;;28068:73:0;;;;;;;:::i;:::-;28152:13;28168:23;28183:7;28168:14;:23::i;:::-;28152:39;;28221:5;-1:-1:-1;;;;;28210:16:0;:7;-1:-1:-1;;;;;28210:16:0;;:51;;;;28254:7;-1:-1:-1;;;;;28230:31:0;:20;28242:7;28230:11;:20::i;:::-;-1:-1:-1;;;;;28230:31:0;;28210:51;:87;;;;28265:32;28282:5;28289:7;28265:16;:32::i;:::-;28202:96;27958:348;-1:-1:-1;;;;27958:348:0:o;30950:578::-;31109:4;-1:-1:-1;;;;;31082:31:0;:23;31097:7;31082:14;:23::i;:::-;-1:-1:-1;;;;;31082:31:0;;31074:85;;;;-1:-1:-1;;;31074:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31178:16:0;;31170:65;;;;-1:-1:-1;;;31170:65:0;;;;;;;:::i;:::-;31248:39;31269:4;31275:2;31279:7;31248:20;:39::i;:::-;31352:29;31369:1;31373:7;31352:8;:29::i;:::-;-1:-1:-1;;;;;31394:15:0;;;;;;:9;:15;;;;;:20;;31413:1;;31394:15;:20;;31413:1;;31394:20;:::i;:::-;;;;-1:-1:-1;;;;;;;31425:13:0;;;;;;:9;:13;;;;;:18;;31442:1;;31425:13;:18;;31442:1;;31425:18;:::i;:::-;;;;-1:-1:-1;;31454:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;31454:21:0;-1:-1:-1;;;;;31454:21:0;;;;;;;;;31493:27;;31454:16;;31493:27;;;;;;;30950:578;;;:::o;43057:173::-;43132:6;;;-1:-1:-1;;;;;43149:17:0;;;-1:-1:-1;;;;;;43149:17:0;;;;;;;43182:40;;43132:6;;;43149:17;43132:6;;43182:40;;43113:16;;43182:40;43057:173;;:::o;28648:110::-;28724:26;28734:2;28738:7;28724:26;;;;;;;;;;;;:9;:26::i;27036:315::-;27193:28;27203:4;27209:2;27213:7;27193:9;:28::i;:::-;27240:48;27263:4;27269:2;27273:7;27282:5;27240:22;:48::i;:::-;27232:111;;;;-1:-1:-1;;;27232:111:0;;;;;;;:::i;44139:116::-;44207:13;44240:7;44233:14;;;;;:::i;8072:723::-;8128:13;8349:10;8345:53;;-1:-1:-1;8376:10:0;;;;;;;;;;;;-1:-1:-1;;;8376:10:0;;;;;;8345:53;8423:5;8408:12;8464:78;8471:9;;8464:78;;8497:8;;;;:::i;:::-;;-1:-1:-1;8520:10:0;;-1:-1:-1;8528:2:0;8520:10;;:::i;:::-;;;8464:78;;;8552:19;8584:6;8574:17;;;;;;-1:-1:-1;;;8574:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8574:17:0;;8552:39;;8602:154;8609:10;;8602:154;;8636:11;8646:1;8636:11;;:::i;:::-;;-1:-1:-1;8705:10:0;8713:2;8705:5;:10;:::i;:::-;8692:24;;:2;:24;:::i;:::-;8679:39;;8662:6;8669;8662:14;;;;;;-1:-1:-1;;;8662:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;8662:56:0;;;;;;;;-1:-1:-1;8733:11:0;8742:2;8733:11;;:::i;:::-;;;8602:154;;7597:157;-1:-1:-1;;;;;;7706:40:0;;-1:-1:-1;;;7706:40:0;7597:157;;;:::o;43695:205::-;43847:45;43874:4;43880:2;43884:7;43847:26;:45::i;28985:321::-;29115:18;29121:2;29125:7;29115:5;:18::i;:::-;29166:54;29197:1;29201:2;29205:7;29214:5;29166:22;:54::i;:::-;29144:154;;;;-1:-1:-1;;;29144:154:0;;;;;;;:::i;32385:799::-;32540:4;32561:15;:2;-1:-1:-1;;;;;32561:13:0;;:15::i;:::-;32557:620;;;32613:2;-1:-1:-1;;;;;32597:36:0;;32634:12;:10;:12::i;:::-;32648:4;32654:7;32663:5;32597:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32597:72:0;;;;;;;;-1:-1:-1;;32597:72:0;;;;;;;;;;;;:::i;:::-;;;32593:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32839:13:0;;32835:272;;32882:60;;-1:-1:-1;;;32882:60:0;;;;;;;:::i;32835:272::-;33057:6;33051:13;33042:6;33038:2;33034:15;33027:38;32593:529;-1:-1:-1;;;;;;32720:51:0;-1:-1:-1;;;32720:51:0;;-1:-1:-1;32713:58:0;;32557:620;-1:-1:-1;33161:4:0;32385:799;;;;;;:::o;29642:382::-;-1:-1:-1;;;;;29722:16:0;;29714:61;;;;-1:-1:-1;;;29714:61:0;;;;;;;:::i;:::-;29795:16;29803:7;29795;:16::i;:::-;29794:17;29786:58;;;;-1:-1:-1;;;29786:58:0;;;;;;;:::i;:::-;29857:45;29886:1;29890:2;29894:7;29857:20;:45::i;:::-;-1:-1:-1;;;;;29915:13:0;;;;;;:9;:13;;;;;:18;;29932:1;;29915:13;:18;;29932:1;;29915:18;:::i;:::-;;;;-1:-1:-1;;29944:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29944:21:0;-1:-1:-1;;;;;29944:21:0;;;;;;;;29983:33;;29944:16;;;29983:33;;29944:16;;29983:33;29642:382;;:::o;10597:387::-;10920:20;10968:8;;;10597:387::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:633:1;;110:18;151:2;143:6;140:14;137:2;;;157:18;;:::i;:::-;232:2;226:9;200:2;286:15;;-1:-1:-1;;282:24:1;;;308:2;278:33;274:42;262:55;;;332:18;;;352:22;;;329:46;326:2;;;378:18;;:::i;:::-;418:10;414:2;407:22;447:6;438:15;;477:6;469;462:22;517:3;508:6;503:3;499:16;496:25;493:2;;;534:1;531;524:12;493:2;584:6;579:3;572:4;564:6;560:17;547:44;639:1;632:4;623:6;615;611:19;607:30;600:41;;;;90:557;;;;;:::o;652:175::-;722:20;;-1:-1:-1;;;;;771:31:1;;761:42;;751:2;;817:1;814;807:12;832:162;899:20;;955:13;;948:21;938:32;;928:2;;984:1;981;974:12;999:198;;1111:2;1099:9;1090:7;1086:23;1082:32;1079:2;;;1132:6;1124;1117:22;1079:2;1160:31;1181:9;1160:31;:::i;1202:274::-;;;1331:2;1319:9;1310:7;1306:23;1302:32;1299:2;;;1352:6;1344;1337:22;1299:2;1380:31;1401:9;1380:31;:::i;:::-;1370:41;;1430:40;1466:2;1455:9;1451:18;1430:40;:::i;:::-;1420:50;;1289:187;;;;;:::o;1481:342::-;;;;1627:2;1615:9;1606:7;1602:23;1598:32;1595:2;;;1648:6;1640;1633:22;1595:2;1676:31;1697:9;1676:31;:::i;:::-;1666:41;;1726:40;1762:2;1751:9;1747:18;1726:40;:::i;:::-;1716:50;;1813:2;1802:9;1798:18;1785:32;1775:42;;1585:238;;;;;:::o;1828:702::-;;;;;2000:3;1988:9;1979:7;1975:23;1971:33;1968:2;;;2022:6;2014;2007:22;1968:2;2050:31;2071:9;2050:31;:::i;:::-;2040:41;;2100:40;2136:2;2125:9;2121:18;2100:40;:::i;:::-;2090:50;;2187:2;2176:9;2172:18;2159:32;2149:42;;2242:2;2231:9;2227:18;2214:32;2269:18;2261:6;2258:30;2255:2;;;2306:6;2298;2291:22;2255:2;2334:22;;2387:4;2379:13;;2375:27;-1:-1:-1;2365:2:1;;2421:6;2413;2406:22;2365:2;2449:75;2516:7;2511:2;2498:16;2493:2;2489;2485:11;2449:75;:::i;:::-;2439:85;;;1958:572;;;;;;;:::o;2535:268::-;;;2661:2;2649:9;2640:7;2636:23;2632:32;2629:2;;;2682:6;2674;2667:22;2629:2;2710:31;2731:9;2710:31;:::i;:::-;2700:41;;2760:37;2793:2;2782:9;2778:18;2760:37;:::i;2808:266::-;;;2937:2;2925:9;2916:7;2912:23;2908:32;2905:2;;;2958:6;2950;2943:22;2905:2;2986:31;3007:9;2986:31;:::i;:::-;2976:41;3064:2;3049:18;;;;3036:32;;-1:-1:-1;;;2895:179:1:o;3079:192::-;;3188:2;3176:9;3167:7;3163:23;3159:32;3156:2;;;3209:6;3201;3194:22;3156:2;3237:28;3255:9;3237:28;:::i;3276:257::-;;3387:2;3375:9;3366:7;3362:23;3358:32;3355:2;;;3408:6;3400;3393:22;3355:2;3452:9;3439:23;3471:32;3497:5;3471:32;:::i;3538:261::-;;3660:2;3648:9;3639:7;3635:23;3631:32;3628:2;;;3681:6;3673;3666:22;3628:2;3718:9;3712:16;3737:32;3763:5;3737:32;:::i;3804:482::-;;3926:2;3914:9;3905:7;3901:23;3897:32;3894:2;;;3947:6;3939;3932:22;3894:2;3992:9;3979:23;4025:18;4017:6;4014:30;4011:2;;;4062:6;4054;4047:22;4011:2;4090:22;;4143:4;4135:13;;4131:27;-1:-1:-1;4121:2:1;;4177:6;4169;4162:22;4121:2;4205:75;4272:7;4267:2;4254:16;4249:2;4245;4241:11;4205:75;:::i;4291:190::-;;4403:2;4391:9;4382:7;4378:23;4374:32;4371:2;;;4424:6;4416;4409:22;4371:2;-1:-1:-1;4452:23:1;;4361:120;-1:-1:-1;4361:120:1:o;4486:259::-;;4567:5;4561:12;4594:6;4589:3;4582:19;4610:63;4666:6;4659:4;4654:3;4650:14;4643:4;4636:5;4632:16;4610:63;:::i;:::-;4727:2;4706:15;-1:-1:-1;;4702:29:1;4693:39;;;;4734:4;4689:50;;4537:208;-1:-1:-1;;4537:208:1:o;4750:1532::-;;5012:6;5006:13;5038:4;5051:51;5095:6;5090:3;5085:2;5077:6;5073:15;5051:51;:::i;:::-;5165:13;;5124:16;;;;5187:55;5165:13;5124:16;5209:15;;;5187:55;:::i;:::-;5333:13;;5264:20;;;5304:3;;5410:1;5395:17;;5431:1;5467:18;;;;5494:2;;5572:4;5562:8;5558:19;5546:31;;5494:2;5635;5625:8;5622:16;5602:18;5599:40;5596:2;;;-1:-1:-1;;;5662:33:1;;5718:4;5715:1;5708:15;5748:4;5669:3;5736:17;5596:2;5779:18;5806:110;;;;5930:1;5925:332;;;;5772:485;;5806:110;-1:-1:-1;;5841:24:1;;5827:39;;5886:20;;;;-1:-1:-1;5806:110:1;;5925:332;5961:39;5993:6;5961:39;:::i;:::-;6022:3;6038:169;6052:8;6049:1;6046:15;6038:169;;;6134:14;;6119:13;;;6112:37;6177:16;;;;6069:10;;6038:169;;;6042:3;;6238:8;6231:5;6227:20;6220:27;;5772:485;-1:-1:-1;6273:3:1;;4982:1300;-1:-1:-1;;;;;;;;;;;4982:1300:1:o;6287:203::-;-1:-1:-1;;;;;6451:32:1;;;;6433:51;;6421:2;6406:18;;6388:102::o;6495:490::-;-1:-1:-1;;;;;6764:15:1;;;6746:34;;6816:15;;6811:2;6796:18;;6789:43;6863:2;6848:18;;6841:34;;;6911:3;6906:2;6891:18;;6884:31;;;6495:490;;6932:47;;6959:19;;6951:6;6932:47;:::i;:::-;6924:55;6698:287;-1:-1:-1;;;;;;6698:287:1:o;6990:187::-;7155:14;;7148:22;7130:41;;7118:2;7103:18;;7085:92::o;7182:221::-;;7331:2;7320:9;7313:21;7351:46;7393:2;7382:9;7378:18;7370:6;7351:46;:::i;7408:414::-;7610:2;7592:21;;;7649:2;7629:18;;;7622:30;7688:34;7683:2;7668:18;;7661:62;-1:-1:-1;;;7754:2:1;7739:18;;7732:48;7812:3;7797:19;;7582:240::o;7827:402::-;8029:2;8011:21;;;8068:2;8048:18;;;8041:30;8107:34;8102:2;8087:18;;8080:62;-1:-1:-1;;;8173:2:1;8158:18;;8151:36;8219:3;8204:19;;8001:228::o;8234:352::-;8436:2;8418:21;;;8475:2;8455:18;;;8448:30;8514;8509:2;8494:18;;8487:58;8577:2;8562:18;;8408:178::o;8591:400::-;8793:2;8775:21;;;8832:2;8812:18;;;8805:30;8871:34;8866:2;8851:18;;8844:62;-1:-1:-1;;;8937:2:1;8922:18;;8915:34;8981:3;8966:19;;8765:226::o;8996:349::-;9198:2;9180:21;;;9237:2;9217:18;;;9210:30;9276:27;9271:2;9256:18;;9249:55;9336:2;9321:18;;9170:175::o;9350:408::-;9552:2;9534:21;;;9591:2;9571:18;;;9564:30;9630:34;9625:2;9610:18;;9603:62;-1:-1:-1;;;9696:2:1;9681:18;;9674:42;9748:3;9733:19;;9524:234::o;9763:343::-;9965:2;9947:21;;;10004:2;9984:18;;;9977:30;-1:-1:-1;;;10038:2:1;10023:18;;10016:49;10097:2;10082:18;;9937:169::o;10111:420::-;10313:2;10295:21;;;10352:2;10332:18;;;10325:30;10391:34;10386:2;10371:18;;10364:62;10462:26;10457:2;10442:18;;10435:54;10521:3;10506:19;;10285:246::o;10536:349::-;10738:2;10720:21;;;10777:2;10757:18;;;10750:30;10816:27;10811:2;10796:18;;10789:55;10876:2;10861:18;;10710:175::o;10890:406::-;11092:2;11074:21;;;11131:2;11111:18;;;11104:30;11170:34;11165:2;11150:18;;11143:62;-1:-1:-1;;;11236:2:1;11221:18;;11214:40;11286:3;11271:19;;11064:232::o;11301:405::-;11503:2;11485:21;;;11542:2;11522:18;;;11515:30;11581:34;11576:2;11561:18;;11554:62;-1:-1:-1;;;11647:2:1;11632:18;;11625:39;11696:3;11681:19;;11475:231::o;11711:356::-;11913:2;11895:21;;;11932:18;;;11925:30;11991:34;11986:2;11971:18;;11964:62;12058:2;12043:18;;11885:182::o;12072:349::-;12274:2;12256:21;;;12313:2;12293:18;;;12286:30;12352:27;12347:2;12332:18;;12325:55;12412:2;12397:18;;12246:175::o;12426:408::-;12628:2;12610:21;;;12667:2;12647:18;;;12640:30;12706:34;12701:2;12686:18;;12679:62;-1:-1:-1;;;12772:2:1;12757:18;;12750:42;12824:3;12809:19;;12600:234::o;12839:350::-;13041:2;13023:21;;;13080:2;13060:18;;;13053:30;13119:28;13114:2;13099:18;;13092:56;13180:2;13165:18;;13013:176::o;13194:356::-;13396:2;13378:21;;;13415:18;;;13408:30;13474:34;13469:2;13454:18;;13447:62;13541:2;13526:18;;13368:182::o;13555:405::-;13757:2;13739:21;;;13796:2;13776:18;;;13769:30;13835:34;13830:2;13815:18;;13808:62;-1:-1:-1;;;13901:2:1;13886:18;;13879:39;13950:3;13935:19;;13729:231::o;13965:411::-;14167:2;14149:21;;;14206:2;14186:18;;;14179:30;14245:34;14240:2;14225:18;;14218:62;-1:-1:-1;;;14311:2:1;14296:18;;14289:45;14366:3;14351:19;;14139:237::o;14381:354::-;14583:2;14565:21;;;14622:2;14602:18;;;14595:30;14661:32;14656:2;14641:18;;14634:60;14726:2;14711:18;;14555:180::o;14740:352::-;14942:2;14924:21;;;14981:2;14961:18;;;14954:30;15020;15015:2;15000:18;;14993:58;15083:2;15068:18;;14914:178::o;15097:397::-;15299:2;15281:21;;;15338:2;15318:18;;;15311:30;15377:34;15372:2;15357:18;;15350:62;-1:-1:-1;;;15443:2:1;15428:18;;15421:31;15484:3;15469:19;;15271:223::o;15499:413::-;15701:2;15683:21;;;15740:2;15720:18;;;15713:30;15779:34;15774:2;15759:18;;15752:62;-1:-1:-1;;;15845:2:1;15830:18;;15823:47;15902:3;15887:19;;15673:239::o;15917:177::-;16063:25;;;16051:2;16036:18;;16018:76::o;16099:129::-;;16167:17;;;16217:4;16201:21;;;16157:71::o;16233:128::-;;16304:1;16300:6;16297:1;16294:13;16291:2;;;16310:18;;:::i;:::-;-1:-1:-1;16346:9:1;;16281:80::o;16366:120::-;;16432:1;16422:2;;16437:18;;:::i;:::-;-1:-1:-1;16471:9:1;;16412:74::o;16491:168::-;;16597:1;16593;16589:6;16585:14;16582:1;16579:21;16574:1;16567:9;16560:17;16556:45;16553:2;;;16604:18;;:::i;:::-;-1:-1:-1;16644:9:1;;16543:116::o;16664:125::-;;16732:1;16729;16726:8;16723:2;;;16737:18;;:::i;:::-;-1:-1:-1;16774:9:1;;16713:76::o;16794:258::-;16866:1;16876:113;16890:6;16887:1;16884:13;16876:113;;;16966:11;;;16960:18;16947:11;;;16940:39;16912:2;16905:10;16876:113;;;17007:6;17004:1;17001:13;16998:2;;;-1:-1:-1;;17042:1:1;17024:16;;17017:27;16847:205::o;17057:380::-;17142:1;17132:12;;17189:1;17179:12;;;17200:2;;17254:4;17246:6;17242:17;17232:27;;17200:2;17307;17299:6;17296:14;17276:18;17273:38;17270:2;;;17353:10;17348:3;17344:20;17341:1;17334:31;17388:4;17385:1;17378:15;17416:4;17413:1;17406:15;17270:2;;17112:325;;;:::o;17442:135::-;;-1:-1:-1;;17502:17:1;;17499:2;;;17522:18;;:::i;:::-;-1:-1:-1;17569:1:1;17558:13;;17489:88::o;17582:112::-;;17640:1;17630:2;;17645:18;;:::i;:::-;-1:-1:-1;17679:9:1;;17620:74::o;17699:127::-;17760:10;17755:3;17751:20;17748:1;17741:31;17791:4;17788:1;17781:15;17815:4;17812:1;17805:15;17831:127;17892:10;17887:3;17883:20;17880:1;17873:31;17923:4;17920:1;17913:15;17947:4;17944:1;17937:15;17963:127;18024:10;18019:3;18015:20;18012:1;18005:31;18055:4;18052:1;18045:15;18079:4;18076:1;18069:15;18095:133;-1:-1:-1;;;;;;18171:32:1;;18161:43;;18151:2;;18218:1;18215;18208:12
Swarm Source
ipfs://e72997bb0b1c3c84b47de9863f4b9a256d5873890a435e581b67b261af119aeb
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.