Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
0 DGCC
Holders
600
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
8 DGCCLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
DGClubCard
Compiler Version
v0.8.1+commit.df193b15
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-03 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (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 // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.5.0) (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 { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (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 // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: DGClubCard.sol pragma solidity ^0.8.0; abstract contract ENS { function resolver(bytes32 node) public view virtual returns (Resolver); } abstract contract Resolver { function addr(bytes32 node) public view virtual returns (address); } /// @title Disgusting Gentlemen Club Card /// @author Aidan Fu /// @notice Manages minting of the Disgusting Gentlemen Club Card NFT's contract DGClubCard is Ownable, ERC721, Pausable { string public baseUri; uint256 public maxMintAmt = 1000; address public ENSAddress = 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e; using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; // token id will range from 0-999 inclusive ENS ens = ENS(ENSAddress); constructor() ERC721("DisgustingGentlemenClubCard", "DGCC") {} modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } modifier canMint(address minter) { require(balanceOf(minter) == 0, "Only one DG Club Card per owner!"); require( _tokenIdCounter.current() < maxMintAmt, "No more mints can be made" ); _; } function setENSAddress(address _ENSAddress) external onlyOwner { ENSAddress = _ENSAddress; } function setMaxMintAmt(uint256 _maxMintAmt) external onlyOwner { maxMintAmt = _maxMintAmt; } function setBaseURI(string memory _baseUri) external onlyOwner { baseUri = _baseUri; } function airDrop(address addressToAirDrop) external onlyOwner canMint(addressToAirDrop) { uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(addressToAirDrop, tokenId); } function publicMint(bytes32 node) external callerIsUser canMint(msg.sender) whenNotPaused { require( resolve(node) == msg.sender, "You must have a valid ENS domain to mint" ); uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(msg.sender, tokenId); } function withdraw() external { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } function _baseURI() internal view override returns (string memory) { return baseUri; } function resolve(bytes32 node) public view returns (address) { Resolver resolver = ens.resolver(node); return resolver.addr(node); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"ENSAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addressToAirDrop","type":"address"}],"name":"airDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"publicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"resolve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ENSAddress","type":"address"}],"name":"setENSAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmt","type":"uint256"}],"name":"setMaxMintAmt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526103e8600955600a80546001600160a01b03199081166e0c2e074ec69a0dfb2997ba6c7d2e1e1791829055600c80549091166001600160a01b03929092169190911790553480156200005557600080fd5b506040518060400160405280601b81526020017f44697367757374696e6747656e746c656d656e436c7562436172640000000000815250604051806040016040528060048152602001634447434360e01b815250620000c3620000bd6200010160201b60201c565b62000105565b8151620000d890600190602085019062000155565b508051620000ee90600290602084019062000155565b50506007805460ff191690555062000238565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200016390620001fb565b90600052602060002090601f016020900481019282620001875760008555620001d2565b82601f10620001a257805160ff1916838001178555620001d2565b82800160010185558215620001d2579182015b82811115620001d2578251825591602001919060010190620001b5565b50620001e0929150620001e4565b5090565b5b80821115620001e05760008155600101620001e5565b6002810460018216806200021057607f821691505b602082108114156200023257634e487b7160e01b600052602260045260246000fd5b50919050565b61207980620002486000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80636352211e11610104578063a22cb465116100a2578063cd18d5a411610071578063cd18d5a414610375578063ceb58fcb14610388578063e985e9c51461039b578063f2fde38b146103ae576101cf565b8063a22cb46514610334578063a53dc05f14610347578063b88d4fde1461034f578063c87b56dd14610362576101cf565b80638456cb59116100de5780638456cb59146103145780638da5cb5b1461031c57806395d89b41146103245780639abc83201461032c576101cf565b80636352211e146102d957806370a08231146102ec578063715018a61461030c576101cf565b80633ccfd60b116101715780634cad1ce91161014b5780634cad1ce91461029857806355f804b3146102ab5780635c23bdf5146102be5780635c975abb146102d1576101cf565b80633ccfd60b146102755780633f4ba83a1461027d57806342842e0e14610285576101cf565b8063095ea7b3116101ad578063095ea7b314610232578063223e6be41461024757806323b872dd1461024f5780632e848ac714610262576101cf565b806301ffc9a7146101d457806306fdde03146101fd578063081812fc14610212575b600080fd5b6101e76101e2366004611804565b6103c1565b6040516101f49190611931565b60405180910390f35b610205610409565b6040516101f49190611945565b6102256102203660046117ec565b61049b565b6040516101f491906118e0565b6102456102403660046117c1565b6104e7565b005b61022561057f565b61024561025d3660046116d3565b61058e565b6102456102703660046117ec565b6105c6565b61024561060a565b61024561067d565b6102456102933660046116d3565b6106c6565b6102456102a6366004611663565b6106e1565b6102456102b936600461183c565b610742565b6102256102cc3660046117ec565b610798565b6101e76108a3565b6102256102e73660046117ec565b6108ac565b6102ff6102fa366004611663565b6108e1565b6040516101f4919061193c565b610245610925565b61024561096e565b6102256109b5565b6102056109c4565b6102056109d3565b610245610342366004611790565b610a61565b6102ff610a73565b61024561035d366004611713565b610a79565b6102056103703660046117ec565b610ab8565b610245610383366004611663565b610b3b565b6102456103963660046117ec565b610bed565b6101e76103a936600461169b565b610cd4565b6102456103bc366004611663565b610d02565b60006001600160e01b031982166380ac58cd60e01b14806103f257506001600160e01b03198216635b5e139f60e01b145b80610401575061040182610d70565b90505b919050565b60606001805461041890611f6c565b80601f016020809104026020016040519081016040528092919081815260200182805461044490611f6c565b80156104915780601f1061046657610100808354040283529160200191610491565b820191906000526020600020905b81548152906001019060200180831161047457829003601f168201915b5050505050905090565b60006104a682610d89565b6104cb5760405162461bcd60e51b81526004016104c290611d1e565b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006104f2826108ac565b9050806001600160a01b0316836001600160a01b031614156105265760405162461bcd60e51b81526004016104c290611dee565b806001600160a01b0316610538610da6565b6001600160a01b031614806105545750610554816103a9610da6565b6105705760405162461bcd60e51b81526004016104c290611bc2565b61057a8383610daa565b505050565b600a546001600160a01b031681565b61059f610599610da6565b82610e18565b6105bb5760405162461bcd60e51b81526004016104c290611e2f565b61057a838383610e9d565b6105ce610da6565b6001600160a01b03166105df6109b5565b6001600160a01b0316146106055760405162461bcd60e51b81526004016104c290611d6a565b600955565b60006106146109b5565b6001600160a01b03164760405161062a906118dd565b60006040518083038185875af1925050503d8060008114610667576040519150601f19603f3d011682016040523d82523d6000602084013e61066c565b606091505b505090508061067a57600080fd5b50565b610685610da6565b6001600160a01b03166106966109b5565b6001600160a01b0316146106bc5760405162461bcd60e51b81526004016104c290611d6a565b6106c4610fd0565b565b61057a83838360405180602001604052806000815250610a79565b6106e9610da6565b6001600160a01b03166106fa6109b5565b6001600160a01b0316146107205760405162461bcd60e51b81526004016104c290611d6a565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b61074a610da6565b6001600160a01b031661075b6109b5565b6001600160a01b0316146107815760405162461bcd60e51b81526004016104c290611d6a565b8051610794906008906020840190611554565b5050565b600c54604051630178b8bf60e01b815260009182916001600160a01b0390911690630178b8bf906107cd90869060040161193c565b60206040518083038186803b1580156107e557600080fd5b505afa1580156107f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081d919061167f565b604051631d9dabef60e11b81529091506001600160a01b03821690633b3b57de9061084c90869060040161193c565b60206040518083038186803b15801561086457600080fd5b505afa158015610878573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089c919061167f565b9392505050565b60075460ff1690565b6000818152600360205260408120546001600160a01b0316806104015760405162461bcd60e51b81526004016104c290611c69565b60006001600160a01b0382166109095760405162461bcd60e51b81526004016104c290611c1f565b506001600160a01b031660009081526004602052604090205490565b61092d610da6565b6001600160a01b031661093e6109b5565b6001600160a01b0316146109645760405162461bcd60e51b81526004016104c290611d6a565b6106c4600061103e565b610976610da6565b6001600160a01b03166109876109b5565b6001600160a01b0316146109ad5760405162461bcd60e51b81526004016104c290611d6a565b6106c461108e565b6000546001600160a01b031690565b60606002805461041890611f6c565b600880546109e090611f6c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0c90611f6c565b8015610a595780601f10610a2e57610100808354040283529160200191610a59565b820191906000526020600020905b815481529060010190602001808311610a3c57829003601f168201915b505050505081565b610794610a6c610da6565b83836110e9565b60095481565b610a8a610a84610da6565b83610e18565b610aa65760405162461bcd60e51b81526004016104c290611e2f565b610ab28484848461118c565b50505050565b6060610ac382610d89565b610adf5760405162461bcd60e51b81526004016104c290611d9f565b6000610ae96111bf565b90506000815111610b09576040518060200160405280600081525061089c565b80610b13846111ce565b604051602001610b249291906118ae565b604051602081830303815290604052915050919050565b610b43610da6565b6001600160a01b0316610b546109b5565b6001600160a01b031614610b7a5760405162461bcd60e51b81526004016104c290611d6a565b80610b84816108e1565b15610ba15760405162461bcd60e51b81526004016104c290611ec8565b600954610bae600b6112e9565b10610bcb5760405162461bcd60e51b81526004016104c290611cb2565b6000610bd7600b6112e9565b9050610be3600b6112ed565b61057a83826112f6565b323314610c0c5760405162461bcd60e51b81526004016104c290611b61565b33610c16816108e1565b15610c335760405162461bcd60e51b81526004016104c290611ec8565b600954610c40600b6112e9565b10610c5d5760405162461bcd60e51b81526004016104c290611cb2565b610c656108a3565b15610c825760405162461bcd60e51b81526004016104c290611b98565b33610c8c83610798565b6001600160a01b031614610cb25760405162461bcd60e51b81526004016104c290611e80565b6000610cbe600b6112e9565b9050610cca600b6112ed565b61057a33826112f6565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b610d0a610da6565b6001600160a01b0316610d1b6109b5565b6001600160a01b031614610d415760405162461bcd60e51b81526004016104c290611d6a565b6001600160a01b038116610d675760405162461bcd60e51b81526004016104c2906119d8565b61067a8161103e565b6001600160e01b031981166301ffc9a760e01b14919050565b6000908152600360205260409020546001600160a01b0316151590565b3390565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610ddf826108ac565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610e2382610d89565b610e3f5760405162461bcd60e51b81526004016104c290611b15565b6000610e4a836108ac565b9050806001600160a01b0316846001600160a01b03161480610e855750836001600160a01b0316610e7a8461049b565b6001600160a01b0316145b80610e955750610e958185610cd4565b949350505050565b826001600160a01b0316610eb0826108ac565b6001600160a01b031614610ed65760405162461bcd60e51b81526004016104c290611a1e565b6001600160a01b038216610efc5760405162461bcd60e51b81526004016104c290611a9a565b610f0783838361057a565b610f12600082610daa565b6001600160a01b0383166000908152600460205260408120805460019290610f3b908490611f29565b90915550506001600160a01b0382166000908152600460205260408120805460019290610f69908490611efd565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a461057a83838361057a565b610fd86108a3565b610ff45760405162461bcd60e51b81526004016104c290611958565b6007805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611027610da6565b60405161103491906118e0565b60405180910390a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6110966108a3565b156110b35760405162461bcd60e51b81526004016104c290611b98565b6007805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611027610da6565b816001600160a01b0316836001600160a01b0316141561111b5760405162461bcd60e51b81526004016104c290611ade565b6001600160a01b0383811660008181526006602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319061117f908590611931565b60405180910390a3505050565b611197848484610e9d565b6111a384848484611310565b610ab25760405162461bcd60e51b81526004016104c290611986565b60606008805461041890611f6c565b6060816111f357506040805180820190915260018152600360fc1b6020820152610404565b8160005b811561121d578061120781611fa7565b91506112169050600a83611f15565b91506111f7565b60008167ffffffffffffffff81111561124657634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611270576020820181803683370190505b5090505b8415610e9557611285600183611f29565b9150611292600a86611fc2565b61129d906030611efd565b60f81b8183815181106112c057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506112e2600a86611f15565b9450611274565b5490565b80546001019055565b61079482826040518060200160405280600081525061142b565b6000611324846001600160a01b031661145e565b1561142057836001600160a01b031663150b7a02611340610da6565b8786866040518563ffffffff1660e01b815260040161136294939291906118f4565b602060405180830381600087803b15801561137c57600080fd5b505af19250505080156113ac575060408051601f3d908101601f191682019092526113a991810190611820565b60015b611406573d8080156113da576040519150601f19603f3d011682016040523d82523d6000602084013e6113df565b606091505b5080516113fe5760405162461bcd60e51b81526004016104c290611986565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610e95565b506001949350505050565b611435838361146d565b6114426000848484611310565b61057a5760405162461bcd60e51b81526004016104c290611986565b6001600160a01b03163b151590565b6001600160a01b0382166114935760405162461bcd60e51b81526004016104c290611ce9565b61149c81610d89565b156114b95760405162461bcd60e51b81526004016104c290611a63565b6114c56000838361057a565b6001600160a01b03821660009081526004602052604081208054600192906114ee908490611efd565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46107946000838361057a565b82805461156090611f6c565b90600052602060002090601f01602090048101928261158257600085556115c8565b82601f1061159b57805160ff19168380011785556115c8565b828001600101855582156115c8579182015b828111156115c85782518255916020019190600101906115ad565b506115d49291506115d8565b5090565b5b808211156115d457600081556001016115d9565b600067ffffffffffffffff8084111561160857611608612002565b604051601f8501601f19908116603f0116810190828211818310171561163057611630612002565b8160405280935085815286868601111561164957600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611674578081fd5b813561089c81612018565b600060208284031215611690578081fd5b815161089c81612018565b600080604083850312156116ad578081fd5b82356116b881612018565b915060208301356116c881612018565b809150509250929050565b6000806000606084860312156116e7578081fd5b83356116f281612018565b9250602084013561170281612018565b929592945050506040919091013590565b60008060008060808587031215611728578081fd5b843561173381612018565b9350602085013561174381612018565b925060408501359150606085013567ffffffffffffffff811115611765578182fd5b8501601f81018713611775578182fd5b611784878235602084016115ed565b91505092959194509250565b600080604083850312156117a2578182fd5b82356117ad81612018565b9150602083013580151581146116c8578182fd5b600080604083850312156117d3578182fd5b82356117de81612018565b946020939093013593505050565b6000602082840312156117fd578081fd5b5035919050565b600060208284031215611815578081fd5b813561089c8161202d565b600060208284031215611831578081fd5b815161089c8161202d565b60006020828403121561184d578081fd5b813567ffffffffffffffff811115611863578182fd5b8201601f81018413611873578182fd5b610e95848235602084016115ed565b6000815180845261189a816020860160208601611f40565b601f01601f19169290920160200192915050565b600083516118c0818460208801611f40565b8351908301906118d4818360208801611f40565b01949350505050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061192790830184611882565b9695505050505050565b901515815260200190565b90815260200190565b60006020825261089c6020830184611882565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252601e908201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526019908201527f4e6f206d6f7265206d696e74732063616e206265206d61646500000000000000604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526028908201527f596f75206d757374206861766520612076616c696420454e5320646f6d61696e604082015267081d1bc81b5a5b9d60c21b606082015260800190565b6020808252818101527f4f6e6c79206f6e6520444720436c7562204361726420706572206f776e657221604082015260600190565b60008219821115611f1057611f10611fd6565b500190565b600082611f2457611f24611fec565b500490565b600082821015611f3b57611f3b611fd6565b500390565b60005b83811015611f5b578181015183820152602001611f43565b83811115610ab25750506000910152565b600281046001821680611f8057607f821691505b60208210811415611fa157634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611fbb57611fbb611fd6565b5060010190565b600082611fd157611fd1611fec565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461067a57600080fd5b6001600160e01b03198116811461067a57600080fdfea264697066735822122094687640d37033c2994f1818e8c3c3538e174fabeb30f6499975cd90be033a3c64736f6c63430008010033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c80636352211e11610104578063a22cb465116100a2578063cd18d5a411610071578063cd18d5a414610375578063ceb58fcb14610388578063e985e9c51461039b578063f2fde38b146103ae576101cf565b8063a22cb46514610334578063a53dc05f14610347578063b88d4fde1461034f578063c87b56dd14610362576101cf565b80638456cb59116100de5780638456cb59146103145780638da5cb5b1461031c57806395d89b41146103245780639abc83201461032c576101cf565b80636352211e146102d957806370a08231146102ec578063715018a61461030c576101cf565b80633ccfd60b116101715780634cad1ce91161014b5780634cad1ce91461029857806355f804b3146102ab5780635c23bdf5146102be5780635c975abb146102d1576101cf565b80633ccfd60b146102755780633f4ba83a1461027d57806342842e0e14610285576101cf565b8063095ea7b3116101ad578063095ea7b314610232578063223e6be41461024757806323b872dd1461024f5780632e848ac714610262576101cf565b806301ffc9a7146101d457806306fdde03146101fd578063081812fc14610212575b600080fd5b6101e76101e2366004611804565b6103c1565b6040516101f49190611931565b60405180910390f35b610205610409565b6040516101f49190611945565b6102256102203660046117ec565b61049b565b6040516101f491906118e0565b6102456102403660046117c1565b6104e7565b005b61022561057f565b61024561025d3660046116d3565b61058e565b6102456102703660046117ec565b6105c6565b61024561060a565b61024561067d565b6102456102933660046116d3565b6106c6565b6102456102a6366004611663565b6106e1565b6102456102b936600461183c565b610742565b6102256102cc3660046117ec565b610798565b6101e76108a3565b6102256102e73660046117ec565b6108ac565b6102ff6102fa366004611663565b6108e1565b6040516101f4919061193c565b610245610925565b61024561096e565b6102256109b5565b6102056109c4565b6102056109d3565b610245610342366004611790565b610a61565b6102ff610a73565b61024561035d366004611713565b610a79565b6102056103703660046117ec565b610ab8565b610245610383366004611663565b610b3b565b6102456103963660046117ec565b610bed565b6101e76103a936600461169b565b610cd4565b6102456103bc366004611663565b610d02565b60006001600160e01b031982166380ac58cd60e01b14806103f257506001600160e01b03198216635b5e139f60e01b145b80610401575061040182610d70565b90505b919050565b60606001805461041890611f6c565b80601f016020809104026020016040519081016040528092919081815260200182805461044490611f6c565b80156104915780601f1061046657610100808354040283529160200191610491565b820191906000526020600020905b81548152906001019060200180831161047457829003601f168201915b5050505050905090565b60006104a682610d89565b6104cb5760405162461bcd60e51b81526004016104c290611d1e565b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006104f2826108ac565b9050806001600160a01b0316836001600160a01b031614156105265760405162461bcd60e51b81526004016104c290611dee565b806001600160a01b0316610538610da6565b6001600160a01b031614806105545750610554816103a9610da6565b6105705760405162461bcd60e51b81526004016104c290611bc2565b61057a8383610daa565b505050565b600a546001600160a01b031681565b61059f610599610da6565b82610e18565b6105bb5760405162461bcd60e51b81526004016104c290611e2f565b61057a838383610e9d565b6105ce610da6565b6001600160a01b03166105df6109b5565b6001600160a01b0316146106055760405162461bcd60e51b81526004016104c290611d6a565b600955565b60006106146109b5565b6001600160a01b03164760405161062a906118dd565b60006040518083038185875af1925050503d8060008114610667576040519150601f19603f3d011682016040523d82523d6000602084013e61066c565b606091505b505090508061067a57600080fd5b50565b610685610da6565b6001600160a01b03166106966109b5565b6001600160a01b0316146106bc5760405162461bcd60e51b81526004016104c290611d6a565b6106c4610fd0565b565b61057a83838360405180602001604052806000815250610a79565b6106e9610da6565b6001600160a01b03166106fa6109b5565b6001600160a01b0316146107205760405162461bcd60e51b81526004016104c290611d6a565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b61074a610da6565b6001600160a01b031661075b6109b5565b6001600160a01b0316146107815760405162461bcd60e51b81526004016104c290611d6a565b8051610794906008906020840190611554565b5050565b600c54604051630178b8bf60e01b815260009182916001600160a01b0390911690630178b8bf906107cd90869060040161193c565b60206040518083038186803b1580156107e557600080fd5b505afa1580156107f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081d919061167f565b604051631d9dabef60e11b81529091506001600160a01b03821690633b3b57de9061084c90869060040161193c565b60206040518083038186803b15801561086457600080fd5b505afa158015610878573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089c919061167f565b9392505050565b60075460ff1690565b6000818152600360205260408120546001600160a01b0316806104015760405162461bcd60e51b81526004016104c290611c69565b60006001600160a01b0382166109095760405162461bcd60e51b81526004016104c290611c1f565b506001600160a01b031660009081526004602052604090205490565b61092d610da6565b6001600160a01b031661093e6109b5565b6001600160a01b0316146109645760405162461bcd60e51b81526004016104c290611d6a565b6106c4600061103e565b610976610da6565b6001600160a01b03166109876109b5565b6001600160a01b0316146109ad5760405162461bcd60e51b81526004016104c290611d6a565b6106c461108e565b6000546001600160a01b031690565b60606002805461041890611f6c565b600880546109e090611f6c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0c90611f6c565b8015610a595780601f10610a2e57610100808354040283529160200191610a59565b820191906000526020600020905b815481529060010190602001808311610a3c57829003601f168201915b505050505081565b610794610a6c610da6565b83836110e9565b60095481565b610a8a610a84610da6565b83610e18565b610aa65760405162461bcd60e51b81526004016104c290611e2f565b610ab28484848461118c565b50505050565b6060610ac382610d89565b610adf5760405162461bcd60e51b81526004016104c290611d9f565b6000610ae96111bf565b90506000815111610b09576040518060200160405280600081525061089c565b80610b13846111ce565b604051602001610b249291906118ae565b604051602081830303815290604052915050919050565b610b43610da6565b6001600160a01b0316610b546109b5565b6001600160a01b031614610b7a5760405162461bcd60e51b81526004016104c290611d6a565b80610b84816108e1565b15610ba15760405162461bcd60e51b81526004016104c290611ec8565b600954610bae600b6112e9565b10610bcb5760405162461bcd60e51b81526004016104c290611cb2565b6000610bd7600b6112e9565b9050610be3600b6112ed565b61057a83826112f6565b323314610c0c5760405162461bcd60e51b81526004016104c290611b61565b33610c16816108e1565b15610c335760405162461bcd60e51b81526004016104c290611ec8565b600954610c40600b6112e9565b10610c5d5760405162461bcd60e51b81526004016104c290611cb2565b610c656108a3565b15610c825760405162461bcd60e51b81526004016104c290611b98565b33610c8c83610798565b6001600160a01b031614610cb25760405162461bcd60e51b81526004016104c290611e80565b6000610cbe600b6112e9565b9050610cca600b6112ed565b61057a33826112f6565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b610d0a610da6565b6001600160a01b0316610d1b6109b5565b6001600160a01b031614610d415760405162461bcd60e51b81526004016104c290611d6a565b6001600160a01b038116610d675760405162461bcd60e51b81526004016104c2906119d8565b61067a8161103e565b6001600160e01b031981166301ffc9a760e01b14919050565b6000908152600360205260409020546001600160a01b0316151590565b3390565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610ddf826108ac565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610e2382610d89565b610e3f5760405162461bcd60e51b81526004016104c290611b15565b6000610e4a836108ac565b9050806001600160a01b0316846001600160a01b03161480610e855750836001600160a01b0316610e7a8461049b565b6001600160a01b0316145b80610e955750610e958185610cd4565b949350505050565b826001600160a01b0316610eb0826108ac565b6001600160a01b031614610ed65760405162461bcd60e51b81526004016104c290611a1e565b6001600160a01b038216610efc5760405162461bcd60e51b81526004016104c290611a9a565b610f0783838361057a565b610f12600082610daa565b6001600160a01b0383166000908152600460205260408120805460019290610f3b908490611f29565b90915550506001600160a01b0382166000908152600460205260408120805460019290610f69908490611efd565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a461057a83838361057a565b610fd86108a3565b610ff45760405162461bcd60e51b81526004016104c290611958565b6007805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611027610da6565b60405161103491906118e0565b60405180910390a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6110966108a3565b156110b35760405162461bcd60e51b81526004016104c290611b98565b6007805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611027610da6565b816001600160a01b0316836001600160a01b0316141561111b5760405162461bcd60e51b81526004016104c290611ade565b6001600160a01b0383811660008181526006602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319061117f908590611931565b60405180910390a3505050565b611197848484610e9d565b6111a384848484611310565b610ab25760405162461bcd60e51b81526004016104c290611986565b60606008805461041890611f6c565b6060816111f357506040805180820190915260018152600360fc1b6020820152610404565b8160005b811561121d578061120781611fa7565b91506112169050600a83611f15565b91506111f7565b60008167ffffffffffffffff81111561124657634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611270576020820181803683370190505b5090505b8415610e9557611285600183611f29565b9150611292600a86611fc2565b61129d906030611efd565b60f81b8183815181106112c057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506112e2600a86611f15565b9450611274565b5490565b80546001019055565b61079482826040518060200160405280600081525061142b565b6000611324846001600160a01b031661145e565b1561142057836001600160a01b031663150b7a02611340610da6565b8786866040518563ffffffff1660e01b815260040161136294939291906118f4565b602060405180830381600087803b15801561137c57600080fd5b505af19250505080156113ac575060408051601f3d908101601f191682019092526113a991810190611820565b60015b611406573d8080156113da576040519150601f19603f3d011682016040523d82523d6000602084013e6113df565b606091505b5080516113fe5760405162461bcd60e51b81526004016104c290611986565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610e95565b506001949350505050565b611435838361146d565b6114426000848484611310565b61057a5760405162461bcd60e51b81526004016104c290611986565b6001600160a01b03163b151590565b6001600160a01b0382166114935760405162461bcd60e51b81526004016104c290611ce9565b61149c81610d89565b156114b95760405162461bcd60e51b81526004016104c290611a63565b6114c56000838361057a565b6001600160a01b03821660009081526004602052604081208054600192906114ee908490611efd565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46107946000838361057a565b82805461156090611f6c565b90600052602060002090601f01602090048101928261158257600085556115c8565b82601f1061159b57805160ff19168380011785556115c8565b828001600101855582156115c8579182015b828111156115c85782518255916020019190600101906115ad565b506115d49291506115d8565b5090565b5b808211156115d457600081556001016115d9565b600067ffffffffffffffff8084111561160857611608612002565b604051601f8501601f19908116603f0116810190828211818310171561163057611630612002565b8160405280935085815286868601111561164957600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611674578081fd5b813561089c81612018565b600060208284031215611690578081fd5b815161089c81612018565b600080604083850312156116ad578081fd5b82356116b881612018565b915060208301356116c881612018565b809150509250929050565b6000806000606084860312156116e7578081fd5b83356116f281612018565b9250602084013561170281612018565b929592945050506040919091013590565b60008060008060808587031215611728578081fd5b843561173381612018565b9350602085013561174381612018565b925060408501359150606085013567ffffffffffffffff811115611765578182fd5b8501601f81018713611775578182fd5b611784878235602084016115ed565b91505092959194509250565b600080604083850312156117a2578182fd5b82356117ad81612018565b9150602083013580151581146116c8578182fd5b600080604083850312156117d3578182fd5b82356117de81612018565b946020939093013593505050565b6000602082840312156117fd578081fd5b5035919050565b600060208284031215611815578081fd5b813561089c8161202d565b600060208284031215611831578081fd5b815161089c8161202d565b60006020828403121561184d578081fd5b813567ffffffffffffffff811115611863578182fd5b8201601f81018413611873578182fd5b610e95848235602084016115ed565b6000815180845261189a816020860160208601611f40565b601f01601f19169290920160200192915050565b600083516118c0818460208801611f40565b8351908301906118d4818360208801611f40565b01949350505050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061192790830184611882565b9695505050505050565b901515815260200190565b90815260200190565b60006020825261089c6020830184611882565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252601e908201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526019908201527f4e6f206d6f7265206d696e74732063616e206265206d61646500000000000000604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526028908201527f596f75206d757374206861766520612076616c696420454e5320646f6d61696e604082015267081d1bc81b5a5b9d60c21b606082015260800190565b6020808252818101527f4f6e6c79206f6e6520444720436c7562204361726420706572206f776e657221604082015260600190565b60008219821115611f1057611f10611fd6565b500190565b600082611f2457611f24611fec565b500490565b600082821015611f3b57611f3b611fd6565b500390565b60005b83811015611f5b578181015183820152602001611f43565b83811115610ab25750506000910152565b600281046001821680611f8057607f821691505b60208210811415611fa157634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611fbb57611fbb611fd6565b5060010190565b600082611fd157611fd1611fec565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461067a57600080fd5b6001600160e01b03198116811461067a57600080fdfea264697066735822122094687640d37033c2994f1818e8c3c3538e174fabeb30f6499975cd90be033a3c64736f6c63430008010033
Deployed Bytecode Sourcemap
49696:2409:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26475:305;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27420:100;;;:::i;:::-;;;;;;;:::i;28979:221::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;28502:411::-;;;;;;:::i;:::-;;:::i;:::-;;49819:70;;;:::i;29729:339::-;;;;;;:::i;:::-;;:::i;50641:106::-;;;;;;:::i;:::-;;:::i;51546:139::-;;;:::i;51764:67::-;;;:::i;30139:185::-;;;;;;:::i;:::-;;:::i;50527:106::-;;;;;;:::i;:::-;;:::i;50755:100::-;;;;;;:::i;:::-;;:::i;51947:155::-;;;;;;:::i;:::-;;:::i;23882:86::-;;;:::i;27114:239::-;;;;;;:::i;:::-;;:::i;26844:208::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;48461:103::-;;;:::i;51693:63::-;;;:::i;47810:87::-;;;:::i;27589:104::-;;;:::i;49752:21::-;;;:::i;29272:155::-;;;;;;:::i;:::-;;:::i;49780:32::-;;;:::i;30395:328::-;;;;;;:::i;:::-;;:::i;27764:334::-;;;;;;:::i;:::-;;:::i;50863:267::-;;;;;;:::i;:::-;;:::i;51138:400::-;;;;;;:::i;:::-;;:::i;29498:164::-;;;;;;:::i;:::-;;:::i;48719:201::-;;;;;;:::i;:::-;;:::i;26475:305::-;26577:4;-1:-1:-1;;;;;;26614:40:0;;-1:-1:-1;;;26614:40:0;;:105;;-1:-1:-1;;;;;;;26671:48:0;;-1:-1:-1;;;26671:48:0;26614:105;:158;;;;26736:36;26760:11;26736:23;:36::i;:::-;26594:178;;26475:305;;;;:::o;27420:100::-;27474:13;27507:5;27500:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27420:100;:::o;28979:221::-;29055:7;29083:16;29091:7;29083;:16::i;:::-;29075:73;;;;-1:-1:-1;;;29075:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;29168:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29168:24:0;;28979:221::o;28502:411::-;28583:13;28599:23;28614:7;28599:14;:23::i;:::-;28583:39;;28647:5;-1:-1:-1;;;;;28641:11:0;:2;-1:-1:-1;;;;;28641:11:0;;;28633:57;;;;-1:-1:-1;;;28633:57:0;;;;;;;:::i;:::-;28741:5;-1:-1:-1;;;;;28725:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;28725:21:0;;:62;;;;28750:37;28767:5;28774:12;:10;:12::i;28750:37::-;28703:168;;;;-1:-1:-1;;;28703:168:0;;;;;;;:::i;:::-;28884:21;28893:2;28897:7;28884:8;:21::i;:::-;28502:411;;;:::o;49819:70::-;;;-1:-1:-1;;;;;49819:70:0;;:::o;29729:339::-;29924:41;29943:12;:10;:12::i;:::-;29957:7;29924:18;:41::i;:::-;29916:103;;;;-1:-1:-1;;;29916:103:0;;;;;;;:::i;:::-;30032:28;30042:4;30048:2;30052:7;30032:9;:28::i;50641:106::-;48041:12;:10;:12::i;:::-;-1:-1:-1;;;;;48030:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48030:23:0;;48022:68;;;;-1:-1:-1;;;48022:68:0;;;;;;;:::i;:::-;50715:10:::1;:24:::0;50641:106::o;51546:139::-;51587:7;51608;:5;:7::i;:::-;-1:-1:-1;;;;;51600:21:0;51629;51600:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51586:69;;;51674:2;51666:11;;;;;;51546:139;:::o;51764:67::-;48041:12;:10;:12::i;:::-;-1:-1:-1;;;;;48030:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48030:23:0;;48022:68;;;;-1:-1:-1;;;48022:68:0;;;;;;;:::i;:::-;51813:10:::1;:8;:10::i;:::-;51764:67::o:0;30139:185::-;30277:39;30294:4;30300:2;30304:7;30277:39;;;;;;;;;;;;:16;:39::i;50527:106::-;48041:12;:10;:12::i;:::-;-1:-1:-1;;;;;48030:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48030:23:0;;48022:68;;;;-1:-1:-1;;;48022:68:0;;;;;;;:::i;:::-;50601:10:::1;:24:::0;;-1:-1:-1;;;;;;50601:24:0::1;-1:-1:-1::0;;;;;50601:24:0;;;::::1;::::0;;;::::1;::::0;;50527:106::o;50755:100::-;48041:12;:10;:12::i;:::-;-1:-1:-1;;;;;48030:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48030:23:0;;48022:68;;;;-1:-1:-1;;;48022:68:0;;;;;;;:::i;:::-;50829:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;50755:100:::0;:::o;51947:155::-;52039:3;;:18;;-1:-1:-1;;;52039:18:0;;51999:7;;;;-1:-1:-1;;;;;52039:3:0;;;;:12;;:18;;52052:4;;52039:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52075:19;;-1:-1:-1;;;52075:19:0;;52019:38;;-1:-1:-1;;;;;;52075:13:0;;;;;:19;;52089:4;;52075:19;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52068:26;51947:155;-1:-1:-1;;;51947:155:0:o;23882:86::-;23953:7;;;;23882:86;:::o;27114:239::-;27186:7;27222:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27222:16:0;27257:19;27249:73;;;;-1:-1:-1;;;27249:73:0;;;;;;;:::i;26844:208::-;26916:7;-1:-1:-1;;;;;26944:19:0;;26936:74;;;;-1:-1:-1;;;26936:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;27028:16:0;;;;;:9;:16;;;;;;;26844:208::o;48461:103::-;48041:12;:10;:12::i;:::-;-1:-1:-1;;;;;48030:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48030:23:0;;48022:68;;;;-1:-1:-1;;;48022:68:0;;;;;;;:::i;:::-;48526:30:::1;48553:1;48526:18;:30::i;51693:63::-:0;48041:12;:10;:12::i;:::-;-1:-1:-1;;;;;48030:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48030:23:0;;48022:68;;;;-1:-1:-1;;;48022:68:0;;;;;;;:::i;:::-;51740:8:::1;:6;:8::i;47810:87::-:0;47856:7;47883:6;-1:-1:-1;;;;;47883:6:0;47810:87;:::o;27589:104::-;27645:13;27678:7;27671:14;;;;;:::i;49752:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29272:155::-;29367:52;29386:12;:10;:12::i;:::-;29400:8;29410;29367:18;:52::i;49780:32::-;;;;:::o;30395:328::-;30570:41;30589:12;:10;:12::i;:::-;30603:7;30570:18;:41::i;:::-;30562:103;;;;-1:-1:-1;;;30562:103:0;;;;;;;:::i;:::-;30676:39;30690:4;30696:2;30700:7;30709:5;30676:13;:39::i;:::-;30395:328;;;;:::o;27764:334::-;27837:13;27871:16;27879:7;27871;:16::i;:::-;27863:76;;;;-1:-1:-1;;;27863:76:0;;;;;;;:::i;:::-;27952:21;27976:10;:8;:10::i;:::-;27952:34;;28028:1;28010:7;28004:21;:25;:86;;;;;;;;;;;;;;;;;28056:7;28065:18;:7;:16;:18::i;:::-;28039:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27997:93;;;27764:334;;;:::o;50863:267::-;48041:12;:10;:12::i;:::-;-1:-1:-1;;;;;48030:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48030:23:0;;48022:68;;;;-1:-1:-1;;;48022:68:0;;;;;;;:::i;:::-;50960:16:::1;50316:17;50326:6;50316:9;:17::i;:::-;:22:::0;50308:67:::1;;;;-1:-1:-1::0;;;50308:67:0::1;;;;;;;:::i;:::-;50436:10;;50408:25;:15;:23;:25::i;:::-;:38;50386:113;;;;-1:-1:-1::0;;;50386:113:0::1;;;;;;;:::i;:::-;50994:15:::2;51012:25;:15;:23;:25::i;:::-;50994:43;;51048:27;:15;:25;:27::i;:::-;51086:36;51096:16;51114:7;51086:9;:36::i;51138:400::-:0;50178:9;50191:10;50178:23;50170:66;;;;-1:-1:-1;;;50170:66:0;;;;;;;:::i;:::-;51229:10:::1;50316:17;50326:6;50316:9;:17::i;:::-;:22:::0;50308:67:::1;;;;-1:-1:-1::0;;;50308:67:0::1;;;;;;;:::i;:::-;50436:10;;50408:25;:15;:23;:25::i;:::-;:38;50386:113;;;;-1:-1:-1::0;;;50386:113:0::1;;;;;;;:::i;:::-;24208:8:::2;:6;:8::i;:::-;24207:9;24199:38;;;;-1:-1:-1::0;;;24199:38:0::2;;;;;;;:::i;:::-;51319:10:::3;51302:13;51310:4:::0;51302:7:::3;:13::i;:::-;-1:-1:-1::0;;;;;51302:27:0::3;;51280:117;;;;-1:-1:-1::0;;;51280:117:0::3;;;;;;;:::i;:::-;51408:15;51426:25;:15;:23;:25::i;:::-;51408:43;;51462:27;:15;:25;:27::i;:::-;51500:30;51510:10;51522:7;51500:9;:30::i;29498:164::-:0;-1:-1:-1;;;;;29619:25:0;;;29595:4;29619:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29498:164::o;48719:201::-;48041:12;:10;:12::i;:::-;-1:-1:-1;;;;;48030:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;48030:23:0;;48022:68;;;;-1:-1:-1;;;48022:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48808:22:0;::::1;48800:73;;;;-1:-1:-1::0;;;48800:73:0::1;;;;;;;:::i;:::-;48884:28;48903:8;48884:18;:28::i;14938:157::-:0;-1:-1:-1;;;;;;15047:40:0;;-1:-1:-1;;;15047:40:0;14938:157;;;:::o;32233:127::-;32298:4;32322:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32322:16:0;:30;;;32233:127::o;22536:98::-;22616:10;22536:98;:::o;36379:174::-;36454:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;36454:29:0;-1:-1:-1;;;;;36454:29:0;;;;;;;;:24;;36508:23;36454:24;36508:14;:23::i;:::-;-1:-1:-1;;;;;36499:46:0;;;;;;;;;;;36379:174;;:::o;32527:348::-;32620:4;32645:16;32653:7;32645;:16::i;:::-;32637:73;;;;-1:-1:-1;;;32637:73:0;;;;;;;:::i;:::-;32721:13;32737:23;32752:7;32737:14;:23::i;:::-;32721:39;;32790:5;-1:-1:-1;;;;;32779:16:0;:7;-1:-1:-1;;;;;32779:16:0;;:51;;;;32823:7;-1:-1:-1;;;;;32799:31:0;:20;32811:7;32799:11;:20::i;:::-;-1:-1:-1;;;;;32799:31:0;;32779:51;:87;;;;32834:32;32851:5;32858:7;32834:16;:32::i;:::-;32771:96;32527:348;-1:-1:-1;;;;32527:348:0:o;35636:625::-;35795:4;-1:-1:-1;;;;;35768:31:0;:23;35783:7;35768:14;:23::i;:::-;-1:-1:-1;;;;;35768:31:0;;35760:81;;;;-1:-1:-1;;;35760:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35860:16:0;;35852:65;;;;-1:-1:-1;;;35852:65:0;;;;;;;:::i;:::-;35930:39;35951:4;35957:2;35961:7;35930:20;:39::i;:::-;36034:29;36051:1;36055:7;36034:8;:29::i;:::-;-1:-1:-1;;;;;36076:15:0;;;;;;:9;:15;;;;;:20;;36095:1;;36076:15;:20;;36095:1;;36076:20;:::i;:::-;;;;-1:-1:-1;;;;;;;36107:13:0;;;;;;:9;:13;;;;;:18;;36124:1;;36107:13;:18;;36124:1;;36107:18;:::i;:::-;;;;-1:-1:-1;;36136:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36136:21:0;-1:-1:-1;;;;;36136:21:0;;;;;;;;;36175:27;;36136:16;;36175:27;;;;;;;36215:38;36235:4;36241:2;36245:7;36215:19;:38::i;24941:120::-;24485:8;:6;:8::i;:::-;24477:41;;;;-1:-1:-1;;;24477:41:0;;;;;;;:::i;:::-;25000:7:::1;:15:::0;;-1:-1:-1;;25000:15:0::1;::::0;;25031:22:::1;25040:12;:10;:12::i;:::-;25031:22;;;;;;:::i;:::-;;;;;;;;24941:120::o:0;49080:191::-;49154:16;49173:6;;-1:-1:-1;;;;;49190:17:0;;;-1:-1:-1;;;;;;49190:17:0;;;;;;49223:40;;49173:6;;;;;;;49223:40;;49154:16;49223:40;49080:191;;:::o;24682:118::-;24208:8;:6;:8::i;:::-;24207:9;24199:38;;;;-1:-1:-1;;;24199:38:0;;;;;;;:::i;:::-;24742:7:::1;:14:::0;;-1:-1:-1;;24742:14:0::1;24752:4;24742:14;::::0;;24772:20:::1;24779:12;:10;:12::i;36695:315::-:0;36850:8;-1:-1:-1;;;;;36841:17:0;:5;-1:-1:-1;;;;;36841:17:0;;;36833:55;;;;-1:-1:-1;;;36833:55:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36899:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;:46;;-1:-1:-1;;36899:46:0;;;;;;;36961:41;;;;;36899:46;;36961:41;:::i;:::-;;;;;;;;36695:315;;;:::o;31605:::-;31762:28;31772:4;31778:2;31782:7;31762:9;:28::i;:::-;31809:48;31832:4;31838:2;31842:7;31851:5;31809:22;:48::i;:::-;31801:111;;;;-1:-1:-1;;;31801:111:0;;;;;;;:::i;51839:100::-;51891:13;51924:7;51917:14;;;;;:::i;1863:723::-;1919:13;2140:10;2136:53;;-1:-1:-1;2167:10:0;;;;;;;;;;;;-1:-1:-1;;;2167:10:0;;;;;;2136:53;2214:5;2199:12;2255:78;2262:9;;2255:78;;2288:8;;;;:::i;:::-;;-1:-1:-1;2311:10:0;;-1:-1:-1;2319:2:0;2311:10;;:::i;:::-;;;2255:78;;;2343:19;2375:6;2365:17;;;;;;-1:-1:-1;;;2365:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2365:17:0;;2343:39;;2393:154;2400:10;;2393:154;;2427:11;2437:1;2427:11;;:::i;:::-;;-1:-1:-1;2496:10:0;2504:2;2496:5;:10;:::i;:::-;2483:24;;:2;:24;:::i;:::-;2470:39;;2453:6;2460;2453:14;;;;;;-1:-1:-1;;;2453:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;2453:56:0;;;;;;;;-1:-1:-1;2524:11:0;2533:2;2524:11;;:::i;:::-;;;2393:154;;905:114;997:14;;905:114::o;1027:127::-;1116:19;;1134:1;1116:19;;;1027:127::o;33217:110::-;33293:26;33303:2;33307:7;33293:26;;;;;;;;;;;;:9;:26::i;37575:799::-;37730:4;37751:15;:2;-1:-1:-1;;;;;37751:13:0;;:15::i;:::-;37747:620;;;37803:2;-1:-1:-1;;;;;37787:36:0;;37824:12;:10;:12::i;:::-;37838:4;37844:7;37853:5;37787:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37787:72:0;;;;;;;;-1:-1:-1;;37787:72:0;;;;;;;;;;;;:::i;:::-;;;37783:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38029:13:0;;38025:272;;38072:60;;-1:-1:-1;;;38072:60:0;;;;;;;:::i;38025:272::-;38247:6;38241:13;38232:6;38228:2;38224:15;38217:38;37783:529;-1:-1:-1;;;;;;37910:51:0;-1:-1:-1;;;37910:51:0;;-1:-1:-1;37903:58:0;;37747:620;-1:-1:-1;38351:4:0;37575:799;;;;;;:::o;33554:321::-;33684:18;33690:2;33694:7;33684:5;:18::i;:::-;33735:54;33766:1;33770:2;33774:7;33783:5;33735:22;:54::i;:::-;33713:154;;;;-1:-1:-1;;;33713:154:0;;;;;;;:::i;4855:326::-;-1:-1:-1;;;;;5150:19:0;;:23;;;4855:326::o;34211:439::-;-1:-1:-1;;;;;34291:16:0;;34283:61;;;;-1:-1:-1;;;34283:61:0;;;;;;;:::i;:::-;34364:16;34372:7;34364;:16::i;:::-;34363:17;34355:58;;;;-1:-1:-1;;;34355:58:0;;;;;;;:::i;:::-;34426:45;34455:1;34459:2;34463:7;34426:20;:45::i;:::-;-1:-1:-1;;;;;34484:13:0;;;;;;:9;:13;;;;;:18;;34501:1;;34484:13;:18;;34501:1;;34484:18;:::i;:::-;;;;-1:-1:-1;;34513:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34513:21:0;-1:-1:-1;;;;;34513:21:0;;;;;;;;34552:33;;34513:16;;;34552:33;;34513:16;;34552:33;34598:44;34626:1;34630:2;34634:7;34598:19;:44::i;-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:259::-;;764:2;752:9;743:7;739:23;735:32;732:2;;;785:6;777;770:22;732:2;829:9;816:23;848:33;875:5;848:33;:::i;916:263::-;;1039:2;1027:9;1018:7;1014:23;1010:32;1007:2;;;1060:6;1052;1045:22;1007:2;1097:9;1091:16;1116:33;1143:5;1116:33;:::i;1184:402::-;;;1313:2;1301:9;1292:7;1288:23;1284:32;1281:2;;;1334:6;1326;1319:22;1281:2;1378:9;1365:23;1397:33;1424:5;1397:33;:::i;:::-;1449:5;-1:-1:-1;1506:2:1;1491:18;;1478:32;1519:35;1478:32;1519:35;:::i;:::-;1573:7;1563:17;;;1271:315;;;;;:::o;1591:470::-;;;;1737:2;1725:9;1716:7;1712:23;1708:32;1705:2;;;1758:6;1750;1743:22;1705:2;1802:9;1789:23;1821:33;1848:5;1821:33;:::i;:::-;1873:5;-1:-1:-1;1930:2:1;1915:18;;1902:32;1943:35;1902:32;1943:35;:::i;:::-;1695:366;;1997:7;;-1:-1:-1;;;2051:2:1;2036:18;;;;2023:32;;1695:366::o;2066:830::-;;;;;2238:3;2226:9;2217:7;2213:23;2209:33;2206:2;;;2260:6;2252;2245:22;2206:2;2304:9;2291:23;2323:33;2350:5;2323:33;:::i;:::-;2375:5;-1:-1:-1;2432:2:1;2417:18;;2404:32;2445:35;2404:32;2445:35;:::i;:::-;2499:7;-1:-1:-1;2553:2:1;2538:18;;2525:32;;-1:-1:-1;2608:2:1;2593:18;;2580:32;2635:18;2624:30;;2621:2;;;2672:6;2664;2657:22;2621:2;2700:22;;2753:4;2745:13;;2741:27;-1:-1:-1;2731:2:1;;2787:6;2779;2772:22;2731:2;2815:75;2882:7;2877:2;2864:16;2859:2;2855;2851:11;2815:75;:::i;:::-;2805:85;;;2196:700;;;;;;;:::o;2901:438::-;;;3027:2;3015:9;3006:7;3002:23;2998:32;2995:2;;;3048:6;3040;3033:22;2995:2;3092:9;3079:23;3111:33;3138:5;3111:33;:::i;:::-;3163:5;-1:-1:-1;3220:2:1;3205:18;;3192:32;3262:15;;3255:23;3243:36;;3233:2;;3298:6;3290;3283:22;3344:327;;;3473:2;3461:9;3452:7;3448:23;3444:32;3441:2;;;3494:6;3486;3479:22;3441:2;3538:9;3525:23;3557:33;3584:5;3557:33;:::i;:::-;3609:5;3661:2;3646:18;;;;3633:32;;-1:-1:-1;;;3431:240:1:o;3676:190::-;;3788:2;3776:9;3767:7;3763:23;3759:32;3756:2;;;3809:6;3801;3794:22;3756:2;-1:-1:-1;3837:23:1;;3746:120;-1:-1:-1;3746:120:1:o;3871:257::-;;3982:2;3970:9;3961:7;3957:23;3953:32;3950:2;;;4003:6;3995;3988:22;3950:2;4047:9;4034:23;4066:32;4092:5;4066:32;:::i;4133:261::-;;4255:2;4243:9;4234:7;4230:23;4226:32;4223:2;;;4276:6;4268;4261:22;4223:2;4313:9;4307:16;4332:32;4358:5;4332:32;:::i;4684:482::-;;4806:2;4794:9;4785:7;4781:23;4777:32;4774:2;;;4827:6;4819;4812:22;4774:2;4872:9;4859:23;4905:18;4897:6;4894:30;4891:2;;;4942:6;4934;4927:22;4891:2;4970:22;;5023:4;5015:13;;5011:27;-1:-1:-1;5001:2:1;;5057:6;5049;5042:22;5001:2;5085:75;5152:7;5147:2;5134:16;5129:2;5125;5121:11;5085:75;:::i;5366:259::-;;5447:5;5441:12;5474:6;5469:3;5462:19;5490:63;5546:6;5539:4;5534:3;5530:14;5523:4;5516:5;5512:16;5490:63;:::i;:::-;5607:2;5586:15;-1:-1:-1;;5582:29:1;5573:39;;;;5614:4;5569:50;;5417:208;-1:-1:-1;;5417:208:1:o;5630:470::-;;5847:6;5841:13;5863:53;5909:6;5904:3;5897:4;5889:6;5885:17;5863:53;:::i;:::-;5979:13;;5938:16;;;;6001:57;5979:13;5938:16;6035:4;6023:17;;6001:57;:::i;:::-;6074:20;;5817:283;-1:-1:-1;;;;5817:283:1:o;6105:205::-;6305:3;6296:14::o;6315:203::-;-1:-1:-1;;;;;6479:32:1;;;;6461:51;;6449:2;6434:18;;6416:102::o;6523:490::-;-1:-1:-1;;;;;6792:15:1;;;6774:34;;6844:15;;6839:2;6824:18;;6817:43;6891:2;6876:18;;6869:34;;;6939:3;6934:2;6919:18;;6912:31;;;6523:490;;6960:47;;6987:19;;6979:6;6960:47;:::i;:::-;6952:55;6726:287;-1:-1:-1;;;;;;6726:287:1:o;7018:187::-;7183:14;;7176:22;7158:41;;7146:2;7131:18;;7113:92::o;7210:177::-;7356:25;;;7344:2;7329:18;;7311:76::o;7392:221::-;;7541:2;7530:9;7523:21;7561:46;7603:2;7592:9;7588:18;7580:6;7561:46;:::i;7618:344::-;7820:2;7802:21;;;7859:2;7839:18;;;7832:30;-1:-1:-1;;;7893:2:1;7878:18;;7871:50;7953:2;7938:18;;7792:170::o;7967:414::-;8169:2;8151:21;;;8208:2;8188:18;;;8181:30;8247:34;8242:2;8227:18;;8220:62;-1:-1:-1;;;8313:2:1;8298:18;;8291:48;8371:3;8356:19;;8141:240::o;8386:402::-;8588:2;8570:21;;;8627:2;8607:18;;;8600:30;8666:34;8661:2;8646:18;;8639:62;-1:-1:-1;;;8732:2:1;8717:18;;8710:36;8778:3;8763:19;;8560:228::o;8793:401::-;8995:2;8977:21;;;9034:2;9014:18;;;9007:30;9073:34;9068:2;9053:18;;9046:62;-1:-1:-1;;;9139:2:1;9124:18;;9117:35;9184:3;9169:19;;8967:227::o;9199:352::-;9401:2;9383:21;;;9440:2;9420:18;;;9413:30;9479;9474:2;9459:18;;9452:58;9542:2;9527:18;;9373:178::o;9556:400::-;9758:2;9740:21;;;9797:2;9777:18;;;9770:30;9836:34;9831:2;9816:18;;9809:62;-1:-1:-1;;;9902:2:1;9887:18;;9880:34;9946:3;9931:19;;9730:226::o;9961:349::-;10163:2;10145:21;;;10202:2;10182:18;;;10175:30;10241:27;10236:2;10221:18;;10214:55;10301:2;10286:18;;10135:175::o;10315:408::-;10517:2;10499:21;;;10556:2;10536:18;;;10529:30;10595:34;10590:2;10575:18;;10568:62;-1:-1:-1;;;10661:2:1;10646:18;;10639:42;10713:3;10698:19;;10489:234::o;10728:354::-;10930:2;10912:21;;;10969:2;10949:18;;;10942:30;11008:32;11003:2;10988:18;;10981:60;11073:2;11058:18;;10902:180::o;11087:340::-;11289:2;11271:21;;;11328:2;11308:18;;;11301:30;-1:-1:-1;;;11362:2:1;11347:18;;11340:46;11418:2;11403:18;;11261:166::o;11432:420::-;11634:2;11616:21;;;11673:2;11653:18;;;11646:30;11712:34;11707:2;11692:18;;11685:62;11783:26;11778:2;11763:18;;11756:54;11842:3;11827:19;;11606:246::o;11857:406::-;12059:2;12041:21;;;12098:2;12078:18;;;12071:30;12137:34;12132:2;12117:18;;12110:62;-1:-1:-1;;;12203:2:1;12188:18;;12181:40;12253:3;12238:19;;12031:232::o;12268:405::-;12470:2;12452:21;;;12509:2;12489:18;;;12482:30;12548:34;12543:2;12528:18;;12521:62;-1:-1:-1;;;12614:2:1;12599:18;;12592:39;12663:3;12648:19;;12442:231::o;12678:349::-;12880:2;12862:21;;;12919:2;12899:18;;;12892:30;12958:27;12953:2;12938:18;;12931:55;13018:2;13003:18;;12852:175::o;13032:356::-;13234:2;13216:21;;;13253:18;;;13246:30;13312:34;13307:2;13292:18;;13285:62;13379:2;13364:18;;13206:182::o;13393:408::-;13595:2;13577:21;;;13634:2;13614:18;;;13607:30;13673:34;13668:2;13653:18;;13646:62;-1:-1:-1;;;13739:2:1;13724:18;;13717:42;13791:3;13776:19;;13567:234::o;13806:356::-;14008:2;13990:21;;;14027:18;;;14020:30;14086:34;14081:2;14066:18;;14059:62;14153:2;14138:18;;13980:182::o;14167:411::-;14369:2;14351:21;;;14408:2;14388:18;;;14381:30;14447:34;14442:2;14427:18;;14420:62;-1:-1:-1;;;14513:2:1;14498:18;;14491:45;14568:3;14553:19;;14341:237::o;14583:397::-;14785:2;14767:21;;;14824:2;14804:18;;;14797:30;14863:34;14858:2;14843:18;;14836:62;-1:-1:-1;;;14929:2:1;14914:18;;14907:31;14970:3;14955:19;;14757:223::o;14985:413::-;15187:2;15169:21;;;15226:2;15206:18;;;15199:30;15265:34;15260:2;15245:18;;15238:62;-1:-1:-1;;;15331:2:1;15316:18;;15309:47;15388:3;15373:19;;15159:239::o;15403:404::-;15605:2;15587:21;;;15644:2;15624:18;;;15617:30;15683:34;15678:2;15663:18;;15656:62;-1:-1:-1;;;15749:2:1;15734:18;;15727:38;15797:3;15782:19;;15577:230::o;15812:356::-;16014:2;15996:21;;;16033:18;;;16026:30;16092:34;16087:2;16072:18;;16065:62;16159:2;16144:18;;15986:182::o;16355:128::-;;16426:1;16422:6;16419:1;16416:13;16413:2;;;16432:18;;:::i;:::-;-1:-1:-1;16468:9:1;;16403:80::o;16488:120::-;;16554:1;16544:2;;16559:18;;:::i;:::-;-1:-1:-1;16593:9:1;;16534:74::o;16613:125::-;;16681:1;16678;16675:8;16672:2;;;16686:18;;:::i;:::-;-1:-1:-1;16723:9:1;;16662:76::o;16743:258::-;16815:1;16825:113;16839:6;16836:1;16833:13;16825:113;;;16915:11;;;16909:18;16896:11;;;16889:39;16861:2;16854:10;16825:113;;;16956:6;16953:1;16950:13;16947:2;;;-1:-1:-1;;16991:1:1;16973:16;;16966:27;16796:205::o;17006:380::-;17091:1;17081:12;;17138:1;17128:12;;;17149:2;;17203:4;17195:6;17191:17;17181:27;;17149:2;17256;17248:6;17245:14;17225:18;17222:38;17219:2;;;17302:10;17297:3;17293:20;17290:1;17283:31;17337:4;17334:1;17327:15;17365:4;17362:1;17355:15;17219:2;;17061:325;;;:::o;17391:135::-;;-1:-1:-1;;17451:17:1;;17448:2;;;17471:18;;:::i;:::-;-1:-1:-1;17518:1:1;17507:13;;17438:88::o;17531:112::-;;17589:1;17579:2;;17594:18;;:::i;:::-;-1:-1:-1;17628:9:1;;17569:74::o;17648:127::-;17709:10;17704:3;17700:20;17697:1;17690:31;17740:4;17737:1;17730:15;17764:4;17761:1;17754:15;17780:127;17841:10;17836:3;17832:20;17829:1;17822:31;17872:4;17869:1;17862:15;17896:4;17893:1;17886:15;17912:127;17973:10;17968:3;17964:20;17961:1;17954:31;18004:4;18001:1;17994:15;18028:4;18025:1;18018:15;18044:133;-1:-1:-1;;;;;18121:31:1;;18111:42;;18101:2;;18167:1;18164;18157:12;18182:133;-1:-1:-1;;;;;;18258:32:1;;18248:43;;18238:2;;18305:1;18302;18295:12
Swarm Source
ipfs://94687640d37033c2994f1818e8c3c3538e174fabeb30f6499975cd90be033a3c
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.