Contract 0x8257079080174d349a4597bd7c27b19901b96e1d

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x1833f2552dc6c405a9259491d16b3728d8d19f930abdc33ee2596af26140afadMint46706602022-09-17 5:46:288 days 16 hrs ago0x4018d5e4d76ef1b161e24e700585f20001819bfa IN  0x8257079080174d349a4597bd7c27b19901b96e1d1,300 CRO0.4884047544360
0x98892d91a5ba620e04be697154d2bdb8cd44d32b57107cbeb40d0115a229bc3aMint46596102022-09-16 12:21:589 days 9 hrs ago0x8aa05395d53d9a57e58a0adc2ddb6a721b7781aa IN  0x8257079080174d349a4597bd7c27b19901b96e1d650 CRO0.4146411917660
0x2df4be010d603d008bbb25a9f82d2d8c2df352c02b482c2c88079f12b1b15224Mint46595622022-09-16 12:17:209 days 9 hrs ago0x1da29ca4e330f0faa816edb6b55b46f9ee453f7f IN  0x8257079080174d349a4597bd7c27b19901b96e1d650 CRO0.414767789449 4,919.031172682
0x014d53ba67b24e1d5823c3d197f643517728f933e908d2d79becbf536f7825dfMint46595612022-09-16 12:17:159 days 9 hrs ago0xd81cd15d885822ee3c6f34e1c2812d4995e75f44 IN  0x8257079080174d349a4597bd7c27b19901b96e1d1,300 CRO0.4146413166250
0x4454919f5958ee1a44e9691a51cb0ae55daab70b6637ed79688ed5ec14c3cccbMint46595612022-09-16 12:17:159 days 9 hrs ago0xe7a85df9c54d543cae0e95e54a72c59e0b3bb2ce IN  0x8257079080174d349a4597bd7c27b19901b96e1d1,300 CRO0.414767788509 4,919.031161532
0x04f06aed5e87472cf90ccf9fcdff3978980f10f8faf48061c5edb78b843c1a45Mint46595602022-09-16 12:17:099 days 9 hrs ago0x46e37cd64ea68ff7a7adc57eec384d70434f065d IN  0x8257079080174d349a4597bd7c27b19901b96e1d650 CRO0.414767792059 4,919.031203636
0x331e1c3130f3028882d41fbc2936aee05ab32b3961042813dc49e0f89acb0d53Mint46595602022-09-16 12:17:099 days 9 hrs ago0x001572011e65a7b08dd0f3c36a07bc235937cabc IN  0x8257079080174d349a4597bd7c27b19901b96e1d650 CRO0.414767792059 4,919.031203636
0xa7fd57e7260fb652e94f633a7170609a20fd993ebddb59c9cea6697eaae98a5bMint46595602022-09-16 12:17:099 days 9 hrs ago0xe9bea05cdc535d360ab8fbe98fd27e3e6d38ca29 IN  0x8257079080174d349a4597bd7c27b19901b96e1d650 CRO0.4146413185450
0xb2df12a393701b31da0d53eb6ca99ca69a757ba9b4a8049ab1718bf127b94602Mint46595602022-09-16 12:17:099 days 9 hrs ago0x072d1485c8fee948ff35550ba36f9072b75ba029 IN  0x8257079080174d349a4597bd7c27b19901b96e1d650 CRO0.414767792059 4,919.031203636
0xd18339fc606f691212311b55ae0676e6f2a91dfd81dda44a8c712715a80a8a16Mint46595602022-09-16 12:17:099 days 9 hrs ago0xf2d820fd8d9362b7c2489bf319d178a6d694e0c5 IN  0x8257079080174d349a4597bd7c27b19901b96e1d1,300 CRO1.9942703989210
0x2c45a4cd84737efec6beb7dbb0b99b1953f630da76e7c9aa84753f32fd40d245Mint46595592022-09-16 12:17:039 days 9 hrs ago0x79a948981a402fdba166420d6deea1be792634a7 IN  0x8257079080174d349a4597bd7c27b19901b96e1d650 CRO1.183927183889 4,919.031189946
0xd757b0b7fd9235cfb34c85425e12848fffb9943472e07f7e59cf97a3b9b0038fMint46595592022-09-16 12:17:039 days 9 hrs ago0x8ad01ed7fc839e9523447ae7d00fba695ef9875f IN  0x8257079080174d349a4597bd7c27b19901b96e1d650 CRO1.2573291572220
0x480cc560188e8ca7021c70acb54d426b41a332b26b25c72be684483f69cdba42Mint46595582022-09-16 12:16:579 days 9 hrs ago0xd867ef767cdfd2faebe07816866e5e21ffa7b2cc IN  0x8257079080174d349a4597bd7c27b19901b96e1d650 CRO1.310438495340
0x4da18dc19fa5078a1cdaecb10cf64a35dd5373ba65420fc8e33047bc83dc53c4Mint46595572022-09-16 12:16:529 days 9 hrs ago0x46e37cd64ea68ff7a7adc57eec384d70434f065d IN  0x8257079080174d349a4597bd7c27b19901b96e1d650 CRO1.183927189582 4,919.031213599
0x4c5ba57121ad05801f34477d427d4f1b7c50694b21c3be4a0d4d8579e7e08805Mint46595572022-09-16 12:16:529 days 9 hrs ago0x0d0ec00cf4268e87e9f3a2125efa8e1a1ef50884 IN  0x8257079080174d349a4597bd7c27b19901b96e1d650 CRO1.1835661931040
0xce603e02bf2c2459b8d17e5ae76a3daaa7dfb80e29be9755720612605ffff00eMint46595572022-09-16 12:16:529 days 9 hrs ago0x3e9a40e07de62f15e4ab2db205065528d0707c34 IN  0x8257079080174d349a4597bd7c27b19901b96e1d650 CRO1.1835661931040
0x48c0d340b7807e19fb8e971e98c03c733c156f0c0bf92c184ba6e77c7cee6968Mint46595562022-09-16 12:16:469 days 9 hrs ago0xe9bea05cdc535d360ab8fbe98fd27e3e6d38ca29 IN  0x8257079080174d349a4597bd7c27b19901b96e1d650 CRO1.1835661931040
0xb66af03d8f613eb8a47c97b36eb76100ac8c30109db284936430922afae94811Mint46595552022-09-16 12:16:419 days 9 hrs ago0x79a948981a402fdba166420d6deea1be792634a7 IN  0x8257079080174d349a4597bd7c27b19901b96e1d650 CRO1.183927197394 4,919.031246056
0xa048dac27c4f1d1d736f68238351dcd9da65e4a13627104d5b1869ebf41ee459Mint46595552022-09-16 12:16:419 days 9 hrs ago0x13d33ae74eb85fb2da79b84e36dd26a34fb37612 IN  0x8257079080174d349a4597bd7c27b19901b96e1d2,600 CRO3.308824904410
0x6d1c4483d15d329c89cbac9389e0c1b9a45aceee7af77ca998597986c328b552Mint46595542022-09-16 12:16:359 days 9 hrs ago0xdbcff885dc2be77fa28caf882c10ed2c16dc2ce7 IN  0x8257079080174d349a4597bd7c27b19901b96e1d650 CRO1.183566220370
0x199228bb776b3fdf12fc6c4f56db38df24e8309c69d4a4eb16c7554e43f5e616Mint46595542022-09-16 12:16:359 days 9 hrs ago0x3e9a40e07de62f15e4ab2db205065528d0707c34 IN  0x8257079080174d349a4597bd7c27b19901b96e1d650 CRO1.3104385316080
0xfbabcd335eb4cbe86248ca630f185e3780e46cade9d40fd7841f1b67538914b6Mint46595542022-09-16 12:16:359 days 9 hrs ago0x13ea53d87397c8d30e0abb7ebbd1f84b80cb7cda IN  0x8257079080174d349a4597bd7c27b19901b96e1d1,300 CRO1.994878702729 4,919.031280849
0x7cf1780821fbe7944be332a75befcbe5d7652a08939718fb9b10dc1430ad303fMint46595542022-09-16 12:16:359 days 9 hrs ago0x3f0033a6288d1d1d92b2a9fa4ccef3f0ba8ab94b IN  0x8257079080174d349a4597bd7c27b19901b96e1d650 CRO1.183566220370
0x3b067c1d4bb098faa1a08e043ce1e110b37efc3734bb98ad53e39c9f9b6197eeMint46595532022-09-16 12:16:299 days 9 hrs ago0x838735144063139d261bfb40b938441c40b88a25 IN  0x8257079080174d349a4597bd7c27b19901b96e1d4,550 CRO5.2865577554130
0xbd6abebb5af52a949493c6b83258d162002572b06d481959786fb1a4af4ed58eMint46595522022-09-16 12:16:239 days 9 hrs ago0xd3aaa749730f3a47c8c830b2cc46b582311d8dd6 IN  0x8257079080174d349a4597bd7c27b19901b96e1d650 CRO1.183927213314 4,919.031312202
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CronosCruiserCrowdsale

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 10 : CronosCruiserCrowdsale.sol
// SPDX-License-Identifier: MIT
pragma solidity >0.8.0;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import "./interface/ICronosCruiser.sol";
import "./interface/ICronosCruiserCrowdsale.sol";

