Contract 0x8BBac0C7583Cc146244a18863E708bFFbbF19975 2

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xf89192ae26e149a0af9c4dfdfa4390c25631bbc1023ef1c006894940427b3a0bCreate Token118634322021-10-17 22:51:501 min ago0x68bb5a86179fcfb9d3a57412ba9efe1c2ec546b7 IN  0x8bbac0c7583cc146244a18863e708bffbbf199750 BNB0.00092701
0x1b45768fef3e27e1d01495bfbf9060aa02a30104dba4cca5d3b547e41ed374b0Sell118586332021-10-17 18:50:564 hrs 2 mins ago0x2b152b26569e9aed882aae5fd9b89f3ea77cf998 IN  0x8bbac0c7583cc146244a18863e708bffbbf199750 BNB0.00039499
0x6750af98659229dfb435ede502f62c21a4348f5dbe8417fecc304885c09454b9Buy118531242021-10-17 14:12:478 hrs 40 mins ago0x55b506c648833bffb872b932adb3e7f7e4ce39d5 IN  0x8bbac0c7583cc146244a18863e708bffbbf199750 BNB0.000513705
0x04eddbf9b26ba696b9ee89cf9929eedb812bbc0be6f1eea3cf38aa6e172a69dfCreate Token118527352021-10-17 13:53:208 hrs 59 mins ago0x359cd2fc25faa2c31de527f706f738d2d0642912 IN  0x8bbac0c7583cc146244a18863e708bffbbf199750 BNB0.00092677
0x280e4569c1ae16b0fab85e7f0da73c5f5c7a94d965e820c04bf93024ab80d857Create Token118449252021-10-17 7:19:3315 hrs 33 mins ago0xcce1b3f2c46c0de4698e5a58da39bb96297b6440 IN  0x8bbac0c7583cc146244a18863e708bffbbf199750 BNB0.00092665
0x665638a7b2831c052479f6a44a039e8710bfc3b7760b91a904a2037af87dbf3aSell118428282021-10-17 5:34:4217 hrs 18 mins ago0x11a41621e595aa606d8217fa016feeba0ba20949 IN  0x8bbac0c7583cc146244a18863e708bffbbf199750 BNB0.000541975
0x92b5b064b5b24d810eb5e5a04e9465b08a79bef12a077898a4a483f70c5a1f82Create Token118412422021-10-17 4:15:2018 hrs 37 mins ago0xed15ea2fd72830dd871388115c8990c15b35bcb7 IN  0x8bbac0c7583cc146244a18863e708bffbbf199750 BNB0.00092719
0x0d1ce28a222a2893832ba9747ae851f4a4fd8526ff6a1a59ac8f68809134b8ecBuy118396812021-10-17 2:57:1719 hrs 55 mins ago0xbe782531a257f52d9bcc4d8d205a1e43fb5bcd42 IN  0x8bbac0c7583cc146244a18863e708bffbbf199750 BNB0.00066978
0xb10a8edce90d2729937261fd62b7b974188cf17078da4a64c4d4243454397d72Buy118390952021-10-17 2:27:5920 hrs 25 mins ago0xbe782531a257f52d9bcc4d8d205a1e43fb5bcd42 IN  0x8bbac0c7583cc146244a18863e708bffbbf199750 BNB0.00066984
0x3213d5b4a0298943eb6c6c5f5da69b42a19f641ea0b82acb9224276071f8044bBuy118390452021-10-17 2:25:2920 hrs 27 mins ago0xbe782531a257f52d9bcc4d8d205a1e43fb5bcd42 IN  0x8bbac0c7583cc146244a18863e708bffbbf199750 BNB0.00066984
0x726cb6609971f5136fc01e4d61bc1abcbe3afc06c9bc1f9d290f45bac660f2acBuy118389672021-10-17 2:21:3520 hrs 31 mins ago0xbe782531a257f52d9bcc4d8d205a1e43fb5bcd42 IN  0x8bbac0c7583cc146244a18863e708bffbbf199750 BNB0.00066984
0x899b08d813e2aa378c6efeea59477a554ed9226ffeff735804631f93bb5c75a5Buy118388462021-10-17 2:15:3220 hrs 37 mins ago0xbe782531a257f52d9bcc4d8d205a1e43fb5bcd42 IN  0x8bbac0c7583cc146244a18863e708bffbbf199750 BNB0.000671055
0x00c3bafee27bf9f0757f7e1420185a08331fc859d4c383f9108cc0e195a9328aCreate Token118357542021-10-16 23:40:5623 hrs 12 mins ago0xadb5194375117e32c6ab726118381c62bfe70324 IN  0x8bbac0c7583cc146244a18863e708bffbbf199750 BNB0.00092635
0x1a4cfb7fda2d7b4356507389f525efd8255cc5e351e07528afffebee1b23c28eCreate Token118357012021-10-16 23:38:1723 hrs 14 mins ago0xadb5194375117e32c6ab726118381c62bfe70324 IN  0x8bbac0c7583cc146244a18863e708bffbbf199750 BNB0.00092635
0xa9e0f53f506d37cca93eb107c80bfcdd4120b1440230780989354d0c483496aaBuy118356092021-10-16 23:33:4123 hrs 19 mins ago0xe1aaf39db1cd7e16c4305410fe72b13c7add17e6 IN  0x8bbac0c7583cc146244a18863e708bffbbf199750 BNB0.000596115
0xa520cd7668089d5d80967c596e29f51e6152697bac2b9ef34114eb63fe6e8709Buy118355942021-10-16 23:32:5623 hrs 20 mins ago0xe1aaf39db1cd7e16c4305410fe72b13c7add17e6 IN  0x8bbac0c7583cc146244a18863e708bffbbf199750 BNB0.000596115
0x2809f613313cec9afd1250b5230157b58c6404d29908b266029c3b9ff5ed1d22Create Token118353432021-10-16 23:20:2323 hrs 32 mins ago0xadb5194375117e32c6ab726118381c62bfe70324 IN  0x8bbac0c7583cc146244a18863e708bffbbf199750 BNB0.00092641
0xc81742e3eb314c27ad91fde9f702152039f9aa88bf1b0eea7acbc61fd8567178Create Token118349102021-10-16 22:58:4223 hrs 54 mins ago0xadb5194375117e32c6ab726118381c62bfe70324 IN  0x8bbac0c7583cc146244a18863e708bffbbf199750 BNB0.00092641
0x296768083295505ba63bb66ed919533a3db22a5db7a71a5a4c93393d4d1c4ab4Sell118311702021-10-16 19:51:321 day 3 hrs ago0x0ae0d38304a5be467dd0a0cd351da34ab1a2e366 IN  0x8bbac0c7583cc146244a18863e708bffbbf199750 BNB0.00024291
0x88d5c21018bd936e9f0bea0558856cf7e0cc31c6b7bb6dd96a08fef5afbf0327Sell118301322021-10-16 18:59:011 day 3 hrs ago0x0771c9dc048382b6f16b6ac7e67e79ad68703054 IN  0x8bbac0c7583cc146244a18863e708bffbbf199750 BNB0.000467155
0x4bd10ef9d2304de47fcb09372b23ec6a94bae3abfeeddf177577966c0592500cSell118293032021-10-16 18:16:351 day 4 hrs ago0x0ae0d38304a5be467dd0a0cd351da34ab1a2e366 IN  0x8bbac0c7583cc146244a18863e708bffbbf199750 BNB0.00054499
0x848b90b13c4bbea3774ec251554c9cc9245993b0a82a6eb0781be9fe955006e1Sell118276072021-10-16 16:50:221 day 6 hrs ago0x9c9673856312edb4fe6862f495610ba4b5124acd IN  0x8bbac0c7583cc146244a18863e708bffbbf199750 BNB0.000467035
0x43a019f600edc57fbb4320611e98e4533ef98bb25b1392d3dd142b833bd1291cSell118270912021-10-16 16:23:281 day 6 hrs ago0xba63ce345df13a69e2a2850e950b467d57f05dc9 IN  0x8bbac0c7583cc146244a18863e708bffbbf199750 BNB0.00024315
0x570570f71ac01a45df1c9fdf90a8e0a293dd8a9ac4963e3bde32f6d75a55f73cBuy118260492021-10-16 15:30:401 day 7 hrs ago0xb5ed6e65c9141071be347ed04bd4bc7d2ef20974 IN  0x8bbac0c7583cc146244a18863e708bffbbf199750 BNB0.000808905
0x81e37f700e9192c8e6b0e8be9c7504e9fcb98dc2fb10349290ddcb27a00ff1d2Create Token118253772021-10-16 14:56:591 day 7 hrs ago0xb5ed6e65c9141071be347ed04bd4bc7d2ef20974 IN  0x8bbac0c7583cc146244a18863e708bffbbf199750 BNB0.00092683
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xf89192ae26e149a0af9c4dfdfa4390c25631bbc1023ef1c006894940427b3a0b118634322021-10-17 22:51:501 min ago 0x8bbac0c7583cc146244a18863e708bffbbf19975  Contract Creation0 BNB
0xb25798b456b105e5ca6fa0295ce20aa7b6d0b2610a987684ed6333857e0dbf65118602662021-10-17 20:12:562 hrs 40 mins ago 0x8bbac0c7583cc146244a18863e708bffbbf19975  Contract Creation0 BNB
0x04eddbf9b26ba696b9ee89cf9929eedb812bbc0be6f1eea3cf38aa6e172a69df118527352021-10-17 13:53:208 hrs 59 mins ago 0x8bbac0c7583cc146244a18863e708bffbbf19975  Contract Creation0 BNB
0x0cbb2d27dd756fa52697d0d22b25c052377ddc2c0ec74a69f085267bca9b23c2118521392021-10-17 13:23:299 hrs 29 mins ago 0x8bbac0c7583cc146244a18863e708bffbbf19975  Contract Creation0 BNB
0x9463d0d1b91650d6081a8814c4c74e03825bbc421fa460dcc24c95eb87807a6c118511602021-10-17 12:33:5110 hrs 19 mins ago 0x8bbac0c7583cc146244a18863e708bffbbf19975  Contract Creation0 BNB
0x280e4569c1ae16b0fab85e7f0da73c5f5c7a94d965e820c04bf93024ab80d857118449252021-10-17 7:19:3315 hrs 33 mins ago 0x8bbac0c7583cc146244a18863e708bffbbf19975  Contract Creation0 BNB
0x92b5b064b5b24d810eb5e5a04e9465b08a79bef12a077898a4a483f70c5a1f82118412422021-10-17 4:15:2018 hrs 37 mins ago 0x8bbac0c7583cc146244a18863e708bffbbf19975  Contract Creation0 BNB
0x01904e54ff0fc6340977dc2478d5594a64f93509ea532850bd5fd823d2662638118394722021-10-17 2:46:5020 hrs 6 mins ago 0x8bbac0c7583cc146244a18863e708bffbbf19975  Contract Creation0 BNB
0x00c3bafee27bf9f0757f7e1420185a08331fc859d4c383f9108cc0e195a9328a118357542021-10-16 23:40:5623 hrs 12 mins ago 0x8bbac0c7583cc146244a18863e708bffbbf19975  Contract Creation0 BNB
0x1a4cfb7fda2d7b4356507389f525efd8255cc5e351e07528afffebee1b23c28e118357012021-10-16 23:38:1723 hrs 14 mins ago 0x8bbac0c7583cc146244a18863e708bffbbf19975  Contract Creation0 BNB
0x2809f613313cec9afd1250b5230157b58c6404d29908b266029c3b9ff5ed1d22118353432021-10-16 23:20:2323 hrs 32 mins ago 0x8bbac0c7583cc146244a18863e708bffbbf19975  Contract Creation0 BNB
0xc81742e3eb314c27ad91fde9f702152039f9aa88bf1b0eea7acbc61fd8567178118349102021-10-16 22:58:4223 hrs 54 mins ago 0x8bbac0c7583cc146244a18863e708bffbbf19975  Contract Creation0 BNB
0xfecb17e50b8be63144ae1970b8c94094fae8913f602a94ba045fae19d8a51b65118285242021-10-16 17:36:521 day 5 hrs ago 0x8bbac0c7583cc146244a18863e708bffbbf19975  Contract Creation0 BNB
0x81e37f700e9192c8e6b0e8be9c7504e9fcb98dc2fb10349290ddcb27a00ff1d2118253772021-10-16 14:56:591 day 7 hrs ago 0x8bbac0c7583cc146244a18863e708bffbbf19975  Contract Creation0 BNB
0xacb8da4baa0b4689c51d1ea0ba32bd8423cc436e2ac2388b0f0b07a7844b0d19118110762021-10-16 2:59:451 day 19 hrs ago 0x8bbac0c7583cc146244a18863e708bffbbf19975  Contract Creation0 BNB
0xe9fdde271ba1b20f4a7233c70e1ea47042442e8c2b300c20786b3579941cbecf117971262021-10-15 15:19:062 days 7 hrs ago 0x8bbac0c7583cc146244a18863e708bffbbf19975  Contract Creation0 BNB
0x9fbcd962e06c6d7cfe04983305bec9bbe46f27600a65d168a0e0370cd7669067117969172021-10-15 15:08:392 days 7 hrs ago 0x8bbac0c7583cc146244a18863e708bffbbf19975  Contract Creation0 BNB
0x26ea57416f0bb546d1b77225c1fc0e1774c786bb1f00a7c21ce8503271aceeef117966022021-10-15 14:52:542 days 8 hrs ago 0x8bbac0c7583cc146244a18863e708bffbbf19975  Contract Creation0 BNB
0xf666fbbe55ed42af2ccb478d52799d303284ed15f3b9faa75ec123a01ea6c030117965872021-10-15 14:52:092 days 8 hrs ago 0x8bbac0c7583cc146244a18863e708bffbbf19975  Contract Creation0 BNB
0x1045a38ecebd194885211482944ff37646bb11eae269996a472c18da93f2c058117960362021-10-15 14:24:302 days 8 hrs ago 0x8bbac0c7583cc146244a18863e708bffbbf19975  Contract Creation0 BNB
0x2f169a9604e5ae6af37359ad4908af0785a71aa5f311cde07bdbf754262e14a9117953612021-10-15 13:49:582 days 9 hrs ago 0x8bbac0c7583cc146244a18863e708bffbbf19975  Contract Creation0 BNB
0x3ae15c4df4cffcb5c043fadbb2648508da3bb1d19be4bf6955d43e5cb66025f2117917322021-10-15 10:48:232 days 12 hrs ago 0x8bbac0c7583cc146244a18863e708bffbbf19975  Contract Creation0 BNB
0xe33a3753c7a9794f1d5439461eebed20cb55f99b81c669c79ac42967ce9c1145117836732021-10-15 4:04:082 days 18 hrs ago 0x8bbac0c7583cc146244a18863e708bffbbf19975  Contract Creation0 BNB
0x96cfe7f708d7200d4b2b5e5f6ad21780629c518b0af6afcc3f56d003529ba82d117737252021-10-14 19:46:323 days 3 hrs ago 0x8bbac0c7583cc146244a18863e708bffbbf19975  Contract Creation0 BNB
0xbfdcd6c051a2d6c2f7779e0b378fff88f8c3a6ea44d4b480107c9c5ad8d2a398117655922021-10-14 12:58:533 days 9 hrs ago 0x8bbac0c7583cc146244a18863e708bffbbf19975  Contract Creation0 BNB
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MintClubBond

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
Yes with 1500 runs

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

