Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Loading...
Loading
Contract Name:
MetamorphicPepe
Compiler Version
v0.8.21+commit.d9974bed
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-10-19 */ // File: @openzeppelin/[email protected]/utils/math/SignedMath.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } // File: @openzeppelin/[email protected]/utils/math/Math.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } // File: @openzeppelin/[email protected]/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // File: @openzeppelin/[email protected]/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/[email protected]/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/[email protected]/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/[email protected]/utils/Address.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/[email protected]/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/[email protected]/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/[email protected]/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/[email protected]/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/[email protected]/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File: @openzeppelin/[email protected]/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/[email protected]/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/[email protected]/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } } // File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721Burnable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _burn(tokenId); } } // File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721Royalty.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Royalty.sol) pragma solidity ^0.8.0; /** * @dev Extension of ERC721 with the ERC2981 NFT Royalty Standard, a standardized way to retrieve royalty payment * information. * * Royalty information can be specified globally for all token ids via {ERC2981-_setDefaultRoyalty}, and/or individually for * specific token ids via {ERC2981-_setTokenRoyalty}. The latter takes precedence over the first. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC721Royalty is ERC2981, ERC721 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } /** * @dev See {ERC721-_burn}. This override additionally clears the royalty information for the token. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); _resetTokenRoyalty(tokenId); } } // File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contract-890770f5a1(1).sol pragma solidity ^0.8.9; contract MetamorphicPepe is ERC721, ERC721Enumerable, Pausable, Ownable, ERC721Royalty, ERC721Burnable { using Strings for uint256; /** * String constants for token identification. * * These string constants serve as identifiers or labels for the token and its properties. * They are used to provide additional information or context about the token within the contract. */ string internal constant NAME = "Metamorphic Pepe"; string internal constant SYMBL = "MTPP"; /** * Constants to store token prices for each stage. * * These constants define the minting price of tokens for each stage of the token sale. * They represent the cost in Wei (ETH) required to mint a token during each specific stage. */ uint public constant STAGE_ONE_PRICE = 0; uint public constant STAGE_TWO_PRICE = 20000000000000000; //0.02 ETH uint public constant STAGE_THREE_PRICE = 40000000000000000; //0.04 ETH uint public constant STAGE_FOUR_PRICE = 80000000000000000; //0.08 ETH /** * Total number of tokens available in this contract. * * This variable represents the total quantity of tokens that can be minted * and managed by this smart contract. It defines the maximum token supply. */ uint public constant MAX_SUPPLY = 10000; /** * Constants to store token supply for stages 1 to 3. * * These constants define the total token supply available for 3 of the initial * stages of the token sale. They represent the maximum number of tokens that can * be minted during these stages. */ uint public constant STAGE_ONE_SUPPLY = 350; uint public constant STAGE_TWO_SUPPLY = 5350; uint public constant STAGE_THREE_SUPPY = 9000; /** * Maximum number of tokens that can be purchased per single transaction. * * This variable specifies the maximum quantity of tokens that a buyer is allowed * to purchase in a single transaction. It helps enforce transaction limits for fairness. */ uint public constant MAX_PURCH = 20; /** * Boolean variable to control the start and stop of token sales. * * This boolean variable is used to control the activation and deactivation of token sales. * When set to true, it indicates that token sales are active, allowing buyers to mint tokens. * When set to false, it indicates that token sales are paused or stopped, preventing further minting. */ bool public saleIsActive; /** * Variable for storing the starting token ID. * * This variable is used to store the initial token ID from which the sequential * token IDs are generated. It represents the starting point of the token ID sequence. */ uint public startingId; /** * Final hash of concatenated hash strings. * * This string variable stores the final hash, which is obtained by concatenating * and hashing multiple hash strings. Each metadata file includes an `imageHash` property, * which represents a Keccak256 hash of the output image. The final hash is a result * of combining these individual image hashes. */ string public provenanceHash; /** * Base URI variable for generating token metadata URIs. * * This variable stores the base URI that is used as a prefix for generating the unique URIs * for each token's metadata. By setting this variable, the contract owner can customize * the base URI for token metadata. */ string private _baseURIextended; /** * Struct for storing parameters of the current sale stage. * * This struct is used to store important parameters of the current stage of the token sale, * including the stage number and the minting price. It provides an organized way to manage * and access these parameters. */ struct CurrentStage{ uint stageNum; uint mintPrice; } CurrentStage public currentStage; /** * Generate a random starting ID number. * * This function calculates and returns a random starting ID number based on the current * block number. It is used to initialize the token ID sequence in a random manner. * * @return The randomly generated starting ID. */ function generateStartingNumber() private view returns (uint) { uint lastBlockNumber = block.number; uint initialNumber = lastBlockNumber % MAX_SUPPLY; while (initialNumber == 0) { lastBlockNumber--; initialNumber = lastBlockNumber % MAX_SUPPLY; } return initialNumber; } /** * Set the current stage (phase) of the token sale. * * This function allows the contract to set the current stage of the token sale, including * the stage number and associated minting price. It is used to transition between different * stages of the sale. * * @param stageNum The new stage number to set. * @param mintPrice The new minting price to set for the stage. */ function setCurrentStage(uint stageNum, uint mintPrice) private { currentStage = CurrentStage({stageNum: stageNum, mintPrice:mintPrice}); } /** * Get the current stage (phase) of the token sale. * * This function retrieves and returns information about the current stage of the token sale, * including the stage number and associated minting price. * * @return A CurrentStage struct representing the current stage details. */ function getCurrentStage() public view returns(CurrentStage memory){ return currentStage; } constructor(string memory hash, uint96 feeNumerator) ERC721(NAME, SYMBL) { provenanceHash = hash; startingId = generateStartingNumber(); setCurrentStage(1, 0); _setDefaultRoyalty(owner(), feeNumerator); } /** * Set the base URI for token metadata. * * This function allows the contract owner to set the base URI that will be used as a prefix * for generating the metadata URIs for the tokens. It is essential for retrieving metadata * associated with each token. * * @param baseURI_ The new base URI to set. */ function setBaseURI(string memory baseURI_) external onlyOwner() { _baseURIextended = baseURI_; } function _baseURI() internal view virtual override returns (string memory) { return _baseURIextended; } /** * Pause the contract. * * This function allows the owner to pause the contract, preventing certain contract functions * from being executed. It can be useful for temporary suspension of contract activities. * Access is restricted to the contract owner. */ function pause() public onlyOwner { _pause(); } /** * Unpause the contract. * * This function allows the owner to unpause the contract, reactivating contract functions * that were previously paused. It restores normal contract operation. * Access is restricted to the contract owner. */ function unpause() public onlyOwner { _unpause(); } /** * Activate token sale. * * This private function is used to activate the token sale by setting the 'saleIsActive' * boolean variable to true. */ function activateSale() private { saleIsActive = true; } /** * Set the token minting price based on the current phase of the sale. * * This function adjusts the token minting price according to the current phase (stage) of the sale. * It ensures that the price is set correctly for each stage of the sale. */ function setMintPrice() internal { uint supply = totalSupply(); if (supply < STAGE_ONE_SUPPLY) { // default statement } else if (supply < STAGE_TWO_SUPPLY) { setCurrentStage(2, STAGE_TWO_PRICE); } else if (supply < STAGE_THREE_SUPPY) { setCurrentStage(3, STAGE_THREE_PRICE); } else { setCurrentStage(4, STAGE_FOUR_PRICE); if (supply == MAX_SUPPLY) { saleIsActive = false; } } } /** * Calculate the remaining quantity of tokens available on the current stage. * * This function calculates and returns the number of tokens that are still available * for purchase on the current stage of the sale. It helps buyers to know the remaining * token supply on the current stage. * * @return num - The remaining number of tokens in the current stage. */ function remainTokensInStage() public view returns (uint num){ uint supply = totalSupply(); uint stage = getCurrentStage().stageNum; if (stage == 1) { return STAGE_ONE_SUPPLY - supply; } if (stage == 2) { return STAGE_TWO_SUPPLY - supply; } if (stage == 3) { return STAGE_THREE_SUPPY - supply; } if (stage == 4) { return MAX_SUPPLY- supply; } } /** * Calculate the total purchase price, considering potential stage changes. * * This function computes the total price for a given number of tokens, taking into account * the possibility of a change in the sale stage. It adjusts the pricing if the number of tokens * exceeds the current stage's remaining supply and factors in the price of the next stage. * * Requirements: * - The number of tokens to calculate the total price for must be greater than zero. * - The sale must be active. * - The number of tokens to purchase must not exceed the maximum purchase limit. * - The total supply of tokens must not exceed the maximum supply limit. * * @param tokensNum The number of tokens to calculate the total price for. * @return price - The total price in Wei. */ function countTotalPrice(uint tokensNum) public view returns (uint price) { require(tokensNum > 0, "Token amount must be greater than zero."); require(saleIsActive, "The sale is currently inactive."); require(tokensNum <= MAX_PURCH, "Maximum purchase limit exceeded (maximum: 20)."); require(totalSupply() + tokensNum <= MAX_SUPPLY, "Token supply limit exceeded."); CurrentStage memory stage = getCurrentStage(); uint remainTokens = remainTokensInStage(); uint currentPrice = stage.mintPrice; if (remainTokens >= tokensNum) { return tokensNum * currentPrice; } uint nextStagePrice; if (stage.stageNum == 1) { return 0; } if (stage.stageNum == 2) { nextStagePrice = STAGE_THREE_PRICE; } else if (stage.stageNum == 3) { nextStagePrice = STAGE_FOUR_PRICE; } return remainTokens * currentPrice + ((tokensNum - remainTokens) * nextStagePrice); } /** * This function calculates and sets the token ID based on the current state * of the contract, including the starting ID and the total supply of tokens. * * @return tokenId The calculated token ID. */ function setTokenId() internal view returns (uint tokenId) { uint supply = totalSupply(); tokenId = (startingId + supply) % MAX_SUPPLY; } /** * Limit the number of tokens that can be purchased per address during stage 1. * * This function restricts the maximum number of tokens that can be minted by a single address * during the first stage of the sale. It helps enforce token purchase limits for fairness. */ function stageOneMint() internal { require(balanceOf(msg.sender) == 0, "Stage One Max mint per wallet reached."); _safeMint(msg.sender, setTokenId()); setMintPrice(); } /** * Minting tokens for sale. * * This section of the code handles the minting of tokens during a sale event. * It ensures that tokens can be minted by buyers in accordance with the specified conditions, * such as the maximum number of tokens that can be minted at once and the associated price. * Additionally, it adjusts the pricing based on the current stage of the sale. * * Requirements: * - The value of Ether sent must cover the cost of the requested tokens. * * @param tokensNum The number of tokens to mint in this transaction. */ function safePepeMint(uint tokensNum) public payable { require(countTotalPrice(tokensNum) <= msg.value, "Insufficient Ether sent for the purchase."); CurrentStage memory stage = getCurrentStage(); if (stage.stageNum == 1){ stageOneMint(); } else{ for (uint i = 0; i < tokensNum; i++) { _safeMint(msg.sender, setTokenId()); setMintPrice(); } } } /** * Function for reserving tokens before the sale and activation. * Ensures that tokens can only be reserved when the total supply is 0. * @param num The number of tokens to reserve. */ function reserveNFT(uint num) public onlyOwner { require(totalSupply() == 0, "Already done."); require(num <= 50, "You can reserve up to 50 tokens at once."); for (uint i = 0; i < num; i++) { _safeMint(owner(), setTokenId()); } setMintPrice(); activateSale(); } /** * Withdraw the contract's balance to the owner's address. * * This function allows the owner of the contract to withdraw the contract's Ether balance * to their own address. It can be used to access the funds received from token sales or other activities. * The function can only be called by the contract owner. */ function withdraw() public onlyOwner { uint balance = address(this).balance; require(balance > 0, "Balance is 0"); payable(owner()).transfer(balance); } // The following functions are overrides required by Solidity. function _beforeTokenTransfer(address from, address to, uint tokenId, uint batchSize) internal whenNotPaused override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId, batchSize); } function _burn(uint256 tokenId) internal override(ERC721, ERC721Royalty) { require(!saleIsActive, "You can not burn until sale finished."); super._burn(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable, ERC721Royalty) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"hash","type":"string"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_PURCH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAGE_FOUR_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAGE_ONE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAGE_ONE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAGE_THREE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAGE_THREE_SUPPY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAGE_TWO_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAGE_TWO_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokensNum","type":"uint256"}],"name":"countTotalPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentStage","outputs":[{"internalType":"uint256","name":"stageNum","type":"uint256"},{"internalType":"uint256","name":"mintPrice","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":[],"name":"getCurrentStage","outputs":[{"components":[{"internalType":"uint256","name":"stageNum","type":"uint256"},{"internalType":"uint256","name":"mintPrice","type":"uint256"}],"internalType":"struct MetamorphicPepe.CurrentStage","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"provenanceHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remainTokensInStage","outputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"reserveNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokensNum","type":"uint256"}],"name":"safePepeMint","outputs":[],"stateMutability":"payable","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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801562000010575f80fd5b506040516200300e3803806200300e8339810160408190526200003391620002eb565b6040518060400160405280601081526020016f4d6574616d6f7270686963205065706560801b8152506040518060400160405280600481526020016304d5450560e41b81525081600290816200008a919062000458565b50600362000099828262000458565b5050600c805460ff1916905550620000b13362000116565b600e620000bf838262000458565b50620000ca6200016f565b600d556040805180820190915260018082525f60209092018290526010556011556200010e62000107600c5461010090046001600160a01b031690565b82620001b7565b505062000562565b600c80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f4381620001806127108362000520565b90505b805f03620001b15781620001978162000540565b9250620001a990506127108362000520565b905062000183565b92915050565b6127106001600160601b03821611156200022b5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084015b60405180910390fd5b6001600160a01b038216620002835760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640162000222565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b909102175f55565b634e487b7160e01b5f52604160045260245ffd5b80516001600160601b0381168114620002e6575f80fd5b919050565b5f8060408385031215620002fd575f80fd5b82516001600160401b038082111562000314575f80fd5b818501915085601f83011262000328575f80fd5b8151818111156200033d576200033d620002bb565b604051601f8201601f19908116603f01168101908382118183101715620003685762000368620002bb565b8160405282815260209350888484870101111562000384575f80fd5b5f91505b82821015620003a7578482018401518183018501529083019062000388565b5f848483010152809650505050620003c1818601620002cf565b925050509250929050565b600181811c90821680620003e157607f821691505b6020821081036200040057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000453575f81815260208120601f850160051c810160208610156200042e5750805b601f850160051c820191505b818110156200044f578281556001016200043a565b5050505b505050565b81516001600160401b03811115620004745762000474620002bb565b6200048c81620004858454620003cc565b8462000406565b602080601f831160018114620004c2575f8415620004aa5750858301515b5f19600386901b1c1916600185901b1785556200044f565b5f85815260208120601f198616915b82811015620004f257888601518255948401946001909101908401620004d1565b50858210156200051057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f826200053b57634e487b7160e01b5f52601260045260245ffd5b500690565b5f816200055b57634e487b7160e01b5f52601160045260245ffd5b505f190190565b612a9e80620005705f395ff3fe60806040526004361061025f575f3560e01c80636352211e1161013f578063aa861074116100b3578063e985e9c511610078578063e985e9c5146106bc578063eb8d244414610703578063eedbe31d14610723578063f2fde38b1461076c578063fc5cccd21461078b578063fcd386bb146107a0575f80fd5b8063aa86107414610640578063b88d4fde14610655578063ba12b50214610674578063c6ab67a314610689578063c87b56dd1461069d575f80fd5b80638456cb59116101045780638456cb59146105a957806388a1228f146105bd5780638ad031d0146105d15780638da5cb5b146105eb57806395d89b411461060d578063a22cb46514610621575f80fd5b80636352211e146105235780636897c3351461054257806370a0823114610561578063715018a61461058057806383d09ffd14610594575f80fd5b8063397be3fd116101d657806342966c681161019b57806342966c68146104665780634f6ccce71461048557806355f804b3146104a457806358549aac146104c35780635bf5d54c146104dd5780635c975abb1461050c575f80fd5b8063397be3fd146103ed5780633ccfd60b1461040c5780633f4ba83a146104205780634143f3db1461043457806342842e0e14610447575f80fd5b80631d9fef1a116102275780631d9fef1a1461032e57806323b872dd146103415780632a55205a146103605780632f745c591461039e57806332cb6b0c146103bd57806335eaa773146103d2575f80fd5b806301ffc9a71461026357806306fdde0314610297578063081812fc146102b8578063095ea7b3146102ef57806318160ddd14610310575b5f80fd5b34801561026e575f80fd5b5061028261027d36600461240a565b6107b4565b60405190151581526020015b60405180910390f35b3480156102a2575f80fd5b506102ab6107c4565b60405161028e9190612472565b3480156102c3575f80fd5b506102d76102d2366004612484565b610854565b6040516001600160a01b03909116815260200161028e565b3480156102fa575f80fd5b5061030e6103093660046124b6565b610879565b005b34801561031b575f80fd5b50600a545b60405190815260200161028e565b61030e61033c366004612484565b610992565b34801561034c575f80fd5b5061030e61035b3660046124de565b610a77565b34801561036b575f80fd5b5061037f61037a366004612517565b610aa9565b604080516001600160a01b03909316835260208301919091520161028e565b3480156103a9575f80fd5b506103206103b83660046124b6565b610b52565b3480156103c8575f80fd5b5061032061271081565b3480156103dd575f80fd5b5061032067011c37937e08000081565b3480156103f8575f80fd5b5061030e610407366004612484565b610be6565b348015610417575f80fd5b5061030e610ced565b34801561042b575f80fd5b5061030e610d78565b34801561043f575f80fd5b506103205f81565b348015610452575f80fd5b5061030e6104613660046124de565b610d8a565b348015610471575f80fd5b5061030e610480366004612484565b610da4565b348015610490575f80fd5b5061032061049f366004612484565b610dd2565b3480156104af575f80fd5b5061030e6104be3660046125be565b610e62565b3480156104ce575f80fd5b50610320668e1bc9bf04000081565b3480156104e8575f80fd5b506010546011546104f7919082565b6040805192835260208301919091520161028e565b348015610517575f80fd5b50600c5460ff16610282565b34801561052e575f80fd5b506102d761053d366004612484565b610e76565b34801561054d575f80fd5b5061032061055c366004612484565b610ed5565b34801561056c575f80fd5b5061032061057b366004612603565b61112a565b34801561058b575f80fd5b5061030e6111ae565b34801561059f575f80fd5b5061032061232881565b3480156105b4575f80fd5b5061030e6111bf565b3480156105c8575f80fd5b506103206111cf565b3480156105dc575f80fd5b5061032066470de4df82000081565b3480156105f6575f80fd5b50600c5461010090046001600160a01b03166102d7565b348015610618575f80fd5b506102ab61126a565b34801561062c575f80fd5b5061030e61063b36600461261c565b611279565b34801561064b575f80fd5b506103206114e681565b348015610660575f80fd5b5061030e61066f366004612655565b611284565b34801561067f575f80fd5b5061032061015e81565b348015610694575f80fd5b506102ab6112bc565b3480156106a8575f80fd5b506102ab6106b7366004612484565b611348565b3480156106c7575f80fd5b506102826106d63660046126cc565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205460ff1690565b34801561070e575f80fd5b50600c5461028290600160a81b900460ff1681565b34801561072e575f80fd5b506040805180820182525f8082526020918201528151808301835260105480825260115491830191825283519081529051918101919091520161028e565b348015610777575f80fd5b5061030e610786366004612603565b6113ac565b348015610796575f80fd5b50610320600d5481565b3480156107ab575f80fd5b50610320601481565b5f6107be82611422565b92915050565b6060600280546107d3906126fd565b80601f01602080910402602001604051908101604052809291908181526020018280546107ff906126fd565b801561084a5780601f106108215761010080835404028352916020019161084a565b820191905f5260205f20905b81548152906001019060200180831161082d57829003601f168201915b5050505050905090565b5f61085e8261142c565b505f908152600660205260409020546001600160a01b031690565b5f61088382610e76565b9050806001600160a01b0316836001600160a01b0316036108f55760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610911575061091181336106d6565b6109835760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016108ec565b61098d838361148a565b505050565b3461099c82610ed5565b11156109fc5760405162461bcd60e51b815260206004820152602960248201527f496e73756666696369656e742045746865722073656e7420666f722074686520604482015268383ab931b430b9b29760b91b60648201526084016108ec565b5f610a2a6040805180820182525f808252602091820152815180830190925260105482526011549082015290565b8051909150600103610a4257610a3e6114f7565b5050565b5f5b8281101561098d57610a5d33610a58611570565b61159e565b610a656115b7565b80610a6f81612749565b915050610a44565b610a82335b8261166f565b610a9e5760405162461bcd60e51b81526004016108ec90612761565b61098d8383836116ec565b5f8281526001602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610b1c5750604080518082019091525f546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101515f9061271090610b3a906001600160601b0316876127ae565b610b4491906127d9565b915196919550909350505050565b5f610b5c8361112a565b8210610bbe5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016108ec565b506001600160a01b03919091165f908152600860209081526040808320938352929052205490565b610bee61185b565b600a5415610c2e5760405162461bcd60e51b815260206004820152600d60248201526c20b63932b0b23c903237b7329760991b60448201526064016108ec565b6032811115610c905760405162461bcd60e51b815260206004820152602860248201527f596f752063616e207265736572766520757020746f20353020746f6b656e732060448201526730ba1037b731b29760c11b60648201526084016108ec565b5f5b81811015610cc957600c54610cb79061010090046001600160a01b0316610a58611570565b80610cc181612749565b915050610c92565b50610cd26115b7565b610cea600c805460ff60a81b1916600160a81b179055565b50565b610cf561185b565b4780610d325760405162461bcd60e51b815260206004820152600c60248201526b042616c616e636520697320360a41b60448201526064016108ec565b600c5461010090046001600160a01b03166001600160a01b03166108fc8290811502906040515f60405180830381858888f19350505050158015610a3e573d5f803e3d5ffd5b610d8061185b565b610d886118bb565b565b61098d83838360405180602001604052805f815250611284565b610dad33610a7c565b610dc95760405162461bcd60e51b81526004016108ec90612761565b610cea8161190d565b5f610ddc600a5490565b8210610e3f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016108ec565b600a8281548110610e5257610e526127ec565b905f5260205f2001549050919050565b610e6a61185b565b600f610a3e828261284d565b5f818152600460205260408120546001600160a01b0316806107be5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016108ec565b5f808211610f355760405162461bcd60e51b815260206004820152602760248201527f546f6b656e20616d6f756e74206d75737420626520677265617465722074686160448201526637103d32b9379760c91b60648201526084016108ec565b600c54600160a81b900460ff16610f8e5760405162461bcd60e51b815260206004820152601f60248201527f5468652073616c652069732063757272656e746c7920696e6163746976652e0060448201526064016108ec565b6014821115610ff65760405162461bcd60e51b815260206004820152602e60248201527f4d6178696d756d207075726368617365206c696d69742065786365656465642060448201526d1436b0bc34b6bab69d101918149760911b60648201526084016108ec565b61271082611003600a5490565b61100d9190612909565b111561105b5760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e20737570706c79206c696d69742065786365656465642e0000000060448201526064016108ec565b5f6110896040805180820182525f808252602091820152815180830190925260105482526011549082015290565b90505f6110946111cf565b60208301519091508482106110b6576110ad81866127ae565b95945050505050565b82515f906001036110cc57505f95945050505050565b83516002036110e35750668e1bc9bf0400006110f7565b83516003036110f7575067011c37937e0800005b80611102848861291c565b61110c91906127ae565b61111683856127ae565b6111209190612909565b9695505050505050565b5f6001600160a01b0382166111935760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016108ec565b506001600160a01b03165f9081526005602052604090205490565b6111b661185b565b610d885f61197e565b6111c761185b565b610d886119d7565b5f806111da600a5490565b90505f61120a6040805180820182525f808252602091820152815180830190925260105482526011549082015290565b5190506001819003611229576112228261015e61291c565b9250505090565b8060020361123d57611222826114e661291c565b80600303611251576112228261232861291c565b80600403611265576112228261271061291c565b505090565b6060600380546107d3906126fd565b610a3e338383611a14565b61128e338361166f565b6112aa5760405162461bcd60e51b81526004016108ec90612761565b6112b684848484611ae1565b50505050565b600e80546112c9906126fd565b80601f01602080910402602001604051908101604052809291908181526020018280546112f5906126fd565b80156113405780601f1061131757610100808354040283529160200191611340565b820191905f5260205f20905b81548152906001019060200180831161132357829003601f168201915b505050505081565b60606113538261142c565b5f61135c611b14565b90505f81511161137a5760405180602001604052805f8152506113a5565b8061138484611b23565b60405160200161139592919061292f565b6040516020818303038152906040525b9392505050565b6113b461185b565b6001600160a01b0381166114195760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ec565b610cea8161197e565b5f6107be82611bb3565b5f818152600460205260409020546001600160a01b0316610cea5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016108ec565b5f81815260066020526040902080546001600160a01b0319166001600160a01b03841690811790915581906114be82610e76565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6115003361112a565b1561155c5760405162461bcd60e51b815260206004820152602660248201527f5374616765204f6e65204d6178206d696e74207065722077616c6c657420726560448201526530b1b432b21760d11b60648201526084016108ec565b61156833610a58611570565b610d886115b7565b5f8061157b600a5490565b905061271081600d5461158e9190612909565b611598919061295d565b91505090565b610a3e828260405180602001604052805f815250611bd7565b5f6115c1600a5490565b905061015e8110610cea576114e68110156115fe5760408051808201909152600280825266470de4df820000602090920182905260105560115550565b61232881101561163057604080518082019091526003808252668e1bc9bf040000602090920182905260105560115550565b60408051808201909152600480825267011c37937e08000060209092018290526010556011556127108103610cea57600c805460ff60a81b1916905550565b5f8061167a83610e76565b9050806001600160a01b0316846001600160a01b031614806116c057506001600160a01b038082165f9081526007602090815260408083209388168352929052205460ff165b806116e45750836001600160a01b03166116d984610854565b6001600160a01b0316145b949350505050565b826001600160a01b03166116ff82610e76565b6001600160a01b0316146117255760405162461bcd60e51b81526004016108ec90612970565b6001600160a01b0382166117875760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108ec565b6117948383836001611c09565b826001600160a01b03166117a782610e76565b6001600160a01b0316146117cd5760405162461bcd60e51b81526004016108ec90612970565b5f81815260066020908152604080832080546001600160a01b03199081169091556001600160a01b038781168086526005855283862080545f1901905590871680865283862080546001019055868652600490945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600c546001600160a01b03610100909104163314610d885760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ec565b6118c3611c1d565b600c805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600c54600160a81b900460ff16156119755760405162461bcd60e51b815260206004820152602560248201527f596f752063616e206e6f74206275726e20756e74696c2073616c652066696e6960448201526439b432b21760d91b60648201526084016108ec565b610cea81611c66565b600c80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6119df611c7f565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586118f03390565b816001600160a01b0316836001600160a01b031603611a755760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108ec565b6001600160a01b038381165f81815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611aec8484846116ec565b611af884848484611cc5565b6112b65760405162461bcd60e51b81526004016108ec906129b5565b6060600f80546107d3906126fd565b60605f611b2f83611dc2565b60010190505f8167ffffffffffffffff811115611b4e57611b4e612537565b6040519080825280601f01601f191660200182016040528015611b78576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611b8257509392505050565b5f6001600160e01b0319821663780e9d6360e01b14806107be57506107be82611e99565b611be18383611ed8565b611bed5f848484611cc5565b61098d5760405162461bcd60e51b81526004016108ec906129b5565b611c11611c7f565b6112b68484848461206d565b600c5460ff16610d885760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016108ec565b611c6f816121a0565b5f90815260016020526040812055565b600c5460ff1615610d885760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016108ec565b5f6001600160a01b0384163b15611db757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611d08903390899088908890600401612a07565b6020604051808303815f875af1925050508015611d42575060408051601f3d908101601f19168201909252611d3f91810190612a39565b60015b611d9d573d808015611d6f576040519150601f19603f3d011682016040523d82523d5f602084013e611d74565b606091505b5080515f03611d955760405162461bcd60e51b81526004016108ec906129b5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506116e4565b506001949350505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611e005772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611e2c576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611e4a57662386f26fc10000830492506010015b6305f5e1008310611e62576305f5e100830492506008015b6127108310611e7657612710830492506004015b60648310611e88576064830492506002015b600a83106107be5760010192915050565b5f6001600160e01b031982166380ac58cd60e01b1480611ec957506001600160e01b03198216635b5e139f60e01b145b806107be57506107be8261223f565b6001600160a01b038216611f2e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108ec565b5f818152600460205260409020546001600160a01b031615611f925760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108ec565b611f9f5f83836001611c09565b5f818152600460205260409020546001600160a01b0316156120035760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108ec565b6001600160a01b0382165f81815260056020908152604080832080546001019055848352600490915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60018111156120dc5760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b60648201526084016108ec565b816001600160a01b0385166121375761213281600a80545f838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b61215a565b836001600160a01b0316856001600160a01b03161461215a5761215a8582612273565b6001600160a01b038416612176576121718161230c565b612199565b846001600160a01b0316846001600160a01b0316146121995761219984826123b3565b5050505050565b5f6121aa82610e76565b90506121b9815f846001611c09565b6121c282610e76565b5f83815260066020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526005845282852080545f190190558785526004909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b5f6001600160e01b0319821663152a902d60e11b14806107be57506301ffc9a760e01b6001600160e01b03198316146107be565b5f600161227f8461112a565b612289919061291c565b5f838152600960205260409020549091508082146122da576001600160a01b0384165f9081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b505f9182526009602090815260408084208490556001600160a01b039094168352600881528383209183525290812055565b600a545f9061231d9060019061291c565b5f838152600b6020526040812054600a8054939450909284908110612344576123446127ec565b905f5260205f200154905080600a8381548110612363576123636127ec565b5f918252602080832090910192909255828152600b9091526040808220849055858252812055600a80548061239a5761239a612a54565b600190038181905f5260205f20015f9055905550505050565b5f6123bd8361112a565b6001600160a01b039093165f908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b6001600160e01b031981168114610cea575f80fd5b5f6020828403121561241a575f80fd5b81356113a5816123f5565b5f5b8381101561243f578181015183820152602001612427565b50505f910152565b5f815180845261245e816020860160208601612425565b601f01601f19169290920160200192915050565b602081525f6113a56020830184612447565b5f60208284031215612494575f80fd5b5035919050565b80356001600160a01b03811681146124b1575f80fd5b919050565b5f80604083850312156124c7575f80fd5b6124d08361249b565b946020939093013593505050565b5f805f606084860312156124f0575f80fd5b6124f98461249b565b92506125076020850161249b565b9150604084013590509250925092565b5f8060408385031215612528575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52604160045260245ffd5b5f67ffffffffffffffff8084111561256557612565612537565b604051601f8501601f19908116603f0116810190828211818310171561258d5761258d612537565b816040528093508581528686860111156125a5575f80fd5b858560208301375f602087830101525050509392505050565b5f602082840312156125ce575f80fd5b813567ffffffffffffffff8111156125e4575f80fd5b8201601f810184136125f4575f80fd5b6116e48482356020840161254b565b5f60208284031215612613575f80fd5b6113a58261249b565b5f806040838503121561262d575f80fd5b6126368361249b565b91506020830135801515811461264a575f80fd5b809150509250929050565b5f805f8060808587031215612668575f80fd5b6126718561249b565b935061267f6020860161249b565b925060408501359150606085013567ffffffffffffffff8111156126a1575f80fd5b8501601f810187136126b1575f80fd5b6126c08782356020840161254b565b91505092959194509250565b5f80604083850312156126dd575f80fd5b6126e68361249b565b91506126f46020840161249b565b90509250929050565b600181811c9082168061271157607f821691505b60208210810361272f57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b5f6001820161275a5761275a612735565b5060010190565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b80820281158282048414176107be576107be612735565b634e487b7160e01b5f52601260045260245ffd5b5f826127e7576127e76127c5565b500490565b634e487b7160e01b5f52603260045260245ffd5b601f82111561098d575f81815260208120601f850160051c810160208610156128265750805b601f850160051c820191505b8181101561284557828155600101612832565b505050505050565b815167ffffffffffffffff81111561286757612867612537565b61287b8161287584546126fd565b84612800565b602080601f8311600181146128ae575f84156128975750858301515b5f19600386901b1c1916600185901b178555612845565b5f85815260208120601f198616915b828110156128dc578886015182559484019460019091019084016128bd565b50858210156128f957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156107be576107be612735565b818103818111156107be576107be612735565b5f8351612940818460208801612425565b835190830190612954818360208801612425565b01949350505050565b5f8261296b5761296b6127c5565b500690565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061112090830184612447565b5f60208284031215612a49575f80fd5b81516113a5816123f5565b634e487b7160e01b5f52603160045260245ffdfea26469706673582212200936ecbade6ea8c61c6a697f6ef9bc62114d796d4e5a43391281fbfdeccb643864736f6c6343000815003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000004064333162336436363239386530306532343466653731646565633135386162643164336637656232343461643266646636323238306362333335313335343739
Deployed Bytecode
0x60806040526004361061025f575f3560e01c80636352211e1161013f578063aa861074116100b3578063e985e9c511610078578063e985e9c5146106bc578063eb8d244414610703578063eedbe31d14610723578063f2fde38b1461076c578063fc5cccd21461078b578063fcd386bb146107a0575f80fd5b8063aa86107414610640578063b88d4fde14610655578063ba12b50214610674578063c6ab67a314610689578063c87b56dd1461069d575f80fd5b80638456cb59116101045780638456cb59146105a957806388a1228f146105bd5780638ad031d0146105d15780638da5cb5b146105eb57806395d89b411461060d578063a22cb46514610621575f80fd5b80636352211e146105235780636897c3351461054257806370a0823114610561578063715018a61461058057806383d09ffd14610594575f80fd5b8063397be3fd116101d657806342966c681161019b57806342966c68146104665780634f6ccce71461048557806355f804b3146104a457806358549aac146104c35780635bf5d54c146104dd5780635c975abb1461050c575f80fd5b8063397be3fd146103ed5780633ccfd60b1461040c5780633f4ba83a146104205780634143f3db1461043457806342842e0e14610447575f80fd5b80631d9fef1a116102275780631d9fef1a1461032e57806323b872dd146103415780632a55205a146103605780632f745c591461039e57806332cb6b0c146103bd57806335eaa773146103d2575f80fd5b806301ffc9a71461026357806306fdde0314610297578063081812fc146102b8578063095ea7b3146102ef57806318160ddd14610310575b5f80fd5b34801561026e575f80fd5b5061028261027d36600461240a565b6107b4565b60405190151581526020015b60405180910390f35b3480156102a2575f80fd5b506102ab6107c4565b60405161028e9190612472565b3480156102c3575f80fd5b506102d76102d2366004612484565b610854565b6040516001600160a01b03909116815260200161028e565b3480156102fa575f80fd5b5061030e6103093660046124b6565b610879565b005b34801561031b575f80fd5b50600a545b60405190815260200161028e565b61030e61033c366004612484565b610992565b34801561034c575f80fd5b5061030e61035b3660046124de565b610a77565b34801561036b575f80fd5b5061037f61037a366004612517565b610aa9565b604080516001600160a01b03909316835260208301919091520161028e565b3480156103a9575f80fd5b506103206103b83660046124b6565b610b52565b3480156103c8575f80fd5b5061032061271081565b3480156103dd575f80fd5b5061032067011c37937e08000081565b3480156103f8575f80fd5b5061030e610407366004612484565b610be6565b348015610417575f80fd5b5061030e610ced565b34801561042b575f80fd5b5061030e610d78565b34801561043f575f80fd5b506103205f81565b348015610452575f80fd5b5061030e6104613660046124de565b610d8a565b348015610471575f80fd5b5061030e610480366004612484565b610da4565b348015610490575f80fd5b5061032061049f366004612484565b610dd2565b3480156104af575f80fd5b5061030e6104be3660046125be565b610e62565b3480156104ce575f80fd5b50610320668e1bc9bf04000081565b3480156104e8575f80fd5b506010546011546104f7919082565b6040805192835260208301919091520161028e565b348015610517575f80fd5b50600c5460ff16610282565b34801561052e575f80fd5b506102d761053d366004612484565b610e76565b34801561054d575f80fd5b5061032061055c366004612484565b610ed5565b34801561056c575f80fd5b5061032061057b366004612603565b61112a565b34801561058b575f80fd5b5061030e6111ae565b34801561059f575f80fd5b5061032061232881565b3480156105b4575f80fd5b5061030e6111bf565b3480156105c8575f80fd5b506103206111cf565b3480156105dc575f80fd5b5061032066470de4df82000081565b3480156105f6575f80fd5b50600c5461010090046001600160a01b03166102d7565b348015610618575f80fd5b506102ab61126a565b34801561062c575f80fd5b5061030e61063b36600461261c565b611279565b34801561064b575f80fd5b506103206114e681565b348015610660575f80fd5b5061030e61066f366004612655565b611284565b34801561067f575f80fd5b5061032061015e81565b348015610694575f80fd5b506102ab6112bc565b3480156106a8575f80fd5b506102ab6106b7366004612484565b611348565b3480156106c7575f80fd5b506102826106d63660046126cc565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205460ff1690565b34801561070e575f80fd5b50600c5461028290600160a81b900460ff1681565b34801561072e575f80fd5b506040805180820182525f8082526020918201528151808301835260105480825260115491830191825283519081529051918101919091520161028e565b348015610777575f80fd5b5061030e610786366004612603565b6113ac565b348015610796575f80fd5b50610320600d5481565b3480156107ab575f80fd5b50610320601481565b5f6107be82611422565b92915050565b6060600280546107d3906126fd565b80601f01602080910402602001604051908101604052809291908181526020018280546107ff906126fd565b801561084a5780601f106108215761010080835404028352916020019161084a565b820191905f5260205f20905b81548152906001019060200180831161082d57829003601f168201915b5050505050905090565b5f61085e8261142c565b505f908152600660205260409020546001600160a01b031690565b5f61088382610e76565b9050806001600160a01b0316836001600160a01b0316036108f55760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b0382161480610911575061091181336106d6565b6109835760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c00000060648201526084016108ec565b61098d838361148a565b505050565b3461099c82610ed5565b11156109fc5760405162461bcd60e51b815260206004820152602960248201527f496e73756666696369656e742045746865722073656e7420666f722074686520604482015268383ab931b430b9b29760b91b60648201526084016108ec565b5f610a2a6040805180820182525f808252602091820152815180830190925260105482526011549082015290565b8051909150600103610a4257610a3e6114f7565b5050565b5f5b8281101561098d57610a5d33610a58611570565b61159e565b610a656115b7565b80610a6f81612749565b915050610a44565b610a82335b8261166f565b610a9e5760405162461bcd60e51b81526004016108ec90612761565b61098d8383836116ec565b5f8281526001602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b0316928201929092528291610b1c5750604080518082019091525f546001600160a01b0381168252600160a01b90046001600160601b031660208201525b60208101515f9061271090610b3a906001600160601b0316876127ae565b610b4491906127d9565b915196919550909350505050565b5f610b5c8361112a565b8210610bbe5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016108ec565b506001600160a01b03919091165f908152600860209081526040808320938352929052205490565b610bee61185b565b600a5415610c2e5760405162461bcd60e51b815260206004820152600d60248201526c20b63932b0b23c903237b7329760991b60448201526064016108ec565b6032811115610c905760405162461bcd60e51b815260206004820152602860248201527f596f752063616e207265736572766520757020746f20353020746f6b656e732060448201526730ba1037b731b29760c11b60648201526084016108ec565b5f5b81811015610cc957600c54610cb79061010090046001600160a01b0316610a58611570565b80610cc181612749565b915050610c92565b50610cd26115b7565b610cea600c805460ff60a81b1916600160a81b179055565b50565b610cf561185b565b4780610d325760405162461bcd60e51b815260206004820152600c60248201526b042616c616e636520697320360a41b60448201526064016108ec565b600c5461010090046001600160a01b03166001600160a01b03166108fc8290811502906040515f60405180830381858888f19350505050158015610a3e573d5f803e3d5ffd5b610d8061185b565b610d886118bb565b565b61098d83838360405180602001604052805f815250611284565b610dad33610a7c565b610dc95760405162461bcd60e51b81526004016108ec90612761565b610cea8161190d565b5f610ddc600a5490565b8210610e3f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016108ec565b600a8281548110610e5257610e526127ec565b905f5260205f2001549050919050565b610e6a61185b565b600f610a3e828261284d565b5f818152600460205260408120546001600160a01b0316806107be5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016108ec565b5f808211610f355760405162461bcd60e51b815260206004820152602760248201527f546f6b656e20616d6f756e74206d75737420626520677265617465722074686160448201526637103d32b9379760c91b60648201526084016108ec565b600c54600160a81b900460ff16610f8e5760405162461bcd60e51b815260206004820152601f60248201527f5468652073616c652069732063757272656e746c7920696e6163746976652e0060448201526064016108ec565b6014821115610ff65760405162461bcd60e51b815260206004820152602e60248201527f4d6178696d756d207075726368617365206c696d69742065786365656465642060448201526d1436b0bc34b6bab69d101918149760911b60648201526084016108ec565b61271082611003600a5490565b61100d9190612909565b111561105b5760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e20737570706c79206c696d69742065786365656465642e0000000060448201526064016108ec565b5f6110896040805180820182525f808252602091820152815180830190925260105482526011549082015290565b90505f6110946111cf565b60208301519091508482106110b6576110ad81866127ae565b95945050505050565b82515f906001036110cc57505f95945050505050565b83516002036110e35750668e1bc9bf0400006110f7565b83516003036110f7575067011c37937e0800005b80611102848861291c565b61110c91906127ae565b61111683856127ae565b6111209190612909565b9695505050505050565b5f6001600160a01b0382166111935760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b60648201526084016108ec565b506001600160a01b03165f9081526005602052604090205490565b6111b661185b565b610d885f61197e565b6111c761185b565b610d886119d7565b5f806111da600a5490565b90505f61120a6040805180820182525f808252602091820152815180830190925260105482526011549082015290565b5190506001819003611229576112228261015e61291c565b9250505090565b8060020361123d57611222826114e661291c565b80600303611251576112228261232861291c565b80600403611265576112228261271061291c565b505090565b6060600380546107d3906126fd565b610a3e338383611a14565b61128e338361166f565b6112aa5760405162461bcd60e51b81526004016108ec90612761565b6112b684848484611ae1565b50505050565b600e80546112c9906126fd565b80601f01602080910402602001604051908101604052809291908181526020018280546112f5906126fd565b80156113405780601f1061131757610100808354040283529160200191611340565b820191905f5260205f20905b81548152906001019060200180831161132357829003601f168201915b505050505081565b60606113538261142c565b5f61135c611b14565b90505f81511161137a5760405180602001604052805f8152506113a5565b8061138484611b23565b60405160200161139592919061292f565b6040516020818303038152906040525b9392505050565b6113b461185b565b6001600160a01b0381166114195760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ec565b610cea8161197e565b5f6107be82611bb3565b5f818152600460205260409020546001600160a01b0316610cea5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b60448201526064016108ec565b5f81815260066020526040902080546001600160a01b0319166001600160a01b03841690811790915581906114be82610e76565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6115003361112a565b1561155c5760405162461bcd60e51b815260206004820152602660248201527f5374616765204f6e65204d6178206d696e74207065722077616c6c657420726560448201526530b1b432b21760d11b60648201526084016108ec565b61156833610a58611570565b610d886115b7565b5f8061157b600a5490565b905061271081600d5461158e9190612909565b611598919061295d565b91505090565b610a3e828260405180602001604052805f815250611bd7565b5f6115c1600a5490565b905061015e8110610cea576114e68110156115fe5760408051808201909152600280825266470de4df820000602090920182905260105560115550565b61232881101561163057604080518082019091526003808252668e1bc9bf040000602090920182905260105560115550565b60408051808201909152600480825267011c37937e08000060209092018290526010556011556127108103610cea57600c805460ff60a81b1916905550565b5f8061167a83610e76565b9050806001600160a01b0316846001600160a01b031614806116c057506001600160a01b038082165f9081526007602090815260408083209388168352929052205460ff165b806116e45750836001600160a01b03166116d984610854565b6001600160a01b0316145b949350505050565b826001600160a01b03166116ff82610e76565b6001600160a01b0316146117255760405162461bcd60e51b81526004016108ec90612970565b6001600160a01b0382166117875760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016108ec565b6117948383836001611c09565b826001600160a01b03166117a782610e76565b6001600160a01b0316146117cd5760405162461bcd60e51b81526004016108ec90612970565b5f81815260066020908152604080832080546001600160a01b03199081169091556001600160a01b038781168086526005855283862080545f1901905590871680865283862080546001019055868652600490945282852080549092168417909155905184937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600c546001600160a01b03610100909104163314610d885760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ec565b6118c3611c1d565b600c805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600c54600160a81b900460ff16156119755760405162461bcd60e51b815260206004820152602560248201527f596f752063616e206e6f74206275726e20756e74696c2073616c652066696e6960448201526439b432b21760d91b60648201526084016108ec565b610cea81611c66565b600c80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6119df611c7f565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586118f03390565b816001600160a01b0316836001600160a01b031603611a755760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016108ec565b6001600160a01b038381165f81815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b611aec8484846116ec565b611af884848484611cc5565b6112b65760405162461bcd60e51b81526004016108ec906129b5565b6060600f80546107d3906126fd565b60605f611b2f83611dc2565b60010190505f8167ffffffffffffffff811115611b4e57611b4e612537565b6040519080825280601f01601f191660200182016040528015611b78576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084611b8257509392505050565b5f6001600160e01b0319821663780e9d6360e01b14806107be57506107be82611e99565b611be18383611ed8565b611bed5f848484611cc5565b61098d5760405162461bcd60e51b81526004016108ec906129b5565b611c11611c7f565b6112b68484848461206d565b600c5460ff16610d885760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016108ec565b611c6f816121a0565b5f90815260016020526040812055565b600c5460ff1615610d885760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016108ec565b5f6001600160a01b0384163b15611db757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611d08903390899088908890600401612a07565b6020604051808303815f875af1925050508015611d42575060408051601f3d908101601f19168201909252611d3f91810190612a39565b60015b611d9d573d808015611d6f576040519150601f19603f3d011682016040523d82523d5f602084013e611d74565b606091505b5080515f03611d955760405162461bcd60e51b81526004016108ec906129b5565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506116e4565b506001949350505050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611e005772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611e2c576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611e4a57662386f26fc10000830492506010015b6305f5e1008310611e62576305f5e100830492506008015b6127108310611e7657612710830492506004015b60648310611e88576064830492506002015b600a83106107be5760010192915050565b5f6001600160e01b031982166380ac58cd60e01b1480611ec957506001600160e01b03198216635b5e139f60e01b145b806107be57506107be8261223f565b6001600160a01b038216611f2e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016108ec565b5f818152600460205260409020546001600160a01b031615611f925760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108ec565b611f9f5f83836001611c09565b5f818152600460205260409020546001600160a01b0316156120035760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016108ec565b6001600160a01b0382165f81815260056020908152604080832080546001019055848352600490915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60018111156120dc5760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b60648201526084016108ec565b816001600160a01b0385166121375761213281600a80545f838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b61215a565b836001600160a01b0316856001600160a01b03161461215a5761215a8582612273565b6001600160a01b038416612176576121718161230c565b612199565b846001600160a01b0316846001600160a01b0316146121995761219984826123b3565b5050505050565b5f6121aa82610e76565b90506121b9815f846001611c09565b6121c282610e76565b5f83815260066020908152604080832080546001600160a01b03199081169091556001600160a01b0385168085526005845282852080545f190190558785526004909352818420805490911690555192935084927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b5f6001600160e01b0319821663152a902d60e11b14806107be57506301ffc9a760e01b6001600160e01b03198316146107be565b5f600161227f8461112a565b612289919061291c565b5f838152600960205260409020549091508082146122da576001600160a01b0384165f9081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b505f9182526009602090815260408084208490556001600160a01b039094168352600881528383209183525290812055565b600a545f9061231d9060019061291c565b5f838152600b6020526040812054600a8054939450909284908110612344576123446127ec565b905f5260205f200154905080600a8381548110612363576123636127ec565b5f918252602080832090910192909255828152600b9091526040808220849055858252812055600a80548061239a5761239a612a54565b600190038181905f5260205f20015f9055905550505050565b5f6123bd8361112a565b6001600160a01b039093165f908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b6001600160e01b031981168114610cea575f80fd5b5f6020828403121561241a575f80fd5b81356113a5816123f5565b5f5b8381101561243f578181015183820152602001612427565b50505f910152565b5f815180845261245e816020860160208601612425565b601f01601f19169290920160200192915050565b602081525f6113a56020830184612447565b5f60208284031215612494575f80fd5b5035919050565b80356001600160a01b03811681146124b1575f80fd5b919050565b5f80604083850312156124c7575f80fd5b6124d08361249b565b946020939093013593505050565b5f805f606084860312156124f0575f80fd5b6124f98461249b565b92506125076020850161249b565b9150604084013590509250925092565b5f8060408385031215612528575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52604160045260245ffd5b5f67ffffffffffffffff8084111561256557612565612537565b604051601f8501601f19908116603f0116810190828211818310171561258d5761258d612537565b816040528093508581528686860111156125a5575f80fd5b858560208301375f602087830101525050509392505050565b5f602082840312156125ce575f80fd5b813567ffffffffffffffff8111156125e4575f80fd5b8201601f810184136125f4575f80fd5b6116e48482356020840161254b565b5f60208284031215612613575f80fd5b6113a58261249b565b5f806040838503121561262d575f80fd5b6126368361249b565b91506020830135801515811461264a575f80fd5b809150509250929050565b5f805f8060808587031215612668575f80fd5b6126718561249b565b935061267f6020860161249b565b925060408501359150606085013567ffffffffffffffff8111156126a1575f80fd5b8501601f810187136126b1575f80fd5b6126c08782356020840161254b565b91505092959194509250565b5f80604083850312156126dd575f80fd5b6126e68361249b565b91506126f46020840161249b565b90509250929050565b600181811c9082168061271157607f821691505b60208210810361272f57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b5f6001820161275a5761275a612735565b5060010190565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b80820281158282048414176107be576107be612735565b634e487b7160e01b5f52601260045260245ffd5b5f826127e7576127e76127c5565b500490565b634e487b7160e01b5f52603260045260245ffd5b601f82111561098d575f81815260208120601f850160051c810160208610156128265750805b601f850160051c820191505b8181101561284557828155600101612832565b505050505050565b815167ffffffffffffffff81111561286757612867612537565b61287b8161287584546126fd565b84612800565b602080601f8311600181146128ae575f84156128975750858301515b5f19600386901b1c1916600185901b178555612845565b5f85815260208120601f198616915b828110156128dc578886015182559484019460019091019084016128bd565b50858210156128f957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156107be576107be612735565b818103818111156107be576107be612735565b5f8351612940818460208801612425565b835190830190612954818360208801612425565b01949350505050565b5f8261296b5761296b6127c5565b500690565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061112090830184612447565b5f60208284031215612a49575f80fd5b81516113a5816123f5565b634e487b7160e01b5f52603160045260245ffdfea26469706673582212200936ecbade6ea8c61c6a697f6ef9bc62114d796d4e5a43391281fbfdeccb643864736f6c63430008150033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000004064333162336436363239386530306532343466653731646565633135386162643164336637656232343461643266646636323238306362333335313335343739
-----Decoded View---------------
Arg [0] : hash (string): d31b3d66298e00e244fe71deec158abd1d3f7eb244ad2fdf62280cb335135479
Arg [1] : feeNumerator (uint96): 400
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000190
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [3] : 6433316233643636323938653030653234346665373164656563313538616264
Arg [4] : 3164336637656232343461643266646636323238306362333335313335343739
Deployed Bytecode Sourcemap
74820:15182:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89770:227;;;;;;;;;;-1:-1:-1;89770:227:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;89770:227:0;;;;;;;;50523:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;52035:171::-;;;;;;;;;;-1:-1:-1;52035:171:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;52035:171:0;1533:203:1;51553:416:0;;;;;;;;;;-1:-1:-1;51553:416:0;;;;;:::i;:::-;;:::i;:::-;;69443:113;;;;;;;;;;-1:-1:-1;69531:10:0;:17;69443:113;;;2324:25:1;;;2312:2;2297:18;69443:113:0;2178:177:1;87651:487:0;;;;;;:::i;:::-;;:::i;52735:301::-;;;;;;;;;;-1:-1:-1;52735:301:0;;;;;:::i;:::-;;:::i;38820:438::-;;;;;;;;;;-1:-1:-1;38820:438:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3138:32:1;;;3120:51;;3202:2;3187:18;;3180:34;;;;3093:18;38820:438:0;2946:274:1;69111:256:0;;;;;;;;;;-1:-1:-1;69111:256:0;;;;;:::i;:::-;;:::i;76131:39::-;;;;;;;;;;;;76165:5;76131:39;;75810:57;;;;;;;;;;;;75850:17;75810:57;;88359:333;;;;;;;;;;-1:-1:-1;88359:333:0;;;;;:::i;:::-;;:::i;89055:184::-;;;;;;;;;;;;;:::i;82088:65::-;;;;;;;;;;;;;:::i;75609:40::-;;;;;;;;;;;;75648:1;75609:40;;53107:151;;;;;;;;;;-1:-1:-1;53107:151:0;;;;;:::i;:::-;;:::i;65992:242::-;;;;;;;;;;-1:-1:-1;65992:242:0;;;;;:::i;:::-;;:::i;69633:233::-;;;;;;;;;;-1:-1:-1;69633:233:0;;;;;:::i;:::-;;:::i;81206:111::-;;;;;;;;;;-1:-1:-1;81206:111:0;;;;;:::i;:::-;;:::i;75733:58::-;;;;;;;;;;;;75774:17;75733:58;;78852:32;;;;;;;;;;-1:-1:-1;78852:32:0;;;;;;;;;;;;;4624:25:1;;;4680:2;4665:18;;4658:34;;;;4597:18;78852:32:0;4450:248:1;22617:86:0;;;;;;;;;;-1:-1:-1;22688:7:0;;;;22617:86;;50233:223;;;;;;;;;;-1:-1:-1;50233:223:0;;;;;:::i;:::-;;:::i;85028:1092::-;;;;;;;;;;-1:-1:-1;85028:1092:0;;;;;:::i;:::-;;:::i;49964:207::-;;;;;;;;;;-1:-1:-1;49964:207:0;;;;;:::i;:::-;;:::i;20121:103::-;;;;;;;;;;;;;:::i;76570:45::-;;;;;;;;;;;;76611:4;76570:45;;81745:61;;;;;;;;;;;;;:::i;83678:492::-;;;;;;;;;;;;;:::i;75656:56::-;;;;;;;;;;;;75695:17;75656:56;;19480:87;;;;;;;;;;-1:-1:-1;19553:6:0;;;;;-1:-1:-1;;;;;19553:6:0;19480:87;;50692:104;;;;;;;;;;;;;:::i;52278:155::-;;;;;;;;;;-1:-1:-1;52278:155:0;;;;;:::i;:::-;;:::i;76519:44::-;;;;;;;;;;;;76559:4;76519:44;;53329:279;;;;;;;;;;-1:-1:-1;53329:279:0;;;;;:::i;:::-;;:::i;76469:43::-;;;;;;;;;;;;76509:3;76469:43;;78059:28;;;;;;;;;;;;;:::i;50867:281::-;;;;;;;;;;-1:-1:-1;50867:281:0;;;;;:::i;:::-;;:::i;52504:164::-;;;;;;;;;;-1:-1:-1;52504:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;52625:25:0;;;52601:4;52625:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;52504:164;77351:24;;;;;;;;;;-1:-1:-1;77351:24:0;;;;-1:-1:-1;;;77351:24:0;;;;;;80475:105;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;80553:19:0;;;;;;;80560:12;80553:19;;;;;;;;;;;;80475:105;;6389:32:1;;;6459:24;;6437:20;;;6430:54;;;;6362:18;80475:105:0;6183:307:1;20379:201:0;;;;;;;;;;-1:-1:-1;20379:201:0;;;;;:::i;:::-;;:::i;77635:22::-;;;;;;;;;;;;;;;;76907:35;;;;;;;;;;;;76940:2;76907:35;;89770:227;89924:4;89953:36;89977:11;89953:23;:36::i;:::-;89946:43;89770:227;-1:-1:-1;;89770:227:0:o;50523:100::-;50577:13;50610:5;50603:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50523:100;:::o;52035:171::-;52111:7;52131:23;52146:7;52131:14;:23::i;:::-;-1:-1:-1;52174:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;52174:24:0;;52035:171::o;51553:416::-;51634:13;51650:23;51665:7;51650:14;:23::i;:::-;51634:39;;51698:5;-1:-1:-1;;;;;51692:11:0;:2;-1:-1:-1;;;;;51692:11:0;;51684:57;;;;-1:-1:-1;;;51684:57:0;;7082:2:1;51684:57:0;;;7064:21:1;7121:2;7101:18;;;7094:30;7160:34;7140:18;;;7133:62;-1:-1:-1;;;7211:18:1;;;7204:31;7252:19;;51684:57:0;;;;;;;;;18105:10;-1:-1:-1;;;;;51776:21:0;;;;:62;;-1:-1:-1;51801:37:0;51818:5;18105:10;52504:164;:::i;51801:37::-;51754:173;;;;-1:-1:-1;;;51754:173:0;;7484:2:1;51754:173:0;;;7466:21:1;7523:2;7503:18;;;7496:30;7562:34;7542:18;;;7535:62;7633:31;7613:18;;;7606:59;7682:19;;51754:173:0;7282:425:1;51754:173:0;51940:21;51949:2;51953:7;51940:8;:21::i;:::-;51623:346;51553:416;;:::o;87651:487::-;87754:9;87724:26;87740:9;87724:15;:26::i;:::-;:39;;87716:93;;;;-1:-1:-1;;;87716:93:0;;7914:2:1;87716:93:0;;;7896:21:1;7953:2;7933:18;;;7926:30;7992:34;7972:18;;;7965:62;-1:-1:-1;;;8043:18:1;;;8036:39;8092:19;;87716:93:0;7712:405:1;87716:93:0;87822:25;87850:17;-1:-1:-1;;;;;;;;;;;;;;;;;80553:19:0;;;;;;;;80560:12;80553:19;;;;;;;;;;80475:105;87850:17;87882:14;;87822:45;;-1:-1:-1;87900:1:0;87882:19;87878:253;;87917:14;:12;:14::i;:::-;87705:433;87651:487;:::o;87878:253::-;87968:6;87963:157;87984:9;87980:1;:13;87963:157;;;88036:35;88046:10;88058:12;:10;:12::i;:::-;88036:9;:35::i;:::-;88090:14;:12;:14::i;:::-;87995:3;;;;:::i;:::-;;;;87963:157;;52735:301;52896:41;18105:10;52915:12;52929:7;52896:18;:41::i;:::-;52888:99;;;;-1:-1:-1;;;52888:99:0;;;;;;;:::i;:::-;53000:28;53010:4;53016:2;53020:7;53000:9;:28::i;38820:438::-;38915:7;38973:26;;;:17;:26;;;;;;;;38944:55;;;;;;;;;-1:-1:-1;;;;;38944:55:0;;;;;-1:-1:-1;;;38944:55:0;;;-1:-1:-1;;;;;38944:55:0;;;;;;;;38915:7;;39012:92;;-1:-1:-1;39063:29:0;;;;;;;;;-1:-1:-1;39063:29:0;-1:-1:-1;;;;;39063:29:0;;;;-1:-1:-1;;;39063:29:0;;-1:-1:-1;;;;;39063:29:0;;;;;39012:92;39153:23;;;;39116:21;;39624:5;;39141:35;;-1:-1:-1;;;;;39141:35:0;:9;:35;:::i;:::-;39140:57;;;;:::i;:::-;39218:16;;;;;-1:-1:-1;38820:438:0;;-1:-1:-1;;;;38820:438:0:o;69111:256::-;69208:7;69244:23;69261:5;69244:16;:23::i;:::-;69236:5;:31;69228:87;;;;-1:-1:-1;;;69228:87:0;;9440:2:1;69228:87:0;;;9422:21:1;9479:2;9459:18;;;9452:30;9518:34;9498:18;;;9491:62;-1:-1:-1;;;9569:18:1;;;9562:41;9620:19;;69228:87:0;9238:407:1;69228:87:0;-1:-1:-1;;;;;;69333:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;69111:256::o;88359:333::-;19366:13;:11;:13::i;:::-;69531:10;:17;88425:18;88417:44:::1;;;::::0;-1:-1:-1;;;88417:44:0;;9852:2:1;88417:44:0::1;::::0;::::1;9834:21:1::0;9891:2;9871:18;;;9864:30;-1:-1:-1;;;9910:18:1;;;9903:43;9963:18;;88417:44:0::1;9650:337:1::0;88417:44:0::1;88487:2;88480:3;:9;;88472:62;;;::::0;-1:-1:-1;;;88472:62:0;;10194:2:1;88472:62:0::1;::::0;::::1;10176:21:1::0;10233:2;10213:18;;;10206:30;10272:34;10252:18;;;10245:62;-1:-1:-1;;;10323:18:1;;;10316:38;10371:19;;88472:62:0::1;9992:404:1::0;88472:62:0::1;88550:6;88545:90;88566:3;88562:1;:7;88545:90;;;19553:6:::0;;88591:32:::1;::::0;19553:6;;;-1:-1:-1;;;;;19553:6:0;88610:12:::1;:10;:12::i;88591:32::-;88571:3:::0;::::1;::::0;::::1;:::i;:::-;;;;88545:90;;;;88645:14;:12;:14::i;:::-;88670;82383:12:::0;:19;;-1:-1:-1;;;;82383:19:0;-1:-1:-1;;;82383:19:0;;;82340:70;88670:14:::1;88359:333:::0;:::o;89055:184::-;19366:13;:11;:13::i;:::-;89118:21:::1;89158:11:::0;89150:36:::1;;;::::0;-1:-1:-1;;;89150:36:0;;10603:2:1;89150:36:0::1;::::0;::::1;10585:21:1::0;10642:2;10622:18;;;10615:30;-1:-1:-1;;;10661:18:1;;;10654:42;10713:18;;89150:36:0::1;10401:336:1::0;89150:36:0::1;19553:6:::0;;;;;-1:-1:-1;;;;;19553:6:0;-1:-1:-1;;;;;89197:25:0::1;:34;89223:7;89197:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;82088:65:::0;19366:13;:11;:13::i;:::-;82135:10:::1;:8;:10::i;:::-;82088:65::o:0;53107:151::-;53211:39;53228:4;53234:2;53238:7;53211:39;;;;;;;;;;;;:16;:39::i;65992:242::-;66110:41;18105:10;66129:12;18025:98;66110:41;66102:99;;;;-1:-1:-1;;;66102:99:0;;;;;;;:::i;:::-;66212:14;66218:7;66212:5;:14::i;69633:233::-;69708:7;69744:30;69531:10;:17;;69443:113;69744:30;69736:5;:38;69728:95;;;;-1:-1:-1;;;69728:95:0;;10944:2:1;69728:95:0;;;10926:21:1;10983:2;10963:18;;;10956:30;11022:34;11002:18;;;10995:62;-1:-1:-1;;;11073:18:1;;;11066:42;11125:19;;69728:95:0;10742:408:1;69728:95:0;69841:10;69852:5;69841:17;;;;;;;;:::i;:::-;;;;;;;;;69834:24;;69633:233;;;:::o;81206:111::-;19366:13;:11;:13::i;:::-;81282:16:::1;:27;81301:8:::0;81282:16;:27:::1;:::i;50233:223::-:0;50305:7;54966:16;;;:7;:16;;;;;;-1:-1:-1;;;;;54966:16:0;;50369:56;;;;-1:-1:-1;;;50369:56:0;;13693:2:1;50369:56:0;;;13675:21:1;13732:2;13712:18;;;13705:30;-1:-1:-1;;;13751:18:1;;;13744:54;13815:18;;50369:56:0;13491:348:1;85028:1092:0;85090:10;85133:1;85121:9;:13;85113:65;;;;-1:-1:-1;;;85113:65:0;;14046:2:1;85113:65:0;;;14028:21:1;14085:2;14065:18;;;14058:30;14124:34;14104:18;;;14097:62;-1:-1:-1;;;14175:18:1;;;14168:37;14222:19;;85113:65:0;13844:403:1;85113:65:0;85197:12;;-1:-1:-1;;;85197:12:0;;;;85189:56;;;;-1:-1:-1;;;85189:56:0;;14454:2:1;85189:56:0;;;14436:21:1;14493:2;14473:18;;;14466:30;14532:33;14512:18;;;14505:61;14583:18;;85189:56:0;14252:355:1;85189:56:0;76940:2;85264:9;:22;;85256:81;;;;-1:-1:-1;;;85256:81:0;;14814:2:1;85256:81:0;;;14796:21:1;14853:2;14833:18;;;14826:30;14892:34;14872:18;;;14865:62;-1:-1:-1;;;14943:18:1;;;14936:44;14997:19;;85256:81:0;14612:410:1;85256:81:0;76165:5;85372:9;85356:13;69531:10;:17;;69443:113;85356:13;:25;;;;:::i;:::-;:39;;85348:80;;;;-1:-1:-1;;;85348:80:0;;15359:2:1;85348:80:0;;;15341:21:1;15398:2;15378:18;;;15371:30;15437;15417:18;;;15410:58;15485:18;;85348:80:0;15157:352:1;85348:80:0;85449:25;85477:17;-1:-1:-1;;;;;;;;;;;;;;;;;80553:19:0;;;;;;;;80560:12;80553:19;;;;;;;;;;80475:105;85477:17;85449:45;;85505:17;85525:21;:19;:21::i;:::-;85577:15;;;;85505:41;;-1:-1:-1;85617:25:0;;;85613:89;;85666:24;85678:12;85666:9;:24;:::i;:::-;85659:31;85028:1092;-1:-1:-1;;;;;85028:1092:0:o;85613:89::-;85766:14;;85722:19;;85784:1;85766:19;85762:60;;-1:-1:-1;85809:1:0;;85028:1092;-1:-1:-1;;;;;85028:1092:0:o;85762:60::-;85837:14;;85855:1;85837:19;85833:177;;-1:-1:-1;75774:17:0;85833:177;;;85929:14;;85947:1;85929:19;85925:85;;-1:-1:-1;75850:17:0;85925:85;86097:14;86069:24;86081:12;86069:9;:24;:::i;:::-;86068:43;;;;:::i;:::-;86037:27;86052:12;86037;:27;:::i;:::-;:75;;;;:::i;:::-;86030:82;85028:1092;-1:-1:-1;;;;;;85028:1092:0:o;49964:207::-;50036:7;-1:-1:-1;;;;;50064:19:0;;50056:73;;;;-1:-1:-1;;;50056:73:0;;15849:2:1;50056:73:0;;;15831:21:1;15888:2;15868:18;;;15861:30;15927:34;15907:18;;;15900:62;-1:-1:-1;;;15978:18:1;;;15971:39;16027:19;;50056:73:0;15647:405:1;50056:73:0;-1:-1:-1;;;;;;50147:16:0;;;;;:9;:16;;;;;;;49964:207::o;20121:103::-;19366:13;:11;:13::i;:::-;20186:30:::1;20213:1;20186:18;:30::i;81745:61::-:0;19366:13;:11;:13::i;:::-;81790:8:::1;:6;:8::i;83678:492::-:0;83730:8;83750:11;83764:13;69531:10;:17;;69443:113;83764:13;83750:27;;83788:10;83801:17;-1:-1:-1;;;;;;;;;;;;;;;;;80553:19:0;;;;;;;;80560:12;80553:19;;;;;;;;;;80475:105;83801:17;:26;;-1:-1:-1;83851:1:0;83842:10;;;83838:76;;83876:25;83895:6;76509:3;83876:25;:::i;:::-;83869:32;;;;83678:492;:::o;83838:76::-;83928:5;83937:1;83928:10;83924:75;;83962:25;83981:6;76559:4;83962:25;:::i;83924:75::-;84013:5;84022:1;84013:10;84009:76;;84047:26;84067:6;76611:4;84047:26;:::i;84009:76::-;84099:5;84108:1;84099:10;84095:68;;84133:18;84145:6;76165:5;84133:18;:::i;84095:68::-;83739:431;;83678:492;:::o;50692:104::-;50748:13;50781:7;50774:14;;;;;:::i;52278:155::-;52373:52;18105:10;52406:8;52416;52373:18;:52::i;53329:279::-;53460:41;18105:10;53493:7;53460:18;:41::i;:::-;53452:99;;;;-1:-1:-1;;;53452:99:0;;;;;;;:::i;:::-;53562:38;53576:4;53582:2;53586:7;53595:4;53562:13;:38::i;:::-;53329:279;;;;:::o;78059:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50867:281::-;50940:13;50966:23;50981:7;50966:14;:23::i;:::-;51002:21;51026:10;:8;:10::i;:::-;51002:34;;51078:1;51060:7;51054:21;:25;:86;;;;;;;;;;;;;;;;;51106:7;51115:18;:7;:16;:18::i;:::-;51089:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51054:86;51047:93;50867:281;-1:-1:-1;;;50867:281:0:o;20379:201::-;19366:13;:11;:13::i;:::-;-1:-1:-1;;;;;20468:22:0;::::1;20460:73;;;::::0;-1:-1:-1;;;20460:73:0;;16760:2:1;20460:73:0::1;::::0;::::1;16742:21:1::0;16799:2;16779:18;;;16772:30;16838:34;16818:18;;;16811:62;-1:-1:-1;;;16889:18:1;;;16882:36;16935:19;;20460:73:0::1;16558:402:1::0;20460:73:0::1;20544:28;20563:8;20544:18;:28::i;67327:170::-:0;67429:4;67453:36;67477:11;67453:23;:36::i;61598:135::-;55368:4;54966:16;;;:7;:16;;;;;;-1:-1:-1;;;;;54966:16:0;61672:53;;;;-1:-1:-1;;;61672:53:0;;13693:2:1;61672:53:0;;;13675:21:1;13732:2;13712:18;;;13705:30;-1:-1:-1;;;13751:18:1;;;13744:54;13815:18;;61672:53:0;13491:348:1;60911:174:0;60986:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;60986:29:0;-1:-1:-1;;;;;60986:29:0;;;;;;;;:24;;61040:23;60986:24;61040:14;:23::i;:::-;-1:-1:-1;;;;;61031:46:0;;;;;;;;;;;60911:174;;:::o;86834:202::-;86886:21;86896:10;86886:9;:21::i;:::-;:26;86878:77;;;;-1:-1:-1;;;86878:77:0;;17167:2:1;86878:77:0;;;17149:21:1;17206:2;17186:18;;;17179:30;17245:34;17225:18;;;17218:62;-1:-1:-1;;;17296:18:1;;;17289:36;17342:19;;86878:77:0;16965:402:1;86878:77:0;86968:35;86978:10;86990:12;:10;:12::i;86968:35::-;87014:14;:12;:14::i;86363:160::-;86408:12;86433:11;86447:13;69531:10;:17;;69443:113;86447:13;86433:27;;76165:5;86495:6;86482:10;;:19;;;;:::i;:::-;86481:34;;;;:::i;:::-;86471:44;;86422:101;86363:160;:::o;56204:110::-;56280:26;56290:2;56294:7;56280:26;;;;;;;;;;;;:9;:26::i;82704:555::-;82748:11;82762:13;69531:10;:17;;69443:113;82762:13;82748:27;;76509:3;82800:6;:25;82796:456;;76559:4;82883:6;:25;82879:373;;;80078:55;;;;;;;;;82941:1;80078:55;;;75695:17;80078:55;;;;;;;80063:12;:70;;;88359:333;:::o;82879:373::-;76611:4;82982:6;:26;82978:274;;;80078:55;;;;;;;;;83041:1;80078:55;;;75774:17;80078:55;;;;;;;80063:12;:70;;;88359:333;:::o;82978:274::-;80078:55;;;;;;;;;83111:1;80078:55;;;75850:17;80078:55;;;;;;;80063:12;:70;;;76165:5;83164:6;:20;83160:81;;83205:12;:20;;-1:-1:-1;;;;83205:20:0;;;82737:522;82704:555::o;55598:264::-;55691:4;55708:13;55724:23;55739:7;55724:14;:23::i;:::-;55708:39;;55777:5;-1:-1:-1;;;;;55766:16:0;:7;-1:-1:-1;;;;;55766:16:0;;:52;;;-1:-1:-1;;;;;;52625:25:0;;;52601:4;52625:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;55786:32;55766:87;;;;55846:7;-1:-1:-1;;;;;55822:31:0;:20;55834:7;55822:11;:20::i;:::-;-1:-1:-1;;;;;55822:31:0;;55766:87;55758:96;55598:264;-1:-1:-1;;;;55598:264:0:o;59563:1229::-;59688:4;-1:-1:-1;;;;;59661:31:0;:23;59676:7;59661:14;:23::i;:::-;-1:-1:-1;;;;;59661:31:0;;59653:81;;;;-1:-1:-1;;;59653:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;59753:16:0;;59745:65;;;;-1:-1:-1;;;59745:65:0;;18097:2:1;59745:65:0;;;18079:21:1;18136:2;18116:18;;;18109:30;18175:34;18155:18;;;18148:62;-1:-1:-1;;;18226:18:1;;;18219:34;18270:19;;59745:65:0;17895:400:1;59745:65:0;59823:42;59844:4;59850:2;59854:7;59863:1;59823:20;:42::i;:::-;59995:4;-1:-1:-1;;;;;59968:31:0;:23;59983:7;59968:14;:23::i;:::-;-1:-1:-1;;;;;59968:31:0;;59960:81;;;;-1:-1:-1;;;59960:81:0;;;;;;;:::i;:::-;60113:24;;;;:15;:24;;;;;;;;60106:31;;-1:-1:-1;;;;;;60106:31:0;;;;;;-1:-1:-1;;;;;60589:15:0;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;60589:20:0;;;60624:13;;;;;;;;;:18;;60106:31;60624:18;;;60664:16;;;:7;:16;;;;;;:21;;;;;;;;;;60703:27;;60129:7;;60703:27;;;51623:346;51553:416;;:::o;19645:132::-;19553:6;;-1:-1:-1;;;;;19553:6:0;;;;;18105:10;19709:23;19701:68;;;;-1:-1:-1;;;19701:68:0;;18502:2:1;19701:68:0;;;18484:21:1;;;18521:18;;;18514:30;18580:34;18560:18;;;18553:62;18632:18;;19701:68:0;18300:356:1;23472:120:0;22481:16;:14;:16::i;:::-;23531:7:::1;:15:::0;;-1:-1:-1;;23531:15:0::1;::::0;;23562:22:::1;18105:10:::0;23571:12:::1;23562:22;::::0;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;23562:22:0::1;;;;;;;23472:120::o:0;89576:186::-;89669:12;;-1:-1:-1;;;89669:12:0;;;;89668:13;89660:63;;;;-1:-1:-1;;;89660:63:0;;18863:2:1;89660:63:0;;;18845:21:1;18902:2;18882:18;;;18875:30;18941:34;18921:18;;;18914:62;-1:-1:-1;;;18992:18:1;;;18985:35;19037:19;;89660:63:0;18661:401:1;89660:63:0;89734:20;89746:7;89734:11;:20::i;20740:191::-;20833:6;;;-1:-1:-1;;;;;20850:17:0;;;20833:6;20850:17;;;-1:-1:-1;;;;;;20850:17:0;;;;;;20883:40;;20833:6;;;;;;;;20883:40;;20814:16;;20883:40;20803:128;20740:191;:::o;23213:118::-;22222:19;:17;:19::i;:::-;23273:7:::1;:14:::0;;-1:-1:-1;;23273:14:0::1;23283:4;23273:14;::::0;;23303:20:::1;23310:12;18105:10:::0;;18025:98;61228:281;61349:8;-1:-1:-1;;;;;61340:17:0;:5;-1:-1:-1;;;;;61340:17:0;;61332:55;;;;-1:-1:-1;;;61332:55:0;;19269:2:1;61332:55:0;;;19251:21:1;19308:2;19288:18;;;19281:30;19347:27;19327:18;;;19320:55;19392:18;;61332:55:0;19067:349:1;61332:55:0;-1:-1:-1;;;;;61398:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;61398:46:0;;;;;;;;;;61460:41;;540::1;;;61460::0;;513:18:1;61460:41:0;;;;;;;61228:281;;;:::o;54489:270::-;54602:28;54612:4;54618:2;54622:7;54602:9;:28::i;:::-;54649:47;54672:4;54678:2;54682:7;54691:4;54649:22;:47::i;:::-;54641:110;;;;-1:-1:-1;;;54641:110:0;;;;;;;:::i;81325:117::-;81385:13;81418:16;81411:23;;;;;:::i;14938:716::-;14994:13;15045:14;15062:17;15073:5;15062:10;:17::i;:::-;15082:1;15062:21;15045:38;;15098:20;15132:6;15121:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15121:18:0;-1:-1:-1;15098:41:0;-1:-1:-1;15263:28:0;;;15279:2;15263:28;15320:288;-1:-1:-1;;15352:5:0;-1:-1:-1;;;15489:2:0;15478:14;;15473:30;15352:5;15460:44;15550:2;15541:11;;;-1:-1:-1;15571:21:0;15320:288;15571:21;-1:-1:-1;15629:6:0;14938:716;-1:-1:-1;;;14938:716:0:o;68803:224::-;68905:4;-1:-1:-1;;;;;;68929:50:0;;-1:-1:-1;;;68929:50:0;;:90;;;68983:36;69007:11;68983:23;:36::i;56541:285::-;56636:18;56642:2;56646:7;56636:5;:18::i;:::-;56687:53;56718:1;56722:2;56726:7;56735:4;56687:22;:53::i;:::-;56665:153;;;;-1:-1:-1;;;56665:153:0;;;;;;;:::i;89317:251::-;22222:19;:17;:19::i;:::-;89504:56:::1;89531:4;89537:2;89541:7;89550:9;89504:26;:56::i;22961:108::-:0;22688:7;;;;23020:41;;;;-1:-1:-1;;;23020:41:0;;20042:2:1;23020:41:0;;;20024:21:1;20081:2;20061:18;;;20054:30;-1:-1:-1;;;20100:18:1;;;20093:50;20160:18;;23020:41:0;19840:344:1;67629:135:0;67698:20;67710:7;67698:11;:20::i;:::-;41238:26;;;;:17;:26;;;;;41231:33;88359:333::o;22776:108::-;22688:7;;;;22846:9;22838:38;;;;-1:-1:-1;;;22838:38:0;;20391:2:1;22838:38:0;;;20373:21:1;20430:2;20410:18;;;20403:30;-1:-1:-1;;;20449:18:1;;;20442:46;20505:18;;22838:38:0;20189:340:1;62297:853:0;62451:4;-1:-1:-1;;;;;62472:13:0;;25374:19;:23;62468:675;;62508:71;;-1:-1:-1;;;62508:71:0;;-1:-1:-1;;;;;62508:36:0;;;;;:71;;18105:10;;62559:4;;62565:7;;62574:4;;62508:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62508:71:0;;;;;;;;-1:-1:-1;;62508:71:0;;;;;;;;;;;;:::i;:::-;;;62504:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62749:6;:13;62766:1;62749:18;62745:328;;62792:60;;-1:-1:-1;;;62792:60:0;;;;;;;:::i;62745:328::-;63023:6;63017:13;63008:6;63004:2;63000:15;62993:38;62504:584;-1:-1:-1;;;;;;62630:51:0;-1:-1:-1;;;62630:51:0;;-1:-1:-1;62623:58:0;;62468:675;-1:-1:-1;63127:4:0;62297:853;;;;;;:::o;11766:948::-;11819:7;;-1:-1:-1;;;11897:17:0;;11893:106;;-1:-1:-1;;;11935:17:0;;;-1:-1:-1;11981:2:0;11971:12;11893:106;12026:8;12017:5;:17;12013:106;;12064:8;12055:17;;;-1:-1:-1;12101:2:0;12091:12;12013:106;12146:8;12137:5;:17;12133:106;;12184:8;12175:17;;;-1:-1:-1;12221:2:0;12211:12;12133:106;12266:7;12257:5;:16;12253:103;;12303:7;12294:16;;;-1:-1:-1;12339:1:0;12329:11;12253:103;12383:7;12374:5;:16;12370:103;;12420:7;12411:16;;;-1:-1:-1;12456:1:0;12446:11;12370:103;12500:7;12491:5;:16;12487:103;;12537:7;12528:16;;;-1:-1:-1;12573:1:0;12563:11;12487:103;12617:7;12608:5;:16;12604:68;;12655:1;12645:11;12700:6;11766:948;-1:-1:-1;;11766:948:0:o;49595:305::-;49697:4;-1:-1:-1;;;;;;49734:40:0;;-1:-1:-1;;;49734:40:0;;:105;;-1:-1:-1;;;;;;;49791:48:0;;-1:-1:-1;;;49791:48:0;49734:105;:158;;;;49856:36;49880:11;49856:23;:36::i;57162:942::-;-1:-1:-1;;;;;57242:16:0;;57234:61;;;;-1:-1:-1;;;57234:61:0;;21484:2:1;57234:61:0;;;21466:21:1;;;21503:18;;;21496:30;21562:34;21542:18;;;21535:62;21614:18;;57234:61:0;21282:356:1;57234:61:0;55368:4;54966:16;;;:7;:16;;;;;;-1:-1:-1;;;;;54966:16:0;55392:31;57306:58;;;;-1:-1:-1;;;57306:58:0;;21845:2:1;57306:58:0;;;21827:21:1;21884:2;21864:18;;;21857:30;21923;21903:18;;;21896:58;21971:18;;57306:58:0;21643:352:1;57306:58:0;57377:48;57406:1;57410:2;57414:7;57423:1;57377:20;:48::i;:::-;55368:4;54966:16;;;:7;:16;;;;;;-1:-1:-1;;;;;54966:16:0;55392:31;57515:58;;;;-1:-1:-1;;;57515:58:0;;21845:2:1;57515:58:0;;;21827:21:1;21884:2;21864:18;;;21857:30;21923;21903:18;;;21896:58;21971:18;;57515:58:0;21643:352:1;57515:58:0;-1:-1:-1;;;;;57922:13:0;;;;;;:9;:13;;;;;;;;:18;;57939:1;57922:18;;;57964:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;57964:21:0;;;;;58003:33;57972:7;;57922:13;;58003:33;;57922:13;;58003:33;87705:433;87651:487;:::o;69940:915::-;70207:1;70195:9;:13;70191:222;;;70338:63;;-1:-1:-1;;;70338:63:0;;22202:2:1;70338:63:0;;;22184:21:1;22241:2;22221:18;;;22214:30;22280:34;22260:18;;;22253:62;-1:-1:-1;;;22331:18:1;;;22324:51;22392:19;;70338:63:0;22000:417:1;70191:222:0;70443:12;-1:-1:-1;;;;;70472:18:0;;70468:187;;70507:40;70539:7;71682:10;:17;;71655:24;;;;:15;:24;;;;;:44;;;71710:24;;;;;;;;;;;;71578:164;70507:40;70468:187;;;70577:2;-1:-1:-1;;;;;70569:10:0;:4;-1:-1:-1;;;;;70569:10:0;;70565:90;;70596:47;70629:4;70635:7;70596:32;:47::i;:::-;-1:-1:-1;;;;;70669:16:0;;70665:183;;70702:45;70739:7;70702:36;:45::i;:::-;70665:183;;;70775:4;-1:-1:-1;;;;;70769:10:0;:2;-1:-1:-1;;;;;70769:10:0;;70765:83;;70796:40;70824:2;70828:7;70796:27;:40::i;:::-;70106:749;69940:915;;;;:::o;58443:783::-;58503:13;58519:23;58534:7;58519:14;:23::i;:::-;58503:39;;58555:51;58576:5;58591:1;58595:7;58604:1;58555:20;:51::i;:::-;58719:23;58734:7;58719:14;:23::i;:::-;58790:24;;;;:15;:24;;;;;;;;58783:31;;-1:-1:-1;;;;;;58783:31:0;;;;;;-1:-1:-1;;;;;59035:16:0;;;;;:9;:16;;;;;:21;;-1:-1:-1;;59035:21:0;;;59085:16;;;:7;:16;;;;;;59078:23;;;;;;;59119:36;58711:31;;-1:-1:-1;58806:7:0;;59119:36;;58790:24;;59119:36;87705:433;87651:487;:::o;38550:215::-;38652:4;-1:-1:-1;;;;;;38676:41:0;;-1:-1:-1;;;38676:41:0;;:81;;-1:-1:-1;;;;;;;;;;37103:40:0;;;38721:36;36994:157;72369:988;72635:22;72685:1;72660:22;72677:4;72660:16;:22::i;:::-;:26;;;;:::i;:::-;72697:18;72718:26;;;:17;:26;;;;;;72635:51;;-1:-1:-1;72851:28:0;;;72847:328;;-1:-1:-1;;;;;72918:18:0;;72896:19;72918:18;;;:12;:18;;;;;;;;:34;;;;;;;;;72969:30;;;;;;:44;;;73086:30;;:17;:30;;;;;:43;;;72847:328;-1:-1:-1;73271:26:0;;;;:17;:26;;;;;;;;73264:33;;;-1:-1:-1;;;;;73315:18:0;;;;;:12;:18;;;;;:34;;;;;;;73308:41;72369:988::o;73652:1079::-;73930:10;:17;73905:22;;73930:21;;73950:1;;73930:21;:::i;:::-;73962:18;73983:24;;;:15;:24;;;;;;74356:10;:26;;73905:46;;-1:-1:-1;73983:24:0;;73905:46;;74356:26;;;;;;:::i;:::-;;;;;;;;;74334:48;;74420:11;74395:10;74406;74395:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;74500:28;;;:15;:28;;;;;;;:41;;;74672:24;;;;;74665:31;74707:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;73723:1008;;;73652:1079;:::o;71156:221::-;71241:14;71258:20;71275:2;71258:16;:20::i;:::-;-1:-1:-1;;;;;71289:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;71334:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;71156:221:0:o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2360:328::-;2437:6;2445;2453;2506:2;2494:9;2485:7;2481:23;2477:32;2474:52;;;2522:1;2519;2512:12;2474:52;2545:29;2564:9;2545:29;:::i;:::-;2535:39;;2593:38;2627:2;2616:9;2612:18;2593:38;:::i;:::-;2583:48;;2678:2;2667:9;2663:18;2650:32;2640:42;;2360:328;;;;;:::o;2693:248::-;2761:6;2769;2822:2;2810:9;2801:7;2797:23;2793:32;2790:52;;;2838:1;2835;2828:12;2790:52;-1:-1:-1;;2861:23:1;;;2931:2;2916:18;;;2903:32;;-1:-1:-1;2693:248:1:o;3225:127::-;3286:10;3281:3;3277:20;3274:1;3267:31;3317:4;3314:1;3307:15;3341:4;3338:1;3331:15;3357:632;3422:5;3452:18;3493:2;3485:6;3482:14;3479:40;;;3499:18;;:::i;:::-;3574:2;3568:9;3542:2;3628:15;;-1:-1:-1;;3624:24:1;;;3650:2;3620:33;3616:42;3604:55;;;3674:18;;;3694:22;;;3671:46;3668:72;;;3720:18;;:::i;:::-;3760:10;3756:2;3749:22;3789:6;3780:15;;3819:6;3811;3804:22;3859:3;3850:6;3845:3;3841:16;3838:25;3835:45;;;3876:1;3873;3866:12;3835:45;3926:6;3921:3;3914:4;3906:6;3902:17;3889:44;3981:1;3974:4;3965:6;3957;3953:19;3949:30;3942:41;;;;3357:632;;;;;:::o;3994:451::-;4063:6;4116:2;4104:9;4095:7;4091:23;4087:32;4084:52;;;4132:1;4129;4122:12;4084:52;4172:9;4159:23;4205:18;4197:6;4194:30;4191:50;;;4237:1;4234;4227:12;4191:50;4260:22;;4313:4;4305:13;;4301:27;-1:-1:-1;4291:55:1;;4342:1;4339;4332:12;4291:55;4365:74;4431:7;4426:2;4413:16;4408:2;4404;4400:11;4365:74;:::i;4703:186::-;4762:6;4815:2;4803:9;4794:7;4790:23;4786:32;4783:52;;;4831:1;4828;4821:12;4783:52;4854:29;4873:9;4854:29;:::i;4894:347::-;4959:6;4967;5020:2;5008:9;4999:7;4995:23;4991:32;4988:52;;;5036:1;5033;5026:12;4988:52;5059:29;5078:9;5059:29;:::i;:::-;5049:39;;5138:2;5127:9;5123:18;5110:32;5185:5;5178:13;5171:21;5164:5;5161:32;5151:60;;5207:1;5204;5197:12;5151:60;5230:5;5220:15;;;4894:347;;;;;:::o;5246:667::-;5341:6;5349;5357;5365;5418:3;5406:9;5397:7;5393:23;5389:33;5386:53;;;5435:1;5432;5425:12;5386:53;5458:29;5477:9;5458:29;:::i;:::-;5448:39;;5506:38;5540:2;5529:9;5525:18;5506:38;:::i;:::-;5496:48;;5591:2;5580:9;5576:18;5563:32;5553:42;;5646:2;5635:9;5631:18;5618:32;5673:18;5665:6;5662:30;5659:50;;;5705:1;5702;5695:12;5659:50;5728:22;;5781:4;5773:13;;5769:27;-1:-1:-1;5759:55:1;;5810:1;5807;5800:12;5759:55;5833:74;5899:7;5894:2;5881:16;5876:2;5872;5868:11;5833:74;:::i;:::-;5823:84;;;5246:667;;;;;;;:::o;5918:260::-;5986:6;5994;6047:2;6035:9;6026:7;6022:23;6018:32;6015:52;;;6063:1;6060;6053:12;6015:52;6086:29;6105:9;6086:29;:::i;:::-;6076:39;;6134:38;6168:2;6157:9;6153:18;6134:38;:::i;:::-;6124:48;;5918:260;;;;;:::o;6495:380::-;6574:1;6570:12;;;;6617;;;6638:61;;6692:4;6684:6;6680:17;6670:27;;6638:61;6745:2;6737:6;6734:14;6714:18;6711:38;6708:161;;6791:10;6786:3;6782:20;6779:1;6772:31;6826:4;6823:1;6816:15;6854:4;6851:1;6844:15;6708:161;;6495:380;;;:::o;8122:127::-;8183:10;8178:3;8174:20;8171:1;8164:31;8214:4;8211:1;8204:15;8238:4;8235:1;8228:15;8254:135;8293:3;8314:17;;;8311:43;;8334:18;;:::i;:::-;-1:-1:-1;8381:1:1;8370:13;;8254:135::o;8394:409::-;8596:2;8578:21;;;8635:2;8615:18;;;8608:30;8674:34;8669:2;8654:18;;8647:62;-1:-1:-1;;;8740:2:1;8725:18;;8718:43;8793:3;8778:19;;8394:409::o;8808:168::-;8881:9;;;8912;;8929:15;;;8923:22;;8909:37;8899:71;;8950:18;;:::i;8981:127::-;9042:10;9037:3;9033:20;9030:1;9023:31;9073:4;9070:1;9063:15;9097:4;9094:1;9087:15;9113:120;9153:1;9179;9169:35;;9184:18;;:::i;:::-;-1:-1:-1;9218:9:1;;9113:120::o;11155:127::-;11216:10;11211:3;11207:20;11204:1;11197:31;11247:4;11244:1;11237:15;11271:4;11268:1;11261:15;11413:545;11515:2;11510:3;11507:11;11504:448;;;11551:1;11576:5;11572:2;11565:17;11621:4;11617:2;11607:19;11691:2;11679:10;11675:19;11672:1;11668:27;11662:4;11658:38;11727:4;11715:10;11712:20;11709:47;;;-1:-1:-1;11750:4:1;11709:47;11805:2;11800:3;11796:12;11793:1;11789:20;11783:4;11779:31;11769:41;;11860:82;11878:2;11871:5;11868:13;11860:82;;;11923:17;;;11904:1;11893:13;11860:82;;;11864:3;;;11413:545;;;:::o;12134:1352::-;12260:3;12254:10;12287:18;12279:6;12276:30;12273:56;;;12309:18;;:::i;:::-;12338:97;12428:6;12388:38;12420:4;12414:11;12388:38;:::i;:::-;12382:4;12338:97;:::i;:::-;12490:4;;12554:2;12543:14;;12571:1;12566:663;;;;13273:1;13290:6;13287:89;;;-1:-1:-1;13342:19:1;;;13336:26;13287:89;-1:-1:-1;;12091:1:1;12087:11;;;12083:24;12079:29;12069:40;12115:1;12111:11;;;12066:57;13389:81;;12536:944;;12566:663;11360:1;11353:14;;;11397:4;11384:18;;-1:-1:-1;;12602:20:1;;;12720:236;12734:7;12731:1;12728:14;12720:236;;;12823:19;;;12817:26;12802:42;;12915:27;;;;12883:1;12871:14;;;;12750:19;;12720:236;;;12724:3;12984:6;12975:7;12972:19;12969:201;;;13045:19;;;13039:26;-1:-1:-1;;13128:1:1;13124:14;;;13140:3;13120:24;13116:37;13112:42;13097:58;13082:74;;12969:201;-1:-1:-1;;;;;13216:1:1;13200:14;;;13196:22;13183:36;;-1:-1:-1;12134:1352:1:o;15027:125::-;15092:9;;;15113:10;;;15110:36;;;15126:18;;:::i;15514:128::-;15581:9;;;15602:11;;;15599:37;;;15616:18;;:::i;16057:496::-;16236:3;16274:6;16268:13;16290:66;16349:6;16344:3;16337:4;16329:6;16325:17;16290:66;:::i;:::-;16419:13;;16378:16;;;;16441:70;16419:13;16378:16;16488:4;16476:17;;16441:70;:::i;:::-;16527:20;;16057:496;-1:-1:-1;;;;16057:496:1:o;17372:112::-;17404:1;17430;17420:35;;17435:18;;:::i;:::-;-1:-1:-1;17469:9:1;;17372:112::o;17489:401::-;17691:2;17673:21;;;17730:2;17710:18;;;17703:30;17769:34;17764:2;17749:18;;17742:62;-1:-1:-1;;;17835:2:1;17820:18;;17813:35;17880:3;17865:19;;17489:401::o;19421:414::-;19623:2;19605:21;;;19662:2;19642:18;;;19635:30;19701:34;19696:2;19681:18;;19674:62;-1:-1:-1;;;19767:2:1;19752:18;;19745:48;19825:3;19810:19;;19421:414::o;20534:489::-;-1:-1:-1;;;;;20803:15:1;;;20785:34;;20855:15;;20850:2;20835:18;;20828:43;20902:2;20887:18;;20880:34;;;20950:3;20945:2;20930:18;;20923:31;;;20728:4;;20971:46;;20997:19;;20989:6;20971:46;:::i;21028:249::-;21097:6;21150:2;21138:9;21129:7;21125:23;21121:32;21118:52;;;21166:1;21163;21156:12;21118:52;21198:9;21192:16;21217:30;21241:5;21217:30;:::i;22422:127::-;22483:10;22478:3;22474:20;22471:1;22464:31;22514:4;22511:1;22504:15;22538:4;22535:1;22528:15
Swarm Source
ipfs://0936ecbade6ea8c61c6a697f6ef9bc62114d796d4e5a43391281fbfdeccb6438
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.