Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 5,012 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Buy | 13776519 | 1539 days ago | IN | 0.1 ETH | 0.00131171 | ||||
| Buy | 13766199 | 1540 days ago | IN | 0.1 ETH | 0.00275361 | ||||
| Buy | 13766199 | 1540 days ago | IN | 0.1 ETH | 0.00275361 | ||||
| Buy | 13766199 | 1540 days ago | IN | 0.1 ETH | 0.00275361 | ||||
| Buy | 13766199 | 1540 days ago | IN | 0.1 ETH | 0.00275361 | ||||
| Buy | 13766199 | 1540 days ago | IN | 0.1 ETH | 0.00275361 | ||||
| Buy | 13660274 | 1557 days ago | IN | 0.3 ETH | 0.0048876 | ||||
| Buy | 13660267 | 1557 days ago | IN | 0.4 ETH | 0.00518095 | ||||
| Buy | 13605735 | 1566 days ago | IN | 0.1 ETH | 0.00294022 | ||||
| Buy | 13587779 | 1569 days ago | IN | 0 ETH | 0.00327947 | ||||
| Buy | 13586618 | 1569 days ago | IN | 0 ETH | 0.005233 | ||||
| Roll Start Index | 13584432 | 1569 days ago | IN | 0 ETH | 0.00568787 | ||||
| Roll Start Index | 13584430 | 1569 days ago | IN | 0 ETH | 0.00976087 | ||||
| Buy | 13584378 | 1569 days ago | IN | 0 ETH | 0.0311496 | ||||
| Buy | 13584375 | 1569 days ago | IN | 0 ETH | 0.00872848 | ||||
| Buy | 13584374 | 1569 days ago | IN | 0 ETH | 0.03776829 | ||||
| Buy | 13584344 | 1569 days ago | IN | 0 ETH | 0.04165254 | ||||
| Buy | 13584322 | 1569 days ago | IN | 0 ETH | 0.04887757 | ||||
| Buy | 13584322 | 1569 days ago | IN | 0 ETH | 0.04965529 | ||||
| Buy | 13584273 | 1569 days ago | IN | 0 ETH | 0.0527146 | ||||
| Buy | 13584250 | 1569 days ago | IN | 0 ETH | 0.03301407 | ||||
| Buy | 13584195 | 1569 days ago | IN | 0 ETH | 0.02380656 | ||||
| Buy | 13584189 | 1569 days ago | IN | 0 ETH | 0.02696543 | ||||
| Buy | 13584164 | 1569 days ago | IN | 0 ETH | 0.02576614 | ||||
| Buy | 13584115 | 1569 days ago | IN | 0 ETH | 0.02206726 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 13578597 | 1570 days ago | 424.1 ETH | ||||
| - | 13577675 | 1570 days ago | 0.25 ETH | ||||
| - | 13577675 | 1570 days ago | 0.05 ETH | ||||
| - | 13577675 | 1570 days ago | 0.25 ETH | ||||
| - | 13577670 | 1570 days ago | 0.25 ETH | ||||
| - | 13577670 | 1570 days ago | 0.1 ETH | ||||
| - | 13577670 | 1570 days ago | 0.05 ETH | ||||
| - | 13577669 | 1570 days ago | 0.05 ETH | ||||
| - | 13577669 | 1570 days ago | 0.25 ETH | ||||
| - | 13577669 | 1570 days ago | 0.25 ETH | ||||
| - | 13577664 | 1570 days ago | 0.1 ETH | ||||
| - | 13577664 | 1570 days ago | 0.05 ETH | ||||
| - | 13577664 | 1570 days ago | 0.25 ETH | ||||
| - | 13577664 | 1570 days ago | 0.25 ETH | ||||
| - | 13577664 | 1570 days ago | 0.1 ETH | ||||
| - | 13577663 | 1570 days ago | 0.2 ETH | ||||
| - | 13577663 | 1570 days ago | 0.05 ETH | ||||
| - | 13577663 | 1570 days ago | 0.05 ETH | ||||
| - | 13577663 | 1570 days ago | 0.1 ETH | ||||
| - | 13577663 | 1570 days ago | 0.2 ETH | ||||
| - | 13577663 | 1570 days ago | 0.05 ETH | ||||
| - | 13577663 | 1570 days ago | 0.25 ETH | ||||
| - | 13577663 | 1570 days ago | 0.25 ETH | ||||
| - | 13577663 | 1570 days ago | 0.25 ETH | ||||
| - | 13577663 | 1570 days ago | 0.05 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
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
Contract ABI
API[{"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
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.