ETH Price: $2,657.17 (+0.21%)

Contract

0xE4645d072f2D0A31DaC205f4215cc01A25DEC530
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer Ownersh...156702262022-10-03 21:11:59861 days ago1664831519IN
0xE4645d07...A25DEC530
0 ETH0.0004237214.57998157
Flip Public Sale...154170652022-08-26 19:02:31899 days ago1661540551IN
0xE4645d07...A25DEC530
0 ETH0.0008246628.547005
Flip Sale Status154170592022-08-26 19:01:02899 days ago1661540462IN
0xE4645d07...A25DEC530
0 ETH0.0005032917.49686952
Mint Public154170552022-08-26 19:00:12899 days ago1661540412IN
0xE4645d07...A25DEC530
0.1 ETH0.0014811714.33138314
Mint Public154170512022-08-26 18:59:05899 days ago1661540345IN
0xE4645d07...A25DEC530
0.1 ETH0.0015470914.96922539
Mint Public154170482022-08-26 18:58:30899 days ago1661540310IN
0xE4645d07...A25DEC530
0.1 ETH0.0014760214.28151235
Mint Public154170422022-08-26 18:56:30899 days ago1661540190IN
0xE4645d07...A25DEC530
0 ETH0.0012936711.49273665
Mint Public154170182022-08-26 18:52:14899 days ago1661539934IN
0xE4645d07...A25DEC530
0.1 ETH0.0017894817.31447644
Mint Public154169802022-08-26 18:43:42899 days ago1661539422IN
0xE4645d07...A25DEC530
0.1 ETH0.0023982817.43548002
Mint Public154169622022-08-26 18:38:26899 days ago1661539106IN
0xE4645d07...A25DEC530
0.3 ETH0.0020860719.32663711
Mint Public154169622022-08-26 18:38:26899 days ago1661539106IN
0xE4645d07...A25DEC530
0.1 ETH0.0019974419.32663711
Mint Public154169542022-08-26 18:36:16899 days ago1661538976IN
0xE4645d07...A25DEC530
0.1 ETH0.0024549517.84747124
Mint Public154167662022-08-26 17:55:18899 days ago1661536518IN
0xE4645d07...A25DEC530
0.2 ETH0.0033503831.71361393
Mint Public154167662022-08-26 17:55:18899 days ago1661536518IN
0xE4645d07...A25DEC530
0.1 ETH0.0032776631.71361393
Mint Public154167642022-08-26 17:54:24899 days ago1661536464IN
0xE4645d07...A25DEC530
0.1 ETH0.0036533826.56003342
Mint Public154167642022-08-26 17:54:24899 days ago1661536464IN
0xE4645d07...A25DEC530
0.1 ETH0.003199226.56003342
Mint Public154167602022-08-26 17:53:29899 days ago1661536409IN
0xE4645d07...A25DEC530
0.1 ETH0.0037387527.18066122
Mint Public154166332022-08-26 17:19:48899 days ago1661534388IN
0xE4645d07...A25DEC530
0.2 ETH0.0017342816.41612902
Mint Public154166312022-08-26 17:19:17899 days ago1661534357IN
0xE4645d07...A25DEC530
0.1 ETH0.0019040518.42300557
Mint Public154165762022-08-26 17:05:58899 days ago1661533558IN
0xE4645d07...A25DEC530
0.1 ETH0.0040235629.25124165
Mint Public154165532022-08-26 16:59:09899 days ago1661533149IN
0xE4645d07...A25DEC530
0.1 ETH0.0015087214.59796447
Mint Public154164872022-08-26 16:45:29899 days ago1661532329IN
0xE4645d07...A25DEC530
0.1 ETH0.00191418.51926846
Mint Public154164302022-08-26 16:31:49899 days ago1661531509IN
0xE4645d07...A25DEC530
0.2 ETH0.0044155641.79622744
Mint Public154163702022-08-26 16:14:08899 days ago1661530448IN
0xE4645d07...A25DEC530
0.1 ETH0.0017362114.41412597
Mint Public154163642022-08-26 16:12:08899 days ago1661530328IN
0xE4645d07...A25DEC530
0.1 ETH0.0015762711.45951657
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
154170552022-08-26 19:00:12899 days ago1661540412
0xE4645d07...A25DEC530
0.1 ETH
154170512022-08-26 18:59:05899 days ago1661540345
0xE4645d07...A25DEC530
0.1 ETH
154170482022-08-26 18:58:30899 days ago1661540310
0xE4645d07...A25DEC530
0.1 ETH
154170182022-08-26 18:52:14899 days ago1661539934
0xE4645d07...A25DEC530
0.1 ETH
154169802022-08-26 18:43:42899 days ago1661539422
0xE4645d07...A25DEC530
0.1 ETH
154169622022-08-26 18:38:26899 days ago1661539106
0xE4645d07...A25DEC530
0.3 ETH
154169622022-08-26 18:38:26899 days ago1661539106
0xE4645d07...A25DEC530
0.1 ETH
154169542022-08-26 18:36:16899 days ago1661538976
0xE4645d07...A25DEC530
0.1 ETH
154167662022-08-26 17:55:18899 days ago1661536518
0xE4645d07...A25DEC530
0.2 ETH
154167662022-08-26 17:55:18899 days ago1661536518
0xE4645d07...A25DEC530
0.1 ETH
154167642022-08-26 17:54:24899 days ago1661536464
0xE4645d07...A25DEC530
0.1 ETH
154167642022-08-26 17:54:24899 days ago1661536464
0xE4645d07...A25DEC530
0.1 ETH
154167602022-08-26 17:53:29899 days ago1661536409
0xE4645d07...A25DEC530
0.1 ETH
154166332022-08-26 17:19:48899 days ago1661534388
0xE4645d07...A25DEC530
0.2 ETH
154166312022-08-26 17:19:17899 days ago1661534357
0xE4645d07...A25DEC530
0.1 ETH
154165762022-08-26 17:05:58899 days ago1661533558
0xE4645d07...A25DEC530
0.1 ETH
154165532022-08-26 16:59:09899 days ago1661533149
0xE4645d07...A25DEC530
0.1 ETH
154164872022-08-26 16:45:29899 days ago1661532329
0xE4645d07...A25DEC530
0.1 ETH
154164302022-08-26 16:31:49899 days ago1661531509
0xE4645d07...A25DEC530
0.2 ETH
154163702022-08-26 16:14:08899 days ago1661530448
0xE4645d07...A25DEC530
0.1 ETH
154163642022-08-26 16:12:08899 days ago1661530328
0xE4645d07...A25DEC530
0.1 ETH
154162162022-08-26 15:41:20899 days ago1661528480
0xE4645d07...A25DEC530
0.1 ETH
154162002022-08-26 15:36:55899 days ago1661528215
0xE4645d07...A25DEC530
0.1 ETH
154161692022-08-26 15:30:03899 days ago1661527803
0xE4645d07...A25DEC530
0.6 ETH
154160632022-08-26 15:05:45899 days ago1661526345
0xE4645d07...A25DEC530
0.2 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Minter

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 9 : Minter.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.15;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import "@openzeppelin/contracts/utils/Address.sol"; 
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "./IToken.sol";