pragma solidity ^0.8.3;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "./MintClubFactory.sol";
import "./MintClubToken.sol";
import "./lib/Math.sol";

/**
* @title MintClub Bond
*
* Providing liquidity for MintClub tokens with a bonding curve.
*/
contract MintClubBond is MintClubFactory {
    uint256 private constant BUY_TAX = 3; // 0.3%
    uint256 private constant SELL_TAX = 13; // 1.3%
    uint256 private constant MAX_TAX = 1000;

    // Token => Reserve Balance
    mapping (address => uint256) public reserveBalance;

    MintClubToken private RESERVE_TOKEN; // Any IERC20
    address public defaultBeneficiary;

    event Buy(address tokenAddress, address buyer, uint256 amountMinted, uint256 reserveAmount, address beneficiary, uint256 taxAmount);
    event Sell(address tokenAddress, address seller, uint256 amountBurned, uint256 refundAmount, address beneficiary, uint256 taxAmount);

    constructor(address baseToken, address implementation) MintClubFactory(implementation) {
        RESERVE_TOKEN = MintClubToken(baseToken);
        defaultBeneficiary = address(0x82CA6d313BffE56E9096b16633dfD414148D66b1);
    }

    modifier _checkBondExists(address tokenAddress) {
        require(maxSupply[tokenAddress] > 0, "TOKEN_NOT_FOUND");
        _;
    }

    // MARK: - Utility functions for external calls

    function reserveTokenAddress() external view returns (address) {
        return address(RESERVE_TOKEN);
    }

    function setDefaultBeneficiary(address beneficiary) external onlyOwner {
        require(beneficiary != address(0), 'DEFAULT_BENEFICIARY_CANNOT_BE_NULL');
        defaultBeneficiary = beneficiary;
    }

    function currentPrice(address tokenAddress) external view _checkBondExists(tokenAddress) returns (uint256) {
        return MintClubToken(tokenAddress).totalSupply();
    }

    function createAndBuy(string memory name, string memory symbol, uint256 maxTokenSupply, uint256 reserveAmount, address beneficiary) external {
        address newToken = createToken(name, symbol, maxTokenSupply);
        buy(newToken, reserveAmount, 0, beneficiary);
    }

    /**
     * @dev Use the simplest bonding curve (y = x) as we can adjust total supply of reserve tokens to adjust slope
     * Price = SLOPE * totalSupply = totalSupply (where slope = 1)
     */
    function getMintReward(address tokenAddress, uint256 reserveAmount) public view _checkBondExists(tokenAddress) returns (uint256, uint256) {
        uint256 taxAmount = reserveAmount * BUY_TAX / MAX_TAX;
        uint256 newSupply = Math.floorSqrt(2 * 1e18 * ((reserveAmount - taxAmount) + reserveBalance[tokenAddress]));
        uint256 toMint = newSupply - MintClubToken(tokenAddress).totalSupply();

        require(newSupply <= maxSupply[tokenAddress], "EXCEEDED_MAX_SUPPLY");

        return (toMint, taxAmount);
    }

    function getBurnRefund(address tokenAddress, uint256 tokenAmount) public view _checkBondExists(tokenAddress) returns (uint256, uint256) {
        uint256 newTokenSupply = MintClubToken(tokenAddress).totalSupply() - tokenAmount;

        // Should be the same as: (1/2 * (totalSupply**2 - newTokenSupply**2);
        uint256 reserveAmount = reserveBalance[tokenAddress] - (newTokenSupply**2 / (2 * 1e18));
        uint256 taxAmount = reserveAmount * SELL_TAX / MAX_TAX;

        return (reserveAmount - taxAmount, taxAmount);
    }

    function buy(address tokenAddress, uint256 reserveAmount, uint256 minReward, address beneficiary) public {
        (uint256 rewardTokens, uint256 taxAmount) = getMintReward(tokenAddress, reserveAmount);
        require(rewardTokens >= minReward, "SLIPPAGE_LIMIT_EXCEEDED");

        // Transfer reserve tokens
        require(RESERVE_TOKEN.transferFrom(_msgSender(), address(this), reserveAmount - taxAmount), "RESERVE_TOKEN_TRANSFER_FAILED");
        reserveBalance[tokenAddress] += (reserveAmount - taxAmount);

        // Mint reward tokens to the buyer
        MintClubToken(tokenAddress).mint(_msgSender(), rewardTokens);

        // Pay tax to the beneficiary / Send to the default beneficiary if not set (or abused)
        address actualBeneficiary = beneficiary;
        if (beneficiary == address(0) || beneficiary == _msgSender()) {
            actualBeneficiary = defaultBeneficiary;
        }
        RESERVE_TOKEN.transferFrom(_msgSender(), actualBeneficiary, taxAmount);

        emit Buy(tokenAddress, _msgSender(), rewardTokens, reserveAmount, actualBeneficiary, taxAmount);
    }

    function sell(address tokenAddress, uint256 tokenAmount, uint256 minRefund, address beneficiary) public {
        (uint256 refundAmount, uint256 taxAmount) = getBurnRefund(tokenAddress, tokenAmount);
        require(refundAmount >= minRefund, "SLIPPAGE_LIMIT_EXCEEDED");

        // Burn token first
        MintClubToken(tokenAddress).burnFrom(_msgSender(), tokenAmount);

        // Refund reserve tokens to the seller
        reserveBalance[tokenAddress] -= (refundAmount + taxAmount);
        require(RESERVE_TOKEN.transfer(_msgSender(), refundAmount), "RESERVE_TOKEN_TRANSFER_FAILED");

        // Pay tax to the beneficiary / Send to the default beneficiary if not set (or abused)
        address actualBeneficiary = beneficiary;
        if (beneficiary == address(0) || beneficiary == _msgSender()) {
            actualBeneficiary = defaultBeneficiary;
        }
        RESERVE_TOKEN.transfer(actualBeneficiary, taxAmount);

        emit Sell(tokenAddress, _msgSender(), tokenAmount, refundAmount, actualBeneficiary, taxAmount);
    }
}

