Contract 0xFC1Ccd12A3aFbf3e6E5ba134Fa446935D20bc2F6

Contract Overview

Balance:
0 BNB
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xb857f70e3ff91b868ec2122f3127e4e21c72a531376696d9d47652c7245f8c24Zap Out BNB129766772021-10-06 2:51:3718 days 22 hrs ago0x735520f20ec3faefe91b2a2318b82d6f9e986ea3 IN  0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f60 BNB0.0023236
0x1946f61a628ed5d23e349421cecddab4e9f34770ca88f1d082a6c958ed4c3669Zap Out BNB129587462021-10-05 11:54:5619 days 13 hrs ago0x735520f20ec3faefe91b2a2318b82d6f9e986ea3 IN  0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f60 BNB0.0023236
0xaea1745d5e00712d40b484d2c120049fea53750f1fb7d88911300a7613116030Zap Out BNB129545202021-10-05 8:23:3819 days 16 hrs ago0x735520f20ec3faefe91b2a2318b82d6f9e986ea3 IN  0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f60 BNB0.00277648
0x080c8013c388e6407868aa9c48253166bde2a190c085224b62a440e371276262Zap In BNB128604182021-10-02 1:12:1623 days 1 min ago0x32a935f79ce498aeff77acd2f7f35b3aabc31a2d IN  0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f61 BNB0.00248338
0x9e5a9722ab3d4006e278f9f801e1dc7e5d9c6a7b533433db26db422ca49e99ab0x60806040128603662021-10-02 1:09:4023 days 3 mins ago0x32a935f79ce498aeff77acd2f7f35b3aabc31a2d IN  Contract Creation0 BNB0.0206725
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xb857f70e3ff91b868ec2122f3127e4e21c72a531376696d9d47652c7245f8c24129766772021-10-06 2:51:3718 days 22 hrs ago 0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f60x735520f20ec3faefe91b2a2318b82d6f9e986ea30.000511880895345276 BNB
0xb857f70e3ff91b868ec2122f3127e4e21c72a531376696d9d47652c7245f8c24129766772021-10-06 2:51:3718 days 22 hrs ago 0xae13d989dac2f0debff460ac112a837c89baa7cd 0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f60.000511880895345276 BNB
0xb857f70e3ff91b868ec2122f3127e4e21c72a531376696d9d47652c7245f8c24129766772021-10-06 2:51:3718 days 22 hrs ago 0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f6 0xae13d989dac2f0debff460ac112a837c89baa7cd0 BNB
0xb857f70e3ff91b868ec2122f3127e4e21c72a531376696d9d47652c7245f8c24129766772021-10-06 2:51:3718 days 22 hrs ago 0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f6 0xd99d1c33f9fc3444f8101754abc46c52416550d10 BNB
0xb857f70e3ff91b868ec2122f3127e4e21c72a531376696d9d47652c7245f8c24129766772021-10-06 2:51:3718 days 22 hrs ago 0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f6 0x6725f303b657a9451d8ba641348b6761a6cc7a170 BNB
0xb857f70e3ff91b868ec2122f3127e4e21c72a531376696d9d47652c7245f8c24129766772021-10-06 2:51:3718 days 22 hrs ago 0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f6 0x4d24bf63e5d6e03708e2dfd5cc8253b3f22fe9130 BNB
0xb857f70e3ff91b868ec2122f3127e4e21c72a531376696d9d47652c7245f8c24129766772021-10-06 2:51:3718 days 22 hrs ago 0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f6 0x4d24bf63e5d6e03708e2dfd5cc8253b3f22fe9130 BNB
0xb857f70e3ff91b868ec2122f3127e4e21c72a531376696d9d47652c7245f8c24129766772021-10-06 2:51:3718 days 22 hrs ago 0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f6 0xb9b492b5d470ae0eb2bb07a87062ec97615d8b090 BNB
0xb857f70e3ff91b868ec2122f3127e4e21c72a531376696d9d47652c7245f8c24129766772021-10-06 2:51:3718 days 22 hrs ago 0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f6 0x0663ce84485b8f1383dfe01b214f31eef76a23ce0 BNB
0xb857f70e3ff91b868ec2122f3127e4e21c72a531376696d9d47652c7245f8c24129766772021-10-06 2:51:3718 days 22 hrs ago 0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f6 0x0663ce84485b8f1383dfe01b214f31eef76a23ce0 BNB
0xb857f70e3ff91b868ec2122f3127e4e21c72a531376696d9d47652c7245f8c24129766772021-10-06 2:51:3718 days 22 hrs ago 0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f6 0x0663ce84485b8f1383dfe01b214f31eef76a23ce0 BNB
0x1946f61a628ed5d23e349421cecddab4e9f34770ca88f1d082a6c958ed4c3669129587462021-10-05 11:54:5619 days 13 hrs ago 0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f60x735520f20ec3faefe91b2a2318b82d6f9e986ea30.00153317475859406 BNB
0x1946f61a628ed5d23e349421cecddab4e9f34770ca88f1d082a6c958ed4c3669129587462021-10-05 11:54:5619 days 13 hrs ago 0xae13d989dac2f0debff460ac112a837c89baa7cd 0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f60.00153317475859406 BNB
0x1946f61a628ed5d23e349421cecddab4e9f34770ca88f1d082a6c958ed4c3669129587462021-10-05 11:54:5619 days 13 hrs ago 0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f6 0xae13d989dac2f0debff460ac112a837c89baa7cd0 BNB
0x1946f61a628ed5d23e349421cecddab4e9f34770ca88f1d082a6c958ed4c3669129587462021-10-05 11:54:5619 days 13 hrs ago 0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f6 0xd99d1c33f9fc3444f8101754abc46c52416550d10 BNB
0x1946f61a628ed5d23e349421cecddab4e9f34770ca88f1d082a6c958ed4c3669129587462021-10-05 11:54:5619 days 13 hrs ago 0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f6 0x6725f303b657a9451d8ba641348b6761a6cc7a170 BNB
0x1946f61a628ed5d23e349421cecddab4e9f34770ca88f1d082a6c958ed4c3669129587462021-10-05 11:54:5619 days 13 hrs ago 0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f6 0x4d24bf63e5d6e03708e2dfd5cc8253b3f22fe9130 BNB
0x1946f61a628ed5d23e349421cecddab4e9f34770ca88f1d082a6c958ed4c3669129587462021-10-05 11:54:5619 days 13 hrs ago 0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f6 0x4d24bf63e5d6e03708e2dfd5cc8253b3f22fe9130 BNB
0x1946f61a628ed5d23e349421cecddab4e9f34770ca88f1d082a6c958ed4c3669129587462021-10-05 11:54:5619 days 13 hrs ago 0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f6 0xb9b492b5d470ae0eb2bb07a87062ec97615d8b090 BNB
0x1946f61a628ed5d23e349421cecddab4e9f34770ca88f1d082a6c958ed4c3669129587462021-10-05 11:54:5619 days 13 hrs ago 0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f6 0x0663ce84485b8f1383dfe01b214f31eef76a23ce0 BNB
0x1946f61a628ed5d23e349421cecddab4e9f34770ca88f1d082a6c958ed4c3669129587462021-10-05 11:54:5619 days 13 hrs ago 0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f6 0x0663ce84485b8f1383dfe01b214f31eef76a23ce0 BNB
0x1946f61a628ed5d23e349421cecddab4e9f34770ca88f1d082a6c958ed4c3669129587462021-10-05 11:54:5619 days 13 hrs ago 0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f6 0x0663ce84485b8f1383dfe01b214f31eef76a23ce0 BNB
0xaea1745d5e00712d40b484d2c120049fea53750f1fb7d88911300a7613116030129545202021-10-05 8:23:3819 days 16 hrs ago 0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f60x735520f20ec3faefe91b2a2318b82d6f9e986ea32.131361146235953277 BNB
0xaea1745d5e00712d40b484d2c120049fea53750f1fb7d88911300a7613116030129545202021-10-05 8:23:3819 days 16 hrs ago 0xae13d989dac2f0debff460ac112a837c89baa7cd 0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f62.131361146235953277 BNB
0xaea1745d5e00712d40b484d2c120049fea53750f1fb7d88911300a7613116030129545202021-10-05 8:23:3819 days 16 hrs ago 0xfc1ccd12a3afbf3e6e5ba134fa446935d20bc2f6 0xae13d989dac2f0debff460ac112a837c89baa7cd0 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MintClubZapV3

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 1500 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 9 : MintClubZapV3.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.6;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "./lib/IUniswapV2Router02.sol";
import "./lib/IUniswapV2Factory.sol";
import "./lib/IMintClubBond.sol";
import "./lib/IWETH.sol";