contract Minter is Ownable, ReentrancyGuard {
    using SafeERC20 for IERC20;

    // ======== Supply =========
    uint256 public maxMintsPerAddress;
    uint256 public maxTokens;

    // ======== Cost =========;
    uint256 public immutable tokenPriceETH;
    uint256 public tokenPriceETH_Discount;
    uint256 public tokenPriceApeCoin;
    uint256 public tokenPriceApeCoin_Discount;
    
    event TokenPriceApeCoinChanged(uint256 oldPrice, uint256 newPrice);
    event TokenPriceApeCoinDiscountChanged(uint256 oldPrice, uint256 newPrice);
    event TokenPriceETHDiscountChanged(uint256 oldPrice, uint256 newPrice);

    // ======== Sale Status =========
    bool public saleIsActive = false;
    bool public saleApeCoinIsActive = false;
    bool public isWhitelistSaleActive = false;
    bool public isDiscountedSaleActive = false;
    bool public isPublicSaleActive = false;

    // ======== Claim Tracking =========
    mapping(address => uint256) private addressToMintCount;
    mapping(address => bool) public whitelistClaimed;
    mapping(address => uint256) public discountClaimed;

    // ======== Whitelist Validation =========
    bytes32 public whitelistMerkleRoot;
    bytes32 public discountMerkleRoot;

    // ======== External Storage Contract =========
    IToken public immutable token;

    // ======== Fund Management =========
    // NFF Gnosis Wallet
    address public withdrawalAddress = 0xAEE6a9660878A217f4070181FFb271c4De61fBac;

    // ======== ApeCoin Support =========
    IERC20 public immutable tokenApeCoin;

    // ======== Constructor =========
    constructor(address contractAddress,
                uint256 _maxTokens,
                uint256 _maxMintsPerAddress,
                IERC20 _tokenApeCoin,
                uint256 _tokenPriceETH_Discount,
                uint256 _tokenPriceETH,
                uint256 _tokenPriceApeCoin_Discount,
                uint256 _tokenPriceApeCoin) {
        token = IToken(contractAddress);
        maxTokens = _maxTokens;
        maxMintsPerAddress = _maxMintsPerAddress;
        tokenApeCoin = _tokenApeCoin;
        tokenPriceETH = _tokenPriceETH;

        setTokenPriceETHDiscount(_tokenPriceETH_Discount);
        setTokenPriceApeCoin(_tokenPriceApeCoin);
        setTokenPriceApeCoinDiscount(_tokenPriceApeCoin_Discount);
    }

    // ======== Modifier Checks =========
    modifier isWhitelistMerkleRootSet() {
        require(whitelistMerkleRoot != 0, "Whitelist merkle root not set!");
        _;
    }

    modifier isValidMerkleProofWhitelist(address _address, bytes32[] calldata merkleProof, uint256 quantity) {
        require(
            MerkleProof.verify(
                merkleProof, 
                whitelistMerkleRoot, 
                keccak256(abi.encodePacked(keccak256(abi.encodePacked(_address, quantity)))
                )
            ), 
            "Address is not on whitelist!");
        _;

    }

    modifier isDiscountMerkleRootSet() {
        require(discountMerkleRoot != 0, "Discount merkle root not set!");
        _;
    }

    modifier isValidMerkleProofDiscount(address _address, bytes32[] calldata merkleProof, uint256 quantity) {
        require(
            MerkleProof.verify(
                merkleProof, 
                discountMerkleRoot, 
                keccak256(abi.encodePacked(keccak256(abi.encodePacked(_address, quantity)))
                )
            ), 
            "Address is not on discount list!");
        _;
    }
    
    modifier isSupplyAvailable(uint256 numberOfTokens) {
        uint256 supply = token.tokenCount();
        require(supply + numberOfTokens <= maxTokens, "Exceeds max token supply!");
        _;
    }

    modifier isSaleActive() {
        require(saleIsActive, "Sale is not active!");
        _;
    }

    modifier isMaxMintsPerAddressExceeded(uint amount) {
        require(addressToMintCount[msg.sender] + amount <= maxMintsPerAddress, "Exceeds max mint per address!");
        _;
    }


    /// @notice Set the discounted token price in ETH
    /// @param _tokenPriceETHDiscount The ETH price
    function setTokenPriceETHDiscount(uint256 _tokenPriceETHDiscount) public onlyOwner {
      emit TokenPriceETHDiscountChanged(tokenPriceETH_Discount, _tokenPriceETHDiscount);
      tokenPriceETH_Discount = _tokenPriceETHDiscount;
    }

    /// @notice Set the token price in ApeCoin
    /// @param _tokenPriceApeCoin The ApeCoin price
    function setTokenPriceApeCoin(uint256 _tokenPriceApeCoin) public onlyOwner {
      emit TokenPriceApeCoinChanged(tokenPriceApeCoin, _tokenPriceApeCoin);
      tokenPriceApeCoin = _tokenPriceApeCoin;
    }

    /// @notice Set the discounted token price in ApeCoin
    /// @param _tokenPriceApeCoinDiscount The ApeCoin price
    function setTokenPriceApeCoinDiscount(uint256 _tokenPriceApeCoinDiscount) public onlyOwner {
      emit TokenPriceApeCoinDiscountChanged(tokenPriceApeCoin_Discount, _tokenPriceApeCoinDiscount);
      tokenPriceApeCoin_Discount = _tokenPriceApeCoinDiscount;
    }

    /// @notice Transfer funds to gnosis wallet
    /// @param qty The qty user is purchsing
    /// @param applyDiscount Is this a discounted purchase
    function transferFunds(uint256 qty, bool applyDiscount) private {

        uint256 priceETH = !applyDiscount ? tokenPriceETH : tokenPriceETH_Discount;
        uint256 priceApeCoin = !applyDiscount ? tokenPriceApeCoin : tokenPriceApeCoin_Discount;

        if(msg.value == qty * priceETH) { 
            // pay with ETH
            (bool success, ) = payable(withdrawalAddress).call{value: qty * priceETH}("");
            require(success, "transfer failed");
        } else if(msg.value == 0) { 
            // pay with ApeCoin
            require(saleApeCoinIsActive, "ApeCoin sale is not active!");

            tokenApeCoin.safeTransferFrom(
              msg.sender,
              withdrawalAddress,
              qty * priceApeCoin
            );
        } else {
          revert("invalid payment option");
        }
    }

    // ======== Mint Functions =========
    /// @notice Mint all available tokens on whitelist
    /// @param merkleProof The merkle proof generated offchain
    /// @param amount The amount user can mint
    function mintWhitelist(bytes32[] calldata merkleProof, uint amount) public 
        isSaleActive()
        isWhitelistMerkleRootSet()
        isValidMerkleProofWhitelist(msg.sender, merkleProof, amount) 
        isSupplyAvailable(amount) 
        isMaxMintsPerAddressExceeded(amount)
        nonReentrant {
            require(isWhitelistSaleActive, "Whitlist sale is not active!");
            require(!whitelistClaimed[msg.sender], "Whitelist is already claimed by this wallet!");

            token.mint(amount, msg.sender);

            addressToMintCount[msg.sender] += amount;

            whitelistClaimed[msg.sender] = true;
    }

    /// @notice Mint tokens at a discounted price
    /// @param merkleProof The merkle proof generated offchain
    /// @param amount The amount user can mint
    /// @param quantity The quantity user would like to mint
    function mintDiscount(bytes32[] calldata merkleProof, uint amount, uint quantity) public payable 
        isSaleActive()
        isDiscountMerkleRootSet()
        isValidMerkleProofDiscount(msg.sender, merkleProof, amount) 
        isSupplyAvailable(quantity) 
        isMaxMintsPerAddressExceeded(quantity)
        nonReentrant {
            require(isDiscountedSaleActive, "Discount sale is not active!");
            require(discountClaimed[msg.sender] != amount, "Discount is already claimed by this wallet!");

            token.mint(quantity, msg.sender);

            transferFunds(quantity, true);

            addressToMintCount[msg.sender] += quantity;
            discountClaimed[msg.sender]  += quantity;
    }


    /// @notice Mint tokens at public price
    /// @param quantity The quantity user would like to mint
    function mintPublic(uint quantity) public payable 
        isSaleActive()
        isSupplyAvailable(quantity) 
        isMaxMintsPerAddressExceeded(quantity)
        nonReentrant  {
            require(isPublicSaleActive, "Public sale is not active!");
            require(msg.sender == tx.origin, "Mint: not allowed from contract");

            transferFunds(quantity, false);

            token.mint(quantity, msg.sender);

            addressToMintCount[msg.sender] += quantity;
    }

    /// @notice Mint team tokens at zero cost
    /// @param _to The address to send the tokens
    /// @param _reserveAmount The quantity user would like to mint
    function mintTeamTokens(address _to, uint256 _reserveAmount) public 
        onlyOwner 
        isSupplyAvailable(_reserveAmount) {
            token.mint(_reserveAmount, _to);
    }

    // ======== Whitelisting =========
    /// @notice Set merkle root for whitelist mints
    /// @param merkleRoot The merkle root
    function setWhitelistMerkleRoot(bytes32 merkleRoot) external onlyOwner {
        whitelistMerkleRoot = merkleRoot;
    }

    /// @notice Check if user is whitelisted
    /// @param _address The whitelisted address
    /// @param merkleProof The merkle proof generated offchain
    /// @param amount The number of tokens the user has been whitelisted for
    function isWhitelisted(address _address, bytes32[] calldata merkleProof, uint256 amount) external view
        isValidMerkleProofWhitelist(_address, merkleProof, amount) 
        returns (bool) {            
            require(!whitelistClaimed[_address], "Whitelist is already claimed by this wallet");

            return true;
    }

    /// @notice Check if user has claimed all their whitelist spots
    /// @param _address The whitelisted address
    function isWhitelistClaimed(address _address) external view returns (bool) {
        return whitelistClaimed[_address];
    }


    // ======== Discounting =========
    /// @notice Set merkle root for discounted mints
    /// @param merkleRoot The merkle root
    function setDiscountMerkleRoot(bytes32 merkleRoot) external onlyOwner {
        discountMerkleRoot = merkleRoot;
    }

    /// @notice Check if user is on discount list
    /// @param _address The discounted address
    /// @param merkleProof The merkle proof generated offchain
    /// @param amount The number of tokens the user has been whitelisted for
    function isDiscounted(address _address, bytes32[] calldata merkleProof, uint256 amount) external view
        isValidMerkleProofDiscount(_address, merkleProof, amount) 
        returns (bool) {            
            require(discountClaimed[_address] != amount, "Discount is already claimed by this wallet");

            return true;
    }

    /// @notice Returns the number of discounted spots user has claimed
    /// @param _address The discounted address
    function discountsClaimed(address _address) external view returns (uint256) {
        return discountClaimed[_address];
    }

    // ======== Utilities =========
    /// @notice Returns the number of tokens minted by an address
    /// @param _address The minter's address
    function mintCount(address _address) external view returns (uint) {
        return addressToMintCount[_address];
    }

    // ======== State Management =========
    /// @notice Toggle mint sale status
    function flipSaleStatus() public onlyOwner {
        saleIsActive = !saleIsActive;
    } 

    /// @notice Toggle whitelist mint sale status
    function flipWhitelistSaleStatus() public onlyOwner {
        isWhitelistSaleActive = !isWhitelistSaleActive;
    } 

    /// @notice Toggle discounted mint sale status
    function flipDiscountedSaleStatus() public onlyOwner {
        isDiscountedSaleActive = !isDiscountedSaleActive;
    }

    /// @notice Toggle public mint sale status
    function flipPublicSaleStatus() public onlyOwner {
        isPublicSaleActive = !isPublicSaleActive;
    } 

    /// @notice Toggle ApeCoin sale status
    function flipSaleApeCoinStatus() public onlyOwner {
        saleApeCoinIsActive = !saleApeCoinIsActive;
    }

    // ======== Token Supply Management=========
    /// @notice Set the max mints per address
    /// @param _max The maximum number of tokens a user can mint
    function setMaxMintPerAddress(uint _max) public onlyOwner {
        maxMintsPerAddress = _max;
    }

    /// @notice Set the max supply, can only be lowered not increased
    /// @param newMaxTokenSupply The maximum number of tokens that can be minted
    function decreaseTokenSupply(uint256 newMaxTokenSupply) external onlyOwner {
        require(maxTokens > newMaxTokenSupply, "Max token supply can only be decreased!");
        maxTokens = newMaxTokenSupply;
    }

    // ======== Withdraw =========
    /// @notice Set the withdrawal address for all funds
    /// @param _newWithdrawalAddress The withdrawal address for buth ETH/ApeCoin funds
    function setWithdrawalAddress(address _newWithdrawalAddress) public onlyOwner {
        withdrawalAddress = _newWithdrawalAddress;
    }
}

File 2 of 9 : Ownable.sol
// 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);
    }
}

File 3 of 9 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT

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 make 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 9 : MerkleProof.sol
// SPDX-License-Identifier: MIT

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) {
        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 = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}

File 5 of 9 : Address.sol
// 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);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal 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);
            }
        }
    }
}

