Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MiniRektSkulls
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-05-11 */ // Sources flattened with hardhat v2.14.0 https://hardhat.org // File @openzeppelin/contracts-upgradeable/utils/[email protected] // // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return 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 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/contracts-upgradeable/proxy/utils/[email protected] // // OpenZeppelin Contracts (last updated v4.8.1) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // // 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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] // // OpenZeppelin Contracts (last updated v4.7.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 OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _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 anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/introspection/[email protected] // // 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 IERC165Upgradeable { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts-upgradeable/interfaces/[email protected] // // OpenZeppelin Contracts (last updated v4.6.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 IERC2981Upgradeable is IERC165Upgradeable { /** * @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/contracts-upgradeable/utils/introspection/[email protected] // // 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 ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing { } function __ERC165_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File @openzeppelin/contracts-upgradeable/token/common/[email protected] // // OpenZeppelin Contracts (last updated v4.7.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 ERC2981Upgradeable is Initializable, IERC2981Upgradeable, ERC165Upgradeable { function __ERC2981_init() internal onlyInitializing { } function __ERC2981_init_unchained() internal onlyInitializing { } 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(IERC165Upgradeable, ERC165Upgradeable) returns (bool) { return interfaceId == type(IERC2981Upgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981Upgradeable */ 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]; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[48] private __gap; } // File @openzeppelin/contracts-upgradeable/utils/math/[email protected] // // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library MathUpgradeable { 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) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 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 10, 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 * 8) < value ? 1 : 0); } } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { 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 = MathUpgradeable.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 `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, MathUpgradeable.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); } } // File @openzeppelin/contracts-upgradeable/utils/cryptography/[email protected] // // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSAUpgradeable { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", StringsUpgradeable.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File @openzeppelin/contracts-upgradeable/utils/cryptography/[email protected] // // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol) pragma solidity ^0.8.0; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ * * @custom:storage-size 52 */ abstract contract EIP712Upgradeable is Initializable { /* solhint-disable var-name-mixedcase */ bytes32 private _HASHED_NAME; bytes32 private _HASHED_VERSION; bytes32 private constant _TYPE_HASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ function __EIP712_init(string memory name, string memory version) internal onlyInitializing { __EIP712_init_unchained(name, version); } function __EIP712_init_unchained(string memory name, string memory version) internal onlyInitializing { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash()); } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSAUpgradeable.toTypedDataHash(_domainSeparatorV4(), structHash); } /** * @dev The hash of the name parameter for the EIP712 domain. * * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs * are a concern. */ function _EIP712NameHash() internal virtual view returns (bytes32) { return _HASHED_NAME; } /** * @dev The hash of the version parameter for the EIP712 domain. * * NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs * are a concern. */ function _EIP712VersionHash() internal virtual view returns (bytes32) { return _HASHED_VERSION; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } // File contracts/OperatorFilterer.sol // pragma solidity ^0.8.4; /// @notice Optimized and flexible operator filterer to abide to OpenSea's /// mandatory on-chain royalty enforcement in order for new collections to /// receive royalties. /// For more information, see: /// See: https://github.com/ProjectOpenSea/operator-filter-registry abstract contract OperatorFilterer { /// @dev The default OpenSea operator blocklist subscription. address internal constant _DEFAULT_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6; /// @dev The OpenSea operator filter registry. address internal constant _OPERATOR_FILTER_REGISTRY = 0x000000000000AAeB6D7670E522A718067333cd4E; /// @dev Registers the current contract to OpenSea's operator filter, /// and subscribe to the default OpenSea operator blocklist. /// Note: Will not revert nor update existing settings for repeated registration. function _registerForOperatorFiltering() internal virtual { _registerForOperatorFiltering(_DEFAULT_SUBSCRIPTION, true); } /// @dev Registers the current contract to OpenSea's operator filter. /// Note: Will not revert nor update existing settings for repeated registration. function _registerForOperatorFiltering(address subscriptionOrRegistrantToCopy, bool subscribe) internal virtual { /// @solidity memory-safe-assembly assembly { let functionSelector := 0x7d3e3dbe // `registerAndSubscribe(address,address)`. // Clean the upper 96 bits of `subscriptionOrRegistrantToCopy` in case they are dirty. subscriptionOrRegistrantToCopy := shr(96, shl(96, subscriptionOrRegistrantToCopy)) for {} iszero(subscribe) {} { if iszero(subscriptionOrRegistrantToCopy) { functionSelector := 0x4420e486 // `register(address)`. break } functionSelector := 0xa0af2903 // `registerAndCopyEntries(address,address)`. break } // Store the function selector. mstore(0x00, shl(224, functionSelector)) // Store the `address(this)`. mstore(0x04, address()) // Store the `subscriptionOrRegistrantToCopy`. mstore(0x24, subscriptionOrRegistrantToCopy) // Register into the registry. if iszero(call(gas(), _OPERATOR_FILTER_REGISTRY, 0, 0x00, 0x44, 0x00, 0x04)) { // If the function selector has not been overwritten, // it is an out-of-gas error. if eq(shr(224, mload(0x00)), functionSelector) { // To prevent gas under-estimation. revert(0, 0) } } // Restore the part of the free memory pointer that was overwritten, // which is guaranteed to be zero, because of Solidity's memory size limits. mstore(0x24, 0) } } /// @dev Modifier to guard a function and revert if the caller is a blocked operator. modifier onlyAllowedOperator(address from) virtual { if (from != msg.sender) { if (!_isPriorityOperator(msg.sender)) { if (_operatorFilteringEnabled()) _revertIfBlocked(msg.sender); } } _; } /// @dev Modifier to guard a function from approving a blocked operator.. modifier onlyAllowedOperatorApproval(address operator) virtual { if (!_isPriorityOperator(operator)) { if (_operatorFilteringEnabled()) _revertIfBlocked(operator); } _; } /// @dev Helper function that reverts if the `operator` is blocked by the registry. function _revertIfBlocked(address operator) private view { /// @solidity memory-safe-assembly assembly { // Store the function selector of `isOperatorAllowed(address,address)`, // shifted left by 6 bytes, which is enough for 8tb of memory. // We waste 6-3 = 3 bytes to save on 6 runtime gas (PUSH1 0x224 SHL). mstore(0x00, 0xc6171134001122334455) // Store the `address(this)`. mstore(0x1a, address()) // Store the `operator`. mstore(0x3a, operator) // `isOperatorAllowed` always returns true if it does not revert. if iszero(staticcall(gas(), _OPERATOR_FILTER_REGISTRY, 0x16, 0x44, 0x00, 0x00)) { // Bubble up the revert if the staticcall reverts. returndatacopy(0x00, 0x00, returndatasize()) revert(0x00, returndatasize()) } // We'll skip checking if `from` is inside the blacklist. // Even though that can block transferring out of wrapper contracts, // we don't want tokens to be stuck. // Restore the part of the free memory pointer that was overwritten, // which is guaranteed to be zero, if less than 8tb of memory is used. mstore(0x3a, 0) } } /// @dev For deriving contracts to override, so that operator filtering /// can be turned on / off. /// Returns true by default. function _operatorFilteringEnabled() internal view virtual returns (bool) { return true; } /// @dev For deriving contracts to override, so that preferred marketplaces can /// skip operator filtering, helping users save gas. /// Returns false for all inputs by default. function _isPriorityOperator(address) internal view virtual returns (bool) { return false; } } // File erc721a-upgradeable/contracts/[email protected] // pragma solidity ^0.8.0; /** * @dev This is a base storage for the initialization function for upgradeable diamond facet contracts **/ library ERC721A__InitializableStorage { struct Layout { /* * Indicates that the contract has been initialized. */ bool _initialized; /* * Indicates that the contract is in the process of being initialized. */ bool _initializing; } bytes32 internal constant STORAGE_SLOT = keccak256('ERC721A.contracts.storage.initializable.facet'); function layout() internal pure returns (Layout storage l) { bytes32 slot = STORAGE_SLOT; assembly { l.slot := slot } } } // File erc721a-upgradeable/contracts/[email protected] // pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable diamond facet contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract ERC721A__Initializable { using ERC721A__InitializableStorage for ERC721A__InitializableStorage.Layout; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializerERC721A() { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the // contract may have been reentered. require( ERC721A__InitializableStorage.layout()._initializing ? _isConstructor() : !ERC721A__InitializableStorage.layout()._initialized, 'ERC721A__Initializable: contract is already initialized' ); bool isTopLevelCall = !ERC721A__InitializableStorage.layout()._initializing; if (isTopLevelCall) { ERC721A__InitializableStorage.layout()._initializing = true; ERC721A__InitializableStorage.layout()._initialized = true; } _; if (isTopLevelCall) { ERC721A__InitializableStorage.layout()._initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} modifier, directly or indirectly. */ modifier onlyInitializingERC721A() { require( ERC721A__InitializableStorage.layout()._initializing, 'ERC721A__Initializable: contract is not initializing' ); _; } /// @dev Returns true if and only if the function is running in the constructor function _isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } } // File erc721a-upgradeable/contracts/[email protected] // pragma solidity ^0.8.0; library ERC721AStorage { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } struct Layout { // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 _currentIndex; // The number of tokens burned. uint256 _burnCounter; // Token name string _name; // Token symbol string _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => ERC721AStorage.TokenApprovalRef) _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) _operatorApprovals; } bytes32 internal constant STORAGE_SLOT = keccak256('ERC721A.contracts.storage.ERC721A'); function layout() internal pure returns (Layout storage l) { bytes32 slot = STORAGE_SLOT; assembly { l.slot := slot } } } // File erc721a-upgradeable/contracts/[email protected] // // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721AUpgradeable { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @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 payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File erc721a-upgradeable/contracts/[email protected] // // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721ReceiverUpgradeable { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721AUpgradeable is ERC721A__Initializable, IERC721AUpgradeable { using ERC721AStorage for ERC721AStorage.Layout; // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // CONSTRUCTOR // ============================================================= function __ERC721A_init(string memory name_, string memory symbol_) internal onlyInitializingERC721A { __ERC721A_init_unchained(name_, symbol_); } function __ERC721A_init_unchained(string memory name_, string memory symbol_) internal onlyInitializingERC721A { ERC721AStorage.layout()._name = name_; ERC721AStorage.layout()._symbol = symbol_; ERC721AStorage.layout()._currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return ERC721AStorage.layout()._currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return ERC721AStorage.layout()._currentIndex - ERC721AStorage.layout()._burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return ERC721AStorage.layout()._currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return ERC721AStorage.layout()._burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return ERC721AStorage.layout()._packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (ERC721AStorage.layout()._packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (ERC721AStorage.layout()._packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(ERC721AStorage.layout()._packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = ERC721AStorage.layout()._packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); ERC721AStorage.layout()._packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return ERC721AStorage.layout()._name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return ERC721AStorage.layout()._symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(ERC721AStorage.layout()._packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (ERC721AStorage.layout()._packedOwnerships[index] == 0) { ERC721AStorage.layout()._packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256 packed) { if (_startTokenId() <= tokenId) { packed = ERC721AStorage.layout()._packedOwnerships[tokenId]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // If the data at the starting slot does not exist, start the scan. if (packed == 0) { if (tokenId >= ERC721AStorage.layout()._currentIndex) revert OwnerQueryForNonexistentToken(); // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `tokenId` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. for (;;) { unchecked { packed = ERC721AStorage.layout()._packedOwnerships[--tokenId]; } if (packed == 0) continue; return packed; } } // Otherwise, the data exists and is not burned. We can skip the scan. // This is possible because we have already achieved the target condition. // This saves 2143 gas on transfers of initialized tokens. return packed; } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}. * * Requirements: * * - The caller must own the token or be an approved operator. */ function approve(address to, uint256 tokenId) public payable virtual override { _approve(to, tokenId, true); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return ERC721AStorage.layout()._tokenApprovals[tokenId].value; } /** * @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) public virtual override { ERC721AStorage.layout()._operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return ERC721AStorage.layout()._operatorApprovals[owner][operator]; } /** * @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. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < ERC721AStorage.layout()._currentIndex && // If within bounds, ERC721AStorage.layout()._packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { ERC721AStorage.TokenApprovalRef storage tokenApproval = ERC721AStorage.layout()._tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --ERC721AStorage.layout()._packedAddressData[from]; // Updates: `balance -= 1`. ++ERC721AStorage.layout()._packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. ERC721AStorage.layout()._packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (ERC721AStorage.layout()._packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != ERC721AStorage.layout()._currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. ERC721AStorage.layout()._packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @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 memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721ReceiverUpgradeable(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (bytes4 retval) { return retval == ERC721A__IERC721ReceiverUpgradeable(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = ERC721AStorage.layout()._currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. ERC721AStorage.layout()._packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. ERC721AStorage.layout()._packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); ERC721AStorage.layout()._currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = ERC721AStorage.layout()._currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. ERC721AStorage.layout()._packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. ERC721AStorage.layout()._packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); ERC721AStorage.layout()._currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = ERC721AStorage.layout()._currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (ERC721AStorage.layout()._currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Equivalent to `_approve(to, tokenId, false)`. */ function _approve(address to, uint256 tokenId) internal virtual { _approve(to, tokenId, false); } /** * @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: * * - `tokenId` must exist. * * Emits an {Approval} event. */ function _approve( address to, uint256 tokenId, bool approvalCheck ) internal virtual { address owner = ownerOf(tokenId); if (approvalCheck) if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } ERC721AStorage.layout()._tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. ERC721AStorage.layout()._packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. ERC721AStorage.layout()._packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (ERC721AStorage.layout()._packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != ERC721AStorage.layout()._currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. ERC721AStorage.layout()._packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { ERC721AStorage.layout()._burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = ERC721AStorage.layout()._packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); ERC721AStorage.layout()._packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File contracts/MiniRektSkulls.sol // pragma solidity 0.8.12; contract MiniRektSkulls is ERC721AUpgradeable, OwnableUpgradeable, OperatorFilterer, ERC2981Upgradeable, EIP712Upgradeable { using ECDSAUpgradeable for bytes32; string private _uri; address public signer; bool public operatorFilteringEnabled; bool public isStarted; uint256 public wlStartTime; uint256 public wlEndTime; uint256 public publicStartTime; uint256 public publicEndTime; uint256 public wlMintDuration; uint256 public publicMintDuration; mapping(address => uint256) public wlMintedAmount; mapping(address => uint256) public publicMintedAmount; uint256 public constant MAX_PUBLIC_MINT_AMOUNT = 10; uint256 public constant MAX_SUPPLY = 6666; function initialize() initializerERC721A initializer public { __ERC721A_init("Lil Skulls", "LIL SKULLS"); __Ownable_init(); __ERC2981_init(); __EIP712_init("MiniRektSkulls", "1.0"); _registerForOperatorFiltering(); operatorFilteringEnabled = true; wlMintDuration = 2 * 3600; publicMintDuration = 24 * 3600; // Set royalty receiver to the contract creator, // at 5% (default denominator is 10000). _setDefaultRoyalty(msg.sender, 425); } modifier NotContract() { require(msg.sender.code.length == 0 && tx.origin == msg.sender, "Lil Skulls: Contract Forbidden"); _; } event StartSale(uint256 startTime); event SetSigner(address indexed signer); event SetRoyalty(address indexed receiver, uint256 royalty); event SetUri(string _url); event Mint(address indexed user, uint256 amount); function wlMint(uint256 quantity, uint256 limit, bytes memory signature) external NotContract { require(totalSupply() <= MAX_SUPPLY, "Lil Skulls: Supply reached"); require((wlMintedAmount[msg.sender] + quantity) <= limit, "Lil Skulls: Limit exceed"); require(isStarted, "Lil Skulls: Wl not started"); require(block.timestamp <= wlEndTime, "Lil Skulls: Wl time is out"); // check signature bytes32 hash = keccak256(abi.encode( keccak256("MiniRektSkulls(uint256 limit,address owner)"), limit, msg.sender )); require(_hashTypedDataV4(hash).recover(signature) == signer, "Lil Skulls: Invalid sign"); if ((totalSupply() + quantity) > MAX_SUPPLY) { quantity = MAX_SUPPLY - totalSupply(); } _mint(msg.sender, quantity); wlMintedAmount[msg.sender] += quantity; emit Mint(msg.sender, quantity); } function publicMint(uint256 quantity) external NotContract { require(totalSupply() <= MAX_SUPPLY, "Lil Skulls: Supply reached"); require((publicMintedAmount[msg.sender]) + quantity <= MAX_PUBLIC_MINT_AMOUNT, "Lil Skulls: Limit exceed"); require(isStarted && block.timestamp >= publicStartTime, "Lil Skulls: Public not started"); require(block.timestamp <= publicEndTime, "Lil Skulls: Public time is out"); if ((totalSupply() + quantity) > MAX_SUPPLY) { quantity = MAX_SUPPLY - totalSupply(); } _mint(msg.sender, quantity); publicMintedAmount[msg.sender] += quantity; emit Mint(msg.sender, quantity); } /********************************************* Contract Managing *********************************************/ function setUri(string memory _url) external onlyOwner { _uri = _url; emit SetUri(_url); } function start() external onlyOwner { require(!isStarted); wlStartTime = block.timestamp; wlEndTime = block.timestamp + wlMintDuration; publicStartTime = wlEndTime + 1; publicEndTime = publicStartTime + publicMintDuration; isStarted = true; emit StartSale(block.timestamp); } function setSigner(address _signer) external onlyOwner { signer = _signer; emit SetSigner(_signer); } /********************************************* Royalty *********************************************/ function setDefaultRoyalty(address receiver, uint96 feeNumerator) public onlyOwner { _setDefaultRoyalty(receiver, feeNumerator); emit SetRoyalty(receiver,feeNumerator); } /********************************************* Operator Filterer *********************************************/ function setApprovalForAll(address operator, bool approved) public override(ERC721AUpgradeable) onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public payable override(ERC721AUpgradeable) onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public payable override(ERC721AUpgradeable) onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public payable override(ERC721AUpgradeable) onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public payable override(ERC721AUpgradeable) onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721AUpgradeable, ERC2981Upgradeable) returns (bool) { // Supports the following `interfaceId`s: // - IERC165: 0x01ffc9a7 // - IERC721: 0x80ac58cd // - IERC721Metadata: 0x5b5e139f // - IERC2981: 0x2a55205a return ERC721AUpgradeable.supportsInterface(interfaceId) || ERC2981Upgradeable.supportsInterface(interfaceId); } function setOperatorFilteringEnabled(bool value) public onlyOwner { operatorFilteringEnabled = value; } function _operatorFilteringEnabled() internal view override returns (bool) { return operatorFilteringEnabled; } function _isPriorityOperator(address operator) internal pure override returns (bool) { // OpenSea Seaport Conduit: // https://etherscan.io/address/0x1E0049783F008A0085193E00003D00cd54003c71 // https://goerli.etherscan.io/address/0x1E0049783F008A0085193E00003D00cd54003c71 return operator == address(0x1E0049783F008A0085193E00003D00cd54003c71); } /********************************************* URI *********************************************/ function _baseURI() override internal view virtual returns (string memory) { return _uri; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"royalty","type":"uint256"}],"name":"SetRoyalty","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"signer","type":"address"}],"name":"SetSigner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_url","type":"string"}],"name":"SetUri","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"}],"name":"StartSale","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PUBLIC_MINT_AMOUNT","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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","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":"isStarted","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":"operatorFilteringEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"publicEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"publicMintDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"publicMintedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setOperatorFilteringEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_url","type":"string"}],"name":"setUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"start","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"wlMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlMintDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wlMintedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50612c64806100206000396000f3fe6080604052600436106102305760003560e01c80636c19e7831161012e578063b88d4fde116100ab578063e985e9c51161006f578063e985e9c514610632578063ead29d4e14610652578063f2fde38b14610680578063f4848a23146106a0578063fb796e6c146106b757600080fd5b8063b88d4fde146105bd578063be9a6555146105d0578063be9feb30146105e5578063c87b56dd146105fb578063e82c31e81461061b57600080fd5b806395d89b41116100f257806395d89b41146105335780639b642de114610548578063a22cb46514610568578063aefd1bc314610588578063b7c0b8e81461059d57600080fd5b80636c19e783146104ab57806370a08231146104cb578063715018a6146104eb5780638129fc1c146105005780638da5cb5b1461051557600080fd5b80632c27e581116101bc57806347a541481161018057806347a541481461040e578063544736e6146104255780635fd1bbc414610446578063625417141461045d5780636352211e1461048b57600080fd5b80632c27e5811461038e5780632db11544146103a557806332cb6b0c146103c557806342842e0e146103db578063454cd95e146103ee57600080fd5b8063095ea7b311610203578063095ea7b3146102e657806318160ddd146102f9578063238ac9331461031c57806323b872dd1461033c5780632a55205a1461034f57600080fd5b806301ffc9a71461023557806304634d8d1461026a57806306fdde031461028c578063081812fc146102ae575b600080fd5b34801561024157600080fd5b5061025561025036600461263c565b6106d8565b60405190151581526020015b60405180910390f35b34801561027657600080fd5b5061028a610285366004612670565b6106f8565b005b34801561029857600080fd5b506102a1610755565b604051610261919061270b565b3480156102ba57600080fd5b506102ce6102c936600461271e565b6107f0565b6040516001600160a01b039091168152602001610261565b61028a6102f4366004612737565b61083d565b34801561030557600080fd5b5061030e610875565b604051908152602001610261565b34801561032857600080fd5b5060fe546102ce906001600160a01b031681565b61028a61034a366004612761565b610894565b34801561035b57600080fd5b5061036f61036a36600461279d565b6108de565b604080516001600160a01b039093168352602083019190915201610261565b34801561039a57600080fd5b5061030e6101025481565b3480156103b157600080fd5b5061028a6103c036600461271e565b61098c565b3480156103d157600080fd5b5061030e611a0a81565b61028a6103e9366004612761565b610c01565b3480156103fa57600080fd5b5061028a61040936600461286b565b610c45565b34801561041a57600080fd5b5061030e6101005481565b34801561043157600080fd5b5060fe5461025590600160a81b900460ff1681565b34801561045257600080fd5b5061030e6101015481565b34801561046957600080fd5b5061030e6104783660046128bb565b6101056020526000908152604090205481565b34801561049757600080fd5b506102ce6104a636600461271e565b610f74565b3480156104b757600080fd5b5061028a6104c63660046128bb565b610f7f565b3480156104d757600080fd5b5061030e6104e63660046128bb565b610fd1565b3480156104f757600080fd5b5061028a61103a565b34801561050c57600080fd5b5061028a61104e565b34801561052157600080fd5b506033546001600160a01b03166102ce565b34801561053f57600080fd5b506102a161133d565b34801561055457600080fd5b5061028a6105633660046128d6565b611355565b34801561057457600080fd5b5061028a61058336600461292f565b6113ab565b34801561059457600080fd5b5061030e600a81565b3480156105a957600080fd5b5061028a6105b8366004612962565b6113de565b61028a6105cb36600461297d565b611404565b3480156105dc57600080fd5b5061028a611450565b3480156105f157600080fd5b5061030e60ff5481565b34801561060757600080fd5b506102a161061636600461271e565b6114f9565b34801561062757600080fd5b5061030e6101045481565b34801561063e57600080fd5b5061025561064d3660046129e5565b61157e565b34801561065e57600080fd5b5061030e61066d3660046128bb565b6101066020526000908152604090205481565b34801561068c57600080fd5b5061028a61069b3660046128bb565b6115bb565b3480156106ac57600080fd5b5061030e6101035481565b3480156106c357600080fd5b5060fe5461025590600160a01b900460ff1681565b60006106e382611631565b806106f257506106f28261167f565b92915050565b6107006116b4565b61070a828261170e565b6040516001600160601b03821681526001600160a01b038316907faf80eecb6d383b7ffd8fa84554dd154b74dfdf6410e2dc8a7f5afda7f2d7e0189060200160405180910390a25050565b606061075f61180b565b600201805461076d90612a0f565b80601f016020809104026020016040519081016040528092919081815260200182805461079990612a0f565b80156107e65780601f106107bb576101008083540402835291602001916107e6565b820191906000526020600020905b8154815290600101906020018083116107c957829003601f168201915b5050505050905090565b60006107fb8261182f565b610818576040516333d1c03960e21b815260040160405180910390fd5b61082061180b565b60009283526006016020525060409020546001600160a01b031690565b816108478161186b565b6108665760fe54600160a01b900460ff1615610866576108668161188d565b61087083836118d1565b505050565b60008061088061180b565b6001015461088c61180b565b540303919050565b826001600160a01b03811633146108cd576108ae3361186b565b6108cd5760fe54600160a01b900460ff16156108cd576108cd3361188d565b6108d88484846118e1565b50505050565b60008281526098602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916109535750604080518082019091526097546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610972906001600160601b031687612a60565b61097c9190612a7f565b91519350909150505b9250929050565b333b15801561099a57503233145b6109eb5760405162461bcd60e51b815260206004820152601e60248201527f4c696c20536b756c6c733a20436f6e747261637420466f7262696464656e000060448201526064015b60405180910390fd5b611a0a6109f6610875565b1115610a445760405162461bcd60e51b815260206004820152601a60248201527f4c696c20536b756c6c733a20537570706c79207265616368656400000000000060448201526064016109e2565b3360009081526101066020526040902054600a90610a63908390612aa1565b1115610aac5760405162461bcd60e51b8152602060048201526018602482015277131a5b0814dadd5b1b1cce88131a5b5a5d08195e18d9595960421b60448201526064016109e2565b60fe54600160a81b900460ff168015610ac85750610101544210155b610b145760405162461bcd60e51b815260206004820152601e60248201527f4c696c20536b756c6c733a205075626c6963206e6f742073746172746564000060448201526064016109e2565b61010254421115610b675760405162461bcd60e51b815260206004820152601e60248201527f4c696c20536b756c6c733a205075626c69632074696d65206973206f7574000060448201526064016109e2565b611a0a81610b73610875565b610b7d9190612aa1565b1115610b9a57610b8b610875565b610b9790611a0a612ab9565b90505b610ba43382611ad0565b336000908152610106602052604081208054839290610bc4908490612aa1565b909155505060405181815233907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859060200160405180910390a250565b826001600160a01b0381163314610c3a57610c1b3361186b565b610c3a5760fe54600160a01b900460ff1615610c3a57610c3a3361188d565b6108d8848484611c04565b333b158015610c5357503233145b610c9f5760405162461bcd60e51b815260206004820152601e60248201527f4c696c20536b756c6c733a20436f6e747261637420466f7262696464656e000060448201526064016109e2565b611a0a610caa610875565b1115610cf85760405162461bcd60e51b815260206004820152601a60248201527f4c696c20536b756c6c733a20537570706c79207265616368656400000000000060448201526064016109e2565b33600090815261010560205260409020548290610d16908590612aa1565b1115610d5f5760405162461bcd60e51b8152602060048201526018602482015277131a5b0814dadd5b1b1cce88131a5b5a5d08195e18d9595960421b60448201526064016109e2565b60fe54600160a81b900460ff16610db85760405162461bcd60e51b815260206004820152601a60248201527f4c696c20536b756c6c733a20576c206e6f74207374617274656400000000000060448201526064016109e2565b61010054421115610e0b5760405162461bcd60e51b815260206004820152601a60248201527f4c696c20536b756c6c733a20576c2074696d65206973206f757400000000000060448201526064016109e2565b604080517fd188542fcd77fb54149d533eb893011a8dd8b85582a109eb61c88d674572b695602082015290810183905233606082015260009060800160408051601f19818403018152919052805160209091012060fe549091506001600160a01b0316610e8183610e7b84611c1f565b90611c6d565b6001600160a01b031614610ed75760405162461bcd60e51b815260206004820152601860248201527f4c696c20536b756c6c733a20496e76616c6964207369676e000000000000000060448201526064016109e2565b611a0a84610ee3610875565b610eed9190612aa1565b1115610f0a57610efb610875565b610f0790611a0a612ab9565b93505b610f143385611ad0565b336000908152610105602052604081208054869290610f34908490612aa1565b909155505060405184815233907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859060200160405180910390a250505050565b60006106f282611c91565b610f876116b4565b60fe80546001600160a01b0319166001600160a01b0383169081179091556040517fbb10aee7ef5a307b8097c6a7f2892b909ff1736fd24a6a5260640c185f7153b690600090a250565b60006001600160a01b038216610ffa576040516323d3ad8160e21b815260040160405180910390fd5b67ffffffffffffffff61100b61180b565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b6110426116b4565b61104c6000611d34565b565b600080516020612c0f83398151915254610100900460ff1661108357600080516020612c0f8339815191525460ff1615611087565b303b155b6110f95760405162461bcd60e51b815260206004820152603760248201527f455243373231415f5f496e697469616c697a61626c653a20636f6e747261637460448201527f20697320616c726561647920696e697469616c697a656400000000000000000060648201526084016109e2565b600080516020612c0f83398151915254610100900460ff1615801561113557600080516020612c0f833981519152805461ffff19166101011790555b600054610100900460ff16158080156111555750600054600160ff909116105b8061116f5750303b15801561116f575060005460ff166001145b6111d25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016109e2565b6000805460ff1916600117905580156111f5576000805461ff0019166101001790555b6112436040518060400160405280600a8152602001694c696c20536b756c6c7360b01b8152506040518060400160405280600a8152602001694c494c20534b554c4c5360b01b815250611d86565b61124b611dc4565b611253611df3565b61129e6040518060400160405280600e81526020016d4d696e6952656b74536b756c6c7360901b815250604051806040016040528060038152602001620312e360ec1b815250611e1a565b6112a6611e4b565b60fe805460ff60a01b1916600160a01b179055611c206101035562015180610104556112d4336101a961170e565b801561131a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50801561133a57600080516020612c0f833981519152805461ff00191690555b50565b606061134761180b565b600301805461076d90612a0f565b61135d6116b4565b80516113709060fd90602084019061258d565b507fd70c1392a974224e639e7a9607dcb2c766826aecfe2dc356f442ce0488b01e1f816040516113a0919061270b565b60405180910390a150565b816113b58161186b565b6113d45760fe54600160a01b900460ff16156113d4576113d48161188d565b6108708383611e6a565b6113e66116b4565b60fe8054911515600160a01b0260ff60a01b19909216919091179055565b836001600160a01b038116331461143d5761141e3361186b565b61143d5760fe54600160a01b900460ff161561143d5761143d3361188d565b61144985858585611ee7565b5050505050565b6114586116b4565b60fe54600160a81b900460ff161561146f57600080fd5b4260ff8190556101035461148291612aa1565b610100819055611493906001612aa1565b610101819055610104546114a691612aa1565b6101025560fe805460ff60a81b1916600160a81b1790556040517f59ff1c5e8a691bbfdd4acd20ca4355bd3e0878914814bc6d035bd1584d34135d906114ef9042815260200190565b60405180910390a1565b60606115048261182f565b61152157604051630a14c4b560e41b815260040160405180910390fd5b600061152b611f2b565b905080516000141561154c5760405180602001604052806000815250611577565b8061155684611f3a565b604051602001611567929190612ad0565b6040516020818303038152906040525b9392505050565b600061158861180b565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b6115c36116b4565b6001600160a01b0381166116285760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109e2565b61133a81611d34565b60006301ffc9a760e01b6001600160e01b03198316148061166257506380ac58cd60e01b6001600160e01b03198316145b806106f25750506001600160e01b031916635b5e139f60e01b1490565b60006001600160e01b0319821663152a902d60e11b14806106f257506301ffc9a760e01b6001600160e01b03198316146106f2565b6033546001600160a01b0316331461104c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109e2565b6127106001600160601b038216111561177c5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016109e2565b6001600160a01b0382166117d25760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016109e2565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217609755565b7f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c4090565b600061183961180b565b54821080156106f25750600160e01b61185061180b565b60008481526004919091016020526040902054161592915050565b6001600160a01b0316731e0049783f008a0085193e00003d00cd54003c711490565b69c617113400112233445560005230601a5280603a52600080604460166daaeb6d7670e522a718067333cd4e5afa6118c9573d6000803e3d6000fd5b6000603a5250565b6118dd82826001611f88565b5050565b60006118ec82611c91565b9050836001600160a01b0316816001600160a01b03161461191f5760405162a1148160e81b815260040160405180910390fd5b60008061192b8461203d565b91509150611950818761193b3390565b6001600160a01b039081169116811491141790565b61197b5761195e863361157e565b61197b57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166119a257604051633a954ecd60e21b815260040160405180910390fd5b80156119ad57600082555b6119b561180b565b6001600160a01b03871660009081526005919091016020526040902080546000190190556119e161180b565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b17611a1861180b565b60008681526004919091016020526040902055600160e11b8316611a875760018401611a4261180b565b60008281526004919091016020526040902054611a8557611a6161180b565b548114611a855783611a7161180b565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6000611ada61180b565b54905081611afb5760405163b562e8dd60e01b815260040160405180910390fd5b680100000000000000018202611b0f61180b565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b1717611b4a61180b565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114611bd457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611b9c565b5081611bf257604051622e076360e81b815260040160405180910390fd5b80611bfb61180b565b55506108709050565b61087083838360405180602001604052806000815250611404565b60006106f2611c2c612065565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000611c7c85856120e5565b91509150611c8981612128565b509392505050565b6000611c9b61180b565b600083815260049190910160205260409020549050600160e01b8116611d1b5780611d1657611cc861180b565b548210611ce857604051636f96cda160e11b815260040160405180910390fd5b611cf061180b565b6000199092016000818152600493909301602052604090922054905080611d1657611ce8565b919050565b604051636f96cda160e11b815260040160405180910390fd5b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080516020612c0f83398151915254610100900460ff16611dba5760405162461bcd60e51b81526004016109e290612aff565b6118dd8282612276565b600054610100900460ff16611deb5760405162461bcd60e51b81526004016109e290612b53565b61104c6122f9565b600054610100900460ff1661104c5760405162461bcd60e51b81526004016109e290612b53565b600054610100900460ff16611e415760405162461bcd60e51b81526004016109e290612b53565b6118dd8282612329565b61104c733cc6cdda760b79bafa08df41ecfa224f810dceb6600161236a565b80611e7361180b565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611ef2848484610894565b6001600160a01b0383163b156108d857611f0e848484846123e0565b6108d8576040516368d2bf6b60e11b815260040160405180910390fd5b606060fd805461076d90612a0f565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480611f7157611f76565b611f54565b50819003601f19909101908152919050565b6000611f9383610f74565b90508115611fd257336001600160a01b03821614611fd257611fb5813361157e565b611fd2576040516367d9dca160e11b815260040160405180910390fd5b83611fdb61180b565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b600080600061204a61180b565b60009485526006016020525050604090912080549092909150565b60006120e07f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61209460c95490565b60ca546040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b905090565b60008082516041141561211c5760208301516040840151606085015160001a612110878285856124c9565b94509450505050610985565b50600090506002610985565b600081600481111561213c5761213c612b9e565b14156121455750565b600181600481111561215957612159612b9e565b14156121a75760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109e2565b60028160048111156121bb576121bb612b9e565b14156122095760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109e2565b600381600481111561221d5761221d612b9e565b141561133a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016109e2565b600080516020612c0f83398151915254610100900460ff166122aa5760405162461bcd60e51b81526004016109e290612aff565b816122b361180b565b60020190805190602001906122c992919061258d565b50806122d361180b565b60030190805190602001906122e992919061258d565b5060006122f461180b565b555050565b600054610100900460ff166123205760405162461bcd60e51b81526004016109e290612b53565b61104c33611d34565b600054610100900460ff166123505760405162461bcd60e51b81526004016109e290612b53565b81516020928301208151919092012060c99190915560ca55565b6001600160a01b0390911690637d3e3dbe8161239757826123905750634420e486612397565b5063a0af29035b8060e01b60005230600452826024526004600060446000806daaeb6d7670e522a718067333cd4e5af16123d6578060005160e01c14156123d657600080fd5b5060006024525050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612415903390899088908890600401612bb4565b6020604051808303816000875af1925050508015612450575060408051601f3d908101601f1916820190925261244d91810190612bf1565b60015b6124ab573d80801561247e576040519150601f19603f3d011682016040523d82523d6000602084013e612483565b606091505b5080516124a3576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156125005750600090506003612584565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612554573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661257d57600060019250925050612584565b9150600090505b94509492505050565b82805461259990612a0f565b90600052602060002090601f0160209004810192826125bb5760008555612601565b82601f106125d457805160ff1916838001178555612601565b82800160010185558215612601579182015b828111156126015782518255916020019190600101906125e6565b5061260d929150612611565b5090565b5b8082111561260d5760008155600101612612565b6001600160e01b03198116811461133a57600080fd5b60006020828403121561264e57600080fd5b813561157781612626565b80356001600160a01b0381168114611d1657600080fd5b6000806040838503121561268357600080fd5b61268c83612659565b915060208301356001600160601b03811681146126a857600080fd5b809150509250929050565b60005b838110156126ce5781810151838201526020016126b6565b838111156108d85750506000910152565b600081518084526126f78160208601602086016126b3565b601f01601f19169290920160200192915050565b60208152600061157760208301846126df565b60006020828403121561273057600080fd5b5035919050565b6000806040838503121561274a57600080fd5b61275383612659565b946020939093013593505050565b60008060006060848603121561277657600080fd5b61277f84612659565b925061278d60208501612659565b9150604084013590509250925092565b600080604083850312156127b057600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156127f0576127f06127bf565b604051601f8501601f19908116603f01168101908282118183101715612818576128186127bf565b8160405280935085815286868601111561283157600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261285c57600080fd5b611577838335602085016127d5565b60008060006060848603121561288057600080fd5b8335925060208401359150604084013567ffffffffffffffff8111156128a557600080fd5b6128b18682870161284b565b9150509250925092565b6000602082840312156128cd57600080fd5b61157782612659565b6000602082840312156128e857600080fd5b813567ffffffffffffffff8111156128ff57600080fd5b8201601f8101841361291057600080fd5b6124c1848235602084016127d5565b80358015158114611d1657600080fd5b6000806040838503121561294257600080fd5b61294b83612659565b91506129596020840161291f565b90509250929050565b60006020828403121561297457600080fd5b6115778261291f565b6000806000806080858703121561299357600080fd5b61299c85612659565b93506129aa60208601612659565b925060408501359150606085013567ffffffffffffffff8111156129cd57600080fd5b6129d98782880161284b565b91505092959194509250565b600080604083850312156129f857600080fd5b612a0183612659565b915061295960208401612659565b600181811c90821680612a2357607f821691505b60208210811415612a4457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612a7a57612a7a612a4a565b500290565b600082612a9c57634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115612ab457612ab4612a4a565b500190565b600082821015612acb57612acb612a4a565b500390565b60008351612ae28184602088016126b3565b835190830190612af68183602088016126b3565b01949350505050565b60208082526034908201527f455243373231415f5f496e697469616c697a61626c653a20636f6e7472616374604082015273206973206e6f7420696e697469616c697a696e6760601b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612be7908301846126df565b9695505050505050565b600060208284031215612c0357600080fd5b81516115778161262656feee151c8401928dc223602bb187aff91b9a56c7cae5476ef1b3287b085a16c85fa26469706673582212206e71174e2fded689ecefce5b014eac1f388bc915762b22292842265165127ac064736f6c634300080c0033
Deployed Bytecode
0x6080604052600436106102305760003560e01c80636c19e7831161012e578063b88d4fde116100ab578063e985e9c51161006f578063e985e9c514610632578063ead29d4e14610652578063f2fde38b14610680578063f4848a23146106a0578063fb796e6c146106b757600080fd5b8063b88d4fde146105bd578063be9a6555146105d0578063be9feb30146105e5578063c87b56dd146105fb578063e82c31e81461061b57600080fd5b806395d89b41116100f257806395d89b41146105335780639b642de114610548578063a22cb46514610568578063aefd1bc314610588578063b7c0b8e81461059d57600080fd5b80636c19e783146104ab57806370a08231146104cb578063715018a6146104eb5780638129fc1c146105005780638da5cb5b1461051557600080fd5b80632c27e581116101bc57806347a541481161018057806347a541481461040e578063544736e6146104255780635fd1bbc414610446578063625417141461045d5780636352211e1461048b57600080fd5b80632c27e5811461038e5780632db11544146103a557806332cb6b0c146103c557806342842e0e146103db578063454cd95e146103ee57600080fd5b8063095ea7b311610203578063095ea7b3146102e657806318160ddd146102f9578063238ac9331461031c57806323b872dd1461033c5780632a55205a1461034f57600080fd5b806301ffc9a71461023557806304634d8d1461026a57806306fdde031461028c578063081812fc146102ae575b600080fd5b34801561024157600080fd5b5061025561025036600461263c565b6106d8565b60405190151581526020015b60405180910390f35b34801561027657600080fd5b5061028a610285366004612670565b6106f8565b005b34801561029857600080fd5b506102a1610755565b604051610261919061270b565b3480156102ba57600080fd5b506102ce6102c936600461271e565b6107f0565b6040516001600160a01b039091168152602001610261565b61028a6102f4366004612737565b61083d565b34801561030557600080fd5b5061030e610875565b604051908152602001610261565b34801561032857600080fd5b5060fe546102ce906001600160a01b031681565b61028a61034a366004612761565b610894565b34801561035b57600080fd5b5061036f61036a36600461279d565b6108de565b604080516001600160a01b039093168352602083019190915201610261565b34801561039a57600080fd5b5061030e6101025481565b3480156103b157600080fd5b5061028a6103c036600461271e565b61098c565b3480156103d157600080fd5b5061030e611a0a81565b61028a6103e9366004612761565b610c01565b3480156103fa57600080fd5b5061028a61040936600461286b565b610c45565b34801561041a57600080fd5b5061030e6101005481565b34801561043157600080fd5b5060fe5461025590600160a81b900460ff1681565b34801561045257600080fd5b5061030e6101015481565b34801561046957600080fd5b5061030e6104783660046128bb565b6101056020526000908152604090205481565b34801561049757600080fd5b506102ce6104a636600461271e565b610f74565b3480156104b757600080fd5b5061028a6104c63660046128bb565b610f7f565b3480156104d757600080fd5b5061030e6104e63660046128bb565b610fd1565b3480156104f757600080fd5b5061028a61103a565b34801561050c57600080fd5b5061028a61104e565b34801561052157600080fd5b506033546001600160a01b03166102ce565b34801561053f57600080fd5b506102a161133d565b34801561055457600080fd5b5061028a6105633660046128d6565b611355565b34801561057457600080fd5b5061028a61058336600461292f565b6113ab565b34801561059457600080fd5b5061030e600a81565b3480156105a957600080fd5b5061028a6105b8366004612962565b6113de565b61028a6105cb36600461297d565b611404565b3480156105dc57600080fd5b5061028a611450565b3480156105f157600080fd5b5061030e60ff5481565b34801561060757600080fd5b506102a161061636600461271e565b6114f9565b34801561062757600080fd5b5061030e6101045481565b34801561063e57600080fd5b5061025561064d3660046129e5565b61157e565b34801561065e57600080fd5b5061030e61066d3660046128bb565b6101066020526000908152604090205481565b34801561068c57600080fd5b5061028a61069b3660046128bb565b6115bb565b3480156106ac57600080fd5b5061030e6101035481565b3480156106c357600080fd5b5060fe5461025590600160a01b900460ff1681565b60006106e382611631565b806106f257506106f28261167f565b92915050565b6107006116b4565b61070a828261170e565b6040516001600160601b03821681526001600160a01b038316907faf80eecb6d383b7ffd8fa84554dd154b74dfdf6410e2dc8a7f5afda7f2d7e0189060200160405180910390a25050565b606061075f61180b565b600201805461076d90612a0f565b80601f016020809104026020016040519081016040528092919081815260200182805461079990612a0f565b80156107e65780601f106107bb576101008083540402835291602001916107e6565b820191906000526020600020905b8154815290600101906020018083116107c957829003601f168201915b5050505050905090565b60006107fb8261182f565b610818576040516333d1c03960e21b815260040160405180910390fd5b61082061180b565b60009283526006016020525060409020546001600160a01b031690565b816108478161186b565b6108665760fe54600160a01b900460ff1615610866576108668161188d565b61087083836118d1565b505050565b60008061088061180b565b6001015461088c61180b565b540303919050565b826001600160a01b03811633146108cd576108ae3361186b565b6108cd5760fe54600160a01b900460ff16156108cd576108cd3361188d565b6108d88484846118e1565b50505050565b60008281526098602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916109535750604080518082019091526097546001600160a01b0381168252600160a01b90046001600160601b031660208201525b602081015160009061271090610972906001600160601b031687612a60565b61097c9190612a7f565b91519350909150505b9250929050565b333b15801561099a57503233145b6109eb5760405162461bcd60e51b815260206004820152601e60248201527f4c696c20536b756c6c733a20436f6e747261637420466f7262696464656e000060448201526064015b60405180910390fd5b611a0a6109f6610875565b1115610a445760405162461bcd60e51b815260206004820152601a60248201527f4c696c20536b756c6c733a20537570706c79207265616368656400000000000060448201526064016109e2565b3360009081526101066020526040902054600a90610a63908390612aa1565b1115610aac5760405162461bcd60e51b8152602060048201526018602482015277131a5b0814dadd5b1b1cce88131a5b5a5d08195e18d9595960421b60448201526064016109e2565b60fe54600160a81b900460ff168015610ac85750610101544210155b610b145760405162461bcd60e51b815260206004820152601e60248201527f4c696c20536b756c6c733a205075626c6963206e6f742073746172746564000060448201526064016109e2565b61010254421115610b675760405162461bcd60e51b815260206004820152601e60248201527f4c696c20536b756c6c733a205075626c69632074696d65206973206f7574000060448201526064016109e2565b611a0a81610b73610875565b610b7d9190612aa1565b1115610b9a57610b8b610875565b610b9790611a0a612ab9565b90505b610ba43382611ad0565b336000908152610106602052604081208054839290610bc4908490612aa1565b909155505060405181815233907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859060200160405180910390a250565b826001600160a01b0381163314610c3a57610c1b3361186b565b610c3a5760fe54600160a01b900460ff1615610c3a57610c3a3361188d565b6108d8848484611c04565b333b158015610c5357503233145b610c9f5760405162461bcd60e51b815260206004820152601e60248201527f4c696c20536b756c6c733a20436f6e747261637420466f7262696464656e000060448201526064016109e2565b611a0a610caa610875565b1115610cf85760405162461bcd60e51b815260206004820152601a60248201527f4c696c20536b756c6c733a20537570706c79207265616368656400000000000060448201526064016109e2565b33600090815261010560205260409020548290610d16908590612aa1565b1115610d5f5760405162461bcd60e51b8152602060048201526018602482015277131a5b0814dadd5b1b1cce88131a5b5a5d08195e18d9595960421b60448201526064016109e2565b60fe54600160a81b900460ff16610db85760405162461bcd60e51b815260206004820152601a60248201527f4c696c20536b756c6c733a20576c206e6f74207374617274656400000000000060448201526064016109e2565b61010054421115610e0b5760405162461bcd60e51b815260206004820152601a60248201527f4c696c20536b756c6c733a20576c2074696d65206973206f757400000000000060448201526064016109e2565b604080517fd188542fcd77fb54149d533eb893011a8dd8b85582a109eb61c88d674572b695602082015290810183905233606082015260009060800160408051601f19818403018152919052805160209091012060fe549091506001600160a01b0316610e8183610e7b84611c1f565b90611c6d565b6001600160a01b031614610ed75760405162461bcd60e51b815260206004820152601860248201527f4c696c20536b756c6c733a20496e76616c6964207369676e000000000000000060448201526064016109e2565b611a0a84610ee3610875565b610eed9190612aa1565b1115610f0a57610efb610875565b610f0790611a0a612ab9565b93505b610f143385611ad0565b336000908152610105602052604081208054869290610f34908490612aa1565b909155505060405184815233907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968859060200160405180910390a250505050565b60006106f282611c91565b610f876116b4565b60fe80546001600160a01b0319166001600160a01b0383169081179091556040517fbb10aee7ef5a307b8097c6a7f2892b909ff1736fd24a6a5260640c185f7153b690600090a250565b60006001600160a01b038216610ffa576040516323d3ad8160e21b815260040160405180910390fd5b67ffffffffffffffff61100b61180b565b6005016000846001600160a01b03166001600160a01b0316815260200190815260200160002054169050919050565b6110426116b4565b61104c6000611d34565b565b600080516020612c0f83398151915254610100900460ff1661108357600080516020612c0f8339815191525460ff1615611087565b303b155b6110f95760405162461bcd60e51b815260206004820152603760248201527f455243373231415f5f496e697469616c697a61626c653a20636f6e747261637460448201527f20697320616c726561647920696e697469616c697a656400000000000000000060648201526084016109e2565b600080516020612c0f83398151915254610100900460ff1615801561113557600080516020612c0f833981519152805461ffff19166101011790555b600054610100900460ff16158080156111555750600054600160ff909116105b8061116f5750303b15801561116f575060005460ff166001145b6111d25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016109e2565b6000805460ff1916600117905580156111f5576000805461ff0019166101001790555b6112436040518060400160405280600a8152602001694c696c20536b756c6c7360b01b8152506040518060400160405280600a8152602001694c494c20534b554c4c5360b01b815250611d86565b61124b611dc4565b611253611df3565b61129e6040518060400160405280600e81526020016d4d696e6952656b74536b756c6c7360901b815250604051806040016040528060038152602001620312e360ec1b815250611e1a565b6112a6611e4b565b60fe805460ff60a01b1916600160a01b179055611c206101035562015180610104556112d4336101a961170e565b801561131a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50801561133a57600080516020612c0f833981519152805461ff00191690555b50565b606061134761180b565b600301805461076d90612a0f565b61135d6116b4565b80516113709060fd90602084019061258d565b507fd70c1392a974224e639e7a9607dcb2c766826aecfe2dc356f442ce0488b01e1f816040516113a0919061270b565b60405180910390a150565b816113b58161186b565b6113d45760fe54600160a01b900460ff16156113d4576113d48161188d565b6108708383611e6a565b6113e66116b4565b60fe8054911515600160a01b0260ff60a01b19909216919091179055565b836001600160a01b038116331461143d5761141e3361186b565b61143d5760fe54600160a01b900460ff161561143d5761143d3361188d565b61144985858585611ee7565b5050505050565b6114586116b4565b60fe54600160a81b900460ff161561146f57600080fd5b4260ff8190556101035461148291612aa1565b610100819055611493906001612aa1565b610101819055610104546114a691612aa1565b6101025560fe805460ff60a81b1916600160a81b1790556040517f59ff1c5e8a691bbfdd4acd20ca4355bd3e0878914814bc6d035bd1584d34135d906114ef9042815260200190565b60405180910390a1565b60606115048261182f565b61152157604051630a14c4b560e41b815260040160405180910390fd5b600061152b611f2b565b905080516000141561154c5760405180602001604052806000815250611577565b8061155684611f3a565b604051602001611567929190612ad0565b6040516020818303038152906040525b9392505050565b600061158861180b565b6001600160a01b039384166000908152600791909101602090815260408083209490951682529290925250205460ff1690565b6115c36116b4565b6001600160a01b0381166116285760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109e2565b61133a81611d34565b60006301ffc9a760e01b6001600160e01b03198316148061166257506380ac58cd60e01b6001600160e01b03198316145b806106f25750506001600160e01b031916635b5e139f60e01b1490565b60006001600160e01b0319821663152a902d60e11b14806106f257506301ffc9a760e01b6001600160e01b03198316146106f2565b6033546001600160a01b0316331461104c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109e2565b6127106001600160601b038216111561177c5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016109e2565b6001600160a01b0382166117d25760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016109e2565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217609755565b7f2569078dfb4b0305704d3008e7403993ae9601b85f7ae5e742de3de8f8011c4090565b600061183961180b565b54821080156106f25750600160e01b61185061180b565b60008481526004919091016020526040902054161592915050565b6001600160a01b0316731e0049783f008a0085193e00003d00cd54003c711490565b69c617113400112233445560005230601a5280603a52600080604460166daaeb6d7670e522a718067333cd4e5afa6118c9573d6000803e3d6000fd5b6000603a5250565b6118dd82826001611f88565b5050565b60006118ec82611c91565b9050836001600160a01b0316816001600160a01b03161461191f5760405162a1148160e81b815260040160405180910390fd5b60008061192b8461203d565b91509150611950818761193b3390565b6001600160a01b039081169116811491141790565b61197b5761195e863361157e565b61197b57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166119a257604051633a954ecd60e21b815260040160405180910390fd5b80156119ad57600082555b6119b561180b565b6001600160a01b03871660009081526005919091016020526040902080546000190190556119e161180b565b6001600160a01b03861660008181526005929092016020526040909120805460010190554260a01b17600160e11b17611a1861180b565b60008681526004919091016020526040902055600160e11b8316611a875760018401611a4261180b565b60008281526004919091016020526040902054611a8557611a6161180b565b548114611a855783611a7161180b565b600083815260049190910160205260409020555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6000611ada61180b565b54905081611afb5760405163b562e8dd60e01b815260040160405180910390fd5b680100000000000000018202611b0f61180b565b6001600160a01b038516600081815260059290920160205260409091208054929092019091554260a01b6001841460e11b1717611b4a61180b565b600083815260049190910160205260408120919091556001600160a01b0384169083830190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114611bd457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611b9c565b5081611bf257604051622e076360e81b815260040160405180910390fd5b80611bfb61180b565b55506108709050565b61087083838360405180602001604052806000815250611404565b60006106f2611c2c612065565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000611c7c85856120e5565b91509150611c8981612128565b509392505050565b6000611c9b61180b565b600083815260049190910160205260409020549050600160e01b8116611d1b5780611d1657611cc861180b565b548210611ce857604051636f96cda160e11b815260040160405180910390fd5b611cf061180b565b6000199092016000818152600493909301602052604090922054905080611d1657611ce8565b919050565b604051636f96cda160e11b815260040160405180910390fd5b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080516020612c0f83398151915254610100900460ff16611dba5760405162461bcd60e51b81526004016109e290612aff565b6118dd8282612276565b600054610100900460ff16611deb5760405162461bcd60e51b81526004016109e290612b53565b61104c6122f9565b600054610100900460ff1661104c5760405162461bcd60e51b81526004016109e290612b53565b600054610100900460ff16611e415760405162461bcd60e51b81526004016109e290612b53565b6118dd8282612329565b61104c733cc6cdda760b79bafa08df41ecfa224f810dceb6600161236a565b80611e7361180b565b336000818152600792909201602090815260408084206001600160a01b03881680865290835293819020805460ff19169515159590951790945592518415158152919290917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611ef2848484610894565b6001600160a01b0383163b156108d857611f0e848484846123e0565b6108d8576040516368d2bf6b60e11b815260040160405180910390fd5b606060fd805461076d90612a0f565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a900480611f7157611f76565b611f54565b50819003601f19909101908152919050565b6000611f9383610f74565b90508115611fd257336001600160a01b03821614611fd257611fb5813361157e565b611fd2576040516367d9dca160e11b815260040160405180910390fd5b83611fdb61180b565b6000858152600691909101602052604080822080546001600160a01b0319166001600160a01b0394851617905551859287811692908516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a450505050565b600080600061204a61180b565b60009485526006016020525050604090912080549092909150565b60006120e07f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61209460c95490565b60ca546040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b905090565b60008082516041141561211c5760208301516040840151606085015160001a612110878285856124c9565b94509450505050610985565b50600090506002610985565b600081600481111561213c5761213c612b9e565b14156121455750565b600181600481111561215957612159612b9e565b14156121a75760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109e2565b60028160048111156121bb576121bb612b9e565b14156122095760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109e2565b600381600481111561221d5761221d612b9e565b141561133a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016109e2565b600080516020612c0f83398151915254610100900460ff166122aa5760405162461bcd60e51b81526004016109e290612aff565b816122b361180b565b60020190805190602001906122c992919061258d565b50806122d361180b565b60030190805190602001906122e992919061258d565b5060006122f461180b565b555050565b600054610100900460ff166123205760405162461bcd60e51b81526004016109e290612b53565b61104c33611d34565b600054610100900460ff166123505760405162461bcd60e51b81526004016109e290612b53565b81516020928301208151919092012060c99190915560ca55565b6001600160a01b0390911690637d3e3dbe8161239757826123905750634420e486612397565b5063a0af29035b8060e01b60005230600452826024526004600060446000806daaeb6d7670e522a718067333cd4e5af16123d6578060005160e01c14156123d657600080fd5b5060006024525050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290612415903390899088908890600401612bb4565b6020604051808303816000875af1925050508015612450575060408051601f3d908101601f1916820190925261244d91810190612bf1565b60015b6124ab573d80801561247e576040519150601f19603f3d011682016040523d82523d6000602084013e612483565b606091505b5080516124a3576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156125005750600090506003612584565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612554573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661257d57600060019250925050612584565b9150600090505b94509492505050565b82805461259990612a0f565b90600052602060002090601f0160209004810192826125bb5760008555612601565b82601f106125d457805160ff1916838001178555612601565b82800160010185558215612601579182015b828111156126015782518255916020019190600101906125e6565b5061260d929150612611565b5090565b5b8082111561260d5760008155600101612612565b6001600160e01b03198116811461133a57600080fd5b60006020828403121561264e57600080fd5b813561157781612626565b80356001600160a01b0381168114611d1657600080fd5b6000806040838503121561268357600080fd5b61268c83612659565b915060208301356001600160601b03811681146126a857600080fd5b809150509250929050565b60005b838110156126ce5781810151838201526020016126b6565b838111156108d85750506000910152565b600081518084526126f78160208601602086016126b3565b601f01601f19169290920160200192915050565b60208152600061157760208301846126df565b60006020828403121561273057600080fd5b5035919050565b6000806040838503121561274a57600080fd5b61275383612659565b946020939093013593505050565b60008060006060848603121561277657600080fd5b61277f84612659565b925061278d60208501612659565b9150604084013590509250925092565b600080604083850312156127b057600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156127f0576127f06127bf565b604051601f8501601f19908116603f01168101908282118183101715612818576128186127bf565b8160405280935085815286868601111561283157600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261285c57600080fd5b611577838335602085016127d5565b60008060006060848603121561288057600080fd5b8335925060208401359150604084013567ffffffffffffffff8111156128a557600080fd5b6128b18682870161284b565b9150509250925092565b6000602082840312156128cd57600080fd5b61157782612659565b6000602082840312156128e857600080fd5b813567ffffffffffffffff8111156128ff57600080fd5b8201601f8101841361291057600080fd5b6124c1848235602084016127d5565b80358015158114611d1657600080fd5b6000806040838503121561294257600080fd5b61294b83612659565b91506129596020840161291f565b90509250929050565b60006020828403121561297457600080fd5b6115778261291f565b6000806000806080858703121561299357600080fd5b61299c85612659565b93506129aa60208601612659565b925060408501359150606085013567ffffffffffffffff8111156129cd57600080fd5b6129d98782880161284b565b91505092959194509250565b600080604083850312156129f857600080fd5b612a0183612659565b915061295960208401612659565b600181811c90821680612a2357607f821691505b60208210811415612a4457634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615612a7a57612a7a612a4a565b500290565b600082612a9c57634e487b7160e01b600052601260045260246000fd5b500490565b60008219821115612ab457612ab4612a4a565b500190565b600082821015612acb57612acb612a4a565b500390565b60008351612ae28184602088016126b3565b835190830190612af68183602088016126b3565b01949350505050565b60208082526034908201527f455243373231415f5f496e697469616c697a61626c653a20636f6e7472616374604082015273206973206e6f7420696e697469616c697a696e6760601b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b634e487b7160e01b600052602160045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612be7908301846126df565b9695505050505050565b600060208284031215612c0357600080fd5b81516115778161262656feee151c8401928dc223602bb187aff91b9a56c7cae5476ef1b3287b085a16c85fa26469706673582212206e71174e2fded689ecefce5b014eac1f388bc915762b22292842265165127ac064736f6c634300080c0033
Deployed Bytecode Sourcemap
122374:7099:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;128108:494;;;;;;;;;;-1:-1:-1;128108:494:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;128108:494:0;;;;;;;;126631:193;;;;;;;;;;-1:-1:-1;126631:193:0;;;;;:::i;:::-;;:::i;:::-;;87986:124;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;94578:242::-;;;;;;;;;;-1:-1:-1;94578:242:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2241:32:1;;;2223:51;;2211:2;2196:18;94578:242:0;2077:203:1;127177:210:0;;;;;;:::i;:::-;;:::i;83471:371::-;;;;;;;;;;;;;:::i;:::-;;;2690:25:1;;;2678:2;2663:18;83471:371:0;2544:177:1;122578:21:0;;;;;;;;;;-1:-1:-1;122578:21:0;;;;-1:-1:-1;;;;;122578:21:0;;;127395:216;;;;;;:::i;:::-;;:::i;25431:442::-;;;;;;;;;;-1:-1:-1;25431:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3504:32:1;;;3486:51;;3568:2;3553:18;;3546:34;;;;3459:18;25431:442:0;3312:274:1;122784:28:0;;;;;;;;;;;;;;;;125078:706;;;;;;;;;;-1:-1:-1;125078:706:0;;;;;:::i;:::-;;:::i;123075:41::-;;;;;;;;;;;;123112:4;123075:41;;127619:224;;;;;;:::i;:::-;;:::i;124083:987::-;;;;;;;;;;-1:-1:-1;124083:987:0;;;;;:::i;:::-;;:::i;122714:24::-;;;;;;;;;;;;;;;;122651:21;;;;;;;;;;-1:-1:-1;122651:21:0;;;;-1:-1:-1;;;122651:21:0;;;;;;122747:30;;;;;;;;;;;;;;;;122899:49;;;;;;;;;;-1:-1:-1;122899:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;89427:152;;;;;;;;;;-1:-1:-1;89427:152:0;;;;;:::i;:::-;;:::i;126391:124::-;;;;;;;;;;-1:-1:-1;126391:124:0;;;;;:::i;:::-;;:::i;84751:257::-;;;;;;;;;;-1:-1:-1;84751:257:0;;;;;:::i;:::-;;:::i;18929:103::-;;;;;;;;;;;;;:::i;123125:545::-;;;;;;;;;;;;;:::i;18281:87::-;;;;;;;;;;-1:-1:-1;18354:6:0;;-1:-1:-1;;;;;18354:6:0;18281:87;;88186:128;;;;;;;;;;;;;:::i;125911:113::-;;;;;;;;;;-1:-1:-1;125911:113:0;;;;;:::i;:::-;;:::i;126953:216::-;;;;;;;;;;-1:-1:-1;126953:216:0;;;;;:::i;:::-;;:::i;123017:51::-;;;;;;;;;;;;123066:2;123017:51;;128610:117;;;;;;;;;;-1:-1:-1;128610:117:0;;;;;:::i;:::-;;:::i;127851:249::-;;;;;;:::i;:::-;;:::i;126034:349::-;;;;;;;;;;;;;:::i;122681:26::-;;;;;;;;;;;;;;;;88420:318;;;;;;;;;;-1:-1:-1;88420:318:0;;;;;:::i;:::-;;:::i;122857:33::-;;;;;;;;;;;;;;;;95575:188;;;;;;;;;;-1:-1:-1;95575:188:0;;;;;:::i;:::-;;:::i;122955:53::-;;;;;;;;;;-1:-1:-1;122955:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;19187:201;;;;;;;;;;-1:-1:-1;19187:201:0;;;;;:::i;:::-;;:::i;122821:29::-;;;;;;;;;;;;;;;;122608:36;;;;;;;;;;-1:-1:-1;122608:36:0;;;;-1:-1:-1;;;122608:36:0;;;;;;128108:494;128258:4;128483:49;128520:11;128483:36;:49::i;:::-;:111;;;;128545:49;128582:11;128545:36;:49::i;:::-;128476:118;128108:494;-1:-1:-1;;128108:494:0:o;126631:193::-;18167:13;:11;:13::i;:::-;126725:42:::1;126744:8;126754:12;126725:18;:42::i;:::-;126783:33;::::0;-1:-1:-1;;;;;7270:39:1;;7252:58;;-1:-1:-1;;;;;126783:33:0;::::1;::::0;::::1;::::0;7240:2:1;7225:18;126783:33:0::1;;;;;;;126631:193:::0;;:::o;87986:124::-;88040:13;88073:23;:21;:23::i;:::-;:29;;88066:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87986:124;:::o;94578:242::-;94654:7;94679:16;94687:7;94679;:16::i;:::-;94674:64;;94704:34;;-1:-1:-1;;;94704:34:0;;;;;;;;;;;94674:64;94758:23;:21;:23::i;:::-;:48;;;;:39;;:48;;-1:-1:-1;94758:48:0;;;:54;-1:-1:-1;;;;;94758:54:0;;94578:242::o;127177:210::-;127321:8;61058:29;61078:8;61058:19;:29::i;:::-;61053:122;;128828:24;;-1:-1:-1;;;128828:24:0;;;;61104:59;;;61137:26;61154:8;61137:16;:26::i;:::-;127347:32:::1;127361:8;127371:7;127347:13;:32::i;:::-;127177:210:::0;;;:::o;83471:371::-;83532:7;;83769:23;:21;:23::i;:::-;:36;;;83729:23;:21;:23::i;:::-;:37;:76;:94;;83471:371;-1:-1:-1;83471:371:0:o;127395:216::-;127544:4;-1:-1:-1;;;;;60693:18:0;;60701:10;60693:18;60689:184;;60733:31;60753:10;60733:19;:31::i;:::-;60728:134;;128828:24;;-1:-1:-1;;;128828:24:0;;;;60785:61;;;60818:28;60835:10;60818:16;:28::i;:::-;127566:37:::1;127585:4;127591:2;127595:7;127566:18;:37::i;:::-;127395:216:::0;;;;:::o;25431:442::-;25528:7;25586:27;;;:17;:27;;;;;;;;25557:56;;;;;;;;;-1:-1:-1;;;;;25557:56:0;;;;;-1:-1:-1;;;25557:56:0;;;-1:-1:-1;;;;;25557:56:0;;;;;;;;25528:7;;25626:92;;-1:-1:-1;25677:29:0;;;;;;;;;25687:19;25677:29;-1:-1:-1;;;;;25677:29:0;;;;-1:-1:-1;;;25677:29:0;;-1:-1:-1;;;;;25677:29:0;;;;;25626:92;25768:23;;;;25730:21;;26239:5;;25755:36;;-1:-1:-1;;;;;25755:36:0;:10;:36;:::i;:::-;25754:58;;;;:::i;:::-;25833:16;;;-1:-1:-1;25730:82:0;;-1:-1:-1;;25431:442:0;;;;;;:::o;125078:706::-;123722:10;:22;:27;:54;;;;-1:-1:-1;123753:9:0;123766:10;123753:23;123722:54;123714:97;;;;-1:-1:-1;;;123714:97:0;;8435:2:1;123714:97:0;;;8417:21:1;8474:2;8454:18;;;8447:30;8513:32;8493:18;;;8486:60;8563:18;;123714:97:0;;;;;;;;;123112:4:::1;125156:13;:11;:13::i;:::-;:27;;125148:66;;;::::0;-1:-1:-1;;;125148:66:0;;8794:2:1;125148:66:0::1;::::0;::::1;8776:21:1::0;8833:2;8813:18;;;8806:30;8872:28;8852:18;;;8845:56;8918:18;;125148:66:0::1;8592:350:1::0;125148:66:0::1;125253:10;125234:30;::::0;;;:18:::1;:30;::::0;;;;;123066:2:::1;::::0;125233:43:::1;::::0;125268:8;;125233:43:::1;:::i;:::-;:69;;125225:106;;;::::0;-1:-1:-1;;;125225:106:0;;9282:2:1;125225:106:0::1;::::0;::::1;9264:21:1::0;9321:2;9301:18;;;9294:30;-1:-1:-1;;;9340:18:1;;;9333:54;9404:18;;125225:106:0::1;9080:348:1::0;125225:106:0::1;125350:9;::::0;-1:-1:-1;;;125350:9:0;::::1;;;:47:::0;::::1;;;;125382:15;;125363;:34;;125350:47;125342:90;;;::::0;-1:-1:-1;;;125342:90:0;;9635:2:1;125342:90:0::1;::::0;::::1;9617:21:1::0;9674:2;9654:18;;;9647:30;9713:32;9693:18;;;9686:60;9763:18;;125342:90:0::1;9433:354:1::0;125342:90:0::1;125470:13;;125451:15;:32;;125443:75;;;::::0;-1:-1:-1;;;125443:75:0;;9994:2:1;125443:75:0::1;::::0;::::1;9976:21:1::0;10033:2;10013:18;;;10006:30;10072:32;10052:18;;;10045:60;10122:18;;125443:75:0::1;9792:354:1::0;125443:75:0::1;123112:4;125552:8;125536:13;:11;:13::i;:::-;:24;;;;:::i;:::-;125535:39;125531:109;;;125615:13;:11;:13::i;:::-;125602:26;::::0;123112:4:::1;125602:26;:::i;:::-;125591:37;;125531:109;125652:27;125658:10;125670:8;125652:5;:27::i;:::-;125709:10;125690:30;::::0;;;:18:::1;:30;::::0;;;;:42;;125724:8;;125690:30;:42:::1;::::0;125724:8;;125690:42:::1;:::i;:::-;::::0;;;-1:-1:-1;;125750:26:0::1;::::0;2690:25:1;;;125755:10:0::1;::::0;125750:26:::1;::::0;2678:2:1;2663:18;125750:26:0::1;;;;;;;125078:706:::0;:::o;127619:224::-;127772:4;-1:-1:-1;;;;;60693:18:0;;60701:10;60693:18;60689:184;;60733:31;60753:10;60733:19;:31::i;:::-;60728:134;;128828:24;;-1:-1:-1;;;128828:24:0;;;;60785:61;;;60818:28;60835:10;60818:16;:28::i;:::-;127794:41:::1;127817:4;127823:2;127827:7;127794:22;:41::i;124083:987::-:0;123722:10;:22;:27;:54;;;;-1:-1:-1;123753:9:0;123766:10;123753:23;123722:54;123714:97;;;;-1:-1:-1;;;123714:97:0;;8435:2:1;123714:97:0;;;8417:21:1;8474:2;8454:18;;;8447:30;8513:32;8493:18;;;8486:60;8563:18;;123714:97:0;8233:354:1;123714:97:0;123112:4:::1;124196:13;:11;:13::i;:::-;:27;;124188:66;;;::::0;-1:-1:-1;;;124188:66:0;;8794:2:1;124188:66:0::1;::::0;::::1;8776:21:1::0;8833:2;8813:18;;;8806:30;8872:28;8852:18;;;8845:56;8918:18;;124188:66:0::1;8592:350:1::0;124188:66:0::1;124289:10;124274:26;::::0;;;:14:::1;:26;::::0;;;;;124316:5;;124274:37:::1;::::0;124303:8;;124274:37:::1;:::i;:::-;124273:48;;124265:85;;;::::0;-1:-1:-1;;;124265:85:0;;9282:2:1;124265:85:0::1;::::0;::::1;9264:21:1::0;9321:2;9301:18;;;9294:30;-1:-1:-1;;;9340:18:1;;;9333:54;9404:18;;124265:85:0::1;9080:348:1::0;124265:85:0::1;124369:9;::::0;-1:-1:-1;;;124369:9:0;::::1;;;124361:48;;;::::0;-1:-1:-1;;;124361:48:0;;10483:2:1;124361:48:0::1;::::0;::::1;10465:21:1::0;10522:2;10502:18;;;10495:30;10561:28;10541:18;;;10534:56;10607:18;;124361:48:0::1;10281:350:1::0;124361:48:0::1;124447:9;;124428:15;:28;;124420:67;;;::::0;-1:-1:-1;;;124420:67:0;;10838:2:1;124420:67:0::1;::::0;::::1;10820:21:1::0;10877:2;10857:18;;;10850:30;10916:28;10896:18;;;10889:56;10962:18;;124420:67:0::1;10636:350:1::0;124420:67:0::1;124553:153;::::0;;124582:56:::1;124553:153;::::0;::::1;11193:25:1::0;11234:18;;;11227:34;;;124681:10:0::1;11277:18:1::0;;;11270:60;124528:12:0::1;::::0;11166:18:1;;124553:153:0::1;::::0;;-1:-1:-1;;124553:153:0;;::::1;::::0;;;;;;124543:164;;124553:153:::1;124543:164:::0;;::::1;::::0;124773:6:::1;::::0;124543:164;;-1:-1:-1;;;;;;124773:6:0::1;124728:41;124759:9:::0;124728:22:::1;124543:164:::0;124728:16:::1;:22::i;:::-;:30:::0;::::1;:41::i;:::-;-1:-1:-1::0;;;;;124728:51:0::1;;124720:88;;;::::0;-1:-1:-1;;;124720:88:0;;11543:2:1;124720:88:0::1;::::0;::::1;11525:21:1::0;11582:2;11562:18;;;11555:30;11621:26;11601:18;;;11594:54;11665:18;;124720:88:0::1;11341:348:1::0;124720:88:0::1;123112:4;124842:8;124826:13;:11;:13::i;:::-;:24;;;;:::i;:::-;124825:39;124821:109;;;124905:13;:11;:13::i;:::-;124892:26;::::0;123112:4:::1;124892:26;:::i;:::-;124881:37;;124821:109;124942:27;124948:10;124960:8;124942:5;:27::i;:::-;124995:10;124980:26;::::0;;;:14:::1;:26;::::0;;;;:38;;125010:8;;124980:26;:38:::1;::::0;125010:8;;124980:38:::1;:::i;:::-;::::0;;;-1:-1:-1;;125036:26:0::1;::::0;2690:25:1;;;125041:10:0::1;::::0;125036:26:::1;::::0;2678:2:1;2663:18;125036:26:0::1;;;;;;;124177:893;124083:987:::0;;;:::o;89427:152::-;89499:7;89542:27;89561:7;89542:18;:27::i;126391:124::-;18167:13;:11;:13::i;:::-;126457:6:::1;:16:::0;;-1:-1:-1;;;;;;126457:16:0::1;-1:-1:-1::0;;;;;126457:16:0;::::1;::::0;;::::1;::::0;;;126489:18:::1;::::0;::::1;::::0;-1:-1:-1;;126489:18:0::1;126391:124:::0;:::o;84751:257::-;84823:7;-1:-1:-1;;;;;84847:19:0;;84843:60;;84875:28;;-1:-1:-1;;;84875:28:0;;;;;;;;;;;84843:60;79899:13;84921:23;:21;:23::i;:::-;:42;;:49;84964:5;-1:-1:-1;;;;;84921:49:0;-1:-1:-1;;;;;84921:49:0;;;;;;;;;;;;;:79;84914:86;;84751:257;;;:::o;18929:103::-;18167:13;:11;:13::i;:::-;18994:30:::1;19021:1;18994:18;:30::i;:::-;18929:103::o:0;123125:545::-;-1:-1:-1;;;;;;;;;;;65659:52:0;;;;;;:160;;-1:-1:-1;;;;;;;;;;;65768:51:0;;;65767:52;65659:160;;;67270:4;67337:17;67382:7;65731:16;65637:265;;;;-1:-1:-1;;;65637:265:0;;11896:2:1;65637:265:0;;;11878:21:1;11935:2;11915:18;;;11908:30;11974:34;11954:18;;;11947:62;12045:25;12025:18;;;12018:53;12088:19;;65637:265:0;11694:419:1;65637:265:0;-1:-1:-1;;;;;;;;;;;65938:52:0;;;;;;65937:53;66001:179;;;;-1:-1:-1;;;;;;;;;;;66036:59:0;;-1:-1:-1;;66110:58:0;;;;;66001:179;11982:19:::1;12005:13:::0;::::1;::::0;::::1;;;12004:14;::::0;12052:34;::::1;;;-1:-1:-1::0;12070:12:0::1;::::0;12085:1:::1;12070:12;::::0;;::::1;:16;12052:34;12051:108;;;-1:-1:-1::0;12131:4:0::1;1635:19:::0;:23;;;12092:66:::1;;-1:-1:-1::0;12141:12:0::1;::::0;::::1;;::::0;:17:::1;12092:66;12029:204;;;::::0;-1:-1:-1;;;12029:204:0;;12320:2:1;12029:204:0::1;::::0;::::1;12302:21:1::0;12359:2;12339:18;;;12332:30;12398:34;12378:18;;;12371:62;-1:-1:-1;;;12449:18:1;;;12442:44;12503:19;;12029:204:0::1;12118:410:1::0;12029:204:0::1;12244:12;:16:::0;;-1:-1:-1;;12244:16:0::1;12259:1;12244:16;::::0;;12271:67;::::1;;;12306:13;:20:::0;;-1:-1:-1;;12306:20:0::1;;;::::0;;12271:67:::1;123196:42:::2;;;;;;;;;;;;;;-1:-1:-1::0;;;123196:42:0::2;;::::0;::::2;;;;;;;;;;;;;-1:-1:-1::0;;;123196:42:0::2;;::::0;:14:::2;:42::i;:::-;123249:16;:14;:16::i;:::-;123276;:14;:16::i;:::-;123303:38;;;;;;;;;;;;;;-1:-1:-1::0;;;123303:38:0::2;;::::0;::::2;;;;;;;;;;;;;-1:-1:-1::0;;;123303:38:0::2;;::::0;:13:::2;:38::i;:::-;123354:31;:29;:31::i;:::-;123396:24;:31:::0;;-1:-1:-1;;;;123396:31:0::2;-1:-1:-1::0;;;123396:31:0::2;::::0;;123457:8:::2;123440:14;:25:::0;123497:9:::2;123476:18;:30:::0;123627:35:::2;123646:10;123658:3;123627:18;:35::i;:::-;12364:14:::1;12360:102;;;12411:5;12395:21:::0;;-1:-1:-1;;12395:21:0::1;::::0;;12436:14:::1;::::0;-1:-1:-1;12685:36:1;;12436:14:0::1;::::0;12673:2:1;12658:18;12436:14:0::1;;;;;;;12360:102;11971:498;66210:14:::0;66206:107;;;-1:-1:-1;;;;;;;;;;;66241:60:0;;-1:-1:-1;;66241:60:0;;;66206:107;65352:968;123125:545::o;88186:128::-;88242:13;88275:23;:21;:23::i;:::-;:31;;88268:38;;;;;:::i;125911:113::-;18167:13;:11;:13::i;:::-;125977:11;;::::1;::::0;:4:::1;::::0;:11:::1;::::0;::::1;::::0;::::1;:::i;:::-;;126004:12;126011:4;126004:12;;;;;;:::i;:::-;;;;;;;;125911:113:::0;:::o;126953:216::-;127092:8;61058:29;61078:8;61058:19;:29::i;:::-;61053:122;;128828:24;;-1:-1:-1;;;128828:24:0;;;;61104:59;;;61137:26;61154:8;61137:16;:26::i;:::-;127118:43:::1;127142:8;127152;127118:23;:43::i;128610:117::-:0;18167:13;:11;:13::i;:::-;128687:24:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;128687:32:0::1;-1:-1:-1::0;;;;128687:32:0;;::::1;::::0;;;::::1;::::0;;128610:117::o;127851:249::-;128023:4;-1:-1:-1;;;;;60693:18:0;;60701:10;60693:18;60689:184;;60733:31;60753:10;60733:19;:31::i;:::-;60728:134;;128828:24;;-1:-1:-1;;;128828:24:0;;;;60785:61;;;60818:28;60835:10;60818:16;:28::i;:::-;128045:47:::1;128068:4;128074:2;128078:7;128087:4;128045:22;:47::i;:::-;127851:249:::0;;;;;:::o;126034:349::-;18167:13;:11;:13::i;:::-;126090:9:::1;::::0;-1:-1:-1;;;126090:9:0;::::1;;;126089:10;126081:19;;;::::0;::::1;;126125:15;126111:11;:29:::0;;;126181:14:::1;::::0;126163:32:::1;::::0;::::1;:::i;:::-;126151:9;:44:::0;;;126226:13:::1;::::0;126238:1:::1;126226:13;:::i;:::-;126208:15;:31:::0;;;126284:18:::1;::::0;126266:36:::1;::::0;::::1;:::i;:::-;126250:13;:52:::0;126315:9:::1;:16:::0;;-1:-1:-1;;;;126315:16:0::1;-1:-1:-1::0;;;126315:16:0::1;::::0;;126349:26:::1;::::0;::::1;::::0;::::1;::::0;126359:15:::1;2690:25:1::0;;2678:2;2663:18;;2544:177;126349:26:0::1;;;;;;;;126034:349::o:0;88420:318::-;88493:13;88524:16;88532:7;88524;:16::i;:::-;88519:59;;88549:29;;-1:-1:-1;;;88549:29:0;;;;;;;;;;;88519:59;88591:21;88615:10;:8;:10::i;:::-;88591:34;;88649:7;88643:21;88668:1;88643:26;;:87;;;;;;;;;;;;;;;;;88696:7;88705:18;88715:7;88705:9;:18::i;:::-;88679:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;88643:87;88636:94;88420:318;-1:-1:-1;;;88420:318:0:o;95575:188::-;95672:4;95696:23;:21;:23::i;:::-;-1:-1:-1;;;;;95696:49:0;;;;;;;:42;;;;;:49;;;;;;;;:59;;;;;;;;;;-1:-1:-1;95696:59:0;;;;;95575:188::o;19187:201::-;18167:13;:11;:13::i;:::-;-1:-1:-1;;;;;19276:22:0;::::1;19268:73;;;::::0;-1:-1:-1;;;19268:73:0;;13409:2:1;19268:73:0::1;::::0;::::1;13391:21:1::0;13448:2;13428:18;;;13421:30;13487:34;13467:18;;;13460:62;-1:-1:-1;;;13538:18:1;;;13531:36;13584:19;;19268:73:0::1;13207:402:1::0;19268:73:0::1;19352:28;19371:8;19352:18;:28::i;87084:639::-:0;87169:4;-1:-1:-1;;;;;;;;;87493:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;87570:25:0;;;87493:102;:179;;;-1:-1:-1;;;;;;;;87647:25:0;-1:-1:-1;;;87647:25:0;;87084:639::o;25117:248::-;25241:4;-1:-1:-1;;;;;;25265:52:0;;-1:-1:-1;;;25265:52:0;;:92;;-1:-1:-1;;;;;;;;;;23142:51:0;;;25321:36;23033:168;18446:132;18354:6;;-1:-1:-1;;;;;18354:6:0;16391:10;18510:23;18502:68;;;;-1:-1:-1;;;18502:68:0;;13816:2:1;18502:68:0;;;13798:21:1;;;13835:18;;;13828:30;13894:34;13874:18;;;13867:62;13946:18;;18502:68:0;13614:356:1;26523:332:0;26239:5;-1:-1:-1;;;;;26626:33:0;;;;26618:88;;;;-1:-1:-1;;;26618:88:0;;14177:2:1;26618:88:0;;;14159:21:1;14216:2;14196:18;;;14189:30;14255:34;14235:18;;;14228:62;-1:-1:-1;;;14306:18:1;;;14299:40;14356:19;;26618:88:0;13975:406:1;26618:88:0;-1:-1:-1;;;;;26725:22:0;;26717:60;;;;-1:-1:-1;;;26717:60:0;;14588:2:1;26717:60:0;;;14570:21:1;14627:2;14607:18;;;14600:30;14666:27;14646:18;;;14639:55;14711:18;;26717:60:0;14386:349:1;26717:60:0;26812:35;;;;;;;;;-1:-1:-1;;;;;26812:35:0;;;;;;-1:-1:-1;;;;;26812:35:0;;;;;;;;;;-1:-1:-1;;;26790:57:0;;;;:19;:57;26523:332::o;69287:164::-;69232:46;;69287:164::o;96021:330::-;96086:4;96176:23;:21;:23::i;:::-;:37;96166:47;;96123:201;;;;;-1:-1:-1;;;96251:23:0;:21;:23::i;:::-;:50;;;;:41;;;;;:50;;;;;;:68;:73;96103:221;96021:330;-1:-1:-1;;96021:330:0:o;128868:386::-;-1:-1:-1;;;;;129183:63:0;129203:42;129183:63;;128868:386::o;61291:1311::-;61672:22;61666:4;61659:36;61761:9;61755:4;61748:23;61832:8;61826:4;61819:22;62005:4;61999;61993;61987;61960:25;61953:5;61942:68;61932:270;;62122:16;62116:4;62110;62095:44;62170:16;62164:4;62157:30;61932:270;62582:1;62576:4;62569:15;61291:1311;:::o;94295:124::-;94384:27;94393:2;94397:7;94406:4;94384:8;:27::i;:::-;94295:124;;:::o;98376:2969::-;98518:27;98548;98567:7;98548:18;:27::i;:::-;98518:57;;98633:4;-1:-1:-1;;;;;98592:45:0;98608:19;-1:-1:-1;;;;;98592:45:0;;98588:86;;98646:28;;-1:-1:-1;;;98646:28:0;;;;;;;;;;;98588:86;98688:27;98717:23;98744:35;98771:7;98744:26;:35::i;:::-;98687:92;;;;98879:68;98904:15;98921:4;98927:19;16391:10;;16311:98;98927:19;-1:-1:-1;;;;;96919:32:0;;;96763:28;;97048:20;;97070:30;;97045:56;;96460:659;98879:68;98874:180;;98967:43;98984:4;16391:10;95575:188;:::i;98967:43::-;98962:92;;99019:35;;-1:-1:-1;;;99019:35:0;;;;;;;;;;;98962:92;-1:-1:-1;;;;;99071:16:0;;99067:52;;99096:23;;-1:-1:-1;;;99096:23:0;;;;;;;;;;;99067:52;99268:15;99265:160;;;99408:1;99387:19;99380:30;99265:160;99805:23;:21;:23::i;:::-;-1:-1:-1;;;;;99805:48:0;;;;;;:42;;;;;:48;;;;;99803:50;;-1:-1:-1;;99803:50:0;;;99898:23;:21;:23::i;:::-;-1:-1:-1;;;;;99898:46:0;;;;;;:42;;;;;:46;;;;;;99896:48;;;;;;93397:11;93372:23;93368:41;93355:63;-1:-1:-1;;;93355:63:0;100215:23;:21;:23::i;:::-;:50;;;;:41;;;;;:50;;;;;:199;-1:-1:-1;;;100534:47:0;;100530:699;;100639:1;100629:11;;100762:23;:21;:23::i;:::-;:54;;;;:41;;;;;:54;;;;;;100758:456;;100924:23;:21;:23::i;:::-;:37;100909:52;;100905:290;;101152:19;101095:23;:21;:23::i;:::-;:54;;;;:41;;;;;:54;;;;;:76;100905:290;100588:641;100530:699;101276:7;101272:2;-1:-1:-1;;;;;101257:27:0;101266:4;-1:-1:-1;;;;;101257:27:0;;;;;;;;;;;98507:2838;;;98376:2969;;;:::o;105921:3062::-;105994:20;106017:23;:21;:23::i;:::-;:37;;-1:-1:-1;106069:13:0;106065:44;;106091:18;;-1:-1:-1;;;106091:18:0;;;;;;;;;;;106065:44;106659:32;106647:45;;106597:23;:21;:23::i;:::-;-1:-1:-1;;;;;106597:46:0;;;;;;:42;;;;;:46;;;;;;:95;;;;;;;;;93397:11;93372:23;93368:41;-1:-1:-1;93828:15:0;;93802:24;93798:46;93365:52;93355:63;106935:23;:21;:23::i;:::-;:55;;;;:41;;;;;:55;;;;;:197;;;;-1:-1:-1;;;;;107722:25:0;;;107194:23;;;;106977:12;;107722:25;;107959;106935:55;;107812:335;108473:1;108459:12;108455:20;108413:346;108514:3;108505:7;108502:16;108413:346;;108732:7;108722:8;108719:1;108692:25;108689:1;108686;108681:59;108567:1;108554:15;108413:346;;;-1:-1:-1;108792:13:0;108788:45;;108814:19;;-1:-1:-1;;;108814:19:0;;;;;;;;;;;108788:45;108890:3;108850:23;:21;:23::i;:::-;:43;-1:-1:-1;108915:60:0;;-1:-1:-1;127395:216:0;101441:193;101587:39;101604:4;101610:2;101614:7;101587:39;;;;;;;;;;;;:16;:39::i;56323:178::-;56400:7;56427:66;56460:20;:18;:20::i;:::-;56482:10;52274:57;;-1:-1:-1;;;52274:57:0;;;15831:27:1;15874:11;;;15867:27;;;15910:12;;;15903:28;;;52237:7:0;;15947:12:1;;52274:57:0;;;;;;;;;;;;52264:68;;;;;;52257:75;;52144:196;;;;;47331:231;47409:7;47430:17;47449:18;47471:27;47482:4;47488:9;47471:10;:27::i;:::-;47429:69;;;;47509:18;47521:5;47509:11;:18::i;:::-;-1:-1:-1;47545:9:0;47331:231;-1:-1:-1;;;47331:231:0:o;90654:1784::-;90721:14;90804:23;:21;:23::i;:::-;:50;;;;:41;;;;;:50;;;;;;;-1:-1:-1;;;;90904:24:0;;90900:1471;;91043:11;91039:1029;;91094:23;:21;:23::i;:::-;:37;91083:48;;91079:92;;91140:31;;-1:-1:-1;;;91140:31:0;;;;;;;;;;;91079:92;91854:23;:21;:23::i;:::-;-1:-1:-1;;91896:9:0;;;91854:52;;;;:41;;;;;:52;;;;;;;;-1:-1:-1;91964:11:0;91960:25;;91768:281;;91960:25;90654:1784;;;:::o;90900:1471::-;92399:31;;-1:-1:-1;;;92399:31:0;;;;;;;;;;;19548:191;19641:6;;;-1:-1:-1;;;;;19658:17:0;;;-1:-1:-1;;;;;;19658:17:0;;;;;;;19691:40;;19641:6;;;19658:17;19641:6;;19691:40;;19622:16;;19691:40;19611:128;19548:191;:::o;82174:160::-;-1:-1:-1;;;;;;;;;;;66583:52:0;;;;;;66561:154;;;;-1:-1:-1;;;66561:154:0;;;;;;;:::i;:::-;82286:40:::1;82311:5;82318:7;82286:24;:40::i;17824:97::-:0;14125:13;;;;;;;14117:69;;;;-1:-1:-1;;;14117:69:0;;;;;;;:::i;:::-;17887:26:::1;:24;:26::i;24702:60::-:0;14125:13;;;;;;;14117:69;;;;-1:-1:-1;;;14117:69:0;;;;;;;:::i;54698:149::-;14125:13;;;;;;;14117:69;;;;-1:-1:-1;;;14117:69:0;;;;;;;:::i;:::-;54801:38:::1;54825:4;54831:7;54801:23;:38::i;58460:135::-:0;58529:58;58024:42;58582:4;58529:29;:58::i;95160:258::-;95331:8;95255:23;:21;:23::i;:::-;16391:10;95255:63;;;;:42;;;;;:63;;;;;;;;-1:-1:-1;;;;;95255:73:0;;;;;;;;;;;;:84;;-1:-1:-1;;95255:84:0;;;;;;;;;;;95355:55;;565:14:1;;558:22;540:41;;95255:73:0;;16391:10;;95355:55;;513:18:1;95355:55:0;;;;;;;95160:258;;:::o;102232:407::-;102407:31;102420:4;102426:2;102430:7;102407:12;:31::i;:::-;-1:-1:-1;;;;;102453:14:0;;;:19;102449:183;;102492:56;102523:4;102529:2;102533:7;102542:5;102492:30;:56::i;:::-;102487:145;;102576:40;;-1:-1:-1;;;102576:40:0;;;;;;;;;;;129365:105;129425:13;129458:4;129451:11;;;;;:::i;120541:1745::-;120606:17;121040:4;121033;121027:11;121023:22;121132:1;121126:4;121119:15;121207:4;121204:1;121200:12;121193:19;;;121289:1;121284:3;121277:14;121393:3;121632:5;121614:428;121680:1;121675:3;121671:11;121664:18;;121851:2;121845:4;121841:13;121837:2;121833:22;121828:3;121820:36;121945:2;121935:13;;;122002:25;;122020:5;;122002:25;121614:428;;;-1:-1:-1;122072:13:0;;;-1:-1:-1;;122187:14:0;;;122249:19;;;122187:14;120541:1745;-1:-1:-1;120541:1745:0:o;113570:516::-;113699:13;113715:16;113723:7;113715;:16::i;:::-;113699:32;;113748:13;113744:219;;;16391:10;-1:-1:-1;;;;;113780:28:0;;;113776:187;;113832:44;113849:5;16391:10;95575:188;:::i;113832:44::-;113827:136;;113908:35;;-1:-1:-1;;;113908:35:0;;;;;;;;;;;113827:136;114032:2;113975:23;:21;:23::i;:::-;:48;;;;:39;;;;;:48;;;;;;:59;;-1:-1:-1;;;;;;113975:59:0;-1:-1:-1;;;;;113975:59:0;;;;;;114050:28;113975:48;;114050:28;;;;;;;;;;113975:48;114050:28;113688:398;113570:516;;;:::o;97232:524::-;97334:27;97363:23;97404:53;97460:23;:21;:23::i;:::-;:48;;;;:39;;:48;;-1:-1:-1;;97460:48:0;;;;97712:26;;97460:48;;97712:26;;-1:-1:-1;97232:524:0:o;55248:162::-;55301:7;55328:74;53971:95;55362:17;56830:12;;;56745:105;55362:17;57185:15;;55599:73;;;;;;18225:25:1;;;18266:18;;;18259:34;;;18309:18;;;18302:34;;;55643:13:0;18352:18:1;;;18345:34;55666:4:0;18395:19:1;;;18388:61;55562:7:0;;18197:19:1;;55599:73:0;;;;;;;;;;;;55589:84;;;;;;55582:91;;55418:263;;;;;;55328:74;55321:81;;55248:162;:::o;45782:747::-;45863:7;45872:12;45901:9;:16;45921:2;45901:22;45897:625;;;46245:4;46230:20;;46224:27;46295:4;46280:20;;46274:27;46353:4;46338:20;;46332:27;45940:9;46324:36;46396:25;46407:4;46324:36;46224:27;46274;46396:10;:25::i;:::-;46389:32;;;;;;;;;45897:625;-1:-1:-1;46470:1:0;;-1:-1:-1;46474:35:0;46454:56;;44175:521;44253:20;44244:5;:29;;;;;;;;:::i;:::-;;44240:449;;;44175:521;:::o;44240:449::-;44351:29;44342:5;:38;;;;;;;;:::i;:::-;;44338:351;;;44397:34;;-1:-1:-1;;;44397:34:0;;16304:2:1;44397:34:0;;;16286:21:1;16343:2;16323:18;;;16316:30;16382:26;16362:18;;;16355:54;16426:18;;44397:34:0;16102:348:1;44338:351:0;44462:35;44453:5;:44;;;;;;;;:::i;:::-;;44449:240;;;44514:41;;-1:-1:-1;;;44514:41:0;;16657:2:1;44514:41:0;;;16639:21:1;16696:2;16676:18;;;16669:30;16735:33;16715:18;;;16708:61;16786:18;;44514:41:0;16455:355:1;44449:240:0;44586:30;44577:5;:39;;;;;;;;:::i;:::-;;44573:116;;;44633:44;;-1:-1:-1;;;44633:44:0;;17017:2:1;44633:44:0;;;16999:21:1;17056:2;17036:18;;;17029:30;17095:34;17075:18;;;17068:62;-1:-1:-1;;;17146:18:1;;;17139:32;17188:19;;44633:44:0;16815:398:1;82342:285:0;-1:-1:-1;;;;;;;;;;;66583:52:0;;;;;;66561:154;;;;-1:-1:-1;;;66561:154:0;;;;;;;:::i;:::-;82496:5:::1;82464:23;:21;:23::i;:::-;:29;;:37;;;;;;;;;;;;:::i;:::-;;82546:7;82512:23;:21;:23::i;:::-;:31;;:41;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;83019:7:0;82564:23:::1;:21;:23::i;:::-;:55:::0;-1:-1:-1;;82342:285:0:o;17929:113::-;14125:13;;;;;;;14117:69;;;;-1:-1:-1;;;14117:69:0;;;;;;;:::i;:::-;18002:32:::1;16391:10:::0;18002:18:::1;:32::i;54855:302::-:0;14125:13;;;;;;;14117:69;;;;-1:-1:-1;;;14117:69:0;;;;;;;:::i;:::-;54989:22;;::::1;::::0;;::::1;::::0;55046:25;;;;;::::1;::::0;55082:12:::1;:25:::0;;;;55118:15:::1;:31:::0;54855:302::o;58765:1763::-;-1:-1:-1;;;;;59195:48:0;;;;58995:10;59273:9;59259:344;;59316:30;59306:165;;-1:-1:-1;59391:10:0;59447:5;;59306:165;-1:-1:-1;59509:10:0;59259:344;59680:16;59675:3;59671:26;59665:4;59658:40;59764:9;59758:4;59751:23;59857:30;59851:4;59844:44;60012:4;60006;60000;59994;59991:1;59964:25;59957:5;59952:65;59942:375;;60177:16;60169:4;60163:11;60158:3;60154:21;60151:43;60148:154;;;60281:1;60278;60271:12;60148:154;59942:375;60508:1;60502:4;60495:15;58765:1763;;:::o;104723:736::-;104920:99;;-1:-1:-1;;;104920:99:0;;104886:4;;-1:-1:-1;;;;;104920:56:0;;;;;:99;;16391:10;;104998:4;;105004:7;;105013:5;;104920:99;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;104920:99:0;;;;;;;;-1:-1:-1;;104920:99:0;;;;;;;;;;;;:::i;:::-;;;104903:549;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;105210:13:0;;105206:235;;105256:40;;-1:-1:-1;;;105256:40:0;;;;;;;;;;;105206:235;105399:6;105393:13;105384:6;105380:2;105376:15;105369:38;104903:549;-1:-1:-1;;;;;;105075:75:0;-1:-1:-1;;;105075:75:0;;-1:-1:-1;104903:549:0;104723:736;;;;;;:::o;48783:1520::-;48914:7;;49848:66;49835:79;;49831:163;;;-1:-1:-1;49947:1:0;;-1:-1:-1;49951:30:0;49931:51;;49831:163;50108:24;;;50091:14;50108:24;;;;;;;;;18687:25:1;;;18760:4;18748:17;;18728:18;;;18721:45;;;;18782:18;;;18775:34;;;18825:18;;;18818:34;;;50108:24:0;;18659:19:1;;50108:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50108:24:0;;-1:-1:-1;;50108:24:0;;;-1:-1:-1;;;;;;;50147:20:0;;50143:103;;50200:1;50204:29;50184:50;;;;;;;50143:103;50266:6;-1:-1:-1;50274:20:0;;-1:-1:-1;48783:1520:0;;;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::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:173::-;660:20;;-1:-1:-1;;;;;709:31:1;;699:42;;689:70;;755:1;752;745:12;770:366;837:6;845;898:2;886:9;877:7;873:23;869:32;866:52;;;914:1;911;904:12;866:52;937:29;956:9;937:29;:::i;:::-;927:39;;1016:2;1005:9;1001:18;988:32;-1:-1:-1;;;;;1053:5:1;1049:38;1042:5;1039:49;1029:77;;1102:1;1099;1092:12;1029:77;1125:5;1115:15;;;770:366;;;;;:::o;1141:258::-;1213:1;1223:113;1237:6;1234:1;1231:13;1223:113;;;1313:11;;;1307:18;1294:11;;;1287:39;1259:2;1252:10;1223:113;;;1354:6;1351:1;1348:13;1345:48;;;-1:-1:-1;;1389:1:1;1371:16;;1364:27;1141:258::o;1404:::-;1446:3;1484:5;1478:12;1511:6;1506:3;1499:19;1527:63;1583:6;1576:4;1571:3;1567:14;1560:4;1553:5;1549:16;1527:63;:::i;:::-;1644:2;1623:15;-1:-1:-1;;1619:29:1;1610:39;;;;1651:4;1606:50;;1404:258;-1:-1:-1;;1404:258:1:o;1667:220::-;1816:2;1805:9;1798:21;1779:4;1836:45;1877:2;1866:9;1862:18;1854:6;1836:45;:::i;1892:180::-;1951:6;2004:2;1992:9;1983:7;1979:23;1975:32;1972:52;;;2020:1;2017;2010:12;1972:52;-1:-1:-1;2043:23:1;;1892:180;-1:-1:-1;1892:180:1:o;2285:254::-;2353:6;2361;2414:2;2402:9;2393:7;2389:23;2385:32;2382:52;;;2430:1;2427;2420:12;2382:52;2453:29;2472:9;2453:29;:::i;:::-;2443:39;2529:2;2514:18;;;;2501:32;;-1:-1:-1;;;2285:254:1:o;2726:328::-;2803:6;2811;2819;2872:2;2860:9;2851:7;2847:23;2843:32;2840:52;;;2888:1;2885;2878:12;2840:52;2911:29;2930:9;2911:29;:::i;:::-;2901:39;;2959:38;2993:2;2982:9;2978:18;2959:38;:::i;:::-;2949:48;;3044:2;3033:9;3029:18;3016:32;3006:42;;2726:328;;;;;:::o;3059:248::-;3127:6;3135;3188:2;3176:9;3167:7;3163:23;3159:32;3156:52;;;3204:1;3201;3194:12;3156:52;-1:-1:-1;;3227:23:1;;;3297:2;3282:18;;;3269:32;;-1:-1:-1;3059:248:1:o;3591:127::-;3652:10;3647:3;3643:20;3640:1;3633:31;3683:4;3680:1;3673:15;3707:4;3704:1;3697:15;3723:631;3787:5;3817:18;3858:2;3850:6;3847:14;3844:40;;;3864:18;;:::i;:::-;3939:2;3933:9;3907:2;3993:15;;-1:-1:-1;;3989:24:1;;;4015:2;3985:33;3981:42;3969:55;;;4039:18;;;4059:22;;;4036:46;4033:72;;;4085:18;;:::i;:::-;4125:10;4121:2;4114:22;4154:6;4145:15;;4184:6;4176;4169:22;4224:3;4215:6;4210:3;4206:16;4203:25;4200:45;;;4241:1;4238;4231:12;4200:45;4291:6;4286:3;4279:4;4271:6;4267:17;4254:44;4346:1;4339:4;4330:6;4322;4318:19;4314:30;4307:41;;;;3723:631;;;;;:::o;4359:220::-;4401:5;4454:3;4447:4;4439:6;4435:17;4431:27;4421:55;;4472:1;4469;4462:12;4421:55;4494:79;4569:3;4560:6;4547:20;4540:4;4532:6;4528:17;4494:79;:::i;4584:456::-;4670:6;4678;4686;4739:2;4727:9;4718:7;4714:23;4710:32;4707:52;;;4755:1;4752;4745:12;4707:52;4791:9;4778:23;4768:33;;4848:2;4837:9;4833:18;4820:32;4810:42;;4903:2;4892:9;4888:18;4875:32;4930:18;4922:6;4919:30;4916:50;;;4962:1;4959;4952:12;4916:50;4985:49;5026:7;5017:6;5006:9;5002:22;4985:49;:::i;:::-;4975:59;;;4584:456;;;;;:::o;5045:186::-;5104:6;5157:2;5145:9;5136:7;5132:23;5128:32;5125:52;;;5173:1;5170;5163:12;5125:52;5196:29;5215:9;5196:29;:::i;5236:450::-;5305:6;5358:2;5346:9;5337:7;5333:23;5329:32;5326:52;;;5374:1;5371;5364:12;5326:52;5414:9;5401:23;5447:18;5439:6;5436:30;5433:50;;;5479:1;5476;5469:12;5433:50;5502:22;;5555:4;5547:13;;5543:27;-1:-1:-1;5533:55:1;;5584:1;5581;5574:12;5533:55;5607:73;5672:7;5667:2;5654:16;5649:2;5645;5641:11;5607:73;:::i;5691:160::-;5756:20;;5812:13;;5805:21;5795:32;;5785:60;;5841:1;5838;5831:12;5856:254;5921:6;5929;5982:2;5970:9;5961:7;5957:23;5953:32;5950:52;;;5998:1;5995;5988:12;5950:52;6021:29;6040:9;6021:29;:::i;:::-;6011:39;;6069:35;6100:2;6089:9;6085:18;6069:35;:::i;:::-;6059:45;;5856:254;;;;;:::o;6115:180::-;6171:6;6224:2;6212:9;6203:7;6199:23;6195:32;6192:52;;;6240:1;6237;6230:12;6192:52;6263:26;6279:9;6263:26;:::i;6300:537::-;6395:6;6403;6411;6419;6472:3;6460:9;6451:7;6447:23;6443:33;6440:53;;;6489:1;6486;6479:12;6440:53;6512:29;6531:9;6512:29;:::i;:::-;6502:39;;6560:38;6594:2;6583:9;6579:18;6560:38;:::i;:::-;6550:48;;6645:2;6634:9;6630:18;6617:32;6607:42;;6700:2;6689:9;6685:18;6672:32;6727:18;6719:6;6716:30;6713:50;;;6759:1;6756;6749:12;6713:50;6782:49;6823:7;6814:6;6803:9;6799:22;6782:49;:::i;:::-;6772:59;;;6300:537;;;;;;;:::o;6842:260::-;6910:6;6918;6971:2;6959:9;6950:7;6946:23;6942:32;6939:52;;;6987:1;6984;6977:12;6939:52;7010:29;7029:9;7010:29;:::i;:::-;7000:39;;7058:38;7092:2;7081:9;7077:18;7058:38;:::i;7321:380::-;7400:1;7396:12;;;;7443;;;7464:61;;7518:4;7510:6;7506:17;7496:27;;7464:61;7571:2;7563:6;7560:14;7540:18;7537:38;7534:161;;;7617:10;7612:3;7608:20;7605:1;7598:31;7652:4;7649:1;7642:15;7680:4;7677:1;7670:15;7534:161;;7321:380;;;:::o;7706:127::-;7767:10;7762:3;7758:20;7755:1;7748:31;7798:4;7795:1;7788:15;7822:4;7819:1;7812:15;7838:168;7878:7;7944:1;7940;7936:6;7932:14;7929:1;7926:21;7921:1;7914:9;7907:17;7903:45;7900:71;;;7951:18;;:::i;:::-;-1:-1:-1;7991:9:1;;7838:168::o;8011:217::-;8051:1;8077;8067:132;;8121:10;8116:3;8112:20;8109:1;8102:31;8156:4;8153:1;8146:15;8184:4;8181:1;8174:15;8067:132;-1:-1:-1;8213:9:1;;8011:217::o;8947:128::-;8987:3;9018:1;9014:6;9011:1;9008:13;9005:39;;;9024:18;;:::i;:::-;-1:-1:-1;9060:9:1;;8947:128::o;10151:125::-;10191:4;10219:1;10216;10213:8;10210:34;;;10224:18;;:::i;:::-;-1:-1:-1;10261:9:1;;10151:125::o;12732:470::-;12911:3;12949:6;12943:13;12965:53;13011:6;13006:3;12999:4;12991:6;12987:17;12965:53;:::i;:::-;13081:13;;13040:16;;;;13103:57;13081:13;13040:16;13137:4;13125:17;;13103:57;:::i;:::-;13176:20;;12732:470;-1:-1:-1;;;;12732:470:1:o;14740:416::-;14942:2;14924:21;;;14981:2;14961:18;;;14954:30;15020:34;15015:2;15000:18;;14993:62;-1:-1:-1;;;15086:2:1;15071:18;;15064:50;15146:3;15131:19;;14740:416::o;15161:407::-;15363:2;15345:21;;;15402:2;15382:18;;;15375:30;15441:34;15436:2;15421:18;;15414:62;-1:-1:-1;;;15507:2:1;15492:18;;15485:41;15558:3;15543:19;;15161:407::o;15970:127::-;16031:10;16026:3;16022:20;16019:1;16012:31;16062:4;16059:1;16052:15;16086:4;16083:1;16076:15;17218:489;-1:-1:-1;;;;;17487:15:1;;;17469:34;;17539:15;;17534:2;17519:18;;17512:43;17586:2;17571:18;;17564:34;;;17634:3;17629:2;17614:18;;17607:31;;;17412:4;;17655:46;;17681:19;;17673:6;17655:46;:::i;:::-;17647:54;17218:489;-1:-1:-1;;;;;;17218:489:1:o;17712:249::-;17781:6;17834:2;17822:9;17813:7;17809:23;17805:32;17802:52;;;17850:1;17847;17840:12;17802:52;17882:9;17876:16;17901:30;17925:5;17901:30;:::i
Swarm Source
ipfs://6e71174e2fded689ecefce5b014eac1f388bc915762b22292842265165127ac0
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.