File 2 of 8 : 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 8 : MintClubFactory.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.3;

import "@openzeppelin/contracts/access/Ownable.sol";
import "./MintClubToken.sol";

/**
* @title MintClub Token Factory
*
* Create an ERC20 token using proxy pattern to save gas
*/
abstract contract MintClubFactory is Ownable {
    /**
     *  ERC20 Token implementation contract
     *  We use "EIP-1167: Minimal Proxy Contract" in order to save gas cost for each token deployment
     *  REF: https://github.com/optionality/clone-factory
     */
    address public tokenImplementation;

    // Array of all created tokens
    address[] public tokens;

    // Token => Max Supply
    mapping (address => uint256) public maxSupply;
    uint256 private constant MAX_SUPPLY_LIMIT = 1000000 * 1e18; // Where it requires 100M HUNT tokens as collateral

    event TokenCreated(address tokenAddress, string name, string symbol, uint256 maxTokenSupply);
    event ImplementationUpdated(address tokenImplementation);

    constructor(address implementation) {
        updateTokenImplementation(implementation);
    }

    // NOTE: This won't change the implementation of tokens that already created
    function updateTokenImplementation(address implementation) public onlyOwner {
        require(implementation != address(0), 'IMPLEMENTATION_CANNOT_BE_NULL');

        tokenImplementation = implementation;
        emit ImplementationUpdated(tokenImplementation);
    }

    // REF: https://github.com/optionality/clone-factory
    function _createClone(address target) private returns (address result) {
        bytes20 targetBytes = bytes20(target);
        assembly {
            let clone := mload(0x40)
            mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(clone, 0x14), targetBytes)
            mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            result := create(0, clone, 0x37)
        }
    }

    function createToken(string memory name, string memory symbol, uint256 maxTokenSupply) public returns (address) {
        require(maxTokenSupply > 0, 'MAX_SUPPLY_MUST_BE_POSITIVE');
        require(maxTokenSupply <= MAX_SUPPLY_LIMIT, 'MAX_SUPPLY_LIMIT_EXCEEDED');

        address tokenAddress = _createClone(tokenImplementation);
        MintClubToken newToken = MintClubToken(tokenAddress);
        newToken.init(name, symbol);

        tokens.push(tokenAddress);
        maxSupply[tokenAddress] = maxTokenSupply;

        emit TokenCreated(tokenAddress, name, symbol, maxTokenSupply);

        return tokenAddress;
    }

    function tokenCount() external view returns (uint256) {
        return tokens.length;
    }

    function exists(address tokenAddress) external view returns (bool) {
        return maxSupply[tokenAddress] > 0;
    }
}