File 6 of 9 : SafeERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC20.sol";
import "../../../utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 7 of 9 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 8 of 9 : IToken.sol
// Contract based on https://docs.openzeppelin.com/contracts/3.x/erc721
// SPDX-License-Identifier: MIT
/// @title Interface for Token

pragma solidity ^0.8.15;

abstract contract IToken {

    function setProvenanceHash(string memory _provenanceHash) virtual external;

    function mint(uint256 _count, address _recipient) virtual external;

    function setBaseURI(string memory baseURI) virtual external;

    function updateMinter(address _minter) virtual external;

    function lockMinter() virtual external;

    function tokenCount() virtual external returns (uint256);
}

File 9 of 9 : Context.sol
// 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;
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"_maxTokens","type":"uint256"},{"internalType":"uint256","name":"_maxMintsPerAddress","type":"uint256"},{"internalType":"contract IERC20","name":"_tokenApeCoin","type":"address"},{"internalType":"uint256","name":"_tokenPriceETH_Discount","type":"uint256"},{"internalType":"uint256","name":"_tokenPriceETH","type":"uint256"},{"internalType":"uint256","name":"_tokenPriceApeCoin_Discount","type":"uint256"},{"internalType":"uint256","name":"_tokenPriceApeCoin","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"uint256","name":"oldPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"TokenPriceApeCoinChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"TokenPriceApeCoinDiscountChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"TokenPriceETHDiscountChanged","type":"event"},{"inputs":[{"internalType":"uint256","name":"newMaxTokenSupply","type":"uint256"}],"name":"decreaseTokenSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"discountClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"discountMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"discountsClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipDiscountedSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipPublicSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleApeCoinStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipWhitelistSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"isDiscounted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isDiscountedSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"mintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintDiscount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"mintTeamTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintWhitelist","outputs":[],"stateMutability":"nonpayable","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":"saleApeCoinIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setDiscountMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxMintPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenPriceApeCoin","type":"uint256"}],"name":"setTokenPriceApeCoin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenPriceApeCoinDiscount","type":"uint256"}],"name":"setTokenPriceApeCoinDiscount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenPriceETHDiscount","type":"uint256"}],"name":"setTokenPriceETHDiscount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newWithdrawalAddress","type":"address"}],"name":"setWithdrawalAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenApeCoin","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPriceApeCoin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPriceApeCoin_Discount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPriceETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPriceETH_Discount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60e06040526000600760006101000a81548160ff0219169083151502179055506000600760016101000a81548160ff0219169083151502179055506000600760026101000a81548160ff0219169083151502179055506000600760036101000a81548160ff0219169083151502179055506000600760046101000a81548160ff02191690831515021790555073aee6a9660878a217f4070181ffb271c4de61fbac600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000ed57600080fd5b5060405162004dfb38038062004dfb83398181016040528101906200011391906200065a565b6200013362000127620001f960201b60201c565b6200020160201b60201c565b600180819055508773ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff168152505086600381905550856002819055508473ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508260808181525050620001c984620002c560201b60201c565b620001da816200039b60201b60201c565b620001eb826200047160201b60201c565b5050505050505050620007e4565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002d5620001f960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002fb6200054760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000354576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200034b9062000784565b60405180910390fd5b7f616211c440ee58ae6f25cbd9e9bc4c443e821e5e609dba05b7c556cd29cb222e6004548260405162000389929190620007b7565b60405180910390a18060048190555050565b620003ab620001f960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003d16200054760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200042a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004219062000784565b60405180910390fd5b7fe37f490f6820c4aeb200a00776b1dd5a41d05cd1d13ebe80bc9bddc12f408e20600554826040516200045f929190620007b7565b60405180910390a18060058190555050565b62000481620001f960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620004a76200054760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000500576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004f79062000784565b60405180910390fd5b7f5b62250854903ecfb1e67a098b20b95793b97c8e7f182e4f4697b92ebbec9bb36006548260405162000535929190620007b7565b60405180910390a18060068190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005a28262000575565b9050919050565b620005b48162000595565b8114620005c057600080fd5b50565b600081519050620005d481620005a9565b92915050565b6000819050919050565b620005ef81620005da565b8114620005fb57600080fd5b50565b6000815190506200060f81620005e4565b92915050565b6000620006228262000595565b9050919050565b620006348162000615565b81146200064057600080fd5b50565b600081519050620006548162000629565b92915050565b600080600080600080600080610100898b0312156200067e576200067d62000570565b5b60006200068e8b828c01620005c3565b9850506020620006a18b828c01620005fe565b9750506040620006b48b828c01620005fe565b9650506060620006c78b828c0162000643565b9550506080620006da8b828c01620005fe565b94505060a0620006ed8b828c01620005fe565b93505060c0620007008b828c01620005fe565b92505060e0620007138b828c01620005fe565b9150509295985092959890939650565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200076c60208362000723565b9150620007798262000734565b602082019050919050565b600060208201905081810360008301526200079f816200075d565b9050919050565b620007b181620005da565b82525050565b6000604082019050620007ce6000830185620007a6565b620007dd6020830184620007a6565b9392505050565b60805160a05160c0516145a16200085a60003960008181610cc70152612cb0015260008181610d6a01528181610e4d01528181611615015281816118b101528181611f50015281816121d80152818161255d015281816127ed01526129450152600081816109f40152612afb01526145a16000f3fe60806040526004361061025c5760003560e01c8063a371a06211610144578063db4bec44116100b6578063ef59f1e41161007a578063ef59f1e414610878578063efd0cbf9146108b5578063f2bcd022146108d1578063f2fde38b146108fc578063f618e63814610925578063fc0c546a146109415761025c565b8063db4bec441461077f578063e04e82dd146107bc578063e8315742146107e5578063eb8d244414610810578063ed9ec8881461083b5761025c565b8063b98451cf11610108578063b98451cf14610681578063bd32fb66146106ac578063c31769fd146106d5578063ce03ec9314610712578063d6f0874e14610729578063db474b39146107545761025c565b8063a371a062146105ae578063a6d612f9146105eb578063aa98e0c614610614578063ae6a80d51461063f578063b5b781c51461066a5761025c565b806359913d47116101dd57806381bb5cb4116101a157806381bb5cb41461049e5780638521b8e3146104c9578063853a5606146105065780638da5cb5b1461051d5780638ffefa0d146105485780639f2d83fd146105715761025c565b806359913d47146103df57806359eaa0951461040a578063657732561461043357806367142cf61461045e578063715018a6146104875761025c565b8063237fa68811610224578063237fa6881461033257806340d34133146103495780634da3cc4a146103745780634f92bea01461038b5780635057afb4146103b65761025c565b80631abae686146102615780631dfe90951461028a5780631e14d44b146102b55780631e84c413146102de57806321b8092e14610309575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613072565b61096c565b005b34801561029657600080fd5b5061029f6109f2565b6040516102ac91906130b8565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d791906130ff565b610a16565b005b3480156102ea57600080fd5b506102f3610a9c565b6040516103009190613147565b60405180910390f35b34801561031557600080fd5b50610330600480360381019061032b91906131c0565b610aaf565b005b34801561033e57600080fd5b50610347610b6f565b005b34801561035557600080fd5b5061035e610c17565b60405161036b91906131fc565b60405180910390f35b34801561038057600080fd5b50610389610c1d565b005b34801561039757600080fd5b506103a0610cc5565b6040516103ad9190613276565b60405180910390f35b3480156103c257600080fd5b506103dd60048036038101906103d89190613291565b610ce9565b005b3480156103eb57600080fd5b506103f4610ede565b6040516104019190613147565b60405180910390f35b34801561041657600080fd5b50610431600480360381019061042c91906130ff565b610ef1565b005b34801561043f57600080fd5b50610448610fbb565b6040516104559190613147565b60405180910390f35b34801561046a57600080fd5b50610485600480360381019061048091906130ff565b610fce565b005b34801561049357600080fd5b5061049c61108f565b005b3480156104aa57600080fd5b506104b3611117565b6040516104c091906130b8565b60405180910390f35b3480156104d557600080fd5b506104f060048036038101906104eb91906131c0565b61111d565b6040516104fd9190613147565b60405180910390f35b34801561051257600080fd5b5061051b611173565b005b34801561052957600080fd5b5061053261121b565b60405161053f91906132e0565b60405180910390f35b34801561055457600080fd5b5061056f600480360381019061056a91906130ff565b611244565b005b34801561057d57600080fd5b50610598600480360381019061059391906131c0565b611305565b6040516105a591906130b8565b60405180910390f35b3480156105ba57600080fd5b506105d560048036038101906105d09190613360565b61131d565b6040516105e29190613147565b60405180910390f35b3480156105f757600080fd5b50610612600480360381019061060d91906133d4565b61149b565b005b34801561062057600080fd5b506106296119fd565b60405161063691906131fc565b60405180910390f35b34801561064b57600080fd5b50610654611a03565b60405161066191906130b8565b60405180910390f35b34801561067657600080fd5b5061067f611a09565b005b34801561068d57600080fd5b50610696611ab1565b6040516106a39190613147565b60405180910390f35b3480156106b857600080fd5b506106d360048036038101906106ce9190613072565b611ac4565b005b3480156106e157600080fd5b506106fc60048036038101906106f79190613360565b611b4a565b6040516107099190613147565b60405180910390f35b34801561071e57600080fd5b50610727611cbc565b005b34801561073557600080fd5b5061073e611d64565b60405161074b91906130b8565b60405180910390f35b34801561076057600080fd5b50610769611d6a565b60405161077691906130b8565b60405180910390f35b34801561078b57600080fd5b506107a660048036038101906107a191906131c0565b611d70565b6040516107b39190613147565b60405180910390f35b3480156107c857600080fd5b506107e360048036038101906107de91906130ff565b611d90565b005b3480156107f157600080fd5b506107fa611e51565b60405161080791906130b8565b60405180910390f35b34801561081c57600080fd5b50610825611e57565b6040516108329190613147565b60405180910390f35b34801561084757600080fd5b50610862600480360381019061085d91906131c0565b611e6a565b60405161086f91906130b8565b60405180910390f35b34801561088457600080fd5b5061089f600480360381019061089a91906131c0565b611eb3565b6040516108ac91906130b8565b60405180910390f35b6108cf60048036038101906108ca91906130ff565b611efc565b005b3480156108dd57600080fd5b506108e66122c6565b6040516108f391906132e0565b60405180910390f35b34801561090857600080fd5b50610923600480360381019061091e91906131c0565b6122ec565b005b61093f600480360381019061093a9190613434565b6123e3565b005b34801561094d57600080fd5b50610956612943565b60405161096391906134c9565b60405180910390f35b610974612967565b73ffffffffffffffffffffffffffffffffffffffff1661099261121b565b73ffffffffffffffffffffffffffffffffffffffff16146109e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109df90613541565b60405180910390fd5b80600c8190555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610a1e612967565b73ffffffffffffffffffffffffffffffffffffffff16610a3c61121b565b73ffffffffffffffffffffffffffffffffffffffff1614610a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8990613541565b60405180910390fd5b8060028190555050565b600760049054906101000a900460ff1681565b610ab7612967565b73ffffffffffffffffffffffffffffffffffffffff16610ad561121b565b73ffffffffffffffffffffffffffffffffffffffff1614610b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2290613541565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610b77612967565b73ffffffffffffffffffffffffffffffffffffffff16610b9561121b565b73ffffffffffffffffffffffffffffffffffffffff1614610beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be290613541565b60405180910390fd5b600760039054906101000a900460ff1615600760036101000a81548160ff021916908315150217905550565b600c5481565b610c25612967565b73ffffffffffffffffffffffffffffffffffffffff16610c4361121b565b73ffffffffffffffffffffffffffffffffffffffff1614610c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9090613541565b60405180910390fd5b600760029054906101000a900460ff1615600760026101000a81548160ff021916908315150217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b610cf1612967565b73ffffffffffffffffffffffffffffffffffffffff16610d0f61121b565b73ffffffffffffffffffffffffffffffffffffffff1614610d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5c90613541565b60405180910390fd5b8060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639f181b5e6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610dd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df99190613576565b90506003548282610e0a91906135d2565b1115610e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4290613674565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166394bf804d84866040518363ffffffff1660e01b8152600401610ea6929190613694565b600060405180830381600087803b158015610ec057600080fd5b505af1158015610ed4573d6000803e3d6000fd5b5050505050505050565b600760039054906101000a900460ff1681565b610ef9612967565b73ffffffffffffffffffffffffffffffffffffffff16610f1761121b565b73ffffffffffffffffffffffffffffffffffffffff1614610f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6490613541565b60405180910390fd5b8060035411610fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa89061372f565b60405180910390fd5b8060038190555050565b600760019054906101000a900460ff1681565b610fd6612967565b73ffffffffffffffffffffffffffffffffffffffff16610ff461121b565b73ffffffffffffffffffffffffffffffffffffffff161461104a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104190613541565b60405180910390fd5b7f5b62250854903ecfb1e67a098b20b95793b97c8e7f182e4f4697b92ebbec9bb36006548260405161107d92919061374f565b60405180910390a18060068190555050565b611097612967565b73ffffffffffffffffffffffffffffffffffffffff166110b561121b565b73ffffffffffffffffffffffffffffffffffffffff161461110b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110290613541565b60405180910390fd5b611115600061296f565b565b60055481565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61117b612967565b73ffffffffffffffffffffffffffffffffffffffff1661119961121b565b73ffffffffffffffffffffffffffffffffffffffff16146111ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e690613541565b60405180910390fd5b600760019054906101000a900460ff1615600760016101000a81548160ff021916908315150217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61124c612967565b73ffffffffffffffffffffffffffffffffffffffff1661126a61121b565b73ffffffffffffffffffffffffffffffffffffffff16146112c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b790613541565b60405180910390fd5b7fe37f490f6820c4aeb200a00776b1dd5a41d05cd1d13ebe80bc9bddc12f408e20600554826040516112f392919061374f565b60405180910390a18060058190555050565b600a6020528060005260406000206000915090505481565b6000848484846113bf838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b54868460405160200161137e9291906137e1565b604051602081830303815290604052805190602001206040516020016113a4919061382e565b60405160208183030381529060405280519060200120612a33565b6113fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f590613895565b60405180910390fd5b600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148290613927565b60405180910390fd5b6001945050505050949350505050565b600760009054906101000a900460ff166114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190613993565b60405180910390fd5b6000801b600b5403611531576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611528906139ff565b60405180910390fd5b338383836115d1838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b5486846040516020016115909291906137e1565b604051602081830303815290604052805190602001206040516020016115b6919061382e565b60405160208183030381529060405280519060200120612a33565b611610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160790613895565b60405180910390fd5b8460007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639f181b5e6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611680573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a49190613576565b905060035482826116b591906135d2565b11156116f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ed90613674565b60405180910390fd5b8660025481600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461174591906135d2565b1115611786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177d90613a6b565b60405180910390fd5b6002600154036117cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c290613ad7565b60405180910390fd5b6002600181905550600760029054906101000a900460ff16611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990613b43565b60405180910390fd5b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156118af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a690613bd5565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166394bf804d89336040518363ffffffff1660e01b815260040161190a929190613694565b600060405180830381600087803b15801561192457600080fd5b505af1158015611938573d6000803e3d6000fd5b5050505087600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461198b91906135d2565b925050819055506001600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001808190555050505050505050505050565b600b5481565b60025481565b611a11612967565b73ffffffffffffffffffffffffffffffffffffffff16611a2f61121b565b73ffffffffffffffffffffffffffffffffffffffff1614611a85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7c90613541565b60405180910390fd5b600760049054906101000a900460ff1615600760046101000a81548160ff021916908315150217905550565b600760029054906101000a900460ff1681565b611acc612967565b73ffffffffffffffffffffffffffffffffffffffff16611aea61121b565b73ffffffffffffffffffffffffffffffffffffffff1614611b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3790613541565b60405180910390fd5b80600b8190555050565b600084848484611bec838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c548684604051602001611bab9291906137e1565b60405160208183030381529060405280519060200120604051602001611bd1919061382e565b60405160208183030381529060405280519060200120612a33565b611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290613c41565b60405180910390fd5b85600a60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403611cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca390613cd3565b60405180910390fd5b6001945050505050949350505050565b611cc4612967565b73ffffffffffffffffffffffffffffffffffffffff16611ce261121b565b73ffffffffffffffffffffffffffffffffffffffff1614611d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2f90613541565b60405180910390fd5b600760009054906101000a900460ff1615600760006101000a81548160ff021916908315150217905550565b60045481565b60065481565b60096020528060005260406000206000915054906101000a900460ff1681565b611d98612967565b73ffffffffffffffffffffffffffffffffffffffff16611db661121b565b73ffffffffffffffffffffffffffffffffffffffff1614611e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0390613541565b60405180910390fd5b7f616211c440ee58ae6f25cbd9e9bc4c443e821e5e609dba05b7c556cd29cb222e60045482604051611e3f92919061374f565b60405180910390a18060048190555050565b60035481565b600760009054906101000a900460ff1681565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600760009054906101000a900460ff16611f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4290613993565b60405180910390fd5b8060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639f181b5e6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611fbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fdf9190613576565b90506003548282611ff091906135d2565b1115612031576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202890613674565b60405180910390fd5b8260025481600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461208091906135d2565b11156120c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b890613a6b565b60405180910390fd5b600260015403612106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fd90613ad7565b60405180910390fd5b6002600181905550600760049054906101000a900460ff1661215d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215490613d3f565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c290613dab565b60405180910390fd5b6121d6846000612ae9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166394bf804d85336040518363ffffffff1660e01b8152600401612231929190613694565b600060405180830381600087803b15801561224b57600080fd5b505af115801561225f573d6000803e3d6000fd5b5050505083600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122b291906135d2565b925050819055506001808190555050505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6122f4612967565b73ffffffffffffffffffffffffffffffffffffffff1661231261121b565b73ffffffffffffffffffffffffffffffffffffffff1614612368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235f90613541565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ce90613e3d565b60405180910390fd5b6123e08161296f565b50565b600760009054906101000a900460ff16612432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242990613993565b60405180910390fd5b6000801b600c5403612479576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247090613ea9565b60405180910390fd5b33848484612519838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c5486846040516020016124d89291906137e1565b604051602081830303815290604052805190602001206040516020016124fe919061382e565b60405160208183030381529060405280519060200120612a33565b612558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254f90613c41565b60405180910390fd5b8460007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16639f181b5e6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156125c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ec9190613576565b905060035482826125fd91906135d2565b111561263e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263590613674565b60405180910390fd5b8660025481600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461268d91906135d2565b11156126ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c590613a6b565b60405180910390fd5b600260015403612713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270a90613ad7565b60405180910390fd5b6002600181905550600760039054906101000a900460ff1661276a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276190613f15565b60405180910390fd5b88600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054036127eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e290613fa7565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166394bf804d89336040518363ffffffff1660e01b8152600401612846929190613694565b600060405180830381600087803b15801561286057600080fd5b505af1158015612874573d6000803e3d6000fd5b50505050612883886001612ae9565b87600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128d291906135d2565b9250508190555087600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461292891906135d2565b92505081905550600180819055505050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008082905060005b8551811015612adb576000868281518110612a5a57612a59613fc7565b5b60200260200101519050808311612a9b578281604051602001612a7e929190613ff6565b604051602081830303815290604052805190602001209250612ac7565b8083604051602001612aae929190613ff6565b6040516020818303038152906040528051906020012092505b508080612ad390614022565b915050612a3c565b508381149150509392505050565b60008115612af957600454612b1b565b7f00000000000000000000000000000000000000000000000000000000000000005b905060008215612b2d57600654612b31565b6005545b90508184612b3f919061406a565b3403612c24576000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168386612b8c919061406a565b604051612b98906140f5565b60006040518083038185875af1925050503d8060008114612bd5576040519150601f19603f3d011682016040523d82523d6000602084013e612bda565b606091505b5050905080612c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1590614156565b60405180910390fd5b50612d36565b60003403612cfa57600760019054906101000a900460ff16612c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c72906141c2565b60405180910390fd5b612cf533600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168387612cae919061406a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612d3c909392919063ffffffff16565b612d35565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2c9061422e565b60405180910390fd5b5b50505050565b612dbf846323b872dd60e01b858585604051602401612d5d9392919061424e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612dc5565b50505050565b6000612e27826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612e8c9092919063ffffffff16565b9050600081511115612e875780806020019051810190612e4791906142b1565b612e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7d90614350565b60405180910390fd5b5b505050565b6060612e9b8484600085612ea4565b90509392505050565b606082471015612ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee0906143e2565b60405180910390fd5b612ef285612fb8565b612f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f289061444e565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612f5a91906144dd565b60006040518083038185875af1925050503d8060008114612f97576040519150601f19603f3d011682016040523d82523d6000602084013e612f9c565b606091505b5091509150612fac828286612fcb565b92505050949350505050565b600080823b905060008111915050919050565b60608315612fdb5782905061302b565b600083511115612fee5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130229190614549565b60405180910390fd5b9392505050565b600080fd5b600080fd5b6000819050919050565b61304f8161303c565b811461305a57600080fd5b50565b60008135905061306c81613046565b92915050565b60006020828403121561308857613087613032565b5b60006130968482850161305d565b91505092915050565b6000819050919050565b6130b28161309f565b82525050565b60006020820190506130cd60008301846130a9565b92915050565b6130dc8161309f565b81146130e757600080fd5b50565b6000813590506130f9816130d3565b92915050565b60006020828403121561311557613114613032565b5b6000613123848285016130ea565b91505092915050565b60008115159050919050565b6131418161312c565b82525050565b600060208201905061315c6000830184613138565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061318d82613162565b9050919050565b61319d81613182565b81146131a857600080fd5b50565b6000813590506131ba81613194565b92915050565b6000602082840312156131d6576131d5613032565b5b60006131e4848285016131ab565b91505092915050565b6131f68161303c565b82525050565b600060208201905061321160008301846131ed565b92915050565b6000819050919050565b600061323c61323761323284613162565b613217565b613162565b9050919050565b600061324e82613221565b9050919050565b600061326082613243565b9050919050565b61327081613255565b82525050565b600060208201905061328b6000830184613267565b92915050565b600080604083850312156132a8576132a7613032565b5b60006132b6858286016131ab565b92505060206132c7858286016130ea565b9150509250929050565b6132da81613182565b82525050565b60006020820190506132f560008301846132d1565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126133205761331f6132fb565b5b8235905067ffffffffffffffff81111561333d5761333c613300565b5b60208301915083602082028301111561335957613358613305565b5b9250929050565b6000806000806060858703121561337a57613379613032565b5b6000613388878288016131ab565b945050602085013567ffffffffffffffff8111156133a9576133a8613037565b5b6133b58782880161330a565b935093505060406133c8878288016130ea565b91505092959194509250565b6000806000604084860312156133ed576133ec613032565b5b600084013567ffffffffffffffff81111561340b5761340a613037565b5b6134178682870161330a565b9350935050602061342a868287016130ea565b9150509250925092565b6000806000806060858703121561344e5761344d613032565b5b600085013567ffffffffffffffff81111561346c5761346b613037565b5b6134788782880161330a565b9450945050602061348b878288016130ea565b925050604061349c878288016130ea565b91505092959194509250565b60006134b382613243565b9050919050565b6134c3816134a8565b82525050565b60006020820190506134de60008301846134ba565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061352b6020836134e4565b9150613536826134f5565b602082019050919050565b6000602082019050818103600083015261355a8161351e565b9050919050565b600081519050613570816130d3565b92915050565b60006020828403121561358c5761358b613032565b5b600061359a84828501613561565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006135dd8261309f565b91506135e88361309f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561361d5761361c6135a3565b5b828201905092915050565b7f45786365656473206d617820746f6b656e20737570706c792100000000000000600082015250565b600061365e6019836134e4565b915061366982613628565b602082019050919050565b6000602082019050818103600083015261368d81613651565b9050919050565b60006040820190506136a960008301856130a9565b6136b660208301846132d1565b9392505050565b7f4d617820746f6b656e20737570706c792063616e206f6e6c792062652064656360008201527f7265617365642100000000000000000000000000000000000000000000000000602082015250565b60006137196027836134e4565b9150613724826136bd565b604082019050919050565b600060208201905081810360008301526137488161370c565b9050919050565b600060408201905061376460008301856130a9565b61377160208301846130a9565b9392505050565b60008160601b9050919050565b600061379082613778565b9050919050565b60006137a282613785565b9050919050565b6137ba6137b582613182565b613797565b82525050565b6000819050919050565b6137db6137d68261309f565b6137c0565b82525050565b60006137ed82856137a9565b6014820191506137fd82846137ca565b6020820191508190509392505050565b6000819050919050565b6138286138238261303c565b61380d565b82525050565b600061383a8284613817565b60208201915081905092915050565b7f41646472657373206973206e6f74206f6e2077686974656c6973742100000000600082015250565b600061387f601c836134e4565b915061388a82613849565b602082019050919050565b600060208201905081810360008301526138ae81613872565b9050919050565b7f57686974656c69737420697320616c726561647920636c61696d65642062792060008201527f746869732077616c6c6574000000000000000000000000000000000000000000602082015250565b6000613911602b836134e4565b915061391c826138b5565b604082019050919050565b6000602082019050818103600083015261394081613904565b9050919050565b7f53616c65206973206e6f74206163746976652100000000000000000000000000600082015250565b600061397d6013836134e4565b915061398882613947565b602082019050919050565b600060208201905081810360008301526139ac81613970565b9050919050565b7f57686974656c697374206d65726b6c6520726f6f74206e6f7420736574210000600082015250565b60006139e9601e836134e4565b91506139f4826139b3565b602082019050919050565b60006020820190508181036000830152613a18816139dc565b9050919050565b7f45786365656473206d6178206d696e7420706572206164647265737321000000600082015250565b6000613a55601d836134e4565b9150613a6082613a1f565b602082019050919050565b60006020820190508181036000830152613a8481613a48565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613ac1601f836134e4565b9150613acc82613a8b565b602082019050919050565b60006020820190508181036000830152613af081613ab4565b9050919050565b7f576869746c6973742073616c65206973206e6f74206163746976652100000000600082015250565b6000613b2d601c836134e4565b9150613b3882613af7565b602082019050919050565b60006020820190508181036000830152613b5c81613b20565b9050919050565b7f57686974656c69737420697320616c726561647920636c61696d65642062792060008201527f746869732077616c6c6574210000000000000000000000000000000000000000602082015250565b6000613bbf602c836134e4565b9150613bca82613b63565b604082019050919050565b60006020820190508181036000830152613bee81613bb2565b9050919050565b7f41646472657373206973206e6f74206f6e20646973636f756e74206c69737421600082015250565b6000613c2b6020836134e4565b9150613c3682613bf5565b602082019050919050565b60006020820190508181036000830152613c5a81613c1e565b9050919050565b7f446973636f756e7420697320616c726561647920636c61696d6564206279207460008201527f6869732077616c6c657400000000000000000000000000000000000000000000602082015250565b6000613cbd602a836134e4565b9150613cc882613c61565b604082019050919050565b60006020820190508181036000830152613cec81613cb0565b9050919050565b7f5075626c69632073616c65206973206e6f742061637469766521000000000000600082015250565b6000613d29601a836134e4565b9150613d3482613cf3565b602082019050919050565b60006020820190508181036000830152613d5881613d1c565b9050919050565b7f4d696e743a206e6f7420616c6c6f7765642066726f6d20636f6e747261637400600082015250565b6000613d95601f836134e4565b9150613da082613d5f565b602082019050919050565b60006020820190508181036000830152613dc481613d88565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613e276026836134e4565b9150613e3282613dcb565b604082019050919050565b60006020820190508181036000830152613e5681613e1a565b9050919050565b7f446973636f756e74206d65726b6c6520726f6f74206e6f742073657421000000600082015250565b6000613e93601d836134e4565b9150613e9e82613e5d565b602082019050919050565b60006020820190508181036000830152613ec281613e86565b9050919050565b7f446973636f756e742073616c65206973206e6f74206163746976652100000000600082015250565b6000613eff601c836134e4565b9150613f0a82613ec9565b602082019050919050565b60006020820190508181036000830152613f2e81613ef2565b9050919050565b7f446973636f756e7420697320616c726561647920636c61696d6564206279207460008201527f6869732077616c6c657421000000000000000000000000000000000000000000602082015250565b6000613f91602b836134e4565b9150613f9c82613f35565b604082019050919050565b60006020820190508181036000830152613fc081613f84565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006140028285613817565b6020820191506140128284613817565b6020820191508190509392505050565b600061402d8261309f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361405f5761405e6135a3565b5b600182019050919050565b60006140758261309f565b91506140808361309f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140b9576140b86135a3565b5b828202905092915050565b600081905092915050565b50565b60006140df6000836140c4565b91506140ea826140cf565b600082019050919050565b6000614100826140d2565b9150819050919050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614140600f836134e4565b915061414b8261410a565b602082019050919050565b6000602082019050818103600083015261416f81614133565b9050919050565b7f417065436f696e2073616c65206973206e6f7420616374697665210000000000600082015250565b60006141ac601b836134e4565b91506141b782614176565b602082019050919050565b600060208201905081810360008301526141db8161419f565b9050919050565b7f696e76616c6964207061796d656e74206f7074696f6e00000000000000000000600082015250565b60006142186016836134e4565b9150614223826141e2565b602082019050919050565b600060208201905081810360008301526142478161420b565b9050919050565b600060608201905061426360008301866132d1565b61427060208301856132d1565b61427d60408301846130a9565b949350505050565b61428e8161312c565b811461429957600080fd5b50565b6000815190506142ab81614285565b92915050565b6000602082840312156142c7576142c6613032565b5b60006142d58482850161429c565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600061433a602a836134e4565b9150614345826142de565b604082019050919050565b600060208201905081810360008301526143698161432d565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006143cc6026836134e4565b91506143d782614370565b604082019050919050565b600060208201905081810360008301526143fb816143bf565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614438601d836134e4565b915061444382614402565b602082019050919050565b600060208201905081810360008301526144678161442b565b9050919050565b600081519050919050565b60005b8381101561449757808201518184015260208101905061447c565b838111156144a6576000848401525b50505050565b60006144b78261446e565b6144c181856140c4565b93506144d1818560208601614479565b80840191505092915050565b60006144e982846144ac565b915081905092915050565b600081519050919050565b6000601f19601f8301169050919050565b600061451b826144f4565b61452581856134e4565b9350614535818560208601614479565b61453e816144ff565b840191505092915050565b600060208201905081810360008301526145638184614510565b90509291505056fea26469706673582212206a19c97ff154e4d279a9533e894a29141f5caf4a3789e16d730c2dc769c195de64736f6c634300080f00330000000000000000000000003ed0814be6c0679a89ca6ed323e475ca66a73743000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000320000000000000000000000004d224452801aced8b2f0aebe155379bb5d594381000000000000000000000000000000000000000000000000012dfb0cb5e88000000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000015af1d78b58c40000000000000000000000000000000000000000000000000001a055690d9db80000

