ETH Price: $1,959.77 (-1.67%)
 

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Buy Tokens231910682025-08-21 17:51:59194 days ago1755798719IN
0xf4e90Ca2...8b17C3200
0 ETH0.000065680.38648353
Sell Tokens230735842025-08-05 8:11:35210 days ago1754381495IN
0xf4e90Ca2...8b17C3200
0 ETH0.000047290.35532689
Buy Tokens230735762025-08-05 8:09:59210 days ago1754381399IN
0xf4e90Ca2...8b17C3200
0 ETH0.000053570.33990905
Buy Tokens226735682025-06-10 10:29:11266 days ago1749551351IN
0xf4e90Ca2...8b17C3200
0 ETH0.000310611.97077014
Sell Tokens226735462025-06-10 10:24:47266 days ago1749551087IN
0xf4e90Ca2...8b17C3200
0 ETH0.000295172.2181256
Buy Tokens226735122025-06-10 10:17:59266 days ago1749550679IN
0xf4e90Ca2...8b17C3200
0 ETH0.000333052.11316101
Buy Tokens226305922025-06-04 10:10:23272 days ago1749031823IN
0xf4e90Ca2...8b17C3200
0 ETH0.000482093.05860115
Sell Tokens226305712025-06-04 10:05:59272 days ago1749031559IN
0xf4e90Ca2...8b17C3200
0 ETH0.000356132.67567144
Buy Tokens226305582025-06-04 10:03:23272 days ago1749031403IN
0xf4e90Ca2...8b17C3200
0 ETH0.000489792.80332268
Transfer Ownersh...226230442025-06-03 8:50:11273 days ago1748940611IN
0xf4e90Ca2...8b17C3200
0 ETH0.000084342.92400622
Buy Tokens225965002025-05-30 15:39:23277 days ago1748619563IN
0xf4e90Ca2...8b17C3200
0 ETH0.00118298.41798134
Buy Tokens225962912025-05-30 14:57:35277 days ago1748617055IN
0xf4e90Ca2...8b17C3200
0 ETH0.0017594311.16246204
Buy Tokens225948652025-05-30 10:10:23277 days ago1748599823IN
0xf4e90Ca2...8b17C3200
0 ETH0.000338412.40868155
Buy Tokens225948582025-05-30 10:08:59277 days ago1748599739IN
0xf4e90Ca2...8b17C3200
0 ETH0.000355812.53253304
Buy Tokens225942502025-05-30 8:06:23277 days ago1748592383IN
0xf4e90Ca2...8b17C3200
0 ETH0.00033822.40656461
Buy Tokens225941852025-05-30 7:53:23277 days ago1748591603IN
0xf4e90Ca2...8b17C3200
0 ETH0.000375592.38253876
Buy Tokens225941142025-05-30 7:39:11277 days ago1748590751IN
0xf4e90Ca2...8b17C3200
0 ETH0.005188221.80710697
Buy Tokens225896762025-05-29 16:44:59278 days ago1748537099IN
0xf4e90Ca2...8b17C3200
0 ETH0.000512163.64505171
Buy Tokens225896702025-05-29 16:43:47278 days ago1748537027IN
0xf4e90Ca2...8b17C3200
0 ETH0.000488573.47658896
Buy Tokens225896282025-05-29 16:35:23278 days ago1748536523IN
0xf4e90Ca2...8b17C3200
0 ETH0.000505933.5998087
Sell Tokens225894272025-05-29 15:54:59278 days ago1748534099IN
0xf4e90Ca2...8b17C3200
0 ETH0.000500473.76084237
Buy Tokens225894172025-05-29 15:52:59278 days ago1748533979IN
0xf4e90Ca2...8b17C3200
0 ETH0.000701284.44953762
Sell Tokens225878782025-05-29 10:41:35278 days ago1748515295IN
0xf4e90Ca2...8b17C3200
0 ETH0.000358982.39039868
Buy Tokens225877252025-05-29 10:10:47278 days ago1748513447IN
0xf4e90Ca2...8b17C3200
0 ETH0.000496843.15241919
Buy Tokens225803492025-05-28 9:24:11279 days ago1748424251IN
0xf4e90Ca2...8b17C3200
0 ETH0.007643172.64477072
View all transactions

Latest 12 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
0x3d602d80231910542025-08-21 17:49:11194 days ago1755798551
0xf4e90Ca2...8b17C3200
 Contract Creation0 ETH
0x3d602d80230954452025-08-08 9:27:35207 days ago1754645255
0xf4e90Ca2...8b17C3200
 Contract Creation0 ETH
0x3d602d80226530442025-06-07 13:35:23269 days ago1749303323
0xf4e90Ca2...8b17C3200
 Contract Creation0 ETH
0x3d602d80226166482025-06-02 11:18:35274 days ago1748863115
0xf4e90Ca2...8b17C3200
 Contract Creation0 ETH
0x3d602d80226165512025-06-02 10:59:11274 days ago1748861951
0xf4e90Ca2...8b17C3200
 Contract Creation0 ETH
0x3d602d80225959122025-05-30 13:41:35277 days ago1748612495
0xf4e90Ca2...8b17C3200
 Contract Creation0 ETH
0x3d602d80225950002025-05-30 10:37:35277 days ago1748601455
0xf4e90Ca2...8b17C3200
 Contract Creation0 ETH
0x3d602d80225888872025-05-29 14:05:35278 days ago1748527535
0xf4e90Ca2...8b17C3200
 Contract Creation0 ETH
0x3d602d80225876582025-05-29 9:57:23278 days ago1748512643
0xf4e90Ca2...8b17C3200
 Contract Creation0 ETH
0x3d602d80225876432025-05-29 9:54:23278 days ago1748512463
0xf4e90Ca2...8b17C3200
 Contract Creation0 ETH
0x3d602d80225875402025-05-29 9:33:35278 days ago1748511215
0xf4e90Ca2...8b17C3200
 Contract Creation0 ETH
0x3d602d80225803212025-05-28 9:18:35279 days ago1748423915
0xf4e90Ca2...8b17C3200
 Contract Creation0 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FairLaunchPoolV2UnitsBps

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
File 1 of 3 : FairLaunchPoolV2UnitsBps.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;


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

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

    uint256 private _status;

    /**
     * @dev Unauthorized reentrant call.
     */
    error ReentrancyGuardReentrantCall();

    constructor() {
        _status = NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be NOT_ENTERED
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

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

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

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == ENTERED;
    }
}
interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(
        address recipient,
        uint256 amount
    ) external returns (bool);
    function approve(address spender, uint256 amount) external returns (bool);
    function allowance(
        address owner,
        address spender
    ) external returns (uint256);
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);
    function decimals() external returns (uint8);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
    address public owner;
    address public voter;

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

    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor() {
        owner = msg.sender;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

    modifier onlyVoter() {
        require(msg.sender == voter);
        _;
    }
    /**
     * @dev Allows the current owner to relinquish control of the contract.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipRenounced(owner);
        owner = address(0);
    }

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param _newOwner The address to transfer ownership to.
     */
    function transferOwnership(address _newOwner) public onlyOwner {
        _transferOwnership(_newOwner);
    }

    /**
     * @dev Transfers control of the contract to a newOwner.
     * @param _newOwner The address to transfer ownership to.
     */
    function _transferOwnership(address _newOwner) internal {
        require(_newOwner != address(0));
        emit OwnershipTransferred(owner, _newOwner);
        owner = _newOwner;
    }
}

interface UniswapRouter02 {
    function factory() external pure returns (address);

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

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    )
        external
        payable
        returns (uint amountToken, uint amountETH, uint liquidity);

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

    function getAmountsIn(
        uint amountOut,
        address[] calldata path
    ) external view returns (uint[] memory amounts);
}
interface UniswapFactory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint
    );

    function getPair(
        address tokenA,
        address tokenB
    ) external view returns (address pair);

    function createPair(
        address tokenA,
        address tokenB
    ) external returns (address pair);
}

interface IEventTracker {
    enum FeeType { Protocol, Affiliate, Owner }
    function buyEvent(
        address _caller,
        address _funContract,
        uint256 _buyAmount,
        uint256 _tokenRecieved
    ) external;
    function sellEvent(
        address _caller,
        address _funContract,
        uint256 _sellAmount,
        uint256 _nativeRecieved
    ) external;
    function createEvent(
        address creator,
        address funContract,
        address tokenAddress,
        string memory name,
        string memory symbol,
        string memory data,
        uint256 totalSupply,
        uint256 initialReserve,
        uint256 timestamp
    ) external;
    function listEvent(
        address user,
        address tokenAddress,
        address router,
        uint256 liquidityAmount,
        uint256 tokenAmount,
        uint256 _time,
        uint256 totalVolume
    ) external;
    function feeEvent(
        address _receiver,
        uint256 amount,
        FeeType feeType
    ) external;
    function callerValidate(address _newFunContract) external;
}
interface IToken {
    function initialize(
        uint256 initialSupply,
        string memory _name,
        string memory _symbol,
        address _midDeployer,
        address _deployer
    ) external;
    function initiateDex() external;
}

import "./Clones.sol";