/**
 * @notice Crowdsale of CronosCruiser
 *
 * @dev functions defination please refer to ICronosCruiserCrowdsale
 */
contract CronosCruiserCrowdsale is Ownable, ReentrancyGuard, ICronosCruiserCrowdsale {
    ICronosCruiser public immutable cronosCruiser; // NFT to be mint

    /* ============ Data ============ */
    uint8 public constant MAX_PER_USER_ALL_ROUNDS = 50;
    mapping(SalePhase => uint256) public numOfMint;
    mapping(SalePhase => Sale) private sales;
    /** The tokenId of each address */
    mapping(address => uint256[]) public userMintedTokens;
    mapping(address => mapping(SalePhase => uint256)) public userMintedTokensPerPhase;

    /* ============ Events ============ */
    event Mint(uint8 indexed _salePhase, address indexed _address, uint256 mintAmount, uint256 costToMint);
    event MintRemainingNFT(address indexed _address, uint256 mintAmount);
    event SetSale(
        SalePhase salePhase,
        uint256 startTime,
        uint256 durationInSec,
        uint256 maxMintQuota,
        uint256 maxMintQuotaPerAddress,
        uint256 price,
        bytes32 whitelistedMerkleRoot
    );

    /* ============ Modifier ============ */
    modifier isValidSaleConfig(Sale memory sale, SalePhase salePhase) {
        require(
            sale.startTime > block.timestamp,
            "CronosCruiserCrowdsale:isValidSaleConfig: startTime should be > now"
        );
        require(sale.durationInSec > 0, "CronosCruiserCrowdsale:isValidSaleConfig: durationInSec should be > 0");
        require(sale.maxMintQuota > 0, "CronosCruiserCrowdsale:isValidSaleConfig: maxMintQuota should be > 0");
        require(
            sale.maxMintQuotaPerAddress > 0,
            "CronosCruiserCrowdsale:isValidSaleConfig: maxMintQuotaPerAddress should be > 0"
        );
        if (salePhase != SalePhase.FREE) {
            require(sale.price > 0, "CronosCruiserCrowdsale:isValidSaleConfig: price should be > 0");
        }
        _;
    }

    constructor(
        address _CronosCruisers,
        Sale memory _freeSale,
        Sale memory _allowListSale,
        Sale memory _publicSale
    ) {
        cronosCruiser = ICronosCruiser(_CronosCruisers);
        require(
            _freeSale.startTime + _freeSale.durationInSec < _allowListSale.startTime,
            "CronosCruiserCrowdsale: _freeSale & _allowListSale overlapped"
        );
        require(
            _allowListSale.startTime + _allowListSale.durationInSec < _publicSale.startTime,
            "CronosCruiserCrowdsale: _allowListSale & _publicSale overlapped"
        );
        _setSale(_freeSale, SalePhase.FREE);
        _setSale(_allowListSale, SalePhase.ALLOWLIST);
        _setSale(_publicSale, SalePhase.PUBLIC);
    }

    function getSale(SalePhase _salePhase) external view returns (Sale memory) {
        return sales[_salePhase];
    }

    function getUserMintedTokens(address _address) public view returns (uint256[] memory) {
        return userMintedTokens[_address];
    }

    function userMintedTokensLength(address _address) public view returns (uint256) {
        return userMintedTokens[_address].length;
    }

    function mint(uint256 _mintAmount, bytes32[] memory _merkleProof) external payable nonReentrant {
        SalePhase salePhase = getCurrentSalePhase();
        require(isSaleActive(salePhase), "CronosCruiserCrowdsale:mint: Sale is not active");
        require(
            isWhitelistedAddress(msg.sender, _merkleProof, salePhase),
            "CronosCruiserCrowdsale:mint: Non-whitelisted Address"
        );
         require(
            userMintedTokensPerPhase[msg.sender][salePhase] + _mintAmount <= sales[salePhase].maxMintQuotaPerAddress,
            "CronosCruiserCrowdsale:mint: Requested _mintAmount exceeds maximum per address per phrase"
        );
        require(
            userMintedTokensLength(msg.sender) + _mintAmount <= MAX_PER_USER_ALL_ROUNDS,
            "CronosCruiserCrowdsale:mint: Requested _mintAmount exceeds maximum per address"
        );
        uint256 costToMint = getPrice(salePhase) * _mintAmount;
        require(msg.value >= costToMint, "CronosCruiserCrowdsale:mint: Not enough msg.value");
        require(
            numOfMint[salePhase] + _mintAmount <= sales[salePhase].maxMintQuota,
            "CronosCruiserCrowdsale:mint: Minting would exceed max Quota"
        );
        userMintedTokensPerPhase[msg.sender][salePhase] += _mintAmount;
        numOfMint[salePhase] +=  _mintAmount;
        _batchMint(_mintAmount, msg.sender);
        
        emit Mint(uint8(salePhase), msg.sender, _mintAmount, costToMint);
    }

    function _batchMint(uint256 _mintAmount, address _toAddress) internal {
        uint256 mintIndex = cronosCruiser.totalSupply();
        require(
            mintIndex + _mintAmount <= cronosCruiser.MAX_SUPPLY(),
            "CronosCruiserCrowdsale:_mint: Minting would exceed max supply"
        );
        require(_mintAmount > 0, "CronosCruiserCrowdsale:_mint: _mintAmount should be > 0");
        for (uint256 i = 0; i < _mintAmount; i++) {
            cronosCruiser.mintByCrowdsale(mintIndex + i, _toAddress);
            userMintedTokens[_toAddress].push(mintIndex + i);
        }
    }

    function getCurrentSalePhase() public view returns (SalePhase) {
        if (block.timestamp > sales[SalePhase.ALLOWLIST].startTime + sales[SalePhase.ALLOWLIST].durationInSec) {
            return SalePhase.PUBLIC;
        }
        if (block.timestamp > sales[SalePhase.FREE].startTime + sales[SalePhase.FREE].durationInSec) {
            return SalePhase.ALLOWLIST;
        }
        return SalePhase.FREE;
    }

    function isWhitelistedAddress(
        address _address,
        bytes32[] memory _merkleProof,
        SalePhase _salePhase
    ) public view returns (bool) {
        bytes32 merkleRoot = sales[_salePhase].whitelistedMerkleRoot;
        if (merkleRoot != 0) {
            return (MerkleProof.verify(_merkleProof, merkleRoot, keccak256(abi.encodePacked(_address))));
        }
        return true;
    }

    function isSaleActive(SalePhase _salePhase) public view returns (bool) {
        return
            block.timestamp >= sales[_salePhase].startTime &&
            block.timestamp < sales[_salePhase].startTime + sales[_salePhase].durationInSec;
    }

    function mintRemainingNFT(address _toAddress, uint256 _amount) external onlyOwner returns (uint256) {
        require(
            block.timestamp > sales[SalePhase.PUBLIC].startTime + sales[SalePhase.PUBLIC].durationInSec,
            "CronosCruiserCrowdsale:mintRemainingNFT: Not allow before public sales end"
        );
        require(_amount < 201, "Quantity exceeds the maximum value");
        _batchMint(_amount, _toAddress);
        emit MintRemainingNFT(_toAddress, _amount);
        return _amount;
    }

    function getPrice(SalePhase _salePhase) public view returns (uint256) {
        return sales[_salePhase].price;
    }

    /* ========== ONLY OWNER FUNCTIONS ========== */

    function updateSale(Sale memory sale, SalePhase salePhase)
        external
        onlyOwner
        isValidSaleConfig(sale, salePhase)
    {
        if (uint8(salePhase) != 0) {
            SalePhase previousSalePhase = SalePhase(uint256(salePhase) - 1);
            require(
                sales[previousSalePhase].startTime + sales[previousSalePhase].durationInSec < sale.startTime,
                "CronosCruiserCrowdsale:_setSale: overlapping with previousSalePhase"
            );
        }
        if (salePhase < SalePhase.PUBLIC) {
            SalePhase nextSalePhase = SalePhase(uint256(salePhase) + 1);
            require(
                sale.startTime + sale.durationInSec < sales[nextSalePhase].startTime,
                "CronosCruiserCrowdsale:_setSale: overlapping with nextSalePhase"
            );
        }
        require(
            salePhase >= getCurrentSalePhase(),
            "CronosCruiserCrowdsale:_setSale: Edit historical SalePhase rejected"
        );
        require(
            block.timestamp < sales[salePhase].startTime,
            "CronosCruiserCrowdsale:_setSale: Sale has already begun"
        );
        _setSale(sale, salePhase);
    }

    function _setSale(Sale memory sale, SalePhase salePhase) internal isValidSaleConfig(sale, salePhase) {
        sales[salePhase] = sale;
        emit SetSale(
            salePhase,
            sale.startTime,
            sale.durationInSec,
            sale.maxMintQuota,
            sale.maxMintQuotaPerAddress,
            sale.price,
            sale.whitelistedMerkleRoot
        );
    }

    function transferBalance() external onlyOwner {
        uint256 balance = address(this).balance;
        (bool sent, ) = payable(msg.sender).call{value: balance}("");
        require(sent, "CronosCruiserCrowdsale:transferBalance: Failed to send ");
    }
}