Deployed Bytecode

0x60806040526004361061025c5760003560e01c8063a371a06211610144578063db4bec44116100b6578063ef59f1e41161007a578063ef59f1e414610878578063efd0cbf9146108b5578063f2bcd022146108d1578063f2fde38b146108fc578063f618e63814610925578063fc0c546a146109415761025c565b8063db4bec441461077f578063e04e82dd146107bc578063e8315742146107e5578063eb8d244414610810578063ed9ec8881461083b5761025c565b8063b98451cf11610108578063b98451cf14610681578063bd32fb66146106ac578063c31769fd146106d5578063ce03ec9314610712578063d6f0874e14610729578063db474b39146107545761025c565b8063a371a062146105ae578063a6d612f9146105eb578063aa98e0c614610614578063ae6a80d51461063f578063b5b781c51461066a5761025c565b806359913d47116101dd57806381bb5cb4116101a157806381bb5cb41461049e5780638521b8e3146104c9578063853a5606146105065780638da5cb5b1461051d5780638ffefa0d146105485780639f2d83fd146105715761025c565b806359913d47146103df57806359eaa0951461040a578063657732561461043357806367142cf61461045e578063715018a6146104875761025c565b8063237fa68811610224578063237fa6881461033257806340d34133146103495780634da3cc4a146103745780634f92bea01461038b5780635057afb4146103b65761025c565b80631abae686146102615780631dfe90951461028a5780631e14d44b146102b55780631e84c413146102de57806321b8092e14610309575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613072565b61096c565b005b34801561029657600080fd5b5061029f6109f2565b6040516102ac91906130b8565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d791906130ff565b610a16565b005b3480156102ea57600080fd5b506102f3610a9c565b6040516103009190613147565b60405180910390f35b34801561031557600080fd5b50610330600480360381019061032b91906131c0565b610aaf565b005b34801561033e57600080fd5b50610347610b6f565b005b34801561035557600080fd5b5061035e610c17565b60405161036b91906131fc565b60405180910390f35b34801561038057600080fd5b50610389610c1d565b005b34801561039757600080fd5b506103a0610cc5565b6040516103ad9190613276565b60405180910390f35b3480156103c257600080fd5b506103dd60048036038101906103d89190613291565b610ce9565b005b3480156103eb57600080fd5b506103f4610ede565b6040516104019190613147565b60405180910390f35b34801561041657600080fd5b50610431600480360381019061042c91906130ff565b610ef1565b005b34801561043f57600080fd5b50610448610fbb565b6040516104559190613147565b60405180910390f35b34801561046a57600080fd5b50610485600480360381019061048091906130ff565b610fce565b005b34801561049357600080fd5b5061049c61108f565b005b3480156104aa57600080fd5b506104b3611117565b6040516104c091906130b8565b60405180910390f35b3480156104d557600080fd5b506104f060048036038101906104eb91906131c0565b61111d565b6040516104fd9190613147565b60405180910390f35b34801561051257600080fd5b5061051b611173565b005b34801561052957600080fd5b5061053261121b565b60405161053f91906132e0565b60405180910390f35b34801561055457600080fd5b5061056f600480360381019061056a91906130ff565b611244565b005b34801561057d57600080fd5b50610598600480360381019061059391906131c0565b611305565b6040516105a591906130b8565b60405180910390f35b3480156105ba57600080fd5b506105d560048036038101906105d09190613360565b61131d565b6040516105e29190613147565b60405180910390f35b3480156105f757600080fd5b50610612600480360381019061060d91906133d4565b61149b565b005b34801561062057600080fd5b506106296119fd565b60405161063691906131fc565b60405180910390f35b34801561064b57600080fd5b50610654611a03565b60405161066191906130b8565b60405180910390f35b34801561067657600080fd5b5061067f611a09565b005b34801561068d57600080fd5b50610696611ab1565b6040516106a39190613147565b60405180910390f35b3480156106b857600080fd5b506106d360048036038101906106ce9190613072565b611ac4565b005b3480156106e157600080fd5b506106fc60048036038101906106f79190613360565b611b4a565b6040516107099190613147565b60405180910390f35b34801561071e57600080fd5b50610727611cbc565b005b34801561073557600080fd5b5061073e611d64565b60405161074b91906130b8565b60405180910390f35b34801561076057600080fd5b50610769611d6a565b60405161077691906130b8565b60405180910390f35b34801561078b57600080fd5b506107a660048036038101906107a191906131c0565b611d70565b6040516107b39190613147565b60405180910390f35b3480156107c857600080fd5b506107e360048036038101906107de91906130ff565b611d90565b005b3480156107f157600080fd5b506107fa611e51565b60405161080791906130b8565b60405180910390f35b34801561081c57600080fd5b50610825611e57565b6040516108329190613147565b60405180910390f35b34801561084757600080fd5b50610862600480360381019061085d91906131c0565b611e6a565b60405161086f91906130b8565b60405180910390f35b34801561088457600080fd5b5061089f600480360381019061089a91906131c0565b611eb3565b6040516108ac91906130b8565b60405180910390f35b6108cf60048036038101906108ca91906130ff565b611efc565b005b3480156108dd57600080fd5b506108e66122c6565b6040516108f391906132e0565b60405180910390f35b34801561090857600080fd5b50610923600480360381019061091e91906131c0565b6122ec565b005b61093f600480360381019061093a9190613434565b6123e3565b005b34801561094d57600080fd5b50610956612943565b60405161096391906134c9565b60405180910390f35b610974612967565b73ffffffffffffffffffffffffffffffffffffffff1661099261121b565b73ffffffffffffffffffffffffffffffffffffffff16146109e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109df90613541565b60405180910390fd5b80600c8190555050565b7f000000000000000000000000000000000000000000000000016345785d8a000081565b610a1e612967565b73ffffffffffffffffffffffffffffffffffffffff16610a3c61121b565b73ffffffffffffffffffffffffffffffffffffffff1614610a92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8990613541565b60405180910390fd5b8060028190555050565b600760049054906101000a900460ff1681565b610ab7612967565b73ffffffffffffffffffffffffffffffffffffffff16610ad561121b565b73ffffffffffffffffffffffffffffffffffffffff1614610b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2290613541565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610b77612967565b73ffffffffffffffffffffffffffffffffffffffff16610b9561121b565b73ffffffffffffffffffffffffffffffffffffffff1614610beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be290613541565b60405180910390fd5b600760039054906101000a900460ff1615600760036101000a81548160ff021916908315150217905550565b600c5481565b610c25612967565b73ffffffffffffffffffffffffffffffffffffffff16610c4361121b565b73ffffffffffffffffffffffffffffffffffffffff1614610c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9090613541565b60405180910390fd5b600760029054906101000a900460ff1615600760026101000a81548160ff021916908315150217905550565b7f0000000000000000000000004d224452801aced8b2f0aebe155379bb5d59438181565b610cf1612967565b73ffffffffffffffffffffffffffffffffffffffff16610d0f61121b565b73ffffffffffffffffffffffffffffffffffffffff1614610d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5c90613541565b60405180910390fd5b8060007f0000000000000000000000003ed0814be6c0679a89ca6ed323e475ca66a7374373ffffffffffffffffffffffffffffffffffffffff16639f181b5e6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610dd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df99190613576565b90506003548282610e0a91906135d2565b1115610e4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4290613674565b60405180910390fd5b7f0000000000000000000000003ed0814be6c0679a89ca6ed323e475ca66a7374373ffffffffffffffffffffffffffffffffffffffff166394bf804d84866040518363ffffffff1660e01b8152600401610ea6929190613694565b600060405180830381600087803b158015610ec057600080fd5b505af1158015610ed4573d6000803e3d6000fd5b5050505050505050565b600760039054906101000a900460ff1681565b610ef9612967565b73ffffffffffffffffffffffffffffffffffffffff16610f1761121b565b73ffffffffffffffffffffffffffffffffffffffff1614610f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6490613541565b60405180910390fd5b8060035411610fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa89061372f565b60405180910390fd5b8060038190555050565b600760019054906101000a900460ff1681565b610fd6612967565b73ffffffffffffffffffffffffffffffffffffffff16610ff461121b565b73ffffffffffffffffffffffffffffffffffffffff161461104a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104190613541565b60405180910390fd5b7f5b62250854903ecfb1e67a098b20b95793b97c8e7f182e4f4697b92ebbec9bb36006548260405161107d92919061374f565b60405180910390a18060068190555050565b611097612967565b73ffffffffffffffffffffffffffffffffffffffff166110b561121b565b73ffffffffffffffffffffffffffffffffffffffff161461110b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110290613541565b60405180910390fd5b611115600061296f565b565b60055481565b6000600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61117b612967565b73ffffffffffffffffffffffffffffffffffffffff1661119961121b565b73ffffffffffffffffffffffffffffffffffffffff16146111ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e690613541565b60405180910390fd5b600760019054906101000a900460ff1615600760016101000a81548160ff021916908315150217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61124c612967565b73ffffffffffffffffffffffffffffffffffffffff1661126a61121b565b73ffffffffffffffffffffffffffffffffffffffff16146112c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b790613541565b60405180910390fd5b7fe37f490f6820c4aeb200a00776b1dd5a41d05cd1d13ebe80bc9bddc12f408e20600554826040516112f392919061374f565b60405180910390a18060058190555050565b600a6020528060005260406000206000915090505481565b6000848484846113bf838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b54868460405160200161137e9291906137e1565b604051602081830303815290604052805190602001206040516020016113a4919061382e565b60405160208183030381529060405280519060200120612a33565b6113fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f590613895565b60405180910390fd5b600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561148b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148290613927565b60405180910390fd5b6001945050505050949350505050565b600760009054906101000a900460ff166114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190613993565b60405180910390fd5b6000801b600b5403611531576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611528906139ff565b60405180910390fd5b338383836115d1838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b5486846040516020016115909291906137e1565b604051602081830303815290604052805190602001206040516020016115b6919061382e565b60405160208183030381529060405280519060200120612a33565b611610576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160790613895565b60405180910390fd5b8460007f0000000000000000000000003ed0814be6c0679a89ca6ed323e475ca66a7374373ffffffffffffffffffffffffffffffffffffffff16639f181b5e6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611680573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a49190613576565b905060035482826116b591906135d2565b11156116f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ed90613674565b60405180910390fd5b8660025481600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461174591906135d2565b1115611786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177d90613a6b565b60405180910390fd5b6002600154036117cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c290613ad7565b60405180910390fd5b6002600181905550600760029054906101000a900460ff16611822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181990613b43565b60405180910390fd5b600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156118af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a690613bd5565b60405180910390fd5b7f0000000000000000000000003ed0814be6c0679a89ca6ed323e475ca66a7374373ffffffffffffffffffffffffffffffffffffffff166394bf804d89336040518363ffffffff1660e01b815260040161190a929190613694565b600060405180830381600087803b15801561192457600080fd5b505af1158015611938573d6000803e3d6000fd5b5050505087600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461198b91906135d2565b925050819055506001600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001808190555050505050505050505050565b600b5481565b60025481565b611a11612967565b73ffffffffffffffffffffffffffffffffffffffff16611a2f61121b565b73ffffffffffffffffffffffffffffffffffffffff1614611a85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7c90613541565b60405180910390fd5b600760049054906101000a900460ff1615600760046101000a81548160ff021916908315150217905550565b600760029054906101000a900460ff1681565b611acc612967565b73ffffffffffffffffffffffffffffffffffffffff16611aea61121b565b73ffffffffffffffffffffffffffffffffffffffff1614611b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3790613541565b60405180910390fd5b80600b8190555050565b600084848484611bec838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c548684604051602001611bab9291906137e1565b60405160208183030381529060405280519060200120604051602001611bd1919061382e565b60405160208183030381529060405280519060200120612a33565b611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290613c41565b60405180910390fd5b85600a60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205403611cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca390613cd3565b60405180910390fd5b6001945050505050949350505050565b611cc4612967565b73ffffffffffffffffffffffffffffffffffffffff16611ce261121b565b73ffffffffffffffffffffffffffffffffffffffff1614611d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2f90613541565b60405180910390fd5b600760009054906101000a900460ff1615600760006101000a81548160ff021916908315150217905550565b60045481565b60065481565b60096020528060005260406000206000915054906101000a900460ff1681565b611d98612967565b73ffffffffffffffffffffffffffffffffffffffff16611db661121b565b73ffffffffffffffffffffffffffffffffffffffff1614611e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0390613541565b60405180910390fd5b7f616211c440ee58ae6f25cbd9e9bc4c443e821e5e609dba05b7c556cd29cb222e60045482604051611e3f92919061374f565b60405180910390a18060048190555050565b60035481565b600760009054906101000a900460ff1681565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600760009054906101000a900460ff16611f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4290613993565b60405180910390fd5b8060007f0000000000000000000000003ed0814be6c0679a89ca6ed323e475ca66a7374373ffffffffffffffffffffffffffffffffffffffff16639f181b5e6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611fbb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fdf9190613576565b90506003548282611ff091906135d2565b1115612031576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202890613674565b60405180910390fd5b8260025481600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461208091906135d2565b11156120c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b890613a6b565b60405180910390fd5b600260015403612106576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fd90613ad7565b60405180910390fd5b6002600181905550600760049054906101000a900460ff1661215d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215490613d3f565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c290613dab565b60405180910390fd5b6121d6846000612ae9565b7f0000000000000000000000003ed0814be6c0679a89ca6ed323e475ca66a7374373ffffffffffffffffffffffffffffffffffffffff166394bf804d85336040518363ffffffff1660e01b8152600401612231929190613694565b600060405180830381600087803b15801561224b57600080fd5b505af115801561225f573d6000803e3d6000fd5b5050505083600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122b291906135d2565b925050819055506001808190555050505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6122f4612967565b73ffffffffffffffffffffffffffffffffffffffff1661231261121b565b73ffffffffffffffffffffffffffffffffffffffff1614612368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235f90613541565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ce90613e3d565b60405180910390fd5b6123e08161296f565b50565b600760009054906101000a900460ff16612432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242990613993565b60405180910390fd5b6000801b600c5403612479576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247090613ea9565b60405180910390fd5b33848484612519838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c5486846040516020016124d89291906137e1565b604051602081830303815290604052805190602001206040516020016124fe919061382e565b60405160208183030381529060405280519060200120612a33565b612558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254f90613c41565b60405180910390fd5b8460007f0000000000000000000000003ed0814be6c0679a89ca6ed323e475ca66a7374373ffffffffffffffffffffffffffffffffffffffff16639f181b5e6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156125c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125ec9190613576565b905060035482826125fd91906135d2565b111561263e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263590613674565b60405180910390fd5b8660025481600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461268d91906135d2565b11156126ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c590613a6b565b60405180910390fd5b600260015403612713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270a90613ad7565b60405180910390fd5b6002600181905550600760039054906101000a900460ff1661276a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276190613f15565b60405180910390fd5b88600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054036127eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e290613fa7565b60405180910390fd5b7f0000000000000000000000003ed0814be6c0679a89ca6ed323e475ca66a7374373ffffffffffffffffffffffffffffffffffffffff166394bf804d89336040518363ffffffff1660e01b8152600401612846929190613694565b600060405180830381600087803b15801561286057600080fd5b505af1158015612874573d6000803e3d6000fd5b50505050612883886001612ae9565b87600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128d291906135d2565b9250508190555087600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461292891906135d2565b92505081905550600180819055505050505050505050505050565b7f0000000000000000000000003ed0814be6c0679a89ca6ed323e475ca66a7374381565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008082905060005b8551811015612adb576000868281518110612a5a57612a59613fc7565b5b60200260200101519050808311612a9b578281604051602001612a7e929190613ff6565b604051602081830303815290604052805190602001209250612ac7565b8083604051602001612aae929190613ff6565b6040516020818303038152906040528051906020012092505b508080612ad390614022565b915050612a3c565b508381149150509392505050565b60008115612af957600454612b1b565b7f000000000000000000000000000000000000000000000000016345785d8a00005b905060008215612b2d57600654612b31565b6005545b90508184612b3f919061406a565b3403612c24576000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168386612b8c919061406a565b604051612b98906140f5565b60006040518083038185875af1925050503d8060008114612bd5576040519150601f19603f3d011682016040523d82523d6000602084013e612bda565b606091505b5050905080612c1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1590614156565b60405180910390fd5b50612d36565b60003403612cfa57600760019054906101000a900460ff16612c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c72906141c2565b60405180910390fd5b612cf533600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168387612cae919061406a565b7f0000000000000000000000004d224452801aced8b2f0aebe155379bb5d59438173ffffffffffffffffffffffffffffffffffffffff16612d3c909392919063ffffffff16565b612d35565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2c9061422e565b60405180910390fd5b5b50505050565b612dbf846323b872dd60e01b858585604051602401612d5d9392919061424e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612dc5565b50505050565b6000612e27826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612e8c9092919063ffffffff16565b9050600081511115612e875780806020019051810190612e4791906142b1565b612e86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7d90614350565b60405180910390fd5b5b505050565b6060612e9b8484600085612ea4565b90509392505050565b606082471015612ee9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee0906143e2565b60405180910390fd5b612ef285612fb8565b612f31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f289061444e565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612f5a91906144dd565b60006040518083038185875af1925050503d8060008114612f97576040519150601f19603f3d011682016040523d82523d6000602084013e612f9c565b606091505b5091509150612fac828286612fcb565b92505050949350505050565b600080823b905060008111915050919050565b60608315612fdb5782905061302b565b600083511115612fee5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130229190614549565b60405180910390fd5b9392505050565b600080fd5b600080fd5b6000819050919050565b61304f8161303c565b811461305a57600080fd5b50565b60008135905061306c81613046565b92915050565b60006020828403121561308857613087613032565b5b60006130968482850161305d565b91505092915050565b6000819050919050565b6130b28161309f565b82525050565b60006020820190506130cd60008301846130a9565b92915050565b6130dc8161309f565b81146130e757600080fd5b50565b6000813590506130f9816130d3565b92915050565b60006020828403121561311557613114613032565b5b6000613123848285016130ea565b91505092915050565b60008115159050919050565b6131418161312c565b82525050565b600060208201905061315c6000830184613138565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061318d82613162565b9050919050565b61319d81613182565b81146131a857600080fd5b50565b6000813590506131ba81613194565b92915050565b6000602082840312156131d6576131d5613032565b5b60006131e4848285016131ab565b91505092915050565b6131f68161303c565b82525050565b600060208201905061321160008301846131ed565b92915050565b6000819050919050565b600061323c61323761323284613162565b613217565b613162565b9050919050565b600061324e82613221565b9050919050565b600061326082613243565b9050919050565b61327081613255565b82525050565b600060208201905061328b6000830184613267565b92915050565b600080604083850312156132a8576132a7613032565b5b60006132b6858286016131ab565b92505060206132c7858286016130ea565b9150509250929050565b6132da81613182565b82525050565b60006020820190506132f560008301846132d1565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126133205761331f6132fb565b5b8235905067ffffffffffffffff81111561333d5761333c613300565b5b60208301915083602082028301111561335957613358613305565b5b9250929050565b6000806000806060858703121561337a57613379613032565b5b6000613388878288016131ab565b945050602085013567ffffffffffffffff8111156133a9576133a8613037565b5b6133b58782880161330a565b935093505060406133c8878288016130ea565b91505092959194509250565b6000806000604084860312156133ed576133ec613032565b5b600084013567ffffffffffffffff81111561340b5761340a613037565b5b6134178682870161330a565b9350935050602061342a868287016130ea565b9150509250925092565b6000806000806060858703121561344e5761344d613032565b5b600085013567ffffffffffffffff81111561346c5761346b613037565b5b6134788782880161330a565b9450945050602061348b878288016130ea565b925050604061349c878288016130ea565b91505092959194509250565b60006134b382613243565b9050919050565b6134c3816134a8565b82525050565b60006020820190506134de60008301846134ba565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061352b6020836134e4565b9150613536826134f5565b602082019050919050565b6000602082019050818103600083015261355a8161351e565b9050919050565b600081519050613570816130d3565b92915050565b60006020828403121561358c5761358b613032565b5b600061359a84828501613561565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006135dd8261309f565b91506135e88361309f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561361d5761361c6135a3565b5b828201905092915050565b7f45786365656473206d617820746f6b656e20737570706c792100000000000000600082015250565b600061365e6019836134e4565b915061366982613628565b602082019050919050565b6000602082019050818103600083015261368d81613651565b9050919050565b60006040820190506136a960008301856130a9565b6136b660208301846132d1565b9392505050565b7f4d617820746f6b656e20737570706c792063616e206f6e6c792062652064656360008201527f7265617365642100000000000000000000000000000000000000000000000000602082015250565b60006137196027836134e4565b9150613724826136bd565b604082019050919050565b600060208201905081810360008301526137488161370c565b9050919050565b600060408201905061376460008301856130a9565b61377160208301846130a9565b9392505050565b60008160601b9050919050565b600061379082613778565b9050919050565b60006137a282613785565b9050919050565b6137ba6137b582613182565b613797565b82525050565b6000819050919050565b6137db6137d68261309f565b6137c0565b82525050565b60006137ed82856137a9565b6014820191506137fd82846137ca565b6020820191508190509392505050565b6000819050919050565b6138286138238261303c565b61380d565b82525050565b600061383a8284613817565b60208201915081905092915050565b7f41646472657373206973206e6f74206f6e2077686974656c6973742100000000600082015250565b600061387f601c836134e4565b915061388a82613849565b602082019050919050565b600060208201905081810360008301526138ae81613872565b9050919050565b7f57686974656c69737420697320616c726561647920636c61696d65642062792060008201527f746869732077616c6c6574000000000000000000000000000000000000000000602082015250565b6000613911602b836134e4565b915061391c826138b5565b604082019050919050565b6000602082019050818103600083015261394081613904565b9050919050565b7f53616c65206973206e6f74206163746976652100000000000000000000000000600082015250565b600061397d6013836134e4565b915061398882613947565b602082019050919050565b600060208201905081810360008301526139ac81613970565b9050919050565b7f57686974656c697374206d65726b6c6520726f6f74206e6f7420736574210000600082015250565b60006139e9601e836134e4565b91506139f4826139b3565b602082019050919050565b60006020820190508181036000830152613a18816139dc565b9050919050565b7f45786365656473206d6178206d696e7420706572206164647265737321000000600082015250565b6000613a55601d836134e4565b9150613a6082613a1f565b602082019050919050565b60006020820190508181036000830152613a8481613a48565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613ac1601f836134e4565b9150613acc82613a8b565b602082019050919050565b60006020820190508181036000830152613af081613ab4565b9050919050565b7f576869746c6973742073616c65206973206e6f74206163746976652100000000600082015250565b6000613b2d601c836134e4565b9150613b3882613af7565b602082019050919050565b60006020820190508181036000830152613b5c81613b20565b9050919050565b7f57686974656c69737420697320616c726561647920636c61696d65642062792060008201527f746869732077616c6c6574210000000000000000000000000000000000000000602082015250565b6000613bbf602c836134e4565b9150613bca82613b63565b604082019050919050565b60006020820190508181036000830152613bee81613bb2565b9050919050565b7f41646472657373206973206e6f74206f6e20646973636f756e74206c69737421600082015250565b6000613c2b6020836134e4565b9150613c3682613bf5565b602082019050919050565b60006020820190508181036000830152613c5a81613c1e565b9050919050565b7f446973636f756e7420697320616c726561647920636c61696d6564206279207460008201527f6869732077616c6c657400000000000000000000000000000000000000000000602082015250565b6000613cbd602a836134e4565b9150613cc882613c61565b604082019050919050565b60006020820190508181036000830152613cec81613cb0565b9050919050565b7f5075626c69632073616c65206973206e6f742061637469766521000000000000600082015250565b6000613d29601a836134e4565b9150613d3482613cf3565b602082019050919050565b60006020820190508181036000830152613d5881613d1c565b9050919050565b7f4d696e743a206e6f7420616c6c6f7765642066726f6d20636f6e747261637400600082015250565b6000613d95601f836134e4565b9150613da082613d5f565b602082019050919050565b60006020820190508181036000830152613dc481613d88565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613e276026836134e4565b9150613e3282613dcb565b604082019050919050565b60006020820190508181036000830152613e5681613e1a565b9050919050565b7f446973636f756e74206d65726b6c6520726f6f74206e6f742073657421000000600082015250565b6000613e93601d836134e4565b9150613e9e82613e5d565b602082019050919050565b60006020820190508181036000830152613ec281613e86565b9050919050565b7f446973636f756e742073616c65206973206e6f74206163746976652100000000600082015250565b6000613eff601c836134e4565b9150613f0a82613ec9565b602082019050919050565b60006020820190508181036000830152613f2e81613ef2565b9050919050565b7f446973636f756e7420697320616c726561647920636c61696d6564206279207460008201527f6869732077616c6c657421000000000000000000000000000000000000000000602082015250565b6000613f91602b836134e4565b9150613f9c82613f35565b604082019050919050565b60006020820190508181036000830152613fc081613f84565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006140028285613817565b6020820191506140128284613817565b6020820191508190509392505050565b600061402d8261309f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361405f5761405e6135a3565b5b600182019050919050565b60006140758261309f565b91506140808361309f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140b9576140b86135a3565b5b828202905092915050565b600081905092915050565b50565b60006140df6000836140c4565b91506140ea826140cf565b600082019050919050565b6000614100826140d2565b9150819050919050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000614140600f836134e4565b915061414b8261410a565b602082019050919050565b6000602082019050818103600083015261416f81614133565b9050919050565b7f417065436f696e2073616c65206973206e6f7420616374697665210000000000600082015250565b60006141ac601b836134e4565b91506141b782614176565b602082019050919050565b600060208201905081810360008301526141db8161419f565b9050919050565b7f696e76616c6964207061796d656e74206f7074696f6e00000000000000000000600082015250565b60006142186016836134e4565b9150614223826141e2565b602082019050919050565b600060208201905081810360008301526142478161420b565b9050919050565b600060608201905061426360008301866132d1565b61427060208301856132d1565b61427d60408301846130a9565b949350505050565b61428e8161312c565b811461429957600080fd5b50565b6000815190506142ab81614285565b92915050565b6000602082840312156142c7576142c6613032565b5b60006142d58482850161429c565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600061433a602a836134e4565b9150614345826142de565b604082019050919050565b600060208201905081810360008301526143698161432d565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006143cc6026836134e4565b91506143d782614370565b604082019050919050565b600060208201905081810360008301526143fb816143bf565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614438601d836134e4565b915061444382614402565b602082019050919050565b600060208201905081810360008301526144678161442b565b9050919050565b600081519050919050565b60005b8381101561449757808201518184015260208101905061447c565b838111156144a6576000848401525b50505050565b60006144b78261446e565b6144c181856140c4565b93506144d1818560208601614479565b80840191505092915050565b60006144e982846144ac565b915081905092915050565b600081519050919050565b6000601f19601f8301169050919050565b600061451b826144f4565b61452581856134e4565b9350614535818560208601614479565b61453e816144ff565b840191505092915050565b600060208201905081810360008301526145638184614510565b90509291505056fea26469706673582212206a19c97ff154e4d279a9533e894a29141f5caf4a3789e16d730c2dc769c195de64736f6c634300080f0033

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