contract FairLaunchPoolV2UnitsBps is Ownable, ReentrancyGuard {
    address public constant DEAD = 0x000000000000000000000000000000000000dEaD;
    uint256 public constant HUNDRED = 100;
    uint256 public constant BASIS_POINTS = 10000;

    struct TokenPoolData {
        uint256 reserveTokens;
        uint256 reserveETH;
        uint256 volume;
        uint256 listThreshold;
        uint256 initialReserveEth;
        uint8 nativePer;
        bool tradeActive;
        bool lpBurn;
        bool royalemitted;
    }

    struct TokenPool {
        address creator;
        address token;
        address baseToken;
        address router;
        address lockerAddress;
        address storedLPAddress;
        address deployer;
        TokenPoolData pool;
    }

    // deployer allowed to create tokens
    mapping(address => bool) public allowedDeployers;
    // user => array of tokens
    mapping(address => address[]) public userTokens;
    // token => token details
    mapping(address => TokenPool) public tokenPools;

    address public implementation; // erc20token
    address public feeContract; // simple address
    address public stableAddress; // stable for getting current mcap
    address public eventTracker;
    address public wrapp;

    uint16 public feePer;

    constructor(
        address _implementation,
        address _feeContract,
        address _stableAddress,
        address _eventTracker,
        address _wrapp,
        uint16 _feePer
    ) payable {
        implementation = _implementation;
        feeContract = _feeContract;
        stableAddress = _stableAddress;
        eventTracker = _eventTracker;
        wrapp = _wrapp;
        feePer = _feePer;
    }

    function create(
        string[2] memory _name_symbol,
        uint256 _totalSupply,
        address _creator,
        address _baseToken,
        address _router,
        uint256[2] memory listThreshold_initReserveEth,
        bool lpBurn
    ) public payable returns (address) {
        require(allowedDeployers[msg.sender], "not deployer");

        address fToken = Clones.clone(implementation);

        IToken(fToken).initialize(
            _totalSupply,
            _name_symbol[0],
            _name_symbol[1],
            address(this),
            msg.sender
        );

        // add tokens to the tokens user list
        userTokens[_creator].push(fToken);

        // create the pool data
        TokenPool memory pool;

        pool.creator = _creator;
        pool.token = fToken;
        pool.baseToken = _baseToken;
        pool.router = _router;
        pool.deployer = msg.sender;
        pool.pool.nativePer = 100;
        pool.pool.tradeActive = true;
        pool.pool.lpBurn = lpBurn;
        pool.pool.reserveTokens += _totalSupply;
        pool.pool.reserveETH += (listThreshold_initReserveEth[1] + msg.value);
        pool.pool.listThreshold = listThreshold_initReserveEth[0];
        pool.pool.initialReserveEth = listThreshold_initReserveEth[1];

        // add the fun data for the fun token
        tokenPools[fToken] = pool;

        return address(fToken); // return fun token address
    }

    // Calculate amount of output tokens or ETH to give out
    function getAmountOutTokens(
        address fToken,
        uint amountIn
    ) public view returns (uint amountOut) {
        require(amountIn > 0, "Invalid input amount");
        TokenPool storage token = tokenPools[fToken];
        require(
            token.pool.reserveTokens > 0 && token.pool.reserveETH > 0,
            "Invalid reserves"
        );
        uint numerator = amountIn * token.pool.reserveTokens;
        uint denominator = (token.pool.reserveETH) + amountIn;
        amountOut = numerator / denominator;
    }

    function getAmountOutETH(
        address fToken,
        uint amountIn
    ) public view returns (uint amountOut) {
        require(amountIn > 0, "Invalid input amount");
        TokenPool storage token = tokenPools[fToken];
        require(
            token.pool.reserveTokens > 0 && token.pool.reserveETH > 0,
            "Invalid reserves"
        );
        uint numerator = amountIn * token.pool.reserveETH;
        uint denominator = (token.pool.reserveTokens) + amountIn;
        amountOut = numerator / denominator;
    }

    function getCurrentCap(address fToken) public view returns (uint256) {
        return tokenPools[fToken].pool.reserveETH;
    }

    function getTokenPool(address fToken) public view returns(TokenPool memory) {
        return tokenPools[fToken];
    }

    function getTokenPools(address[] memory fTokens) public view returns(TokenPool[] memory) {
      uint length = fTokens.length;
      TokenPool[] memory pools = new TokenPool[](length);
      for( uint i=0 ;i < length;  ) {
        pools[i] = tokenPools[fTokens[i]];
        unchecked {
          i++;
        }
      }
      return pools;
    }

    function getUserTokens(address user) public view returns(address[] memory) {
      return userTokens[user];
    }

    function sellTokens(
        address fToken,
        uint256 tokenAmount,
        uint256 minEth
    ) public nonReentrant returns (bool, bool) {
        TokenPool storage token = tokenPools[fToken];
        require(token.pool.tradeActive, "Trading not active");

        uint256 tokenToSell = tokenAmount;
        uint256 ethAmount = getAmountOutETH(fToken, tokenToSell);
        uint256 ethAmountFee = (ethAmount * feePer) / BASIS_POINTS;
        
        require(ethAmount > 0 && ethAmount >= minEth, "Slippage too high");

        token.pool.reserveTokens += tokenAmount;
        token.pool.reserveETH -= ethAmount;
        token.pool.volume += ethAmount;

        IERC20(fToken).transferFrom(msg.sender, address(this), tokenToSell);

        if (ethAmountFee > 0) {
            if (token.baseToken == wrapp) {       
                (bool success, ) = feeContract.call{value: ethAmountFee}("");
                require(success, "fee ETH transfer failed");
            } else {
                IERC20(token.baseToken).transfer(feeContract, ethAmountFee);
            }

            IEventTracker(eventTracker).feeEvent(feeContract, ethAmountFee, IEventTracker.FeeType.Protocol);
        }

        if (token.baseToken == wrapp) {
            (bool success, ) = msg.sender.call{value: ethAmount - ethAmountFee}("");
            require(success, "seller ETH transfer failed");
        } else {
            IERC20(token.baseToken).transfer(msg.sender, ethAmount - ethAmountFee);
        }     

        IEventTracker(eventTracker).sellEvent(
            msg.sender,
            fToken,
            tokenToSell,
            ethAmount
        );

        return (true, true);
    }

    function buyTokens(
        address fToken,
        uint256 amountIn,
        uint256 minTokens
    ) public payable nonReentrant {
        TokenPool storage token = tokenPools[fToken];

        if (token.baseToken == wrapp) {
            require(msg.value >= amountIn, "Invalid buy value");
        } else {
            IERC20(token.baseToken).transferFrom(msg.sender, address(this), amountIn);
        }

        require(token.pool.tradeActive, "Trading not active");

        {
            uint256 ethAmount = amountIn;
            uint256 ethAmountFee = (ethAmount * feePer) / BASIS_POINTS;

            uint256 tokenAmount = getAmountOutTokens(
                fToken,
                ethAmount - ethAmountFee
            );
            
            require(tokenAmount >= minTokens, "Slippage too high");

            token.pool.reserveETH += (ethAmount - ethAmountFee);
            token.pool.reserveTokens -= tokenAmount;
            token.pool.volume += ethAmount;

            if (ethAmountFee > 0) {
                if (token.baseToken == wrapp) {
                    (bool success, ) = feeContract.call{value: ethAmountFee}("");
                    require(success, "fee ETH transfer failed");
                } else {
                    IERC20(token.baseToken).transfer(feeContract, ethAmountFee);
                }

                IEventTracker(eventTracker).feeEvent(feeContract, ethAmountFee, IEventTracker.FeeType.Protocol);
            }

            IERC20(fToken).transfer(msg.sender, tokenAmount);

            IEventTracker(eventTracker).buyEvent(
                msg.sender,
                fToken,
                amountIn,
                tokenAmount
            );
        }

        uint reserve = token.pool.reserveETH;
        uint listThreshold = token.pool.listThreshold;

        if (reserve >= listThreshold) {
            token.pool.tradeActive = false;
            IToken(fToken).initiateDex();
            token.pool.reserveETH -= token.pool.initialReserveEth;

            if (token.baseToken == wrapp) {

                _addLiquidityETH(
                    fToken,
                    IERC20(fToken).balanceOf(address(this)),
                    token.pool.reserveETH
                );

            } else {

                _addLiquidity(
                    fToken,
                    token.baseToken,
                    IERC20(fToken).balanceOf(address(this)),
                    token.pool.reserveETH
                );
            }

            token.pool.reserveETH -= token.pool.reserveETH;
        }
    }

    function _addLiquidity(
        address fToken,
        address baseToken,
        uint256 amountTokenDesired,
        uint256 amountBaseDesired
    ) internal {  
        uint256 amountBase = amountBaseDesired;
        uint256 amountBaseMin = (amountBase * 90) / HUNDRED;
        uint256 amountTokenToAddLiq = amountTokenDesired;
        uint256 amountTokenMin = (amountTokenToAddLiq * 90) / HUNDRED;

        TokenPool storage token = tokenPools[fToken];

        token.storedLPAddress = _getpair(fToken, fToken, baseToken);

        _approve(fToken, token.router);
        _approve(baseToken, token.router);

        UniswapRouter02(token.router).addLiquidity(
            fToken,
            baseToken,
            amountTokenToAddLiq,
            amountBase,
            amountTokenMin,
            amountBaseMin,
            DEAD,
            block.timestamp + (300)
        );

        IEventTracker(eventTracker).listEvent(
            msg.sender,
            fToken,
            token.router,
            amountBase,
            amountTokenToAddLiq,
            block.timestamp,
            token.pool.volume
        );
    }

    function _addLiquidityETH(
        address fToken,
        uint256 amountTokenDesired,
        uint256 nativeForDex
    ) internal {
        uint256 amountETH = nativeForDex;
        uint256 amountETHMin = (amountETH * 90) / HUNDRED;
        uint256 amountTokenToAddLiq = amountTokenDesired;
        uint256 amountTokenMin = (amountTokenToAddLiq * 90) / HUNDRED;

        TokenPool storage token = tokenPools[fToken];

        token.storedLPAddress = _getpair(fToken, fToken, wrapp);

        _approve(fToken, token.router);

        UniswapRouter02(token.router).addLiquidityETH{
            value: amountETH
        }(
            fToken,
            amountTokenToAddLiq,
            amountTokenMin,
            amountETHMin,
            DEAD,
            block.timestamp + (300)
        );

        IEventTracker(eventTracker).listEvent(
            msg.sender,
            fToken,
            token.router,
            amountETH,
            amountTokenToAddLiq,
            block.timestamp,
            token.pool.volume
        );
    }

    function _approve(
        address _token,
        address to
    ) internal returns (bool) {
        IERC20 token_ = IERC20(_token);
        
        if (token_.allowance(address(this), to) == 0) {
            token_.approve(to, type(uint256).max);
        }

        return true;
    }

    function _getpair(
        address fToken,
        address _token1,
        address _token2
    ) internal returns (address) {
        address router = tokenPools[fToken].router;
        address factory = UniswapRouter02(router).factory();
        address pair = UniswapFactory(factory).getPair(_token1, _token2);
        if (pair != address(0)) {
            return pair;
        } else {
            return UniswapFactory(factory).createPair(_token1, _token2);
        }
    }

    function addDeployer(address _deployer) public onlyOwner {
        allowedDeployers[_deployer] = true;
    }

    function removeDeployer(address _deployer) public onlyOwner {
        allowedDeployers[_deployer] = false;
    }

    function updateImplementation(address _implementation) public onlyOwner {
        require(_implementation != address(0));
        implementation = _implementation;
    }

    function updateFeeContract(address _newFeeContract) public onlyOwner {
        feeContract = _newFeeContract;
    }

    function updateEventTracker(address _newEventTracker) public onlyOwner {
        eventTracker = _newEventTracker;
    }

    function updateStableAddress(address _newStableAddress) public onlyOwner {
        stableAddress = _newStableAddress;
    }

    function updateteamFeeper(uint16 _newFeePer) public onlyOwner {
        feePer = _newFeePer;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (proxy/Clones.sol)

pragma solidity ^0.8.20;

import {Errors} from "./Errors.sol";

/**
 * @dev https://eips.ethereum.org/EIPS/eip-1167[ERC-1167] is a standard for
 * deploying minimal proxy contracts, also known as "clones".
 *
 * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies
 * > a minimal bytecode implementation that delegates all calls to a known, fixed address.
 *
 * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2`
 * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the
 * deterministic method.
 */
library Clones {
    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create opcode, which should never revert.
     */
    function clone(address implementation) internal returns (address instance) {
        return clone(implementation, 0);
    }

    /**
     * @dev Same as {xref-Clones-clone-address-}[clone], but with a `value` parameter to send native currency
     * to the new contract.
     *
     * NOTE: Using a non-zero value at creation will require the contract using this function (e.g. a factory)
     * to always have enough balance for new deployments. Consider exposing this function under a payable method.
     */
    function clone(
        address implementation,
        uint256 value
    ) internal returns (address instance) {
        if (address(this).balance < value) {
            revert Errors.InsufficientBalance(address(this).balance, value);
        }
        /// @solidity memory-safe-assembly
        assembly {
            // Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes
            // of the `implementation` address with the bytecode before the address.
            mstore(
                0x00,
                or(
                    shr(0xe8, shl(0x60, implementation)),
                    0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000
                )
            )
            // Packs the remaining 17 bytes of `implementation` with the bytecode after the address.
            mstore(
                0x20,
                or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3)
            )
            instance := create(value, 0x09, 0x37)
        }
        if (instance == address(0)) {
            revert Errors.FailedDeployment();
        }
    }

    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create2 opcode and a `salt` to deterministically deploy
     * the clone. Using the same `implementation` and `salt` multiple time will revert, since
     * the clones cannot be deployed twice at the same address.
     */
    function cloneDeterministic(
        address implementation,
        bytes32 salt
    ) internal returns (address instance) {
        return cloneDeterministic(implementation, salt, 0);
    }

    /**
     * @dev Same as {xref-Clones-cloneDeterministic-address-bytes32-}[cloneDeterministic], but with
     * a `value` parameter to send native currency to the new contract.
     *
     * NOTE: Using a non-zero value at creation will require the contract using this function (e.g. a factory)
     * to always have enough balance for new deployments. Consider exposing this function under a payable method.
     */
    function cloneDeterministic(
        address implementation,
        bytes32 salt,
        uint256 value
    ) internal returns (address instance) {
        if (address(this).balance < value) {
            revert Errors.InsufficientBalance(address(this).balance, value);
        }
        /// @solidity memory-safe-assembly
        assembly {
            // Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes
            // of the `implementation` address with the bytecode before the address.
            mstore(
                0x00,
                or(
                    shr(0xe8, shl(0x60, implementation)),
                    0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000
                )
            )
            // Packs the remaining 17 bytes of `implementation` with the bytecode after the address.
            mstore(
                0x20,
                or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3)
            )
            instance := create2(value, 0x09, 0x37, salt)
        }
        if (instance == address(0)) {
            revert Errors.FailedDeployment();
        }
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(
        address implementation,
        bytes32 salt,
        address deployer
    ) internal pure returns (address predicted) {
        /// @solidity memory-safe-assembly
        assembly {
            let ptr := mload(0x40)
            mstore(add(ptr, 0x38), deployer)
            mstore(add(ptr, 0x24), 0x5af43d82803e903d91602b57fd5bf3ff)
            mstore(add(ptr, 0x14), implementation)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73)
            mstore(add(ptr, 0x58), salt)
            mstore(add(ptr, 0x78), keccak256(add(ptr, 0x0c), 0x37))
            predicted := and(
                keccak256(add(ptr, 0x43), 0x55),
                0xffffffffffffffffffffffffffffffffffffffff
            )
        }
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(
        address implementation,
        bytes32 salt
    ) internal view returns (address predicted) {
        return predictDeterministicAddress(implementation, salt, address(this));
    }
}

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

pragma solidity ^0.8.20;

/**
 * @dev Collection of common custom errors used in multiple contracts
 *
 * IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.
 * It is recommended to avoid relying on the error API for critical functionality.
 */
library Errors {
    /**
     * @dev The ETH balance of the account is not enough to perform the operation.
     */
    error InsufficientBalance(uint256 balance, uint256 needed);

    /**
     * @dev A call to an address target failed. The target may have reverted.
     */
    error FailedCall();

    /**
     * @dev The deployment failed.
     */
    error FailedDeployment();

    /**
     * @dev A necessary precompile is missing.
     */
    error MissingPrecompile(address);
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_implementation","type":"address"},{"internalType":"address","name":"_feeContract","type":"address"},{"internalType":"address","name":"_stableAddress","type":"address"},{"internalType":"address","name":"_eventTracker","type":"address"},{"internalType":"address","name":"_wrapp","type":"address"},{"internalType":"uint16","name":"_feePer","type":"uint16"}],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"FailedDeployment","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","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"},{"inputs":[],"name":"BASIS_POINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HUNDRED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_deployer","type":"address"}],"name":"addDeployer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedDeployers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fToken","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minTokens","type":"uint256"}],"name":"buyTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string[2]","name":"_name_symbol","type":"string[2]"},{"internalType":"uint256","name":"_totalSupply","type":"uint256"},{"internalType":"address","name":"_creator","type":"address"},{"internalType":"address","name":"_baseToken","type":"address"},{"internalType":"address","name":"_router","type":"address"},{"internalType":"uint256[2]","name":"listThreshold_initReserveEth","type":"uint256[2]"},{"internalType":"bool","name":"lpBurn","type":"bool"}],"name":"create","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"eventTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feePer","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fToken","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"getAmountOutETH","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fToken","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"getAmountOutTokens","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fToken","type":"address"}],"name":"getCurrentCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fToken","type":"address"}],"name":"getTokenPool","outputs":[{"components":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"lockerAddress","type":"address"},{"internalType":"address","name":"storedLPAddress","type":"address"},{"internalType":"address","name":"deployer","type":"address"},{"components":[{"internalType":"uint256","name":"reserveTokens","type":"uint256"},{"internalType":"uint256","name":"reserveETH","type":"uint256"},{"internalType":"uint256","name":"volume","type":"uint256"},{"internalType":"uint256","name":"listThreshold","type":"uint256"},{"internalType":"uint256","name":"initialReserveEth","type":"uint256"},{"internalType":"uint8","name":"nativePer","type":"uint8"},{"internalType":"bool","name":"tradeActive","type":"bool"},{"internalType":"bool","name":"lpBurn","type":"bool"},{"internalType":"bool","name":"royalemitted","type":"bool"}],"internalType":"struct FairLaunchPoolV2UnitsBps.TokenPoolData","name":"pool","type":"tuple"}],"internalType":"struct FairLaunchPoolV2UnitsBps.TokenPool","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"fTokens","type":"address[]"}],"name":"getTokenPools","outputs":[{"components":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"lockerAddress","type":"address"},{"internalType":"address","name":"storedLPAddress","type":"address"},{"internalType":"address","name":"deployer","type":"address"},{"components":[{"internalType":"uint256","name":"reserveTokens","type":"uint256"},{"internalType":"uint256","name":"reserveETH","type":"uint256"},{"internalType":"uint256","name":"volume","type":"uint256"},{"internalType":"uint256","name":"listThreshold","type":"uint256"},{"internalType":"uint256","name":"initialReserveEth","type":"uint256"},{"internalType":"uint8","name":"nativePer","type":"uint8"},{"internalType":"bool","name":"tradeActive","type":"bool"},{"internalType":"bool","name":"lpBurn","type":"bool"},{"internalType":"bool","name":"royalemitted","type":"bool"}],"internalType":"struct FairLaunchPoolV2UnitsBps.TokenPoolData","name":"pool","type":"tuple"}],"internalType":"struct FairLaunchPoolV2UnitsBps.TokenPool[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserTokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_deployer","type":"address"}],"name":"removeDeployer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fToken","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"minEth","type":"uint256"}],"name":"sellTokens","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stableAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenPools","outputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"baseToken","type":"address"},{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"lockerAddress","type":"address"},{"internalType":"address","name":"storedLPAddress","type":"address"},{"internalType":"address","name":"deployer","type":"address"},{"components":[{"internalType":"uint256","name":"reserveTokens","type":"uint256"},{"internalType":"uint256","name":"reserveETH","type":"uint256"},{"internalType":"uint256","name":"volume","type":"uint256"},{"internalType":"uint256","name":"listThreshold","type":"uint256"},{"internalType":"uint256","name":"initialReserveEth","type":"uint256"},{"internalType":"uint8","name":"nativePer","type":"uint8"},{"internalType":"bool","name":"tradeActive","type":"bool"},{"internalType":"bool","name":"lpBurn","type":"bool"},{"internalType":"bool","name":"royalemitted","type":"bool"}],"internalType":"struct FairLaunchPoolV2UnitsBps.TokenPoolData","name":"pool","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newEventTracker","type":"address"}],"name":"updateEventTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newFeeContract","type":"address"}],"name":"updateFeeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_implementation","type":"address"}],"name":"updateImplementation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newStableAddress","type":"address"}],"name":"updateStableAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_newFeePer","type":"uint16"}],"name":"updateteamFeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wrapp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