File 2 of 10 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev 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 {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 10 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 4 of 10 : MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 5 of 10 : ICronosCruiser.sol
// SPDX-License-Identifier: MIT
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
pragma solidity >=0.8.0;

/**
 * @title CronosCruiser in ERC-721 Non-Fungible Token Standard
 */
interface ICronosCruiser is IERC721Enumerable {
    /**
     * @notice maximum supply for this NFT
     */
    function MAX_SUPPLY() external view returns (uint256);

    /**
     * @notice crowdsale contract of CronosCruiser
     */
    function crowdsale() external view returns (address);

    /**
     * @notice IPFS baseURI of NFT
     */
    function baseURI() external view returns (string memory);

    /**
     * @notice admin function to update baseURI
     */
    function setBaseURI(string memory uri) external;

    /**
     * @notice admin function to control whitelist who can mint CronosCruiser
     */
    function setCrowdsale(address crowdsale) external;

    /**
     * @param tokenId tokenId to be check
     * @notice if given tokenId is minted, return true
     */
    function isMinted(uint256 tokenId) external view returns (bool);

    /**
     * @param tokenId tokenId to be minted
     * @param minter ERC721 mint to, = token owner after minting
     */
    function mintByCrowdsale(uint256 tokenId, address minter) external;

    /**
     * @param _royaltyReceiver royalty receiver
     * @param _royaltyFee A value of 100 means 1%
     */
    function updateRoyalty(address _royaltyReceiver, uint96 _royaltyFee) external;
}

File 6 of 10 : ICronosCruiserCrowdsale.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

import "./ICronosCruiser.sol";

/**
 * @notice Crowdsale of CronosCruiser
 */
interface ICronosCruiserCrowdsale {
    enum SalePhase {
        FREE,
        ALLOWLIST,
        PUBLIC
    }

    struct Sale {
        uint256 startTime;
        uint256 durationInSec;
        uint256 maxMintQuota; // total allowable mint amount in this phrase
        uint256 maxMintQuotaPerAddress;
        uint256 price;
        bytes32 whitelistedMerkleRoot;
    }

    /**
     * @dev ERC721 token address of CronosCruiser NFT
     */
    function cronosCruiser() external view returns (ICronosCruiser);

    /**
     * @return num of minted CronosCruiser NFT SalePhase in given SalePhase
     */
    function numOfMint(SalePhase SalePhase) external view returns (uint256 num);

    /**
     * @return Sale of corresponding SalePhase which includes time range & max setting & price & whitelisting
     */
    function getSale(SalePhase SalePhase) external view returns (Sale memory);

    /**
     * @param _address user address
     * @param _arrayIndex array index of all tokenId minted by given user address
     * @return tokenId get NFT's tokenId of given user & arrayIndex
     * If arrayIndex is unknown, please refer to getUserMintedTokens(_address)
     */
    function userMintedTokens(address _address, uint256 _arrayIndex) external view returns (uint256 tokenId);

    /**
     * @param _address user address
     * @return tokenIds all tokenIds which is minted by given user address
     */
    function getUserMintedTokens(address _address) external view returns (uint256[] memory tokenIds);

    /**
     * @param _address user address
     * @return numOfTokens number of all tokenIds which is minted by given user address
     */
    function userMintedTokensLength(address _address) external view returns (uint256 numOfTokens);

    /**
     * @return currentOrComingSalePhase currently active SalePhase / Next active SalePhase
     */
    function getCurrentSalePhase() external view returns (SalePhase currentOrComingSalePhase);

    /**
     * @param _address user address
     * @notice Check if given user is whitelisted address with given merkleProof and specific _SalePhase
     */
    function isWhitelistedAddress(
        address _address,
        bytes32[] calldata _merkleProof,
        SalePhase _SalePhase
    ) external view returns (bool);

    /**
     * @notice Check if given SalePhase is currently active
     */
    function isSaleActive(SalePhase SalePhase) external view returns (bool);

    /**
     * @notice get mint price of each NFT in terms of paymentToken
     */
    function getPrice(SalePhase SalePhase) external view returns (uint256);

    /**
     * @notice function for user mint NFT
     */
    function mint(uint256 _mintAmount, bytes32[] memory _merkleProof) external payable;

    /**
     * @notice function for minting remaining unminted NFT after public sales end,
     * It is recommended that the number of MINT should not exceed 210 at a time,
     * otherwise it will easily run out of GAS
     * @dev onlyOwner
     * @param _toAddress the receiver of the minted tokens
     * @param _amount the number of mint
     */
    function mintRemainingNFT(address _toAddress, uint256 _amount) external returns (uint256);

    function updateSale(Sale memory sale, SalePhase SalePhase) external;
}

File 7 of 10 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 8 of 10 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

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);

    /**
     * @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);
}

File 9 of 10 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

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;
}

File 10 of 10 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_CronosCruisers","type":"address"},{"components":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"durationInSec","type":"uint256"},{"internalType":"uint256","name":"maxMintQuota","type":"uint256"},{"internalType":"uint256","name":"maxMintQuotaPerAddress","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bytes32","name":"whitelistedMerkleRoot","type":"bytes32"}],"internalType":"struct ICronosCruiserCrowdsale.Sale","name":"_freeSale","type":"tuple"},{"components":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"durationInSec","type":"uint256"},{"internalType":"uint256","name":"maxMintQuota","type":"uint256"},{"internalType":"uint256","name":"maxMintQuotaPerAddress","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bytes32","name":"whitelistedMerkleRoot","type":"bytes32"}],"internalType":"struct ICronosCruiserCrowdsale.Sale","name":"_allowListSale","type":"tuple"},{"components":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"durationInSec","type":"uint256"},{"internalType":"uint256","name":"maxMintQuota","type":"uint256"},{"internalType":"uint256","name":"maxMintQuotaPerAddress","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bytes32","name":"whitelistedMerkleRoot","type":"bytes32"}],"internalType":"struct ICronosCruiserCrowdsale.Sale","name":"_publicSale","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"_salePhase","type":"uint8"},{"indexed":true,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"mintAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"costToMint","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"},{"indexed":false,"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"MintRemainingNFT","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":false,"internalType":"enum ICronosCruiserCrowdsale.SalePhase","name":"salePhase","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"durationInSec","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxMintQuota","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxMintQuotaPerAddress","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"whitelistedMerkleRoot","type":"bytes32"}],"name":"SetSale","type":"event"},{"inputs":[],"name":"MAX_PER_USER_ALL_ROUNDS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cronosCruiser","outputs":[{"internalType":"contract ICronosCruiser","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentSalePhase","outputs":[{"internalType":"enum ICronosCruiserCrowdsale.SalePhase","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum ICronosCruiserCrowdsale.SalePhase","name":"_salePhase","type":"uint8"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum ICronosCruiserCrowdsale.SalePhase","name":"_salePhase","type":"uint8"}],"name":"getSale","outputs":[{"components":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"durationInSec","type":"uint256"},{"internalType":"uint256","name":"maxMintQuota","type":"uint256"},{"internalType":"uint256","name":"maxMintQuotaPerAddress","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bytes32","name":"whitelistedMerkleRoot","type":"bytes32"}],"internalType":"struct ICronosCruiserCrowdsale.Sale","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getUserMintedTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum ICronosCruiserCrowdsale.SalePhase","name":"_salePhase","type":"uint8"}],"name":"isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"enum ICronosCruiserCrowdsale.SalePhase","name":"_salePhase","type":"uint8"}],"name":"isWhitelistedAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_toAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintRemainingNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum ICronosCruiserCrowdsale.SalePhase","name":"","type":"uint8"}],"name":"numOfMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"transferBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"durationInSec","type":"uint256"},{"internalType":"uint256","name":"maxMintQuota","type":"uint256"},{"internalType":"uint256","name":"maxMintQuotaPerAddress","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bytes32","name":"whitelistedMerkleRoot","type":"bytes32"}],"internalType":"struct ICronosCruiserCrowdsale.Sale","name":"sale","type":"tuple"},{"internalType":"enum ICronosCruiserCrowdsale.SalePhase","name":"salePhase","type":"uint8"}],"name":"updateSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userMintedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"userMintedTokensLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"enum ICronosCruiserCrowdsale.SalePhase","name":"","type":"uint8"}],"name":"userMintedTokensPerPhase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60a06040523480156200001157600080fd5b5060405162002888380380620028888339810160408190526200003491620005c4565b6200003f3362000199565b600180556001600160a01b03841660805281516020840151845162000065919062000633565b10620000de5760405162461bcd60e51b815260206004820152603d60248201527f43726f6e6f734372756973657243726f776473616c653a205f6672656553616c60448201527f652026205f616c6c6f774c69737453616c65206f7665726c617070656400000060648201526084015b60405180910390fd5b805160208301518351620000f3919062000633565b10620001685760405162461bcd60e51b815260206004820152603f60248201527f43726f6e6f734372756973657243726f776473616c653a205f616c6c6f774c6960448201527f737453616c652026205f7075626c696353616c65206f7665726c6170706564006064820152608401620000d5565b62000175836000620001e9565b62000182826001620001e9565b6200018f816002620001e9565b50505050620006c1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b818142826000015111620002615760405162461bcd60e51b815260206004820152604360248201526000805160206200286883398151915260448201527f6c65436f6e6669673a20737461727454696d652073686f756c64206265203e206064820152626e6f7760e81b608482015260a401620000d5565b6000826020015111620002da5760405162461bcd60e51b815260206004820152604560248201526000805160206200286883398151915260448201527f6c65436f6e6669673a206475726174696f6e496e5365632073686f756c642062606482015264065203e20360dc1b608482015260a401620000d5565b6000826040015111620003535760405162461bcd60e51b81526020600482015260446024820181905260008051602062002868833981519152908201527f6c65436f6e6669673a206d61784d696e7451756f74612073686f756c642062656064820152630203e20360e41b608482015260a401620000d5565b6000826060015111620003d55760405162461bcd60e51b815260206004820152604e60248201526000805160206200286883398151915260448201527f6c65436f6e6669673a206d61784d696e7451756f74615065724164647265737360648201526d02073686f756c64206265203e20360941b608482015260a401620000d5565b6000816002811115620003ec57620003ec6200065a565b146200045d5760008260800151116200045d5760405162461bcd60e51b815260206004820152603d60248201526000805160206200286883398151915260448201527f6c65436f6e6669673a2070726963652073686f756c64206265203e20300000006064820152608401620000d5565b83600360008560028111156200047757620004776200065a565b60028111156200048b576200048b6200065a565b8152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a082015181600501559050507f14832a5328217dc231d6f9ee512eae72678c47df46907468aa56a2bf630dd01983856000015186602001518760400151886060015189608001518a60a001516040516200052d979695949392919062000670565b60405180910390a150505050565b600060c082840312156200054e57600080fd5b60405160c081016001600160401b03811182821017156200057f57634e487b7160e01b600052604160045260246000fd5b8060405250809150825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a08201525092915050565b6000806000806102608587031215620005dc57600080fd5b84516001600160a01b0381168114620005f457600080fd5b93506200060586602087016200053b565b9250620006168660e087016200053b565b915062000628866101a087016200053b565b905092959194509250565b600082198211156200065557634e487b7160e01b600052601160045260246000fd5b500190565b634e487b7160e01b600052602160045260246000fd5b60e08101600389106200069357634e487b7160e01b600052602160045260246000fd5b978152602081019690965260408601949094526060850192909252608084015260a083015260c09091015290565b608051612176620006f2600039600081816103cf015281816115970152818161161b01526117a401526121766000f3fe6080604052600436106101145760003560e01c80639c8cded3116100a0578063d4cc935511610064578063d4cc93551461037d578063e682bab01461039d578063eeff91fb146103bd578063f2718b73146103f1578063f2fde38b1461041e57600080fd5b80639c8cded314610270578063b0947476146102dc578063b49f567c14610314578063ba41b0c61461034a578063c5c1fe071461035d57600080fd5b806346567033116100e757806346567033146101b5578063526ec9a8146101e257806366adeb8c14610212578063715018a6146102295780638da5cb5b1461023e57600080fd5b8063072bf1e9146101195780632d3511e51461014557806337f1e7f2146101675780633c0452b814610195575b600080fd5b34801561012557600080fd5b5061012e603281565b60405160ff90911681526020015b60405180910390f35b34801561015157600080fd5b5061015a61043e565b60405161013c9190611b33565b34801561017357600080fd5b50610187610182366004611b55565b61050f565b60405190815260200161013c565b3480156101a157600080fd5b506101876101b0366004611b87565b610551565b3480156101c157600080fd5b506101d56101d0366004611bb1565b610715565b60405161013c9190611bcc565b3480156101ee57600080fd5b506102026101fd366004611cc1565b610781565b604051901515815260200161013c565b34801561021e57600080fd5b5061022761081e565b005b34801561023557600080fd5b5061022761090c565b34801561024a57600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161013c565b34801561027c57600080fd5b5061029061028b366004611b55565b610942565b60405161013c9190600060c082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015292915050565b3480156102e857600080fd5b506101876102f7366004611d1f565b600560209081526000928352604080842090915290825290205481565b34801561032057600080fd5b5061018761032f366004611bb1565b6001600160a01b031660009081526004602052604090205490565b610227610358366004611d52565b610a01565b34801561036957600080fd5b50610227610378366004611d99565b610f8f565b34801561038957600080fd5b50610187610398366004611b87565b6113fe565b3480156103a957600080fd5b506102026103b8366004611b55565b61142f565b3480156103c957600080fd5b506102587f000000000000000000000000000000000000000000000000000000000000000081565b3480156103fd57600080fd5b5061018761040c366004611b55565b60026020526000908152604090205481565b34801561042a57600080fd5b50610227610439366004611bb1565b6114f8565b6001600090815260036020527fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054d547fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c546104989190611e40565b4211156104a55750600290565b6000805260036020527f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92f00547f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff546104fc9190611e40565b4211156105095750600190565b50600090565b60006003600083600281111561052757610527611afb565b600281111561053857610538611afb565b8152602001908152602001600020600401549050919050565b600080546001600160a01b031633146105855760405162461bcd60e51b815260040161057c90611e58565b60405180910390fd5b600260005260036020527fc3a24b0501bd2c13a7e57f2db4369ec4c223447539fc0724a9d55ac4a06ebd4e547fc3a24b0501bd2c13a7e57f2db4369ec4c223447539fc0724a9d55ac4a06ebd4d546105dd9190611e40565b42116106645760405162461bcd60e51b815260206004820152604a60248201527f43726f6e6f734372756973657243726f776473616c653a6d696e7452656d616960448201527f6e696e674e46543a204e6f7420616c6c6f77206265666f7265207075626c6963606482015269081cd85b195cc8195b9960b21b608482015260a40161057c565b60c982106106bf5760405162461bcd60e51b815260206004820152602260248201527f5175616e74697479206578636565647320746865206d6178696d756d2076616c604482015261756560f01b606482015260840161057c565b6106c98284611593565b826001600160a01b03167fe329db95c3f10aca394ff5f1fc5b0a06814dbc39591e6771a489bbadb91648b18360405161070491815260200190565b60405180910390a250805b92915050565b6001600160a01b03811660009081526004602090815260409182902080548351818402810184019094528084526060939283018282801561077557602002820191906000526020600020905b815481526020019060010190808311610761575b50505050509050919050565b6000806003600084600281111561079a5761079a611afb565b60028111156107ab576107ab611afb565b815260208101919091526040016000206005015490508015610811576040516bffffffffffffffffffffffff19606087901b16602082015261080990859083906034016040516020818303038152906040528051906020012061187d565b915050610817565b60019150505b9392505050565b6000546001600160a01b031633146108485760405162461bcd60e51b815260040161057c90611e58565b6040514790600090339083908381818185875af1925050503d806000811461088c576040519150601f19603f3d011682016040523d82523d6000602084013e610891565b606091505b50509050806109085760405162461bcd60e51b815260206004820152603760248201527f43726f6e6f734372756973657243726f776473616c653a7472616e736665724260448201527f616c616e63653a204661696c656420746f2073656e6420000000000000000000606482015260840161057c565b5050565b6000546001600160a01b031633146109365760405162461bcd60e51b815260040161057c90611e58565b6109406000611893565b565b61097e6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600080191681525090565b6003600083600281111561099457610994611afb565b60028111156109a5576109a5611afb565b81526020019081526020016000206040518060c001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250509050919050565b60026001541415610a545760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161057c565b60026001556000610a6361043e565b9050610a6e8161142f565b610ad25760405162461bcd60e51b815260206004820152602f60248201527f43726f6e6f734372756973657243726f776473616c653a6d696e743a2053616c60448201526e65206973206e6f742061637469766560881b606482015260840161057c565b610add338383610781565b610b465760405162461bcd60e51b815260206004820152603460248201527f43726f6e6f734372756973657243726f776473616c653a6d696e743a204e6f6e6044820152732d77686974656c6973746564204164647265737360601b606482015260840161057c565b60036000826002811115610b5c57610b5c611afb565b6002811115610b6d57610b6d611afb565b8152602080820192909252604090810160009081206003015433825260059093529081208591846002811115610ba557610ba5611afb565b6002811115610bb657610bb6611afb565b815260200190815260200160002054610bcf9190611e40565b1115610c695760405162461bcd60e51b815260206004820152605960248201527f43726f6e6f734372756973657243726f776473616c653a6d696e743a2052657160448201527f756573746564205f6d696e74416d6f756e742065786365656473206d6178696d60648201527f756d207065722061646472657373207065722070687261736500000000000000608482015260a40161057c565b33600090815260046020526040902054603290610c87908590611e40565b1115610d125760405162461bcd60e51b815260206004820152604e60248201527f43726f6e6f734372756973657243726f776473616c653a6d696e743a2052657160448201527f756573746564205f6d696e74416d6f756e742065786365656473206d6178696d60648201526d756d20706572206164647265737360901b608482015260a40161057c565b600083610d1e8361050f565b610d289190611e8d565b905080341015610d945760405162461bcd60e51b815260206004820152603160248201527f43726f6e6f734372756973657243726f776473616c653a6d696e743a204e6f7460448201527020656e6f756768206d73672e76616c756560781b606482015260840161057c565b60036000836002811115610daa57610daa611afb565b6002811115610dbb57610dbb611afb565b8152602001908152602001600020600201548460026000856002811115610de457610de4611afb565b6002811115610df557610df5611afb565b815260200190815260200160002054610e0e9190611e40565b1115610e825760405162461bcd60e51b815260206004820152603b60248201527f43726f6e6f734372756973657243726f776473616c653a6d696e743a204d696e60448201527f74696e6720776f756c6420657863656564206d61782051756f74610000000000606482015260840161057c565b3360009081526005602052604081208591846002811115610ea557610ea5611afb565b6002811115610eb657610eb6611afb565b81526020019081526020016000206000828254610ed39190611e40565b90915550849050600260008482811115610eef57610eef611afb565b6002811115610f0057610f00611afb565b81526020019081526020016000206000828254610f1d9190611e40565b90915550610f2d90508433611593565b33826002811115610f4057610f40611afb565b60ff167f309b03ba657e17f1beadbc6eb3c06ba79b38084eb8d0e5452cc222462a17f1f68684604051610f7d929190918252602082015260400190565b60405180910390a35050600180555050565b6000546001600160a01b03163314610fb95760405162461bcd60e51b815260040161057c90611e58565b818142826000015111610fde5760405162461bcd60e51b815260040161057c90611eac565b60008260200151116110025760405162461bcd60e51b815260040161057c90611f03565b60008260400151116110265760405162461bcd60e51b815260040161057c90611f5c565b600082606001511161104a5760405162461bcd60e51b815260040161057c90611fb4565b600081600281111561105e5761105e611afb565b146110875760008260800151116110875760405162461bcd60e51b815260040161057c90612016565b82600281111561109957611099611afb565b60ff16156111c257600060018460028111156110b7576110b7611afb565b6110c19190612061565b60028111156110d2576110d2611afb565b8551909150600360008360028111156110ed576110ed611afb565b60028111156110fe576110fe611afb565b8152602001908152602001600020600101546003600084600281111561112657611126611afb565b600281111561113757611137611afb565b8152602001908152602001600020600001546111539190611e40565b106111c05760405162461bcd60e51b8152602060048201526043602482015260008051602061210183398151915260448201527f206f7665726c617070696e6720776974682070726576696f757353616c65506860648201526261736560e81b608482015260a40161057c565b505b60028360028111156111d6576111d6611afb565b10156112ba5760008360028111156111f0576111f0611afb565b6111fb906001611e40565b600281111561120c5761120c611afb565b90506003600082600281111561122457611224611afb565b600281111561123557611235611afb565b8152602080820192909252604001600020549086015186516112579190611e40565b106112b85760405162461bcd60e51b815260206004820152603f602482015260008051602061210183398151915260448201527f206f7665726c617070696e672077697468206e65787453616c65506861736500606482015260840161057c565b505b6112c261043e565b60028111156112d3576112d3611afb565b8360028111156112e5576112e5611afb565b10156113535760405162461bcd60e51b8152602060048201526043602482015260008051602061210183398151915260448201527f204564697420686973746f726963616c2053616c6550686173652072656a65636064820152621d195960ea1b608482015260a40161057c565b6003600084600281111561136957611369611afb565b600281111561137a5761137a611afb565b81526020019081526020016000206000015442106113ee5760405162461bcd60e51b8152602060048201526037602482015260008051602061210183398151915260448201527f2053616c652068617320616c726561647920626567756e000000000000000000606482015260840161057c565b6113f884846118e3565b50505050565b6004602052816000526040600020818154811061141a57600080fd5b90600052602060002001600091509150505481565b60006003600083600281111561144757611447611afb565b600281111561145857611458611afb565b815260200190815260200160002060000154421015801561070f57506003600083600281111561148a5761148a611afb565b600281111561149b5761149b611afb565b815260200190815260200160002060010154600360008460028111156114c3576114c3611afb565b60028111156114d4576114d4611afb565b8152602001908152602001600020600001546114f09190611e40565b421092915050565b6000546001600160a01b031633146115225760405162461bcd60e51b815260040161057c90611e58565b6001600160a01b0381166115875760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161057c565b61159081611893565b50565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116179190612078565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166332cb6b0c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611677573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169b9190612078565b6116a58483611e40565b11156117195760405162461bcd60e51b815260206004820152603d60248201527f43726f6e6f734372756973657243726f776473616c653a5f6d696e743a204d6960448201527f6e74696e6720776f756c6420657863656564206d617820737570706c79000000606482015260840161057c565b6000831161178f5760405162461bcd60e51b815260206004820152603760248201527f43726f6e6f734372756973657243726f776473616c653a5f6d696e743a205f6d60448201527f696e74416d6f756e742073686f756c64206265203e2030000000000000000000606482015260840161057c565b60005b838110156113f8576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016635b98bdc76117d38385611e40565b6040516001600160e01b031960e084901b16815260048101919091526001600160a01b0386166024820152604401600060405180830381600087803b15801561181b57600080fd5b505af115801561182f573d6000803e3d6000fd5b505050506001600160a01b03831660009081526004602052604090206118558284611e40565b815460018101835560009283526020909220909101558061187581612091565b915050611792565b60008261188a8584611a87565b14949350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8181428260000151116119085760405162461bcd60e51b815260040161057c90611eac565b600082602001511161192c5760405162461bcd60e51b815260040161057c90611f03565b60008260400151116119505760405162461bcd60e51b815260040161057c90611f5c565b60008260600151116119745760405162461bcd60e51b815260040161057c90611fb4565b600081600281111561198857611988611afb565b146119b15760008260800151116119b15760405162461bcd60e51b815260040161057c90612016565b83600360008560028111156119c8576119c8611afb565b60028111156119d9576119d9611afb565b8152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a082015181600501559050507f14832a5328217dc231d6f9ee512eae72678c47df46907468aa56a2bf630dd01983856000015186602001518760400151886060015189608001518a60a00151604051611a7997969594939291906120ac565b60405180910390a150505050565b600081815b8451811015611af3576000858281518110611aa957611aa96120ea565b60200260200101519050808311611acf5760008381526020829052604090209250611ae0565b600081815260208490526040902092505b5080611aeb81612091565b915050611a8c565b509392505050565b634e487b7160e01b600052602160045260246000fd5b60038110611b2f57634e487b7160e01b600052602160045260246000fd5b9052565b6020810161070f8284611b11565b803560038110611b5057600080fd5b919050565b600060208284031215611b6757600080fd5b61081782611b41565b80356001600160a01b0381168114611b5057600080fd5b60008060408385031215611b9a57600080fd5b611ba383611b70565b946020939093013593505050565b600060208284031215611bc357600080fd5b61081782611b70565b6020808252825182820181905260009190848201906040850190845b81811015611c0457835183529284019291840191600101611be8565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112611c3757600080fd5b8135602067ffffffffffffffff80831115611c5457611c54611c10565b8260051b604051601f19603f83011681018181108482111715611c7957611c79611c10565b604052938452858101830193838101925087851115611c9757600080fd5b83870191505b84821015611cb657813583529183019190830190611c9d565b979650505050505050565b600080600060608486031215611cd657600080fd5b611cdf84611b70565b9250602084013567ffffffffffffffff811115611cfb57600080fd5b611d0786828701611c26565b925050611d1660408501611b41565b90509250925092565b60008060408385031215611d3257600080fd5b611d3b83611b70565b9150611d4960208401611b41565b90509250929050565b60008060408385031215611d6557600080fd5b82359150602083013567ffffffffffffffff811115611d8357600080fd5b611d8f85828601611c26565b9150509250929050565b60008082840360e0811215611dad57600080fd5b60c0811215611dbb57600080fd5b5060405160c0810181811067ffffffffffffffff82111715611ddf57611ddf611c10565b8060405250833581526020840135602082015260408401356040820152606084013560608201526080840135608082015260a084013560a082015280925050611d4960c08401611b41565b634e487b7160e01b600052601160045260246000fd5b60008219821115611e5357611e53611e2a565b500190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000816000190483118215151615611ea757611ea7611e2a565b500290565b602080825260439082015260008051602061212183398151915260408201527f6c65436f6e6669673a20737461727454696d652073686f756c64206265203e206060820152626e6f7760e81b608082015260a00190565b602080825260459082015260008051602061212183398151915260408201527f6c65436f6e6669673a206475726174696f6e496e5365632073686f756c642062606082015264065203e20360dc1b608082015260a00190565b602080825260449082015260008051602061212183398151915260408201527f6c65436f6e6669673a206d61784d696e7451756f74612073686f756c642062656060820152630203e20360e41b608082015260a00190565b6020808252604e9082015260008051602061212183398151915260408201527f6c65436f6e6669673a206d61784d696e7451756f74615065724164647265737360608201526d02073686f756c64206265203e20360941b608082015260a00190565b6020808252603d9082015260008051602061212183398151915260408201527f6c65436f6e6669673a2070726963652073686f756c64206265203e2030000000606082015260800190565b60008282101561207357612073611e2a565b500390565b60006020828403121561208a57600080fd5b5051919050565b60006000198214156120a5576120a5611e2a565b5060010190565b60e081016120ba828a611b11565b8760208301528660408301528560608301528460808301528360a08301528260c083015298975050505050505050565b634e487b7160e01b600052603260045260246000fdfe43726f6e6f734372756973657243726f776473616c653a5f73657453616c653a43726f6e6f734372756973657243726f776473616c653a697356616c69645361a2646970667358221220fd6308e2b7b4b21bd7e5b9c82419e080b782c58ab949d737182cc03db3f00b4364736f6c634300080b003343726f6e6f734372756973657243726f776473616c653a697356616c69645361000000000000000000000000d25358e2cad3e1fd165887569892a99fffa674ac0000000000000000000000000000000000000000000000000000000063204690000000000000000000000000000000000000000000000000000000000001518000000000000000000000000000000000000000000000000000000000000000d2000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000005380c7b7ae81a58eb98d9c78de4a1fd7fd9535fc953ed2be602daaa41767312a0000000000000000000000000000000000000000000000000000000063219811000000000000000000000000000000000000000000000000000000000002cd3000000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000001fb6818089838400005380c7b7ae81a58eb98d9c78de4a1fd7fd9535fc953ed2be602daaa41767312a0000000000000000000000000000000000000000000000000000000063246542000000000000000000000000000000000000000000000000000000000009c7200000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000233c8fe42703e800000000000000000000000000000000000000000000000000000000000000000000

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000d25358e2cad3e1fd165887569892a99fffa674ac0000000000000000000000000000000000000000000000000000000063204690000000000000000000000000000000000000000000000000000000000001518000000000000000000000000000000000000000000000000000000000000000d2000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000005380c7b7ae81a58eb98d9c78de4a1fd7fd9535fc953ed2be602daaa41767312a0000000000000000000000000000000000000000000000000000000063219811000000000000000000000000000000000000000000000000000000000002cd3000000000000000000000000000000000000000000000000000000000000007d0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000001fb6818089838400005380c7b7ae81a58eb98d9c78de4a1fd7fd9535fc953ed2be602daaa41767312a0000000000000000000000000000000000000000000000000000000063246542000000000000000000000000000000000000000000000000000000000009c7200000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000233c8fe42703e800000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _CronosCruisers (address): 0xd25358e2cad3e1fd165887569892a99fffa674ac
Arg [1] : _freeSale (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
Arg [2] : _allowListSale (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
Arg [3] : _publicSale (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]

-----Encoded View---------------
19 Constructor Arguments found :
Arg [0] : 000000000000000000000000d25358e2cad3e1fd165887569892a99fffa674ac
Arg [1] : 0000000000000000000000000000000000000000000000000000000063204690
Arg [2] : 0000000000000000000000000000000000000000000000000000000000015180
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000d2
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [6] : 5380c7b7ae81a58eb98d9c78de4a1fd7fd9535fc953ed2be602daaa41767312a
Arg [7] : 0000000000000000000000000000000000000000000000000000000063219811
Arg [8] : 000000000000000000000000000000000000000000000000000000000002cd30
Arg [9] : 00000000000000000000000000000000000000000000000000000000000007d0
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [11] : 00000000000000000000000000000000000000000000001fb681808983840000
Arg [12] : 5380c7b7ae81a58eb98d9c78de4a1fd7fd9535fc953ed2be602daaa41767312a
Arg [13] : 0000000000000000000000000000000000000000000000000000000063246542
Arg [14] : 000000000000000000000000000000000000000000000000000000000009c720
Arg [15] : 0000000000000000000000000000000000000000000000000000000000001f40
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [17] : 0000000000000000000000000000000000000000000000233c8fe42703e80000
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000000


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.