Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
10,000 SKULLIES
Holders
1,034
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
6 SKULLIESLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
SKULLIESCLUB
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-30 */ // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts 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/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.1; /** * @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: https://github.com/chiru-labs/ERC721A/blob/v3.1.0/contracts/ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @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 override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); 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 override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _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 { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev This is equivalent to _burn(tokenId, false) */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: contract.sol pragma solidity 0.8.4; contract SKULLIESCLUB is ERC721A, Ownable { uint16 public constant MAX_SUPPLY = 10000; uint8 public constant MAX_PER_WALLET = 10; bool private revealed = false; string private baseUri = "https://ipfs.io/ipfs/QmX72c2t9HtpVAuMvYL4JuTPnNUTucdZ627TvhDwgMve2f/"; uint96 private royaltyBasisPoints = 750; constructor() ERC721A("Skullies Club", "SKULLIES") {} function soldOut() external view returns (bool) { return totalSupply() == MAX_SUPPLY; } function numberMinted(address owner) external view returns (uint256) { return _numberMinted(owner); } function mint(uint256 _quantity) external { require(_quantity > 0, "INCORRECT_QUANTITY"); require(_numberMinted(msg.sender) + _quantity <= MAX_PER_WALLET, "INCORRECT_QUANTITY"); require(totalSupply() + _quantity <= MAX_SUPPLY, "SALE_MAXED"); _safeMint(msg.sender, _quantity); } function devMint(uint256 _quantity) external onlyOwner { require(_quantity > 0, "INCORRECT_QUANTITY"); require(totalSupply() + _quantity <= MAX_SUPPLY, "SALE_MAXED"); _safeMint(msg.sender, _quantity); } function _startTokenId() internal view virtual override returns (uint256) { return 1; } function setBaseUri(string calldata _baseUri) external onlyOwner { baseUri = _baseUri; } function reveal(string calldata _baseUri) external onlyOwner { revealed = true; baseUri = _baseUri; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory filename = revealed ? Strings.toString(tokenId) : "hidden"; return bytes(baseUri).length != 0 ? string(abi.encodePacked(baseUri, filename, ".json")) : ''; } function setRoyalty(uint96 _royaltyBasisPoints) external onlyOwner { royaltyBasisPoints = _royaltyBasisPoints; } function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount) { require(_exists(_tokenId), "Cannot query non-existent token"); return (owner(), (_salePrice * royaltyBasisPoints) / 10000); } function transferFunds() external onlyOwner { payable(owner()).transfer(address(this).balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_WALLET","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"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":"uint96","name":"_royaltyBasisPoints","type":"uint96"}],"name":"setRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"soldOut","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6008805460ff60a01b19169055610100604052604460808181529062001d0c60a0398051620000379160099160209091019062000130565b50600a80546001600160601b0319166102ee1790553480156200005957600080fd5b50604080518082018252600d81526c29b5bab63634b2b99021b63ab160991b602080830191825283518085019094526008845267534b554c4c49455360c01b908401528151919291620000af9160029162000130565b508051620000c590600390602084019062000130565b5050600160005550620000d833620000de565b62000213565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200013e90620001d6565b90600052602060002090601f016020900481019282620001625760008555620001ad565b82601f106200017d57805160ff1916838001178555620001ad565b82800160010185558215620001ad579182015b82811115620001ad57825182559160200191906001019062000190565b50620001bb929150620001bf565b5090565b5b80821115620001bb5760008155600101620001c0565b600181811c90821680620001eb57607f821691505b602082108114156200020d57634e487b7160e01b600052602260045260246000fd5b50919050565b611ae980620002236000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a22cb46511610097578063cac9266911610071578063cac92669146103ca578063dc33e681146103dd578063e985e9c5146103f0578063f2fde38b1461042c57600080fd5b8063a22cb46514610391578063b88d4fde146103a4578063c87b56dd146103b757600080fd5b80638da5cb5b116100d35780638da5cb5b1461035257806395d89b4114610363578063a0712d681461036b578063a0bcfc7f1461037e57600080fd5b806370a082311461032f578063715018a614610342578063893da6c91461034a57600080fd5b80632a55205a116101665780633c68eb81116101405780633c68eb81146102ee57806342842e0e146102f65780634c261247146103095780636352211e1461031c57600080fd5b80632a55205a1461028d57806332cb6b0c146102bf578063375a069a146102db57600080fd5b8063095ea7b3116101a2578063095ea7b3146102315780630f2cdd6c1461024657806318160ddd1461026057806323b872dd1461027a57600080fd5b806301ffc9a7146101c957806306fdde03146101f1578063081812fc14610206575b600080fd5b6101dc6101d73660046116ab565b61043f565b60405190151581526020015b60405180910390f35b6101f9610491565b6040516101e891906118ef565b610219610214366004611750565b610523565b6040516001600160a01b0390911681526020016101e8565b61024461023f366004611682565b610567565b005b61024e600a81565b60405160ff90911681526020016101e8565b60015460005403600019015b6040519081526020016101e8565b610244610288366004611538565b6105f5565b6102a061029b366004611768565b610600565b604080516001600160a01b0390931683526020830191909152016101e8565b6102c861271081565b60405161ffff90911681526020016101e8565b6102446102e9366004611750565b610698565b610244610745565b610244610304366004611538565b6107a8565b6102446103173660046116e3565b6107c3565b61021961032a366004611750565b61080c565b61026c61033d3660046114ec565b61081e565b61024461086d565b6101dc6108a3565b6008546001600160a01b0316610219565b6101f96108c1565b610244610379366004611750565b6108d0565b61024461038c3660046116e3565b61093e565b61024461039f366004611648565b610974565b6102446103b2366004611573565b610a0a565b6101f96103c5366004611750565b610a5b565b6102446103d8366004611789565b610b1b565b61026c6103eb3660046114ec565b610b6c565b6101dc6103fe366004611506565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b61024461043a3660046114ec565b610b9b565b60006001600160e01b031982166380ac58cd60e01b148061047057506001600160e01b03198216635b5e139f60e01b145b8061048b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600280546104a0906119f1565b80601f01602080910402602001604051908101604052809291908181526020018280546104cc906119f1565b80156105195780601f106104ee57610100808354040283529160200191610519565b820191906000526020600020905b8154815290600101906020018083116104fc57829003601f168201915b5050505050905090565b600061052e82610c33565b61054b576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006105728261080c565b9050806001600160a01b0316836001600160a01b031614156105a75760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906105c757506105c581336103fe565b155b156105e5576040516367d9dca160e11b815260040160405180910390fd5b6105f0838383610c6c565b505050565b6105f0838383610cc8565b60008061060c84610c33565b61065d5760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e0060448201526064015b60405180910390fd5b6008546001600160a01b0316600a5461271090610683906001600160601b03168661198f565b61068d919061197b565b915091509250929050565b6008546001600160a01b031633146106c25760405162461bcd60e51b815260040161065490611902565b600081116106e25760405162461bcd60e51b815260040161065490611937565b60015460005461271091839103600019016106fd9190611963565b11156107385760405162461bcd60e51b815260206004820152600a60248201526914d0531157d35056115160b21b6044820152606401610654565b6107423382610eb8565b50565b6008546001600160a01b0316331461076f5760405162461bcd60e51b815260040161065490611902565b6008546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610742573d6000803e3d6000fd5b6105f083838360405180602001604052806000815250610a0a565b6008546001600160a01b031633146107ed5760405162461bcd60e51b815260040161065490611902565b6008805460ff60a01b1916600160a01b1790556105f060098383611437565b600061081782610ed6565b5192915050565b60006001600160a01b038216610847576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b031633146108975760405162461bcd60e51b815260040161065490611902565b6108a16000610fff565b565b60006127106108bb6001546000546000199190030190565b14905090565b6060600380546104a0906119f1565b600081116108f05760405162461bcd60e51b815260040161065490611937565b33600090815260056020526040902054600a908290600160401b900467ffffffffffffffff166109209190611963565b11156106e25760405162461bcd60e51b815260040161065490611937565b6008546001600160a01b031633146109685760405162461bcd60e51b815260040161065490611902565b6105f060098383611437565b6001600160a01b03821633141561099e5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610a15848484610cc8565b6001600160a01b0383163b15158015610a375750610a3584848484611051565b155b15610a55576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610a6682610c33565b610a8357604051630a14c4b560e41b815260040160405180910390fd5b600854600090600160a01b900460ff16610abb57604051806040016040528060068152602001653434b23232b760d11b815250610ac4565b610ac483611149565b905060098054610ad3906119f1565b15159050610af05760405180602001604052806000815250610b14565b600981604051602001610b049291906117f8565b6040516020818303038152906040525b9392505050565b6008546001600160a01b03163314610b455760405162461bcd60e51b815260040161065490611902565b600a80546bffffffffffffffffffffffff19166001600160601b0392909216919091179055565b6001600160a01b038116600090815260056020526040812054600160401b900467ffffffffffffffff1661048b565b6008546001600160a01b03163314610bc55760405162461bcd60e51b815260040161065490611902565b6001600160a01b038116610c2a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610654565b61074281610fff565b600081600111158015610c47575060005482105b801561048b575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000610cd382610ed6565b9050836001600160a01b031681600001516001600160a01b031614610d0a5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480610d285750610d2885336103fe565b80610d43575033610d3884610523565b6001600160a01b0316145b905080610d6357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416610d8a57604051633a954ecd60e21b815260040160405180910390fd5b610d9660008487610c6c565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116610e6c576000548214610e6c578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b610ed2828260405180602001604052806000815250611263565b5050565b60408051606081018252600080825260208201819052918101919091528180600111158015610f06575060005481105b15610fe657600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff16151591810182905290610fe45780516001600160a01b031615610f7a579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215610fdf579392505050565b610f7a565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906110869033908990889088906004016118b2565b602060405180830381600087803b1580156110a057600080fd5b505af19250505080156110d0575060408051601f3d908101601f191682019092526110cd918101906116c7565b60015b61112b573d8080156110fe576040519150601f19603f3d011682016040523d82523d6000602084013e611103565b606091505b508051611123576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60608161116d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611197578061118181611a2c565b91506111909050600a8361197b565b9150611171565b60008167ffffffffffffffff8111156111c057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156111ea576020820181803683370190505b5090505b8415611141576111ff6001836119ae565b915061120c600a86611a47565b611217906030611963565b60f81b81838151811061123a57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061125c600a8661197b565b94506111ee565b6105f083838360016000546001600160a01b03851661129457604051622e076360e81b815260040160405180910390fd5b836112b25760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561135f57506001600160a01b0387163b15155b156113e8575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46113b06000888480600101955088611051565b6113cd576040516368d2bf6b60e11b815260040160405180910390fd5b808214156113655782600054146113e357600080fd5b61142e565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808214156113e9575b50600055610eb1565b828054611443906119f1565b90600052602060002090601f01602090048101928261146557600085556114ab565b82601f1061147e5782800160ff198235161785556114ab565b828001600101855582156114ab579182015b828111156114ab578235825591602001919060010190611490565b506114b79291506114bb565b5090565b5b808211156114b757600081556001016114bc565b80356001600160a01b03811681146114e757600080fd5b919050565b6000602082840312156114fd578081fd5b610b14826114d0565b60008060408385031215611518578081fd5b611521836114d0565b915061152f602084016114d0565b90509250929050565b60008060006060848603121561154c578081fd5b611555846114d0565b9250611563602085016114d0565b9150604084013590509250925092565b60008060008060808587031215611588578081fd5b611591856114d0565b935061159f602086016114d0565b925060408501359150606085013567ffffffffffffffff808211156115c2578283fd5b818701915087601f8301126115d5578283fd5b8135818111156115e7576115e7611a87565b604051601f8201601f19908116603f0116810190838211818310171561160f5761160f611a87565b816040528281528a6020848701011115611627578586fd5b82602086016020830137918201602001949094529598949750929550505050565b6000806040838503121561165a578182fd5b611663836114d0565b915060208301358015158114611677578182fd5b809150509250929050565b60008060408385031215611694578182fd5b61169d836114d0565b946020939093013593505050565b6000602082840312156116bc578081fd5b8135610b1481611a9d565b6000602082840312156116d8578081fd5b8151610b1481611a9d565b600080602083850312156116f5578182fd5b823567ffffffffffffffff8082111561170c578384fd5b818501915085601f83011261171f578384fd5b81358181111561172d578485fd5b86602082850101111561173e578485fd5b60209290920196919550909350505050565b600060208284031215611761578081fd5b5035919050565b6000806040838503121561177a578182fd5b50508035926020909101359150565b60006020828403121561179a578081fd5b81356001600160601b0381168114610b14578182fd5b600081518084526117c88160208601602086016119c5565b601f01601f19169290920160200192915050565b600081516117ee8185602086016119c5565b9290920192915050565b600080845482600182811c91508083168061181457607f831692505b602080841082141561183457634e487b7160e01b87526022600452602487fd5b818015611848576001811461185957611885565b60ff19861689528489019650611885565b60008b815260209020885b8681101561187d5781548b820152908501908301611864565b505084890196505b5050505050506118a961189882866117dc565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906118e5908301846117b0565b9695505050505050565b602081526000610b1460208301846117b0565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260129082015271494e434f52524543545f5155414e5449545960701b604082015260600190565b6000821982111561197657611976611a5b565b500190565b60008261198a5761198a611a71565b500490565b60008160001904831182151516156119a9576119a9611a5b565b500290565b6000828210156119c0576119c0611a5b565b500390565b60005b838110156119e05781810151838201526020016119c8565b83811115610a555750506000910152565b600181811c90821680611a0557607f821691505b60208210811415611a2657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611a4057611a40611a5b565b5060010190565b600082611a5657611a56611a71565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461074257600080fdfea264697066735822122002d58603ef69990de9daece46008392dc805a3f0c4368c88f941dfbf556957f364736f6c6343000804003368747470733a2f2f697066732e696f2f697066732f516d583732633274394874705641754d76594c344a7554506e4e55547563645a3632375476684477674d766532662f
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a22cb46511610097578063cac9266911610071578063cac92669146103ca578063dc33e681146103dd578063e985e9c5146103f0578063f2fde38b1461042c57600080fd5b8063a22cb46514610391578063b88d4fde146103a4578063c87b56dd146103b757600080fd5b80638da5cb5b116100d35780638da5cb5b1461035257806395d89b4114610363578063a0712d681461036b578063a0bcfc7f1461037e57600080fd5b806370a082311461032f578063715018a614610342578063893da6c91461034a57600080fd5b80632a55205a116101665780633c68eb81116101405780633c68eb81146102ee57806342842e0e146102f65780634c261247146103095780636352211e1461031c57600080fd5b80632a55205a1461028d57806332cb6b0c146102bf578063375a069a146102db57600080fd5b8063095ea7b3116101a2578063095ea7b3146102315780630f2cdd6c1461024657806318160ddd1461026057806323b872dd1461027a57600080fd5b806301ffc9a7146101c957806306fdde03146101f1578063081812fc14610206575b600080fd5b6101dc6101d73660046116ab565b61043f565b60405190151581526020015b60405180910390f35b6101f9610491565b6040516101e891906118ef565b610219610214366004611750565b610523565b6040516001600160a01b0390911681526020016101e8565b61024461023f366004611682565b610567565b005b61024e600a81565b60405160ff90911681526020016101e8565b60015460005403600019015b6040519081526020016101e8565b610244610288366004611538565b6105f5565b6102a061029b366004611768565b610600565b604080516001600160a01b0390931683526020830191909152016101e8565b6102c861271081565b60405161ffff90911681526020016101e8565b6102446102e9366004611750565b610698565b610244610745565b610244610304366004611538565b6107a8565b6102446103173660046116e3565b6107c3565b61021961032a366004611750565b61080c565b61026c61033d3660046114ec565b61081e565b61024461086d565b6101dc6108a3565b6008546001600160a01b0316610219565b6101f96108c1565b610244610379366004611750565b6108d0565b61024461038c3660046116e3565b61093e565b61024461039f366004611648565b610974565b6102446103b2366004611573565b610a0a565b6101f96103c5366004611750565b610a5b565b6102446103d8366004611789565b610b1b565b61026c6103eb3660046114ec565b610b6c565b6101dc6103fe366004611506565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b61024461043a3660046114ec565b610b9b565b60006001600160e01b031982166380ac58cd60e01b148061047057506001600160e01b03198216635b5e139f60e01b145b8061048b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600280546104a0906119f1565b80601f01602080910402602001604051908101604052809291908181526020018280546104cc906119f1565b80156105195780601f106104ee57610100808354040283529160200191610519565b820191906000526020600020905b8154815290600101906020018083116104fc57829003601f168201915b5050505050905090565b600061052e82610c33565b61054b576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006105728261080c565b9050806001600160a01b0316836001600160a01b031614156105a75760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906105c757506105c581336103fe565b155b156105e5576040516367d9dca160e11b815260040160405180910390fd5b6105f0838383610c6c565b505050565b6105f0838383610cc8565b60008061060c84610c33565b61065d5760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e0060448201526064015b60405180910390fd5b6008546001600160a01b0316600a5461271090610683906001600160601b03168661198f565b61068d919061197b565b915091509250929050565b6008546001600160a01b031633146106c25760405162461bcd60e51b815260040161065490611902565b600081116106e25760405162461bcd60e51b815260040161065490611937565b60015460005461271091839103600019016106fd9190611963565b11156107385760405162461bcd60e51b815260206004820152600a60248201526914d0531157d35056115160b21b6044820152606401610654565b6107423382610eb8565b50565b6008546001600160a01b0316331461076f5760405162461bcd60e51b815260040161065490611902565b6008546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015610742573d6000803e3d6000fd5b6105f083838360405180602001604052806000815250610a0a565b6008546001600160a01b031633146107ed5760405162461bcd60e51b815260040161065490611902565b6008805460ff60a01b1916600160a01b1790556105f060098383611437565b600061081782610ed6565b5192915050565b60006001600160a01b038216610847576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b031633146108975760405162461bcd60e51b815260040161065490611902565b6108a16000610fff565b565b60006127106108bb6001546000546000199190030190565b14905090565b6060600380546104a0906119f1565b600081116108f05760405162461bcd60e51b815260040161065490611937565b33600090815260056020526040902054600a908290600160401b900467ffffffffffffffff166109209190611963565b11156106e25760405162461bcd60e51b815260040161065490611937565b6008546001600160a01b031633146109685760405162461bcd60e51b815260040161065490611902565b6105f060098383611437565b6001600160a01b03821633141561099e5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610a15848484610cc8565b6001600160a01b0383163b15158015610a375750610a3584848484611051565b155b15610a55576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610a6682610c33565b610a8357604051630a14c4b560e41b815260040160405180910390fd5b600854600090600160a01b900460ff16610abb57604051806040016040528060068152602001653434b23232b760d11b815250610ac4565b610ac483611149565b905060098054610ad3906119f1565b15159050610af05760405180602001604052806000815250610b14565b600981604051602001610b049291906117f8565b6040516020818303038152906040525b9392505050565b6008546001600160a01b03163314610b455760405162461bcd60e51b815260040161065490611902565b600a80546bffffffffffffffffffffffff19166001600160601b0392909216919091179055565b6001600160a01b038116600090815260056020526040812054600160401b900467ffffffffffffffff1661048b565b6008546001600160a01b03163314610bc55760405162461bcd60e51b815260040161065490611902565b6001600160a01b038116610c2a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610654565b61074281610fff565b600081600111158015610c47575060005482105b801561048b575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000610cd382610ed6565b9050836001600160a01b031681600001516001600160a01b031614610d0a5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480610d285750610d2885336103fe565b80610d43575033610d3884610523565b6001600160a01b0316145b905080610d6357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416610d8a57604051633a954ecd60e21b815260040160405180910390fd5b610d9660008487610c6c565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116610e6c576000548214610e6c578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b610ed2828260405180602001604052806000815250611263565b5050565b60408051606081018252600080825260208201819052918101919091528180600111158015610f06575060005481105b15610fe657600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff16151591810182905290610fe45780516001600160a01b031615610f7a579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215610fdf579392505050565b610f7a565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906110869033908990889088906004016118b2565b602060405180830381600087803b1580156110a057600080fd5b505af19250505080156110d0575060408051601f3d908101601f191682019092526110cd918101906116c7565b60015b61112b573d8080156110fe576040519150601f19603f3d011682016040523d82523d6000602084013e611103565b606091505b508051611123576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60608161116d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611197578061118181611a2c565b91506111909050600a8361197b565b9150611171565b60008167ffffffffffffffff8111156111c057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156111ea576020820181803683370190505b5090505b8415611141576111ff6001836119ae565b915061120c600a86611a47565b611217906030611963565b60f81b81838151811061123a57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061125c600a8661197b565b94506111ee565b6105f083838360016000546001600160a01b03851661129457604051622e076360e81b815260040160405180910390fd5b836112b25760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168c018116918217600160401b67ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b42909216919091021790558080850183801561135f57506001600160a01b0387163b15155b156113e8575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46113b06000888480600101955088611051565b6113cd576040516368d2bf6b60e11b815260040160405180910390fd5b808214156113655782600054146113e357600080fd5b61142e565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808214156113e9575b50600055610eb1565b828054611443906119f1565b90600052602060002090601f01602090048101928261146557600085556114ab565b82601f1061147e5782800160ff198235161785556114ab565b828001600101855582156114ab579182015b828111156114ab578235825591602001919060010190611490565b506114b79291506114bb565b5090565b5b808211156114b757600081556001016114bc565b80356001600160a01b03811681146114e757600080fd5b919050565b6000602082840312156114fd578081fd5b610b14826114d0565b60008060408385031215611518578081fd5b611521836114d0565b915061152f602084016114d0565b90509250929050565b60008060006060848603121561154c578081fd5b611555846114d0565b9250611563602085016114d0565b9150604084013590509250925092565b60008060008060808587031215611588578081fd5b611591856114d0565b935061159f602086016114d0565b925060408501359150606085013567ffffffffffffffff808211156115c2578283fd5b818701915087601f8301126115d5578283fd5b8135818111156115e7576115e7611a87565b604051601f8201601f19908116603f0116810190838211818310171561160f5761160f611a87565b816040528281528a6020848701011115611627578586fd5b82602086016020830137918201602001949094529598949750929550505050565b6000806040838503121561165a578182fd5b611663836114d0565b915060208301358015158114611677578182fd5b809150509250929050565b60008060408385031215611694578182fd5b61169d836114d0565b946020939093013593505050565b6000602082840312156116bc578081fd5b8135610b1481611a9d565b6000602082840312156116d8578081fd5b8151610b1481611a9d565b600080602083850312156116f5578182fd5b823567ffffffffffffffff8082111561170c578384fd5b818501915085601f83011261171f578384fd5b81358181111561172d578485fd5b86602082850101111561173e578485fd5b60209290920196919550909350505050565b600060208284031215611761578081fd5b5035919050565b6000806040838503121561177a578182fd5b50508035926020909101359150565b60006020828403121561179a578081fd5b81356001600160601b0381168114610b14578182fd5b600081518084526117c88160208601602086016119c5565b601f01601f19169290920160200192915050565b600081516117ee8185602086016119c5565b9290920192915050565b600080845482600182811c91508083168061181457607f831692505b602080841082141561183457634e487b7160e01b87526022600452602487fd5b818015611848576001811461185957611885565b60ff19861689528489019650611885565b60008b815260209020885b8681101561187d5781548b820152908501908301611864565b505084890196505b5050505050506118a961189882866117dc565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906118e5908301846117b0565b9695505050505050565b602081526000610b1460208301846117b0565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260129082015271494e434f52524543545f5155414e5449545960701b604082015260600190565b6000821982111561197657611976611a5b565b500190565b60008261198a5761198a611a71565b500490565b60008160001904831182151516156119a9576119a9611a5b565b500290565b6000828210156119c0576119c0611a5b565b500390565b60005b838110156119e05781810151838201526020016119c8565b83811115610a555750506000910152565b600181811c90821680611a0557607f821691505b60208210811415611a2657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611a4057611a40611a5b565b5060010190565b600082611a5657611a56611a71565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461074257600080fdfea264697066735822122002d58603ef69990de9daece46008392dc805a3f0c4368c88f941dfbf556957f364736f6c63430008040033
Deployed Bytecode Sourcemap
44864:2449:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27049:305;;;;;;:::i;:::-;;:::i;:::-;;;7811:14:1;;7804:22;7786:41;;7774:2;7759:18;27049:305:0;;;;;;;;30162:100;;;:::i;:::-;;;;;;;:::i;31665:204::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6830:32:1;;;6812:51;;6800:2;6785:18;31665:204:0;6767:102:1;31228:371:0;;;;;;:::i;:::-;;:::i;:::-;;44961:41;;45000:2;44961:41;;;;;10423:4:1;10411:17;;;10393:36;;10381:2;10366:18;44961:41:0;10348:87:1;26298:303:0;46162:1;26552:12;26342:7;26536:13;:28;-1:-1:-1;;26536:46:0;26298:303;;;10215:25:1;;;10203:2;10188:18;26298:303:0;10170:76:1;32530:170:0;;;;;;:::i;:::-;;:::i;46918:273::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7559:32:1;;;7541:51;;7623:2;7608:18;;7601:34;;;;7514:18;46918:273:0;7496:145:1;44913:41:0;;44949:5;44913:41;;;;;10050:6:1;10038:19;;;10020:38;;10008:2;9993:18;44913:41:0;9975:89:1;45818:244:0;;;;;;:::i;:::-;;:::i;47199:111::-;;;:::i;32771:185::-;;;;;;:::i;:::-;;:::i;46289:124::-;;;;;;:::i;:::-;;:::i;29970:125::-;;;;;;:::i;:::-;;:::i;27418:206::-;;;;;;:::i;:::-;;:::i;4765:103::-;;;:::i;45258:101::-;;;:::i;4114:87::-;4187:6;;-1:-1:-1;;;;;4187:6:0;4114:87;;30331:104;;;:::i;45490:320::-;;;;;;:::i;:::-;;:::i;46179:102::-;;;;;;:::i;:::-;;:::i;31941:287::-;;;;;;:::i;:::-;;:::i;33027:369::-;;;;;;:::i;:::-;;:::i;46421:355::-;;;;;;:::i;:::-;;:::i;46784:126::-;;;;;;:::i;:::-;;:::i;45367:115::-;;;;;;:::i;:::-;;:::i;32299:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;32420:25:0;;;32396:4;32420:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;32299:164;5023:201;;;;;;:::i;:::-;;:::i;27049:305::-;27151:4;-1:-1:-1;;;;;;27188:40:0;;-1:-1:-1;;;27188:40:0;;:105;;-1:-1:-1;;;;;;;27245:48:0;;-1:-1:-1;;;27245:48:0;27188:105;:158;;;-1:-1:-1;;;;;;;;;;17007:40:0;;;27310:36;27168:178;27049:305;-1:-1:-1;;27049:305:0:o;30162:100::-;30216:13;30249:5;30242:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30162:100;:::o;31665:204::-;31733:7;31758:16;31766:7;31758;:16::i;:::-;31753:64;;31783:34;;-1:-1:-1;;;31783:34:0;;;;;;;;;;;31753:64;-1:-1:-1;31837:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;31837:24:0;;31665:204::o;31228:371::-;31301:13;31317:24;31333:7;31317:15;:24::i;:::-;31301:40;;31362:5;-1:-1:-1;;;;;31356:11:0;:2;-1:-1:-1;;;;;31356:11:0;;31352:48;;;31376:24;;-1:-1:-1;;;31376:24:0;;;;;;;;;;;31352:48;2918:10;-1:-1:-1;;;;;31417:21:0;;;;;;:63;;-1:-1:-1;31443:37:0;31460:5;2918:10;32299:164;:::i;31443:37::-;31442:38;31417:63;31413:138;;;31504:35;;-1:-1:-1;;;31504:35:0;;;;;;;;;;;31413:138;31563:28;31572:2;31576:7;31585:5;31563:8;:28::i;:::-;31228:371;;;:::o;32530:170::-;32664:28;32674:4;32680:2;32684:7;32664:9;:28::i;46918:273::-;47000:16;47018:21;47060:17;47068:8;47060:7;:17::i;:::-;47052:61;;;;-1:-1:-1;;;47052:61:0;;9371:2:1;47052:61:0;;;9353:21:1;9410:2;9390:18;;;9383:30;9449:33;9429:18;;;9422:61;9500:18;;47052:61:0;;;;;;;;;4187:6;;-1:-1:-1;;;;;4187:6:0;47155:18;;47177:5;;47142:31;;-1:-1:-1;;;;;47155:18:0;47142:10;:31;:::i;:::-;47141:41;;;;:::i;:::-;47124:59;;;;46918:273;;;;;:::o;45818:244::-;4187:6;;-1:-1:-1;;;;;4187:6:0;2918:10;4334:23;4326:68;;;;-1:-1:-1;;;4326:68:0;;;;;;;:::i;:::-;45904:1:::1;45892:9;:13;45884:44;;;;-1:-1:-1::0;;;45884:44:0::1;;;;;;;:::i;:::-;46162:1:::0;26552:12;26342:7;26536:13;44949:5:::1;::::0;45963:9;;26536:28;-1:-1:-1;;26536:46:0;45947:25:::1;;;;:::i;:::-;:39;;45939:62;;;::::0;-1:-1:-1;;;45939:62:0;;8671:2:1;45939:62:0::1;::::0;::::1;8653:21:1::0;8710:2;8690:18;;;8683:30;-1:-1:-1;;;8729:18:1;;;8722:40;8779:18;;45939:62:0::1;8643:160:1::0;45939:62:0::1;46022:32;46032:10;46044:9;46022;:32::i;:::-;45818:244:::0;:::o;47199:111::-;4187:6;;-1:-1:-1;;;;;4187:6:0;2918:10;4334:23;4326:68;;;;-1:-1:-1;;;4326:68:0;;;;;;;:::i;:::-;4187:6;;47254:48:::1;::::0;-1:-1:-1;;;;;4187:6:0;;;;47280:21:::1;47254:48:::0;::::1;;;::::0;::::1;::::0;;;47280:21;4187:6;47254:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;32771:185:::0;32909:39;32926:4;32932:2;32936:7;32909:39;;;;;;;;;;;;:16;:39::i;46289:124::-;4187:6;;-1:-1:-1;;;;;4187:6:0;2918:10;4334:23;4326:68;;;;-1:-1:-1;;;4326:68:0;;;;;;;:::i;:::-;46361:8:::1;:15:::0;;-1:-1:-1;;;;46361:15:0::1;-1:-1:-1::0;;;46361:15:0::1;::::0;;46387:18:::1;:7;46397:8:::0;;46387:18:::1;:::i;29970:125::-:0;30034:7;30061:21;30074:7;30061:12;:21::i;:::-;:26;;29970:125;-1:-1:-1;;29970:125:0:o;27418:206::-;27482:7;-1:-1:-1;;;;;27506:19:0;;27502:60;;27534:28;;-1:-1:-1;;;27534:28:0;;;;;;;;;;;27502:60;-1:-1:-1;;;;;;27588:19:0;;;;;:12;:19;;;;;:27;;;;27418:206::o;4765:103::-;4187:6;;-1:-1:-1;;;;;4187:6:0;2918:10;4334:23;4326:68;;;;-1:-1:-1;;;4326:68:0;;;;;;;:::i;:::-;4830:30:::1;4857:1;4830:18;:30::i;:::-;4765:103::o:0;45258:101::-;45300:4;44949:5;45324:13;46162:1;26552:12;26342:7;26536:13;-1:-1:-1;;26536:28:0;;;:46;;26298:303;45324:13;:27;45317:34;;45258:101;:::o;30331:104::-;30387:13;30420:7;30413:14;;;;;:::i;45490:320::-;45563:1;45551:9;:13;45543:44;;;;-1:-1:-1;;;45543:44:0;;;;;;;:::i;:::-;45620:10;27767:7;27802:19;;;:12;:19;;;;;:32;45000:2;;45634:9;;-1:-1:-1;;;27802:32:0;;;;45606:37;;;;:::i;:::-;:55;;45598:86;;;;-1:-1:-1;;;45598:86:0;;;;;;;:::i;46179:102::-;4187:6;;-1:-1:-1;;;;;4187:6:0;2918:10;4334:23;4326:68;;;;-1:-1:-1;;;4326:68:0;;;;;;;:::i;:::-;46255:18:::1;:7;46265:8:::0;;46255:18:::1;:::i;31941:287::-:0;-1:-1:-1;;;;;32040:24:0;;2918:10;32040:24;32036:54;;;32073:17;;-1:-1:-1;;;32073:17:0;;;;;;;;;;;32036:54;2918:10;32103:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;32103:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;32103:53:0;;;;;;;;;;32172:48;;7786:41:1;;;32103:42:0;;2918:10;32172:48;;7759:18:1;32172:48:0;;;;;;;31941:287;;:::o;33027:369::-;33194:28;33204:4;33210:2;33214:7;33194:9;:28::i;:::-;-1:-1:-1;;;;;33237:13:0;;7110:19;:23;;33237:76;;;;;33257:56;33288:4;33294:2;33298:7;33307:5;33257:30;:56::i;:::-;33256:57;33237:76;33233:156;;;33337:40;;-1:-1:-1;;;33337:40:0;;;;;;;;;;;33233:156;33027:369;;;;:::o;46421:355::-;46494:13;46525:16;46533:7;46525;:16::i;:::-;46520:59;;46550:29;;-1:-1:-1;;;46550:29:0;;;;;;;;;;;46520:59;46617:8;;46592:22;;-1:-1:-1;;;46617:8:0;;;;:47;;;;;;;;;;;;;;;-1:-1:-1;;;46617:47:0;;;;;;46628:25;46645:7;46628:16;:25::i;:::-;46592:72;;46688:7;46682:21;;;;;:::i;:::-;:26;;;-1:-1:-1;46682:86:0;;;;;;;;;;;;;;;;;46735:7;46744:8;46718:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46682:86;46675:93;46421:355;-1:-1:-1;;;46421:355:0:o;46784:126::-;4187:6;;-1:-1:-1;;;;;4187:6:0;2918:10;4334:23;4326:68;;;;-1:-1:-1;;;4326:68:0;;;;;;;:::i;:::-;46862:18:::1;:40:::0;;-1:-1:-1;;46862:40:0::1;-1:-1:-1::0;;;;;46862:40:0;;;::::1;::::0;;;::::1;::::0;;46784:126::o;45367:115::-;-1:-1:-1;;;;;27802:19:0;;45427:7;27802:19;;;:12;:19;;;;;:32;-1:-1:-1;;;27802:32:0;;;;45454:20;27706:137;5023:201;4187:6;;-1:-1:-1;;;;;4187:6:0;2918:10;4334:23;4326:68;;;;-1:-1:-1;;;4326:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5112:22:0;::::1;5104:73;;;::::0;-1:-1:-1;;;5104:73:0;;8264:2:1;5104:73:0::1;::::0;::::1;8246:21:1::0;8303:2;8283:18;;;8276:30;8342:34;8322:18;;;8315:62;-1:-1:-1;;;8393:18:1;;;8386:36;8439:19;;5104:73:0::1;8236:228:1::0;5104:73:0::1;5188:28;5207:8;5188:18;:28::i;33651:187::-:0;33708:4;33751:7;46162:1;33732:26;;:53;;;;;33772:13;;33762:7;:23;33732:53;:98;;;;-1:-1:-1;;33803:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;33803:27:0;;;;33802:28;;33651:187::o;41821:196::-;41936:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;41936:29:0;-1:-1:-1;;;;;41936:29:0;;;;;;;;;41981:28;;41936:24;;41981:28;;;;;;;41821:196;;;:::o;36764:2130::-;36879:35;36917:21;36930:7;36917:12;:21::i;:::-;36879:59;;36977:4;-1:-1:-1;;;;;36955:26:0;:13;:18;;;-1:-1:-1;;;;;36955:26:0;;36951:67;;36990:28;;-1:-1:-1;;;36990:28:0;;;;;;;;;;;36951:67;37031:22;2918:10;-1:-1:-1;;;;;37057:20:0;;;;:73;;-1:-1:-1;37094:36:0;37111:4;2918:10;32299:164;:::i;37094:36::-;37057:126;;;-1:-1:-1;2918:10:0;37147:20;37159:7;37147:11;:20::i;:::-;-1:-1:-1;;;;;37147:36:0;;37057:126;37031:153;;37202:17;37197:66;;37228:35;;-1:-1:-1;;;37228:35:0;;;;;;;;;;;37197:66;-1:-1:-1;;;;;37278:16:0;;37274:52;;37303:23;;-1:-1:-1;;;37303:23:0;;;;;;;;;;;37274:52;37447:35;37464:1;37468:7;37477:4;37447:8;:35::i;:::-;-1:-1:-1;;;;;37778:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;37778:31:0;;;;;;;-1:-1:-1;;37778:31:0;;;;;;;37824:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;37824:29:0;;;;;;;;;;;37904:20;;;:11;:20;;;;;;37939:18;;-1:-1:-1;;;;;;37972:49:0;;;;-1:-1:-1;;;38005:15:0;37972:49;;;;;;;;;;38295:11;;38355:24;;;;;38398:13;;37904:20;;38355:24;;38398:13;38394:384;;38608:13;;38593:11;:28;38589:174;;38646:20;;38715:28;;;;38689:54;;-1:-1:-1;;;38689:54:0;-1:-1:-1;;;;;;38689:54:0;;;-1:-1:-1;;;;;38646:20:0;;38689:54;;;;38589:174;36764:2130;;;38825:7;38821:2;-1:-1:-1;;;;;38806:27:0;38815:4;-1:-1:-1;;;;;38806:27:0;;;;;;;;;;;38844:42;36764:2130;;;;;:::o;33846:104::-;33915:27;33925:2;33929:8;33915:27;;;;;;;;;;;;:9;:27::i;:::-;33846:104;;:::o;28799:1109::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;28910:7:0;;46162:1;28959:23;;:47;;;;;28993:13;;28986:4;:20;28959:47;28955:886;;;29027:31;29061:17;;;:11;:17;;;;;;;;;29027:51;;;;;;;;;-1:-1:-1;;;;;29027:51:0;;;;-1:-1:-1;;;29027:51:0;;;;;;;;;;;-1:-1:-1;;;29027:51:0;;;;;;;;;;;;;;29097:729;;29147:14;;-1:-1:-1;;;;;29147:28:0;;29143:101;;29211:9;28799:1109;-1:-1:-1;;;28799:1109:0:o;29143:101::-;-1:-1:-1;;;29586:6:0;29631:17;;;;:11;:17;;;;;;;;;29619:29;;;;;;;;;-1:-1:-1;;;;;29619:29:0;;;;;-1:-1:-1;;;29619:29:0;;;;;;;;;;;-1:-1:-1;;;29619:29:0;;;;;;;;;;;;;29679:28;29675:109;;29747:9;28799:1109;-1:-1:-1;;;28799:1109:0:o;29675:109::-;29546:261;;;28955:886;;29869:31;;-1:-1:-1;;;29869:31:0;;;;;;;;;;;5384:191;5477:6;;;-1:-1:-1;;;;;5494:17:0;;;-1:-1:-1;;;;;;5494:17:0;;;;;;;5527:40;;5477:6;;;5494:17;5477:6;;5527:40;;5458:16;;5527:40;5384:191;;:::o;42509:667::-;42693:72;;-1:-1:-1;;;42693:72:0;;42672:4;;-1:-1:-1;;;;;42693:36:0;;;;;:72;;2918:10;;42744:4;;42750:7;;42759:5;;42693:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42693:72:0;;;;;;;;-1:-1:-1;;42693:72:0;;;;;;;;;;;;:::i;:::-;;;42689:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42927:13:0;;42923:235;;42973:40;;-1:-1:-1;;;42973:40:0;;;;;;;;;;;42923:235;43116:6;43110:13;43101:6;43097:2;43093:15;43086:38;42689:480;-1:-1:-1;;;;;;42812:55:0;-1:-1:-1;;;42812:55:0;;-1:-1:-1;42689:480:0;42509:667;;;;;;:::o;400:723::-;456:13;677:10;673:53;;-1:-1:-1;;704:10:0;;;;;;;;;;;;-1:-1:-1;;;704:10:0;;;;;400:723::o;673:53::-;751:5;736:12;792:78;799:9;;792:78;;825:8;;;;:::i;:::-;;-1:-1:-1;848:10:0;;-1:-1:-1;856:2:0;848:10;;:::i;:::-;;;792:78;;;880:19;912:6;902:17;;;;;;-1:-1:-1;;;902:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;902:17:0;;880:39;;930:154;937:10;;930:154;;964:11;974:1;964:11;;:::i;:::-;;-1:-1:-1;1033:10:0;1041:2;1033:5;:10;:::i;:::-;1020:24;;:2;:24;:::i;:::-;1007:39;;990:6;997;990:14;;;;;;-1:-1:-1;;;990:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;990:56:0;;;;;;;;-1:-1:-1;1061:11:0;1070:2;1061:11;;:::i;:::-;;;930:154;;34313:163;34436:32;34442:2;34446:8;34456:5;34463:4;34874:20;34897:13;-1:-1:-1;;;;;34925:16:0;;34921:48;;34950:19;;-1:-1:-1;;;34950:19:0;;;;;;;;;;;34921:48;34984:13;34980:44;;35006:18;;-1:-1:-1;;;35006:18:0;;;;;;;;;;;34980:44;-1:-1:-1;;;;;35375:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;35434:49:0;;35375:44;;;;;;;;35434:49;;;-1:-1:-1;;;;;35375:44:0;;;;;;35434:49;;;;;;;;;;;;;;;;35500:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;35550:66:0;;;;-1:-1:-1;;;35600:15:0;35550:66;;;;;;;;;;35500:25;35697:23;;;35741:4;:23;;;;-1:-1:-1;;;;;;35749:13:0;;7110:19;:23;;35749:15;35737:641;;;35785:314;35816:38;;35841:12;;-1:-1:-1;;;;;35816:38:0;;;35833:1;;35816:38;;35833:1;;35816:38;35882:69;35921:1;35925:2;35929:14;;;;;;35945:5;35882:30;:69::i;:::-;35877:174;;35987:40;;-1:-1:-1;;;35987:40:0;;;;;;;;;;;35877:174;36094:3;36078:12;:19;;35785:314;;36180:12;36163:13;;:29;36159:43;;36194:8;;;36159:43;35737:641;;;36243:120;36274:40;;36299:14;;;;;-1:-1:-1;;;;;36274:40:0;;;36291:1;;36274:40;;36291:1;;36274:40;36358:3;36342:12;:19;;36243:120;;35737:641;-1:-1:-1;36392:13:0;:28;36442:60;33027:369;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:196::-;251:6;304:2;292:9;283:7;279:23;275:32;272:2;;;325:6;317;310:22;272:2;353:29;372:9;353:29;:::i;393:270::-;461:6;469;522:2;510:9;501:7;497:23;493:32;490:2;;;543:6;535;528:22;490:2;571:29;590:9;571:29;:::i;:::-;561:39;;619:38;653:2;642:9;638:18;619:38;:::i;:::-;609:48;;480:183;;;;;:::o;668:338::-;745:6;753;761;814:2;802:9;793:7;789:23;785:32;782:2;;;835:6;827;820:22;782:2;863:29;882:9;863:29;:::i;:::-;853:39;;911:38;945:2;934:9;930:18;911:38;:::i;:::-;901:48;;996:2;985:9;981:18;968:32;958:42;;772:234;;;;;:::o;1011:1183::-;1106:6;1114;1122;1130;1183:3;1171:9;1162:7;1158:23;1154:33;1151:2;;;1205:6;1197;1190:22;1151:2;1233:29;1252:9;1233:29;:::i;:::-;1223:39;;1281:38;1315:2;1304:9;1300:18;1281:38;:::i;:::-;1271:48;;1366:2;1355:9;1351:18;1338:32;1328:42;;1421:2;1410:9;1406:18;1393:32;1444:18;1485:2;1477:6;1474:14;1471:2;;;1506:6;1498;1491:22;1471:2;1549:6;1538:9;1534:22;1524:32;;1594:7;1587:4;1583:2;1579:13;1575:27;1565:2;;1621:6;1613;1606:22;1565:2;1662;1649:16;1684:2;1680;1677:10;1674:2;;;1690:18;;:::i;:::-;1765:2;1759:9;1733:2;1819:13;;-1:-1:-1;;1815:22:1;;;1839:2;1811:31;1807:40;1795:53;;;1863:18;;;1883:22;;;1860:46;1857:2;;;1909:18;;:::i;:::-;1949:10;1945:2;1938:22;1984:2;1976:6;1969:18;2024:7;2019:2;2014;2010;2006:11;2002:20;1999:33;1996:2;;;2050:6;2042;2035:22;1996:2;2111;2106;2102;2098:11;2093:2;2085:6;2081:15;2068:46;2134:15;;;2151:2;2130:24;2123:40;;;;1141:1053;;;;-1:-1:-1;1141:1053:1;;-1:-1:-1;;;;1141:1053:1:o;2199:367::-;2264:6;2272;2325:2;2313:9;2304:7;2300:23;2296:32;2293:2;;;2346:6;2338;2331:22;2293:2;2374:29;2393:9;2374:29;:::i;:::-;2364:39;;2453:2;2442:9;2438:18;2425:32;2500:5;2493:13;2486:21;2479:5;2476:32;2466:2;;2527:6;2519;2512:22;2466:2;2555:5;2545:15;;;2283:283;;;;;:::o;2571:264::-;2639:6;2647;2700:2;2688:9;2679:7;2675:23;2671:32;2668:2;;;2721:6;2713;2706:22;2668:2;2749:29;2768:9;2749:29;:::i;:::-;2739:39;2825:2;2810:18;;;;2797:32;;-1:-1:-1;;;2658:177:1:o;2840:255::-;2898:6;2951:2;2939:9;2930:7;2926:23;2922:32;2919:2;;;2972:6;2964;2957:22;2919:2;3016:9;3003:23;3035:30;3059:5;3035:30;:::i;3100:259::-;3169:6;3222:2;3210:9;3201:7;3197:23;3193:32;3190:2;;;3243:6;3235;3228:22;3190:2;3280:9;3274:16;3299:30;3323:5;3299:30;:::i;3364:642::-;3435:6;3443;3496:2;3484:9;3475:7;3471:23;3467:32;3464:2;;;3517:6;3509;3502:22;3464:2;3562:9;3549:23;3591:18;3632:2;3624:6;3621:14;3618:2;;;3653:6;3645;3638:22;3618:2;3696:6;3685:9;3681:22;3671:32;;3741:7;3734:4;3730:2;3726:13;3722:27;3712:2;;3768:6;3760;3753:22;3712:2;3813;3800:16;3839:2;3831:6;3828:14;3825:2;;;3860:6;3852;3845:22;3825:2;3910:7;3905:2;3896:6;3892:2;3888:15;3884:24;3881:37;3878:2;;;3936:6;3928;3921:22;3878:2;3972;3964:11;;;;;3994:6;;-1:-1:-1;3454:552:1;;-1:-1:-1;;;;3454:552:1:o;4011:190::-;4070:6;4123:2;4111:9;4102:7;4098:23;4094:32;4091:2;;;4144:6;4136;4129:22;4091:2;-1:-1:-1;4172:23:1;;4081:120;-1:-1:-1;4081:120:1:o;4206:258::-;4274:6;4282;4335:2;4323:9;4314:7;4310:23;4306:32;4303:2;;;4356:6;4348;4341:22;4303:2;-1:-1:-1;;4384:23:1;;;4454:2;4439:18;;;4426:32;;-1:-1:-1;4293:171:1:o;4469:312::-;4527:6;4580:2;4568:9;4559:7;4555:23;4551:32;4548:2;;;4601:6;4593;4586:22;4548:2;4645:9;4632:23;-1:-1:-1;;;;;4688:5:1;4684:38;4677:5;4674:49;4664:2;;4742:6;4734;4727:22;4786:257;4827:3;4865:5;4859:12;4892:6;4887:3;4880:19;4908:63;4964:6;4957:4;4952:3;4948:14;4941:4;4934:5;4930:16;4908:63;:::i;:::-;5025:2;5004:15;-1:-1:-1;;5000:29:1;4991:39;;;;5032:4;4987:50;;4835:208;-1:-1:-1;;4835:208:1:o;5048:185::-;5090:3;5128:5;5122:12;5143:52;5188:6;5183:3;5176:4;5169:5;5165:16;5143:52;:::i;:::-;5211:16;;;;;5098:135;-1:-1:-1;;5098:135:1:o;5356:1305::-;5633:3;5662;5697:6;5691:13;5727:3;5749:1;5777:9;5773:2;5769:18;5759:28;;5837:2;5826:9;5822:18;5859;5849:2;;5903:4;5895:6;5891:17;5881:27;;5849:2;5929;5977;5969:6;5966:14;5946:18;5943:38;5940:2;;;-1:-1:-1;;;6004:33:1;;6060:4;6057:1;6050:15;6090:4;6011:3;6078:17;5940:2;6121:18;6148:104;;;;6266:1;6261:322;;;;6114:469;;6148:104;-1:-1:-1;;6181:24:1;;6169:37;;6226:16;;;;-1:-1:-1;6148:104:1;;6261:322;10487:4;10506:17;;;10556:4;10540:21;;6356:3;6372:165;6386:6;6383:1;6380:13;6372:165;;;6464:14;;6451:11;;;6444:35;6507:16;;;;6401:10;;6372:165;;;6376:3;;6566:6;6561:3;6557:16;6550:23;;6114:469;;;;;;;6599:56;6624:30;6650:3;6642:6;6624:30;:::i;:::-;-1:-1:-1;;;5298:20:1;;5343:1;5334:11;;5288:63;6599:56;6592:63;5641:1020;-1:-1:-1;;;;;5641:1020:1:o;6874:488::-;-1:-1:-1;;;;;7143:15:1;;;7125:34;;7195:15;;7190:2;7175:18;;7168:43;7242:2;7227:18;;7220:34;;;7290:3;7285:2;7270:18;;7263:31;;;7068:4;;7311:45;;7336:19;;7328:6;7311:45;:::i;:::-;7303:53;7077:285;-1:-1:-1;;;;;;7077:285:1:o;7838:219::-;7987:2;7976:9;7969:21;7950:4;8007:44;8047:2;8036:9;8032:18;8024:6;8007:44;:::i;8808:356::-;9010:2;8992:21;;;9029:18;;;9022:30;9088:34;9083:2;9068:18;;9061:62;9155:2;9140:18;;8982:182::o;9529:342::-;9731:2;9713:21;;;9770:2;9750:18;;;9743:30;-1:-1:-1;;;9804:2:1;9789:18;;9782:48;9862:2;9847:18;;9703:168::o;10572:128::-;10612:3;10643:1;10639:6;10636:1;10633:13;10630:2;;;10649:18;;:::i;:::-;-1:-1:-1;10685:9:1;;10620:80::o;10705:120::-;10745:1;10771;10761:2;;10776:18;;:::i;:::-;-1:-1:-1;10810:9:1;;10751:74::o;10830:168::-;10870:7;10936:1;10932;10928:6;10924:14;10921:1;10918:21;10913:1;10906:9;10899:17;10895:45;10892:2;;;10943:18;;:::i;:::-;-1:-1:-1;10983:9:1;;10882:116::o;11003:125::-;11043:4;11071:1;11068;11065:8;11062:2;;;11076:18;;:::i;:::-;-1:-1:-1;11113:9:1;;11052:76::o;11133:258::-;11205:1;11215:113;11229:6;11226:1;11223:13;11215:113;;;11305:11;;;11299:18;11286:11;;;11279:39;11251:2;11244:10;11215:113;;;11346:6;11343:1;11340:13;11337:2;;;-1:-1:-1;;11381:1:1;11363:16;;11356:27;11186:205::o;11396:380::-;11475:1;11471:12;;;;11518;;;11539:2;;11593:4;11585:6;11581:17;11571:27;;11539:2;11646;11638:6;11635:14;11615:18;11612:38;11609:2;;;11692:10;11687:3;11683:20;11680:1;11673:31;11727:4;11724:1;11717:15;11755:4;11752:1;11745:15;11609:2;;11451:325;;;:::o;11781:135::-;11820:3;-1:-1:-1;;11841:17:1;;11838:2;;;11861:18;;:::i;:::-;-1:-1:-1;11908:1:1;11897:13;;11828:88::o;11921:112::-;11953:1;11979;11969:2;;11984:18;;:::i;:::-;-1:-1:-1;12018:9:1;;11959:74::o;12038:127::-;12099:10;12094:3;12090:20;12087:1;12080:31;12130:4;12127:1;12120:15;12154:4;12151:1;12144:15;12170:127;12231:10;12226:3;12222:20;12219:1;12212:31;12262:4;12259:1;12252:15;12286:4;12283:1;12276:15;12302:127;12363:10;12358:3;12354:20;12351:1;12344:31;12394:4;12391:1;12384:15;12418:4;12415:1;12408:15;12434:131;-1:-1:-1;;;;;;12508:32:1;;12498:43;;12488:2;;12555:1;12552;12545:12
Swarm Source
ipfs://02d58603ef69990de9daece46008392dc805a3f0c4368c88f941dfbf556957f3
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.