6080601f6200268038819003918201601f19168301916001600160401b03831184841017620001175780849260c094604052833981010312620001125762000047816200012d565b62000055602083016200012d565b9062000064604084016200012d565b9062000073606085016200012d565b9260a062000084608087016200012d565b9501519361ffff85168503620001125760018060a01b03199233846000541617600055600160025560018060a01b039485809481809416876006541617600655168560075416176007551683600854161760085516906009541617600955600a549161ffff60a01b9060a01b1692169060018060b01b0319161717600a5560405161253d9081620001438239f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b0382168203620001125756fe608080604052600436101561001357600080fd5b60009060e08235811c918263025b22bc14611bfd57826303fd2a4514611be15750816304c2a34a14611b2c57816306e2971214611b035781631513556c14611ada57816315388d9a14611a9557816325a12f1d146118a95781632c6128321461186c57816346c96aac146118435781634d6dcae11461181b578163519dc8d21461176c5781635c60da1b146117435781636832e5de146117135781636d090218146116d4578163715018a61461167c57816373a2b2d0146112175781637fec0eed146111ee5781637fec43531461119b578163880f4039146111535781638da5cb5b1461112c578163c2e4d08f14611107578163c3d2c3c11461106157508063c4c6c23714611038578063d2395dcd14610730578063e1f1c4a714610713578063e4e57b9e14610345578063f2fde38b146102cf578063f315df861461028a578063f5e3a95d14610245578063f85fc0ab14610229578063f9f411d8146101ce5763fc006a8a1461018357600080fd5b346101cb5760203660031901126101cb5761019c611c48565b81546001600160a01b039190821633036101c757166001600160601b0360a01b600754161760075580f35b8280fd5b80fd5b50346101cb5760403660031901126101cb576101e8611c48565b6001600160a01b039081168252600460205260408220805460243593908410156101cb575060209261021991611e96565b9190546040519260031b1c168152f35b50346101cb57806003193601126101cb57602060405160648152f35b50346101cb5760203660031901126101cb5761025f611c48565b81546001600160a01b039190821633036101c757166001600160601b0360a01b600854161760085580f35b50346101cb5760203660031901126101cb576102a4611c48565b81546001600160a01b039190821633036101c757168152600360205260408120805460ff1916905580f35b50346101cb5760203660031901126101cb576102e9611c48565b81546001600160a01b038082169233849003610341571691821561033d5782907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a36001600160a01b03191617815580f35b8380fd5b8480fd5b50346101cb5761035436611e6c565b61035f929192612257565b60018060a01b03928383169081865260209460058652866040812093600785019461039360ff600c83015460081c16612135565b61039d85896120c1565b956103c96127106103b761ffff600a5460a01c168a612026565b04988815159081610708575b50612176565b6103d4868254611f81565b9055600881016103e58782546121b6565b9055600981016103f6878254611f81565b90556040516323b872dd60e01b8152336004820152306024820152604481018690529189908390606490829087905af19081156104f857899285926106eb575b50876105ce575b600201541683600a5416811460001461054857505080806104628697829596976121b6565b335af161046d6121db565b501561050357908592915b6009541690813b1561033d57604051631b1e4e2560e31b81523360048201526001600160a01b03959095166024860152604485015260648401919091528290608490829084905af180156104f8576104e0575b60408260016002556001825191818352820152f35b6104ea8391611d58565b6104f457816104cb565b5080fd5b6040513d85823e3d90fd5b60405162461bcd60e51b815260048101869052601a60248201527f73656c6c657220455448207472616e73666572206661696c65640000000000006044820152606490fd5b610581906105578498886121b6565b60405163a9059cbb60e01b8152336004820152602481019190915293849283919082906044820190565b03925af180156105c357610596575b50610478565b6105b590873d89116105bc575b6105ad8183611da5565b8101906121c3565b5038610590565b503d6105a3565b6040513d87823e3d90fd5b9150600282015416888785600a541683146000146106865761060792508480809350809288600754165af16106016121db565b5061220b565b8260095416836007541690803b1561033d57604051631b28003f60e11b81526001600160a01b03929092166004830152602482018890526000604483015283908290606490829084905af19182156104f8578385928b9461066a575b505061043d565b909250610678919350611d58565b6104f4578288918338610663565b60075460405163a9059cbb60e01b81529087166001600160a01b0316600482015260248101919091529182908186816044810103925af180156104f8576106ce575b50610607565b6106e490893d8b116105bc576105ad8183611da5565b50386106c8565b61070190843d86116105bc576105ad8183611da5565b5038610436565b9050881015386103c3565b50346101cb57806003193601126101cb5760206040516127108152f35b5061073a36611e6c565b610745939293612257565b6001600160a01b0384811684526005602052604084206002810154600a5491949290811691168103610fd95750803410610fa0575b61078d60ff600c85015460081c16612135565b6127106107a361ffff600a5460a01c1683612026565b046107c36107ba6107b483856121b6565b88612059565b93841015612176565b6107da6107d082846121b6565b6008860154611f81565b6008850155600784016107ee8482546121b6565b9055600984016107ff838254611f81565b905580610e83575b5060405163a9059cbb60e01b815233600482015260248101839052602081604481886001600160a01b038b165af180156105c357610e64575b506009546001600160a01b031690813b15610341576040516302c9982760e11b81523360048201526001600160a01b03871660248201526044810191909152606481019290925283908290608490829084905af180156104f857908391610e50575b50506008810154600a82015411156108be575b50600160025580f35b600c8101805461ff00191690556001600160a01b0383163b156104f4576040516335459a6560e21b81528281600481836001600160a01b0389165af180156104f857908391610e3c575b505061091c600b82015460088301546121b6565b600882018190556002820154600a546001600160a01b039182169291168203610bde5750506040516370a0823160e01b8152306004820152926020846024816001600160a01b0385165afa9384156104f8578394610ba5575b506008820154605a810294818604605a1482151715610b9157605a8102818104605a1482151715610b7d576001600160a01b038481168752600560205260408720600a549094916109c8911686806123a8565b6005850180546001600160a01b0319166001600160a01b039283161790556003850180549093916109fa911687612293565b5082546001600160a01b0316984261012c810191908210610b695760c488858c9d60609560649d9e9d8b96816040519a8b998a9863f305d71960e01b8a5260018060a01b031660048a0152602489015204604487015204606485015261dead608485015260a48401525af18015610b5e57610b30575b506009805492549401546001600160a01b039485169490921691823b15610b2c5760405163ea49c05f60e01b81523360048201526001600160a01b039687166024820152949095166044850152606484015260848301919091524260a483015260c4820192909252908290829060e490829084905af18015610b2157610b0d575b50505b6008610b0381830154806121b6565b91015580386108b5565b610b1690611d58565b6104f4578138610af1565b6040513d84823e3d90fd5b8680fd5b610b509060603d8111610b57575b610b488183611da5565b810190612278565b5050610a70565b503d610b3e565b6040513d89823e3d90fd5b634e487b7160e01b8a52601160045260248afd5b634e487b7160e01b86526011600452602486fd5b634e487b7160e01b85526011600452602485fd5b9093506020813d602011610bd6575b81610bc160209383611da5565b81010312610bd157519238610975565b600080fd5b3d9150610bb4565b6040516370a0823160e01b81523060048201529194916020816024816001600160a01b0387165afa9081156105c3578591610e0a575b5081605a810204605a1482151715610b915780605a810204605a1481151715610b91576001600160a01b038316855260056020526040852091610c588785806123a8565b6005840180546001600160a01b0319166001600160a01b039283161790556003840154610c86911685612293565b506003830154610c9f906001600160a01b031688612293565b5060038301546001600160a01b0316964261012c810110610df6579560608198610104839899604051948593849262e8e33760e81b845260018060a01b038c16600485015260248401528860448401528760648401526064605a8a020460848401526064605a89020460a484015261dead60c484015261012c420160e48401525af18015610deb57610dcd575b5060018060a01b036009541690600960018060a01b03600386015416940154823b15610b2c5760405163ea49c05f60e01b81523360048201526001600160a01b039687166024820152949095166044850152606484015260848301919091524260a483015260c4820192909252908290829060e490829084905af18015610b2157610db9575b5050610af4565b610dc290611d58565b6104f4578138610db2565b610de49060603d8111610b5757610b488183611da5565b5050610d2c565b6040513d88823e3d90fd5b634e487b7160e01b87526011600452602487fd5b90506020813d602011610e34575b81610e2560209383611da5565b81010312610bd1575138610c14565b3d9150610e18565b610e4590611d58565b6104f4578138610908565b610e5990611d58565b6104f45781386108a2565b610e7c9060203d6020116105bc576105ad8183611da5565b5038610840565b6002840154600a5482916001600160a01b0390811691168103610f3a575085808080610ebe9460018060a01b03600754165af16106016121db565b6009546007546001600160a01b039182169116813b15610b2c57604051631b28003f60e11b81526001600160a01b0391909116600482015260248101929092526000604483015285908290606490829084905af180156105c357908591610f26575b50610807565b610f2f90611d58565b61033d578338610f20565b60075460405163a9059cbb60e01b81526001600160a01b0390911660048201526024810192909252602090829060449082908a905af18015610deb57610f81575b50610ebe565b610f999060203d6020116105bc576105ad8183611da5565b5038610f7b565b60405162461bcd60e51b8152602060048201526011602482015270496e76616c6964206275792076616c756560781b6044820152606490fd5b6040516323b872dd60e01b815233600482015230602482015260448101839052906020908290606490829089905af180156105c357611019575b5061077a565b6110319060203d6020116105bc576105ad8183611da5565b5038611013565b50346101cb57806003193601126101cb576008546040516001600160a01b039091168152602090f35b9050346104f45760203660031901126104f45761020091611105906001600160a01b039060409082611091611c48565b1681526005602052209281845416938260018201541692806002830154168160038401541682600485015416916110d8600785600588015416956006880154169601611dfb565b96604051998a5260208a015260408901526060880152608087015260a086015260c0850152830190611c5e565bf35b82346101cb57806003193601126101cb57602061ffff600a5460a01c16604051908152f35b82346101cb57806003193601126101cb57546040516001600160a01b039091168152602090f35b82346101cb5760203660031901126101cb5761116d611c48565b81546001600160a01b039190821633036101c757168152600360205260408120805460ff1916600117905580f35b82346101cb5760203660031901126101cb5760043561ffff811681036104f45781546001600160a01b031633036104f457600a805461ffff60a01b191660a09290921b61ffff60a01b1691909117905580f35b82346101cb57806003193601126101cb57600a546040516001600160a01b039091168152602090f35b82610100916003199280843601126101c75767ffffffffffffffff926004358481116104f45760233681830112156101c7576040519561125687611d89565b869060448401933685116116785780600401925b85841061160f57505050505050602435906044359160018060a01b038084168094036101c7576064359381851680950361033d57608435828116809103610341573660c31215610341576040516112c081611d89565b60e48136821161160b5760a4905b8282106115fb57505035958615158097036101cb5733815260209b60038d5260ff604083205416156115c757600654608881901c62ffffff16763d602d80600a3d3981f3363d3d373d3d3d363d7300000017835260781b6effffffffffffffffffffffffffffff19166e5af43d82803e903d91602b57fd5bf3178d52856037600984f0169b8c156115b5578d8151910151918d3b1561033d578d8492838b6113ac61139d95604051988997889687956366faaae360e01b8752600487015260a0602487015260a4860190611ec4565b91848303016044850152611ec4565b30606483015233608483015203925af18015610b21576115a6575b509083825260048c526040822080549068010000000000000000821015611592579260058e8e600c9b9997958f9b999786611409916001604099018155611e96565b81549060031b908b85831b921b1916179055611423611f04565b97885282880199828b528689019e8f526060890197885260c089019b338d528d8a019d8e606460a082510152600160c0825101525101526114678d51918251611f81565b9052828101908c6114898561147e85513490611f81565b925101918251611f81565b90525160608d5101525160808c510152835252209783835116946001600160601b0360a01b95868b5416178a558460018b01915116868254161790558360028a01915116858254161790558260038901915116848254161790556004870182608083015116848254161790558160a06005890192015116838254161790556006860192511690825416179055519182516007820155868301516008820155604083015160098201556060830151600a8201556080830151600b820155019260ff60a08301511663ff00000085549462ff000061ff0060c0870151151560081b1694860151151560101b16940151151560181b169363ffffffff1916171717179055604051908152f35b634e487b7160e01b84526041600452602484fd5b6115af90611d58565b8c6113c7565b60405163b06ebf3d60e01b8152600490fd5b60405162461bcd60e51b8152600481018e9052600c60248201526b3737ba103232b83637bcb2b960a11b6044820152606490fd5b81358152602091820191016112ce565b8780fd5b833583811161160b5782019036868301121561160b5760048201359161163483611ddf565b906116426040519283611da5565b8382526024933685828401011161167457602094939291818c928796879301838601378301015281520193019261126a565b8a80fd5b8580fd5b82346101cb57806003193601126101cb5780546001600160a01b038116338190036101c7577ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c648208380a26001600160a01b031916815580f35b82346101cb5760203660031901126101cb5760209060ff906040906001600160a01b036116ff611c48565b168152600384522054166040519015158152f35b82346101cb5760403660031901126101cb57602061173b611732611c48565b602435906120c1565b604051908152f35b82346101cb57806003193601126101cb576006546040516001600160a01b039091168152602090f35b82346101cb57602090816003193601126101cb576001600160a01b03919082611793611c48565b168152600482526040812090604051808484549182815201908194845285842090845b81811061180557505050816117cc910382611da5565b6040519380850191818652518092526040850193925b8281106117ef5785850386f35b83518716855293810193928101926001016117e2565b82548916845292870192600192830192016117b6565b82346101cb5760403660031901126101cb57602061173b61183a611c48565b60243590612059565b82346101cb57806003193601126101cb576001546040516001600160a01b039091168152602090f35b82346101cb5760203660031901126101cb576020906008906040906001600160a01b03611897611c48565b16815260058452200154604051908152f35b82346101cb57602090816003193601126101cb576004359267ffffffffffffffff84116104f457366023850112156104f4578360040135906118ea82611dc7565b946118f86040519687611da5565b8286528486016024600594851b8301019136831161167857949694602401905b828210611a705750505082519161192e83611dc7565b9361193c6040519586611da5565b838552601f1961194b85611dc7565b01875b818110611a54575050865b8481106119aa57604080518881528751818a01819052888a01928201908a8c5b8281106119865784840385f35b909192826102008261199b6001948a51611cbd565b01960191019492919094611979565b9496946001600160a01b0390816119c18285612121565b5116875283885260408720611a316007604051926119de84611d25565b8581541684526001958087830154168d86015280600283015416604086015280600383015416606086015280600483015416608086015280898301541660a086015260068201541660c085015201611dfb565b86820152611a3f828b612121565b52611a4a818a612121565b5001969496611959565b8790611a61999799611f04565b82828c0101520197959761194e565b94969481356001600160a01b0381168103610b2c578152949694908601908601611918565b82346101cb5760203660031901126101cb57611aaf611c48565b81546001600160a01b039190821633036101c757166001600160601b0360a01b600954161760095580f35b82346101cb57806003193601126101cb576009546040516001600160a01b039091168152602090f35b82346101cb57806003193601126101cb576007546040516001600160a01b039091168152602090f35b9050346104f45760203660031901126104f4579061020091611bd060076040611b53611c48565b94611b5c611f04565b506001600160a01b03958616815260056020522060405194611b7d86611d25565b8082541686528060018301541660208701528060028301541660408701528060038301541660608701528060048301541660808701528060058301541660a087015260068201541660c086015201611dfb565b908201526111056040518092611cbd565b8390346104f457816003193601126104f4578061dead60209252f35b83346101cb5760203660031901126101cb57611c17611c48565b81546001600160a01b039190821633036101c7571680156104f4576001600160601b0360a01b600654161760065580f35b600435906001600160a01b0382168203610bd157565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260ff60a08201511660a083015260c0810151151560c083015260e0810151151560e0830152610100809101511515910152565b9060e080611d239360018060a01b038082511685528060208301511660208601528060408301511660408601528060608301511660608601528060808301511660808601528060a08301511660a086015260c08201511660c08501520151910190611c5e565b565b610100810190811067ffffffffffffffff821117611d4257604052565b634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff8111611d4257604052565b610120810190811067ffffffffffffffff821117611d4257604052565b6040810190811067ffffffffffffffff821117611d4257604052565b90601f8019910116810190811067ffffffffffffffff821117611d4257604052565b67ffffffffffffffff8111611d425760051b60200190565b67ffffffffffffffff8111611d4257601f01601f191660200190565b90604051611e0881611d6c565b61010060ff600583958054855260018101546020860152600281015460408601526003810154606086015260048101546080860152015481811660a0850152818160081c16151560c0850152818160101c16151560e085015260181c161515910152565b6060906003190112610bd1576004356001600160a01b0381168103610bd157906024359060443590565b8054821015611eae5760005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b919082519283825260005b848110611ef0575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201611ecf565b60405190611f1182611d25565b8160e06000918281528260208201528260408201528260608201528260808201528260a08201528260c082015260405192611f4b84611d6c565b8084528060208501528060408501528060608501528060808501528060a08501528060c085015280838501526101008401520152565b91908201809211611f8e57565b634e487b7160e01b600052601160045260246000fd5b15611fab57565b60405162461bcd60e51b8152602060048201526014602482015273125b9d985b1a59081a5b9c1d5d08185b5bdd5b9d60621b6044820152606490fd5b15611fee57565b60405162461bcd60e51b815260206004820152601060248201526f496e76616c696420726573657276657360801b6044820152606490fd5b81810292918115918404141715611f8e57565b8115612043570490565b634e487b7160e01b600052601260045260246000fd5b906120b291612069821515611fa4565b60018060a01b031660005260056020526120ac60406000209160086120a46007850154801515806120b5575b61209e90611fe7565b83612026565b930154611f81565b90612039565b90565b50858301541515612095565b906120b2916120d1821515611fa4565b60018060a01b031660005260056020526120ac60406000209161210f600860078501549485151580612115575b61210790611fe7565b015482612026565b92611f81565b508082015415156120fe565b8051821015611eae5760209160051b010190565b1561213c57565b60405162461bcd60e51b815260206004820152601260248201527154726164696e67206e6f742061637469766560701b6044820152606490fd5b1561217d57565b60405162461bcd60e51b81526020600482015260116024820152700a6d8d2e0e0c2ceca40e8dede40d0d2ced607b1b6044820152606490fd5b91908203918211611f8e57565b90816020910312610bd157518015158103610bd15790565b3d15612206573d906121ec82611ddf565b916121fa6040519384611da5565b82523d6000602084013e565b606090565b1561221257565b60405162461bcd60e51b815260206004820152601760248201527f66656520455448207472616e73666572206661696c65640000000000000000006044820152606490fd5b60028054146122665760028055565b604051633ee5aeb560e01b8152600490fd5b90816060910312610bd1578051916040602083015192015190565b604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015260209392811692600092909190858160448187895af190811561237e578491612351575b50156122eb575b5050505050600190565b6044859284604051968794859363095ea7b360e01b855216600484015260001960248401525af19081156123455750612327575b8080806122e1565b8161233d92903d106105bc576105ad8183611da5565b50388061231f565b604051903d90823e3d90fd5b90508581813d8311612377575b6123688183611da5565b8101031261033d5751386122da565b503d61235e565b6040513d86823e3d90fd5b90816020910312610bd157516001600160a01b0381168103610bd15790565b9160018060a01b0392836000911681526020916005835260409360048487600388872001541687519283809263c45a015560e01b82525afa9081156124fd5790879185916124e0575b50865163e6a4390560e01b81526001600160a01b0384811660048301528516602482015297911691908588604481865afa9788156124d65785986124b7575b508716156124415750505050505090565b85516364e329cb60e11b81526001600160a01b039182166004820152921660248301529394509282908490604490829085905af19384156124ad57509261248757505090565b6120b29250803d106124a6575b61249e8183611da5565b810190612389565b503d612494565b51903d90823e3d90fd5b6124cf919850863d88116124a65761249e8183611da5565b9638612430565b87513d87823e3d90fd5b6124f79150863d88116124a65761249e8183611da5565b386123f1565b86513d86823e3d90fdfea2646970667358221220ae98bd3f40489ad445b8a77c3d966eecd7d80c94eb8b657f70f2904b55eb19a764736f6c634300081400330000000000000000000000006a3868d4f28b69e5a6e74cc17a19a68808ed8ee0000000000000000000000000efe98f853ea4aa6d4fe30dbdeb7045c8e882a8d2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000044abac7ff47ebffa937cc79b51da3a944d742e000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000014