File 4 of 8 : MintClubToken.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.3;

import "./lib/ERC20Initializable.sol";

contract MintClubToken is ERC20Initializable {
    bool private _initialized; // false by default
    address private _owner; // Ownable is implemented manually to meke it compatible with `initializable`

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

    function init(string memory name_, string memory symbol_) external {
        require(_initialized == false, "CONTRACT_ALREADY_INITIALIZED");

        _name = name_;
        _symbol = symbol_;
        _owner = _msgSender();

        _initialized = true;

        emit OwnershipTransferred(address(0), _owner);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function mint(address to, uint256 amount) public onlyOwner {
        _mint(to, amount);
    }

    // NOTE:
    // Disable direct burn function call because it can affect on bonding curve
    // Users can just send the tokens to the token contract address
    // for the same burning effect without changing the totalSupply
    function burnFrom(address account, uint256 amount) public onlyOwner {
        uint256 currentAllowance = allowance(account, _msgSender());
        require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
        _approve(account, _msgSender(), currentAllowance - amount);
        _burn(account, amount);
    }
}

File 5 of 8 : Math.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.3;

library Math {
    /**
     * @dev returns the largest integer smaller than or equal to the square root of a positive integer
     *
     * @param _num a positive integer
     *
     * @return the largest integer smaller than or equal to the square root of the positive integer
     */
    function floorSqrt(uint256 _num) internal pure returns (uint256) {
        uint256 x = _num / 2 + 1;
        uint256 y = (x + _num / x) / 2;
        while (x > y) {
            x = y;
            y = (x + _num / x) / 2;
        }
        return x;
    }
}

File 6 of 8 : 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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 7 of 8 : 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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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

pragma solidity ^0.8.3;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/utils/Context.sol";

/**
 * @notice A slightly modified version of ERC20.sol (from Openzeppelin 4.1.0) for initialization pattern
 */

abstract contract ERC20Initializable is Context, IERC20 {
    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string internal _name;
    string internal _symbol;

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        _approve(sender, _msgSender(), currentAllowance - amount);

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);

        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        _balances[sender] = senderBalance - amount;
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        _balances[account] = accountBalance - amount;
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"implementation","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountMinted","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reserveAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"taxAmount","type":"uint256"}],"name":"Buy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenImplementation","type":"address"}],"name":"ImplementationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountBurned","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"refundAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"taxAmount","type":"uint256"}],"name":"Sell","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"maxTokenSupply","type":"uint256"}],"name":"TokenCreated","type":"event"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"reserveAmount","type":"uint256"},{"internalType":"uint256","name":"minReward","type":"uint256"},{"internalType":"address","name":"beneficiary","type":"address"}],"name":"buy","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":"reserveAmount","type":"uint256"},{"internalType":"address","name":"beneficiary","type":"address"}],"name":"createAndBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"maxTokenSupply","type":"uint256"}],"name":"createToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"currentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultBeneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"getBurnRefund","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"reserveAmount","type":"uint256"}],"name":"getMintReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"reserveBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"minRefund","type":"uint256"},{"internalType":"address","name":"beneficiary","type":"address"}],"name":"sell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"setDefaultBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"updateTokenImplementation","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162001c1138038062001c118339810160408190526200003491620001ee565b600080546001600160a01b031916339081178255604051839282917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506200008081620000c5565b5050600580546001600160a01b039092166001600160a01b0319928316179055600680549091167382ca6d313bffe56e9096b16633dfd414148d66b117905562000225565b6000546001600160a01b03163314620001255760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6001600160a01b0381166200017d5760405162461bcd60e51b815260206004820152601d60248201527f494d504c454d454e544154494f4e5f43414e4e4f545f42455f4e554c4c00000060448201526064016200011c565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca039060200160405180910390a150565b80516001600160a01b0381168114620001e957600080fd5b919050565b6000806040838503121562000201578182fd5b6200020c83620001d1565b91506200021c60208401620001d1565b90509250929050565b6119dc80620002356000396000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c80639f181b5e116100cd578063e9833c2f11610081578063ee1ea4ff11610066578063ee1ea4ff146102f8578063f2fde38b14610309578063f6a3d24e1461031c5761016c565b8063e9833c2f146102d2578063eb0cf64d146102e55761016c565b8063d20dd349116100b2578063d20dd3491461028c578063daa434991461029f578063dc8de379146102b25761016c565b80639f181b5e14610271578063c60b8d58146102795761016c565b806354ab58af11610124578063715018a611610109578063715018a61461022a5780638da5cb5b146102325780639cc7becf146102435761016c565b806354ab58af146102045780635b060530146102175761016c565b806337430a511161015557806337430a51146101b65780633f60b633146101de5780634f64b2be146101f15761016c565b80632dc8f867146101715780632f3a3d5d14610186575b600080fd5b61018461017f3660046115b2565b61033f565b005b600154610199906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101c96101c4366004611589565b610668565b604080519283526020830191909152016101ad565b6101846101ec3660046115b2565b6107c9565b6101996101ff366004611706565b610aec565b600654610199906001600160a01b031681565b610199610225366004611617565b610b16565b610184610d07565b6000546001600160a01b0316610199565b61026361025136600461156f565b60036020526000908152604090205481565b6040519081526020016101ad565b600254610263565b610184610287366004611681565b610db8565b61018461029a36600461156f565b610ddc565b6101846102ad36600461156f565b610eed565b6102636102c036600461156f565b60046020526000908152604090205481565b6102636102e036600461156f565b610ff2565b6101c96102f3366004611589565b6110ca565b6005546001600160a01b0316610199565b61018461031736600461156f565b611290565b61032f61032a36600461156f565b6113ce565b60405190151581526020016101ad565b60008061034c8686610668565b91509150838210156103a55760405162461bcd60e51b815260206004820152601760248201527f534c4950504147455f4c494d49545f455843454544454400000000000000000060448201526064015b60405180910390fd5b6001600160a01b0386166379cc6790336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101889052604401600060405180830381600087803b1580156103fd57600080fd5b505af1158015610411573d6000803e3d6000fd5b50505050808261042191906117f5565b6001600160a01b03871660009081526004602052604081208054909190610449908490611963565b90915550506005546001600160a01b031663a9059cbb336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101859052604401602060405180830381600087803b1580156104a857600080fd5b505af11580156104bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e091906115f7565b61052c5760405162461bcd60e51b815260206004820152601d60248201527f524553455256455f544f4b454e5f5452414e534645525f4641494c4544000000604482015260640161039c565b826001600160a01b038116158061054b57506001600160a01b03841633145b1561055e57506006546001600160a01b03165b6005546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152602482018590529091169063a9059cbb90604401602060405180830381600087803b1580156105c557600080fd5b505af11580156105d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105fd91906115f7565b50604080516001600160a01b03808a16825233602083015291810188905260608101859052908216608082015260a081018390527faf3add10310b906b5d302a1b317dec15cedffe6254bd570e2f71f0dba50004089060c0015b60405180910390a150505050505050565b6001600160a01b038216600090815260036020526040812054819084906106d15760405162461bcd60e51b815260206004820152600f60248201527f544f4b454e5f4e4f545f464f554e440000000000000000000000000000000000604482015260640161039c565b600084866001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561070d57600080fd5b505afa158015610721573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610745919061171e565b61074f9190611963565b90506000671bc16d674ec80000610767600284611873565b610771919061180d565b6001600160a01b0388166000908152600460205260409020546107949190611963565b905060006103e86107a6600d84611944565b6107b0919061180d565b90506107bc8183611963565b9890975095505050505050565b6000806107d686866110ca565b915091508382101561082a5760405162461bcd60e51b815260206004820152601760248201527f534c4950504147455f4c494d49545f4558434545444544000000000000000000604482015260640161039c565b6005546001600160a01b03166323b872dd3330610847858a611963565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b15801561089657600080fd5b505af11580156108aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ce91906115f7565b61091a5760405162461bcd60e51b815260206004820152601d60248201527f524553455256455f544f4b454e5f5452414e534645525f4641494c4544000000604482015260640161039c565b6109248186611963565b6001600160a01b0387166000908152600460205260408120805490919061094c9084906117f5565b90915550506001600160a01b0386166340c10f19336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101859052604401600060405180830381600087803b1580156109a957600080fd5b505af11580156109bd573d6000803e3d6000fd5b5085925050506001600160a01b03811615806109e157506001600160a01b03841633145b156109f457506006546001600160a01b03165b6005546001600160a01b03166323b872dd336040516001600160e01b031960e084901b1681526001600160a01b039182166004820152908416602482015260448101859052606401602060405180830381600087803b158015610a5657600080fd5b505af1158015610a6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8e91906115f7565b50604080516001600160a01b03808a16825233602083015291810185905260608101889052908216608082015260a081018390527f7a758c3f267ecc5b9a5f17490ce833537dd367b341461622558f19f2ee043ea59060c001610657565b60028181548110610afc57600080fd5b6000918252602090912001546001600160a01b0316905081565b6000808211610b675760405162461bcd60e51b815260206004820152601b60248201527f4d41585f535550504c595f4d5553545f42455f504f5349544956450000000000604482015260640161039c565b69d3c21bcecceda1000000821115610bc15760405162461bcd60e51b815260206004820152601960248201527f4d41585f535550504c595f4c494d49545f455843454544454400000000000000604482015260640161039c565b600154600090610bd9906001600160a01b03166113ef565b6040517f7029144c00000000000000000000000000000000000000000000000000000000815290915081906001600160a01b03821690637029144c90610c2590899089906004016117c7565b600060405180830381600087803b158015610c3f57600080fd5b505af1158015610c53573d6000803e3d6000fd5b505060028054600181019091557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915560009081526003602052604090819020879055517f75d1eb2d61d7e210835bc16e78ac4d0e4f905c108a81852a6b68c4d46b4f40f39250610cf491508490899089908990611781565b60405180910390a15090505b9392505050565b6000546001600160a01b03163314610d615760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161039c565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b6000610dc5868686610b16565b9050610dd481846000856107c9565b505050505050565b6000546001600160a01b03163314610e365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161039c565b6001600160a01b038116610e8c5760405162461bcd60e51b815260206004820152601d60248201527f494d504c454d454e544154494f4e5f43414e4e4f545f42455f4e554c4c000000604482015260640161039c565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040519081527f310ba5f1d2ed074b51e2eccd052a47ae9ab7c6b800d1fca3db3999d6a592ca039060200160405180910390a150565b6000546001600160a01b03163314610f475760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161039c565b6001600160a01b038116610fc35760405162461bcd60e51b815260206004820152602260248201527f44454641554c545f42454e45464943494152595f43414e4e4f545f42455f4e5560448201527f4c4c000000000000000000000000000000000000000000000000000000000000606482015260840161039c565b6006805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526003602052604081205482906110595760405162461bcd60e51b815260206004820152600f60248201527f544f4b454e5f4e4f545f464f554e440000000000000000000000000000000000604482015260640161039c565b826001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561109257600080fd5b505afa1580156110a6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d00919061171e565b6001600160a01b038216600090815260036020526040812054819084906111335760405162461bcd60e51b815260206004820152600f60248201527f544f4b454e5f4e4f545f464f554e440000000000000000000000000000000000604482015260640161039c565b60006103e8611143600387611944565b61114d919061180d565b6001600160a01b03871660009081526004602052604081205491925090611199906111788489611963565b61118291906117f5565b61119490671bc16d674ec80000611944565b611458565b90506000876001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111d657600080fd5b505afa1580156111ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120e919061171e565b6112189083611963565b6001600160a01b0389166000908152600360205260409020549091508211156112835760405162461bcd60e51b815260206004820152601360248201527f45584345454445445f4d41585f535550504c5900000000000000000000000000604482015260640161039c565b9791965090945050505050565b6000546001600160a01b031633146112ea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161039c565b6001600160a01b0381166113665760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161039c565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526003602052604090205415155b919050565b6000808260601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f0949350505050565b60008061146660028461180d565b6114719060016117f5565b905060006002611481838661180d565b61148b90846117f5565b611495919061180d565b90505b808211156114ca5790508060026114af828661180d565b6114b990846117f5565b6114c3919061180d565b9050611498565b5092915050565b80356001600160a01b03811681146113ea57600080fd5b600082601f8301126114f8578081fd5b813567ffffffffffffffff8082111561151357611513611990565b604051601f8301601f19908116603f0116810190828211818310171561153b5761153b611990565b81604052838152866020858801011115611553578485fd5b8360208701602083013792830160200193909352509392505050565b600060208284031215611580578081fd5b610d00826114d1565b6000806040838503121561159b578081fd5b6115a4836114d1565b946020939093013593505050565b600080600080608085870312156115c7578182fd5b6115d0856114d1565b935060208501359250604085013591506115ec606086016114d1565b905092959194509250565b600060208284031215611608578081fd5b81518015158114610d00578182fd5b60008060006060848603121561162b578283fd5b833567ffffffffffffffff80821115611642578485fd5b61164e878388016114e8565b94506020860135915080821115611663578384fd5b50611670868287016114e8565b925050604084013590509250925092565b600080600080600060a08688031215611698578081fd5b853567ffffffffffffffff808211156116af578283fd5b6116bb89838a016114e8565b965060208801359150808211156116d0578283fd5b506116dd888289016114e8565b94505060408601359250606086013591506116fa608087016114d1565b90509295509295909350565b600060208284031215611717578081fd5b5035919050565b60006020828403121561172f578081fd5b5051919050565b60008151808452815b8181101561175b5760208185018101518683018201520161173f565b8181111561176c5782602083870101525b50601f01601f19169290920160200192915050565b60006001600160a01b0386168252608060208301526117a36080830186611736565b82810360408401526117b58186611736565b91505082606083015295945050505050565b6000604082526117da6040830185611736565b82810360208401526117ec8185611736565b95945050505050565b600082198211156118085761180861197a565b500190565b60008261182857634e487b7160e01b81526012600452602481fd5b500490565b80825b600180861161183f575061186a565b8187048211156118515761185161197a565b8086161561185e57918102915b9490941c938002611830565b94509492505050565b6000610d0060001960ff85168460008261188f57506001610d00565b8161189c57506000610d00565b81600181146118b257600281146118bc576118e9565b6001915050610d00565b60ff8411156118cd576118cd61197a565b6001841b9150848211156118e3576118e361197a565b50610d00565b5060208310610133831016604e8410600b841016171561191c575081810a838111156119175761191761197a565b610d00565b611929848484600161182d565b80860482111561193b5761193b61197a565b02949350505050565b600081600019048311821515161561195e5761195e61197a565b500290565b6000828210156119755761197561197a565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220474fbeafef3e2a0468ccbc0332293d1f6c833c967293c564e93ad63af63d2d0064736f6c634300080300330000000000000000000000001f3af095cda17d63cad238358837321e95fc5915000000000000000000000000ba7be0cb77cb89274196d29f098b2e37168154d4

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

0000000000000000000000001f3af095cda17d63cad238358837321e95fc5915000000000000000000000000ba7be0cb77cb89274196d29f098b2e37168154d4

-----Decoded View---------------
Arg [0] : baseToken (address): 0x1f3af095cda17d63cad238358837321e95fc5915
Arg [1] : implementation (address): 0xba7be0cb77cb89274196d29f098b2e37168154d4

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000001f3af095cda17d63cad238358837321e95fc5915
Arg [1] : 000000000000000000000000ba7be0cb77cb89274196d29f098b2e37168154d4


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