0000000000000000000000003ed0814be6c0679a89ca6ed323e475ca66a73743000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000320000000000000000000000004d224452801aced8b2f0aebe155379bb5d594381000000000000000000000000000000000000000000000000012dfb0cb5e88000000000000000000000000000000000000000000000000000016345785d8a00000000000000000000000000000000000000000000000000015af1d78b58c40000000000000000000000000000000000000000000000000001a055690d9db80000

-----Decoded View---------------
Arg [0] : contractAddress (address): 0x3ed0814bE6C0679A89Ca6Ed323E475ca66a73743
Arg [1] : _maxTokens (uint256): 10000
Arg [2] : _maxMintsPerAddress (uint256): 50
Arg [3] : _tokenApeCoin (address): 0x4d224452801ACEd8B2F0aebE155379bb5D594381
Arg [4] : _tokenPriceETH_Discount (uint256): 85000000000000000
Arg [5] : _tokenPriceETH (uint256): 100000000000000000
Arg [6] : _tokenPriceApeCoin_Discount (uint256): 25000000000000000000
Arg [7] : _tokenPriceApeCoin (uint256): 30000000000000000000

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000003ed0814be6c0679a89ca6ed323e475ca66a73743
Arg [1] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [3] : 0000000000000000000000004d224452801aced8b2f0aebe155379bb5d594381
Arg [4] : 000000000000000000000000000000000000000000000000012dfb0cb5e88000
Arg [5] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [6] : 0000000000000000000000000000000000000000000000015af1d78b58c40000
Arg [7] : 000000000000000000000000000000000000000000000001a055690d9db80000


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.