Deployed Bytecode

0x608080604052600436101561001357600080fd5b60009060e08235811c918263025b22bc14611bfd57826303fd2a4514611be15750816304c2a34a14611b2c57816306e2971214611b035781631513556c14611ada57816315388d9a14611a9557816325a12f1d146118a95781632c6128321461186c57816346c96aac146118435781634d6dcae11461181b578163519dc8d21461176c5781635c60da1b146117435781636832e5de146117135781636d090218146116d4578163715018a61461167c57816373a2b2d0146112175781637fec0eed146111ee5781637fec43531461119b578163880f4039146111535781638da5cb5b1461112c578163c2e4d08f14611107578163c3d2c3c11461106157508063c4c6c23714611038578063d2395dcd14610730578063e1f1c4a714610713578063e4e57b9e14610345578063f2fde38b146102cf578063f315df861461028a578063f5e3a95d14610245578063f85fc0ab14610229578063f9f411d8146101ce5763fc006a8a1461018357600080fd5b346101cb5760203660031901126101cb5761019c611c48565b81546001600160a01b039190821633036101c757166001600160601b0360a01b600754161760075580f35b8280fd5b80fd5b50346101cb5760403660031901126101cb576101e8611c48565b6001600160a01b039081168252600460205260408220805460243593908410156101cb575060209261021991611e96565b9190546040519260031b1c168152f35b50346101cb57806003193601126101cb57602060405160648152f35b50346101cb5760203660031901126101cb5761025f611c48565b81546001600160a01b039190821633036101c757166001600160601b0360a01b600854161760085580f35b50346101cb5760203660031901126101cb576102a4611c48565b81546001600160a01b039190821633036101c757168152600360205260408120805460ff1916905580f35b50346101cb5760203660031901126101cb576102e9611c48565b81546001600160a01b038082169233849003610341571691821561033d5782907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a36001600160a01b03191617815580f35b8380fd5b8480fd5b50346101cb5761035436611e6c565b61035f929192612257565b60018060a01b03928383169081865260209460058652866040812093600785019461039360ff600c83015460081c16612135565b61039d85896120c1565b956103c96127106103b761ffff600a5460a01c168a612026565b04988815159081610708575b50612176565b6103d4868254611f81565b9055600881016103e58782546121b6565b9055600981016103f6878254611f81565b90556040516323b872dd60e01b8152336004820152306024820152604481018690529189908390606490829087905af19081156104f857899285926106eb575b50876105ce575b600201541683600a5416811460001461054857505080806104628697829596976121b6565b335af161046d6121db565b501561050357908592915b6009541690813b1561033d57604051631b1e4e2560e31b81523360048201526001600160a01b03959095166024860152604485015260648401919091528290608490829084905af180156104f8576104e0575b60408260016002556001825191818352820152f35b6104ea8391611d58565b6104f457816104cb565b5080fd5b6040513d85823e3d90fd5b60405162461bcd60e51b815260048101869052601a60248201527f73656c6c657220455448207472616e73666572206661696c65640000000000006044820152606490fd5b610581906105578498886121b6565b60405163a9059cbb60e01b8152336004820152602481019190915293849283919082906044820190565b03925af180156105c357610596575b50610478565b6105b590873d89116105bc575b6105ad8183611da5565b8101906121c3565b5038610590565b503d6105a3565b6040513d87823e3d90fd5b9150600282015416888785600a541683146000146106865761060792508480809350809288600754165af16106016121db565b5061220b565b8260095416836007541690803b1561033d57604051631b28003f60e11b81526001600160a01b03929092166004830152602482018890526000604483015283908290606490829084905af19182156104f8578385928b9461066a575b505061043d565b909250610678919350611d58565b6104f4578288918338610663565b60075460405163a9059cbb60e01b81529087166001600160a01b0316600482015260248101919091529182908186816044810103925af180156104f8576106ce575b50610607565b6106e490893d8b116105bc576105ad8183611da5565b50386106c8565b61070190843d86116105bc576105ad8183611da5565b5038610436565b9050881015386103c3565b50346101cb57806003193601126101cb5760206040516127108152f35b5061073a36611e6c565b610745939293612257565b6001600160a01b0384811684526005602052604084206002810154600a5491949290811691168103610fd95750803410610fa0575b61078d60ff600c85015460081c16612135565b6127106107a361ffff600a5460a01c1683612026565b046107c36107ba6107b483856121b6565b88612059565b93841015612176565b6107da6107d082846121b6565b6008860154611f81565b6008850155600784016107ee8482546121b6565b9055600984016107ff838254611f81565b905580610e83575b5060405163a9059cbb60e01b815233600482015260248101839052602081604481886001600160a01b038b165af180156105c357610e64575b506009546001600160a01b031690813b15610341576040516302c9982760e11b81523360048201526001600160a01b03871660248201526044810191909152606481019290925283908290608490829084905af180156104f857908391610e50575b50506008810154600a82015411156108be575b50600160025580f35b600c8101805461ff00191690556001600160a01b0383163b156104f4576040516335459a6560e21b81528281600481836001600160a01b0389165af180156104f857908391610e3c575b505061091c600b82015460088301546121b6565b600882018190556002820154600a546001600160a01b039182169291168203610bde5750506040516370a0823160e01b8152306004820152926020846024816001600160a01b0385165afa9384156104f8578394610ba5575b506008820154605a810294818604605a1482151715610b9157605a8102818104605a1482151715610b7d576001600160a01b038481168752600560205260408720600a549094916109c8911686806123a8565b6005850180546001600160a01b0319166001600160a01b039283161790556003850180549093916109fa911687612293565b5082546001600160a01b0316984261012c810191908210610b695760c488858c9d60609560649d9e9d8b96816040519a8b998a9863f305d71960e01b8a5260018060a01b031660048a0152602489015204604487015204606485015261dead608485015260a48401525af18015610b5e57610b30575b506009805492549401546001600160a01b039485169490921691823b15610b2c5760405163ea49c05f60e01b81523360048201526001600160a01b039687166024820152949095166044850152606484015260848301919091524260a483015260c4820192909252908290829060e490829084905af18015610b2157610b0d575b50505b6008610b0381830154806121b6565b91015580386108b5565b610b1690611d58565b6104f4578138610af1565b6040513d84823e3d90fd5b8680fd5b610b509060603d8111610b57575b610b488183611da5565b810190612278565b5050610a70565b503d610b3e565b6040513d89823e3d90fd5b634e487b7160e01b8a52601160045260248afd5b634e487b7160e01b86526011600452602486fd5b634e487b7160e01b85526011600452602485fd5b9093506020813d602011610bd6575b81610bc160209383611da5565b81010312610bd157519238610975565b600080fd5b3d9150610bb4565b6040516370a0823160e01b81523060048201529194916020816024816001600160a01b0387165afa9081156105c3578591610e0a575b5081605a810204605a1482151715610b915780605a810204605a1481151715610b91576001600160a01b038316855260056020526040852091610c588785806123a8565b6005840180546001600160a01b0319166001600160a01b039283161790556003840154610c86911685612293565b506003830154610c9f906001600160a01b031688612293565b5060038301546001600160a01b0316964261012c810110610df6579560608198610104839899604051948593849262e8e33760e81b845260018060a01b038c16600485015260248401528860448401528760648401526064605a8a020460848401526064605a89020460a484015261dead60c484015261012c420160e48401525af18015610deb57610dcd575b5060018060a01b036009541690600960018060a01b03600386015416940154823b15610b2c5760405163ea49c05f60e01b81523360048201526001600160a01b039687166024820152949095166044850152606484015260848301919091524260a483015260c4820192909252908290829060e490829084905af18015610b2157610db9575b5050610af4565b610dc290611d58565b6104f4578138610db2565b610de49060603d8111610b5757610b488183611da5565b5050610d2c565b6040513d88823e3d90fd5b634e487b7160e01b87526011600452602487fd5b90506020813d602011610e34575b81610e2560209383611da5565b81010312610bd1575138610c14565b3d9150610e18565b610e4590611d58565b6104f4578138610908565b610e5990611d58565b6104f45781386108a2565b610e7c9060203d6020116105bc576105ad8183611da5565b5038610840565b6002840154600a5482916001600160a01b0390811691168103610f3a575085808080610ebe9460018060a01b03600754165af16106016121db565b6009546007546001600160a01b039182169116813b15610b2c57604051631b28003f60e11b81526001600160a01b0391909116600482015260248101929092526000604483015285908290606490829084905af180156105c357908591610f26575b50610807565b610f2f90611d58565b61033d578338610f20565b60075460405163a9059cbb60e01b81526001600160a01b0390911660048201526024810192909252602090829060449082908a905af18015610deb57610f81575b50610ebe565b610f999060203d6020116105bc576105ad8183611da5565b5038610f7b565b60405162461bcd60e51b8152602060048201526011602482015270496e76616c6964206275792076616c756560781b6044820152606490fd5b6040516323b872dd60e01b815233600482015230602482015260448101839052906020908290606490829089905af180156105c357611019575b5061077a565b6110319060203d6020116105bc576105ad8183611da5565b5038611013565b50346101cb57806003193601126101cb576008546040516001600160a01b039091168152602090f35b9050346104f45760203660031901126104f45761020091611105906001600160a01b039060409082611091611c48565b1681526005602052209281845416938260018201541692806002830154168160038401541682600485015416916110d8600785600588015416956006880154169601611dfb565b96604051998a5260208a015260408901526060880152608087015260a086015260c0850152830190611c5e565bf35b82346101cb57806003193601126101cb57602061ffff600a5460a01c16604051908152f35b82346101cb57806003193601126101cb57546040516001600160a01b039091168152602090f35b82346101cb5760203660031901126101cb5761116d611c48565b81546001600160a01b039190821633036101c757168152600360205260408120805460ff1916600117905580f35b82346101cb5760203660031901126101cb5760043561ffff811681036104f45781546001600160a01b031633036104f457600a805461ffff60a01b191660a09290921b61ffff60a01b1691909117905580f35b82346101cb57806003193601126101cb57600a546040516001600160a01b039091168152602090f35b82610100916003199280843601126101c75767ffffffffffffffff926004358481116104f45760233681830112156101c7576040519561125687611d89565b869060448401933685116116785780600401925b85841061160f57505050505050602435906044359160018060a01b038084168094036101c7576064359381851680950361033d57608435828116809103610341573660c31215610341576040516112c081611d89565b60e48136821161160b5760a4905b8282106115fb57505035958615158097036101cb5733815260209b60038d5260ff604083205416156115c757600654608881901c62ffffff16763d602d80600a3d3981f3363d3d373d3d3d363d7300000017835260781b6effffffffffffffffffffffffffffff19166e5af43d82803e903d91602b57fd5bf3178d52856037600984f0169b8c156115b5578d8151910151918d3b1561033d578d8492838b6113ac61139d95604051988997889687956366faaae360e01b8752600487015260a0602487015260a4860190611ec4565b91848303016044850152611ec4565b30606483015233608483015203925af18015610b21576115a6575b509083825260048c526040822080549068010000000000000000821015611592579260058e8e600c9b9997958f9b999786611409916001604099018155611e96565b81549060031b908b85831b921b1916179055611423611f04565b97885282880199828b528689019e8f526060890197885260c089019b338d528d8a019d8e606460a082510152600160c0825101525101526114678d51918251611f81565b9052828101908c6114898561147e85513490611f81565b925101918251611f81565b90525160608d5101525160808c510152835252209783835116946001600160601b0360a01b95868b5416178a558460018b01915116868254161790558360028a01915116858254161790558260038901915116848254161790556004870182608083015116848254161790558160a06005890192015116838254161790556006860192511690825416179055519182516007820155868301516008820155604083015160098201556060830151600a8201556080830151600b820155019260ff60a08301511663ff00000085549462ff000061ff0060c0870151151560081b1694860151151560101b16940151151560181b169363ffffffff1916171717179055604051908152f35b634e487b7160e01b84526041600452602484fd5b6115af90611d58565b8c6113c7565b60405163b06ebf3d60e01b8152600490fd5b60405162461bcd60e51b8152600481018e9052600c60248201526b3737ba103232b83637bcb2b960a11b6044820152606490fd5b81358152602091820191016112ce565b8780fd5b833583811161160b5782019036868301121561160b5760048201359161163483611ddf565b906116426040519283611da5565b8382526024933685828401011161167457602094939291818c928796879301838601378301015281520193019261126a565b8a80fd5b8580fd5b82346101cb57806003193601126101cb5780546001600160a01b038116338190036101c7577ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c648208380a26001600160a01b031916815580f35b82346101cb5760203660031901126101cb5760209060ff906040906001600160a01b036116ff611c48565b168152600384522054166040519015158152f35b82346101cb5760403660031901126101cb57602061173b611732611c48565b602435906120c1565b604051908152f35b82346101cb57806003193601126101cb576006546040516001600160a01b039091168152602090f35b82346101cb57602090816003193601126101cb576001600160a01b03919082611793611c48565b168152600482526040812090604051808484549182815201908194845285842090845b81811061180557505050816117cc910382611da5565b6040519380850191818652518092526040850193925b8281106117ef5785850386f35b83518716855293810193928101926001016117e2565b82548916845292870192600192830192016117b6565b82346101cb5760403660031901126101cb57602061173b61183a611c48565b60243590612059565b82346101cb57806003193601126101cb576001546040516001600160a01b039091168152602090f35b82346101cb5760203660031901126101cb576020906008906040906001600160a01b03611897611c48565b16815260058452200154604051908152f35b82346101cb57602090816003193601126101cb576004359267ffffffffffffffff84116104f457366023850112156104f4578360040135906118ea82611dc7565b946118f86040519687611da5565b8286528486016024600594851b8301019136831161167857949694602401905b828210611a705750505082519161192e83611dc7565b9361193c6040519586611da5565b838552601f1961194b85611dc7565b01875b818110611a54575050865b8481106119aa57604080518881528751818a01819052888a01928201908a8c5b8281106119865784840385f35b909192826102008261199b6001948a51611cbd565b01960191019492919094611979565b9496946001600160a01b0390816119c18285612121565b5116875283885260408720611a316007604051926119de84611d25565b8581541684526001958087830154168d86015280600283015416604086015280600383015416606086015280600483015416608086015280898301541660a086015260068201541660c085015201611dfb565b86820152611a3f828b612121565b52611a4a818a612121565b5001969496611959565b8790611a61999799611f04565b82828c0101520197959761194e565b94969481356001600160a01b0381168103610b2c578152949694908601908601611918565b82346101cb5760203660031901126101cb57611aaf611c48565b81546001600160a01b039190821633036101c757166001600160601b0360a01b600954161760095580f35b82346101cb57806003193601126101cb576009546040516001600160a01b039091168152602090f35b82346101cb57806003193601126101cb576007546040516001600160a01b039091168152602090f35b9050346104f45760203660031901126104f4579061020091611bd060076040611b53611c48565b94611b5c611f04565b506001600160a01b03958616815260056020522060405194611b7d86611d25565b8082541686528060018301541660208701528060028301541660408701528060038301541660608701528060048301541660808701528060058301541660a087015260068201541660c086015201611dfb565b908201526111056040518092611cbd565b8390346104f457816003193601126104f4578061dead60209252f35b83346101cb5760203660031901126101cb57611c17611c48565b81546001600160a01b039190821633036101c7571680156104f4576001600160601b0360a01b600654161760065580f35b600435906001600160a01b0382168203610bd157565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260ff60a08201511660a083015260c0810151151560c083015260e0810151151560e0830152610100809101511515910152565b9060e080611d239360018060a01b038082511685528060208301511660208601528060408301511660408601528060608301511660608601528060808301511660808601528060a08301511660a086015260c08201511660c08501520151910190611c5e565b565b610100810190811067ffffffffffffffff821117611d4257604052565b634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff8111611d4257604052565b610120810190811067ffffffffffffffff821117611d4257604052565b6040810190811067ffffffffffffffff821117611d4257604052565b90601f8019910116810190811067ffffffffffffffff821117611d4257604052565b67ffffffffffffffff8111611d425760051b60200190565b67ffffffffffffffff8111611d4257601f01601f191660200190565b90604051611e0881611d6c565b61010060ff600583958054855260018101546020860152600281015460408601526003810154606086015260048101546080860152015481811660a0850152818160081c16151560c0850152818160101c16151560e085015260181c161515910152565b6060906003190112610bd1576004356001600160a01b0381168103610bd157906024359060443590565b8054821015611eae5760005260206000200190600090565b634e487b7160e01b600052603260045260246000fd5b919082519283825260005b848110611ef0575050826000602080949584010152601f8019910116010190565b602081830181015184830182015201611ecf565b60405190611f1182611d25565b8160e06000918281528260208201528260408201528260608201528260808201528260a08201528260c082015260405192611f4b84611d6c565b8084528060208501528060408501528060608501528060808501528060a08501528060c085015280838501526101008401520152565b91908201809211611f8e57565b634e487b7160e01b600052601160045260246000fd5b15611fab57565b60405162461bcd60e51b8152602060048201526014602482015273125b9d985b1a59081a5b9c1d5d08185b5bdd5b9d60621b6044820152606490fd5b15611fee57565b60405162461bcd60e51b815260206004820152601060248201526f496e76616c696420726573657276657360801b6044820152606490fd5b81810292918115918404141715611f8e57565b8115612043570490565b634e487b7160e01b600052601260045260246000fd5b906120b291612069821515611fa4565b60018060a01b031660005260056020526120ac60406000209160086120a46007850154801515806120b5575b61209e90611fe7565b83612026565b930154611f81565b90612039565b90565b50858301541515612095565b906120b2916120d1821515611fa4565b60018060a01b031660005260056020526120ac60406000209161210f600860078501549485151580612115575b61210790611fe7565b015482612026565b92611f81565b508082015415156120fe565b8051821015611eae5760209160051b010190565b1561213c57565b60405162461bcd60e51b815260206004820152601260248201527154726164696e67206e6f742061637469766560701b6044820152606490fd5b1561217d57565b60405162461bcd60e51b81526020600482015260116024820152700a6d8d2e0e0c2ceca40e8dede40d0d2ced607b1b6044820152606490fd5b91908203918211611f8e57565b90816020910312610bd157518015158103610bd15790565b3d15612206573d906121ec82611ddf565b916121fa6040519384611da5565b82523d6000602084013e565b606090565b1561221257565b60405162461bcd60e51b815260206004820152601760248201527f66656520455448207472616e73666572206661696c65640000000000000000006044820152606490fd5b60028054146122665760028055565b604051633ee5aeb560e01b8152600490fd5b90816060910312610bd1578051916040602083015192015190565b604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015260209392811692600092909190858160448187895af190811561237e578491612351575b50156122eb575b5050505050600190565b6044859284604051968794859363095ea7b360e01b855216600484015260001960248401525af19081156123455750612327575b8080806122e1565b8161233d92903d106105bc576105ad8183611da5565b50388061231f565b604051903d90823e3d90fd5b90508581813d8311612377575b6123688183611da5565b8101031261033d5751386122da565b503d61235e565b6040513d86823e3d90fd5b90816020910312610bd157516001600160a01b0381168103610bd15790565b9160018060a01b0392836000911681526020916005835260409360048487600388872001541687519283809263c45a015560e01b82525afa9081156124fd5790879185916124e0575b50865163e6a4390560e01b81526001600160a01b0384811660048301528516602482015297911691908588604481865afa9788156124d65785986124b7575b508716156124415750505050505090565b85516364e329cb60e11b81526001600160a01b039182166004820152921660248301529394509282908490604490829085905af19384156124ad57509261248757505090565b6120b29250803d106124a6575b61249e8183611da5565b810190612389565b503d612494565b51903d90823e3d90fd5b6124cf919850863d88116124a65761249e8183611da5565b9638612430565b87513d87823e3d90fd5b6124f79150863d88116124a65761249e8183611da5565b386123f1565b86513d86823e3d90fdfea2646970667358221220ae98bd3f40489ad445b8a77c3d966eecd7d80c94eb8b657f70f2904b55eb19a764736f6c63430008140033

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

0000000000000000000000006a3868d4f28b69e5a6e74cc17a19a68808ed8ee0000000000000000000000000efe98f853ea4aa6d4fe30dbdeb7045c8e882a8d2000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000044abac7ff47ebffa937cc79b51da3a944d742e000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000014

-----Decoded View---------------
Arg [0] : _implementation (address): 0x6a3868d4F28b69E5a6E74cc17A19a68808ED8eE0
Arg [1] : _feeContract (address): 0xeFe98F853Ea4aa6D4fE30dBDeB7045C8e882A8D2
Arg [2] : _stableAddress (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [3] : _eventTracker (address): 0x0044ABAC7Ff47EbffA937CC79B51DA3A944d742E
Arg [4] : _wrapp (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [5] : _feePer (uint16): 20

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000006a3868d4f28b69e5a6e74cc17a19a68808ed8ee0
Arg [1] : 000000000000000000000000efe98f853ea4aa6d4fe30dbdeb7045c8e882a8d2
Arg [2] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [3] : 0000000000000000000000000044abac7ff47ebffa937cc79b51da3a944d742e
Arg [4] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000014


Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.