/**
* @title MintClubZapV3 extension contract (3.0.0)
*/

contract MintClubZapV3 is Context {
    using SafeERC20 for IERC20;

    address private constant DEFAULT_BENEFICIARY = 0x82CA6d313BffE56E9096b16633dfD414148D66b1;

    // Pancakeswap Router
    // IUniswapV2Factory private constant PANCAKE_FACTORY = IUniswapV2Factory(0xcA143Ce32Fe78f1f7019d7d551a6402fC5350c73);
    // IUniswapV2Router02 private constant PANCAKE_ROUTER = IUniswapV2Router02(0x10ED43C718714eb63d5aA57B78B54704E256024E);
    // IMintClubBond private constant BOND = IMintClubBond(0x8BBac0C7583Cc146244a18863E708bFFbbF19975);

    // Unix timestamp after which the transaction will revert.
    // uint256 private constant DEAD_LINE = 0xf000000000000000000000000000000000000000000000000000000000000000;
    // address private constant MINT_CONTRACT = address(0x1f3Af095CDa17d63cad238358837321e95FC5915);
    // address private constant WBNB_CONTRACT = address(0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c);

    // MARK: - Testnet configs

    IUniswapV2Factory private constant PANCAKE_FACTORY = IUniswapV2Factory(0x6725F303b657a9451d8BA641348b6761A6CC7a17);
    IUniswapV2Router02 private constant PANCAKE_ROUTER = IUniswapV2Router02(0xD99D1c33F9fC3444f8101754aBC46c52416550D1);
    IMintClubBond private constant BOND = IMintClubBond(0xB9B492B5D470ae0eB2BB07a87062EC97615d8b09);
    uint256 private constant DEAD_LINE = 0xf000000000000000000000000000000000000000000000000000000000000000;
    address private constant MINT_CONTRACT = address(0x4d24BF63E5d6E03708e2DFd5cc8253B3f22FE913);
    address private constant WBNB_CONTRACT = address(0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd);

    constructor() {
        // Approve infinite MINT tokens spendable by bond contract
        // MINT will be stored temporarily during the swap transaction
        _approveToken(MINT_CONTRACT, address(BOND));
    }

    receive() external payable {}

    // Renamed getAmountOut -> estimateZapIn
    function estimateZapIn(address from, address to, uint256 amount) external view returns (uint256 tokenToReceive, uint256 mintTokenTaxAmount) {
        uint256 mintAmount;

        if (from == MINT_CONTRACT) {
            mintAmount = amount;
        } else {
            address[] memory path = _getPathToMint(from);

            mintAmount = PANCAKE_ROUTER.getAmountsOut(amount, path)[path.length - 1];
        }

        return BOND.getMintReward(to, mintAmount);
    }

    function estimateZapOut(address from, address to, uint256 amount) external view returns (uint256 amountToReceive, uint256 mintTokenTaxAmount) {
        uint256 mintToRefund;
        (mintToRefund, mintTokenTaxAmount) = BOND.getBurnRefund(from, amount);

        if (to == MINT_CONTRACT) {
            amountToReceive = mintToRefund;
        } else {
            address[] memory path = _getPathFromMint(to);

            amountToReceive = PANCAKE_ROUTER.getAmountsOut(mintToRefund, path)[path.length - 1];
        }
    }

    function zapInBNB(address to, uint256 minAmountOut, address beneficiary) public payable {
        // First, wrap BNB to WBNB
        IWETH(WBNB_CONTRACT).deposit{value: msg.value}();

        // Swap WBNB to MINT
        uint256 mintAmount = _swap(WBNB_CONTRACT, MINT_CONTRACT, msg.value);

        // Finally, buy target tokens with swapped MINT
        _buyMintClubTokenAndSend(to, mintAmount, minAmountOut, _getBeneficiary(beneficiary));
    }

    function zapIn(address from, address to, uint256 amountIn, uint256 minAmountOut, address beneficiary) public {
        // First, pull tokens to this contract
        IERC20 token = IERC20(from);
        require(token.allowance(_msgSender(), address(this)) >= amountIn, 'NOT_ENOUGH_ALLOWANCE');
        IERC20(from).safeTransferFrom(_msgSender(), address(this), amountIn);

        // Swap to MINT if necessary
        uint256 mintAmount;
        if (from == MINT_CONTRACT) {
            mintAmount = amountIn;
        } else {
            mintAmount = _swap(from, MINT_CONTRACT, amountIn);
        }

        // Finally, buy target tokens with swapped MINT
        _buyMintClubTokenAndSend(to, mintAmount, minAmountOut, _getBeneficiary(beneficiary));
    }

    function createAndZapIn(string memory name, string memory symbol, uint256 maxTokenSupply, address token, uint256 tokenAmount, uint256 minAmountOut, address beneficiary) external {
        address newToken = BOND.createToken(name, symbol, maxTokenSupply);

        // We need `minAmountOut` here token->MINT can be front ran and slippage my happen
        zapIn(token, newToken, tokenAmount, minAmountOut, _getBeneficiary(beneficiary));
    }

    function createAndZapInBNB(string memory name, string memory symbol, uint256 maxTokenSupply, uint256 minAmountOut, address beneficiary) external payable {
        address newToken = BOND.createToken(name, symbol, maxTokenSupply);

        zapInBNB(newToken, minAmountOut, _getBeneficiary(beneficiary));
    }

    function zapOut(address from, address to, uint256 amountIn, uint256 minAmountOut, address beneficiary) external {
        uint256 mintAmount = _receiveAndSwapToMint(from, amountIn, _getBeneficiary(beneficiary));

        // Swap to MINT if necessary
        IERC20 toToken;
        uint256 amountOut;
        if (to == MINT_CONTRACT) {
            toToken = IERC20(MINT_CONTRACT);
            amountOut = mintAmount;
        } else {
            toToken = IERC20(to);
            amountOut = _swap(MINT_CONTRACT, to, mintAmount);
        }

        // Check slippage limit
        require(amountOut >= minAmountOut, 'ZAP_SLIPPAGE_LIMIT_EXCEEDED');

        // Send the token to the user
        require(toToken.transfer(_msgSender(), amountOut), 'BALANCE_TRANSFER_FAILED');
    }

    function zapOutBNB(address from, uint256 amountIn, uint256 minAmountOut, address beneficiary) external {
        uint256 mintAmount = _receiveAndSwapToMint(from, amountIn, _getBeneficiary(beneficiary));

        // Swap to MINT to BNB
        uint256 amountOut = _swap(MINT_CONTRACT, WBNB_CONTRACT, mintAmount);
        IWETH(WBNB_CONTRACT).withdraw(amountOut);

        // Check slippage limit
        require(amountOut >= minAmountOut, 'ZAP_SLIPPAGE_LIMIT_EXCEEDED');

        // TODO: FIXME!!!!!

        // Send BNB to user
        (bool sent, ) = _msgSender().call{value: amountOut}("");
        require(sent, "BNB_TRANSFER_FAILED");
    }

    function _buyMintClubTokenAndSend(address tokenAddress, uint256 mintAmount, uint256 minAmountOut, address beneficiary) internal {
        // Finally, buy target tokens with swapped MINT (can be reverted due to slippage limit)
        BOND.buy(tokenAddress, mintAmount, minAmountOut, _getBeneficiary(beneficiary));

        // BOND.buy doesn't return any value, so we need to calculate the purchased amount
        IERC20 token = IERC20(tokenAddress);
        require(token.transfer(_msgSender(), token.balanceOf(address(this))), 'BALANCE_TRANSFER_FAILED');
    }

    function _receiveAndSwapToMint(address from, uint256 amountIn, address beneficiary) internal returns (uint256) {
        // First, pull tokens to this contract
        IERC20 token = IERC20(from);
        require(token.allowance(_msgSender(), address(this)) >= amountIn, 'NOT_ENOUGH_ALLOWANCE');
        IERC20(from).safeTransferFrom(_msgSender(), address(this), amountIn);

        // Approve infinitely to this contract
        if (token.allowance(address(this), address(BOND)) < amountIn) {
            require(token.approve(address(BOND), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff), 'APPROVE_FAILED');
        }

        // Sell tokens to MINT
        // NOTE: ignore minRefund (set as 0) for now, we should check it later on zapOut
        BOND.sell(from, amountIn, 0, _getBeneficiary(beneficiary));
        IERC20 mintToken = IERC20(MINT_CONTRACT);

        return mintToken.balanceOf(address(this));
    }


    function _getPathToMint(address from) internal pure returns (address[] memory path) {
        if (from == WBNB_CONTRACT) {
            path = new address[](2);
            path[0] = WBNB_CONTRACT;
            path[1] = MINT_CONTRACT;
        } else {
            path = new address[](3);
            path[0] = from;
            path[1] = WBNB_CONTRACT;
            path[2] = MINT_CONTRACT;
        }
    }

    function _getPathFromMint(address to) internal pure returns (address[] memory path) {
        if (to == WBNB_CONTRACT) {
            path = new address[](2);
            path[0] = MINT_CONTRACT;
            path[1] = WBNB_CONTRACT;
        } else {
            path = new address[](3);
            path[0] = MINT_CONTRACT;
            path[1] = WBNB_CONTRACT;
            path[2] = to;
        }
    }

    function _approveToken(address tokenAddress, address spender) internal {
        IERC20 token = IERC20(tokenAddress);
        if (token.allowance(address(this), spender) > 0) {
            return;
        } else {
            token.safeApprove(spender, type(uint256).max);
        }
    }

    /**
        @notice This function is used to swap ERC20 <> ERC20
        @param from The token address to swap from.
        @param to The token address to swap to.
        @param amount The amount of tokens to swap
        @return boughtAmount The quantity of tokens bought
    */
    function _swap(address from, address to, uint256 amount) internal returns (uint256 boughtAmount) {
        if (from == to) {
            return amount;
        }

        _approveToken(from, address(PANCAKE_ROUTER));

        address[] memory path;

        if (to == MINT_CONTRACT) {
            path = _getPathToMint(from);
        } else if (from == MINT_CONTRACT) {
            path = _getPathFromMint(to);
        } else {
            revert('INVALID_PATH');
        }

        // Check if there's a liquidity pool for paths
        // path.length is always 2 or 3
        for (uint8 i = 0; i < path.length - 1; i++) {
            address pair = PANCAKE_FACTORY.getPair(path[i], path[i + 1]);
            require(pair != address(0), 'INVALID_SWAP_PATH');
        }

        boughtAmount = PANCAKE_ROUTER.swapExactTokensForTokens(
            amount,
            1, // amountOutMin
            path,
            address(this), // to: Recipient of the output tokens
            DEAD_LINE
        )[path.length - 1];

        require(boughtAmount > 0, 'SWAP_ERROR');
    }

    // Prevent self referral
    function _getBeneficiary(address beneficiary) internal view returns (address) {
        if (beneficiary == address(0) || beneficiary == _msgSender()) {
           return DEFAULT_BENEFICIARY;
        } else {
            return beneficiary;
        }
    }
}

