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 5,012 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Buy | 13776519 | 1111 days ago | IN | 0.1 ETH | 0.00131171 | ||||
Buy | 13766199 | 1112 days ago | IN | 0.1 ETH | 0.00275361 | ||||
Buy | 13766199 | 1112 days ago | IN | 0.1 ETH | 0.00275361 | ||||
Buy | 13766199 | 1112 days ago | IN | 0.1 ETH | 0.00275361 | ||||
Buy | 13766199 | 1112 days ago | IN | 0.1 ETH | 0.00275361 | ||||
Buy | 13766199 | 1112 days ago | IN | 0.1 ETH | 0.00275361 | ||||
Buy | 13660274 | 1129 days ago | IN | 0.3 ETH | 0.0048876 | ||||
Buy | 13660267 | 1129 days ago | IN | 0.4 ETH | 0.00518095 | ||||
Buy | 13605735 | 1138 days ago | IN | 0.1 ETH | 0.00294022 | ||||
Buy | 13587779 | 1141 days ago | IN | 0 ETH | 0.00327947 | ||||
Buy | 13586618 | 1141 days ago | IN | 0 ETH | 0.005233 | ||||
Roll Start Index | 13584432 | 1141 days ago | IN | 0 ETH | 0.00568787 | ||||
Roll Start Index | 13584430 | 1141 days ago | IN | 0 ETH | 0.00976087 | ||||
Buy | 13584378 | 1141 days ago | IN | 0 ETH | 0.0311496 | ||||
Buy | 13584375 | 1141 days ago | IN | 0 ETH | 0.00872848 | ||||
Buy | 13584374 | 1141 days ago | IN | 0 ETH | 0.03776829 | ||||
Buy | 13584344 | 1141 days ago | IN | 0 ETH | 0.04165254 | ||||
Buy | 13584322 | 1141 days ago | IN | 0 ETH | 0.04887757 | ||||
Buy | 13584322 | 1141 days ago | IN | 0 ETH | 0.04965529 | ||||
Buy | 13584273 | 1141 days ago | IN | 0 ETH | 0.0527146 | ||||
Buy | 13584250 | 1141 days ago | IN | 0 ETH | 0.03301407 | ||||
Buy | 13584195 | 1141 days ago | IN | 0 ETH | 0.02380656 | ||||
Buy | 13584189 | 1141 days ago | IN | 0 ETH | 0.02696543 | ||||
Buy | 13584164 | 1141 days ago | IN | 0 ETH | 0.02576614 | ||||
Buy | 13584115 | 1141 days ago | IN | 0 ETH | 0.02206726 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
13578597 | 1142 days ago | 424.1 ETH | ||||
13577675 | 1142 days ago | 0.25 ETH | ||||
13577675 | 1142 days ago | 0.05 ETH | ||||
13577675 | 1142 days ago | 0.25 ETH | ||||
13577670 | 1142 days ago | 0.25 ETH | ||||
13577670 | 1142 days ago | 0.1 ETH | ||||
13577670 | 1142 days ago | 0.05 ETH | ||||
13577669 | 1142 days ago | 0.05 ETH | ||||
13577669 | 1142 days ago | 0.25 ETH | ||||
13577669 | 1142 days ago | 0.25 ETH | ||||
13577664 | 1142 days ago | 0.1 ETH | ||||
13577664 | 1142 days ago | 0.05 ETH | ||||
13577664 | 1142 days ago | 0.25 ETH | ||||
13577664 | 1142 days ago | 0.25 ETH | ||||
13577664 | 1142 days ago | 0.1 ETH | ||||
13577663 | 1142 days ago | 0.2 ETH | ||||
13577663 | 1142 days ago | 0.05 ETH | ||||
13577663 | 1142 days ago | 0.05 ETH | ||||
13577663 | 1142 days ago | 0.1 ETH | ||||
13577663 | 1142 days ago | 0.2 ETH | ||||
13577663 | 1142 days ago | 0.05 ETH | ||||
13577663 | 1142 days ago | 0.25 ETH | ||||
13577663 | 1142 days ago | 0.25 ETH | ||||
13577663 | 1142 days ago | 0.25 ETH | ||||
13577663 | 1142 days ago | 0.05 ETH |
Loading...
Loading
Contract Name:
SipherNFTSale
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 22000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: agpl-3.0 pragma solidity 0.8.4; import {Address} from '@openzeppelin/contracts/utils/Address.sol'; import {ISipherNFT} from '../interfaces/ISipherNFT.sol'; import {ISipherNFTSale} from '../interfaces/ISipherNFTSale.sol'; import {Whitelist} from '../utils/Whitelist.sol'; contract SipherNFTSale is ISipherNFTSale, Whitelist { using Address for address; // at initial launch, the owner can buy up to 500 tokens uint32 public constant MAX_OWNER_BOUGHT_INITIAL = 500; uint32 public constant PUBLIC_SALE_CAP_PER_ADDRESS = 5; uint32 public constant REDUCE_PRICE_INTERVAL = 600; //10 minutes uint256 public constant REDUCE_PRICE_LEVEL = 50000000000000000; //0.05 ether uint256 public constant SALE_BASE_PRICE = 100000000000000000; // 0.10 ether uint256 public constant SALE_PUBLIC_STARTING_PRICE = 900000000000000000; //0.9 ether bytes32 public override merkleRoot; // store the merkle root data for verification purpose ISipherNFT public immutable override nft; SaleRecord internal _saleRecord; SaleConfig internal _saleConfig; mapping(address => UserRecord) internal _userRecord; event OwnerBought(address indexed buyer, uint32 amount, uint256 amountWeiPaid); event PrivateBought(address indexed buyer, uint32 amount, uint256 amountWeiPaid); event FreeMintBought(address indexed buyer, uint32 amount, uint256 amountWeiPaid); event PublicBought(address indexed buyer, uint32 amount, uint256 amountWeiPaid); event WithdrawSaleFunds(address indexed recipient, uint256 amount); event RollStartIndex(address indexed trigger); event UpdateSaleEndTime(uint64 endTime); event SetMerkleRoot(bytes32 merkelRoot); event Refund(address buyer, uint256 refundAmount); constructor( ISipherNFT _nft, uint64 _publicTime, uint64 _publicEndTime, uint64 _privateTime, uint64 _freeMintTime, uint64 _endTime, uint32 _maxSupply ) { nft = _nft; _saleConfig = SaleConfig({ publicTime: _publicTime, publicEndTime: _publicEndTime, privateTime: _privateTime, freeMintTime: _freeMintTime, endTime: _endTime, maxSupply: _maxSupply }); } function withdrawSaleFunds(address payable recipient, uint256 amount) external onlyOwner { (bool success, ) = recipient.call{value: amount}(''); require(success, 'SipherNFTSale: withdraw funds failed'); emit WithdrawSaleFunds(recipient, amount); } /** * @dev Allow owner to set the merkle root only once before whitelist buy time */ function setMerkleRoot(bytes32 _root) external onlyOwner { require( _blockTimestamp() < _saleConfig.publicTime, 'SipherNFTSale: only update before whitelist buy time' ); require(_root != bytes32(0), 'SipherNFTSale: invalid root'); require(merkleRoot == bytes32(0), 'SipherNFTSale: already set merkle root'); merkleRoot = _root; emit SetMerkleRoot(_root); } function getPublicSaleCurrentPrice() public view returns (uint256 currentPrice) { uint256 timestamp = _blockTimestamp(); uint256 publicStartTime = _saleConfig.publicTime; uint256 publicEndTime = _saleConfig.publicEndTime; uint256 priceInterval = REDUCE_PRICE_INTERVAL; if (timestamp < publicStartTime) { currentPrice = SALE_PUBLIC_STARTING_PRICE; return currentPrice; } else if (timestamp >= publicStartTime && timestamp < publicEndTime) { uint256 i = 0; while ((publicStartTime + i * priceInterval) <= timestamp && i < 17) { i++; } currentPrice = SALE_PUBLIC_STARTING_PRICE - (i - 1) * REDUCE_PRICE_LEVEL; return currentPrice; } else { currentPrice = SALE_BASE_PRICE; return currentPrice; } } /** * @dev Buy amount of NFT tokens * There are different caps for different users at different times * The total sold tokens should be capped to maxSupply * @param amount amount of token to buy */ function buy( uint32 amount, uint32 privateCap, uint32 freeMintCap, bytes32[] memory proofs ) external payable override { address buyer = msg.sender; // only EOA or the owner can buy, disallow contracts to buy require( (!buyer.isContract() && buyer == tx.origin) || buyer == owner(), 'SipherNFTSale: only EOA or owner' ); require(merkleRoot != bytes32(0), 'SipherNFTSale: merkle root is not set yet'); uint256 unitPrice = getPublicSaleCurrentPrice(); _validateAndUpdateWithBuyAmount(buyer, amount, privateCap, freeMintCap, unitPrice, proofs); nft.mintGenesis(amount, buyer, unitPrice); } /** * @dev Roll the final start index of the NFT, only call after sale is ended */ function rollStartIndex() external override { require(_blockTimestamp() > _saleConfig.endTime, 'SipherNFTSale: sale not ended'); address sender = msg.sender; require( (!sender.isContract() && sender == tx.origin) || sender == owner(), 'SipherNFTSale: only EOA or owner' ); require(merkleRoot != bytes32(0), 'SipherNFTSale: merkle root is not set yet'); nft.rollStartIndex(); emit RollStartIndex(sender); } /** * @dev Update sale end time by the owner only */ function updateSaleConfigTime( uint64 _publicTime, uint64 _publicEndTime, uint64 _privateTime, uint64 _freeMintTime, uint64 _endTime ) external onlyOwner { require(_publicTime >= _saleConfig.publicTime, 'SipherNFTSale: Invalid sale time input'); _saleConfig.publicTime = _publicTime; _saleConfig.publicEndTime = _publicEndTime; _saleConfig.privateTime = _privateTime; _saleConfig.freeMintTime = _freeMintTime; _saleConfig.endTime = _endTime; emit UpdateSaleEndTime(_endTime); } /** * @dev Return the sale config */ function getSaleConfig() external view override returns (SaleConfig memory config) { config = _saleConfig; } /** * @dev Return the sale config */ function getMaxPublicSaleCap() external view returns (uint32) { return _saleConfig.maxSupply - totalWhitelisted; } /** * @dev Return the record, with number of tokens have been sold for different groups */ function getSaleRecord() external view override returns (SaleRecord memory record) { record = _saleRecord; } /** * @dev Return the user record */ function getUserRecord(address user) external view override returns (UserRecord memory record) { record = _userRecord[user]; } /** * @dev Validate if it is valid to buy and update corresponding data * Logics: * 1. Can not buy more than maxSupply * 2. If the buyer is the owner: * - can buy up to MAX_OWNER_BOUGHT_INITIAL before endTime with price = 0 * - after sale is ended, can buy with no limit (but within maxSupply) with price = 0 3. If the buy time is in public buy time: * - each buyer can buy up to total of PUBLIC_SALE_CAP_PER_ADDRESS tokens at currentPrice per token * 4. If the buy time is in whitelist buy time: * - each whitelisted buyer can buy up to privateCap tokens at SALE_BASE_PRICE per token * 5. If the buy time is in free mint time: * - each whitelisted buyer can buy up to total of freeMintCap tokens at 0 ETH per token */ function _validateAndUpdateWithBuyAmount( address buyer, uint32 amount, uint32 privateCap, uint32 freeMintCap, uint256 unitPrice, bytes32[] memory proofs ) internal { SaleConfig memory config = _saleConfig; // ensure total sold doens't exceed max supply require( _saleRecord.totalSold + amount <= _saleConfig.maxSupply, 'SipherNFTSale: max supply reached' ); address owner = owner(); uint256 totalPaid = msg.value; uint256 timestamp = _blockTimestamp(); uint256 costToMint = unitPrice * amount; if (buyer == owner) { // if not ended, owner can buy up to MAX_OWNER_BOUGHT_INITIAL, otherwise there is no cap if (timestamp <= config.endTime) { require( _saleRecord.ownerBought + amount <= MAX_OWNER_BOUGHT_INITIAL, 'SipherNFTSale: max owner initial reached' ); } _saleRecord.ownerBought += amount; _saleRecord.totalSold += amount; emit OwnerBought(buyer, amount, totalPaid); return; } require(config.publicTime <= timestamp, 'SipherNFTSale: Public Sale not started'); require(timestamp <= config.endTime, 'SipherNFTSale: already ended'); if (config.publicTime <= timestamp && timestamp < config.publicEndTime) { // anyone can buy up to PUBLIC_SALE_CAP_PER_ADDRESS tokens with price of currentPrice eth per token require( _saleRecord.totalPublicSold + amount <= (config.maxSupply - totalWhitelisted), 'SipherNFTSale: max public sale supply reached' ); require( _userRecord[buyer].publicBought + amount <= PUBLIC_SALE_CAP_PER_ADDRESS, 'SipherNFTSale: normal cap reached' ); require( (totalPaid >= costToMint) && (costToMint >= SALE_BASE_PRICE), 'SipherNFTSale: invalid paid value' ); _saleRecord.totalPublicSold += amount; _userRecord[buyer].publicBought += amount; _saleRecord.totalSold += amount; // refund if customer paid more than the cost to mint if (msg.value > costToMint) { Address.sendValue(payable(msg.sender), msg.value - costToMint); emit Refund(buyer, msg.value - costToMint); } emit PublicBought(buyer, amount, totalPaid); return; } if (config.publicEndTime <= timestamp && timestamp < config.freeMintTime) { require( config.privateTime <= timestamp && timestamp < config.freeMintTime, 'SipherNFTSale: Private Sale not started' ); // whitelisted address can buy up to privateCap token at SALE_BASE_PRICE ETH require(totalPaid == amount * SALE_BASE_PRICE, 'SipherNFTSale: invalid paid value'); require( _userRecord[buyer].whitelistBought + amount <= privateCap, 'SipherNFTSale: whitelisted private sale cap reached' ); // only whitelisted can buy at this period require( isWhitelistedAddress(buyer, privateCap, freeMintCap, proofs) && whitelistedMerkelRoot != bytes32(0), 'SipherNFTSale: only whitelisted buyer' ); _saleRecord.totalWhitelistSold += amount; _userRecord[buyer].whitelistBought += amount; _saleRecord.totalSold += amount; emit PrivateBought(buyer, amount, totalPaid); return; } if (config.freeMintTime <= timestamp && timestamp < config.endTime) { require( config.freeMintTime <= timestamp && timestamp < config.endTime, 'SipherNFTSale: Free Mint not started' ); // only whitelisted can buy at this period require(totalPaid == 0, 'Invalid paid amount'); require( isWhitelistedAddress(buyer, privateCap, freeMintCap, proofs) && whitelistedMerkelRoot != bytes32(0), 'SipherNFTSale: only whitelisted buyer' ); // whitelisted address can buy up to freeMintCap token at 0 ETH require( _userRecord[buyer].freeMintBought + amount <= freeMintCap, 'SipherNFTSale: free mint cap reached' ); _saleRecord.totalFreeMintSold += amount; _userRecord[buyer].freeMintBought += amount; _saleRecord.totalSold += amount; emit FreeMintBought(buyer, amount, totalPaid); return; } } function _blockTimestamp() internal view returns (uint256) { return block.timestamp; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: agpl-3.0 pragma solidity 0.8.4; import {IERC721Enumerable} from '@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol'; interface ISipherNFT is IERC721Enumerable { /** * @dev Call only by the Genesis Minter to roll the start index */ function rollStartIndex() external; /** * @dev Call to mint new genesis tokens, only by Genesis Minter * Can mint up to MAX_GENESIS_SUPPLY tokens * @param amount amount of genesis tokens to mint * @param to recipient of genesis tokens */ function mintGenesis(uint256 amount, address to, uint256 unitPrice) external; /** * @dev Call to mint a fork of a tokenId, only by Fork Minter * need to wait for all genesis to be minted before minting forks * allow to mint multile forks for a tokenId * @param tokenId id of token to mint a fork */ function mintFork(uint256 tokenId) external; /** * @dev Return the original of a fork token * @param forkId fork id to get its original token id */ function originals(uint256 forkId) external view returns (uint256 originalId); /** * @dev Return the current genesis minter address */ function genesisMinter() external view returns (address); /** * @dev Return the current fork minter address */ function forkMinter() external view returns (address); /** * @dev Return the randomized start index, 0 if has not rolled yet */ function randomizedStartIndex() external view returns (uint256); /** * @dev Return the current genesis token id, default 0, the first token has id of 1 */ function currentId() external view returns (uint256); /** * @dev Return the base Sipher URI for tokens */ function baseSipherURI() external view returns (string memory); /** * @dev Return the store front URI */ function contractURI() external view returns (string memory); }
// SPDX-License-Identifier: agpl-3.0 pragma solidity 0.8.4; import {ISipherNFT} from '../interfaces/ISipherNFT.sol'; interface ISipherNFTSale { struct SaleConfig { uint64 publicTime; // time that public sale start uint64 publicEndTime; // time that public sale end uint64 privateTime; // time that private sale start uint64 freeMintTime; // time that free mint for Guildmaster whitelisted addresses start. uint64 endTime; // end time for the sale, only the owner can buy the rest of the supply uint32 maxSupply; // max supply of the nft tokens for this sale round } struct SaleRecord { uint32 totalSold; // total amount of tokens have been sold uint32 ownerBought; // total amount of tokens that the owner has bought uint32 totalPublicSold; // total amount of tokens that have sold to public uint32 totalWhitelistSold; // total amount of tokens that whitelisted addresses have bought uint32 totalFreeMintSold; // total amount of tokens that free minted by whitelisted address } struct UserRecord { uint32 publicBought; // amount of tokens that have bought as a public address uint32 whitelistBought; // amount of tokens that have bought as a whitelisted address uint32 freeMintBought; // amount of tokens that have bought as free mint by whitelisted address } /** * @dev Buy amount of NFT tokens * There are different caps for different users at different times * The total sold tokens should be capped to maxSupply */ function buy(uint32 amount,uint32 privateCap, uint32 freeMintCap, bytes32[] memory proofs) external payable; /** * @dev Roll the final start index of the NFT */ function rollStartIndex() external; /** * @dev Return the config, with times (t0, t1, t2) and max supply */ function getSaleConfig() external view returns (SaleConfig memory config); /** * @dev Return the sale record */ function getSaleRecord() external view returns (SaleRecord memory record); /** * @dev Return the user record */ function getUserRecord(address user) external view returns (UserRecord memory record); function merkleRoot() external view returns (bytes32); function nft() external view returns (ISipherNFT); }
// SPDX-License-Identifier: agpl-3.0 pragma solidity 0.8.4; import {Ownable} from '@openzeppelin/contracts/access/Ownable.sol'; import {EnumerableSet} from '@openzeppelin/contracts/utils/structs/EnumerableSet.sol'; import {IWhitelist} from '../interfaces/IWhitelist.sol'; contract Whitelist is IWhitelist, Ownable { bytes32 public whitelistedMerkelRoot; uint32 public totalWhitelisted; function setWhitelistedMerkleRoot(bytes32 _whitelistedRoot, uint32 _totalWhitelisted) external override onlyOwner { require(_whitelistedRoot != bytes32(0), 'SipherNFTSale: invalid root'); require(_totalWhitelisted < 10000, 'Whiteist: max whitelisted is 9999 '); whitelistedMerkelRoot = _whitelistedRoot; totalWhitelisted = _totalWhitelisted; emit SetWhitelistedMerkleRoot(_whitelistedRoot); } function isWhitelistedAddress( address buyer, uint32 privateCap, uint32 freeMintCap, bytes32[] memory proofs ) public view override returns (bool) { require(whitelistedMerkelRoot != bytes32(0)); bytes32 computedHash = keccak256(abi.encode(buyer, privateCap, freeMintCap)); for (uint256 i = 0; i < proofs.length; i++) { bytes32 proofElement = proofs[i]; if (computedHash < proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash == whitelistedMerkelRoot; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT 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 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() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } }
// SPDX-License-Identifier: agpl-3.0 pragma solidity 0.8.4; interface IWhitelist { event SetWhitelistedMerkleRoot(bytes32 whitelistedMerkelRoot); function setWhitelistedMerkleRoot(bytes32 _whitelistedRoot, uint32 _totalWhitelisted) external; function isWhitelistedAddress(address buyer, uint32 privateCap, uint32 freeMintCap , bytes32[] memory proofs) external view returns (bool); }
// SPDX-License-Identifier: MIT 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; } }
{ "optimizer": { "enabled": true, "runs": 22000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract ISipherNFT","name":"_nft","type":"address"},{"internalType":"uint64","name":"_publicTime","type":"uint64"},{"internalType":"uint64","name":"_publicEndTime","type":"uint64"},{"internalType":"uint64","name":"_privateTime","type":"uint64"},{"internalType":"uint64","name":"_freeMintTime","type":"uint64"},{"internalType":"uint64","name":"_endTime","type":"uint64"},{"internalType":"uint32","name":"_maxSupply","type":"uint32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint32","name":"amount","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"amountWeiPaid","type":"uint256"}],"name":"FreeMintBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint32","name":"amount","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"amountWeiPaid","type":"uint256"}],"name":"OwnerBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint32","name":"amount","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"amountWeiPaid","type":"uint256"}],"name":"PrivateBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint32","name":"amount","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"amountWeiPaid","type":"uint256"}],"name":"PublicBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"refundAmount","type":"uint256"}],"name":"Refund","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"trigger","type":"address"}],"name":"RollStartIndex","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"merkelRoot","type":"bytes32"}],"name":"SetMerkleRoot","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"whitelistedMerkelRoot","type":"bytes32"}],"name":"SetWhitelistedMerkleRoot","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"endTime","type":"uint64"}],"name":"UpdateSaleEndTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawSaleFunds","type":"event"},{"inputs":[],"name":"MAX_OWNER_BOUGHT_INITIAL","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_CAP_PER_ADDRESS","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REDUCE_PRICE_INTERVAL","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REDUCE_PRICE_LEVEL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_BASE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_PUBLIC_STARTING_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"amount","type":"uint32"},{"internalType":"uint32","name":"privateCap","type":"uint32"},{"internalType":"uint32","name":"freeMintCap","type":"uint32"},{"internalType":"bytes32[]","name":"proofs","type":"bytes32[]"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getMaxPublicSaleCap","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicSaleCurrentPrice","outputs":[{"internalType":"uint256","name":"currentPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSaleConfig","outputs":[{"components":[{"internalType":"uint64","name":"publicTime","type":"uint64"},{"internalType":"uint64","name":"publicEndTime","type":"uint64"},{"internalType":"uint64","name":"privateTime","type":"uint64"},{"internalType":"uint64","name":"freeMintTime","type":"uint64"},{"internalType":"uint64","name":"endTime","type":"uint64"},{"internalType":"uint32","name":"maxSupply","type":"uint32"}],"internalType":"struct ISipherNFTSale.SaleConfig","name":"config","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSaleRecord","outputs":[{"components":[{"internalType":"uint32","name":"totalSold","type":"uint32"},{"internalType":"uint32","name":"ownerBought","type":"uint32"},{"internalType":"uint32","name":"totalPublicSold","type":"uint32"},{"internalType":"uint32","name":"totalWhitelistSold","type":"uint32"},{"internalType":"uint32","name":"totalFreeMintSold","type":"uint32"}],"internalType":"struct ISipherNFTSale.SaleRecord","name":"record","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserRecord","outputs":[{"components":[{"internalType":"uint32","name":"publicBought","type":"uint32"},{"internalType":"uint32","name":"whitelistBought","type":"uint32"},{"internalType":"uint32","name":"freeMintBought","type":"uint32"}],"internalType":"struct ISipherNFTSale.UserRecord","name":"record","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"buyer","type":"address"},{"internalType":"uint32","name":"privateCap","type":"uint32"},{"internalType":"uint32","name":"freeMintCap","type":"uint32"},{"internalType":"bytes32[]","name":"proofs","type":"bytes32[]"}],"name":"isWhitelistedAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nft","outputs":[{"internalType":"contract ISipherNFT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rollStartIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_whitelistedRoot","type":"bytes32"},{"internalType":"uint32","name":"_totalWhitelisted","type":"uint32"}],"name":"setWhitelistedMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalWhitelisted","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_publicTime","type":"uint64"},{"internalType":"uint64","name":"_publicEndTime","type":"uint64"},{"internalType":"uint64","name":"_privateTime","type":"uint64"},{"internalType":"uint64","name":"_freeMintTime","type":"uint64"},{"internalType":"uint64","name":"_endTime","type":"uint64"}],"name":"updateSaleConfigTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistedMerkelRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawSaleFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b5060405162002d8e38038062002d8e833981016040819052620000349162000172565b6200003f3362000105565b606096871b6001600160601b031990811660809081526040805160c0810182526001600160401b03998a16808252988a1660208201819052978a169181018290529589169986018a90529390971696840187905263ffffffff9190911660a0909301839052600580546001600160801b03191690951768010000000000000000948502176001600160801b0316600160801b9092026001600160c01b031691909117600160c01b909602959095179092556006805490941690921791021790556200021d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160401b03811681146200016d57600080fd5b919050565b600080600080600080600060e0888a0312156200018d578283fd5b87516001600160a01b0381168114620001a4578384fd5b9650620001b46020890162000155565b9550620001c46040890162000155565b9450620001d46060890162000155565b9350620001e46080890162000155565b9250620001f460a0890162000155565b915060c088015163ffffffff811681146200020d578182fd5b8091505092959891949750929550565b60805160601c612b446200024a600039600081816102d501528181610e2e01526112c60152612b446000f3fe6080604052600436106101965760003560e01c806367e2efc6116100e1578063ca12910d1161008a578063d2c99a6511610064578063d2c99a65146105ff578063d5521006146106f8578063f2fde38b1461070e578063fe8bba801461072e57600080fd5b8063ca12910d1461049b578063cc0bb88f146104ae578063cea943ee146104c957600080fd5b80638da5cb5b116100bb5780638da5cb5b14610444578063948905971461046f5780639f42348c1461048557600080fd5b806367e2efc61461034d578063715018a61461040f5780637cb647591461042457600080fd5b806322bd7c171161014357806347ccca021161011d57806347ccca02146102c35780635537e3d51461031c5780635aca19821461033857600080fd5b806322bd7c1714610278578063261c912d1461028d5780632eb4a7ab146102ad57600080fd5b80630ccdb88a116101745780630ccdb88a1461021e578063165b1dea14610233578063224007591461026357600080fd5b806304072b201461019b5780630aac9e9a146101d25780630b684c81146101fc575b600080fd5b3480156101a757600080fd5b506002546101b89063ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b3480156101de57600080fd5b506101ee67016345785d8a000081565b6040519081526020016101c9565b34801561020857600080fd5b5061021c6102173660046128ef565b61074e565b005b34801561022a57600080fd5b506101b86108f0565b34801561023f57600080fd5b5061025361024e366004612868565b61091e565b60405190151581526020016101c9565b34801561026f57600080fd5b506101b8600581565b34801561028457600080fd5b506101ee610a5a565b34801561029957600080fd5b5061021c6102a836600461283d565b610b35565b3480156102b957600080fd5b506101ee60035481565b3480156102cf57600080fd5b506102f77f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c9565b34801561032857600080fd5b506101ee670c7d713b49da000081565b34801561034457600080fd5b5061021c610cc6565b34801561035957600080fd5b506103e061036836600461281a565b60408051606080820183526000808352602080840182905292840181905273ffffffffffffffffffffffffffffffffffffffff9490941684526007825292829020825193840183525463ffffffff80821685526401000000008204811692850192909252680100000000000000009004169082015290565b60408051825163ffffffff908116825260208085015182169083015292820151909216908201526060016101c9565b34801561041b57600080fd5b5061021c610ef0565b34801561043057600080fd5b5061021c61043f3660046128d7565b610f63565b34801561045057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102f7565b34801561047b57600080fd5b506101ee60015481565b34801561049157600080fd5b506101b861025881565b61021c6104a936600461291a565b611149565b3480156104ba57600080fd5b506101ee66b1a2bc2ec5000081565b3480156104d557600080fd5b506105996040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260055467ffffffffffffffff80821683526801000000000000000080830482166020850152700100000000000000000000000000000000830482169484019490945278010000000000000000000000000000000000000000000000009091048116606083015260065490811660808301529190910463ffffffff1660a082015290565b6040516101c99190600060c08201905067ffffffffffffffff8084511683528060208501511660208401528060408501511660408401528060608501511660608401528060808501511660808401525063ffffffff60a08401511660a083015292915050565b34801561060b57600080fd5b506106ac6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a08101825260045463ffffffff80821683526401000000008204811660208401526801000000000000000082048116938301939093526c010000000000000000000000008104831660608301527001000000000000000000000000000000009004909116608082015290565b6040516101c99190815163ffffffff9081168252602080840151821690830152604080840151821690830152606080840151821690830152608092830151169181019190915260a00190565b34801561070457600080fd5b506101b86101f481565b34801561071a57600080fd5b5061021c61072936600461281a565b61132a565b34801561073a57600080fd5b5061021c610749366004612938565b611426565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107ba5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b816108075760405162461bcd60e51b815260206004820152601b60248201527f5369706865724e465453616c653a20696e76616c696420726f6f74000000000060448201526064016107b1565b6127108163ffffffff16106108845760405162461bcd60e51b815260206004820152602260248201527f57686974656973743a206d61782077686974656c69737465642069732039393960448201527f392000000000000000000000000000000000000000000000000000000000000060648201526084016107b1565b6001829055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff83161790556040518281527f6b20ca0076fbe7ff293c08b1bfaaa69e2b8ae955ddaf543ea5b076137cd4079b9060200160405180910390a15050565b6002546006546000916109199163ffffffff918216916801000000000000000090910416612a30565b905090565b60015460009061092d57600080fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8716602082015263ffffffff80871692820192909252908416606082015260009060800160405160208183030381529060405280519060200120905060005b8351811015610a4c5760008482815181106109c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080831015610a0c576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250610a39565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080610a4481612a55565b915050610985565b506001541495945050505050565b600554600090429067ffffffffffffffff808216916801000000000000000090041661025882841015610a9957670c7d713b49da000094505050505090565b828410158015610aa857508184105b15610b235760005b84610abb83836129dc565b610ac5908661299c565b11158015610ad35750601181105b15610aea5780610ae281612a55565b915050610ab0565b66b1a2bc2ec50000610afd600183612a19565b610b0791906129dc565b610b1990670c7d713b49da0000612a19565b9550505050505090565b67016345785d8a000094505050505090565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b9c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b1565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114610bf6576040519150601f19603f3d011682016040523d82523d6000602084013e610bfb565b606091505b5050905080610c715760405162461bcd60e51b8152602060048201526024808201527f5369706865724e465453616c653a2077697468647261772066756e647320666160448201527f696c65640000000000000000000000000000000000000000000000000000000060648201526084016107b1565b8273ffffffffffffffffffffffffffffffffffffffff167f3fec9cbe8c76c2fa9d3757845d57ed0ad0d4d2942b967184d32dc0beb65c3ff083604051610cb991815260200190565b60405180910390a2505050565b60065467ffffffffffffffff164211610d215760405162461bcd60e51b815260206004820152601d60248201527f5369706865724e465453616c653a2073616c65206e6f7420656e64656400000060448201526064016107b1565b33803b158015610d46575073ffffffffffffffffffffffffffffffffffffffff811632145b80610d6b575060005473ffffffffffffffffffffffffffffffffffffffff8281169116145b610db75760405162461bcd60e51b815260206004820181905260248201527f5369706865724e465453616c653a206f6e6c7920454f41206f72206f776e657260448201526064016107b1565b600354610e2c5760405162461bcd60e51b815260206004820152602960248201527f5369706865724e465453616c653a206d65726b6c6520726f6f74206973206e6f60448201527f742073657420796574000000000000000000000000000000000000000000000060648201526084016107b1565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635aca19826040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610e9457600080fd5b505af1158015610ea8573d6000803e3d6000fd5b505060405173ffffffffffffffffffffffffffffffffffffffff841692507f725104c01ecbd360f4bbc17ad33decbdea38bb98d79bf23f0ae2e374d002381e9150600090a250565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f575760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b1565b610f616000611627565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610fca5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b1565b60055467ffffffffffffffff16421061104b5760405162461bcd60e51b815260206004820152603460248201527f5369706865724e465453616c653a206f6e6c7920757064617465206265666f7260448201527f652077686974656c697374206275792074696d6500000000000000000000000060648201526084016107b1565b806110985760405162461bcd60e51b815260206004820152601b60248201527f5369706865724e465453616c653a20696e76616c696420726f6f74000000000060448201526064016107b1565b6003541561110e5760405162461bcd60e51b815260206004820152602660248201527f5369706865724e465453616c653a20616c726561647920736574206d65726b6c60448201527f6520726f6f74000000000000000000000000000000000000000000000000000060648201526084016107b1565b60038190556040518181527f914960aef5e033ce5cae8a7992d4b7a6f0f9741227b66acb67c605b7019f8a469060200160405180910390a150565b33803b15801561116e575073ffffffffffffffffffffffffffffffffffffffff811632145b80611193575060005473ffffffffffffffffffffffffffffffffffffffff8281169116145b6111df5760405162461bcd60e51b815260206004820181905260248201527f5369706865724e465453616c653a206f6e6c7920454f41206f72206f776e657260448201526064016107b1565b6003546112545760405162461bcd60e51b815260206004820152602960248201527f5369706865724e465453616c653a206d65726b6c6520726f6f74206973206e6f60448201527f742073657420796574000000000000000000000000000000000000000000000060648201526084016107b1565b600061125e610a5a565b905061126e82878787858861169c565b6040517f51dd47d100000000000000000000000000000000000000000000000000000000815263ffffffff8716600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906351dd47d190606401600060405180830381600087803b15801561130a57600080fd5b505af115801561131e573d6000803e3d6000fd5b50505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113915760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b1565b73ffffffffffffffffffffffffffffffffffffffff811661141a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107b1565b61142381611627565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461148d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b1565b60055467ffffffffffffffff90811690861610156115135760405162461bcd60e51b815260206004820152602660248201527f5369706865724e465453616c653a20496e76616c69642073616c652074696d6560448201527f20696e707574000000000000000000000000000000000000000000000000000060648201526084016107b1565b6005805467ffffffffffffffff8781167fffffffffffffffffffffffffffffffff00000000000000000000000000000000909216919091176801000000000000000087831602176fffffffffffffffffffffffffffffffff167001000000000000000000000000000000008683160277ffffffffffffffffffffffffffffffffffffffffffffffff161778010000000000000000000000000000000000000000000000008583160217909155600680547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001691831691821790556040519081527f1211a68a972c0c6584b66e6405f451ba8bd6303b3283d04bf1b45fea011671529060200160405180910390a15050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040805160c08101825260055467ffffffffffffffff808216835268010000000000000000808304821660208501527001000000000000000000000000000000008304821694840194909452780100000000000000000000000000000000000000000000000090910481166060830152600654908116608083015263ffffffff929004821660a082018190526004549192909161173b918991166129b4565b63ffffffff1611156117b55760405162461bcd60e51b815260206004820152602160248201527f5369706865724e465453616c653a206d617820737570706c792072656163686560448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016107b1565b6000805473ffffffffffffffffffffffffffffffffffffffff1690349042906117e463ffffffff8b16886129dc565b90508373ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1614156119b657846080015167ffffffffffffffff1682116118c9576004546101f49061184f908c90640100000000900463ffffffff166129b4565b63ffffffff1611156118c95760405162461bcd60e51b815260206004820152602860248201527f5369706865724e465453616c653a206d6178206f776e657220696e697469616c60448201527f207265616368656400000000000000000000000000000000000000000000000060648201526084016107b1565b600480548b919081906118eb908490640100000000900463ffffffff166129b4565b92506101000a81548163ffffffff021916908363ffffffff16021790555089600460000160008282829054906101000a900463ffffffff1661192d91906129b4565b92506101000a81548163ffffffff021916908363ffffffff1602179055508a73ffffffffffffffffffffffffffffffffffffffff167f1ca9c289d71bbc4091bbd521526b4a23f027aa0971b5b5dc8efe2781f56901a28b856040516119a492919063ffffffff929092168252602082015260400190565b60405180910390a250505050506125fa565b845167ffffffffffffffff16821015611a375760405162461bcd60e51b815260206004820152602660248201527f5369706865724e465453616c653a205075626c69632053616c65206e6f74207360448201527f746172746564000000000000000000000000000000000000000000000000000060648201526084016107b1565b846080015167ffffffffffffffff16821115611a955760405162461bcd60e51b815260206004820152601c60248201527f5369706865724e465453616c653a20616c726561647920656e6465640000000060448201526064016107b1565b845167ffffffffffffffff168210801590611abd5750846020015167ffffffffffffffff1682105b15611e5e5760025460a0860151611ada9163ffffffff1690612a30565b60045463ffffffff91821691611aff918d9168010000000000000000909104166129b4565b63ffffffff161115611b795760405162461bcd60e51b815260206004820152602d60248201527f5369706865724e465453616c653a206d6178207075626c69632073616c65207360448201527f7570706c7920726561636865640000000000000000000000000000000000000060648201526084016107b1565b73ffffffffffffffffffffffffffffffffffffffff8b16600090815260076020526040902054600590611bb3908c9063ffffffff166129b4565b63ffffffff161115611c2d5760405162461bcd60e51b815260206004820152602160248201527f5369706865724e465453616c653a206e6f726d616c206361702072656163686560448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016107b1565b808310158015611c45575067016345785d8a00008110155b611cb75760405162461bcd60e51b815260206004820152602160248201527f5369706865724e465453616c653a20696e76616c696420706169642076616c7560448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016107b1565b600480548b9190600890611cde90849068010000000000000000900463ffffffff166129b4565b82546101009290920a63ffffffff81810219909316918316021790915573ffffffffffffffffffffffffffffffffffffffff8d16600090815260076020526040812080548e94509092611d33918591166129b4565b92506101000a81548163ffffffff021916908363ffffffff16021790555089600460000160008282829054906101000a900463ffffffff16611d7591906129b4565b92506101000a81548163ffffffff021916908363ffffffff16021790555080341115611e0a57611dae33611da98334612a19565b612602565b7fbb28353e4598c3b9199101a66e0989549b659a59a54d2c27fbb183f1932c8e6d8b611dda8334612a19565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260208301919091520160405180910390a15b6040805163ffffffff8c1681526020810185905273ffffffffffffffffffffffffffffffffffffffff8d16917f9c7d460a4c96d5a49f28ad6de77cfa11a924009fc0ed49d338fd70abf47d5b9891016119a4565b81856020015167ffffffffffffffff1611158015611e895750846060015167ffffffffffffffff1682105b156122435781856040015167ffffffffffffffff1611158015611eb95750846060015167ffffffffffffffff1682105b611f2b5760405162461bcd60e51b815260206004820152602760248201527f5369706865724e465453616c653a20507269766174652053616c65206e6f742060448201527f737461727465640000000000000000000000000000000000000000000000000060648201526084016107b1565b611f4367016345785d8a000063ffffffff8c166129dc565b8314611fb75760405162461bcd60e51b815260206004820152602160248201527f5369706865724e465453616c653a20696e76616c696420706169642076616c7560448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016107b1565b73ffffffffffffffffffffffffffffffffffffffff8b1660009081526007602052604090205463ffffffff808b1691611ffa918d916401000000009004166129b4565b63ffffffff1611156120745760405162461bcd60e51b815260206004820152603360248201527f5369706865724e465453616c653a2077686974656c697374656420707269766160448201527f74652073616c652063617020726561636865640000000000000000000000000060648201526084016107b1565b6120808b8a8a8961091e565b801561208d575060015415155b6120ff5760405162461bcd60e51b815260206004820152602560248201527f5369706865724e465453616c653a206f6e6c792077686974656c69737465642060448201527f627579657200000000000000000000000000000000000000000000000000000060648201526084016107b1565b600480548b9190600c9061212a9084906c01000000000000000000000000900463ffffffff166129b4565b82546101009290920a63ffffffff81810219909316918316021790915573ffffffffffffffffffffffffffffffffffffffff8d16600090815260076020526040902080548d9350909160049161218a9185916401000000009004166129b4565b92506101000a81548163ffffffff021916908363ffffffff16021790555089600460000160008282829054906101000a900463ffffffff166121cc91906129b4565b92506101000a81548163ffffffff021916908363ffffffff1602179055508a73ffffffffffffffffffffffffffffffffffffffff167f9461d7fe029c7f3dad29448031d090ac9ecba211b35697793ad8d5db43456af28b856040516119a492919063ffffffff929092168252602082015260400190565b81856060015167ffffffffffffffff161115801561226e5750846080015167ffffffffffffffff1682105b156125f45781856060015167ffffffffffffffff161115801561229e5750846080015167ffffffffffffffff1682105b61230f5760405162461bcd60e51b8152602060048201526024808201527f5369706865724e465453616c653a2046726565204d696e74206e6f742073746160448201527f727465640000000000000000000000000000000000000000000000000000000060648201526084016107b1565b821561235d5760405162461bcd60e51b815260206004820152601360248201527f496e76616c6964207061696420616d6f756e740000000000000000000000000060448201526064016107b1565b6123698b8a8a8961091e565b8015612376575060015415155b6123e85760405162461bcd60e51b815260206004820152602560248201527f5369706865724e465453616c653a206f6e6c792077686974656c69737465642060448201527f627579657200000000000000000000000000000000000000000000000000000060648201526084016107b1565b73ffffffffffffffffffffffffffffffffffffffff8b1660009081526007602052604090205463ffffffff808a169161242f918d91680100000000000000009004166129b4565b63ffffffff1611156124a85760405162461bcd60e51b8152602060048201526024808201527f5369706865724e465453616c653a2066726565206d696e74206361702072656160448201527f636865640000000000000000000000000000000000000000000000000000000060648201526084016107b1565b600480548b91906010906124d7908490700100000000000000000000000000000000900463ffffffff166129b4565b82546101009290920a63ffffffff81810219909316918316021790915573ffffffffffffffffffffffffffffffffffffffff8d16600090815260076020526040902080548d9350909160089161253b918591680100000000000000009004166129b4565b92506101000a81548163ffffffff021916908363ffffffff16021790555089600460000160008282829054906101000a900463ffffffff1661257d91906129b4565b92506101000a81548163ffffffff021916908363ffffffff1602179055508a73ffffffffffffffffffffffffffffffffffffffff167f422746c21d723e4ab5390bd3517f34279c6049ff2b4757911b0799a086c6a5fb8b856040516119a492919063ffffffff929092168252602082015260400190565b50505050505b505050505050565b804710156126525760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016107b1565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146126ac576040519150601f19603f3d011682016040523d82523d6000602084013e6126b1565b606091505b50509050806127285760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016107b1565b505050565b600082601f83011261273d578081fd5b8135602067ffffffffffffffff8083111561275a5761275a612abd565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f8301168101818110848211171561279d5761279d612abd565b604052848152838101925086840182880185018910156127bb578687fd5b8692505b858310156127dd5780358452928401926001929092019184016127bf565b50979650505050505050565b803563ffffffff811681146127fd57600080fd5b919050565b803567ffffffffffffffff811681146127fd57600080fd5b60006020828403121561282b578081fd5b813561283681612aec565b9392505050565b6000806040838503121561284f578081fd5b823561285a81612aec565b946020939093013593505050565b6000806000806080858703121561287d578182fd5b843561288881612aec565b9350612896602086016127e9565b92506128a4604086016127e9565b9150606085013567ffffffffffffffff8111156128bf578182fd5b6128cb8782880161272d565b91505092959194509250565b6000602082840312156128e8578081fd5b5035919050565b60008060408385031215612901578182fd5b82359150612911602084016127e9565b90509250929050565b6000806000806080858703121561292f578384fd5b612888856127e9565b600080600080600060a0868803121561294f578081fd5b61295886612802565b945061296660208701612802565b935061297460408701612802565b925061298260608701612802565b915061299060808701612802565b90509295509295909350565b600082198211156129af576129af612a8e565b500190565b600063ffffffff8083168185168083038211156129d3576129d3612a8e565b01949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612a1457612a14612a8e565b500290565b600082821015612a2b57612a2b612a8e565b500390565b600063ffffffff83811690831681811015612a4d57612a4d612a8e565b039392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612a8757612a87612a8e565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461142357600080fdfea2646970667358221220b16e0d2c88b488f73b4e79a289d4a090af8c40bcdc92270166b2121d444084bb64736f6c6343000804003300000000000000000000000009e0df4ae51111ca27d6b85708cfb3f1f7cae982000000000000000000000000000000000000000000000000000000006185da980000000000000000000000000000000000000000000000000000000061860270000000000000000000000000000000000000000000000000000000006186ad88000000000000000000000000000000000000000000000000000000006187ff0800000000000000000000000000000000000000000000000000000000618950880000000000000000000000000000000000000000000000000000000000002710
Deployed Bytecode
0x6080604052600436106101965760003560e01c806367e2efc6116100e1578063ca12910d1161008a578063d2c99a6511610064578063d2c99a65146105ff578063d5521006146106f8578063f2fde38b1461070e578063fe8bba801461072e57600080fd5b8063ca12910d1461049b578063cc0bb88f146104ae578063cea943ee146104c957600080fd5b80638da5cb5b116100bb5780638da5cb5b14610444578063948905971461046f5780639f42348c1461048557600080fd5b806367e2efc61461034d578063715018a61461040f5780637cb647591461042457600080fd5b806322bd7c171161014357806347ccca021161011d57806347ccca02146102c35780635537e3d51461031c5780635aca19821461033857600080fd5b806322bd7c1714610278578063261c912d1461028d5780632eb4a7ab146102ad57600080fd5b80630ccdb88a116101745780630ccdb88a1461021e578063165b1dea14610233578063224007591461026357600080fd5b806304072b201461019b5780630aac9e9a146101d25780630b684c81146101fc575b600080fd5b3480156101a757600080fd5b506002546101b89063ffffffff1681565b60405163ffffffff90911681526020015b60405180910390f35b3480156101de57600080fd5b506101ee67016345785d8a000081565b6040519081526020016101c9565b34801561020857600080fd5b5061021c6102173660046128ef565b61074e565b005b34801561022a57600080fd5b506101b86108f0565b34801561023f57600080fd5b5061025361024e366004612868565b61091e565b60405190151581526020016101c9565b34801561026f57600080fd5b506101b8600581565b34801561028457600080fd5b506101ee610a5a565b34801561029957600080fd5b5061021c6102a836600461283d565b610b35565b3480156102b957600080fd5b506101ee60035481565b3480156102cf57600080fd5b506102f77f00000000000000000000000009e0df4ae51111ca27d6b85708cfb3f1f7cae98281565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c9565b34801561032857600080fd5b506101ee670c7d713b49da000081565b34801561034457600080fd5b5061021c610cc6565b34801561035957600080fd5b506103e061036836600461281a565b60408051606080820183526000808352602080840182905292840181905273ffffffffffffffffffffffffffffffffffffffff9490941684526007825292829020825193840183525463ffffffff80821685526401000000008204811692850192909252680100000000000000009004169082015290565b60408051825163ffffffff908116825260208085015182169083015292820151909216908201526060016101c9565b34801561041b57600080fd5b5061021c610ef0565b34801561043057600080fd5b5061021c61043f3660046128d7565b610f63565b34801561045057600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff166102f7565b34801561047b57600080fd5b506101ee60015481565b34801561049157600080fd5b506101b861025881565b61021c6104a936600461291a565b611149565b3480156104ba57600080fd5b506101ee66b1a2bc2ec5000081565b3480156104d557600080fd5b506105996040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260055467ffffffffffffffff80821683526801000000000000000080830482166020850152700100000000000000000000000000000000830482169484019490945278010000000000000000000000000000000000000000000000009091048116606083015260065490811660808301529190910463ffffffff1660a082015290565b6040516101c99190600060c08201905067ffffffffffffffff8084511683528060208501511660208401528060408501511660408401528060608501511660608401528060808501511660808401525063ffffffff60a08401511660a083015292915050565b34801561060b57600080fd5b506106ac6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a08101825260045463ffffffff80821683526401000000008204811660208401526801000000000000000082048116938301939093526c010000000000000000000000008104831660608301527001000000000000000000000000000000009004909116608082015290565b6040516101c99190815163ffffffff9081168252602080840151821690830152604080840151821690830152606080840151821690830152608092830151169181019190915260a00190565b34801561070457600080fd5b506101b86101f481565b34801561071a57600080fd5b5061021c61072936600461281a565b61132a565b34801561073a57600080fd5b5061021c610749366004612938565b611426565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107ba5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b816108075760405162461bcd60e51b815260206004820152601b60248201527f5369706865724e465453616c653a20696e76616c696420726f6f74000000000060448201526064016107b1565b6127108163ffffffff16106108845760405162461bcd60e51b815260206004820152602260248201527f57686974656973743a206d61782077686974656c69737465642069732039393960448201527f392000000000000000000000000000000000000000000000000000000000000060648201526084016107b1565b6001829055600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff83161790556040518281527f6b20ca0076fbe7ff293c08b1bfaaa69e2b8ae955ddaf543ea5b076137cd4079b9060200160405180910390a15050565b6002546006546000916109199163ffffffff918216916801000000000000000090910416612a30565b905090565b60015460009061092d57600080fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8716602082015263ffffffff80871692820192909252908416606082015260009060800160405160208183030381529060405280519060200120905060005b8351811015610a4c5760008482815181106109c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151905080831015610a0c576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250610a39565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080610a4481612a55565b915050610985565b506001541495945050505050565b600554600090429067ffffffffffffffff808216916801000000000000000090041661025882841015610a9957670c7d713b49da000094505050505090565b828410158015610aa857508184105b15610b235760005b84610abb83836129dc565b610ac5908661299c565b11158015610ad35750601181105b15610aea5780610ae281612a55565b915050610ab0565b66b1a2bc2ec50000610afd600183612a19565b610b0791906129dc565b610b1990670c7d713b49da0000612a19565b9550505050505090565b67016345785d8a000094505050505090565b60005473ffffffffffffffffffffffffffffffffffffffff163314610b9c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b1565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d8060008114610bf6576040519150601f19603f3d011682016040523d82523d6000602084013e610bfb565b606091505b5050905080610c715760405162461bcd60e51b8152602060048201526024808201527f5369706865724e465453616c653a2077697468647261772066756e647320666160448201527f696c65640000000000000000000000000000000000000000000000000000000060648201526084016107b1565b8273ffffffffffffffffffffffffffffffffffffffff167f3fec9cbe8c76c2fa9d3757845d57ed0ad0d4d2942b967184d32dc0beb65c3ff083604051610cb991815260200190565b60405180910390a2505050565b60065467ffffffffffffffff164211610d215760405162461bcd60e51b815260206004820152601d60248201527f5369706865724e465453616c653a2073616c65206e6f7420656e64656400000060448201526064016107b1565b33803b158015610d46575073ffffffffffffffffffffffffffffffffffffffff811632145b80610d6b575060005473ffffffffffffffffffffffffffffffffffffffff8281169116145b610db75760405162461bcd60e51b815260206004820181905260248201527f5369706865724e465453616c653a206f6e6c7920454f41206f72206f776e657260448201526064016107b1565b600354610e2c5760405162461bcd60e51b815260206004820152602960248201527f5369706865724e465453616c653a206d65726b6c6520726f6f74206973206e6f60448201527f742073657420796574000000000000000000000000000000000000000000000060648201526084016107b1565b7f00000000000000000000000009e0df4ae51111ca27d6b85708cfb3f1f7cae98273ffffffffffffffffffffffffffffffffffffffff16635aca19826040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610e9457600080fd5b505af1158015610ea8573d6000803e3d6000fd5b505060405173ffffffffffffffffffffffffffffffffffffffff841692507f725104c01ecbd360f4bbc17ad33decbdea38bb98d79bf23f0ae2e374d002381e9150600090a250565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f575760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b1565b610f616000611627565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314610fca5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b1565b60055467ffffffffffffffff16421061104b5760405162461bcd60e51b815260206004820152603460248201527f5369706865724e465453616c653a206f6e6c7920757064617465206265666f7260448201527f652077686974656c697374206275792074696d6500000000000000000000000060648201526084016107b1565b806110985760405162461bcd60e51b815260206004820152601b60248201527f5369706865724e465453616c653a20696e76616c696420726f6f74000000000060448201526064016107b1565b6003541561110e5760405162461bcd60e51b815260206004820152602660248201527f5369706865724e465453616c653a20616c726561647920736574206d65726b6c60448201527f6520726f6f74000000000000000000000000000000000000000000000000000060648201526084016107b1565b60038190556040518181527f914960aef5e033ce5cae8a7992d4b7a6f0f9741227b66acb67c605b7019f8a469060200160405180910390a150565b33803b15801561116e575073ffffffffffffffffffffffffffffffffffffffff811632145b80611193575060005473ffffffffffffffffffffffffffffffffffffffff8281169116145b6111df5760405162461bcd60e51b815260206004820181905260248201527f5369706865724e465453616c653a206f6e6c7920454f41206f72206f776e657260448201526064016107b1565b6003546112545760405162461bcd60e51b815260206004820152602960248201527f5369706865724e465453616c653a206d65726b6c6520726f6f74206973206e6f60448201527f742073657420796574000000000000000000000000000000000000000000000060648201526084016107b1565b600061125e610a5a565b905061126e82878787858861169c565b6040517f51dd47d100000000000000000000000000000000000000000000000000000000815263ffffffff8716600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152604482018390527f00000000000000000000000009e0df4ae51111ca27d6b85708cfb3f1f7cae98216906351dd47d190606401600060405180830381600087803b15801561130a57600080fd5b505af115801561131e573d6000803e3d6000fd5b50505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146113915760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b1565b73ffffffffffffffffffffffffffffffffffffffff811661141a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107b1565b61142381611627565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461148d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107b1565b60055467ffffffffffffffff90811690861610156115135760405162461bcd60e51b815260206004820152602660248201527f5369706865724e465453616c653a20496e76616c69642073616c652074696d6560448201527f20696e707574000000000000000000000000000000000000000000000000000060648201526084016107b1565b6005805467ffffffffffffffff8781167fffffffffffffffffffffffffffffffff00000000000000000000000000000000909216919091176801000000000000000087831602176fffffffffffffffffffffffffffffffff167001000000000000000000000000000000008683160277ffffffffffffffffffffffffffffffffffffffffffffffff161778010000000000000000000000000000000000000000000000008583160217909155600680547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001691831691821790556040519081527f1211a68a972c0c6584b66e6405f451ba8bd6303b3283d04bf1b45fea011671529060200160405180910390a15050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040805160c08101825260055467ffffffffffffffff808216835268010000000000000000808304821660208501527001000000000000000000000000000000008304821694840194909452780100000000000000000000000000000000000000000000000090910481166060830152600654908116608083015263ffffffff929004821660a082018190526004549192909161173b918991166129b4565b63ffffffff1611156117b55760405162461bcd60e51b815260206004820152602160248201527f5369706865724e465453616c653a206d617820737570706c792072656163686560448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016107b1565b6000805473ffffffffffffffffffffffffffffffffffffffff1690349042906117e463ffffffff8b16886129dc565b90508373ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1614156119b657846080015167ffffffffffffffff1682116118c9576004546101f49061184f908c90640100000000900463ffffffff166129b4565b63ffffffff1611156118c95760405162461bcd60e51b815260206004820152602860248201527f5369706865724e465453616c653a206d6178206f776e657220696e697469616c60448201527f207265616368656400000000000000000000000000000000000000000000000060648201526084016107b1565b600480548b919081906118eb908490640100000000900463ffffffff166129b4565b92506101000a81548163ffffffff021916908363ffffffff16021790555089600460000160008282829054906101000a900463ffffffff1661192d91906129b4565b92506101000a81548163ffffffff021916908363ffffffff1602179055508a73ffffffffffffffffffffffffffffffffffffffff167f1ca9c289d71bbc4091bbd521526b4a23f027aa0971b5b5dc8efe2781f56901a28b856040516119a492919063ffffffff929092168252602082015260400190565b60405180910390a250505050506125fa565b845167ffffffffffffffff16821015611a375760405162461bcd60e51b815260206004820152602660248201527f5369706865724e465453616c653a205075626c69632053616c65206e6f74207360448201527f746172746564000000000000000000000000000000000000000000000000000060648201526084016107b1565b846080015167ffffffffffffffff16821115611a955760405162461bcd60e51b815260206004820152601c60248201527f5369706865724e465453616c653a20616c726561647920656e6465640000000060448201526064016107b1565b845167ffffffffffffffff168210801590611abd5750846020015167ffffffffffffffff1682105b15611e5e5760025460a0860151611ada9163ffffffff1690612a30565b60045463ffffffff91821691611aff918d9168010000000000000000909104166129b4565b63ffffffff161115611b795760405162461bcd60e51b815260206004820152602d60248201527f5369706865724e465453616c653a206d6178207075626c69632073616c65207360448201527f7570706c7920726561636865640000000000000000000000000000000000000060648201526084016107b1565b73ffffffffffffffffffffffffffffffffffffffff8b16600090815260076020526040902054600590611bb3908c9063ffffffff166129b4565b63ffffffff161115611c2d5760405162461bcd60e51b815260206004820152602160248201527f5369706865724e465453616c653a206e6f726d616c206361702072656163686560448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016107b1565b808310158015611c45575067016345785d8a00008110155b611cb75760405162461bcd60e51b815260206004820152602160248201527f5369706865724e465453616c653a20696e76616c696420706169642076616c7560448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016107b1565b600480548b9190600890611cde90849068010000000000000000900463ffffffff166129b4565b82546101009290920a63ffffffff81810219909316918316021790915573ffffffffffffffffffffffffffffffffffffffff8d16600090815260076020526040812080548e94509092611d33918591166129b4565b92506101000a81548163ffffffff021916908363ffffffff16021790555089600460000160008282829054906101000a900463ffffffff16611d7591906129b4565b92506101000a81548163ffffffff021916908363ffffffff16021790555080341115611e0a57611dae33611da98334612a19565b612602565b7fbb28353e4598c3b9199101a66e0989549b659a59a54d2c27fbb183f1932c8e6d8b611dda8334612a19565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260208301919091520160405180910390a15b6040805163ffffffff8c1681526020810185905273ffffffffffffffffffffffffffffffffffffffff8d16917f9c7d460a4c96d5a49f28ad6de77cfa11a924009fc0ed49d338fd70abf47d5b9891016119a4565b81856020015167ffffffffffffffff1611158015611e895750846060015167ffffffffffffffff1682105b156122435781856040015167ffffffffffffffff1611158015611eb95750846060015167ffffffffffffffff1682105b611f2b5760405162461bcd60e51b815260206004820152602760248201527f5369706865724e465453616c653a20507269766174652053616c65206e6f742060448201527f737461727465640000000000000000000000000000000000000000000000000060648201526084016107b1565b611f4367016345785d8a000063ffffffff8c166129dc565b8314611fb75760405162461bcd60e51b815260206004820152602160248201527f5369706865724e465453616c653a20696e76616c696420706169642076616c7560448201527f650000000000000000000000000000000000000000000000000000000000000060648201526084016107b1565b73ffffffffffffffffffffffffffffffffffffffff8b1660009081526007602052604090205463ffffffff808b1691611ffa918d916401000000009004166129b4565b63ffffffff1611156120745760405162461bcd60e51b815260206004820152603360248201527f5369706865724e465453616c653a2077686974656c697374656420707269766160448201527f74652073616c652063617020726561636865640000000000000000000000000060648201526084016107b1565b6120808b8a8a8961091e565b801561208d575060015415155b6120ff5760405162461bcd60e51b815260206004820152602560248201527f5369706865724e465453616c653a206f6e6c792077686974656c69737465642060448201527f627579657200000000000000000000000000000000000000000000000000000060648201526084016107b1565b600480548b9190600c9061212a9084906c01000000000000000000000000900463ffffffff166129b4565b82546101009290920a63ffffffff81810219909316918316021790915573ffffffffffffffffffffffffffffffffffffffff8d16600090815260076020526040902080548d9350909160049161218a9185916401000000009004166129b4565b92506101000a81548163ffffffff021916908363ffffffff16021790555089600460000160008282829054906101000a900463ffffffff166121cc91906129b4565b92506101000a81548163ffffffff021916908363ffffffff1602179055508a73ffffffffffffffffffffffffffffffffffffffff167f9461d7fe029c7f3dad29448031d090ac9ecba211b35697793ad8d5db43456af28b856040516119a492919063ffffffff929092168252602082015260400190565b81856060015167ffffffffffffffff161115801561226e5750846080015167ffffffffffffffff1682105b156125f45781856060015167ffffffffffffffff161115801561229e5750846080015167ffffffffffffffff1682105b61230f5760405162461bcd60e51b8152602060048201526024808201527f5369706865724e465453616c653a2046726565204d696e74206e6f742073746160448201527f727465640000000000000000000000000000000000000000000000000000000060648201526084016107b1565b821561235d5760405162461bcd60e51b815260206004820152601360248201527f496e76616c6964207061696420616d6f756e740000000000000000000000000060448201526064016107b1565b6123698b8a8a8961091e565b8015612376575060015415155b6123e85760405162461bcd60e51b815260206004820152602560248201527f5369706865724e465453616c653a206f6e6c792077686974656c69737465642060448201527f627579657200000000000000000000000000000000000000000000000000000060648201526084016107b1565b73ffffffffffffffffffffffffffffffffffffffff8b1660009081526007602052604090205463ffffffff808a169161242f918d91680100000000000000009004166129b4565b63ffffffff1611156124a85760405162461bcd60e51b8152602060048201526024808201527f5369706865724e465453616c653a2066726565206d696e74206361702072656160448201527f636865640000000000000000000000000000000000000000000000000000000060648201526084016107b1565b600480548b91906010906124d7908490700100000000000000000000000000000000900463ffffffff166129b4565b82546101009290920a63ffffffff81810219909316918316021790915573ffffffffffffffffffffffffffffffffffffffff8d16600090815260076020526040902080548d9350909160089161253b918591680100000000000000009004166129b4565b92506101000a81548163ffffffff021916908363ffffffff16021790555089600460000160008282829054906101000a900463ffffffff1661257d91906129b4565b92506101000a81548163ffffffff021916908363ffffffff1602179055508a73ffffffffffffffffffffffffffffffffffffffff167f422746c21d723e4ab5390bd3517f34279c6049ff2b4757911b0799a086c6a5fb8b856040516119a492919063ffffffff929092168252602082015260400190565b50505050505b505050505050565b804710156126525760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016107b1565b60008273ffffffffffffffffffffffffffffffffffffffff168260405160006040518083038185875af1925050503d80600081146126ac576040519150601f19603f3d011682016040523d82523d6000602084013e6126b1565b606091505b50509050806127285760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016107b1565b505050565b600082601f83011261273d578081fd5b8135602067ffffffffffffffff8083111561275a5761275a612abd565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f8301168101818110848211171561279d5761279d612abd565b604052848152838101925086840182880185018910156127bb578687fd5b8692505b858310156127dd5780358452928401926001929092019184016127bf565b50979650505050505050565b803563ffffffff811681146127fd57600080fd5b919050565b803567ffffffffffffffff811681146127fd57600080fd5b60006020828403121561282b578081fd5b813561283681612aec565b9392505050565b6000806040838503121561284f578081fd5b823561285a81612aec565b946020939093013593505050565b6000806000806080858703121561287d578182fd5b843561288881612aec565b9350612896602086016127e9565b92506128a4604086016127e9565b9150606085013567ffffffffffffffff8111156128bf578182fd5b6128cb8782880161272d565b91505092959194509250565b6000602082840312156128e8578081fd5b5035919050565b60008060408385031215612901578182fd5b82359150612911602084016127e9565b90509250929050565b6000806000806080858703121561292f578384fd5b612888856127e9565b600080600080600060a0868803121561294f578081fd5b61295886612802565b945061296660208701612802565b935061297460408701612802565b925061298260608701612802565b915061299060808701612802565b90509295509295909350565b600082198211156129af576129af612a8e565b500190565b600063ffffffff8083168185168083038211156129d3576129d3612a8e565b01949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612a1457612a14612a8e565b500290565b600082821015612a2b57612a2b612a8e565b500390565b600063ffffffff83811690831681811015612a4d57612a4d612a8e565b039392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612a8757612a87612a8e565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461142357600080fdfea2646970667358221220b16e0d2c88b488f73b4e79a289d4a090af8c40bcdc92270166b2121d444084bb64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000009e0df4ae51111ca27d6b85708cfb3f1f7cae982000000000000000000000000000000000000000000000000000000006185da980000000000000000000000000000000000000000000000000000000061860270000000000000000000000000000000000000000000000000000000006186ad88000000000000000000000000000000000000000000000000000000006187ff0800000000000000000000000000000000000000000000000000000000618950880000000000000000000000000000000000000000000000000000000000002710
-----Decoded View---------------
Arg [0] : _nft (address): 0x09E0dF4aE51111CA27d6B85708CFB3f1F7cAE982
Arg [1] : _publicTime (uint64): 1636162200
Arg [2] : _publicEndTime (uint64): 1636172400
Arg [3] : _privateTime (uint64): 1636216200
Arg [4] : _freeMintTime (uint64): 1636302600
Arg [5] : _endTime (uint64): 1636389000
Arg [6] : _maxSupply (uint32): 10000
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 00000000000000000000000009e0df4ae51111ca27d6b85708cfb3f1f7cae982
Arg [1] : 000000000000000000000000000000000000000000000000000000006185da98
Arg [2] : 0000000000000000000000000000000000000000000000000000000061860270
Arg [3] : 000000000000000000000000000000000000000000000000000000006186ad88
Arg [4] : 000000000000000000000000000000000000000000000000000000006187ff08
Arg [5] : 0000000000000000000000000000000000000000000000000000000061895088
Arg [6] : 0000000000000000000000000000000000000000000000000000000000002710
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.