Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,296 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Mint Phase Two A... | 17968030 | 490 days ago | IN | 0 ETH | 0.00046688 | ||||
Mint Phase Two A... | 17967493 | 490 days ago | IN | 0 ETH | 0.00120668 | ||||
Mint Phase Two A... | 17967483 | 490 days ago | IN | 0 ETH | 0.001333 | ||||
Mint Phase Two A... | 17967483 | 490 days ago | IN | 0 ETH | 0.001333 | ||||
Mint Phase Two A... | 17967483 | 490 days ago | IN | 0 ETH | 0.001333 | ||||
Mint Phase Two A... | 17967483 | 490 days ago | IN | 0 ETH | 0.001333 | ||||
Mint Phase Two A... | 17967483 | 490 days ago | IN | 0 ETH | 0.001333 | ||||
Mint Phase Two A... | 17967483 | 490 days ago | IN | 0 ETH | 0.001333 | ||||
Mint Phase Two A... | 17967483 | 490 days ago | IN | 0 ETH | 0.001333 | ||||
Mint Phase Two A... | 17967483 | 490 days ago | IN | 0 ETH | 0.001333 | ||||
Mint Phase Two A... | 17967481 | 490 days ago | IN | 0 ETH | 0.00134448 | ||||
Mint Phase Two A... | 17967479 | 490 days ago | IN | 0 ETH | 0.00142787 | ||||
Mint Phase Two A... | 17967444 | 490 days ago | IN | 0 ETH | 0.00145145 | ||||
Mint Phase Two A... | 17967444 | 490 days ago | IN | 0 ETH | 0.00145145 | ||||
Mint Phase Two A... | 17967444 | 490 days ago | IN | 0 ETH | 0.00145145 | ||||
Mint Phase Two A... | 17967444 | 490 days ago | IN | 0 ETH | 0.00145145 | ||||
Mint Phase Two A... | 17967444 | 490 days ago | IN | 0 ETH | 0.00145145 | ||||
Mint Phase Two A... | 17967444 | 490 days ago | IN | 0 ETH | 0.00145145 | ||||
Mint Phase Two A... | 17967444 | 490 days ago | IN | 0 ETH | 0.00145145 | ||||
Mint Phase Two A... | 17967444 | 490 days ago | IN | 0 ETH | 0.00145145 | ||||
Mint Phase Two A... | 17967444 | 490 days ago | IN | 0 ETH | 0.00145145 | ||||
Mint Phase Two A... | 17967444 | 490 days ago | IN | 0 ETH | 0.00145112 | ||||
Mint Phase Two A... | 17967444 | 490 days ago | IN | 0 ETH | 0.00145112 | ||||
Mint Phase Two A... | 17967444 | 490 days ago | IN | 0 ETH | 0.00145145 | ||||
Mint Phase Two A... | 17967444 | 490 days ago | IN | 0 ETH | 0.00145145 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
SanFranTokyoGenesisPassCashier
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "./SalesTimestamps.sol"; import "@klktn/allowlist.eth/contracts/EIP712Allowlisting.sol"; interface ISFT721 { function mint(address to, uint256 amount) external; function numberMinted(address owner) external view returns (uint256); } // Custom Errors error ReachedMintLimitPerWallet(); /** * @dev Mint Schedule * 0: Treasury & Dev mint 100 tokens, maximum 100 tokens for this phase * Note that this is done in the treasuryMint function in CoreMinter * 1: Guaranteed allowlist mint, maximum 1900 tokens for this phase * 2: FCFS allowlist mint, maximum 100 + remaining mint limit from previous phases if there is any left * 3: Public mint until mint-out * * During all phases, the mint limit per wallet is 1. */ contract SanFranTokyoGenesisPassCashier is EIP712Allowlisting, SalesTimestamps { // Custom Events event CashierPhaseOneAllowlistMint(address indexed recipient); event CashierPhaseTwoAllowlistMint(address indexed recipient); event CashierPublicMint(address indexed recipient); ISFT721 public immutable erc721Contract; constructor(address _erc721ContractAddress) EIP712Allowlisting() { erc721Contract = ISFT721(_erc721ContractAddress); } function _mintERC721() internal { erc721Contract.mint(msg.sender, 1); } /** * @dev Phase 1 Allowlist mint */ function mintPhaseOneAllowlist( bytes calldata signature ) external requiresValidPhaseOneAllowlistMintTime requiresAllowlist(signature, "SanFranTokyoGenesisPass", "1") enforceMintLimitPerWallet { _mintERC721(); emit CashierPhaseOneAllowlistMint(msg.sender); } /** * @dev Phase 2 (FCFS) Allowlist mint */ function mintPhaseTwoAllowlist( bytes calldata signature ) external requiresValidPhaseTwoAllowlistMintTime requiresAllowlist(signature, "SanFranTokyoGenesisPass", "2") enforceMintLimitPerWallet { _mintERC721(); emit CashierPhaseTwoAllowlistMint(msg.sender); } /** * @dev Public mint */ function mintPublic() external requiresValidPublicMintTime enforceMintLimitPerWallet { _mintERC721(); emit CashierPublicMint(msg.sender); } /** * @dev Throws if user has already minted 1 or more tokens * or the transaction will result in user having more than 1 tokens * after this transaction */ modifier enforceMintLimitPerWallet() { if (erc721Contract.numberMinted(msg.sender) >= 1) revert ReachedMintLimitPerWallet(); _; } function validateSignature( bytes calldata signature, string calldata phase, address recipient ) public view returns (bool) { return isSignatureValid(signature, "SanFranTokyoGenesisPass", phase, recipient); } }
//SPDX-License-Identifier: Unlicense pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; error EIP712AllowlistNotEnabled(); error InvalidSignature(); contract EIP712Allowlisting is Ownable { using ECDSA for bytes32; error DomainSeparatorNotSet(string name, string phase); // The key used to sign whitelist signatures. // We will check to ensure that the key that signed the signature // is this one that we expect. address private allowlistSigningKey = address(0); // The typehash for the data type specified in the structured data // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md#rationale-for-typehash // This should match whats in the client side whitelist signing code // https://github.com/msfeldstein/EIP712-whitelisting/blob/main/test/signWhitelist.ts#L22 bytes32 public constant MINTER_TYPEHASH = keccak256("Minter(address wallet,string phase)"); /** * @dev Mapping of contractName => domainSeparator * for requiresAllowlist to look up for with contractName */ mapping(string => bytes32) private domainSeparators; /** * * @dev This is a helper function that can be used to generate the domain separator * name_ should match the name set in the NFT contract * Domain Separator is the EIP-712 defined structure that defines what contract * and chain these signatures can be used for. This ensures people can't take * a signature used to mint on one contract and use it for another, or a signature * from testnet to replay on mainnet. * It has to be created in the constructor so we can dynamically grab the chainId. * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md#definition-of-domainseparator */ function _domainSeparator( string calldata _name ) internal view returns (bytes32) { return keccak256( abi.encode( keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ), // This should match the domain you set in your client side signing. keccak256(bytes(_name)), // EIP-712 version specifies the current version of the signing domain // We use default "1" as the only usecase is for the allowlist singer to authenticate via signature // for whitelisting purposes keccak256(bytes("1")), block.chainid, address(this) ) ); } /** * @dev set domain separator for a contract and phase */ function setDomainSeparator( string calldata contractName ) external onlyOwner { bytes32 separator = _domainSeparator(contractName); domainSeparators[contractName] = separator; } /** * @dev get domain separator for a contract and phase */ // get domain separator for a contract and phase function getDomainSeparator( string memory contractName, string memory phase ) internal view returns (bytes32) { bytes32 separator = domainSeparators[contractName]; if (separator == 0) { revert DomainSeparatorNotSet(contractName, phase); } return separator; } function setAllowlistSigningAddress( address newSigningKey ) public onlyOwner { allowlistSigningKey = newSigningKey; } function isSignatureValid( bytes calldata signature, string memory name, string memory phase, address recipient ) public view returns (bool) { if (allowlistSigningKey == address(0)) revert EIP712AllowlistNotEnabled(); // Verify EIP-712 signature by recreating the data structure // that we signed on the client side, and then using that to recover // the address that signed the signature for this data. // Construct domain separator bytes32 domain = getDomainSeparator(name, phase); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", domain, keccak256( abi.encode( MINTER_TYPEHASH, recipient, keccak256(bytes(phase)) ) ) ) ); // Use the recover method to see what address was used to create // the signature on this data. // Note that if the digest doesn't exactly match what was signed we'll // get a random recovered address. address recoveredAddress = digest.recover(signature); if (recoveredAddress != allowlistSigningKey) return false; return true; } modifier requiresAllowlist( bytes calldata signature, string memory name, string memory phase ) { if (!isSignatureValid(signature, name, phase, msg.sender)) revert InvalidSignature(); _; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions 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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; import "../Strings.sol"; /** * @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 ECDSA { 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", Strings.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)); } }
// SPDX-License-Identifier: MIT // 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 Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { 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); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/Math.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts/access/Ownable.sol"; error PhaseOneAllowlistMintHasNotStarted(); error PhaseTwoAllowlistMintHasNotStarted(); error PublicMintHasNotStarted(); error PhaseOneAllowlistMintHasEnded(); error PhaseTwoAllowlistMintHasEnded(); error PublicMintHasEnded(); contract SalesTimestamps is Ownable { uint256 public phaseOneAllowlistMintStartTimeInSeconds; uint256 public phaseTwoAllowlistMintStartTimeInSeconds; uint256 public publicMintStartTimeInSeconds; uint256 public phaseOneAllowlistMintEndTimeInSeconds; uint256 public phaseTwoAllowlistMintEndTimeInSeconds; uint256 public publicMintEndTimeInSeconds; function setPhaseOneAllowlistMintTime( uint256 _startTimeInSeconds, uint256 _endTimeInSeconds ) external onlyOwner { phaseOneAllowlistMintStartTimeInSeconds = _startTimeInSeconds; phaseOneAllowlistMintEndTimeInSeconds = _endTimeInSeconds; } function setPhaseTwoAllowlistMintTime( uint256 _startTimeInSeconds, uint256 _endTimeInSeconds ) external onlyOwner { phaseTwoAllowlistMintStartTimeInSeconds = _startTimeInSeconds; phaseTwoAllowlistMintEndTimeInSeconds = _endTimeInSeconds; } function setPublicMintTime( uint256 _startTimeInSeconds, uint256 _endTimeInSeconds ) external onlyOwner { publicMintStartTimeInSeconds = _startTimeInSeconds; publicMintEndTimeInSeconds = _endTimeInSeconds; } /** * @dev Throws if in invalid phase 1 allowlist time. */ modifier requiresValidPhaseOneAllowlistMintTime() { if (block.timestamp < phaseOneAllowlistMintStartTimeInSeconds) revert PhaseOneAllowlistMintHasNotStarted(); if (block.timestamp > phaseOneAllowlistMintEndTimeInSeconds) revert PhaseOneAllowlistMintHasEnded(); _; } /** * @dev Throws if in invalid phase 2 allowlist time. */ modifier requiresValidPhaseTwoAllowlistMintTime() { if (block.timestamp < phaseTwoAllowlistMintStartTimeInSeconds) revert PhaseTwoAllowlistMintHasNotStarted(); if (block.timestamp > phaseTwoAllowlistMintEndTimeInSeconds) revert PhaseTwoAllowlistMintHasEnded(); _; } /** * @dev Throws if in invalid public sale time. */ modifier requiresValidPublicMintTime() { if (block.timestamp < publicMintStartTimeInSeconds) revert PublicMintHasNotStarted(); if (block.timestamp > publicMintEndTimeInSeconds) revert PublicMintHasEnded(); _; } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_erc721ContractAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"phase","type":"string"}],"name":"DomainSeparatorNotSet","type":"error"},{"inputs":[],"name":"EIP712AllowlistNotEnabled","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[],"name":"PhaseOneAllowlistMintHasEnded","type":"error"},{"inputs":[],"name":"PhaseOneAllowlistMintHasNotStarted","type":"error"},{"inputs":[],"name":"PhaseTwoAllowlistMintHasEnded","type":"error"},{"inputs":[],"name":"PhaseTwoAllowlistMintHasNotStarted","type":"error"},{"inputs":[],"name":"PublicMintHasEnded","type":"error"},{"inputs":[],"name":"PublicMintHasNotStarted","type":"error"},{"inputs":[],"name":"ReachedMintLimitPerWallet","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"CashierPhaseOneAllowlistMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"CashierPhaseTwoAllowlistMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"CashierPublicMint","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"},{"inputs":[],"name":"MINTER_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"erc721Contract","outputs":[{"internalType":"contract ISFT721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"phase","type":"string"},{"internalType":"address","name":"recipient","type":"address"}],"name":"isSignatureValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintPhaseOneAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintPhaseTwoAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phaseOneAllowlistMintEndTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phaseOneAllowlistMintStartTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phaseTwoAllowlistMintEndTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"phaseTwoAllowlistMintStartTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintEndTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintStartTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSigningKey","type":"address"}],"name":"setAllowlistSigningAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"contractName","type":"string"}],"name":"setDomainSeparator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTimeInSeconds","type":"uint256"},{"internalType":"uint256","name":"_endTimeInSeconds","type":"uint256"}],"name":"setPhaseOneAllowlistMintTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTimeInSeconds","type":"uint256"},{"internalType":"uint256","name":"_endTimeInSeconds","type":"uint256"}],"name":"setPhaseTwoAllowlistMintTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTimeInSeconds","type":"uint256"},{"internalType":"uint256","name":"_endTimeInSeconds","type":"uint256"}],"name":"setPublicMintTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"string","name":"phase","type":"string"},{"internalType":"address","name":"recipient","type":"address"}],"name":"validateSignature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a06040526000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200005357600080fd5b50604051620023493803806200234983398181016040528101906200007991906200020a565b620000996200008d620000d460201b60201c565b620000dc60201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050506200023c565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001d282620001a5565b9050919050565b620001e481620001c5565b8114620001f057600080fd5b50565b6000815190506200020481620001d9565b92915050565b600060208284031215620002235762000222620001a0565b5b60006200023384828501620001f3565b91505092915050565b6080516120d562000274600039600081816104ca0152818161078701528181610c1501528181610d850152610e5001526120d56000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c80638c874ebd116100b8578063bb373d941161007c578063bb373d94146102f1578063bc9c76411461030d578063be00df4a14610329578063d7c97fb414610345578063f2fde38b14610363578063fa4d280c1461037f57610136565b80638c874ebd1461025f5780638da5cb5b14610269578063911690e2146102875780639bb302d6146102a35780639f2f233c146102d357610136565b80633bc85578116100ff5780633bc85578146101cd5780633bfac8aa146101eb5780634e0922c2146102075780635353694814610237578063715018a61461025557610136565b8062b5cdfc1461013b5780630c11e26a146101575780631e46eed4146101735780632ce4a78b1461019157806337b1846c146101af575b600080fd5b61015560048036038101906101509190611484565b61039d565b005b610171600480360381019061016c9190611507565b6105ec565b005b61017b610606565b6040516101889190611556565b60405180910390f35b61019961060c565b6040516101a69190611556565b60405180910390f35b6101b7610612565b6040516101c49190611556565b60405180910390f35b6101d5610618565b6040516101e29190611556565b60405180910390f35b610205600480360381019061020091906115c7565b61061e565b005b610221600480360381019061021c9190611672565b61065e565b60405161022e9190611722565b60405180910390f35b61023f6106f1565b60405161024c9190611556565b60405180910390f35b61025d6106f7565b005b61026761070b565b005b6102716108a3565b60405161027e919061174c565b60405180910390f35b6102a1600480360381019061029c9190611507565b6108cc565b005b6102bd60048036038101906102b891906118a8565b6108e6565b6040516102ca9190611722565b60405180910390f35b6102db610ac8565b6040516102e89190611556565b60405180910390f35b61030b60048036038101906103069190611507565b610ace565b005b61032760048036038101906103229190611484565b610ae8565b005b610343600480360381019061033e9190611968565b610d37565b005b61034d610d83565b60405161035a91906119f4565b60405180910390f35b61037d60048036038101906103789190611968565b610da7565b005b610387610e2a565b6040516103949190611a28565b60405180910390f35b6004544210156103d9576040517fe7620e5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600754421115610415576040517f4cfcdcb000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81816040518060400160405280601781526020017f53616e4672616e546f6b796f47656e65736973506173730000000000000000008152506040518060400160405280600181526020017f320000000000000000000000000000000000000000000000000000000000000081525061049084848484336108e6565b6104c6576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dc33e681336040518263ffffffff1660e01b8152600401610521919061174c565b602060405180830381865afa15801561053e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105629190611a58565b10610599576040517f3b8409f900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105a1610e4e565b3373ffffffffffffffffffffffffffffffffffffffff167f7118ab83a2b2bc62b19a93c5ed02d8becf5cd54473cac4fe1cd25a74f3b99e5e60405160405180910390a2505050505050565b6105f4610ede565b81600381905550806006819055505050565b60045481565b60065481565b60075481565b60055481565b610626610ede565b60006106328383610f5c565b90508060028484604051610647929190611ab5565b908152602001604051809103902081905550505050565b60006106e686866040518060400160405280601781526020017f53616e4672616e546f6b796f47656e657369735061737300000000000000000081525087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050866108e6565b905095945050505050565b60035481565b6106ff610ede565b6107096000611008565b565b600554421015610747576040517fceb841b900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600854421115610783576040517f24213ef500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dc33e681336040518263ffffffff1660e01b81526004016107de919061174c565b602060405180830381865afa1580156107fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081f9190611a58565b10610856576040517f3b8409f900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61085e610e4e565b3373ffffffffffffffffffffffffffffffffffffffff167fbd9b5e5fc252a7bb4f964f55a93c795937e8471d0fa71407d4e21838def13e3560405160405180910390a2565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6108d4610ede565b81600581905550806008819055505050565b60008073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361096f576040517f4ddd72a800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061097b85856110cc565b90506000817fe43c697341ea8ea0b5ff5866a588bda2e97cb8b0fd908388db3991e93bc7a1cb8587805190602001206040516020016109bc93929190611ace565b604051602081830303815290604052805190602001206040516020016109e3929190611b72565b6040516020818303038152906040528051906020012090506000610a5489898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508361114390919063ffffffff16565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ab75760009350505050610abf565b600193505050505b95945050505050565b60085481565b610ad6610ede565b81600481905550806007819055505050565b600354421015610b24576040517f6ea68eca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600654421115610b60576040517f5a94b98300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81816040518060400160405280601781526020017f53616e4672616e546f6b796f47656e65736973506173730000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250610bdb84848484336108e6565b610c11576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dc33e681336040518263ffffffff1660e01b8152600401610c6c919061174c565b602060405180830381865afa158015610c89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cad9190611a58565b10610ce4576040517f3b8409f900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cec610e4e565b3373ffffffffffffffffffffffffffffffffffffffff167fcad47ffe5c4cb6fb6d4750f45d5278aeb005a0deb8c223aea75241f4fc5f746160405160405180910390a2505050505050565b610d3f610ede565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610daf610ede565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1590611c2c565b60405180910390fd5b610e2781611008565b50565b7fe43c697341ea8ea0b5ff5866a588bda2e97cb8b0fd908388db3991e93bc7a1cb81565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340c10f193360016040518363ffffffff1660e01b8152600401610eaa929190611c87565b600060405180830381600087803b158015610ec457600080fd5b505af1158015610ed8573d6000803e3d6000fd5b50505050565b610ee661116a565b73ffffffffffffffffffffffffffffffffffffffff16610f046108a3565b73ffffffffffffffffffffffffffffffffffffffff1614610f5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5190611cfc565b60405180910390fd5b565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8383604051610f8f929190611d4c565b60405180910390206040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250805190602001204630604051602001610fea959493929190611d65565b60405160208183030381529060405280519060200120905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000806002846040516110df9190611e1e565b90815260200160405180910390205490506000801b81036111395783836040517fadc6f177000000000000000000000000000000000000000000000000000000008152600401611130929190611e6e565b60405180910390fd5b8091505092915050565b60008060006111528585611172565b9150915061115f816111c3565b819250505092915050565b600033905090565b60008060418351036111b35760008060006020860151925060408601519150606086015160001a90506111a787828585611329565b945094505050506111bc565b60006002915091505b9250929050565b600060048111156111d7576111d6611ea5565b5b8160048111156111ea576111e9611ea5565b5b0315611326576001600481111561120457611203611ea5565b5b81600481111561121757611216611ea5565b5b03611257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124e90611f20565b60405180910390fd5b6002600481111561126b5761126a611ea5565b5b81600481111561127e5761127d611ea5565b5b036112be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b590611f8c565b60405180910390fd5b600360048111156112d2576112d1611ea5565b5b8160048111156112e5576112e4611ea5565b5b03611325576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131c9061201e565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115611364576000600391509150611402565b600060018787878760405160008152602001604052604051611389949392919061205a565b6020604051602081039080840390855afa1580156113ab573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113f957600060019250925050611402565b80600092509250505b94509492505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126114445761144361141f565b5b8235905067ffffffffffffffff81111561146157611460611424565b5b60208301915083600182028301111561147d5761147c611429565b5b9250929050565b6000806020838503121561149b5761149a611415565b5b600083013567ffffffffffffffff8111156114b9576114b861141a565b5b6114c58582860161142e565b92509250509250929050565b6000819050919050565b6114e4816114d1565b81146114ef57600080fd5b50565b600081359050611501816114db565b92915050565b6000806040838503121561151e5761151d611415565b5b600061152c858286016114f2565b925050602061153d858286016114f2565b9150509250929050565b611550816114d1565b82525050565b600060208201905061156b6000830184611547565b92915050565b60008083601f8401126115875761158661141f565b5b8235905067ffffffffffffffff8111156115a4576115a3611424565b5b6020830191508360018202830111156115c0576115bf611429565b5b9250929050565b600080602083850312156115de576115dd611415565b5b600083013567ffffffffffffffff8111156115fc576115fb61141a565b5b61160885828601611571565b92509250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061163f82611614565b9050919050565b61164f81611634565b811461165a57600080fd5b50565b60008135905061166c81611646565b92915050565b60008060008060006060868803121561168e5761168d611415565b5b600086013567ffffffffffffffff8111156116ac576116ab61141a565b5b6116b88882890161142e565b9550955050602086013567ffffffffffffffff8111156116db576116da61141a565b5b6116e788828901611571565b935093505060406116fa8882890161165d565b9150509295509295909350565b60008115159050919050565b61171c81611707565b82525050565b60006020820190506117376000830184611713565b92915050565b61174681611634565b82525050565b6000602082019050611761600083018461173d565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6117b58261176c565b810181811067ffffffffffffffff821117156117d4576117d361177d565b5b80604052505050565b60006117e761140b565b90506117f382826117ac565b919050565b600067ffffffffffffffff8211156118135761181261177d565b5b61181c8261176c565b9050602081019050919050565b82818337600083830152505050565b600061184b611846846117f8565b6117dd565b90508281526020810184848401111561186757611866611767565b5b611872848285611829565b509392505050565b600082601f83011261188f5761188e61141f565b5b813561189f848260208601611838565b91505092915050565b6000806000806000608086880312156118c4576118c3611415565b5b600086013567ffffffffffffffff8111156118e2576118e161141a565b5b6118ee8882890161142e565b9550955050602086013567ffffffffffffffff8111156119115761191061141a565b5b61191d8882890161187a565b935050604086013567ffffffffffffffff81111561193e5761193d61141a565b5b61194a8882890161187a565b925050606061195b8882890161165d565b9150509295509295909350565b60006020828403121561197e5761197d611415565b5b600061198c8482850161165d565b91505092915050565b6000819050919050565b60006119ba6119b56119b084611614565b611995565b611614565b9050919050565b60006119cc8261199f565b9050919050565b60006119de826119c1565b9050919050565b6119ee816119d3565b82525050565b6000602082019050611a0960008301846119e5565b92915050565b6000819050919050565b611a2281611a0f565b82525050565b6000602082019050611a3d6000830184611a19565b92915050565b600081519050611a52816114db565b92915050565b600060208284031215611a6e57611a6d611415565b5b6000611a7c84828501611a43565b91505092915050565b600081905092915050565b6000611a9c8385611a85565b9350611aa9838584611829565b82840190509392505050565b6000611ac2828486611a90565b91508190509392505050565b6000606082019050611ae36000830186611a19565b611af0602083018561173d565b611afd6040830184611a19565b949350505050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611b3b600283611a85565b9150611b4682611b05565b600282019050919050565b6000819050919050565b611b6c611b6782611a0f565b611b51565b82525050565b6000611b7d82611b2e565b9150611b898285611b5b565b602082019150611b998284611b5b565b6020820191508190509392505050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611c16602683611ba9565b9150611c2182611bba565b604082019050919050565b60006020820190508181036000830152611c4581611c09565b9050919050565b6000819050919050565b6000611c71611c6c611c6784611c4c565b611995565b6114d1565b9050919050565b611c8181611c56565b82525050565b6000604082019050611c9c600083018561173d565b611ca96020830184611c78565b9392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611ce6602083611ba9565b9150611cf182611cb0565b602082019050919050565b60006020820190508181036000830152611d1581611cd9565b9050919050565b600081905092915050565b6000611d338385611d1c565b9350611d40838584611829565b82840190509392505050565b6000611d59828486611d27565b91508190509392505050565b600060a082019050611d7a6000830188611a19565b611d876020830187611a19565b611d946040830186611a19565b611da16060830185611547565b611dae608083018461173d565b9695505050505050565b600081519050919050565b60005b83811015611de1578082015181840152602081019050611dc6565b60008484015250505050565b6000611df882611db8565b611e028185611a85565b9350611e12818560208601611dc3565b80840191505092915050565b6000611e2a8284611ded565b915081905092915050565b6000611e4082611db8565b611e4a8185611ba9565b9350611e5a818560208601611dc3565b611e638161176c565b840191505092915050565b60006040820190508181036000830152611e888185611e35565b90508181036020830152611e9c8184611e35565b90509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611f0a601883611ba9565b9150611f1582611ed4565b602082019050919050565b60006020820190508181036000830152611f3981611efd565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611f76601f83611ba9565b9150611f8182611f40565b602082019050919050565b60006020820190508181036000830152611fa581611f69565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612008602283611ba9565b915061201382611fac565b604082019050919050565b6000602082019050818103600083015261203781611ffb565b9050919050565b600060ff82169050919050565b6120548161203e565b82525050565b600060808201905061206f6000830187611a19565b61207c602083018661204b565b6120896040830185611a19565b6120966060830184611a19565b9594505050505056fea26469706673582212204013fe2cf6e80f8188d61ba7d08e8009eb1703036f965eb28985c2082305598f64736f6c6343000811003300000000000000000000000052cd55e331931f14191e1f7a068421d89ade730b
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101365760003560e01c80638c874ebd116100b8578063bb373d941161007c578063bb373d94146102f1578063bc9c76411461030d578063be00df4a14610329578063d7c97fb414610345578063f2fde38b14610363578063fa4d280c1461037f57610136565b80638c874ebd1461025f5780638da5cb5b14610269578063911690e2146102875780639bb302d6146102a35780639f2f233c146102d357610136565b80633bc85578116100ff5780633bc85578146101cd5780633bfac8aa146101eb5780634e0922c2146102075780635353694814610237578063715018a61461025557610136565b8062b5cdfc1461013b5780630c11e26a146101575780631e46eed4146101735780632ce4a78b1461019157806337b1846c146101af575b600080fd5b61015560048036038101906101509190611484565b61039d565b005b610171600480360381019061016c9190611507565b6105ec565b005b61017b610606565b6040516101889190611556565b60405180910390f35b61019961060c565b6040516101a69190611556565b60405180910390f35b6101b7610612565b6040516101c49190611556565b60405180910390f35b6101d5610618565b6040516101e29190611556565b60405180910390f35b610205600480360381019061020091906115c7565b61061e565b005b610221600480360381019061021c9190611672565b61065e565b60405161022e9190611722565b60405180910390f35b61023f6106f1565b60405161024c9190611556565b60405180910390f35b61025d6106f7565b005b61026761070b565b005b6102716108a3565b60405161027e919061174c565b60405180910390f35b6102a1600480360381019061029c9190611507565b6108cc565b005b6102bd60048036038101906102b891906118a8565b6108e6565b6040516102ca9190611722565b60405180910390f35b6102db610ac8565b6040516102e89190611556565b60405180910390f35b61030b60048036038101906103069190611507565b610ace565b005b61032760048036038101906103229190611484565b610ae8565b005b610343600480360381019061033e9190611968565b610d37565b005b61034d610d83565b60405161035a91906119f4565b60405180910390f35b61037d60048036038101906103789190611968565b610da7565b005b610387610e2a565b6040516103949190611a28565b60405180910390f35b6004544210156103d9576040517fe7620e5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600754421115610415576040517f4cfcdcb000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81816040518060400160405280601781526020017f53616e4672616e546f6b796f47656e65736973506173730000000000000000008152506040518060400160405280600181526020017f320000000000000000000000000000000000000000000000000000000000000081525061049084848484336108e6565b6104c6576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60017f00000000000000000000000052cd55e331931f14191e1f7a068421d89ade730b73ffffffffffffffffffffffffffffffffffffffff1663dc33e681336040518263ffffffff1660e01b8152600401610521919061174c565b602060405180830381865afa15801561053e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105629190611a58565b10610599576040517f3b8409f900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6105a1610e4e565b3373ffffffffffffffffffffffffffffffffffffffff167f7118ab83a2b2bc62b19a93c5ed02d8becf5cd54473cac4fe1cd25a74f3b99e5e60405160405180910390a2505050505050565b6105f4610ede565b81600381905550806006819055505050565b60045481565b60065481565b60075481565b60055481565b610626610ede565b60006106328383610f5c565b90508060028484604051610647929190611ab5565b908152602001604051809103902081905550505050565b60006106e686866040518060400160405280601781526020017f53616e4672616e546f6b796f47656e657369735061737300000000000000000081525087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050866108e6565b905095945050505050565b60035481565b6106ff610ede565b6107096000611008565b565b600554421015610747576040517fceb841b900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600854421115610783576040517f24213ef500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60017f00000000000000000000000052cd55e331931f14191e1f7a068421d89ade730b73ffffffffffffffffffffffffffffffffffffffff1663dc33e681336040518263ffffffff1660e01b81526004016107de919061174c565b602060405180830381865afa1580156107fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081f9190611a58565b10610856576040517f3b8409f900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61085e610e4e565b3373ffffffffffffffffffffffffffffffffffffffff167fbd9b5e5fc252a7bb4f964f55a93c795937e8471d0fa71407d4e21838def13e3560405160405180910390a2565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6108d4610ede565b81600581905550806008819055505050565b60008073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361096f576040517f4ddd72a800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061097b85856110cc565b90506000817fe43c697341ea8ea0b5ff5866a588bda2e97cb8b0fd908388db3991e93bc7a1cb8587805190602001206040516020016109bc93929190611ace565b604051602081830303815290604052805190602001206040516020016109e3929190611b72565b6040516020818303038152906040528051906020012090506000610a5489898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508361114390919063ffffffff16565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ab75760009350505050610abf565b600193505050505b95945050505050565b60085481565b610ad6610ede565b81600481905550806007819055505050565b600354421015610b24576040517f6ea68eca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600654421115610b60576040517f5a94b98300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81816040518060400160405280601781526020017f53616e4672616e546f6b796f47656e65736973506173730000000000000000008152506040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250610bdb84848484336108e6565b610c11576040517f8baa579f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60017f00000000000000000000000052cd55e331931f14191e1f7a068421d89ade730b73ffffffffffffffffffffffffffffffffffffffff1663dc33e681336040518263ffffffff1660e01b8152600401610c6c919061174c565b602060405180830381865afa158015610c89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cad9190611a58565b10610ce4576040517f3b8409f900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cec610e4e565b3373ffffffffffffffffffffffffffffffffffffffff167fcad47ffe5c4cb6fb6d4750f45d5278aeb005a0deb8c223aea75241f4fc5f746160405160405180910390a2505050505050565b610d3f610ede565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f00000000000000000000000052cd55e331931f14191e1f7a068421d89ade730b81565b610daf610ede565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1590611c2c565b60405180910390fd5b610e2781611008565b50565b7fe43c697341ea8ea0b5ff5866a588bda2e97cb8b0fd908388db3991e93bc7a1cb81565b7f00000000000000000000000052cd55e331931f14191e1f7a068421d89ade730b73ffffffffffffffffffffffffffffffffffffffff166340c10f193360016040518363ffffffff1660e01b8152600401610eaa929190611c87565b600060405180830381600087803b158015610ec457600080fd5b505af1158015610ed8573d6000803e3d6000fd5b50505050565b610ee661116a565b73ffffffffffffffffffffffffffffffffffffffff16610f046108a3565b73ffffffffffffffffffffffffffffffffffffffff1614610f5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5190611cfc565b60405180910390fd5b565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8383604051610f8f929190611d4c565b60405180910390206040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250805190602001204630604051602001610fea959493929190611d65565b60405160208183030381529060405280519060200120905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000806002846040516110df9190611e1e565b90815260200160405180910390205490506000801b81036111395783836040517fadc6f177000000000000000000000000000000000000000000000000000000008152600401611130929190611e6e565b60405180910390fd5b8091505092915050565b60008060006111528585611172565b9150915061115f816111c3565b819250505092915050565b600033905090565b60008060418351036111b35760008060006020860151925060408601519150606086015160001a90506111a787828585611329565b945094505050506111bc565b60006002915091505b9250929050565b600060048111156111d7576111d6611ea5565b5b8160048111156111ea576111e9611ea5565b5b0315611326576001600481111561120457611203611ea5565b5b81600481111561121757611216611ea5565b5b03611257576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124e90611f20565b60405180910390fd5b6002600481111561126b5761126a611ea5565b5b81600481111561127e5761127d611ea5565b5b036112be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b590611f8c565b60405180910390fd5b600360048111156112d2576112d1611ea5565b5b8160048111156112e5576112e4611ea5565b5b03611325576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131c9061201e565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115611364576000600391509150611402565b600060018787878760405160008152602001604052604051611389949392919061205a565b6020604051602081039080840390855afa1580156113ab573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036113f957600060019250925050611402565b80600092509250505b94509492505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b60008083601f8401126114445761144361141f565b5b8235905067ffffffffffffffff81111561146157611460611424565b5b60208301915083600182028301111561147d5761147c611429565b5b9250929050565b6000806020838503121561149b5761149a611415565b5b600083013567ffffffffffffffff8111156114b9576114b861141a565b5b6114c58582860161142e565b92509250509250929050565b6000819050919050565b6114e4816114d1565b81146114ef57600080fd5b50565b600081359050611501816114db565b92915050565b6000806040838503121561151e5761151d611415565b5b600061152c858286016114f2565b925050602061153d858286016114f2565b9150509250929050565b611550816114d1565b82525050565b600060208201905061156b6000830184611547565b92915050565b60008083601f8401126115875761158661141f565b5b8235905067ffffffffffffffff8111156115a4576115a3611424565b5b6020830191508360018202830111156115c0576115bf611429565b5b9250929050565b600080602083850312156115de576115dd611415565b5b600083013567ffffffffffffffff8111156115fc576115fb61141a565b5b61160885828601611571565b92509250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061163f82611614565b9050919050565b61164f81611634565b811461165a57600080fd5b50565b60008135905061166c81611646565b92915050565b60008060008060006060868803121561168e5761168d611415565b5b600086013567ffffffffffffffff8111156116ac576116ab61141a565b5b6116b88882890161142e565b9550955050602086013567ffffffffffffffff8111156116db576116da61141a565b5b6116e788828901611571565b935093505060406116fa8882890161165d565b9150509295509295909350565b60008115159050919050565b61171c81611707565b82525050565b60006020820190506117376000830184611713565b92915050565b61174681611634565b82525050565b6000602082019050611761600083018461173d565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6117b58261176c565b810181811067ffffffffffffffff821117156117d4576117d361177d565b5b80604052505050565b60006117e761140b565b90506117f382826117ac565b919050565b600067ffffffffffffffff8211156118135761181261177d565b5b61181c8261176c565b9050602081019050919050565b82818337600083830152505050565b600061184b611846846117f8565b6117dd565b90508281526020810184848401111561186757611866611767565b5b611872848285611829565b509392505050565b600082601f83011261188f5761188e61141f565b5b813561189f848260208601611838565b91505092915050565b6000806000806000608086880312156118c4576118c3611415565b5b600086013567ffffffffffffffff8111156118e2576118e161141a565b5b6118ee8882890161142e565b9550955050602086013567ffffffffffffffff8111156119115761191061141a565b5b61191d8882890161187a565b935050604086013567ffffffffffffffff81111561193e5761193d61141a565b5b61194a8882890161187a565b925050606061195b8882890161165d565b9150509295509295909350565b60006020828403121561197e5761197d611415565b5b600061198c8482850161165d565b91505092915050565b6000819050919050565b60006119ba6119b56119b084611614565b611995565b611614565b9050919050565b60006119cc8261199f565b9050919050565b60006119de826119c1565b9050919050565b6119ee816119d3565b82525050565b6000602082019050611a0960008301846119e5565b92915050565b6000819050919050565b611a2281611a0f565b82525050565b6000602082019050611a3d6000830184611a19565b92915050565b600081519050611a52816114db565b92915050565b600060208284031215611a6e57611a6d611415565b5b6000611a7c84828501611a43565b91505092915050565b600081905092915050565b6000611a9c8385611a85565b9350611aa9838584611829565b82840190509392505050565b6000611ac2828486611a90565b91508190509392505050565b6000606082019050611ae36000830186611a19565b611af0602083018561173d565b611afd6040830184611a19565b949350505050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000611b3b600283611a85565b9150611b4682611b05565b600282019050919050565b6000819050919050565b611b6c611b6782611a0f565b611b51565b82525050565b6000611b7d82611b2e565b9150611b898285611b5b565b602082019150611b998284611b5b565b6020820191508190509392505050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611c16602683611ba9565b9150611c2182611bba565b604082019050919050565b60006020820190508181036000830152611c4581611c09565b9050919050565b6000819050919050565b6000611c71611c6c611c6784611c4c565b611995565b6114d1565b9050919050565b611c8181611c56565b82525050565b6000604082019050611c9c600083018561173d565b611ca96020830184611c78565b9392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000611ce6602083611ba9565b9150611cf182611cb0565b602082019050919050565b60006020820190508181036000830152611d1581611cd9565b9050919050565b600081905092915050565b6000611d338385611d1c565b9350611d40838584611829565b82840190509392505050565b6000611d59828486611d27565b91508190509392505050565b600060a082019050611d7a6000830188611a19565b611d876020830187611a19565b611d946040830186611a19565b611da16060830185611547565b611dae608083018461173d565b9695505050505050565b600081519050919050565b60005b83811015611de1578082015181840152602081019050611dc6565b60008484015250505050565b6000611df882611db8565b611e028185611a85565b9350611e12818560208601611dc3565b80840191505092915050565b6000611e2a8284611ded565b915081905092915050565b6000611e4082611db8565b611e4a8185611ba9565b9350611e5a818560208601611dc3565b611e638161176c565b840191505092915050565b60006040820190508181036000830152611e888185611e35565b90508181036020830152611e9c8184611e35565b90509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000611f0a601883611ba9565b9150611f1582611ed4565b602082019050919050565b60006020820190508181036000830152611f3981611efd565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000611f76601f83611ba9565b9150611f8182611f40565b602082019050919050565b60006020820190508181036000830152611fa581611f69565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612008602283611ba9565b915061201382611fac565b604082019050919050565b6000602082019050818103600083015261203781611ffb565b9050919050565b600060ff82169050919050565b6120548161203e565b82525050565b600060808201905061206f6000830187611a19565b61207c602083018661204b565b6120896040830185611a19565b6120966060830184611a19565b9594505050505056fea26469706673582212204013fe2cf6e80f8188d61ba7d08e8009eb1703036f965eb28985c2082305598f64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000052cd55e331931f14191e1f7a068421d89ade730b
-----Decoded View---------------
Arg [0] : _erc721ContractAddress (address): 0x52Cd55E331931F14191e1F7A068421D89aDe730b
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000052cd55e331931f14191e1f7a068421d89ade730b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.