File 2 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 3 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 4 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;
    }
}

File 5 of 9 : IUniswapV2Router02.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.6;

interface IUniswapV2Router02 {
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external
        returns (
            uint256[] memory amounts
        );

    function getAmountsOut(
        uint amountIn,
        address[] memory path
    ) external view
        returns (
            uint[] memory amounts
        );
}

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

pragma solidity ^0.8.6;

interface IUniswapV2Factory {
    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address);
}

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

pragma solidity ^0.8.6;

interface IMintClubBond {
    function getMintReward(
        address tokenAddress,
        uint256 reserveAmount
    ) external view returns (
        uint256 toMint, // token amount to be minted
        uint256 taxAmount
    );

    function getBurnRefund(
        address tokenAddress,
        uint256 tokenAmount
    ) external view returns (
        uint256 mintToRefund,
        uint256 mintTokenTaxAmount
    );

    function buy(
        address tokenAddress,
        uint256 reserveAmount,
        uint256 minReward,
        address beneficiary
    ) external;

    function sell(
        address tokenAddress,
        uint256 tokenAmount,
        uint256 minRefund,
        address beneficiary
    ) external;

    function createToken(
        string memory name,
        string memory symbol,
        uint256 maxTokenSupply
    ) external returns (
        address tokenAddress
    );
}

