Overview
TokenID
4799
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:
NFT
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "./ERC721.sol"; interface IERC20 { function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); } abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // Used for OpenSea Whitelisting contract OwnableDelegateProxy {} /** * Used to delegate ownership of a contract to another address, to save on unneeded transactions to approve contract use for users */ contract ProxyRegistry { mapping(address => OwnableDelegateProxy) public proxies; } contract NFT is ERC721A, ReentrancyGuard { // Project Name string private _name = "NoAzukiNoApe"; // Project Symbol string private _symbol = "NoAzukiNoApe"; // Locked, Presale, PublicSale enum Stage { Locked, Presale } Stage internal _currentStage; // Root Hash for Whitelist // OpenSea Whitelisting address public constant _proxyRegistryAddress = 0xa5409ec958C83C3f309868babACA7c86DCB077c1; // Wrapped Ethereum Address address constant _wrappedETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; // Total NFT Supply uint256 constant _totalSupply = 5555; // Presale Constants uint256 constant _preSaleMaxMint = 5; // Addresses for payment splitter here address constant account1 = 0xdb217A8bd47B0Dcd77FA71C6536640B1c27671b0; address constant account2 = 0xFc9F025e9192CeDa964602b51Dc801E35Db9518B; address immutable deployer; uint256 constant accountPercentage1 = 90; uint256 constant accountPercentage2 = 10; // Check if caller is sender modifier isUserCaller() { require(tx.origin == msg.sender, "Caller is Smart Contract"); _; } // Check if not locked modifier notLocked() { require(_currentStage != Stage.Locked, "Stage Locked"); _; } constructor(string memory URI_) ERC721A(_name,_symbol,URI_) { deployer = msg.sender; _currentStage = Stage.Locked; } /** * @dev See {IERC721Metadata-name}. */ function name() public view override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view override returns (string memory) { return _symbol; } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view override returns (bool) { ProxyRegistry proxyRegistry = ProxyRegistry(_proxyRegistryAddress); if (address(proxyRegistry.proxies(owner)) == operator) { return true; } return super.isApprovedForAll(owner,operator); } // Check if shareholder function isShareHolder() private isUserCaller view returns(bool) { return (msg.sender == account1) || (msg.sender == account2) || (msg.sender == deployer); } // Set stage for NFT drops function setStage(uint256 newStage) external onlyOwner { require(newStage <= 1, "Wrong Stage Index"); if(newStage == 0) { _currentStage = Stage.Locked; } else if(newStage == 1) { _currentStage = Stage.Presale; } } // Mint function function mint(uint256 quantity) external notLocked nonReentrant isUserCaller payable { require(quantity > 0, "Quantity cannot be 0"); uint256 currentSupply = totalSupply(); uint256 currentMintCount = _numberMinted(msg.sender); // numberMinted require(currentSupply + quantity <= _totalSupply, "Exceeds Collection Size"); require(currentMintCount + quantity <= _preSaleMaxMint, "Exceeds Allowed Mint"); _safeMint(msg.sender, quantity); } // Withdraw Wrapped ETH funds function withdrawWrappedETHFunds() external { require(isShareHolder(),"Not Shareholder"); // Get Wrapped Ethereum Balance of this contract IERC20 wrappedETHContract = IERC20(_wrappedETH); uint256 wETHBalance = wrappedETHContract.balanceOf(address(this)); wrappedETHContract.transfer(account1, wETHBalance * 90 / 100); wrappedETHContract.transfer(account2, wETHBalance * 10 / 100); } // Withdraw ETH Funds function withdrawETHFunds() external { require(isShareHolder(),"Not Shareholder"); // Get Ethereum Balance of this contract uint256 ETHBalance = address(this).balance; _widthdraw(account1,ETHBalance * 90 / 100); _widthdraw(account2,ETHBalance * 10 / 100); } function _widthdraw(address _address, uint256 _amount) internal { (bool success, ) = _address.call{value: _amount}(""); require(success, "Transfer failed."); } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } abstract contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } }
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.0; import "./ERC165.sol"; /** * @dev Interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } /** * @dev Interface of an ERC721Metadata compliant contract. */ interface 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); } /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A is IERC721, IERC721Metadata { /** * 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(); // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } /** * @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); } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } 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); } } /** * @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); } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } contract ERC721A is Ownable, ERC165, IERC721A { using Address for address; using Strings for uint256; // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Base URI string private _URI; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; constructor(string memory name_, string memory symbol_, string memory URI_) { _name = name_; _symbol = symbol_; _URI = URI_; _currentIndex = _startTokenId(); _registerInterface(_INTERFACE_ID_ERC721); _registerInterface(_INTERFACE_ID_ERC721_METADATA); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 1; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ 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(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString(),".json")) : ''; } /** * @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 _URI; } /** * @dev Set Base URI for computing {tokenURI}. Can be overriden in child contracts. */ function setBaseURI(string calldata URI) external virtual onlyOwner { _URI = URI; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } /** * @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 { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev 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 { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, true); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"URI_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newStage","type":"uint256"}],"name":"setStage","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":"withdrawETHFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawWrappedETHFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60e0604052600c60a08190526b4e6f417a756b694e6f41706560a01b60c09081526200002d9190816200034d565b5060408051808201909152600c8082526b4e6f417a756b694e6f41706560a01b60209092019182526200006391600d916200034d565b503480156200007157600080fd5b5060405162002437380380620024378339810160408190526200009491620003f3565b600c8054620000a390620004cf565b80601f0160208091040260200160405190810160405280929190818152602001828054620000d190620004cf565b8015620001225780601f10620000f65761010080835404028352916020019162000122565b820191906000526020600020905b8154815290600101906020018083116200010457829003601f168201915b5050505050600d80546200013690620004cf565b80601f01602080910402602001604051908101604052809291908181526020018280546200016490620004cf565b8015620001b55780601f106200018957610100808354040283529160200191620001b5565b820191906000526020600020905b8154815290600101906020018083116200019757829003601f168201915b505050505082620001d5620001cf6200027260201b60201c565b62000276565b620001e76301ffc9a760e01b620002c6565b8251620001fc9060049060208601906200034d565b508151620002129060059060208501906200034d565b508051620002289060069060208401906200034d565b506001600255620002406380ac58cd60e01b620002c6565b62000252635b5e139f60e01b620002c6565b50506001600b5550503360601b608052600e805460ff1916905562000522565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160e01b03198082161415620003255760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015260640160405180910390fd5b6001600160e01b0319166000908152600160208190526040909120805460ff19169091179055565b8280546200035b90620004cf565b90600052602060002090601f0160209004810192826200037f5760008555620003ca565b82601f106200039a57805160ff1916838001178555620003ca565b82800160010185558215620003ca579182015b82811115620003ca578251825591602001919060010190620003ad565b50620003d8929150620003dc565b5090565b5b80821115620003d85760008155600101620003dd565b600060208083850312156200040757600080fd5b82516001600160401b03808211156200041f57600080fd5b818501915085601f8301126200043457600080fd5b8151818111156200044957620004496200050c565b604051601f8201601f19908116603f011681019083821181831017156200047457620004746200050c565b8160405282815288868487010111156200048d57600080fd5b600093505b82841015620004b1578484018601518185018701529285019262000492565b82841115620004c35760008684830101525b98975050505050505050565b600181811c90821680620004e457607f821691505b602082108114156200050657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160601c611ef66200054160003960006110140152611ef66000f3fe6080604052600436106101405760003560e01c80636352211e116100b6578063a0712d681161006f578063a0712d6814610377578063a22cb4651461038a578063b88d4fde146103aa578063c87b56dd146103ca578063e985e9c5146103ea578063f2fde38b1461040a57600080fd5b80636352211e146102c757806370a08231146102e7578063715018a61461030757806389cd503a1461031c5780638da5cb5b1461034457806395d89b411461036257600080fd5b806318160ddd1161010857806318160ddd1461020b57806323b872dd146102325780633eb1d7771461025257806342842e0e1461027257806355f804b314610292578063629f349d146102b257600080fd5b806301ffc9a714610145578063045767731461017a57806306fdde0314610191578063081812fc146101b3578063095ea7b3146101eb575b600080fd5b34801561015157600080fd5b50610165610160366004611b36565b61042a565b60405190151581526020015b60405180910390f35b34801561018657600080fd5b5061018f610485565b005b34801561019d57600080fd5b506101a66106d1565b6040516101719190611cd9565b3480156101bf57600080fd5b506101d36101ce366004611bff565b610763565b6040516001600160a01b039091168152602001610171565b3480156101f757600080fd5b5061018f610206366004611aed565b6107a7565b34801561021757600080fd5b5060035460025403600019015b604051908152602001610171565b34801561023e57600080fd5b5061018f61024d36600461199e565b610830565b34801561025e57600080fd5b5061018f61026d366004611bff565b61083b565b34801561027e57600080fd5b5061018f61028d36600461199e565b6108d6565b34801561029e57600080fd5b5061018f6102ad366004611b8d565b6108f1565b3480156102be57600080fd5b5061018f610927565b3480156102d357600080fd5b506101d36102e2366004611bff565b6109c7565b3480156102f357600080fd5b50610224610302366004611948565b6109d9565b34801561031357600080fd5b5061018f610a28565b34801561032857600080fd5b506101d373a5409ec958c83c3f309868babaca7c86dcb077c181565b34801561035057600080fd5b506000546001600160a01b03166101d3565b34801561036e57600080fd5b506101a6610a5e565b61018f610385366004611bff565b610a6d565b34801561039657600080fd5b5061018f6103a5366004611abf565b610c9f565b3480156103b657600080fd5b5061018f6103c53660046119df565b610d35565b3480156103d657600080fd5b506101a66103e5366004611bff565b610d86565b3480156103f657600080fd5b50610165610405366004611965565b610e0b565b34801561041657600080fd5b5061018f610425366004611948565b610eea565b60006001600160e01b031982166380ac58cd60e01b148061045b57506001600160e01b03198216635b5e139f60e01b145b8061047f57506001600160e01b0319821660009081526001602052604090205460ff165b92915050565b61048d610f82565b6104d05760405162461bcd60e51b815260206004820152600f60248201526e2737ba1029b430b932b437b63232b960891b60448201526064015b60405180910390fd5b6040516370a0823160e01b815230600482015273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29060009082906370a082319060240160206040518083038186803b15801561051f57600080fd5b505afa158015610533573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105579190611c18565b90506001600160a01b03821663a9059cbb73db217a8bd47b0dcd77fa71c6536640b1c27671b0606461058a85605a611d4d565b6105949190611d39565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156105da57600080fd5b505af11580156105ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106129190611b19565b506001600160a01b03821663a9059cbb73fc9f025e9192ceda964602b51dc801e35db9518b606461064485600a611d4d565b61064e9190611d39565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561069457600080fd5b505af11580156106a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106cc9190611b19565b505050565b6060600c80546106e090611daf565b80601f016020809104026020016040519081016040528092919081815260200182805461070c90611daf565b80156107595780601f1061072e57610100808354040283529160200191610759565b820191906000526020600020905b81548152906001019060200180831161073c57829003601f168201915b5050505050905090565b600061076e8261103b565b61078b576040516333d1c03960e21b815260040160405180910390fd5b506000908152600960205260409020546001600160a01b031690565b60006107b2826109c7565b9050806001600160a01b0316836001600160a01b031614156107e75760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061080757506108058133610e0b565b155b15610825576040516367d9dca160e11b815260040160405180910390fd5b6106cc838383611074565b6106cc8383836110d0565b6000546001600160a01b031633146108655760405162461bcd60e51b81526004016104c790611cec565b60018111156108aa5760405162461bcd60e51b81526020600482015260116024820152700aee4dedcce40a6e8c2ceca4092dcc8caf607b1b60448201526064016104c7565b806108bc5750600e805460ff19169055565b80600114156108d357600e805460ff191660011790555b50565b6106cc83838360405180602001604052806000815250610d35565b6000546001600160a01b0316331461091b5760405162461bcd60e51b81526004016104c790611cec565b6106cc600683836118af565b61092f610f82565b61096d5760405162461bcd60e51b815260206004820152600f60248201526e2737ba1029b430b932b437b63232b960891b60448201526064016104c7565b476109a273db217a8bd47b0dcd77fa71c6536640b1c27671b0606461099384605a611d4d565b61099d9190611d39565b6112bf565b6108d373fc9f025e9192ceda964602b51dc801e35db9518b606461099384600a611d4d565b60006109d282611355565b5192915050565b60006001600160a01b038216610a02576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526008602052604090205467ffffffffffffffff1690565b6000546001600160a01b03163314610a525760405162461bcd60e51b81526004016104c790611cec565b610a5c600061147e565b565b6060600d80546106e090611daf565b6000600e5460ff166001811115610a8657610a86611e45565b1415610ac35760405162461bcd60e51b815260206004820152600c60248201526b14dd1859d948131bd8dad95960a21b60448201526064016104c7565b6002600b541415610b165760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104c7565b6002600b55323314610b655760405162461bcd60e51b815260206004820152601860248201527710d85b1b195c881a5cc814db585c9d0810dbdb9d1c9858dd60421b60448201526064016104c7565b60008111610bac5760405162461bcd60e51b815260206004820152601460248201527305175616e746974792063616e6e6f7420626520360641b60448201526064016104c7565b60035460025460009190036000190133600090815260086020526040902054909150600160401b900467ffffffffffffffff166115b3610bec8484611d21565b1115610c3a5760405162461bcd60e51b815260206004820152601760248201527f4578636565647320436f6c6c656374696f6e2053697a6500000000000000000060448201526064016104c7565b6005610c468483611d21565b1115610c8b5760405162461bcd60e51b8152602060048201526014602482015273115e18d959591cc8105b1b1bddd95908135a5b9d60621b60448201526064016104c7565b610c9533846114ce565b50506001600b5550565b6001600160a01b038216331415610cc95760405163b06307db60e01b815260040160405180910390fd5b336000818152600a602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610d408484846110d0565b6001600160a01b0383163b15158015610d625750610d60848484846114ec565b155b15610d80576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610d918261103b565b610dae57604051630a14c4b560e41b815260040160405180910390fd5b6000610db86115e3565b9050805160001415610dd95760405180602001604052806000815250610e04565b80610de3846115f2565b604051602001610df4929190611c5d565b6040516020818303038152906040525b9392505050565b60405163c455279160e01b81526001600160a01b03838116600483015260009173a5409ec958c83c3f309868babaca7c86dcb077c191841690829063c45527919060240160206040518083038186803b158015610e6757600080fd5b505afa158015610e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9f9190611b70565b6001600160a01b03161415610eb857600191505061047f565b6001600160a01b038085166000908152600a602090815260408083209387168352929052205460ff165b949350505050565b6000546001600160a01b03163314610f145760405162461bcd60e51b81526004016104c790611cec565b6001600160a01b038116610f795760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104c7565b6108d38161147e565b6000323314610fce5760405162461bcd60e51b815260206004820152601860248201527710d85b1b195c881a5cc814db585c9d0810dbdb9d1c9858dd60421b60448201526064016104c7565b3373db217a8bd47b0dcd77fa71c6536640b1c27671b0148061100357503373fc9f025e9192ceda964602b51dc801e35db9518b145b806110365750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b905090565b60008160011115801561104f575060025482105b801561047f575050600090815260076020526040902054600160e01b900460ff161590565b60008281526009602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006110db82611355565b9050836001600160a01b031681600001516001600160a01b0316146111125760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061113057506111308533610e0b565b8061114b57503361114084610763565b6001600160a01b0316145b90508061116b57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661119257604051633a954ecd60e21b815260040160405180910390fd5b61119e60008487611074565b6001600160a01b038581166000908152600860209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600790945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611274576002548214611274578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461130c576040519150601f19603f3d011682016040523d82523d6000602084013e611311565b606091505b50509050806106cc5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016104c7565b60408051606081018252600080825260208201819052918101919091528180600111158015611385575060025481105b1561146557600081815260076020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161515918101829052906114635780516001600160a01b0316156113f9579392505050565b5060001901600081815260076020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff161515928101929092521561145e579392505050565b6113f9565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6114e88282604051806020016040528060008152506116f0565b5050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611521903390899088908890600401611c9c565b602060405180830381600087803b15801561153b57600080fd5b505af192505050801561156b575060408051601f3d908101601f1916820190925261156891810190611b53565b60015b6115c6573d808015611599576040519150601f19603f3d011682016040523d82523d6000602084013e61159e565b606091505b5080516115be576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6060600680546106e090611daf565b6060816116165750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611640578061162a81611dea565b91506116399050600a83611d39565b915061161a565b60008167ffffffffffffffff81111561165b5761165b611e71565b6040519080825280601f01601f191660200182016040528015611685576020820181803683370190505b5090505b8415610ee25761169a600183611d6c565b91506116a7600a86611e05565b6116b2906030611d21565b60f81b8183815181106116c7576116c7611e5b565b60200101906001600160f81b031916908160001a9053506116e9600a86611d39565b9450611689565b6002546001600160a01b03841661171957604051622e076360e81b815260040160405180910390fd5b826117375760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260086020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168b018116918217600160401b67ffffffffffffffff1990941690921783900481168b01811690920217909155858452600790925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b1561185b575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461182460008784806001019550876114ec565b611841576040516368d2bf6b60e11b815260040160405180910390fd5b8082106117d957826002541461185657600080fd5b6118a0565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821061185c575b50600255610d80600085838684565b8280546118bb90611daf565b90600052602060002090601f0160209004810192826118dd5760008555611923565b82601f106118f65782800160ff19823516178555611923565b82800160010185558215611923579182015b82811115611923578235825591602001919060010190611908565b5061192f929150611933565b5090565b5b8082111561192f5760008155600101611934565b60006020828403121561195a57600080fd5b8135610e0481611e87565b6000806040838503121561197857600080fd5b823561198381611e87565b9150602083013561199381611e87565b809150509250929050565b6000806000606084860312156119b357600080fd5b83356119be81611e87565b925060208401356119ce81611e87565b929592945050506040919091013590565b600080600080608085870312156119f557600080fd5b8435611a0081611e87565b93506020850135611a1081611e87565b925060408501359150606085013567ffffffffffffffff80821115611a3457600080fd5b818701915087601f830112611a4857600080fd5b813581811115611a5a57611a5a611e71565b604051601f8201601f19908116603f01168101908382118183101715611a8257611a82611e71565b816040528281528a6020848701011115611a9b57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611ad257600080fd5b8235611add81611e87565b9150602083013561199381611e9c565b60008060408385031215611b0057600080fd5b8235611b0b81611e87565b946020939093013593505050565b600060208284031215611b2b57600080fd5b8151610e0481611e9c565b600060208284031215611b4857600080fd5b8135610e0481611eaa565b600060208284031215611b6557600080fd5b8151610e0481611eaa565b600060208284031215611b8257600080fd5b8151610e0481611e87565b60008060208385031215611ba057600080fd5b823567ffffffffffffffff80821115611bb857600080fd5b818501915085601f830112611bcc57600080fd5b813581811115611bdb57600080fd5b866020828501011115611bed57600080fd5b60209290920196919550909350505050565b600060208284031215611c1157600080fd5b5035919050565b600060208284031215611c2a57600080fd5b5051919050565b60008151808452611c49816020860160208601611d83565b601f01601f19169290920160200192915050565b60008351611c6f818460208801611d83565b835190830190611c83818360208801611d83565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611ccf90830184611c31565b9695505050505050565b602081526000610e046020830184611c31565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611d3457611d34611e19565b500190565b600082611d4857611d48611e2f565b500490565b6000816000190483118215151615611d6757611d67611e19565b500290565b600082821015611d7e57611d7e611e19565b500390565b60005b83811015611d9e578181015183820152602001611d86565b83811115610d805750506000910152565b600181811c90821680611dc357607f821691505b60208210811415611de457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611dfe57611dfe611e19565b5060010190565b600082611e1457611e14611e2f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146108d357600080fd5b80151581146108d357600080fd5b6001600160e01b0319811681146108d357600080fdfea2646970667358221220569100ec299d4e67875f1d82bf78c7108ae493a7e4a388e2cbfc257ada5cb75c64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101405760003560e01c80636352211e116100b6578063a0712d681161006f578063a0712d6814610377578063a22cb4651461038a578063b88d4fde146103aa578063c87b56dd146103ca578063e985e9c5146103ea578063f2fde38b1461040a57600080fd5b80636352211e146102c757806370a08231146102e7578063715018a61461030757806389cd503a1461031c5780638da5cb5b1461034457806395d89b411461036257600080fd5b806318160ddd1161010857806318160ddd1461020b57806323b872dd146102325780633eb1d7771461025257806342842e0e1461027257806355f804b314610292578063629f349d146102b257600080fd5b806301ffc9a714610145578063045767731461017a57806306fdde0314610191578063081812fc146101b3578063095ea7b3146101eb575b600080fd5b34801561015157600080fd5b50610165610160366004611b36565b61042a565b60405190151581526020015b60405180910390f35b34801561018657600080fd5b5061018f610485565b005b34801561019d57600080fd5b506101a66106d1565b6040516101719190611cd9565b3480156101bf57600080fd5b506101d36101ce366004611bff565b610763565b6040516001600160a01b039091168152602001610171565b3480156101f757600080fd5b5061018f610206366004611aed565b6107a7565b34801561021757600080fd5b5060035460025403600019015b604051908152602001610171565b34801561023e57600080fd5b5061018f61024d36600461199e565b610830565b34801561025e57600080fd5b5061018f61026d366004611bff565b61083b565b34801561027e57600080fd5b5061018f61028d36600461199e565b6108d6565b34801561029e57600080fd5b5061018f6102ad366004611b8d565b6108f1565b3480156102be57600080fd5b5061018f610927565b3480156102d357600080fd5b506101d36102e2366004611bff565b6109c7565b3480156102f357600080fd5b50610224610302366004611948565b6109d9565b34801561031357600080fd5b5061018f610a28565b34801561032857600080fd5b506101d373a5409ec958c83c3f309868babaca7c86dcb077c181565b34801561035057600080fd5b506000546001600160a01b03166101d3565b34801561036e57600080fd5b506101a6610a5e565b61018f610385366004611bff565b610a6d565b34801561039657600080fd5b5061018f6103a5366004611abf565b610c9f565b3480156103b657600080fd5b5061018f6103c53660046119df565b610d35565b3480156103d657600080fd5b506101a66103e5366004611bff565b610d86565b3480156103f657600080fd5b50610165610405366004611965565b610e0b565b34801561041657600080fd5b5061018f610425366004611948565b610eea565b60006001600160e01b031982166380ac58cd60e01b148061045b57506001600160e01b03198216635b5e139f60e01b145b8061047f57506001600160e01b0319821660009081526001602052604090205460ff165b92915050565b61048d610f82565b6104d05760405162461bcd60e51b815260206004820152600f60248201526e2737ba1029b430b932b437b63232b960891b60448201526064015b60405180910390fd5b6040516370a0823160e01b815230600482015273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29060009082906370a082319060240160206040518083038186803b15801561051f57600080fd5b505afa158015610533573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105579190611c18565b90506001600160a01b03821663a9059cbb73db217a8bd47b0dcd77fa71c6536640b1c27671b0606461058a85605a611d4d565b6105949190611d39565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156105da57600080fd5b505af11580156105ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106129190611b19565b506001600160a01b03821663a9059cbb73fc9f025e9192ceda964602b51dc801e35db9518b606461064485600a611d4d565b61064e9190611d39565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561069457600080fd5b505af11580156106a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106cc9190611b19565b505050565b6060600c80546106e090611daf565b80601f016020809104026020016040519081016040528092919081815260200182805461070c90611daf565b80156107595780601f1061072e57610100808354040283529160200191610759565b820191906000526020600020905b81548152906001019060200180831161073c57829003601f168201915b5050505050905090565b600061076e8261103b565b61078b576040516333d1c03960e21b815260040160405180910390fd5b506000908152600960205260409020546001600160a01b031690565b60006107b2826109c7565b9050806001600160a01b0316836001600160a01b031614156107e75760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061080757506108058133610e0b565b155b15610825576040516367d9dca160e11b815260040160405180910390fd5b6106cc838383611074565b6106cc8383836110d0565b6000546001600160a01b031633146108655760405162461bcd60e51b81526004016104c790611cec565b60018111156108aa5760405162461bcd60e51b81526020600482015260116024820152700aee4dedcce40a6e8c2ceca4092dcc8caf607b1b60448201526064016104c7565b806108bc5750600e805460ff19169055565b80600114156108d357600e805460ff191660011790555b50565b6106cc83838360405180602001604052806000815250610d35565b6000546001600160a01b0316331461091b5760405162461bcd60e51b81526004016104c790611cec565b6106cc600683836118af565b61092f610f82565b61096d5760405162461bcd60e51b815260206004820152600f60248201526e2737ba1029b430b932b437b63232b960891b60448201526064016104c7565b476109a273db217a8bd47b0dcd77fa71c6536640b1c27671b0606461099384605a611d4d565b61099d9190611d39565b6112bf565b6108d373fc9f025e9192ceda964602b51dc801e35db9518b606461099384600a611d4d565b60006109d282611355565b5192915050565b60006001600160a01b038216610a02576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526008602052604090205467ffffffffffffffff1690565b6000546001600160a01b03163314610a525760405162461bcd60e51b81526004016104c790611cec565b610a5c600061147e565b565b6060600d80546106e090611daf565b6000600e5460ff166001811115610a8657610a86611e45565b1415610ac35760405162461bcd60e51b815260206004820152600c60248201526b14dd1859d948131bd8dad95960a21b60448201526064016104c7565b6002600b541415610b165760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016104c7565b6002600b55323314610b655760405162461bcd60e51b815260206004820152601860248201527710d85b1b195c881a5cc814db585c9d0810dbdb9d1c9858dd60421b60448201526064016104c7565b60008111610bac5760405162461bcd60e51b815260206004820152601460248201527305175616e746974792063616e6e6f7420626520360641b60448201526064016104c7565b60035460025460009190036000190133600090815260086020526040902054909150600160401b900467ffffffffffffffff166115b3610bec8484611d21565b1115610c3a5760405162461bcd60e51b815260206004820152601760248201527f4578636565647320436f6c6c656374696f6e2053697a6500000000000000000060448201526064016104c7565b6005610c468483611d21565b1115610c8b5760405162461bcd60e51b8152602060048201526014602482015273115e18d959591cc8105b1b1bddd95908135a5b9d60621b60448201526064016104c7565b610c9533846114ce565b50506001600b5550565b6001600160a01b038216331415610cc95760405163b06307db60e01b815260040160405180910390fd5b336000818152600a602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610d408484846110d0565b6001600160a01b0383163b15158015610d625750610d60848484846114ec565b155b15610d80576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610d918261103b565b610dae57604051630a14c4b560e41b815260040160405180910390fd5b6000610db86115e3565b9050805160001415610dd95760405180602001604052806000815250610e04565b80610de3846115f2565b604051602001610df4929190611c5d565b6040516020818303038152906040525b9392505050565b60405163c455279160e01b81526001600160a01b03838116600483015260009173a5409ec958c83c3f309868babaca7c86dcb077c191841690829063c45527919060240160206040518083038186803b158015610e6757600080fd5b505afa158015610e7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9f9190611b70565b6001600160a01b03161415610eb857600191505061047f565b6001600160a01b038085166000908152600a602090815260408083209387168352929052205460ff165b949350505050565b6000546001600160a01b03163314610f145760405162461bcd60e51b81526004016104c790611cec565b6001600160a01b038116610f795760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104c7565b6108d38161147e565b6000323314610fce5760405162461bcd60e51b815260206004820152601860248201527710d85b1b195c881a5cc814db585c9d0810dbdb9d1c9858dd60421b60448201526064016104c7565b3373db217a8bd47b0dcd77fa71c6536640b1c27671b0148061100357503373fc9f025e9192ceda964602b51dc801e35db9518b145b806110365750336001600160a01b037f000000000000000000000000ff0cc7aedeab95853318c1a55274056e931b207516145b905090565b60008160011115801561104f575060025482105b801561047f575050600090815260076020526040902054600160e01b900460ff161590565b60008281526009602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006110db82611355565b9050836001600160a01b031681600001516001600160a01b0316146111125760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b038616148061113057506111308533610e0b565b8061114b57503361114084610763565b6001600160a01b0316145b90508061116b57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661119257604051633a954ecd60e21b815260040160405180910390fd5b61119e60008487611074565b6001600160a01b038581166000908152600860209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600790945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611274576002548214611274578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461130c576040519150601f19603f3d011682016040523d82523d6000602084013e611311565b606091505b50509050806106cc5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016104c7565b60408051606081018252600080825260208201819052918101919091528180600111158015611385575060025481105b1561146557600081815260076020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161515918101829052906114635780516001600160a01b0316156113f9579392505050565b5060001901600081815260076020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff161515928101929092521561145e579392505050565b6113f9565b505b604051636f96cda160e11b815260040160405180910390fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6114e88282604051806020016040528060008152506116f0565b5050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611521903390899088908890600401611c9c565b602060405180830381600087803b15801561153b57600080fd5b505af192505050801561156b575060408051601f3d908101601f1916820190925261156891810190611b53565b60015b6115c6573d808015611599576040519150601f19603f3d011682016040523d82523d6000602084013e61159e565b606091505b5080516115be576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6060600680546106e090611daf565b6060816116165750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611640578061162a81611dea565b91506116399050600a83611d39565b915061161a565b60008167ffffffffffffffff81111561165b5761165b611e71565b6040519080825280601f01601f191660200182016040528015611685576020820181803683370190505b5090505b8415610ee25761169a600183611d6c565b91506116a7600a86611e05565b6116b2906030611d21565b60f81b8183815181106116c7576116c7611e5b565b60200101906001600160f81b031916908160001a9053506116e9600a86611d39565b9450611689565b6002546001600160a01b03841661171957604051622e076360e81b815260040160405180910390fd5b826117375760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038416600081815260086020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168b018116918217600160401b67ffffffffffffffff1990941690921783900481168b01811690920217909155858452600790925290912080546001600160e01b0319168317600160a01b42909316929092029190911790558190818501903b1561185b575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a461182460008784806001019550876114ec565b611841576040516368d2bf6b60e11b815260040160405180910390fd5b8082106117d957826002541461185657600080fd5b6118a0565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821061185c575b50600255610d80600085838684565b8280546118bb90611daf565b90600052602060002090601f0160209004810192826118dd5760008555611923565b82601f106118f65782800160ff19823516178555611923565b82800160010185558215611923579182015b82811115611923578235825591602001919060010190611908565b5061192f929150611933565b5090565b5b8082111561192f5760008155600101611934565b60006020828403121561195a57600080fd5b8135610e0481611e87565b6000806040838503121561197857600080fd5b823561198381611e87565b9150602083013561199381611e87565b809150509250929050565b6000806000606084860312156119b357600080fd5b83356119be81611e87565b925060208401356119ce81611e87565b929592945050506040919091013590565b600080600080608085870312156119f557600080fd5b8435611a0081611e87565b93506020850135611a1081611e87565b925060408501359150606085013567ffffffffffffffff80821115611a3457600080fd5b818701915087601f830112611a4857600080fd5b813581811115611a5a57611a5a611e71565b604051601f8201601f19908116603f01168101908382118183101715611a8257611a82611e71565b816040528281528a6020848701011115611a9b57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611ad257600080fd5b8235611add81611e87565b9150602083013561199381611e9c565b60008060408385031215611b0057600080fd5b8235611b0b81611e87565b946020939093013593505050565b600060208284031215611b2b57600080fd5b8151610e0481611e9c565b600060208284031215611b4857600080fd5b8135610e0481611eaa565b600060208284031215611b6557600080fd5b8151610e0481611eaa565b600060208284031215611b8257600080fd5b8151610e0481611e87565b60008060208385031215611ba057600080fd5b823567ffffffffffffffff80821115611bb857600080fd5b818501915085601f830112611bcc57600080fd5b813581811115611bdb57600080fd5b866020828501011115611bed57600080fd5b60209290920196919550909350505050565b600060208284031215611c1157600080fd5b5035919050565b600060208284031215611c2a57600080fd5b5051919050565b60008151808452611c49816020860160208601611d83565b601f01601f19169290920160200192915050565b60008351611c6f818460208801611d83565b835190830190611c83818360208801611d83565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611ccf90830184611c31565b9695505050505050565b602081526000610e046020830184611c31565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611d3457611d34611e19565b500190565b600082611d4857611d48611e2f565b500490565b6000816000190483118215151615611d6757611d67611e19565b500290565b600082821015611d7e57611d7e611e19565b500390565b60005b83811015611d9e578181015183820152602001611d86565b83811115610d805750506000910152565b600181811c90821680611dc357607f821691505b60208210811415611de457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611dfe57611dfe611e19565b5060010190565b600082611e1457611e14611e2f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146108d357600080fd5b80151581146108d357600080fd5b6001600160e01b0319811681146108d357600080fdfea2646970667358221220569100ec299d4e67875f1d82bf78c7108ae493a7e4a388e2cbfc257ada5cb75c64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : URI_ (string):
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
2349:3860:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24453:300:1;;;;;;;;;;-1:-1:-1;24453:300:1;;;;;:::i;:::-;;:::i;:::-;;;7367:14:3;;7360:22;7342:41;;7330:2;7315:18;24453:300:1;;;;;;;;5330:399:2;;;;;;;;;;;;;:::i;:::-;;3721:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29144:200:1:-;;;;;;;;;;-1:-1:-1;29144:200:1;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6386:32:3;;;6368:51;;6356:2;6341:18;29144:200:1;6222:203:3;28729:354:1;;;;;;;;;;-1:-1:-1;28729:354:1;;;;;:::i;:::-;;:::i;23715:306::-;;;;;;;;;;-1:-1:-1;23974:12:1;;23958:13;;:28;-1:-1:-1;;23958:46:1;23715:306;;;11671:25:3;;;11659:2;11644:18;23715:306:1;11525:177:3;29983:164:1;;;;;;;;;;-1:-1:-1;29983:164:1;;;;;:::i;:::-;;:::i;4594:230:2:-;;;;;;;;;;-1:-1:-1;4594:230:2;;;;;:::i;:::-;;:::i;30213:179:1:-;;;;;;;;;;-1:-1:-1;30213:179:1;;;;;:::i;:::-;;:::i;28577:95::-;;;;;;;;;;-1:-1:-1;28577:95:1;;;;;:::i;:::-;;:::i;5755:270:2:-;;;;;;;;;;;;;:::i;27296:123:1:-;;;;;;;;;;-1:-1:-1;27296:123:1;;;;;:::i;:::-;;:::i;24812:203::-;;;;;;;;;;-1:-1:-1;24812:203:1;;;;;:::i;:::-;;:::i;10007:101::-;;;;;;;;;;;;;:::i;2670:90:2:-;;;;;;;;;;;;2718:42;2670:90;;9375:85:1;;;;;;;;;;-1:-1:-1;9421:7:1;9447:6;-1:-1:-1;;;;;9447:6:1;9375:85;;3875:94:2;;;;;;;;;;;;;:::i;4845:451::-;;;;;;:::i;:::-;;:::i;29411:282:1:-;;;;;;;;;;-1:-1:-1;29411:282:1;;;;;:::i;:::-;;:::i;30458:359::-;;;;;;;;;;-1:-1:-1;30458:359:1;;;;;:::i;:::-;;:::i;27811:321::-;;;;;;;;;;-1:-1:-1;27811:321:1;;;;;:::i;:::-;;:::i;4035:334:2:-;;;;;;;;;;-1:-1:-1;4035:334:2;;;;;:::i;:::-;;:::i;10257:198:1:-;;;;;;;;;;-1:-1:-1;10257:198:1;;;;;:::i;:::-;;:::i;24453:300::-;24555:4;-1:-1:-1;;;;;;24590:40:1;;-1:-1:-1;;;24590:40:1;;:104;;-1:-1:-1;;;;;;;24646:48:1;;-1:-1:-1;;;24646:48:1;24590:104;:156;;;-1:-1:-1;;;;;;;1808:33:0;;1785:4;1808:33;;;:20;:33;;;;;;;;24710:36:1;24571:175;24453:300;-1:-1:-1;;24453:300:1:o;5330:399:2:-;5386:15;:13;:15::i;:::-;5378:42;;;;-1:-1:-1;;;5378:42:2;;10674:2:3;5378:42:2;;;10656:21:3;10713:2;10693:18;;;10686:30;-1:-1:-1;;;10732:18:3;;;10725:45;10787:18;;5378:42:2;;;;;;;;;5549:43;;-1:-1:-1;;;5549:43:2;;5586:4;5549:43;;;6368:51:3;2824:42:2;;5476:25;;2824:42;;5549:28;;6341:18:3;;5549:43:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5527:65;-1:-1:-1;;;;;;5599:27:2;;;3061:42;5656:3;5637:16;5527:65;5651:2;5637:16;:::i;:::-;:22;;;;:::i;:::-;5599:61;;-1:-1:-1;;;;;;5599:61:2;;;;;;;-1:-1:-1;;;;;7115:32:3;;;5599:61:2;;;7097:51:3;7164:18;;;7157:34;7070:18;;5599:61:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;5664:27:2;;;3134:42;5721:3;5702:16;:11;5716:2;5702:16;:::i;:::-;:22;;;;:::i;:::-;5664:61;;-1:-1:-1;;;;;;5664:61:2;;;;;;;-1:-1:-1;;;;;7115:32:3;;;5664:61:2;;;7097:51:3;7164:18;;;7157:34;7070:18;;5664:61:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5374:355;;5330:399::o;3721:90::-;3767:13;3799:5;3792:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3721:90;:::o;29144:200:1:-;29212:7;29236:16;29244:7;29236;:16::i;:::-;29231:64;;29261:34;;-1:-1:-1;;;29261:34:1;;;;;;;;;;;29231:64;-1:-1:-1;29313:24:1;;;;:15;:24;;;;;;-1:-1:-1;;;;;29313:24:1;;29144:200::o;28729:354::-;28801:13;28817:16;28825:7;28817;:16::i;:::-;28801:32;;28853:5;-1:-1:-1;;;;;28847:11:1;:2;-1:-1:-1;;;;;28847:11:1;;28843:48;;;28867:24;;-1:-1:-1;;;28867:24:1;;;;;;;;;;;28843:48;8852:10;-1:-1:-1;;;;;28906:21:1;;;;;;:63;;-1:-1:-1;28932:37:1;28949:5;8852:10;4035:334:2;:::i;28932:37:1:-;28931:38;28906:63;28902:136;;;28992:35;;-1:-1:-1;;;28992:35:1;;;;;;;;;;;28902:136;29048:28;29057:2;29061:7;29070:5;29048:8;:28::i;29983:164::-;30112:28;30122:4;30128:2;30132:7;30112:9;:28::i;4594:230:2:-;9421:7:1;9447:6;-1:-1:-1;;;;;9447:6:1;8852:10;9587:23;9579:68;;;;-1:-1:-1;;;9579:68:1;;;;;;;:::i;:::-;4673:1:2::1;4661:8;:13;;4653:43;;;::::0;-1:-1:-1;;;4653:43:2;;8580:2:3;4653:43:2::1;::::0;::::1;8562:21:3::0;8619:2;8599:18;;;8592:30;-1:-1:-1;;;8638:18:3;;;8631:47;8695:18;;4653:43:2::1;8378:341:3::0;4653:43:2::1;4703:13:::0;4700:121:::1;;-1:-1:-1::0;4723:13:2::1;:28:::0;;-1:-1:-1;;4723:28:2::1;::::0;;4594:230::o;4700:121::-:1;4767:8;4779:1;4767:13;4764:57;;;4787:13;:29:::0;;-1:-1:-1;;4787:29:2::1;4803:13;4787:29;::::0;;4764:57:::1;4594:230:::0;:::o;30213:179:1:-;30346:39;30363:4;30369:2;30373:7;30346:39;;;;;;;;;;;;:16;:39::i;28577:95::-;9421:7;9447:6;-1:-1:-1;;;;;9447:6:1;8852:10;9587:23;9579:68;;;;-1:-1:-1;;;9579:68:1;;;;;;;:::i;:::-;28655:10:::1;:4;28662:3:::0;;28655:10:::1;:::i;5755:270:2:-:0;5804:15;:13;:15::i;:::-;5796:42;;;;-1:-1:-1;;;5796:42:2;;10674:2:3;5796:42:2;;;10656:21:3;10713:2;10693:18;;;10686:30;-1:-1:-1;;;10732:18:3;;;10725:45;10787:18;;5796:42:2;10472:339:3;5796:42:2;5907:21;5933:42;3061;5971:3;5953:15;5907:21;5966:2;5953:15;:::i;:::-;:21;;;;:::i;:::-;5933:10;:42::i;:::-;5979;3134;6017:3;5999:15;:10;6012:2;5999:15;:::i;27296:123:1:-;27360:7;27386:21;27399:7;27386:12;:21::i;:::-;:26;;27296:123;-1:-1:-1;;27296:123:1:o;24812:203::-;24876:7;-1:-1:-1;;;;;24899:19:1;;24895:60;;24927:28;;-1:-1:-1;;;24927:28:1;;;;;;;;;;;24895:60;-1:-1:-1;;;;;;24980:19:1;;;;;:12;:19;;;;;:27;;;;24812:203::o;10007:101::-;9421:7;9447:6;-1:-1:-1;;;;;9447:6:1;8852:10;9587:23;9579:68;;;;-1:-1:-1;;;9579:68:1;;;;;;;:::i;:::-;10071:30:::1;10098:1;10071:18;:30::i;:::-;10007:101::o:0;3875:94:2:-;3923:13;3955:7;3948:14;;;;;:::i;4845:451::-;3499:12;3482:13;;;;;:29;;;;;;;:::i;:::-;;;3474:54;;;;-1:-1:-1;;;3474:54:2;;9988:2:3;3474:54:2;;;9970:21:3;10027:2;10007:18;;;10000:30;-1:-1:-1;;;10046:18:3;;;10039:42;10098:18;;3474:54:2;9786:336:3;3474:54:2;1137:1:::1;1718:7;;:19;;1710:63;;;::::0;-1:-1:-1;;;1710:63:2;;11367:2:3;1710:63:2::1;::::0;::::1;11349:21:3::0;11406:2;11386:18;;;11379:30;11445:33;11425:18;;;11418:61;11496:18;;1710:63:2::1;11165:355:3::0;1710:63:2::1;1137:1;1848:7;:18:::0;3361:9:::2;3374:10;3361:23;3353:60;;;::::0;-1:-1:-1;;;3353:60:2;;8227:2:3;3353:60:2::2;::::0;::::2;8209:21:3::0;8266:2;8246:18;;;8239:30;-1:-1:-1;;;8285:18:3;;;8278:54;8349:18;;3353:60:2::2;8025:348:3::0;3353:60:2::2;4953:1:::3;4942:8;:12;4934:45;;;::::0;-1:-1:-1;;;4934:45:2;;11018:2:3;4934:45:2::3;::::0;::::3;11000:21:3::0;11057:2;11037:18;;;11030:30;-1:-1:-1;;;11076:18:3;;;11069:50;11136:18;;4934:45:2::3;10816:344:3::0;4934:45:2::3;23974:12:1::0;;23958:13;;4983:21:2::3;::::0;23958:28:1;;-1:-1:-1;;23958:46:1;5065:10:2::3;5024:24;25187:19:1::0;;;:12;:19;;;;;:32;4983:37:2;;-1:-1:-1;;;;25187:32:1;;;;2923:4:2::3;5105:24;5121:8:::0;4983:37;5105:24:::3;:::i;:::-;:40;;5097:76;;;::::0;-1:-1:-1;;;5097:76:2;;8926:2:3;5097:76:2::3;::::0;::::3;8908:21:3::0;8965:2;8945:18;;;8938:30;9004:25;8984:18;;;8977:53;9047:18;;5097:76:2::3;8724:347:3::0;5097:76:2::3;2988:1;5185:27;5204:8:::0;5185:16;:27:::3;:::i;:::-;:46;;5177:79;;;::::0;-1:-1:-1;;;5177:79:2;;9278:2:3;5177:79:2::3;::::0;::::3;9260:21:3::0;9317:2;9297:18;;;9290:30;-1:-1:-1;;;9336:18:3;;;9329:50;9396:18;;5177:79:2::3;9076:344:3::0;5177:79:2::3;5261:31;5271:10;5283:8;5261:9;:31::i;:::-;-1:-1:-1::0;;1094:1:2::1;2021:7;:22:::0;-1:-1:-1;4845:451:2:o;29411:282:1:-;-1:-1:-1;;;;;29509:24:1;;8852:10;29509:24;29505:54;;;29542:17;;-1:-1:-1;;;29542:17:1;;;;;;;;;;;29505:54;8852:10;29570:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;29570:42:1;;;;;;;;;;;;:53;;-1:-1:-1;;29570:53:1;;;;;;;;;;29638:48;;7342:41:3;;;29570:42:1;;8852:10;29638:48;;7315:18:3;29638:48:1;;;;;;;29411:282;;:::o;30458:359::-;30619:28;30629:4;30635:2;30639:7;30619:9;:28::i;:::-;-1:-1:-1;;;;;30661:13:1;;14061:19;:23;;30661:76;;;;;30681:56;30712:4;30718:2;30722:7;30731:5;30681:30;:56::i;:::-;30680:57;30661:76;30657:154;;;30760:40;;-1:-1:-1;;;30760:40:1;;;;;;;;;;;30657:154;30458:359;;;;:::o;27811:321::-;27884:13;27914:16;27922:7;27914;:16::i;:::-;27909:59;;27939:29;;-1:-1:-1;;;27939:29:1;;;;;;;;;;;27909:59;27979:21;28003:10;:8;:10::i;:::-;27979:34;;28036:7;28030:21;28055:1;28030:26;;:95;;;;;;;;;;;;;;;;;28083:7;28092:18;:7;:16;:18::i;:::-;28066:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28030:95;28023:102;27811:321;-1:-1:-1;;;27811:321:1:o;4035:334:2:-;4228:28;;-1:-1:-1;;;4228:28:2;;-1:-1:-1;;;;;6386:32:3;;;4228:28:2;;;6368:51:3;4124:4:2;;2718:42;;4220:49;;;2718:42;;4228:21;;6341:18:3;;4228:28:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4220:49:2;;4216:91;;;4292:4;4285:11;;;;;4216:91;-1:-1:-1;;;;;29879:25:1;;;29856:4;29879:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;4324:38:2;4317:45;4035:334;-1:-1:-1;;;;4035:334:2:o;10257:198:1:-;9421:7;9447:6;-1:-1:-1;;;;;9447:6:1;8852:10;9587:23;9579:68;;;;-1:-1:-1;;;9579:68:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;10345:22:1;::::1;10337:73;;;::::0;-1:-1:-1;;;10337:73:1;;7820:2:3;10337:73:1::1;::::0;::::1;7802:21:3::0;7859:2;7839:18;;;7832:30;7898:34;7878:18;;;7871:62;-1:-1:-1;;;7949:18:3;;;7942:36;7995:19;;10337:73:1::1;7618:402:3::0;10337:73:1::1;10420:28;10439:8;10420:18;:28::i;4400:161:2:-:0;4459:4;3361:9;3374:10;3361:23;3353:60;;;;-1:-1:-1;;;3353:60:2;;8227:2:3;3353:60:2;;;8209:21:3;8266:2;8246:18;;;8239:30;-1:-1:-1;;;8285:18:3;;;8278:54;8349:18;;3353:60:2;8025:348:3;3353:60:2;4477:10:::1;3061:42;4477:22;::::0;4476:52:::1;;-1:-1:-1::0;4505:10:2::1;3134:42;4505:22;4476:52;:80;;;-1:-1:-1::0;4533:10:2::1;-1:-1:-1::0;;;;;4547:8:2::1;4533:22;;4476:80;4469:87;;4400:161:::0;:::o;31063:172:1:-;31120:4;31162:7;23578:1;31143:26;;:53;;;;;31183:13;;31173:7;:23;31143:53;:85;;;;-1:-1:-1;;31201:20:1;;;;:11;:20;;;;;:27;-1:-1:-1;;;31201:27:1;;;;31200:28;;31063:172::o;40043:189::-;40153:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;40153:29:1;-1:-1:-1;;;;;40153:29:1;;;;;;;;;40197:28;;40153:24;;40197:28;;;;;;;40043:189;;;:::o;35119:2082::-;35229:35;35267:21;35280:7;35267:12;:21::i;:::-;35229:59;;35325:4;-1:-1:-1;;;;;35303:26:1;:13;:18;;;-1:-1:-1;;;;;35303:26:1;;35299:67;;35338:28;;-1:-1:-1;;;35338:28:1;;;;;;;;;;;35299:67;35377:22;8852:10;-1:-1:-1;;;;;35403:20:1;;;;:72;;-1:-1:-1;35439:36:1;35456:4;8852:10;4035:334:2;:::i;35439:36:1:-;35403:124;;;-1:-1:-1;8852:10:1;35491:20;35503:7;35491:11;:20::i;:::-;-1:-1:-1;;;;;35491:36:1;;35403:124;35377:151;;35544:17;35539:66;;35570:35;;-1:-1:-1;;;35570:35:1;;;;;;;;;;;35539:66;-1:-1:-1;;;;;35619:16:1;;35615:52;;35644:23;;-1:-1:-1;;;35644:23:1;;;;;;;;;;;35615:52;35783:35;35800:1;35804:7;35813:4;35783:8;:35::i;:::-;-1:-1:-1;;;;;36108:18:1;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;36108:31:1;;;;;;;-1:-1:-1;;36108:31:1;;;;;;;36153:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;36153:29:1;;;;;;;;;;;36231:20;;;:11;:20;;;;;;36265:18;;-1:-1:-1;;;;;;36297:49:1;;;;-1:-1:-1;;;36330:15:1;36297:49;;;;;;;;;;36616:11;;36675:24;;;;;36717:13;;36231:20;;36675:24;;36717:13;36713:377;;36924:13;;36909:11;:28;36905:171;;36961:20;;37029:28;;;;37003:54;;-1:-1:-1;;;37003:54:1;-1:-1:-1;;;;;;37003:54:1;;;-1:-1:-1;;;;;36961:20:1;;37003:54;;;;36905:171;36084:1016;;;37134:7;37130:2;-1:-1:-1;;;;;37115:27:1;37124:4;-1:-1:-1;;;;;37115:27:1;;;;;;;;;;;35219:1982;;35119:2082;;;:::o;6028:179:2:-;6103:12;6121:8;-1:-1:-1;;;;;6121:13:2;6142:7;6121:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6102:52;;;6172:7;6164:36;;;;-1:-1:-1;;;6164:36:2;;10329:2:3;6164:36:2;;;10311:21:3;10368:2;10348:18;;;10341:30;-1:-1:-1;;;10387:18:3;;;10380:46;10443:18;;6164:36:2;10127:340:3;26155:1084:1;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;26265:7:1;;23578:1;26311:23;;:47;;;;;26345:13;;26338:4;:20;26311:47;26307:868;;;26378:31;26412:17;;;:11;:17;;;;;;;;;26378:51;;;;;;;;;-1:-1:-1;;;;;26378:51:1;;;;-1:-1:-1;;;26378:51:1;;;;;;;;;;;-1:-1:-1;;;26378:51:1;;;;;;;;;;;;;;26447:714;;26496:14;;-1:-1:-1;;;;;26496:28:1;;26492:99;;26559:9;26155:1084;-1:-1:-1;;;26155:1084:1:o;26492:99::-;-1:-1:-1;;;26927:6:1;26971:17;;;;:11;:17;;;;;;;;;26959:29;;;;;;;;;-1:-1:-1;;;;;26959:29:1;;;;;-1:-1:-1;;;26959:29:1;;;;;;;;;;;-1:-1:-1;;;26959:29:1;;;;;;;;;;;;;27018:28;27014:107;;27085:9;26155:1084;-1:-1:-1;;;26155:1084:1:o;27014:107::-;26888:255;;;26360:815;26307:868;27201:31;;-1:-1:-1;;;27201:31:1;;;;;;;;;;;10609:187;10682:16;10701:6;;-1:-1:-1;;;;;10717:17:1;;;-1:-1:-1;;;;;;10717:17:1;;;;;;10749:40;;10701:6;;;;;;;10749:40;;10682:16;10749:40;10672:124;10609:187;:::o;31314:102::-;31382:27;31392:2;31396:8;31382:27;;;;;;;;;;;;:9;:27::i;:::-;31314:102;;:::o;40713:650::-;40891:72;;-1:-1:-1;;;40891:72:1;;40871:4;;-1:-1:-1;;;;;40891:36:1;;;;;:72;;8852:10;;40942:4;;40948:7;;40957:5;;40891:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40891:72:1;;;;;;;;-1:-1:-1;;40891:72:1;;;;;;;;;;;;:::i;:::-;;;40887:470;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41122:13:1;;41118:229;;41167:40;;-1:-1:-1;;;41167:40:1;;;;;;;;;;;41118:229;41307:6;41301:13;41292:6;41288:2;41284:15;41277:38;40887:470;-1:-1:-1;;;;;;41009:55:1;-1:-1:-1;;;41009:55:1;;-1:-1:-1;40713:650:1;;;;;;:::o;28373:94::-;28424:13;28456:4;28449:11;;;;;:::i;11017:703::-;11073:13;11290:10;11286:51;;-1:-1:-1;;11316:10:1;;;;;;;;;;;;-1:-1:-1;;;11316:10:1;;;;;11017:703::o;11286:51::-;11361:5;11346:12;11400:75;11407:9;;11400:75;;11432:8;;;;:::i;:::-;;-1:-1:-1;11454:10:1;;-1:-1:-1;11462:2:1;11454:10;;:::i;:::-;;;11400:75;;;11484:19;11516:6;11506:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11506:17:1;;11484:39;;11533:150;11540:10;;11533:150;;11566:11;11576:1;11566:11;;:::i;:::-;;-1:-1:-1;11634:10:1;11642:2;11634:5;:10;:::i;:::-;11621:24;;:2;:24;:::i;:::-;11608:39;;11591:6;11598;11591:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;11591:56:1;;;;;;;;-1:-1:-1;11661:11:1;11670:2;11661:11;;:::i;:::-;;;11533:150;;31776:1708;31917:13;;-1:-1:-1;;;;;31944:16:1;;31940:48;;31969:19;;-1:-1:-1;;;31969:19:1;;;;;;;;;;;31940:48;32002:13;31998:44;;32024:18;;-1:-1:-1;;;32024:18:1;;;;;;;;;;;31998:44;-1:-1:-1;;;;;32385:16:1;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;32443:49:1;;32385:44;;;;;;;;32443:49;;;-1:-1:-1;;;;;32385:44:1;;;;;;32443:49;;;;;;;;;;;;;;;;32507:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;32556:66:1;;;-1:-1:-1;;;32606:15:1;32556:66;;;;;;;;;;;;;32507:25;;32700:23;;;;14061:19;:23;32738:618;;32777:308;32807:38;;32832:12;;-1:-1:-1;;;;;32807:38:1;;;32824:1;;32807:38;;32824:1;;32807:38;32872:69;32911:1;32915:2;32919:14;;;;;;32935:5;32872:30;:69::i;:::-;32867:172;;32976:40;;-1:-1:-1;;;32976:40:1;;;;;;;;;;;32867:172;33080:3;33065:12;:18;32777:308;;33164:12;33147:13;;:29;33143:43;;33178:8;;;33143:43;32738:618;;;33225:117;33255:40;;33280:14;;;;;-1:-1:-1;;;;;33255:40:1;;;33272:1;;33255:40;;33272:1;;33255:40;33337:3;33322:12;:18;33225:117;;32738:618;-1:-1:-1;33369:13:1;:28;33417:60;33446:1;33450:2;33454:12;33468:8;33417:60;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:247:3;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;181:9;168:23;200:31;225:5;200:31;:::i;266:388::-;334:6;342;395:2;383:9;374:7;370:23;366:32;363:52;;;411:1;408;401:12;363:52;450:9;437:23;469:31;494:5;469:31;:::i;:::-;519:5;-1:-1:-1;576:2:3;561:18;;548:32;589:33;548:32;589:33;:::i;:::-;641:7;631:17;;;266:388;;;;;:::o;659:456::-;736:6;744;752;805:2;793:9;784:7;780:23;776:32;773:52;;;821:1;818;811:12;773:52;860:9;847:23;879:31;904:5;879:31;:::i;:::-;929:5;-1:-1:-1;986:2:3;971:18;;958:32;999:33;958:32;999:33;:::i;:::-;659:456;;1051:7;;-1:-1:-1;;;1105:2:3;1090:18;;;;1077:32;;659:456::o;1120:1266::-;1215:6;1223;1231;1239;1292:3;1280:9;1271:7;1267:23;1263:33;1260:53;;;1309:1;1306;1299:12;1260:53;1348:9;1335:23;1367:31;1392:5;1367:31;:::i;:::-;1417:5;-1:-1:-1;1474:2:3;1459:18;;1446:32;1487:33;1446:32;1487:33;:::i;:::-;1539:7;-1:-1:-1;1593:2:3;1578:18;;1565:32;;-1:-1:-1;1648:2:3;1633:18;;1620:32;1671:18;1701:14;;;1698:34;;;1728:1;1725;1718:12;1698:34;1766:6;1755:9;1751:22;1741:32;;1811:7;1804:4;1800:2;1796:13;1792:27;1782:55;;1833:1;1830;1823:12;1782:55;1869:2;1856:16;1891:2;1887;1884:10;1881:36;;;1897:18;;:::i;:::-;1972:2;1966:9;1940:2;2026:13;;-1:-1:-1;;2022:22:3;;;2046:2;2018:31;2014:40;2002:53;;;2070:18;;;2090:22;;;2067:46;2064:72;;;2116:18;;:::i;:::-;2156:10;2152:2;2145:22;2191:2;2183:6;2176:18;2231:7;2226:2;2221;2217;2213:11;2209:20;2206:33;2203:53;;;2252:1;2249;2242:12;2203:53;2308:2;2303;2299;2295:11;2290:2;2282:6;2278:15;2265:46;2353:1;2348:2;2343;2335:6;2331:15;2327:24;2320:35;2374:6;2364:16;;;;;;;1120:1266;;;;;;;:::o;2391:382::-;2456:6;2464;2517:2;2505:9;2496:7;2492:23;2488:32;2485:52;;;2533:1;2530;2523:12;2485:52;2572:9;2559:23;2591:31;2616:5;2591:31;:::i;:::-;2641:5;-1:-1:-1;2698:2:3;2683:18;;2670:32;2711:30;2670:32;2711:30;:::i;2778:315::-;2846:6;2854;2907:2;2895:9;2886:7;2882:23;2878:32;2875:52;;;2923:1;2920;2913:12;2875:52;2962:9;2949:23;2981:31;3006:5;2981:31;:::i;:::-;3031:5;3083:2;3068:18;;;;3055:32;;-1:-1:-1;;;2778:315:3:o;3098:245::-;3165:6;3218:2;3206:9;3197:7;3193:23;3189:32;3186:52;;;3234:1;3231;3224:12;3186:52;3266:9;3260:16;3285:28;3307:5;3285:28;:::i;3348:245::-;3406:6;3459:2;3447:9;3438:7;3434:23;3430:32;3427:52;;;3475:1;3472;3465:12;3427:52;3514:9;3501:23;3533:30;3557:5;3533:30;:::i;3598:249::-;3667:6;3720:2;3708:9;3699:7;3695:23;3691:32;3688:52;;;3736:1;3733;3726:12;3688:52;3768:9;3762:16;3787:30;3811:5;3787:30;:::i;3852:280::-;3951:6;4004:2;3992:9;3983:7;3979:23;3975:32;3972:52;;;4020:1;4017;4010:12;3972:52;4052:9;4046:16;4071:31;4096:5;4071:31;:::i;4137:592::-;4208:6;4216;4269:2;4257:9;4248:7;4244:23;4240:32;4237:52;;;4285:1;4282;4275:12;4237:52;4325:9;4312:23;4354:18;4395:2;4387:6;4384:14;4381:34;;;4411:1;4408;4401:12;4381:34;4449:6;4438:9;4434:22;4424:32;;4494:7;4487:4;4483:2;4479:13;4475:27;4465:55;;4516:1;4513;4506:12;4465:55;4556:2;4543:16;4582:2;4574:6;4571:14;4568:34;;;4598:1;4595;4588:12;4568:34;4643:7;4638:2;4629:6;4625:2;4621:15;4617:24;4614:37;4611:57;;;4664:1;4661;4654:12;4611:57;4695:2;4687:11;;;;;4717:6;;-1:-1:-1;4137:592:3;;-1:-1:-1;;;;4137:592:3:o;4734:180::-;4793:6;4846:2;4834:9;4825:7;4821:23;4817:32;4814:52;;;4862:1;4859;4852:12;4814:52;-1:-1:-1;4885:23:3;;4734:180;-1:-1:-1;4734:180:3:o;4919:184::-;4989:6;5042:2;5030:9;5021:7;5017:23;5013:32;5010:52;;;5058:1;5055;5048:12;5010:52;-1:-1:-1;5081:16:3;;4919:184;-1:-1:-1;4919:184:3:o;5108:257::-;5149:3;5187:5;5181:12;5214:6;5209:3;5202:19;5230:63;5286:6;5279:4;5274:3;5270:14;5263:4;5256:5;5252:16;5230:63;:::i;:::-;5347:2;5326:15;-1:-1:-1;;5322:29:3;5313:39;;;;5354:4;5309:50;;5108:257;-1:-1:-1;;5108:257:3:o;5370:637::-;5650:3;5688:6;5682:13;5704:53;5750:6;5745:3;5738:4;5730:6;5726:17;5704:53;:::i;:::-;5820:13;;5779:16;;;;5842:57;5820:13;5779:16;5876:4;5864:17;;5842:57;:::i;:::-;-1:-1:-1;;;5921:20:3;;5950:22;;;5999:1;5988:13;;5370:637;-1:-1:-1;;;;5370:637:3:o;6430:488::-;-1:-1:-1;;;;;6699:15:3;;;6681:34;;6751:15;;6746:2;6731:18;;6724:43;6798:2;6783:18;;6776:34;;;6846:3;6841:2;6826:18;;6819:31;;;6624:4;;6867:45;;6892:19;;6884:6;6867:45;:::i;:::-;6859:53;6430:488;-1:-1:-1;;;;;;6430:488:3:o;7394:219::-;7543:2;7532:9;7525:21;7506:4;7563:44;7603:2;7592:9;7588:18;7580:6;7563:44;:::i;9425:356::-;9627:2;9609:21;;;9646:18;;;9639:30;9705:34;9700:2;9685:18;;9678:62;9772:2;9757:18;;9425:356::o;11707:128::-;11747:3;11778:1;11774:6;11771:1;11768:13;11765:39;;;11784:18;;:::i;:::-;-1:-1:-1;11820:9:3;;11707:128::o;11840:120::-;11880:1;11906;11896:35;;11911:18;;:::i;:::-;-1:-1:-1;11945:9:3;;11840:120::o;11965:168::-;12005:7;12071:1;12067;12063:6;12059:14;12056:1;12053:21;12048:1;12041:9;12034:17;12030:45;12027:71;;;12078:18;;:::i;:::-;-1:-1:-1;12118:9:3;;11965:168::o;12138:125::-;12178:4;12206:1;12203;12200:8;12197:34;;;12211:18;;:::i;:::-;-1:-1:-1;12248:9:3;;12138:125::o;12268:258::-;12340:1;12350:113;12364:6;12361:1;12358:13;12350:113;;;12440:11;;;12434:18;12421:11;;;12414:39;12386:2;12379:10;12350:113;;;12481:6;12478:1;12475:13;12472:48;;;-1:-1:-1;;12516:1:3;12498:16;;12491:27;12268:258::o;12531:380::-;12610:1;12606:12;;;;12653;;;12674:61;;12728:4;12720:6;12716:17;12706:27;;12674:61;12781:2;12773:6;12770:14;12750:18;12747:38;12744:161;;;12827:10;12822:3;12818:20;12815:1;12808:31;12862:4;12859:1;12852:15;12890:4;12887:1;12880:15;12744:161;;12531:380;;;:::o;12916:135::-;12955:3;-1:-1:-1;;12976:17:3;;12973:43;;;12996:18;;:::i;:::-;-1:-1:-1;13043:1:3;13032:13;;12916:135::o;13056:112::-;13088:1;13114;13104:35;;13119:18;;:::i;:::-;-1:-1:-1;13153:9:3;;13056:112::o;13173:127::-;13234:10;13229:3;13225:20;13222:1;13215:31;13265:4;13262:1;13255:15;13289:4;13286:1;13279:15;13305:127;13366:10;13361:3;13357:20;13354:1;13347:31;13397:4;13394:1;13387:15;13421:4;13418:1;13411:15;13437:127;13498:10;13493:3;13489:20;13486:1;13479:31;13529:4;13526:1;13519:15;13553:4;13550:1;13543:15;13569:127;13630:10;13625:3;13621:20;13618:1;13611:31;13661:4;13658:1;13651:15;13685:4;13682:1;13675:15;13701:127;13762:10;13757:3;13753:20;13750:1;13743:31;13793:4;13790:1;13783:15;13817:4;13814:1;13807:15;13833:131;-1:-1:-1;;;;;13908:31:3;;13898:42;;13888:70;;13954:1;13951;13944:12;13969:118;14055:5;14048:13;14041:21;14034:5;14031:32;14021:60;;14077:1;14074;14067:12;14092:131;-1:-1:-1;;;;;;14166:32:3;;14156:43;;14146:71;;14213:1;14210;14203:12
Swarm Source
ipfs://569100ec299d4e67875f1d82bf78c7108ae493a7e4a388e2cbfc257ada5cb75c
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.