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 173 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 16924085 | 591 days ago | IN | 0 ETH | 0.00078608 | ||||
Set Phase | 16918622 | 591 days ago | IN | 0 ETH | 0.00064888 | ||||
Mint | 16918577 | 591 days ago | IN | 0.01 ETH | 0.00443397 | ||||
Mint | 16918431 | 592 days ago | IN | 0.005 ETH | 0.00279095 | ||||
Mint | 16918301 | 592 days ago | IN | 0.005 ETH | 0.00255353 | ||||
Mint | 16918077 | 592 days ago | IN | 0.01 ETH | 0.00241065 | ||||
Mint | 16918069 | 592 days ago | IN | 0.005 ETH | 0.00244206 | ||||
Mint | 16917821 | 592 days ago | IN | 0.015 ETH | 0.00265633 | ||||
Mint | 16917782 | 592 days ago | IN | 0.005 ETH | 0.0021427 | ||||
Mint | 16917633 | 592 days ago | IN | 0.01 ETH | 0.00270283 | ||||
Mint | 16917465 | 592 days ago | IN | 0.015 ETH | 0.0020016 | ||||
Mint | 16917373 | 592 days ago | IN | 0.005 ETH | 0.00255572 | ||||
Mint | 16917188 | 592 days ago | IN | 0.005 ETH | 0.00222179 | ||||
Mint | 16916486 | 592 days ago | IN | 0.005 ETH | 0.00199812 | ||||
Mint | 16916432 | 592 days ago | IN | 0.015 ETH | 0.0018163 | ||||
Mint | 16916365 | 592 days ago | IN | 0.01 ETH | 0.00208022 | ||||
Mint | 16916356 | 592 days ago | IN | 0.01 ETH | 0.00209789 | ||||
Mint | 16915980 | 592 days ago | IN | 0.005 ETH | 0.00225734 | ||||
Mint | 16915873 | 592 days ago | IN | 0.005 ETH | 0.00235938 | ||||
Mint | 16915647 | 592 days ago | IN | 0.015 ETH | 0.00249169 | ||||
Mint | 16915399 | 592 days ago | IN | 0.01 ETH | 0.00162664 | ||||
Mint | 16915313 | 592 days ago | IN | 0.005 ETH | 0.00206416 | ||||
Mint | 16915061 | 592 days ago | IN | 0.005 ETH | 0.00206491 | ||||
Mint | 16914988 | 592 days ago | IN | 0.005 ETH | 0.00209855 | ||||
Mint | 16914977 | 592 days ago | IN | 0.015 ETH | 0.00224829 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
16924085 | 591 days ago | 1.605 ETH |
Loading...
Loading
Contract Name:
SalesStore
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import "../interface/IERC721SalesItem.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import "@openzeppelin/contracts/access/AccessControl.sol"; /////////////////////////////////////////////////////////////////////////// // Struct and Enum /////////////////////////////////////////////////////////////////////////// enum Phase { BeforeMint, Mint, Exchange } contract SalesStore is AccessControl { /////////////////////////////////////////////////////////////////////////// // Variables /////////////////////////////////////////////////////////////////////////// IERC721SalesItem public NFT; address public withdrawAddress = 0xFBb189698A54570d5c82399486049b6f5D008923; Phase public phase = Phase.BeforeMint; uint16 public currentSaleIndex; uint256 public cost = 0.005 ether; bytes32 public merkleRoot; uint256 public limitGroup; //0 start bool public burnAndMintMode; // default false; /////////////////////////////////////////////////////////////////////////// // Error functions /////////////////////////////////////////////////////////////////////////// error ZeroAddress(); error SaleIsPaused(); error NoAllocationInThisSale(); error InsufficientAllocation(); error InsufficientFunds(); error NotGroup(); error CallerNotUser(); error MintAmountIsZero(); error ArrayLengthNotMatch(); error NotTokenHolder(); /////////////////////////////////////////////////////////////////////////// // constructor /////////////////////////////////////////////////////////////////////////// constructor(address _NFTcontract) { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); NFT = IERC721SalesItem(_NFTcontract); } /////////////////////////////////////////////////////////////////////////// // Withdraw funds and set withdraw address /////////////////////////////////////////////////////////////////////////// function withdraw() public payable onlyAdmin { if (withdrawAddress == address(0)) revert ZeroAddress(); (bool os, ) = payable(withdrawAddress).call{ value: address(this).balance }(""); require(os); } function setWithdrawAddress(address _addr) external onlyAdmin { if (_addr == address(0)) revert ZeroAddress(); withdrawAddress = _addr; } /////////////////////////////////////////////////////////////////////////// // Setter functions : Sales controler /////////////////////////////////////////////////////////////////////////// function setPhase(Phase _newPhase) external onlyAdmin { //0:BeroreMint > Always Stop Sale (1 -> 0 , 2 -> 0) //1:Mint > Mint Start (0 -> 1) //2:Exchange > Exchange Start (0 -> 2) phase = _newPhase; } function setCurrentSaleIndex(uint16 _index) external onlyAdmin { currentSaleIndex = _index; } function increaseCurrentSaleIndex() external onlyAdmin returns(uint16) { uint16 newIndex = currentSaleIndex++; return newIndex; } /////////////////////////////////////////////////////////////////////////// // Setter functions : Sales specification setter /////////////////////////////////////////////////////////////////////////// function setCost(uint256 _value) external onlyAdmin { cost = _value; } function setMerkleRoot(bytes32 _value) external onlyAdmin { merkleRoot = _value; } function setLimitGroup(uint256 _value) external onlyAdmin{ limitGroup = _value; } function setBurnAndMintMode(bool _value) external onlyAdmin{ burnAndMintMode = _value; } /////////////////////////////////////////////////////////////////////////// // Essential getter functions /////////////////////////////////////////////////////////////////////////// modifier onlyAdmin() { _checkRole(DEFAULT_ADMIN_ROLE); _; } modifier whenOnMint() { if (phase != Phase.Mint) revert SaleIsPaused(); _; } modifier whenOnExchange() { if (phase != Phase.Exchange) revert SaleIsPaused(); _; } modifier wehenOnGroup(uint256 _group) { if (_group > limitGroup) revert NotGroup(); _; } modifier callerIsUser() { if (tx.origin != msg.sender) revert CallerNotUser(); _; } modifier whenValidUseAmount(uint256 _amount, uint256 _alloc, uint256 _group, bytes32[] calldata _proof) { // public sale if merkleRoot is 0 if(merkleRoot != 0){ if(MerkleProof.verifyCalldata( _proof, merkleRoot, keccak256(abi.encodePacked(msg.sender,uint248(_alloc),uint248(_group))) ) == false){ revert NoAllocationInThisSale(); } // Check remaining quantity of allocation uint256 _used = NFT.getConsumedAllocation(msg.sender, currentSaleIndex); if (_amount + _used > _alloc) revert InsufficientAllocation(); } if (_amount == 0) revert MintAmountIsZero(); _; } modifier whenEnoughFunds(uint256 value, uint256 amount) { if (value < (amount * cost)) revert InsufficientFunds(); _; } /////////////////////////////////////////////////////////////////////////// // Mint functions /////////////////////////////////////////////////////////////////////////// function mint(uint256 _amount, uint256 _alloc, uint256 _group, bytes32[] calldata _proof,uint256[] calldata _tokenIds) external payable whenOnMint wehenOnGroup(_group) callerIsUser whenValidUseAmount(_amount, _alloc, _group,_proof) whenEnoughFunds(msg.value, _amount) { NFT.addConsumedAllocation(msg.sender, currentSaleIndex, uint16(_amount)); if(burnAndMintMode == true){ if(_amount != _tokenIds.length) revert ArrayLengthNotMatch(); for (uint256 i = 0; i < _tokenIds.length; i++){ if (NFT.ownerOf(_tokenIds[i]) != msg.sender) revert NotTokenHolder(); NFT.sellerBurn(_tokenIds[i]); } } NFT.sellerMint(msg.sender, _amount); } function exchange(uint256[] calldata _tokenIds, uint256 _alloc, uint256 _group, bytes32[] calldata _proof) external payable whenOnExchange wehenOnGroup(_group) callerIsUser whenValidUseAmount(_tokenIds.length, _alloc, _group,_proof) whenEnoughFunds(msg.value, _tokenIds.length) { NFT.addConsumedAllocation(msg.sender, currentSaleIndex, uint16(_tokenIds.length)); for (uint256 i = 0; i < _tokenIds.length; i++){ if (NFT.ownerOf(_tokenIds[i]) != msg.sender) revert NotTokenHolder(); NFT.updateToken(_tokenIds[i]); } } /////////////////////////////////////////////////////////////////////////// // State functions /////////////////////////////////////////////////////////////////////////// function totalSupply() external view virtual returns(uint256){ return NFT.totalSupply(); } function getConsumedAllocation(address _minter) external view virtual returns(uint256){ return NFT.getConsumedAllocation(_minter, currentSaleIndex); } function getAllocRemain(address _minter, uint256 _alloc, uint256 _group, bytes32[] calldata _proof) external view virtual returns(uint256){ uint256 remainAlloc; if(MerkleProof.verifyCalldata( _proof, merkleRoot, keccak256(abi.encodePacked(_minter,uint248(_alloc),uint248(_group))) ) == true){ remainAlloc = _alloc - NFT.getConsumedAllocation(_minter, currentSaleIndex); } return remainAlloc; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(account), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// 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/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// 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.17; import "./ISalesItem.sol"; interface IERC721SalesItem is ISalesItem{ function ownerOf(uint256 tokenId) external view returns(address); function totalSupply() external view returns(uint256); // lock function setTokenLockEx(uint256[] calldata tokenIds, uint256 lockStatus) external; // function setWalletLockEx(address to, uint256 lockStatus) external; function getTokensUnderLock(uint256 start, uint256 end) external view returns (uint256[] memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import "@openzeppelin/contracts/utils/introspection/IERC165.sol"; interface ISalesItem is IERC165{ function sellerMint(address to, uint256 quantity) external; function sellerBurn(uint256 tokenId) external; function burned() external view returns(uint256); function getConsumedAllocation(address _target, uint16 _currentSaleIndex) external view returns(uint16); function setConsumedAllocation(address _target, uint16 _currentSaleIndex, uint16 _consumed) external; function addConsumedAllocation(address _target, uint16 _currentSaleIndex, uint16 _consumed) external; function updateToken(uint256 tokenId) external; }
{ "optimizer": { "enabled": true, "runs": 200 }, "viaIR": true, "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":"_NFTcontract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ArrayLengthNotMatch","type":"error"},{"inputs":[],"name":"CallerNotUser","type":"error"},{"inputs":[],"name":"InsufficientAllocation","type":"error"},{"inputs":[],"name":"InsufficientFunds","type":"error"},{"inputs":[],"name":"MintAmountIsZero","type":"error"},{"inputs":[],"name":"NoAllocationInThisSale","type":"error"},{"inputs":[],"name":"NotGroup","type":"error"},{"inputs":[],"name":"NotTokenHolder","type":"error"},{"inputs":[],"name":"SaleIsPaused","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT","outputs":[{"internalType":"contract IERC721SalesItem","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnAndMintMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSaleIndex","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"uint256","name":"_alloc","type":"uint256"},{"internalType":"uint256","name":"_group","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"exchange","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"},{"internalType":"uint256","name":"_alloc","type":"uint256"},{"internalType":"uint256","name":"_group","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"getAllocRemain","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"getConsumedAllocation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"increaseCurrentSaleIndex","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"limitGroup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_alloc","type":"uint256"},{"internalType":"uint256","name":"_group","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"phase","outputs":[{"internalType":"enum Phase","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setBurnAndMintMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_index","type":"uint16"}],"name":"setCurrentSaleIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setLimitGroup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_value","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Phase","name":"_newPhase","type":"uint8"}],"name":"setPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setWithdrawAddress","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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60803461011357601f6119a838819003918201601f191683019291906001600160401b0384118385101761011857816020928492604096875283398101031261011357516001600160a01b0381169081900361011357600280546001600160a81b03191673fbb189698a54570d5c82399486049b6f5d0089231790556611c37937e080006003556000808052602081815283822033835290528281205460ff16156100c7575b50600180546001600160a01b03191691909117905551611879908161012f8239f35b80805280602052828120338252602052828120600160ff19825416179055339033907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8180a4386100a5565b600080fd5b634e487b7160e01b600052604160045260246000fdfe60806040908082526004918236101561001757600080fd5b600091823560e01c90816285bb6f146111505750806301f1118214610df557806301ffc9a714610d9f57806313faede614610d815780631581b60014610d5957806318160ddd14610cca578063248a9ca314610ca0578063281c6fc714610b6a5780632eb4a7ab14610b4c5780632f2ff15d14610aa157806336568abe14610a105780633ab1a494146109b35780633ccfd60b1461091757806344a0d68a146108f5578063460634ea146108905780637c0b8de2146108685780637cb6475914610846578063834ebdbc1461079a578063860bc37f1461077857806391d1485414610733578063a217fddf14610719578063b1c9fe6e146106d8578063bd14c3d0146106b3578063c03afb591461066e578063d547741f1461062c578063e1a867fc146105e3578063e39e0269146105ac578063e7a4bd151461058e5763f90bf48a1461016357600080fd5b60a036600319011261058a5760248035938035929167ffffffffffffffff6044356064358281116104185761019b9036908601611171565b919092608435908111610586576101b59036908701611171565b9990916002549460ff8660a01c16946003861015610574576001809603610564576005548311610554573332036105445788549081610446575b5050505050861561043657610206600354886115eb565b34106104265781546001600160a01b0393908416803b1561039b578751633254328960e11b81523381890190815260a89390931c61ffff90811660208501528a166040840152918a91839182908490829060600103925af1801561041c57908991610404575b50508160ff600654161515146102da575b508697505416803b156102d6578592836044928651978895869463bc98a00f60e01b865233908601528401525af19081156102cd57506102ba5750f35b6102c39061150f565b6102ca5780f35b80fd5b513d84823e3d90fd5b8580fd5b8887036103f45787985b808a106102f1575061027d565b83835416996103018183856117b6565b358851906331a9108f60e11b825288820152808c818960209485935afa9182156103ea578c926103bd575b505085339116036103ad57899a6103448284866117b6565b35813b156103a9578b90888a838d51958694859363526d5ca760e01b85528401525af1801561039f57908b91610387575b5050610380906117a7565b99506102e4565b6103909061150f565b61039b578938610375565b8980fd5b89513d8d823e3d90fd5b8b80fd5b875163e131a43f60e01b81528790fd5b6103dc9250803d106103e3575b6103d48183611555565b8101906117c6565b388061032c565b503d6103ca565b8a513d8e823e3d90fd5b855163ed882f7160e01b81528590fd5b61040d9061150f565b61041857873861026c565b8780fd5b87513d8b823e3d90fd5b855163356680b760e01b81528590fd5b8551631e97cd6360e21b81528590fd5b610483938b5161047a8161046c602082019460018060f81b03809116908b163387611757565b03601f198101835282611555565b519020926117e5565b156105345782548751634c14f9c560e01b81523388820190815261ffff60a888901c81166020808401919091529093909183916001600160a01b0316908290819060400103915afa90811561039f57906104e792918c91610506575b501689611614565b116104f65738808080806101ef565b85516337cb51dd60e21b81528590fd5b610527915060203d811161052d575b61051f8183611555565b81019061178d565b386104df565b503d610515565b8651632527687b60e21b81528690fd5b8951631c4e317f60e11b81528990fd5b89516370243abd60e11b81528990fd5b8951631c7324b560e21b81528990fd5b634e487b7160e01b8c5260218952878cfd5b8880fd5b5080fd5b503461058a578160031936011261058a576020906005549051908152f35b82843461058a57602036600319011261058a573580151580910361058a576105d26111d3565b60ff80196006541691161760065580f35b82843461058a57602036600319011261058a573561ffff8116810361058a5761060a6111d3565b6002805461ffff60a81b191660a89290921b61ffff60a81b1691909117905580f35b5082903461066a578060031936011261066a57610667913561066260016106516111bd565b9383875286602052862001546113e1565b611577565b80f35b8280fd5b82843461058a57602036600319011261058a5735600381101561058a576106936111d3565b6002805460ff60a01b191660a09290921b60ff60a01b1691909117905580f35b503461058a578160031936011261058a5760209061ffff60025460a81c169051908152f35b503461058a578160031936011261058a5760ff60025460a01c16905191600382101561070657602083838152f35b634e487b7160e01b815260218452602490fd5b503461058a578160031936011261058a5751908152602090f35b50823461066a578160031936011261066a57816020936107516111bd565b92358152808552209060018060a01b0316600052825260ff81600020541690519015158152f35b82843461058a57602036600319011261058a576107936111d3565b3560055580f35b50823461066a57602036600319011261066a576108019160206107bb6111a7565b6001546002548451634c14f9c560e01b81526001600160a01b0393841696810196875261ffff60a89290921c821660208801529690958793909216918391829160400190565b03915afa92831561083c576020949361081d575b505191168152f35b610835919350843d811161052d5761051f8183611555565b9184610815565b81513d86823e3d90fd5b82843461058a57602036600319011261058a576108616111d3565b8035905580f35b503461058a578160031936011261058a5760015490516001600160a01b039091168152602090f35b503461058a578160031936011261058a576108a96111d3565b60025461ffff92838260a81c169384146108e2575061ffff60a81b19166001830160a81b61ffff60a81b16176002555190815260209150f35b634e487b7160e01b815260118552602490fd5b82843461058a57602036600319011261058a576109106111d3565b3560035580f35b50828260031936011261066a5761092c6111d3565b6002546001600160a01b031680156109a457838080809347905af1913d1561099d573d9167ffffffffffffffff831161098857505190610976601f8201601f191660200183611555565b81528260203d92013e5b156102ca5780f35b604190634e487b7160e01b6000525260246000fd5b5050610980565b50905163d92e233d60e01b8152fd5b50823461066a57602036600319011261066a576109ce6111a7565b6109d66111d3565b6001600160a01b0316918215610a035750506bffffffffffffffffffffffff60a01b600254161760025580f35b5163d92e233d60e01b8152fd5b50913461058a578260031936011261058a57610a2a6111bd565b90336001600160a01b03831603610a4657906106679135611577565b608490602085519162461bcd60e51b8352820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152fd5b50823461066a578160031936011261066a573590610abd6111bd565b9082845283602052610ad4600182862001546113e1565b828452836020528084209160018060a01b0316918260005260205260ff81600020541615610b00578380f35b8284528360205280842082600052602052600020600160ff1982541617905533917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8480a48180808380f35b50823461066a578260031936011261066a5760209250549051908152f35b5082903461066a57608036600319011261066a57610b866111a7565b606435936024359167ffffffffffffffff861161058a576001610bb0610bda969736908901611171565b969084978954908851602081019061047a8161046c8c8a8060f81b03806044351691168c87611757565b151514610bec575b6020858551908152f35b6001546002548551634c14f9c560e01b81526001600160a01b0393841689820190815261ffff60a89390931c8316602080830191909152979850959694959194909390928492839003604001918391165afa908115610c96578391610c78575b50168203918211610c6557506020925090838080610be2565b634e487b7160e01b815260118452602490fd5b610c90915060203d811161052d5761051f8183611555565b86610c4c565b85513d85823e3d90fd5b50823461066a57602036600319011261066a57816020936001923581528085522001549051908152f35b5082903461066a578260031936011261066a5760015481516318160ddd60e01b81529260209184919082906001600160a01b03165afa918215610d4f578392610d18575b6020838351908152f35b9091506020813d8211610d47575b81610d3360209383611555565b8101031261066a5760209250519083610d0e565b3d9150610d26565b81513d85823e3d90fd5b503461058a578160031936011261058a5760025490516001600160a01b039091168152602090f35b503461058a578160031936011261058a576020906003549051908152f35b50823461066a57602036600319011261066a57359063ffffffff60e01b821680920361066a5760209250637965db0b60e01b8214918215610de4575b50519015158152f35b6301ffc9a760e01b14915083610ddb565b5082608036600319011261066a5767ffffffffffffffff91813583811161114c57610e239036908401611171565b60249391939081356044359660643590811161058657610e469036908601611171565b97906002549860ff8a60a01c16600381101561113a5760020361112a57600554831161111a5733320361110a5786549081611028575b5050505050801561101857610e93600354826115eb565b34106110085760018060a01b0394876001978789541690813b1561066a578751633254328960e11b81523388820190815260a89290921c61ffff9081166020840152861660408301529291839182908490829060600103925af18015610ffe57610feb575b50875b828110610f06578880f35b86885416610f158285856117b6565b87516331a9108f60e11b815290358782015260209081818881865afa918215610fe1578c92610fc4575b50508833911603610fb4578990610f578386866117b6565b35813b1561066a5782918783928b519485938492638d5b98d560e01b84528d8401525af18015610faa57610f96575b5050610f91906117a7565b610efb565b610f9f9061150f565b61058657888a610f86565b88513d84823e3d90fd5b865163e131a43f60e01b81528690fd5b610fda9250803d106103e3576103d48183611555565b8b80610f3f565b89513d8e823e3d90fd5b610ff79098919861150f565b9688610ef8565b86513d8b823e3d90fd5b835163356680b760e01b81528390fd5b8351631e97cd6360e21b81528390fd5b61104e93895161047a8161046c602082019460018060f81b03809116908b163387611757565b156110fa576001548551634c14f9c560e01b81523386820190815261ffff60a88b901c81166020808401919091529093909183916001600160a01b0316908290819060400103915afa9081156110f057906110b392918b916110d2575b501683611614565b116110c2578780808080610e7c565b83516337cb51dd60e21b81528390fd5b6110ea915060203d811161052d5761051f8183611555565b8b6110ab565b87513d8c823e3d90fd5b8451632527687b60e21b81528490fd5b8751631c4e317f60e11b81528790fd5b87516370243abd60e11b81528790fd5b8751631c7324b560e21b81528790fd5b634e487b7160e01b8c5260218852868cfd5b8480fd5b83903461058a578160031936011261058a5760209060ff6006541615158152f35b9181601f840112156111a25782359167ffffffffffffffff83116111a2576020808501948460051b0101116111a257565b600080fd5b600435906001600160a01b03821682036111a257565b602435906001600160a01b03821682036111a257565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb560209081526040808320549092919060ff161561121657505050565b61121f33611648565b83518361122b82611539565b604282528382019460603687378251156113cd57603086538251906001918210156113cd5790607860218501536041915b81831161135f5750505061131d57846112eb604861130f9360449798519889916112dc8984019876020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b8a526112b3815180928d6037890191016114ec565b8401917001034b99036b4b9b9b4b733903937b6329607d1b6037840152518093868401906114ec565b01036028810189520187611555565b5194859362461bcd60e51b85526004850152518092816024860152858501906114ec565b601f01601f19168101030190fd5b60648386519062461bcd60e51b825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b909192600f811660108110156113b9576f181899199a1a9b1b9c1cb0b131b232b360811b901a61138f8587611621565b5360041c9280156113a55760001901919061125c565b634e487b7160e01b82526011600452602482fd5b634e487b7160e01b83526032600452602483fd5b634e487b7160e01b81526032600452602490fd5b60008181526020818152604092838320338452825260ff8484205416156114085750505050565b61141133611648565b9084519061141e82611539565b604282528382019460603687378251156113cd57603086538251906001918210156113cd5790607860218501536041915b8183116114a65750505061131d57846112eb604861130f9360449798519889916112dc8984019876020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b8a526112b3815180928d6037890191016114ec565b909192600f811660108110156113b9576f181899199a1a9b1b9c1cb0b131b232b360811b901a6114d68587611621565b5360041c9280156113a55760001901919061144f565b60005b8381106114ff5750506000910152565b81810151838201526020016114ef565b67ffffffffffffffff811161152357604052565b634e487b7160e01b600052604160045260246000fd5b6080810190811067ffffffffffffffff82111761152357604052565b90601f8019910116810190811067ffffffffffffffff82111761152357604052565b9060009180835282602052604083209160018060a01b03169182845260205260ff6040842054166115a757505050565b80835282602052604083208284526020526040832060ff1981541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b339380a4565b818102929181159184041417156115fe57565b634e487b7160e01b600052601160045260246000fd5b919082018092116115fe57565b908151811015611632570160200190565b634e487b7160e01b600052603260045260246000fd5b604051906060820182811067ffffffffffffffff82111761152357604052602a82526020820160403682378251156116325760309053815160019081101561163257607860218401536029905b8082116116e95750506116a55790565b606460405162461bcd60e51b815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015611742576f181899199a1a9b1b9c1cb0b131b232b360811b901a6117188486611621565b5360041c91801561172d576000190190611695565b60246000634e487b7160e01b81526011600452fd5b60246000634e487b7160e01b81526032600452fd5b9190926052936bffffffffffffffffffffffff199060601b16835260ff19809260081b16601484015260081b1660338201520190565b908160209103126111a2575161ffff811681036111a25790565b60001981146115fe5760010190565b91908110156116325760051b0190565b908160209103126111a257516001600160a01b03811681036111a25790565b9192916000915b8083106117fa575050501490565b9091926118088483856117b6565b3590600082821015611831575060005260205261182a60406000205b936117a7565b91906117ec565b60409161182a9382526020522061182456fea2646970667358221220126c2b902674d645437e90c33fb92db04a767e263ddcabf6603f8b8de75bcd9264736f6c634300081100330000000000000000000000008110cebf7ac8717ecf1f3b0bcf51a47591c457d5
Deployed Bytecode
0x60806040908082526004918236101561001757600080fd5b600091823560e01c90816285bb6f146111505750806301f1118214610df557806301ffc9a714610d9f57806313faede614610d815780631581b60014610d5957806318160ddd14610cca578063248a9ca314610ca0578063281c6fc714610b6a5780632eb4a7ab14610b4c5780632f2ff15d14610aa157806336568abe14610a105780633ab1a494146109b35780633ccfd60b1461091757806344a0d68a146108f5578063460634ea146108905780637c0b8de2146108685780637cb6475914610846578063834ebdbc1461079a578063860bc37f1461077857806391d1485414610733578063a217fddf14610719578063b1c9fe6e146106d8578063bd14c3d0146106b3578063c03afb591461066e578063d547741f1461062c578063e1a867fc146105e3578063e39e0269146105ac578063e7a4bd151461058e5763f90bf48a1461016357600080fd5b60a036600319011261058a5760248035938035929167ffffffffffffffff6044356064358281116104185761019b9036908601611171565b919092608435908111610586576101b59036908701611171565b9990916002549460ff8660a01c16946003861015610574576001809603610564576005548311610554573332036105445788549081610446575b5050505050861561043657610206600354886115eb565b34106104265781546001600160a01b0393908416803b1561039b578751633254328960e11b81523381890190815260a89390931c61ffff90811660208501528a166040840152918a91839182908490829060600103925af1801561041c57908991610404575b50508160ff600654161515146102da575b508697505416803b156102d6578592836044928651978895869463bc98a00f60e01b865233908601528401525af19081156102cd57506102ba5750f35b6102c39061150f565b6102ca5780f35b80fd5b513d84823e3d90fd5b8580fd5b8887036103f45787985b808a106102f1575061027d565b83835416996103018183856117b6565b358851906331a9108f60e11b825288820152808c818960209485935afa9182156103ea578c926103bd575b505085339116036103ad57899a6103448284866117b6565b35813b156103a9578b90888a838d51958694859363526d5ca760e01b85528401525af1801561039f57908b91610387575b5050610380906117a7565b99506102e4565b6103909061150f565b61039b578938610375565b8980fd5b89513d8d823e3d90fd5b8b80fd5b875163e131a43f60e01b81528790fd5b6103dc9250803d106103e3575b6103d48183611555565b8101906117c6565b388061032c565b503d6103ca565b8a513d8e823e3d90fd5b855163ed882f7160e01b81528590fd5b61040d9061150f565b61041857873861026c565b8780fd5b87513d8b823e3d90fd5b855163356680b760e01b81528590fd5b8551631e97cd6360e21b81528590fd5b610483938b5161047a8161046c602082019460018060f81b03809116908b163387611757565b03601f198101835282611555565b519020926117e5565b156105345782548751634c14f9c560e01b81523388820190815261ffff60a888901c81166020808401919091529093909183916001600160a01b0316908290819060400103915afa90811561039f57906104e792918c91610506575b501689611614565b116104f65738808080806101ef565b85516337cb51dd60e21b81528590fd5b610527915060203d811161052d575b61051f8183611555565b81019061178d565b386104df565b503d610515565b8651632527687b60e21b81528690fd5b8951631c4e317f60e11b81528990fd5b89516370243abd60e11b81528990fd5b8951631c7324b560e21b81528990fd5b634e487b7160e01b8c5260218952878cfd5b8880fd5b5080fd5b503461058a578160031936011261058a576020906005549051908152f35b82843461058a57602036600319011261058a573580151580910361058a576105d26111d3565b60ff80196006541691161760065580f35b82843461058a57602036600319011261058a573561ffff8116810361058a5761060a6111d3565b6002805461ffff60a81b191660a89290921b61ffff60a81b1691909117905580f35b5082903461066a578060031936011261066a57610667913561066260016106516111bd565b9383875286602052862001546113e1565b611577565b80f35b8280fd5b82843461058a57602036600319011261058a5735600381101561058a576106936111d3565b6002805460ff60a01b191660a09290921b60ff60a01b1691909117905580f35b503461058a578160031936011261058a5760209061ffff60025460a81c169051908152f35b503461058a578160031936011261058a5760ff60025460a01c16905191600382101561070657602083838152f35b634e487b7160e01b815260218452602490fd5b503461058a578160031936011261058a5751908152602090f35b50823461066a578160031936011261066a57816020936107516111bd565b92358152808552209060018060a01b0316600052825260ff81600020541690519015158152f35b82843461058a57602036600319011261058a576107936111d3565b3560055580f35b50823461066a57602036600319011261066a576108019160206107bb6111a7565b6001546002548451634c14f9c560e01b81526001600160a01b0393841696810196875261ffff60a89290921c821660208801529690958793909216918391829160400190565b03915afa92831561083c576020949361081d575b505191168152f35b610835919350843d811161052d5761051f8183611555565b9184610815565b81513d86823e3d90fd5b82843461058a57602036600319011261058a576108616111d3565b8035905580f35b503461058a578160031936011261058a5760015490516001600160a01b039091168152602090f35b503461058a578160031936011261058a576108a96111d3565b60025461ffff92838260a81c169384146108e2575061ffff60a81b19166001830160a81b61ffff60a81b16176002555190815260209150f35b634e487b7160e01b815260118552602490fd5b82843461058a57602036600319011261058a576109106111d3565b3560035580f35b50828260031936011261066a5761092c6111d3565b6002546001600160a01b031680156109a457838080809347905af1913d1561099d573d9167ffffffffffffffff831161098857505190610976601f8201601f191660200183611555565b81528260203d92013e5b156102ca5780f35b604190634e487b7160e01b6000525260246000fd5b5050610980565b50905163d92e233d60e01b8152fd5b50823461066a57602036600319011261066a576109ce6111a7565b6109d66111d3565b6001600160a01b0316918215610a035750506bffffffffffffffffffffffff60a01b600254161760025580f35b5163d92e233d60e01b8152fd5b50913461058a578260031936011261058a57610a2a6111bd565b90336001600160a01b03831603610a4657906106679135611577565b608490602085519162461bcd60e51b8352820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152fd5b50823461066a578160031936011261066a573590610abd6111bd565b9082845283602052610ad4600182862001546113e1565b828452836020528084209160018060a01b0316918260005260205260ff81600020541615610b00578380f35b8284528360205280842082600052602052600020600160ff1982541617905533917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8480a48180808380f35b50823461066a578260031936011261066a5760209250549051908152f35b5082903461066a57608036600319011261066a57610b866111a7565b606435936024359167ffffffffffffffff861161058a576001610bb0610bda969736908901611171565b969084978954908851602081019061047a8161046c8c8a8060f81b03806044351691168c87611757565b151514610bec575b6020858551908152f35b6001546002548551634c14f9c560e01b81526001600160a01b0393841689820190815261ffff60a89390931c8316602080830191909152979850959694959194909390928492839003604001918391165afa908115610c96578391610c78575b50168203918211610c6557506020925090838080610be2565b634e487b7160e01b815260118452602490fd5b610c90915060203d811161052d5761051f8183611555565b86610c4c565b85513d85823e3d90fd5b50823461066a57602036600319011261066a57816020936001923581528085522001549051908152f35b5082903461066a578260031936011261066a5760015481516318160ddd60e01b81529260209184919082906001600160a01b03165afa918215610d4f578392610d18575b6020838351908152f35b9091506020813d8211610d47575b81610d3360209383611555565b8101031261066a5760209250519083610d0e565b3d9150610d26565b81513d85823e3d90fd5b503461058a578160031936011261058a5760025490516001600160a01b039091168152602090f35b503461058a578160031936011261058a576020906003549051908152f35b50823461066a57602036600319011261066a57359063ffffffff60e01b821680920361066a5760209250637965db0b60e01b8214918215610de4575b50519015158152f35b6301ffc9a760e01b14915083610ddb565b5082608036600319011261066a5767ffffffffffffffff91813583811161114c57610e239036908401611171565b60249391939081356044359660643590811161058657610e469036908601611171565b97906002549860ff8a60a01c16600381101561113a5760020361112a57600554831161111a5733320361110a5786549081611028575b5050505050801561101857610e93600354826115eb565b34106110085760018060a01b0394876001978789541690813b1561066a578751633254328960e11b81523388820190815260a89290921c61ffff9081166020840152861660408301529291839182908490829060600103925af18015610ffe57610feb575b50875b828110610f06578880f35b86885416610f158285856117b6565b87516331a9108f60e11b815290358782015260209081818881865afa918215610fe1578c92610fc4575b50508833911603610fb4578990610f578386866117b6565b35813b1561066a5782918783928b519485938492638d5b98d560e01b84528d8401525af18015610faa57610f96575b5050610f91906117a7565b610efb565b610f9f9061150f565b61058657888a610f86565b88513d84823e3d90fd5b865163e131a43f60e01b81528690fd5b610fda9250803d106103e3576103d48183611555565b8b80610f3f565b89513d8e823e3d90fd5b610ff79098919861150f565b9688610ef8565b86513d8b823e3d90fd5b835163356680b760e01b81528390fd5b8351631e97cd6360e21b81528390fd5b61104e93895161047a8161046c602082019460018060f81b03809116908b163387611757565b156110fa576001548551634c14f9c560e01b81523386820190815261ffff60a88b901c81166020808401919091529093909183916001600160a01b0316908290819060400103915afa9081156110f057906110b392918b916110d2575b501683611614565b116110c2578780808080610e7c565b83516337cb51dd60e21b81528390fd5b6110ea915060203d811161052d5761051f8183611555565b8b6110ab565b87513d8c823e3d90fd5b8451632527687b60e21b81528490fd5b8751631c4e317f60e11b81528790fd5b87516370243abd60e11b81528790fd5b8751631c7324b560e21b81528790fd5b634e487b7160e01b8c5260218852868cfd5b8480fd5b83903461058a578160031936011261058a5760209060ff6006541615158152f35b9181601f840112156111a25782359167ffffffffffffffff83116111a2576020808501948460051b0101116111a257565b600080fd5b600435906001600160a01b03821682036111a257565b602435906001600160a01b03821682036111a257565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb560209081526040808320549092919060ff161561121657505050565b61121f33611648565b83518361122b82611539565b604282528382019460603687378251156113cd57603086538251906001918210156113cd5790607860218501536041915b81831161135f5750505061131d57846112eb604861130f9360449798519889916112dc8984019876020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b8a526112b3815180928d6037890191016114ec565b8401917001034b99036b4b9b9b4b733903937b6329607d1b6037840152518093868401906114ec565b01036028810189520187611555565b5194859362461bcd60e51b85526004850152518092816024860152858501906114ec565b601f01601f19168101030190fd5b60648386519062461bcd60e51b825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b909192600f811660108110156113b9576f181899199a1a9b1b9c1cb0b131b232b360811b901a61138f8587611621565b5360041c9280156113a55760001901919061125c565b634e487b7160e01b82526011600452602482fd5b634e487b7160e01b83526032600452602483fd5b634e487b7160e01b81526032600452602490fd5b60008181526020818152604092838320338452825260ff8484205416156114085750505050565b61141133611648565b9084519061141e82611539565b604282528382019460603687378251156113cd57603086538251906001918210156113cd5790607860218501536041915b8183116114a65750505061131d57846112eb604861130f9360449798519889916112dc8984019876020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b8a526112b3815180928d6037890191016114ec565b909192600f811660108110156113b9576f181899199a1a9b1b9c1cb0b131b232b360811b901a6114d68587611621565b5360041c9280156113a55760001901919061144f565b60005b8381106114ff5750506000910152565b81810151838201526020016114ef565b67ffffffffffffffff811161152357604052565b634e487b7160e01b600052604160045260246000fd5b6080810190811067ffffffffffffffff82111761152357604052565b90601f8019910116810190811067ffffffffffffffff82111761152357604052565b9060009180835282602052604083209160018060a01b03169182845260205260ff6040842054166115a757505050565b80835282602052604083208284526020526040832060ff1981541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b339380a4565b818102929181159184041417156115fe57565b634e487b7160e01b600052601160045260246000fd5b919082018092116115fe57565b908151811015611632570160200190565b634e487b7160e01b600052603260045260246000fd5b604051906060820182811067ffffffffffffffff82111761152357604052602a82526020820160403682378251156116325760309053815160019081101561163257607860218401536029905b8082116116e95750506116a55790565b606460405162461bcd60e51b815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015611742576f181899199a1a9b1b9c1cb0b131b232b360811b901a6117188486611621565b5360041c91801561172d576000190190611695565b60246000634e487b7160e01b81526011600452fd5b60246000634e487b7160e01b81526032600452fd5b9190926052936bffffffffffffffffffffffff199060601b16835260ff19809260081b16601484015260081b1660338201520190565b908160209103126111a2575161ffff811681036111a25790565b60001981146115fe5760010190565b91908110156116325760051b0190565b908160209103126111a257516001600160a01b03811681036111a25790565b9192916000915b8083106117fa575050501490565b9091926118088483856117b6565b3590600082821015611831575060005260205261182a60406000205b936117a7565b91906117ec565b60409161182a9382526020522061182456fea2646970667358221220126c2b902674d645437e90c33fb92db04a767e263ddcabf6603f8b8de75bcd9264736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008110cebf7ac8717ecf1f3b0bcf51a47591c457d5
-----Decoded View---------------
Arg [0] : _NFTcontract (address): 0x8110CEbF7ac8717eCF1F3b0Bcf51A47591c457D5
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000008110cebf7ac8717ecf1f3b0bcf51a47591c457d5
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.