Overview
TokenID
5869
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ShadowDescendants2
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-17 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.17; /** * @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/security/Pausable.sol // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/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: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); 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; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // 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); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @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: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @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 IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _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 `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // 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(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev 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 Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_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 { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; assembly { // Cast aux without masking. auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // 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. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * 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) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @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, _toString(tokenId))) : ''; } /** * @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 Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @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 == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), 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.code.length != 0) if (!_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 && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ 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 { 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 { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.code.length != 0) { 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 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) 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 { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; 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 { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // 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 { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev 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 { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || getApproved(tokenId) == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. delete _tokenApprovals[tokenId]; // 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 { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } 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 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 ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__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 {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: contracts/WoFERC721A.sol pragma solidity ^0.8.4; contract ShadowDescendants2 is ERC721A, Ownable, Pausable { using Strings for uint256; string public baseURI = "https://crimson-managing-cow-793.mypinata.cloud/ipfs/QmfKdAK6Jnz9crZGuUYQmU2gbCQ36YcWPCS8Fb4yJ6LbJH/"; string public revealURI = "https://crimson-managing-cow-793.mypinata.cloud/ipfs/QmNuHx8TagzvtAnED1qHRjEwD4JcC5Wnvqie1VmnSSFAon"; string public baseExtension = ".json"; uint256 public cost = 0.07 ether; uint256 public presale_price = 0.05 ether; uint256 public maxSupply = 8888; uint8 public maxMintPerTransaction = 15; bool public reveal = false; bool public presale = true; address[] public whitelistedUsers = [0xE4f3aae8eb3Ebe3AAEF5149923f39A73806846BA, 0xcb1de9459670F9F0e59D21ef03c2b1074c81Bb21, 0x0ea1e75581A77B3A340aC9974bEfda27cfFFD919, 0xD0103F400BCD2A479121EaEb727EB4aCD868f9E2, 0x0359A4e95E8dC2E4b339A01d5cFd069cd20C6d6A, 0x04071eB17E0Fe8ccB0A983D0512D1136EFD4c283, 0x2Fe3a5Ba42c3dAd794c5dCc8C0c1B040948a83B7, 0x7b719f9518F4DDCd341D28838a06A78395A7d5fC, 0x539118962Fc4dF077D41c1817A34cbebfB9d5c1f, 0x5412BDf6320743D8b7947f29b7D345EF49f7895D, 0xd8C57a571964792130d8F6D49b5858CD9608c65c, 0x25074DF7e8350e19550106b5eb9D6baCC15f4231, 0x80e1980DeA1955Ad6cF7be35a757C9906C6Fe8fd, 0xf3498469C50bB31f0009e79106F0Cce08F98438a, 0x56886698844feE080A1564043982a7e7e4e79636, 0xa75fF87Cdd93172c84eC20A7e2c4d7568821De7e, 0x234FC221ca597621faCC18dcc730E2903ed4Ae32, 0x8190fA7c68321b2cb1d4539FeF61Fd92CCFcE1E3, 0xE588E86442fb06E3234810fCE0E1e385307d06e1, 0x34979D41e36d55dDfbBCe66efCc4F0f6dc4B9Ac9, 0xc5bA28f05c52563dC8293bA6CD7f7f1520ca0DeD, 0xC7300878a4b0459b686AA8e91155BDD93C3998d3, 0x6004442B3807b07b7901A2e25AcBc08710284886, 0xdEf82f6F50ca2334542ffa4028db809F9bC7A17f, 0xbC409FAf353AB0549Ea0F842dEA111A7C6c1043B]; constructor() ERC721A("Shadow Descendants 2.0", "SHD2") { _safeMint(msg.sender, 300); } function _startTokenId() internal override view virtual returns (uint256) { return 1; } fallback() external payable {} receive() external payable {} function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function setBaseURI(string memory _baseuri) external onlyOwner { baseURI = _baseuri; } function setRevealURI(string memory _uri) external onlyOwner { revealURI = _uri; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); if(!reveal) { return revealURI; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked( currentBaseURI, tokenId.toString(), baseExtension ) ) : ""; } function setNFTPrice(uint256 _newCost) public onlyOwner { cost = _newCost; } function setPresalePrice(uint256 _newPresalePrice) external onlyOwner { presale_price = _newPresalePrice; } function setMaxMintPerTransaction(uint8 _newMaxMint) external onlyOwner { maxMintPerTransaction = _newMaxMint; } function setReveal(bool _reveal) external onlyOwner { reveal = _reveal; } function presaleOn() external onlyOwner { presale = true; } function presaleOff() external onlyOwner { presale = false; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function addWhitelistUsers(address[] memory _addresses) external onlyOwner { whitelistedUsers = _addresses; } function removeWhitelistUser(address _address) external onlyOwner { (bool _isWhitelistedUser, uint256 s) = isWhitelistedUser(_address); if(_isWhitelistedUser){ whitelistedUsers[s] = whitelistedUsers[whitelistedUsers.length - 1]; whitelistedUsers.pop(); } } function isWhitelistedUser(address _address) public view returns(bool, uint256) { for(uint256 i=0; i < whitelistedUsers.length; i++) { if(_address == whitelistedUsers[i]) { return (true, i); } } return (false, 0); } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function withdraw() external onlyOwner whenNotPaused { uint balance = address(this).balance; require(balance > 0, "NFT: No ether left to withdraw"); (bool success, ) = payable(owner()).call{ value: balance } (""); require(success, "NFT: Transfer failed."); } function lastTokenID() external view returns(uint256) { return totalSupply(); } function mint(uint256 _mintAmount) public payable whenNotPaused { uint256 supply = totalSupply(); require(_mintAmount > 0); require(supply + _mintAmount <= maxSupply); (bool isWhiteList, ) = isWhitelistedUser(msg.sender); if(presale) { require(isWhiteList, "Shadow Descendants 2.0: Caller is not whitelisted"); require(msg.value >= presale_price * _mintAmount, "Shadow Descendants 2.0: insufficient funds"); } else { require(msg.value >= cost * _mintAmount, "insufficient funds"); } _safeMint(msg.sender, _mintAmount); } function _maxSupply() external view returns(uint256) { return maxSupply; } }
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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"_maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addWhitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhitelistedUser","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintPerTransaction","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleOff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"presaleOn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"presale_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeWhitelistUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revealURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseuri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_newMaxMint","type":"uint8"}],"name":"setMaxMintPerTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setNFTPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPresalePrice","type":"uint256"}],"name":"setPresalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_reveal","type":"bool"}],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setRevealURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedUsers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
610120604052606460808181529062002f2160a03960099062000023908262000811565b506040518060a001604052806063815260200162002ebe60639139600a906200004d908262000811565b50604080518082019091526005815264173539b7b760d91b6020820152600b9062000079908262000811565b5066f8b0a10e470000600c5566b1a2bc2ec50000600d556122b8600e55600f805462ffffff19166201000f179055604080516103208101825273e4f3aae8eb3ebe3aaef5149923f39a73806846ba815273cb1de9459670f9f0e59d21ef03c2b1074c81bb216020820152730ea1e75581a77b3a340ac9974befda27cfffd9199181019190915273d0103f400bcd2a479121eaeb727eb4acd868f9e26060820152730359a4e95e8dc2e4b339a01d5cfd069cd20c6d6a60808201527304071eb17e0fe8ccb0a983d0512d1136efd4c28360a0820152732fe3a5ba42c3dad794c5dcc8c0c1b040948a83b760c0820152737b719f9518f4ddcd341d28838a06a78395a7d5fc60e082015273539118962fc4df077d41c1817a34cbebfb9d5c1f610100820152735412bdf6320743d8b7947f29b7d345ef49f7895d61012082015273d8c57a571964792130d8f6d49b5858cd9608c65c6101408201527325074df7e8350e19550106b5eb9d6bacc15f42316101608201527380e1980dea1955ad6cf7be35a757c9906c6fe8fd61018082015273f3498469c50bb31f0009e79106f0cce08f98438a6101a08201527356886698844fee080a1564043982a7e7e4e796366101c082015273a75ff87cdd93172c84ec20a7e2c4d7568821de7e6101e082015273234fc221ca597621facc18dcc730e2903ed4ae32610200820152738190fa7c68321b2cb1d4539fef61fd92ccfce1e361022082015273e588e86442fb06e3234810fce0e1e385307d06e16102408201527334979d41e36d55ddfbbce66efcc4f0f6dc4b9ac961026082015273c5ba28f05c52563dc8293ba6cd7f7f1520ca0ded61028082015273c7300878a4b0459b686aa8e91155bdd93c3998d36102a0820152736004442b3807b07b7901a2e25acbc087102848866102c082015273def82f6f50ca2334542ffa4028db809f9bc7a17f6102e082015273bc409faf353ab0549ea0f842dea111a7c6c1043b6103008201526200035c906010906019620006eb565b503480156200036a57600080fd5b506040518060400160405280601681526020017f536861646f772044657363656e64616e747320322e30000000000000000000008152506040518060400160405280600481526020016329a4221960e11b8152508160029081620003cf919062000811565b506003620003de828262000811565b5050600160005550620003f13362000412565b6008805460ff60a01b191690556200040c3361012c62000464565b62000983565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620004868282604051806020016040528060008152506200048a60201b60201c565b5050565b6000546001600160a01b038416620004b457604051622e076360e81b815260040160405180910390fd5b82600003620004d65760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b15620005a2575b60405182906001600160a01b0388169060009060008051602062002e9e833981519152908290a460018201916200056790600090889087620005f7565b62000585576040516368d2bf6b60e11b815260040160405180910390fd5b8082106200052a5782600054146200059c57600080fd5b620005d7565b5b6040516001830192906001600160a01b0388169060009060008051602062002e9e833981519152908290a4808210620005a3575b506000908155620005f1908583866001600160e01b038516565b50505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906200062e903390899088908890600401620008dd565b6020604051808303816000875af19250505080156200066c575060408051601f3d908101601f19168201909252620006699181019062000950565b60015b620006ce573d8080156200069d576040519150601f19603f3d011682016040523d82523d6000602084013e620006a2565b606091505b508051600003620006c6576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b82805482825590600052602060002090810192821562000743579160200282015b828111156200074357825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200070c565b506200075192915062000755565b5090565b5b8082111562000751576000815560010162000756565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200079757607f821691505b602082108103620007b857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200080c57600081815260208120601f850160051c81016020861015620007e75750805b601f850160051c820191505b818110156200080857828155600101620007f3565b5050505b505050565b81516001600160401b038111156200082d576200082d6200076c565b62000845816200083e845462000782565b84620007be565b602080601f8311600181146200087d5760008415620008645750858301515b600019600386901b1c1916600185901b17855562000808565b600085815260208120601f198616915b82811015620008ae578886015182559484019460019091019084016200088d565b5085821015620008cd5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060018060a01b038087168352602081871681850152856040850152608060608501528451915081608085015260005b828110156200092c5785810182015185820160a0015281016200090e565b5050600060a0828501015260a0601f19601f83011684010191505095945050505050565b6000602082840312156200096357600080fd5b81516001600160e01b0319811681146200097c57600080fd5b9392505050565b61250b80620009936000396000f3fe6080604052600436106102695760003560e01c806370a0823111610143578063a475b5dd116100bb578063d5abeb0111610077578063d5abeb011461070f578063d88c271e14610725578063da3ef23f1461075c578063e985e9c51461077c578063f2fde38b1461079c578063fdea8e0b146107bc57005b8063a475b5dd1461065b578063a811a37b1461067a578063b27867bf1461069a578063b88d4fde146106ba578063c6682862146106da578063c87b56dd146106ef57005b80638da5cb5b1161010a5780638da5cb5b146105ca57806395d89b41146105e8578063969745e8146105fd5780639a380b1614610613578063a0712d6814610628578063a22cb4651461063b57005b806370a0823114610540578063715018a61461056057806381530b68146105755780638456cb591461059557806385668275146105aa57005b80632a3f300c116101e157806342842e0e1161019d57806342842e0e1461048c57806355f804b3146104ac5780635c975abb146104cc5780636352211e146104eb578063686b28121461050b5780636c0360eb1461052b57005b80632a3f300c146103ed57806330cc7ae01461040d5780633521bd7e1461042d5780633549345e146104425780633ccfd60b146104625780633f4ba83a1461047757005b806313faede61161023057806313faede61461034d578063160fba561461037157806318160ddd146103865780631ad874b4146103a357806322f4596f146103b857806323b872dd146103cd57005b806301f569971461027257806301ffc9a7146102a357806306fdde03146102d3578063081812fc146102f5578063095ea7b31461032d57005b3661027057005b005b34801561027e57600080fd5b50600f5461028c9060ff1681565b60405160ff90911681526020015b60405180910390f35b3480156102af57600080fd5b506102c36102be366004611d6c565b6107dc565b604051901515815260200161029a565b3480156102df57600080fd5b506102e861082e565b60405161029a9190611dd9565b34801561030157600080fd5b50610315610310366004611dec565b6108c0565b6040516001600160a01b03909116815260200161029a565b34801561033957600080fd5b50610270610348366004611e21565b610904565b34801561035957600080fd5b50610363600c5481565b60405190815260200161029a565b34801561037d57600080fd5b506102e86109d6565b34801561039257600080fd5b506001546000540360001901610363565b3480156103af57600080fd5b50610270610a64565b3480156103c457600080fd5b50600e54610363565b3480156103d957600080fd5b506102706103e8366004611e4b565b610aaa565b3480156103f957600080fd5b50610270610408366004611e97565b610aba565b34801561041957600080fd5b50610270610428366004611eb2565b610afe565b34801561043957600080fd5b50610363610bf0565b34801561044e57600080fd5b5061027061045d366004611dec565b610c0a565b34801561046e57600080fd5b50610270610c39565b34801561048357600080fd5b50610270610d8b565b34801561049857600080fd5b506102706104a7366004611e4b565b610dbf565b3480156104b857600080fd5b506102706104c7366004611f6c565b610dda565b3480156104d857600080fd5b50600854600160a01b900460ff166102c3565b3480156104f757600080fd5b50610315610506366004611dec565b610e10565b34801561051757600080fd5b50610270610526366004611fb5565b610e1b565b34801561053757600080fd5b506102e8610e58565b34801561054c57600080fd5b5061036361055b366004611eb2565b610e65565b34801561056c57600080fd5b50610270610eb4565b34801561058157600080fd5b50610270610590366004611dec565b610ee8565b3480156105a157600080fd5b50610270610f17565b3480156105b657600080fd5b506103156105c5366004611dec565b610f49565b3480156105d657600080fd5b506008546001600160a01b0316610315565b3480156105f457600080fd5b506102e8610f73565b34801561060957600080fd5b50610363600d5481565b34801561061f57600080fd5b50610270610f82565b610270610636366004611dec565b610fba565b34801561064757600080fd5b50610270610656366004612062565b611178565b34801561066757600080fd5b50600f546102c390610100900460ff1681565b34801561068657600080fd5b50610270610695366004611f6c565b61120d565b3480156106a657600080fd5b506102706106b5366004612095565b611243565b3480156106c657600080fd5b506102706106d53660046120b8565b611283565b3480156106e657600080fd5b506102e86112cd565b3480156106fb57600080fd5b506102e861070a366004611dec565b6112da565b34801561071b57600080fd5b50610363600e5481565b34801561073157600080fd5b50610745610740366004611eb2565b611449565b60408051921515835260208301919091520161029a565b34801561076857600080fd5b50610270610777366004611f6c565b6114b4565b34801561078857600080fd5b506102c3610797366004612134565b6114ea565b3480156107a857600080fd5b506102706107b7366004611eb2565b611518565b3480156107c857600080fd5b50600f546102c39062010000900460ff1681565b60006301ffc9a760e01b6001600160e01b03198316148061080d57506380ac58cd60e01b6001600160e01b03198316145b806108285750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461083d9061215e565b80601f01602080910402602001604051908101604052809291908181526020018280546108699061215e565b80156108b65780601f1061088b576101008083540402835291602001916108b6565b820191906000526020600020905b81548152906001019060200180831161089957829003601f168201915b5050505050905090565b60006108cb826115b3565b6108e8576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061090f826115e8565b9050806001600160a01b0316836001600160a01b0316036109435760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161461097a5761095d81336114ea565b61097a576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600a80546109e39061215e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0f9061215e565b8015610a5c5780601f10610a3157610100808354040283529160200191610a5c565b820191906000526020600020905b815481529060010190602001808311610a3f57829003601f168201915b505050505081565b6008546001600160a01b03163314610a975760405162461bcd60e51b8152600401610a8e90612198565b60405180910390fd5b600f805462ff0000191662010000179055565b610ab5838383611657565b505050565b6008546001600160a01b03163314610ae45760405162461bcd60e51b8152600401610a8e90612198565b600f80549115156101000261ff0019909216919091179055565b6008546001600160a01b03163314610b285760405162461bcd60e51b8152600401610a8e90612198565b600080610b3483611449565b915091508115610ab55760108054610b4e906001906121e3565b81548110610b5e57610b5e6121f6565b600091825260209091200154601080546001600160a01b039092169183908110610b8a57610b8a6121f6565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506010805480610bc957610bc961220c565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b6000610c056001546000546000199190030190565b905090565b6008546001600160a01b03163314610c345760405162461bcd60e51b8152600401610a8e90612198565b600d55565b6008546001600160a01b03163314610c635760405162461bcd60e51b8152600401610a8e90612198565b600854600160a01b900460ff1615610c8d5760405162461bcd60e51b8152600401610a8e90612222565b4780610cdb5760405162461bcd60e51b815260206004820152601e60248201527f4e46543a204e6f206574686572206c65667420746f20776974686472617700006044820152606401610a8e565b6000610cef6008546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114610d39576040519150601f19603f3d011682016040523d82523d6000602084013e610d3e565b606091505b5050905080610d875760405162461bcd60e51b815260206004820152601560248201527427232a1d102a3930b739b332b9103330b4b632b21760591b6044820152606401610a8e565b5050565b6008546001600160a01b03163314610db55760405162461bcd60e51b8152600401610a8e90612198565b610dbd6117fe565b565b610ab583838360405180602001604052806000815250611283565b6008546001600160a01b03163314610e045760405162461bcd60e51b8152600401610a8e90612198565b6009610d87828261229a565b6000610828826115e8565b6008546001600160a01b03163314610e455760405162461bcd60e51b8152600401610a8e90612198565b8051610d87906010906020840190611cdc565b600980546109e39061215e565b60006001600160a01b038216610e8e576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03163314610ede5760405162461bcd60e51b8152600401610a8e90612198565b610dbd600061189b565b6008546001600160a01b03163314610f125760405162461bcd60e51b8152600401610a8e90612198565b600c55565b6008546001600160a01b03163314610f415760405162461bcd60e51b8152600401610a8e90612198565b610dbd6118ed565b60108181548110610f5957600080fd5b6000918252602090912001546001600160a01b0316905081565b60606003805461083d9061215e565b6008546001600160a01b03163314610fac5760405162461bcd60e51b8152600401610a8e90612198565b600f805462ff000019169055565b600854600160a01b900460ff1615610fe45760405162461bcd60e51b8152600401610a8e90612222565b6000610ff96001546000546000199190030190565b90506000821161100857600080fd5b600e54611015838361235a565b111561102057600080fd5b600061102b33611449565b50600f5490915062010000900460ff161561111c57806110a75760405162461bcd60e51b815260206004820152603160248201527f536861646f772044657363656e64616e747320322e303a2043616c6c657220696044820152701cc81b9bdd081dda1a5d195b1a5cdd1959607a1b6064820152608401610a8e565b82600d546110b5919061236d565b3410156111175760405162461bcd60e51b815260206004820152602a60248201527f536861646f772044657363656e64616e747320322e303a20696e73756666696360448201526969656e742066756e647360b01b6064820152608401610a8e565b61116e565b82600c5461112a919061236d565b34101561116e5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610a8e565b610ab53384611952565b336001600160a01b038316036111a15760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b031633146112375760405162461bcd60e51b8152600401610a8e90612198565b600a610d87828261229a565b6008546001600160a01b0316331461126d5760405162461bcd60e51b8152600401610a8e90612198565b600f805460ff191660ff92909216919091179055565b61128e848484611657565b6001600160a01b0383163b156112c7576112aa8484848461196c565b6112c7576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b600b80546109e39061215e565b60606112e5826115b3565b6113495760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a8e565b600f54610100900460ff166113ea57600a80546113659061215e565b80601f01602080910402602001604051908101604052809291908181526020018280546113919061215e565b80156113de5780601f106113b3576101008083540402835291602001916113de565b820191906000526020600020905b8154815290600101906020018083116113c157829003601f168201915b50505050509050919050565b60006113f4611a58565b905060008151116114145760405180602001604052806000815250611442565b8061141e84611a67565b600b60405160200161143293929190612384565b6040516020818303038152906040525b9392505050565b60008060005b6010548110156114a8576010818154811061146c5761146c6121f6565b6000918252602090912001546001600160a01b039081169085160361149657600194909350915050565b806114a081612424565b91505061144f565b50600093849350915050565b6008546001600160a01b031633146114de5760405162461bcd60e51b8152600401610a8e90612198565b600b610d87828261229a565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6008546001600160a01b031633146115425760405162461bcd60e51b8152600401610a8e90612198565b6001600160a01b0381166115a75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a8e565b6115b08161189b565b50565b6000816001111580156115c7575060005482105b8015610828575050600090815260046020526040902054600160e01b161590565b6000818060011161163e5760005481101561163e5760008181526004602052604081205490600160e01b8216900361163c575b8060000361144257506000190160008181526004602052604090205461161b565b505b604051636f96cda160e11b815260040160405180910390fd5b6000611662826115e8565b9050836001600160a01b0316816001600160a01b0316146116955760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806116b357506116b385336114ea565b806116ce5750336116c3846108c0565b6001600160a01b0316145b9050806116ee57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661171557604051633a954ecd60e21b815260040160405180910390fd5b600083815260066020908152604080832080546001600160a01b03191690556001600160a01b038881168452600583528184208054600019019055871683528083208054600101905585835260049091528120600160e11b4260a01b87178117909155831690036117b6576001830160008181526004602052604081205490036117b45760005481146117b45760008181526004602052604090208390555b505b82846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b600854600160a01b900460ff1661184e5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610a8e565b6008805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600854600160a01b900460ff16156119175760405162461bcd60e51b8152600401610a8e90612222565b6008805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861187e3390565b610d87828260405180602001604052806000815250611b68565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906119a190339089908890889060040161243d565b6020604051808303816000875af19250505080156119dc575060408051601f3d908101601f191682019092526119d99181019061247a565b60015b611a3a573d808015611a0a576040519150601f19603f3d011682016040523d82523d6000602084013e611a0f565b606091505b508051600003611a32576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60606009805461083d9061215e565b606081600003611a8e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ab85780611aa281612424565b9150611ab19050600a836124ad565b9150611a92565b60008167ffffffffffffffff811115611ad357611ad3611ecd565b6040519080825280601f01601f191660200182016040528015611afd576020820181803683370190505b5090505b8415611a5057611b126001836121e3565b9150611b1f600a866124c1565b611b2a90603061235a565b60f81b818381518110611b3f57611b3f6121f6565b60200101906001600160f81b031916908160001a905350611b61600a866124ad565b9450611b01565b6000546001600160a01b038416611b9157604051622e076360e81b815260040160405180910390fd5b82600003611bb25760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b15611c87575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611c50600087848060010195508761196c565b611c6d576040516368d2bf6b60e11b815260040160405180910390fd5b808210611c05578260005414611c8257600080fd5b611ccc565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210611c88575b5060009081556112c79085838684565b828054828255906000526020600020908101928215611d31579160200282015b82811115611d3157825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611cfc565b50611d3d929150611d41565b5090565b5b80821115611d3d5760008155600101611d42565b6001600160e01b0319811681146115b057600080fd5b600060208284031215611d7e57600080fd5b813561144281611d56565b60005b83811015611da4578181015183820152602001611d8c565b50506000910152565b60008151808452611dc5816020860160208601611d89565b601f01601f19169290920160200192915050565b6020815260006114426020830184611dad565b600060208284031215611dfe57600080fd5b5035919050565b80356001600160a01b0381168114611e1c57600080fd5b919050565b60008060408385031215611e3457600080fd5b611e3d83611e05565b946020939093013593505050565b600080600060608486031215611e6057600080fd5b611e6984611e05565b9250611e7760208501611e05565b9150604084013590509250925092565b80358015158114611e1c57600080fd5b600060208284031215611ea957600080fd5b61144282611e87565b600060208284031215611ec457600080fd5b61144282611e05565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611f0c57611f0c611ecd565b604052919050565b600067ffffffffffffffff831115611f2e57611f2e611ecd565b611f41601f8401601f1916602001611ee3565b9050828152838383011115611f5557600080fd5b828260208301376000602084830101529392505050565b600060208284031215611f7e57600080fd5b813567ffffffffffffffff811115611f9557600080fd5b8201601f81018413611fa657600080fd5b611a5084823560208401611f14565b60006020808385031215611fc857600080fd5b823567ffffffffffffffff80821115611fe057600080fd5b818501915085601f830112611ff457600080fd5b81358181111561200657612006611ecd565b8060051b9150612017848301611ee3565b818152918301840191848101908884111561203157600080fd5b938501935b838510156120565761204785611e05565b82529385019390850190612036565b98975050505050505050565b6000806040838503121561207557600080fd5b61207e83611e05565b915061208c60208401611e87565b90509250929050565b6000602082840312156120a757600080fd5b813560ff8116811461144257600080fd5b600080600080608085870312156120ce57600080fd5b6120d785611e05565b93506120e560208601611e05565b925060408501359150606085013567ffffffffffffffff81111561210857600080fd5b8501601f8101871361211957600080fd5b61212887823560208401611f14565b91505092959194509250565b6000806040838503121561214757600080fd5b61215083611e05565b915061208c60208401611e05565b600181811c9082168061217257607f821691505b60208210810361219257634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610828576108286121cd565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b601f821115610ab557600081815260208120601f850160051c810160208610156122735750805b601f850160051c820191505b818110156122925782815560010161227f565b505050505050565b815167ffffffffffffffff8111156122b4576122b4611ecd565b6122c8816122c2845461215e565b8461224c565b602080601f8311600181146122fd57600084156122e55750858301515b600019600386901b1c1916600185901b178555612292565b600085815260208120601f198616915b8281101561232c5788860151825594840194600190910190840161230d565b508582101561234a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610828576108286121cd565b8082028115828204841417610828576108286121cd565b6000845160206123978285838a01611d89565b8551918401916123aa8184848a01611d89565b85549201916000906123bb8161215e565b600182811680156123d357600181146123e857612414565b60ff1984168752821515830287019450612414565b896000528560002060005b8481101561240c578154898201529083019087016123f3565b505082870194505b50929a9950505050505050505050565b600060018201612436576124366121cd565b5060010190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061247090830184611dad565b9695505050505050565b60006020828403121561248c57600080fd5b815161144281611d56565b634e487b7160e01b600052601260045260246000fd5b6000826124bc576124bc612497565b500490565b6000826124d0576124d0612497565b50069056fea264697066735822122039cc657e0cbe88e661d2191465146c9eec4d8b015e42c3c393740c45109e57b864736f6c63430008110033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef68747470733a2f2f6372696d736f6e2d6d616e6167696e672d636f772d3739332e6d7970696e6174612e636c6f75642f697066732f516d4e754878385461677a7674416e4544317148526a457744344a634335576e7671696531566d6e535346416f6e68747470733a2f2f6372696d736f6e2d6d616e6167696e672d636f772d3739332e6d7970696e6174612e636c6f75642f697066732f516d664b64414b364a6e7a3963725a47755559516d553267624351333659635750435338466234794a364c624a482f
Deployed Bytecode
0x6080604052600436106102695760003560e01c806370a0823111610143578063a475b5dd116100bb578063d5abeb0111610077578063d5abeb011461070f578063d88c271e14610725578063da3ef23f1461075c578063e985e9c51461077c578063f2fde38b1461079c578063fdea8e0b146107bc57005b8063a475b5dd1461065b578063a811a37b1461067a578063b27867bf1461069a578063b88d4fde146106ba578063c6682862146106da578063c87b56dd146106ef57005b80638da5cb5b1161010a5780638da5cb5b146105ca57806395d89b41146105e8578063969745e8146105fd5780639a380b1614610613578063a0712d6814610628578063a22cb4651461063b57005b806370a0823114610540578063715018a61461056057806381530b68146105755780638456cb591461059557806385668275146105aa57005b80632a3f300c116101e157806342842e0e1161019d57806342842e0e1461048c57806355f804b3146104ac5780635c975abb146104cc5780636352211e146104eb578063686b28121461050b5780636c0360eb1461052b57005b80632a3f300c146103ed57806330cc7ae01461040d5780633521bd7e1461042d5780633549345e146104425780633ccfd60b146104625780633f4ba83a1461047757005b806313faede61161023057806313faede61461034d578063160fba561461037157806318160ddd146103865780631ad874b4146103a357806322f4596f146103b857806323b872dd146103cd57005b806301f569971461027257806301ffc9a7146102a357806306fdde03146102d3578063081812fc146102f5578063095ea7b31461032d57005b3661027057005b005b34801561027e57600080fd5b50600f5461028c9060ff1681565b60405160ff90911681526020015b60405180910390f35b3480156102af57600080fd5b506102c36102be366004611d6c565b6107dc565b604051901515815260200161029a565b3480156102df57600080fd5b506102e861082e565b60405161029a9190611dd9565b34801561030157600080fd5b50610315610310366004611dec565b6108c0565b6040516001600160a01b03909116815260200161029a565b34801561033957600080fd5b50610270610348366004611e21565b610904565b34801561035957600080fd5b50610363600c5481565b60405190815260200161029a565b34801561037d57600080fd5b506102e86109d6565b34801561039257600080fd5b506001546000540360001901610363565b3480156103af57600080fd5b50610270610a64565b3480156103c457600080fd5b50600e54610363565b3480156103d957600080fd5b506102706103e8366004611e4b565b610aaa565b3480156103f957600080fd5b50610270610408366004611e97565b610aba565b34801561041957600080fd5b50610270610428366004611eb2565b610afe565b34801561043957600080fd5b50610363610bf0565b34801561044e57600080fd5b5061027061045d366004611dec565b610c0a565b34801561046e57600080fd5b50610270610c39565b34801561048357600080fd5b50610270610d8b565b34801561049857600080fd5b506102706104a7366004611e4b565b610dbf565b3480156104b857600080fd5b506102706104c7366004611f6c565b610dda565b3480156104d857600080fd5b50600854600160a01b900460ff166102c3565b3480156104f757600080fd5b50610315610506366004611dec565b610e10565b34801561051757600080fd5b50610270610526366004611fb5565b610e1b565b34801561053757600080fd5b506102e8610e58565b34801561054c57600080fd5b5061036361055b366004611eb2565b610e65565b34801561056c57600080fd5b50610270610eb4565b34801561058157600080fd5b50610270610590366004611dec565b610ee8565b3480156105a157600080fd5b50610270610f17565b3480156105b657600080fd5b506103156105c5366004611dec565b610f49565b3480156105d657600080fd5b506008546001600160a01b0316610315565b3480156105f457600080fd5b506102e8610f73565b34801561060957600080fd5b50610363600d5481565b34801561061f57600080fd5b50610270610f82565b610270610636366004611dec565b610fba565b34801561064757600080fd5b50610270610656366004612062565b611178565b34801561066757600080fd5b50600f546102c390610100900460ff1681565b34801561068657600080fd5b50610270610695366004611f6c565b61120d565b3480156106a657600080fd5b506102706106b5366004612095565b611243565b3480156106c657600080fd5b506102706106d53660046120b8565b611283565b3480156106e657600080fd5b506102e86112cd565b3480156106fb57600080fd5b506102e861070a366004611dec565b6112da565b34801561071b57600080fd5b50610363600e5481565b34801561073157600080fd5b50610745610740366004611eb2565b611449565b60408051921515835260208301919091520161029a565b34801561076857600080fd5b50610270610777366004611f6c565b6114b4565b34801561078857600080fd5b506102c3610797366004612134565b6114ea565b3480156107a857600080fd5b506102706107b7366004611eb2565b611518565b3480156107c857600080fd5b50600f546102c39062010000900460ff1681565b60006301ffc9a760e01b6001600160e01b03198316148061080d57506380ac58cd60e01b6001600160e01b03198316145b806108285750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461083d9061215e565b80601f01602080910402602001604051908101604052809291908181526020018280546108699061215e565b80156108b65780601f1061088b576101008083540402835291602001916108b6565b820191906000526020600020905b81548152906001019060200180831161089957829003601f168201915b5050505050905090565b60006108cb826115b3565b6108e8576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061090f826115e8565b9050806001600160a01b0316836001600160a01b0316036109435760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161461097a5761095d81336114ea565b61097a576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600a80546109e39061215e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0f9061215e565b8015610a5c5780601f10610a3157610100808354040283529160200191610a5c565b820191906000526020600020905b815481529060010190602001808311610a3f57829003601f168201915b505050505081565b6008546001600160a01b03163314610a975760405162461bcd60e51b8152600401610a8e90612198565b60405180910390fd5b600f805462ff0000191662010000179055565b610ab5838383611657565b505050565b6008546001600160a01b03163314610ae45760405162461bcd60e51b8152600401610a8e90612198565b600f80549115156101000261ff0019909216919091179055565b6008546001600160a01b03163314610b285760405162461bcd60e51b8152600401610a8e90612198565b600080610b3483611449565b915091508115610ab55760108054610b4e906001906121e3565b81548110610b5e57610b5e6121f6565b600091825260209091200154601080546001600160a01b039092169183908110610b8a57610b8a6121f6565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506010805480610bc957610bc961220c565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b6000610c056001546000546000199190030190565b905090565b6008546001600160a01b03163314610c345760405162461bcd60e51b8152600401610a8e90612198565b600d55565b6008546001600160a01b03163314610c635760405162461bcd60e51b8152600401610a8e90612198565b600854600160a01b900460ff1615610c8d5760405162461bcd60e51b8152600401610a8e90612222565b4780610cdb5760405162461bcd60e51b815260206004820152601e60248201527f4e46543a204e6f206574686572206c65667420746f20776974686472617700006044820152606401610a8e565b6000610cef6008546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114610d39576040519150601f19603f3d011682016040523d82523d6000602084013e610d3e565b606091505b5050905080610d875760405162461bcd60e51b815260206004820152601560248201527427232a1d102a3930b739b332b9103330b4b632b21760591b6044820152606401610a8e565b5050565b6008546001600160a01b03163314610db55760405162461bcd60e51b8152600401610a8e90612198565b610dbd6117fe565b565b610ab583838360405180602001604052806000815250611283565b6008546001600160a01b03163314610e045760405162461bcd60e51b8152600401610a8e90612198565b6009610d87828261229a565b6000610828826115e8565b6008546001600160a01b03163314610e455760405162461bcd60e51b8152600401610a8e90612198565b8051610d87906010906020840190611cdc565b600980546109e39061215e565b60006001600160a01b038216610e8e576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03163314610ede5760405162461bcd60e51b8152600401610a8e90612198565b610dbd600061189b565b6008546001600160a01b03163314610f125760405162461bcd60e51b8152600401610a8e90612198565b600c55565b6008546001600160a01b03163314610f415760405162461bcd60e51b8152600401610a8e90612198565b610dbd6118ed565b60108181548110610f5957600080fd5b6000918252602090912001546001600160a01b0316905081565b60606003805461083d9061215e565b6008546001600160a01b03163314610fac5760405162461bcd60e51b8152600401610a8e90612198565b600f805462ff000019169055565b600854600160a01b900460ff1615610fe45760405162461bcd60e51b8152600401610a8e90612222565b6000610ff96001546000546000199190030190565b90506000821161100857600080fd5b600e54611015838361235a565b111561102057600080fd5b600061102b33611449565b50600f5490915062010000900460ff161561111c57806110a75760405162461bcd60e51b815260206004820152603160248201527f536861646f772044657363656e64616e747320322e303a2043616c6c657220696044820152701cc81b9bdd081dda1a5d195b1a5cdd1959607a1b6064820152608401610a8e565b82600d546110b5919061236d565b3410156111175760405162461bcd60e51b815260206004820152602a60248201527f536861646f772044657363656e64616e747320322e303a20696e73756666696360448201526969656e742066756e647360b01b6064820152608401610a8e565b61116e565b82600c5461112a919061236d565b34101561116e5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610a8e565b610ab53384611952565b336001600160a01b038316036111a15760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b031633146112375760405162461bcd60e51b8152600401610a8e90612198565b600a610d87828261229a565b6008546001600160a01b0316331461126d5760405162461bcd60e51b8152600401610a8e90612198565b600f805460ff191660ff92909216919091179055565b61128e848484611657565b6001600160a01b0383163b156112c7576112aa8484848461196c565b6112c7576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b600b80546109e39061215e565b60606112e5826115b3565b6113495760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a8e565b600f54610100900460ff166113ea57600a80546113659061215e565b80601f01602080910402602001604051908101604052809291908181526020018280546113919061215e565b80156113de5780601f106113b3576101008083540402835291602001916113de565b820191906000526020600020905b8154815290600101906020018083116113c157829003601f168201915b50505050509050919050565b60006113f4611a58565b905060008151116114145760405180602001604052806000815250611442565b8061141e84611a67565b600b60405160200161143293929190612384565b6040516020818303038152906040525b9392505050565b60008060005b6010548110156114a8576010818154811061146c5761146c6121f6565b6000918252602090912001546001600160a01b039081169085160361149657600194909350915050565b806114a081612424565b91505061144f565b50600093849350915050565b6008546001600160a01b031633146114de5760405162461bcd60e51b8152600401610a8e90612198565b600b610d87828261229a565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b6008546001600160a01b031633146115425760405162461bcd60e51b8152600401610a8e90612198565b6001600160a01b0381166115a75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a8e565b6115b08161189b565b50565b6000816001111580156115c7575060005482105b8015610828575050600090815260046020526040902054600160e01b161590565b6000818060011161163e5760005481101561163e5760008181526004602052604081205490600160e01b8216900361163c575b8060000361144257506000190160008181526004602052604090205461161b565b505b604051636f96cda160e11b815260040160405180910390fd5b6000611662826115e8565b9050836001600160a01b0316816001600160a01b0316146116955760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806116b357506116b385336114ea565b806116ce5750336116c3846108c0565b6001600160a01b0316145b9050806116ee57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661171557604051633a954ecd60e21b815260040160405180910390fd5b600083815260066020908152604080832080546001600160a01b03191690556001600160a01b038881168452600583528184208054600019019055871683528083208054600101905585835260049091528120600160e11b4260a01b87178117909155831690036117b6576001830160008181526004602052604081205490036117b45760005481146117b45760008181526004602052604090208390555b505b82846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b600854600160a01b900460ff1661184e5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610a8e565b6008805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600854600160a01b900460ff16156119175760405162461bcd60e51b8152600401610a8e90612222565b6008805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861187e3390565b610d87828260405180602001604052806000815250611b68565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906119a190339089908890889060040161243d565b6020604051808303816000875af19250505080156119dc575060408051601f3d908101601f191682019092526119d99181019061247a565b60015b611a3a573d808015611a0a576040519150601f19603f3d011682016040523d82523d6000602084013e611a0f565b606091505b508051600003611a32576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60606009805461083d9061215e565b606081600003611a8e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ab85780611aa281612424565b9150611ab19050600a836124ad565b9150611a92565b60008167ffffffffffffffff811115611ad357611ad3611ecd565b6040519080825280601f01601f191660200182016040528015611afd576020820181803683370190505b5090505b8415611a5057611b126001836121e3565b9150611b1f600a866124c1565b611b2a90603061235a565b60f81b818381518110611b3f57611b3f6121f6565b60200101906001600160f81b031916908160001a905350611b61600a866124ad565b9450611b01565b6000546001600160a01b038416611b9157604051622e076360e81b815260040160405180910390fd5b82600003611bb25760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b15611c87575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611c50600087848060010195508761196c565b611c6d576040516368d2bf6b60e11b815260040160405180910390fd5b808210611c05578260005414611c8257600080fd5b611ccc565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210611c88575b5060009081556112c79085838684565b828054828255906000526020600020908101928215611d31579160200282015b82811115611d3157825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611cfc565b50611d3d929150611d41565b5090565b5b80821115611d3d5760008155600101611d42565b6001600160e01b0319811681146115b057600080fd5b600060208284031215611d7e57600080fd5b813561144281611d56565b60005b83811015611da4578181015183820152602001611d8c565b50506000910152565b60008151808452611dc5816020860160208601611d89565b601f01601f19169290920160200192915050565b6020815260006114426020830184611dad565b600060208284031215611dfe57600080fd5b5035919050565b80356001600160a01b0381168114611e1c57600080fd5b919050565b60008060408385031215611e3457600080fd5b611e3d83611e05565b946020939093013593505050565b600080600060608486031215611e6057600080fd5b611e6984611e05565b9250611e7760208501611e05565b9150604084013590509250925092565b80358015158114611e1c57600080fd5b600060208284031215611ea957600080fd5b61144282611e87565b600060208284031215611ec457600080fd5b61144282611e05565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611f0c57611f0c611ecd565b604052919050565b600067ffffffffffffffff831115611f2e57611f2e611ecd565b611f41601f8401601f1916602001611ee3565b9050828152838383011115611f5557600080fd5b828260208301376000602084830101529392505050565b600060208284031215611f7e57600080fd5b813567ffffffffffffffff811115611f9557600080fd5b8201601f81018413611fa657600080fd5b611a5084823560208401611f14565b60006020808385031215611fc857600080fd5b823567ffffffffffffffff80821115611fe057600080fd5b818501915085601f830112611ff457600080fd5b81358181111561200657612006611ecd565b8060051b9150612017848301611ee3565b818152918301840191848101908884111561203157600080fd5b938501935b838510156120565761204785611e05565b82529385019390850190612036565b98975050505050505050565b6000806040838503121561207557600080fd5b61207e83611e05565b915061208c60208401611e87565b90509250929050565b6000602082840312156120a757600080fd5b813560ff8116811461144257600080fd5b600080600080608085870312156120ce57600080fd5b6120d785611e05565b93506120e560208601611e05565b925060408501359150606085013567ffffffffffffffff81111561210857600080fd5b8501601f8101871361211957600080fd5b61212887823560208401611f14565b91505092959194509250565b6000806040838503121561214757600080fd5b61215083611e05565b915061208c60208401611e05565b600181811c9082168061217257607f821691505b60208210810361219257634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610828576108286121cd565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b601f821115610ab557600081815260208120601f850160051c810160208610156122735750805b601f850160051c820191505b818110156122925782815560010161227f565b505050505050565b815167ffffffffffffffff8111156122b4576122b4611ecd565b6122c8816122c2845461215e565b8461224c565b602080601f8311600181146122fd57600084156122e55750858301515b600019600386901b1c1916600185901b178555612292565b600085815260208120601f198616915b8281101561232c5788860151825594840194600190910190840161230d565b508582101561234a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820180821115610828576108286121cd565b8082028115828204841417610828576108286121cd565b6000845160206123978285838a01611d89565b8551918401916123aa8184848a01611d89565b85549201916000906123bb8161215e565b600182811680156123d357600181146123e857612414565b60ff1984168752821515830287019450612414565b896000528560002060005b8481101561240c578154898201529083019087016123f3565b505082870194505b50929a9950505050505050505050565b600060018201612436576124366121cd565b5060010190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061247090830184611dad565b9695505050505050565b60006020828403121561248c57600080fd5b815161144281611d56565b634e487b7160e01b600052601260045260246000fd5b6000826124bc576124bc612497565b500490565b6000826124d0576124d0612497565b50069056fea264697066735822122039cc657e0cbe88e661d2191465146c9eec4d8b015e42c3c393740c45109e57b864736f6c63430008110033
Deployed Bytecode Sourcemap
46201:5943:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46746:39;;;;;;;;;;-1:-1:-1;46746:39:0;;;;;;;;;;;186:4:1;174:17;;;156:36;;144:2;129:18;46746:39:0;;;;;;;;20863:615;;;;;;;;;;-1:-1:-1;20863:615:0;;;;;:::i;:::-;;:::i;:::-;;;754:14:1;;747:22;729:41;;717:2;702:18;20863:615:0;589:187:1;25876:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27944:204::-;;;;;;;;;;-1:-1:-1;27944:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1886:32:1;;;1868:51;;1856:2;1841:18;27944:204:0;1722:203:1;27404:474:0;;;;;;;;;;-1:-1:-1;27404:474:0;;;;;:::i;:::-;;:::i;46621:32::-;;;;;;;;;;;;;;;;;;;2513:25:1;;;2501:2;2486:18;46621:32:0;2367:177:1;46443:127:0;;;;;;;;;;;;;:::i;19917:315::-;;;;;;;;;;-1:-1:-1;48208:1:0;20183:12;19970:7;20167:13;:28;-1:-1:-1;;20167:46:0;19917:315;;49801:73;;;;;;;;;;;;;:::i;52051:88::-;;;;;;;;;;-1:-1:-1;52122:9:0;;52051:88;;28830:170;;;;;;;;;;-1:-1:-1;28830:170:0;;;;;:::i;:::-;;:::i;49706:87::-;;;;;;;;;;-1:-1:-1;49706:87:0;;;;;:::i;:::-;;:::i;50232:315::-;;;;;;;;;;-1:-1:-1;50232:315:0;;;;;:::i;:::-;;:::i;51304:93::-;;;;;;;;;;;;;:::i;49443:121::-;;;;;;;;;;-1:-1:-1;49443:121:0;;;;;:::i;:::-;;:::i;50995:301::-;;;;;;;;;;;;;:::i;50922:65::-;;;;;;;;;;;;;:::i;29071:185::-;;;;;;;;;;-1:-1:-1;29071:185:0;;;;;:::i;:::-;;:::i;48416:100::-;;;;;;;;;;-1:-1:-1;48416:100:0;;;;;:::i;:::-;;:::i;4074:86::-;;;;;;;;;;-1:-1:-1;4145:7:0;;-1:-1:-1;;;4145:7:0;;;;4074:86;;25665:144;;;;;;;;;;-1:-1:-1;25665:144:0;;;;;:::i;:::-;;:::i;50101:123::-;;;;;;;;;;-1:-1:-1;50101:123:0;;;;;:::i;:::-;;:::i;46301:135::-;;;;;;;;;;;;;:::i;21542:224::-;;;;;;;;;;-1:-1:-1;21542:224:0;;;;;:::i;:::-;;:::i;6973:103::-;;;;;;;;;;;;;:::i;49345:90::-;;;;;;;;;;-1:-1:-1;49345:90:0;;;;;:::i;:::-;;:::i;50853:61::-;;;;;;;;;;;;;:::i;46862:1136::-;;;;;;;;;;-1:-1:-1;46862:1136:0;;;;;:::i;:::-;;:::i;6322:87::-;;;;;;;;;;-1:-1:-1;6395:6:0;;-1:-1:-1;;;;;6395:6:0;6322:87;;26045:104;;;;;;;;;;;;;:::i;46660:41::-;;;;;;;;;;;;;;;;49882:75;;;;;;;;;;;;;:::i;51405:638::-;;;;;;:::i;:::-;;:::i;28220:308::-;;;;;;;;;;-1:-1:-1;28220:308:0;;;;;:::i;:::-;;:::i;46794:26::-;;;;;;;;;;-1:-1:-1;46794:26:0;;;;;;;;;;;48524:96;;;;;;;;;;-1:-1:-1;48524:96:0;;;;;:::i;:::-;;:::i;49572:126::-;;;;;;;;;;-1:-1:-1;49572:126:0;;;;;:::i;:::-;;:::i;29327:396::-;;;;;;;;;;-1:-1:-1;29327:396:0;;;;;:::i;:::-;;:::i;46577:37::-;;;;;;;;;;;;;:::i;48628:709::-;;;;;;;;;;-1:-1:-1;48628:709:0;;;;;:::i;:::-;;:::i;46708:31::-;;;;;;;;;;;;;;;;50555:290;;;;;;;;;;-1:-1:-1;50555:290:0;;;;;:::i;:::-;;:::i;:::-;;;;7058:14:1;;7051:22;7033:41;;7105:2;7090:18;;7083:34;;;;7006:18;50555:290:0;6865:258:1;49965:128:0;;;;;;;;;;-1:-1:-1;49965:128:0;;;;;:::i;:::-;;:::i;28599:164::-;;;;;;;;;;-1:-1:-1;28599:164:0;;;;;:::i;:::-;;:::i;7231:201::-;;;;;;;;;;-1:-1:-1;7231:201:0;;;;;:::i;:::-;;:::i;46827:26::-;;;;;;;;;;-1:-1:-1;46827:26:0;;;;;;;;;;;20863:615;20948:4;-1:-1:-1;;;;;;;;;21248:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;21325:25:0;;;21248:102;:179;;;-1:-1:-1;;;;;;;;;;21402:25:0;;;21248:179;21228:199;20863:615;-1:-1:-1;;20863:615:0:o;25876:100::-;25930:13;25963:5;25956:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25876:100;:::o;27944:204::-;28012:7;28037:16;28045:7;28037;:16::i;:::-;28032:64;;28062:34;;-1:-1:-1;;;28062:34:0;;;;;;;;;;;28032:64;-1:-1:-1;28116:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;28116:24:0;;27944:204::o;27404:474::-;27477:13;27509:27;27528:7;27509:18;:27::i;:::-;27477:61;;27559:5;-1:-1:-1;;;;;27553:11:0;:2;-1:-1:-1;;;;;27553:11:0;;27549:48;;27573:24;;-1:-1:-1;;;27573:24:0;;;;;;;;;;;27549:48;44047:10;-1:-1:-1;;;;;27614:28:0;;;27610:175;;27662:44;27679:5;44047:10;28599:164;:::i;27662:44::-;27657:128;;27734:35;;-1:-1:-1;;;27734:35:0;;;;;;;;;;;27657:128;27797:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;27797:29:0;-1:-1:-1;;;;;27797:29:0;;;;;;;;;27842:28;;27797:24;;27842:28;;;;;;;27466:412;27404:474;;:::o;46443:127::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49801:73::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;;;;;;;;;49852:7:::1;:14:::0;;-1:-1:-1;;49852:14:0::1;::::0;::::1;::::0;;49801:73::o;28830:170::-;28964:28;28974:4;28980:2;28984:7;28964:9;:28::i;:::-;28830:170;;;:::o;49706:87::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;49769:6:::1;:16:::0;;;::::1;;;;-1:-1:-1::0;;49769:16:0;;::::1;::::0;;;::::1;::::0;;49706:87::o;50232:315::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;50310:23:::1;50335:9:::0;50348:27:::1;50366:8;50348:17;:27::i;:::-;50309:66;;;;50389:18;50386:153;;;50445:16;50462:23:::0;;:27:::1;::::0;50488:1:::1;::::0;50462:27:::1;:::i;:::-;50445:45;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;50423:16:::1;:19:::0;;-1:-1:-1;;;;;50445:45:0;;::::1;::::0;50440:1;;50423:19;::::1;;;;;:::i;:::-;;;;;;;;;:67;;;;;-1:-1:-1::0;;;;;50423:67:0::1;;;;;-1:-1:-1::0;;;;;50423:67:0::1;;;;;;50505:16;:22;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;50505:22:0;;;;;-1:-1:-1;;;;;;50505:22:0::1;::::0;;;;;50298:249:::1;;50232:315:::0;:::o;51304:93::-;51349:7;51376:13;48208:1;20183:12;19970:7;20167:13;-1:-1:-1;;20167:28:0;;;:46;;19917:315;51376:13;51369:20;;51304:93;:::o;49443:121::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;49524:13:::1;:32:::0;49443:121::o;50995:301::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;4145:7;;-1:-1:-1;;;4145:7:0;;;;4399:9:::1;4391:38;;;;-1:-1:-1::0;;;4391:38:0::1;;;;;;;:::i;:::-;51074:21:::2;51114:11:::0;51106:54:::2;;;::::0;-1:-1:-1;;;51106:54:0;;9215:2:1;51106:54:0::2;::::0;::::2;9197:21:1::0;9254:2;9234:18;;;9227:30;9293:32;9273:18;;;9266:60;9343:18;;51106:54:0::2;9013:354:1::0;51106:54:0::2;51174:12;51200:7;6395:6:::0;;-1:-1:-1;;;;;6395:6:0;;6322:87;51200:7:::2;-1:-1:-1::0;;;;;51192:21:0::2;51222:7;51192:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51173:63;;;51255:7;51247:41;;;::::0;-1:-1:-1;;;51247:41:0;;9784:2:1;51247:41:0::2;::::0;::::2;9766:21:1::0;9823:2;9803:18;;;9796:30;-1:-1:-1;;;9842:18:1;;;9835:51;9903:18;;51247:41:0::2;9582:345:1::0;51247:41:0::2;51048:248;;50995:301::o:0;50922:65::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;50969:10:::1;:8;:10::i;:::-;50922:65::o:0;29071:185::-;29209:39;29226:4;29232:2;29236:7;29209:39;;;;;;;;;;;;:16;:39::i;48416:100::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;48490:7:::1;:18;48500:8:::0;48490:7;:18:::1;:::i;25665:144::-:0;25729:7;25772:27;25791:7;25772:18;:27::i;50101:123::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;50187:29;;::::1;::::0;:16:::1;::::0;:29:::1;::::0;::::1;::::0;::::1;:::i;46301:135::-:0;;;;;;;:::i;21542:224::-;21606:7;-1:-1:-1;;;;;21630:19:0;;21626:60;;21658:28;;-1:-1:-1;;;21658:28:0;;;;;;;;;;;21626:60;-1:-1:-1;;;;;;21704:25:0;;;;;:18;:25;;;;;;16881:13;21704:54;;21542:224::o;6973:103::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;7038:30:::1;7065:1;7038:18;:30::i;49345:90::-:0;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;49412:4:::1;:15:::0;49345:90::o;50853:61::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;50898:8:::1;:6;:8::i;46862:1136::-:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46862:1136:0;;-1:-1:-1;46862:1136:0;:::o;26045:104::-;26101:13;26134:7;26127:14;;;;;:::i;49882:75::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;49934:7:::1;:15:::0;;-1:-1:-1;;49934:15:0::1;::::0;;49882:75::o;51405:638::-;4145:7;;-1:-1:-1;;;4145:7:0;;;;4399:9;4391:38;;;;-1:-1:-1;;;4391:38:0;;;;;;;:::i;:::-;51480:14:::1;51497:13;48208:1:::0;20183:12;19970:7;20167:13;-1:-1:-1;;20167:28:0;;;:46;;19917:315;51497:13:::1;51480:30;;51543:1;51529:11;:15;51521:24;;;::::0;::::1;;51588:9;::::0;51564:20:::1;51573:11:::0;51564:6;:20:::1;:::i;:::-;:33;;51556:42;;;::::0;::::1;;51610:16;51632:29;51650:10;51632:17;:29::i;:::-;-1:-1:-1::0;51675:7:0::1;::::0;51609:52;;-1:-1:-1;51675:7:0;;::::1;;;51672:317;;;51707:11;51699:73;;;::::0;-1:-1:-1;;;51699:73:0;;12468:2:1;51699:73:0::1;::::0;::::1;12450:21:1::0;12507:2;12487:18;;;12480:30;12546:34;12526:18;;;12519:62;-1:-1:-1;;;12597:18:1;;;12590:47;12654:19;;51699:73:0::1;12266:413:1::0;51699:73:0::1;51824:11;51808:13;;:27;;;;:::i;:::-;51795:9;:40;;51787:95;;;::::0;-1:-1:-1;;;51787:95:0;;13059:2:1;51787:95:0::1;::::0;::::1;13041:21:1::0;13098:2;13078:18;;;13071:30;13137:34;13117:18;;;13110:62;-1:-1:-1;;;13188:18:1;;;13181:40;13238:19;;51787:95:0::1;12857:406:1::0;51787:95:0::1;51672:317;;;51943:11;51936:4;;:18;;;;:::i;:::-;51923:9;:31;;51915:62;;;::::0;-1:-1:-1;;;51915:62:0;;13470:2:1;51915:62:0::1;::::0;::::1;13452:21:1::0;13509:2;13489:18;;;13482:30;-1:-1:-1;;;13528:18:1;;;13521:48;13586:18;;51915:62:0::1;13268:342:1::0;51915:62:0::1;52001:34;52011:10;52023:11;52001:9;:34::i;28220:308::-:0;44047:10;-1:-1:-1;;;;;28319:31:0;;;28315:61;;28359:17;;-1:-1:-1;;;28359:17:0;;;;;;;;;;;28315:61;44047:10;28389:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;28389:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;28389:60:0;;;;;;;;;;28465:55;;729:41:1;;;28389:49:0;;44047:10;28465:55;;702:18:1;28465:55:0;;;;;;;28220:308;;:::o;48524:96::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;48596:9:::1;:16;48608:4:::0;48596:9;:16:::1;:::i;49572:126::-:0;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;49655:21:::1;:35:::0;;-1:-1:-1;;49655:35:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;49572:126::o;29327:396::-;29494:28;29504:4;29510:2;29514:7;29494:9;:28::i;:::-;-1:-1:-1;;;;;29537:14:0;;;:19;29533:183;;29576:56;29607:4;29613:2;29617:7;29626:5;29576:30;:56::i;:::-;29571:145;;29660:40;;-1:-1:-1;;;29660:40:0;;;;;;;;;;;29571:145;29327:396;;;;:::o;46577:37::-;;;;;;;:::i;48628:709::-;48746:13;48799:16;48807:7;48799;:16::i;:::-;48777:113;;;;-1:-1:-1;;;48777:113:0;;13817:2:1;48777:113:0;;;13799:21:1;13856:2;13836:18;;;13829:30;13895:34;13875:18;;;13868:62;-1:-1:-1;;;13946:18:1;;;13939:45;14001:19;;48777:113:0;13615:411:1;48777:113:0;48907:6;;;;;;;48903:55;;48937:9;48930:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48628:709;;;:::o;48903:55::-;48970:28;49001:10;:8;:10::i;:::-;48970:41;;49073:1;49048:14;49042:28;:32;:287;;;;;;;;;;;;;;;;;49166:14;49207:18;:7;:16;:18::i;:::-;49252:13;49123:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49042:287;49022:307;48628:709;-1:-1:-1;;;48628:709:0:o;50555:290::-;50620:4;50626:7;50650:9;50646:164;50667:16;:23;50663:27;;50646:164;;;50727:16;50744:1;50727:19;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;50727:19:0;;;50715:31;;;;50712:87;;50775:4;;50781:1;;-1:-1:-1;50555:290:0;-1:-1:-1;;50555:290:0:o;50712:87::-;50692:3;;;;:::i;:::-;;;;50646:164;;;-1:-1:-1;50828:5:0;;;;-1:-1:-1;50555:290:0;-1:-1:-1;;50555:290:0:o;49965:128::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;50052:13:::1;:33;50068:17:::0;50052:13;:33:::1;:::i;28599:164::-:0;-1:-1:-1;;;;;28720:25:0;;;28696:4;28720:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;28599:164::o;7231:201::-;6395:6;;-1:-1:-1;;;;;6395:6:0;44047:10;6542:23;6534:68;;;;-1:-1:-1;;;6534:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7320:22:0;::::1;7312:73;;;::::0;-1:-1:-1;;;7312:73:0;;15634:2:1;7312:73:0::1;::::0;::::1;15616:21:1::0;15673:2;15653:18;;;15646:30;15712:34;15692:18;;;15685:62;-1:-1:-1;;;15763:18:1;;;15756:36;15809:19;;7312:73:0::1;15432:402:1::0;7312:73:0::1;7396:28;7415:8;7396:18;:28::i;:::-;7231:201:::0;:::o;29978:273::-;30035:4;30091:7;48208:1;30072:26;;:66;;;;;30125:13;;30115:7;:23;30072:66;:152;;;;-1:-1:-1;;30176:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;30176:43:0;:48;;29978:273::o;23180:1129::-;23247:7;23282;;48208:1;23331:23;23327:915;;23384:13;;23377:4;:20;23373:869;;;23422:14;23439:23;;;:17;:23;;;;;;;-1:-1:-1;;;23528:23:0;;:28;;23524:699;;24047:113;24054:6;24064:1;24054:11;24047:113;;-1:-1:-1;;;24125:6:0;24107:25;;;;:17;:25;;;;;;24047:113;;23524:699;23399:843;23373:869;24270:31;;-1:-1:-1;;;24270:31:0;;;;;;;;;;;35217:2515;35332:27;35362;35381:7;35362:18;:27::i;:::-;35332:57;;35447:4;-1:-1:-1;;;;;35406:45:0;35422:19;-1:-1:-1;;;;;35406:45:0;;35402:86;;35460:28;;-1:-1:-1;;;35460:28:0;;;;;;;;;;;35402:86;35501:22;44047:10;-1:-1:-1;;;;;35527:27:0;;;;:87;;-1:-1:-1;35571:43:0;35588:4;44047:10;28599:164;:::i;35571:43::-;35527:147;;;-1:-1:-1;44047:10:0;35631:20;35643:7;35631:11;:20::i;:::-;-1:-1:-1;;;;;35631:43:0;;35527:147;35501:174;;35693:17;35688:66;;35719:35;;-1:-1:-1;;;35719:35:0;;;;;;;;;;;35688:66;-1:-1:-1;;;;;35769:16:0;;35765:52;;35794:23;;-1:-1:-1;;;35794:23:0;;;;;;;;;;;35765:52;35946:24;;;;:15;:24;;;;;;;;35939:31;;-1:-1:-1;;;;;;35939:31:0;;;-1:-1:-1;;;;;36338:24:0;;;;;:18;:24;;;;;36336:26;;-1:-1:-1;;36336:26:0;;;36407:22;;;;;;;36405:24;;-1:-1:-1;36405:24:0;;;36700:26;;;:17;:26;;;;;-1:-1:-1;;;36788:15:0;17535:3;36788:41;36746:84;;:128;;36700:174;;;36994:46;;:51;;36990:626;;37098:1;37088:11;;37066:19;37221:30;;;:17;:30;;;;;;:35;;37217:384;;37359:13;;37344:11;:28;37340:242;;37506:30;;;;:17;:30;;;;;:52;;;37340:242;37047:569;36990:626;37663:7;37659:2;-1:-1:-1;;;;;37644:27:0;37653:4;-1:-1:-1;;;;;37644:27:0;;;;;;;;;;;35321:2411;;35217:2515;;;:::o;5133:120::-;4145:7;;-1:-1:-1;;;4145:7:0;;;;4669:41;;;;-1:-1:-1;;;4669:41:0;;16041:2:1;4669:41:0;;;16023:21:1;16080:2;16060:18;;;16053:30;-1:-1:-1;;;16099:18:1;;;16092:50;16159:18;;4669:41:0;15839:344:1;4669:41:0;5192:7:::1;:15:::0;;-1:-1:-1;;;;5192:15:0::1;::::0;;5223:22:::1;44047:10:::0;5232:12:::1;5223:22;::::0;-1:-1:-1;;;;;1886:32:1;;;1868:51;;1856:2;1841:18;5223:22:0::1;;;;;;;5133:120::o:0;7592:191::-;7685:6;;;-1:-1:-1;;;;;7702:17:0;;;-1:-1:-1;;;;;;7702:17:0;;;;;;;7735:40;;7685:6;;;7702:17;7685:6;;7735:40;;7666:16;;7735:40;7655:128;7592:191;:::o;4874:118::-;4145:7;;-1:-1:-1;;;4145:7:0;;;;4399:9;4391:38;;;;-1:-1:-1;;;4391:38:0;;;;;;;:::i;:::-;4934:7:::1;:14:::0;;-1:-1:-1;;;;4934:14:0::1;-1:-1:-1::0;;;4934:14:0::1;::::0;;4964:20:::1;4971:12;44047:10:::0;;43960:105;30335:104;30404:27;30414:2;30418:8;30404:27;;;;;;;;;;;;:9;:27::i;41429:716::-;41613:88;;-1:-1:-1;;;41613:88:0;;41592:4;;-1:-1:-1;;;;;41613:45:0;;;;;:88;;44047:10;;41680:4;;41686:7;;41695:5;;41613:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41613:88:0;;;;;;;;-1:-1:-1;;41613:88:0;;;;;;;;;;;;:::i;:::-;;;41609:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41896:6;:13;41913:1;41896:18;41892:235;;41942:40;;-1:-1:-1;;;41942:40:0;;;;;;;;;;;41892:235;42085:6;42079:13;42070:6;42066:2;42062:15;42055:38;41609:529;-1:-1:-1;;;;;;41772:64:0;-1:-1:-1;;;41772:64:0;;-1:-1:-1;41609:529:0;41429:716;;;;;;:::o;48300:108::-;48360:13;48393:7;48386:14;;;;;:::i;288:723::-;344:13;565:5;574:1;565:10;561:53;;-1:-1:-1;;592:10:0;;;;;;;;;;;;-1:-1:-1;;;592:10:0;;;;;288:723::o;561:53::-;639:5;624:12;680:78;687:9;;680:78;;713:8;;;;:::i;:::-;;-1:-1:-1;736:10:0;;-1:-1:-1;744:2:0;736:10;;:::i;:::-;;;680:78;;;768:19;800:6;790:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;790:17:0;;768:39;;818:154;825:10;;818:154;;852:11;862:1;852:11;;:::i;:::-;;-1:-1:-1;921:10:0;929:2;921:5;:10;:::i;:::-;908:24;;:2;:24;:::i;:::-;895:39;;878:6;885;878:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;878:56:0;;;;;;;;-1:-1:-1;949:11:0;958:2;949:11;;:::i;:::-;;;818:154;;30812:2236;30935:20;30958:13;-1:-1:-1;;;;;30986:16:0;;30982:48;;31011:19;;-1:-1:-1;;;31011:19:0;;;;;;;;;;;30982:48;31045:8;31057:1;31045:13;31041:44;;31067:18;;-1:-1:-1;;;31067:18:0;;;;;;;;;;;31041:44;-1:-1:-1;;;;;31634:22:0;;;;;;:18;:22;;;;17018:2;31634:22;;;:70;;31672:31;31660:44;;31634:70;;;31947:31;;;:17;:31;;;;;32040:15;17535:3;32040:41;31998:84;;-1:-1:-1;32118:13:0;;17798:3;32103:56;31998:162;31947:213;;:31;;32241:23;;;;32285:14;:19;32281:635;;32325:313;32356:38;;32381:12;;-1:-1:-1;;;;;32356:38:0;;;32373:1;;32356:38;;32373:1;;32356:38;32422:69;32461:1;32465:2;32469:14;;;;;;32485:5;32422:30;:69::i;:::-;32417:174;;32527:40;;-1:-1:-1;;;32527:40:0;;;;;;;;;;;32417:174;32633:3;32618:12;:18;32325:313;;32719:12;32702:13;;:29;32698:43;;32733:8;;;32698:43;32281:635;;;32782:119;32813:40;;32838:14;;;;;-1:-1:-1;;;;;32813:40:0;;;32830:1;;32813:40;;32830:1;;32813:40;32896:3;32881:12;:18;32782:119;;32281:635;-1:-1:-1;32930:13:0;:28;;;32980:60;;33013:2;33017:12;33031:8;32980:60;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;203:131:1;-1:-1:-1;;;;;;277:32:1;;267:43;;257:71;;324:1;321;314:12;339:245;397:6;450:2;438:9;429:7;425:23;421:32;418:52;;;466:1;463;456:12;418:52;505:9;492:23;524:30;548:5;524:30;:::i;781:250::-;866:1;876:113;890:6;887:1;884:13;876:113;;;966:11;;;960:18;947:11;;;940:39;912:2;905:10;876:113;;;-1:-1:-1;;1023:1:1;1005:16;;998:27;781:250::o;1036:271::-;1078:3;1116:5;1110:12;1143:6;1138:3;1131:19;1159:76;1228:6;1221:4;1216:3;1212:14;1205:4;1198:5;1194:16;1159:76;:::i;:::-;1289:2;1268:15;-1:-1:-1;;1264:29:1;1255:39;;;;1296:4;1251:50;;1036:271;-1:-1:-1;;1036:271:1:o;1312:220::-;1461:2;1450:9;1443:21;1424:4;1481:45;1522:2;1511:9;1507:18;1499:6;1481:45;:::i;1537:180::-;1596:6;1649:2;1637:9;1628:7;1624:23;1620:32;1617:52;;;1665:1;1662;1655:12;1617:52;-1:-1:-1;1688:23:1;;1537:180;-1:-1:-1;1537:180:1:o;1930:173::-;1998:20;;-1:-1:-1;;;;;2047:31:1;;2037:42;;2027:70;;2093:1;2090;2083:12;2027:70;1930:173;;;:::o;2108:254::-;2176:6;2184;2237:2;2225:9;2216:7;2212:23;2208:32;2205:52;;;2253:1;2250;2243:12;2205:52;2276:29;2295:9;2276:29;:::i;:::-;2266:39;2352:2;2337:18;;;;2324:32;;-1:-1:-1;;;2108:254:1:o;2549:328::-;2626:6;2634;2642;2695:2;2683:9;2674:7;2670:23;2666:32;2663:52;;;2711:1;2708;2701:12;2663:52;2734:29;2753:9;2734:29;:::i;:::-;2724:39;;2782:38;2816:2;2805:9;2801:18;2782:38;:::i;:::-;2772:48;;2867:2;2856:9;2852:18;2839:32;2829:42;;2549:328;;;;;:::o;2882:160::-;2947:20;;3003:13;;2996:21;2986:32;;2976:60;;3032:1;3029;3022:12;3047:180;3103:6;3156:2;3144:9;3135:7;3131:23;3127:32;3124:52;;;3172:1;3169;3162:12;3124:52;3195:26;3211:9;3195:26;:::i;3232:186::-;3291:6;3344:2;3332:9;3323:7;3319:23;3315:32;3312:52;;;3360:1;3357;3350:12;3312:52;3383:29;3402:9;3383:29;:::i;3423:127::-;3484:10;3479:3;3475:20;3472:1;3465:31;3515:4;3512:1;3505:15;3539:4;3536:1;3529:15;3555:275;3626:2;3620:9;3691:2;3672:13;;-1:-1:-1;;3668:27:1;3656:40;;3726:18;3711:34;;3747:22;;;3708:62;3705:88;;;3773:18;;:::i;:::-;3809:2;3802:22;3555:275;;-1:-1:-1;3555:275:1:o;3835:407::-;3900:5;3934:18;3926:6;3923:30;3920:56;;;3956:18;;:::i;:::-;3994:57;4039:2;4018:15;;-1:-1:-1;;4014:29:1;4045:4;4010:40;3994:57;:::i;:::-;3985:66;;4074:6;4067:5;4060:21;4114:3;4105:6;4100:3;4096:16;4093:25;4090:45;;;4131:1;4128;4121:12;4090:45;4180:6;4175:3;4168:4;4161:5;4157:16;4144:43;4234:1;4227:4;4218:6;4211:5;4207:18;4203:29;4196:40;3835:407;;;;;:::o;4247:451::-;4316:6;4369:2;4357:9;4348:7;4344:23;4340:32;4337:52;;;4385:1;4382;4375:12;4337:52;4425:9;4412:23;4458:18;4450:6;4447:30;4444:50;;;4490:1;4487;4480:12;4444:50;4513:22;;4566:4;4558:13;;4554:27;-1:-1:-1;4544:55:1;;4595:1;4592;4585:12;4544:55;4618:74;4684:7;4679:2;4666:16;4661:2;4657;4653:11;4618:74;:::i;4703:952::-;4787:6;4818:2;4861;4849:9;4840:7;4836:23;4832:32;4829:52;;;4877:1;4874;4867:12;4829:52;4917:9;4904:23;4946:18;4987:2;4979:6;4976:14;4973:34;;;5003:1;5000;4993:12;4973:34;5041:6;5030:9;5026:22;5016:32;;5086:7;5079:4;5075:2;5071:13;5067:27;5057:55;;5108:1;5105;5098:12;5057:55;5144:2;5131:16;5166:2;5162;5159:10;5156:36;;;5172:18;;:::i;:::-;5218:2;5215:1;5211:10;5201:20;;5241:28;5265:2;5261;5257:11;5241:28;:::i;:::-;5303:15;;;5373:11;;;5369:20;;;5334:12;;;;5401:19;;;5398:39;;;5433:1;5430;5423:12;5398:39;5457:11;;;;5477:148;5493:6;5488:3;5485:15;5477:148;;;5559:23;5578:3;5559:23;:::i;:::-;5547:36;;5510:12;;;;5603;;;;5477:148;;;5644:5;4703:952;-1:-1:-1;;;;;;;;4703:952:1:o;5660:254::-;5725:6;5733;5786:2;5774:9;5765:7;5761:23;5757:32;5754:52;;;5802:1;5799;5792:12;5754:52;5825:29;5844:9;5825:29;:::i;:::-;5815:39;;5873:35;5904:2;5893:9;5889:18;5873:35;:::i;:::-;5863:45;;5660:254;;;;;:::o;5919:269::-;5976:6;6029:2;6017:9;6008:7;6004:23;6000:32;5997:52;;;6045:1;6042;6035:12;5997:52;6084:9;6071:23;6134:4;6127:5;6123:16;6116:5;6113:27;6103:55;;6154:1;6151;6144:12;6193:667;6288:6;6296;6304;6312;6365:3;6353:9;6344:7;6340:23;6336:33;6333:53;;;6382:1;6379;6372:12;6333:53;6405:29;6424:9;6405:29;:::i;:::-;6395:39;;6453:38;6487:2;6476:9;6472:18;6453:38;:::i;:::-;6443:48;;6538:2;6527:9;6523:18;6510:32;6500:42;;6593:2;6582:9;6578:18;6565:32;6620:18;6612:6;6609:30;6606:50;;;6652:1;6649;6642:12;6606:50;6675:22;;6728:4;6720:13;;6716:27;-1:-1:-1;6706:55:1;;6757:1;6754;6747:12;6706:55;6780:74;6846:7;6841:2;6828:16;6823:2;6819;6815:11;6780:74;:::i;:::-;6770:84;;;6193:667;;;;;;;:::o;7128:260::-;7196:6;7204;7257:2;7245:9;7236:7;7232:23;7228:32;7225:52;;;7273:1;7270;7263:12;7225:52;7296:29;7315:9;7296:29;:::i;:::-;7286:39;;7344:38;7378:2;7367:9;7363:18;7344:38;:::i;7393:380::-;7472:1;7468:12;;;;7515;;;7536:61;;7590:4;7582:6;7578:17;7568:27;;7536:61;7643:2;7635:6;7632:14;7612:18;7609:38;7606:161;;7689:10;7684:3;7680:20;7677:1;7670:31;7724:4;7721:1;7714:15;7752:4;7749:1;7742:15;7606:161;;7393:380;;;:::o;7778:356::-;7980:2;7962:21;;;7999:18;;;7992:30;8058:34;8053:2;8038:18;;8031:62;8125:2;8110:18;;7778:356::o;8139:127::-;8200:10;8195:3;8191:20;8188:1;8181:31;8231:4;8228:1;8221:15;8255:4;8252:1;8245:15;8271:128;8338:9;;;8359:11;;;8356:37;;;8373:18;;:::i;8404:127::-;8465:10;8460:3;8456:20;8453:1;8446:31;8496:4;8493:1;8486:15;8520:4;8517:1;8510:15;8536:127;8597:10;8592:3;8588:20;8585:1;8578:31;8628:4;8625:1;8618:15;8652:4;8649:1;8642:15;8668:340;8870:2;8852:21;;;8909:2;8889:18;;;8882:30;-1:-1:-1;;;8943:2:1;8928:18;;8921:46;8999:2;8984:18;;8668:340::o;10058:545::-;10160:2;10155:3;10152:11;10149:448;;;10196:1;10221:5;10217:2;10210:17;10266:4;10262:2;10252:19;10336:2;10324:10;10320:19;10317:1;10313:27;10307:4;10303:38;10372:4;10360:10;10357:20;10354:47;;;-1:-1:-1;10395:4:1;10354:47;10450:2;10445:3;10441:12;10438:1;10434:20;10428:4;10424:31;10414:41;;10505:82;10523:2;10516:5;10513:13;10505:82;;;10568:17;;;10549:1;10538:13;10505:82;;;10509:3;;;10058:545;;;:::o;10779:1352::-;10905:3;10899:10;10932:18;10924:6;10921:30;10918:56;;;10954:18;;:::i;:::-;10983:97;11073:6;11033:38;11065:4;11059:11;11033:38;:::i;:::-;11027:4;10983:97;:::i;:::-;11135:4;;11199:2;11188:14;;11216:1;11211:663;;;;11918:1;11935:6;11932:89;;;-1:-1:-1;11987:19:1;;;11981:26;11932:89;-1:-1:-1;;10736:1:1;10732:11;;;10728:24;10724:29;10714:40;10760:1;10756:11;;;10711:57;12034:81;;11181:944;;11211:663;10005:1;9998:14;;;10042:4;10029:18;;-1:-1:-1;;11247:20:1;;;11365:236;11379:7;11376:1;11373:14;11365:236;;;11468:19;;;11462:26;11447:42;;11560:27;;;;11528:1;11516:14;;;;11395:19;;11365:236;;;11369:3;11629:6;11620:7;11617:19;11614:201;;;11690:19;;;11684:26;-1:-1:-1;;11773:1:1;11769:14;;;11785:3;11765:24;11761:37;11757:42;11742:58;11727:74;;11614:201;-1:-1:-1;;;;;11861:1:1;11845:14;;;11841:22;11828:36;;-1:-1:-1;10779:1352:1:o;12136:125::-;12201:9;;;12222:10;;;12219:36;;;12235:18;;:::i;12684:168::-;12757:9;;;12788;;12805:15;;;12799:22;;12785:37;12775:71;;12826:18;;:::i;14031:1256::-;14255:3;14293:6;14287:13;14319:4;14332:64;14389:6;14384:3;14379:2;14371:6;14367:15;14332:64;:::i;:::-;14459:13;;14418:16;;;;14481:68;14459:13;14418:16;14516:15;;;14481:68;:::i;:::-;14638:13;;14571:20;;;14611:1;;14676:36;14638:13;14676:36;:::i;:::-;14731:1;14748:18;;;14775:141;;;;14930:1;14925:337;;;;14741:521;;14775:141;-1:-1:-1;;14810:24:1;;14796:39;;14887:16;;14880:24;14866:39;;14855:51;;;-1:-1:-1;14775:141:1;;14925:337;14956:6;14953:1;14946:17;15004:2;15001:1;14991:16;15029:1;15043:169;15057:8;15054:1;15051:15;15043:169;;;15139:14;;15124:13;;;15117:37;15182:16;;;;15074:10;;15043:169;;;15047:3;;15243:8;15236:5;15232:20;15225:27;;14741:521;-1:-1:-1;15278:3:1;;14031:1256;-1:-1:-1;;;;;;;;;;14031:1256:1:o;15292:135::-;15331:3;15352:17;;;15349:43;;15372:18;;:::i;:::-;-1:-1:-1;15419:1:1;15408:13;;15292:135::o;16188:489::-;-1:-1:-1;;;;;16457:15:1;;;16439:34;;16509:15;;16504:2;16489:18;;16482:43;16556:2;16541:18;;16534:34;;;16604:3;16599:2;16584:18;;16577:31;;;16382:4;;16625:46;;16651:19;;16643:6;16625:46;:::i;:::-;16617:54;16188:489;-1:-1:-1;;;;;;16188:489:1:o;16682:249::-;16751:6;16804:2;16792:9;16783:7;16779:23;16775:32;16772:52;;;16820:1;16817;16810:12;16772:52;16852:9;16846:16;16871:30;16895:5;16871:30;:::i;16936:127::-;16997:10;16992:3;16988:20;16985:1;16978:31;17028:4;17025:1;17018:15;17052:4;17049:1;17042:15;17068:120;17108:1;17134;17124:35;;17139:18;;:::i;:::-;-1:-1:-1;17173:9:1;;17068:120::o;17193:112::-;17225:1;17251;17241:35;;17256:18;;:::i;:::-;-1:-1:-1;17290:9:1;;17193:112::o
Swarm Source
ipfs://39cc657e0cbe88e661d2191465146c9eec4d8b015e42c3c393740c45109e57b8
Loading...
Loading
Loading...
Loading
[ 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.