File 8 of 9 : IWETH.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.6;

interface IWETH {
    function deposit() external payable;
    function withdraw(uint) external;
}

File 9 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);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"maxTokenSupply","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"beneficiary","type":"address"}],"name":"createAndZapIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"maxTokenSupply","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"beneficiary","type":"address"}],"name":"createAndZapInBNB","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"estimateZapIn","outputs":[{"internalType":"uint256","name":"tokenToReceive","type":"uint256"},{"internalType":"uint256","name":"mintTokenTaxAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"estimateZapOut","outputs":[{"internalType":"uint256","name":"amountToReceive","type":"uint256"},{"internalType":"uint256","name":"mintTokenTaxAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"beneficiary","type":"address"}],"name":"zapIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"beneficiary","type":"address"}],"name":"zapInBNB","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"beneficiary","type":"address"}],"name":"zapOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"address","name":"beneficiary","type":"address"}],"name":"zapOutBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b5062000046734d24bf63e5d6e03708e2dfd5cc8253b3f22fe91373b9b492b5d470ae0eb2bb07a87062ec97615d8b096200004c565b62000598565b604051636eb1769f60e11b81523060048201526001600160a01b038281166024830152839160009183169063dd62ed3e9060440160206040518083038186803b1580156200009957600080fd5b505afa158015620000ae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d49190620004f8565b1115620000e057505050565b6200010782600019836001600160a01b03166200010c60201b62000bb2179092919060201c565b505050565b8015806200019a5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156200015d57600080fd5b505afa15801562000172573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001989190620004f8565b155b620002125760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084015b60405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b17909152620001079185916200026a16565b6000620002c6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200034860201b62000d2a179092919060201c565b805190915015620001075780806020019051810190620002e79190620004d4565b620001075760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000209565b606062000359848460008562000363565b90505b9392505050565b606082471015620003c65760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000209565b843b620004165760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000209565b600080866001600160a01b0316858760405162000434919062000512565b60006040518083038185875af1925050503d806000811462000473576040519150601f19603f3d011682016040523d82523d6000602084013e62000478565b606091505b5090925090506200048b82828662000496565b979650505050505050565b60608315620004a75750816200035c565b825115620004b85782518084602001fd5b8160405162461bcd60e51b815260040162000209919062000530565b600060208284031215620004e757600080fd5b815180151581146200035c57600080fd5b6000602082840312156200050b57600080fd5b5051919050565b600082516200052681846020870162000565565b9190910192915050565b60208152600082518060208401526200055181604085016020870162000565565b601f01601f19169190910160400192915050565b60005b838110156200058257818101518382015260200162000568565b8381111562000592576000848401525b50505050565b61238c80620005a86000396000f3fe60806040526004361061007f5760003560e01c8063b487c54a1161004e578063b487c54a1461010c578063b490bb6d1461012c578063d9059f1b1461014c578063f0db42541461016c57600080fd5b806311b16eeb1461008b5780635c942f40146100ad5780638bad12f6146100e6578063b35d3f42146100f957600080fd5b3661008657005b600080fd5b34801561009757600080fd5b506100ab6100a6366004611e9d565b61018c565b005b3480156100b957600080fd5b506100cd6100c8366004611dbb565b61034f565b6040805192835260208301919091520160405180910390f35b6100ab6100f436600461205e565b6104ff565b6100ab610107366004611e5b565b6105a7565b34801561011857600080fd5b506100ab610127366004611dfc565b610660565b34801561013857600080fd5b506100ab610147366004611fb6565b6107b1565b34801561015857600080fd5b506100cd610167366004611dbb565b61085d565b34801561017857600080fd5b506100ab610187366004611dfc565b610a09565b60006101a1858561019c85610d43565b610d87565b905060006101d8734d24bf63e5d6e03708e2dfd5cc8253b3f22fe91373ae13d989dac2f0debff460ac112a837c89baa7cd8461111b565b6040517f2e1a7d4d0000000000000000000000000000000000000000000000000000000081526004810182905290915073ae13d989dac2f0debff460ac112a837c89baa7cd90632e1a7d4d90602401600060405180830381600087803b15801561024157600080fd5b505af1158015610255573d6000803e3d6000fd5b50505050838110156102ae5760405162461bcd60e51b815260206004820152601b60248201527f5a41505f534c4950504147455f4c494d49545f4558434545444544000000000060448201526064015b60405180910390fd5b604051600090339083908381818185875af1925050503d80600081146102f0576040519150601f19603f3d011682016040523d82523d6000602084013e6102f5565b606091505b50509050806103465760405162461bcd60e51b815260206004820152601360248201527f424e425f5452414e534645525f4641494c45440000000000000000000000000060448201526064016102a5565b50505050505050565b6040517f37430a510000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602481018290526000908190819073b9b492b5d470ae0eb2bb07a87062ec97615d8b09906337430a5190604401604080518083038186803b1580156103c857600080fd5b505afa1580156103dc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061040091906120f5565b925090506001600160a01b038516734d24bf63e5d6e03708e2dfd5cc8253b3f22fe9131415610431578092506104f6565b600061043c866114cc565b60405163d06ca61f60e01b815290915073d99d1c33f9fc3444f8101754abc46c52416550d19063d06ca61f9061047890859085906004016121ee565b60006040518083038186803b15801561049057600080fd5b505afa1580156104a4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526104cc9190810190611ee7565b600182516104da9190612299565b815181106104ea576104ea612312565b60200260200101519350505b50935093915050565b6040516305b0605360e41b815260009073b9b492b5d470ae0eb2bb07a87062ec97615d8b0990635b0605309061053d908990899089906004016121b8565b602060405180830381600087803b15801561055757600080fd5b505af115801561056b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061058f9190611d9e565b905061059f818461010785610d43565b505050505050565b73ae13d989dac2f0debff460ac112a837c89baa7cd6001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156105f657600080fd5b505af115801561060a573d6000803e3d6000fd5b5050505050600061064473ae13d989dac2f0debff460ac112a837c89baa7cd734d24bf63e5d6e03708e2dfd5cc8253b3f22fe9133461111b565b905061065a84828561065586610d43565b61166d565b50505050565b84836001600160a01b03821663dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260440160206040518083038186803b1580156106b757600080fd5b505afa1580156106cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ef91906120dc565b101561073d5760405162461bcd60e51b815260206004820152601460248201527f4e4f545f454e4f5547485f414c4c4f57414e434500000000000000000000000060448201526064016102a5565b6107526001600160a01b03871633308761185f565b60006001600160a01b038716734d24bf63e5d6e03708e2dfd5cc8253b3f22fe91314156107805750836107a2565b61079f87734d24bf63e5d6e03708e2dfd5cc8253b3f22fe9138761111b565b90505b61034686828661065587610d43565b6040516305b0605360e41b815260009073b9b492b5d470ae0eb2bb07a87062ec97615d8b0990635b060530906107ef908b908b908b906004016121b8565b602060405180830381600087803b15801561080957600080fd5b505af115801561081d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108419190611d9e565b90506108538582868661012787610d43565b5050505050505050565b600080806001600160a01b038616734d24bf63e5d6e03708e2dfd5cc8253b3f22fe913141561088d575082610952565b6000610898876118b0565b60405163d06ca61f60e01b815290915073d99d1c33f9fc3444f8101754abc46c52416550d19063d06ca61f906108d490889085906004016121ee565b60006040518083038186803b1580156108ec57600080fd5b505afa158015610900573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109289190810190611ee7565b600182516109369190612299565b8151811061094657610946612312565b60200260200101519150505b6040517feb0cf64d0000000000000000000000000000000000000000000000000000000081526001600160a01b03861660048201526024810182905273b9b492b5d470ae0eb2bb07a87062ec97615d8b099063eb0cf64d90604401604080518083038186803b1580156109c457600080fd5b505afa1580156109d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fc91906120f5565b9250925050935093915050565b6000610a19868561019c85610d43565b90506000806001600160a01b038716734d24bf63e5d6e03708e2dfd5cc8253b3f22fe9131415610a615750734d24bf63e5d6e03708e2dfd5cc8253b3f22fe913905081610a86565b869150610a83734d24bf63e5d6e03708e2dfd5cc8253b3f22fe913888561111b565b90505b84811015610ad65760405162461bcd60e51b815260206004820152601b60248201527f5a41505f534c4950504147455f4c494d49545f4558434545444544000000000060448201526064016102a5565b6001600160a01b03821663a9059cbb336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b158015610b2e57600080fd5b505af1158015610b42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b669190611f94565b6108535760405162461bcd60e51b815260206004820152601760248201527f42414c414e43455f5452414e534645525f4641494c454400000000000000000060448201526064016102a5565b801580610c3b5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b158015610c0157600080fd5b505afa158015610c15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3991906120dc565b155b610cad5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016102a5565b6040516001600160a01b038316602482015260448101829052610d2590849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b031990931692909217909152611a2c565b505050565b6060610d398484600085611b11565b90505b9392505050565b60006001600160a01b0382161580610d6357506001600160a01b03821633145b15610d8357507382ca6d313bffe56e9096b16633dfd414148d66b1919050565b5090565b600083836001600160a01b03821663dd62ed3e336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260440160206040518083038186803b158015610de057600080fd5b505afa158015610df4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1891906120dc565b1015610e665760405162461bcd60e51b815260206004820152601460248201527f4e4f545f454e4f5547485f414c4c4f57414e434500000000000000000000000060448201526064016102a5565b610e7b6001600160a01b03861633308761185f565b604051636eb1769f60e11b815230600482015273b9b492b5d470ae0eb2bb07a87062ec97615d8b09602482015284906001600160a01b0383169063dd62ed3e9060440160206040518083038186803b158015610ed657600080fd5b505afa158015610eea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0e91906120dc565b1015610ff55760405163095ea7b360e01b815273b9b492b5d470ae0eb2bb07a87062ec97615d8b09600482015260001960248201526001600160a01b0382169063095ea7b390604401602060405180830381600087803b158015610f7157600080fd5b505af1158015610f85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa99190611f94565b610ff55760405162461bcd60e51b815260206004820152600e60248201527f415050524f56455f4641494c454400000000000000000000000000000000000060448201526064016102a5565b73b9b492b5d470ae0eb2bb07a87062ec97615d8b09632dc8f8678686600061101c88610d43565b60405160e086901b6001600160e01b03191681526001600160a01b039485166004820152602481019390935260448301919091529091166064820152608401600060405180830381600087803b15801561107557600080fd5b505af1158015611089573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152734d24bf63e5d6e03708e2dfd5cc8253b3f22fe91392508291506370a082319060240160206040518083038186803b1580156110d957600080fd5b505afa1580156110ed573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111191906120dc565b9695505050505050565b6000826001600160a01b0316846001600160a01b0316141561113e575080610d3c565b61115c8473d99d1c33f9fc3444f8101754abc46c52416550d1611c50565b60606001600160a01b038416734d24bf63e5d6e03708e2dfd5cc8253b3f22fe91314156111935761118c856118b0565b9050611209565b6001600160a01b038516734d24bf63e5d6e03708e2dfd5cc8253b3f22fe91314156111c15761118c846114cc565b60405162461bcd60e51b815260206004820152600c60248201527f494e56414c49445f50415448000000000000000000000000000000000000000060448201526064016102a5565b60005b6001825161121a9190612299565b8160ff16101561137c576000736725f303b657a9451d8ba641348b6761a6cc7a176001600160a01b031663e6a43905848460ff168151811061125e5761125e612312565b6020026020010151858560016112749190612274565b60ff168151811061128757611287612312565b60200260200101516040518363ffffffff1660e01b81526004016112c19291906001600160a01b0392831681529116602082015260400190565b60206040518083038186803b1580156112d957600080fd5b505afa1580156112ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113119190611d9e565b90506001600160a01b0381166113695760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f535741505f5041544800000000000000000000000000000060448201526064016102a5565b5080611374816122dc565b91505061120c565b506040517f38ed173900000000000000000000000000000000000000000000000000000000815273d99d1c33f9fc3444f8101754abc46c52416550d1906338ed1739906113f6908690600190869030907ff00000000000000000000000000000000000000000000000000000000000000090600401612207565b600060405180830381600087803b15801561141057600080fd5b505af1158015611424573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261144c9190810190611ee7565b6001825161145a9190612299565b8151811061146a5761146a612312565b60200260200101519150600082116114c45760405162461bcd60e51b815260206004820152600a60248201527f535741505f4552524f520000000000000000000000000000000000000000000060448201526064016102a5565b509392505050565b60606001600160a01b03821673ae13d989dac2f0debff460ac112a837c89baa7cd14156115a8576040805160028082526060820183529091602083019080368337019050509050734d24bf63e5d6e03708e2dfd5cc8253b3f22fe9138160008151811061153b5761153b612312565b60200260200101906001600160a01b031690816001600160a01b03168152505073ae13d989dac2f0debff460ac112a837c89baa7cd8160018151811061158357611583612312565b60200260200101906001600160a01b031690816001600160a01b031681525050919050565b604080516003808252608082019092529060208201606080368337019050509050734d24bf63e5d6e03708e2dfd5cc8253b3f22fe913816000815181106115f1576115f1612312565b60200260200101906001600160a01b031690816001600160a01b03168152505073ae13d989dac2f0debff460ac112a837c89baa7cd8160018151811061163957611639612312565b60200260200101906001600160a01b031690816001600160a01b031681525050818160028151811061158357611583612312565b73b9b492b5d470ae0eb2bb07a87062ec97615d8b09633f60b63385858561169386610d43565b60405160e086901b6001600160e01b03191681526001600160a01b039485166004820152602481019390935260448301919091529091166064820152608401600060405180830381600087803b1580156116ec57600080fd5b505af1158015611700573d6000803e3d6000fd5b50869250506001600160a01b038216905063a9059cbb336040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b15801561175657600080fd5b505afa15801561176a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178e91906120dc565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156117d457600080fd5b505af11580156117e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180c9190611f94565b6118585760405162461bcd60e51b815260206004820152601760248201527f42414c414e43455f5452414e534645525f4641494c454400000000000000000060448201526064016102a5565b5050505050565b6040516001600160a01b038085166024830152831660448201526064810182905261065a9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401610cd9565b60606001600160a01b03821673ae13d989dac2f0debff460ac112a837c89baa7cd141561196757604080516002808252606082018352909160208301908036833701905050905073ae13d989dac2f0debff460ac112a837c89baa7cd8160008151811061191f5761191f612312565b60200260200101906001600160a01b031690816001600160a01b031681525050734d24bf63e5d6e03708e2dfd5cc8253b3f22fe9138160018151811061158357611583612312565b604080516003808252608082019092529060208201606080368337019050509050818160008151811061199c5761199c612312565b60200260200101906001600160a01b031690816001600160a01b03168152505073ae13d989dac2f0debff460ac112a837c89baa7cd816001815181106119e4576119e4612312565b60200260200101906001600160a01b031690816001600160a01b031681525050734d24bf63e5d6e03708e2dfd5cc8253b3f22fe9138160028151811061158357611583612312565b6000611a81826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316610d2a9092919063ffffffff16565b805190915015610d255780806020019051810190611a9f9190611f94565b610d255760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016102a5565b606082471015611b895760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016102a5565b843b611bd75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102a5565b600080866001600160a01b03168587604051611bf39190612189565b60006040518083038185875af1925050503d8060008114611c30576040519150601f19603f3d011682016040523d82523d6000602084013e611c35565b606091505b5091509150611c45828286611cf5565b979650505050505050565b604051636eb1769f60e11b81523060048201526001600160a01b038281166024830152839160009183169063dd62ed3e9060440160206040518083038186803b158015611c9c57600080fd5b505afa158015611cb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd491906120dc565b1115611cdf57505050565b610d256001600160a01b03821683600019610bb2565b60608315611d04575081610d3c565b825115611d145782518084602001fd5b8160405162461bcd60e51b81526004016102a591906121a5565b600082601f830112611d3f57600080fd5b813567ffffffffffffffff811115611d5957611d59612328565b611d6c601f8201601f1916602001612243565b818152846020838601011115611d8157600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215611db057600080fd5b8151610d3c8161233e565b600080600060608486031215611dd057600080fd5b8335611ddb8161233e565b92506020840135611deb8161233e565b929592945050506040919091013590565b600080600080600060a08688031215611e1457600080fd5b8535611e1f8161233e565b94506020860135611e2f8161233e565b935060408601359250606086013591506080860135611e4d8161233e565b809150509295509295909350565b600080600060608486031215611e7057600080fd5b8335611e7b8161233e565b9250602084013591506040840135611e928161233e565b809150509250925092565b60008060008060808587031215611eb357600080fd5b8435611ebe8161233e565b935060208501359250604085013591506060850135611edc8161233e565b939692955090935050565b60006020808385031215611efa57600080fd5b825167ffffffffffffffff80821115611f1257600080fd5b818501915085601f830112611f2657600080fd5b815181811115611f3857611f38612328565b8060051b9150611f49848301612243565b8181528481019084860184860187018a1015611f6457600080fd5b600095505b83861015611f87578051835260019590950194918601918601611f69565b5098975050505050505050565b600060208284031215611fa657600080fd5b81518015158114610d3c57600080fd5b600080600080600080600060e0888a031215611fd157600080fd5b873567ffffffffffffffff80821115611fe957600080fd5b611ff58b838c01611d2e565b985060208a013591508082111561200b57600080fd5b506120188a828b01611d2e565b9650506040880135945060608801356120308161233e565b93506080880135925060a0880135915060c088013561204e8161233e565b8091505092959891949750929550565b600080600080600060a0868803121561207657600080fd5b853567ffffffffffffffff8082111561208e57600080fd5b61209a89838a01611d2e565b965060208801359150808211156120b057600080fd5b506120bd88828901611d2e565b94505060408601359250606086013591506080860135611e4d8161233e565b6000602082840312156120ee57600080fd5b5051919050565b6000806040838503121561210857600080fd5b505080516020909101519092909150565b600081518084526020808501945080840160005b838110156121525781516001600160a01b03168752958201959082019060010161212d565b509495945050505050565b600081518084526121758160208601602086016122b0565b601f01601f19169290920160200192915050565b6000825161219b8184602087016122b0565b9190910192915050565b602081526000610d3c602083018461215d565b6060815260006121cb606083018661215d565b82810360208401526121dd818661215d565b915050826040830152949350505050565b828152604060208201526000610d396040830184612119565b85815284602082015260a06040820152600061222660a0830186612119565b6001600160a01b0394909416606083015250608001529392505050565b604051601f8201601f1916810167ffffffffffffffff8111828210171561226c5761226c612328565b604052919050565b600060ff821660ff84168060ff03821115612291576122916122fc565b019392505050565b6000828210156122ab576122ab6122fc565b500390565b60005b838110156122cb5781810151838201526020016122b3565b8381111561065a5750506000910152565b600060ff821660ff8114156122f3576122f36122fc565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461235357600080fd5b5056fea26469706673582212201768f3639c2a0bd23d58dfd3b92c5c1f57a8659dbe1b1f73694db66ddc49e11364736f6c63430008060033

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading