ETH Price: $3,388.63 (+1.23%)

Contract

0x1fdD76e18dD21046b7e7D54C8254Bf08B239e4D9
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Remove Liquidity...171390972023-04-27 17:48:23606 days ago1682617703IN
SafeMoon: Swap Router 2
0 ETH0.0169632238.72095826
Swap Exact ETH F...169060152023-03-25 17:39:23639 days ago1679765963IN
SafeMoon: Swap Router 2
0.00095065 ETH0.0052672633
Swap Exact ETH F...169004742023-03-24 22:58:47640 days ago1679698727IN
SafeMoon: Swap Router 2
0.0413625 ETH0.0003996717
Swap Exact ETH F...169004362023-03-24 22:51:11640 days ago1679698271IN
SafeMoon: Swap Router 2
0.04117743 ETH0.0004231818
Remove Liquidity...168897872023-03-23 10:56:47641 days ago1679569007IN
SafeMoon: Swap Router 2
0 ETH0.0035297314
Remove Liquidity...168897782023-03-23 10:54:47641 days ago1679568887IN
SafeMoon: Swap Router 2
0 ETH0.0038108415
Remove Liquidity...168897672023-03-23 10:52:35641 days ago1679568755IN
SafeMoon: Swap Router 2
0 ETH0.0039113715
Remove Liquidity...168897572023-03-23 10:50:35641 days ago1679568635IN
SafeMoon: Swap Router 2
0 ETH0.0042211516
Swap Exact ETH F...168797792023-03-22 1:11:23643 days ago1679447483IN
SafeMoon: Swap Router 2
0.01466773 ETH0.0017098812
Swap Exact Token...168790902023-03-21 22:51:59643 days ago1679439119IN
SafeMoon: Swap Router 2
0 ETH0.0040027516
Swap Exact ETH F...168790032023-03-21 22:34:11643 days ago1679438051IN
SafeMoon: Swap Router 2
0.0001 ETH0.0025648218
Swap Exact ETH F...168746042023-03-21 7:42:47643 days ago1679384567IN
SafeMoon: Swap Router 2
0.00809853 ETH0.004811414
Swap Exact ETH F...168733462023-03-21 3:27:59644 days ago1679369279IN
SafeMoon: Swap Router 2
0.00424641 ETH0.0021371715
Swap Exact ETH F...168724612023-03-21 0:30:11644 days ago1679358611IN
SafeMoon: Swap Router 2
0.08830466 ETH0.0041060124
Swap Exact ETH F...168719742023-03-20 22:51:59644 days ago1679352719IN
SafeMoon: Swap Router 2
0.02529918 ETH0.0028243418
Swap Exact ETH F...168718982023-03-20 22:36:47644 days ago1679351807IN
SafeMoon: Swap Router 2
0.11394002 ETH0.0031321418
Swap Exact ETH F...168695772023-03-20 14:47:47644 days ago1679323667IN
SafeMoon: Swap Router 2
0.00741483 ETH0.0037053626
Swap Exact ETH F...168691472023-03-20 13:21:23644 days ago1679318483IN
SafeMoon: Swap Router 2
0.0001 ETH0.0029810219
Swap Exact ETH F...168687772023-03-20 12:06:35644 days ago1679313995IN
SafeMoon: Swap Router 2
0.001 ETH0.0027839316
Swap Exact ETH F...168649972023-03-19 23:22:47645 days ago1679268167IN
SafeMoon: Swap Router 2
0.52114624 ETH0.0030795118
Swap Exact ETH F...168646002023-03-19 22:02:59645 days ago1679263379IN
SafeMoon: Swap Router 2
0.087 ETH0.002849820
Swap Exact ETH F...168629112023-03-19 16:21:11645 days ago1679242871IN
SafeMoon: Swap Router 2
0.00172939 ETH0.0028495620
Swap Exact ETH F...168595882023-03-19 5:08:23645 days ago1679202503IN
SafeMoon: Swap Router 2
0.07788728 ETH0.0020746713
Swap Exact ETH F...168558052023-03-18 16:23:47646 days ago1679156627IN
SafeMoon: Swap Router 2
0.00734123 ETH0.0033511321
Swap Exact ETH F...168531392023-03-18 7:24:47646 days ago1679124287IN
SafeMoon: Swap Router 2
0.01956132 ETH0.0023942115
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
171390972023-04-27 17:48:23606 days ago1682617703
SafeMoon: Swap Router 2
2.15958735 ETH
171390972023-04-27 17:48:23606 days ago1682617703
SafeMoon: Swap Router 2
2.15958735 ETH
169060152023-03-25 17:39:23639 days ago1679765963
SafeMoon: Swap Router 2
0.00095065 ETH
168897872023-03-23 10:56:47641 days ago1679569007
SafeMoon: Swap Router 2
1.80912913 ETH
168897872023-03-23 10:56:47641 days ago1679569007
SafeMoon: Swap Router 2
1.80912913 ETH
168897782023-03-23 10:54:47641 days ago1679568887
SafeMoon: Swap Router 2
19.17650225 ETH
168897782023-03-23 10:54:47641 days ago1679568887
SafeMoon: Swap Router 2
19.17650225 ETH
168897672023-03-23 10:52:35641 days ago1679568755
SafeMoon: Swap Router 2
3.87936322 ETH
168897672023-03-23 10:52:35641 days ago1679568755
SafeMoon: Swap Router 2
3.87936322 ETH
168897572023-03-23 10:50:35641 days ago1679568635
SafeMoon: Swap Router 2
37.72529861 ETH
168897572023-03-23 10:50:35641 days ago1679568635
SafeMoon: Swap Router 2
37.72529861 ETH
168797792023-03-22 1:11:23643 days ago1679447483
SafeMoon: Swap Router 2
0.01466773 ETH
168790032023-03-21 22:34:11643 days ago1679438051
SafeMoon: Swap Router 2
0.0001 ETH
168746042023-03-21 7:42:47643 days ago1679384567
SafeMoon: Swap Router 2
0.00809853 ETH
168733462023-03-21 3:27:59644 days ago1679369279
SafeMoon: Swap Router 2
0.00424641 ETH
168724612023-03-21 0:30:11644 days ago1679358611
SafeMoon: Swap Router 2
0.08830466 ETH
168719742023-03-20 22:51:59644 days ago1679352719
SafeMoon: Swap Router 2
0.02529918 ETH
168718982023-03-20 22:36:47644 days ago1679351807
SafeMoon: Swap Router 2
0.11394002 ETH
168695772023-03-20 14:47:47644 days ago1679323667
SafeMoon: Swap Router 2
0.00741483 ETH
168691472023-03-20 13:21:23644 days ago1679318483
SafeMoon: Swap Router 2
0.0001 ETH
168687772023-03-20 12:06:35644 days ago1679313995
SafeMoon: Swap Router 2
0.001 ETH
168649972023-03-19 23:22:47645 days ago1679268167
SafeMoon: Swap Router 2
0.52114624 ETH
168646002023-03-19 22:02:59645 days ago1679263379
SafeMoon: Swap Router 2
0.087 ETH
168629112023-03-19 16:21:11645 days ago1679242871
SafeMoon: Swap Router 2
0.00172939 ETH
168595882023-03-19 5:08:23645 days ago1679202503
SafeMoon: Swap Router 2
0.07788728 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SafeswapRouter

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 10 : SafeswapRouter.sol
pragma solidity =0.6.6;

import './interfaces/ISafeswapFactory.sol';
import './libraries/TransferHelper.sol';

import './interfaces/ISafeswapRouter02.sol';
import './libraries/SafeswapLibrary.sol';
import './libraries/SafeMath.sol';
import './interfaces/IERC20.sol';
import './interfaces/IWETH.sol';

contract SafeswapRouter is ISafeswapRouter02 {
     using SafeMath for uint;

    address public override factory;
    address public override WETH;

    address public admin;

    mapping (address => bool) public _isBlacklisted;
    mapping (address => bool) public _approvePartner;
    mapping (address => bool) private _lpTokenLockStatus;
    mapping (address => uint256) private _locktime;

    modifier ensure(uint deadline) {
        require(deadline >= block.timestamp, 'SafeswapRouter: EXPIRED');
        _;
    }


    constructor(address _factory, address _WETH) public {
        factory = _factory;
        WETH = _WETH;
        admin = msg.sender;
    }

    modifier onlyOwner() {
        require(admin == msg.sender, "Ownable: caller is not the owner");
        _;
    }
    receive() external payable {
        assert(msg.sender == WETH); // only accept ETH via fallback from the WETH contract
    }

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal virtual returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        if (ISafeswapFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            ISafeswapFactory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = SafeswapLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = SafeswapLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'SafeswapRouter: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = SafeswapLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'SafeswapRouter: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        require(!_isBlacklisted[to],"Address is blacklisted");
        require(_approvePartner[to],"Waiting for partner approval");
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = SafeswapLibrary.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = ISafeswapPair(pair).mint(to);
    }
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
        (amountToken, amountETH) = _addLiquidity(
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
         require(_approvePartner[to],"Waiting for partner approval");
        address pair = SafeswapLibrary.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = ISafeswapPair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
        require(!_isBlacklisted[to],"Address is blacklisted");
        address pair = SafeswapLibrary.pairFor(factory, tokenA, tokenB);
        ISafeswapPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = ISafeswapPair(pair).burn(to);
        (address token0,) = SafeswapLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'SafeswapRouter: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'SafeswapRouter: INSUFFICIENT_B_AMOUNT');
    }
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountToken, uint amountETH) {
         require(!_isBlacklisted[to],"Address is blacklisted");
        (amountToken, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountA, uint amountB) {
        require(!_isBlacklisted[to],"Address is blacklisted");
        address pair = SafeswapLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        ISafeswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
    }
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountToken, uint amountETH) {
         require(!_isBlacklisted[to],"Address is blacklisted");
        address pair = SafeswapLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        ISafeswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountETH) {
         require(!_isBlacklisted[to],"Address is blacklisted");
        (, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountETH) {
         require(!_isBlacklisted[to],"Address is blacklisted");
        address pair = SafeswapLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        ISafeswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
            token, liquidity, amountTokenMin, amountETHMin, to, deadline
        );
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = SafeswapLibrary.sortTokens(input, output);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < path.length - 2 ? SafeswapLibrary.pairFor(factory, output, path[i + 2]) : _to;
            ISafeswapPair(SafeswapLibrary.pairFor(factory, input, output)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        require(!_isBlacklisted[to],"Address is blacklisted");
        amounts = SafeswapLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'SafeswapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, SafeswapLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        require(!_isBlacklisted[to],"Address is blacklisted");
        amounts = SafeswapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'SafeswapRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, SafeswapLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, to);
    }
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'SafeswapRouter: INVALID_PATH');
        require(!_isBlacklisted[to],"Address is blacklisted");
        amounts = SafeswapLibrary.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'SafeswapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(SafeswapLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
    }
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, 'SafeswapRouter: INVALID_PATH');
        require(!_isBlacklisted[to],"Address is blacklisted");
        amounts = SafeswapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'SafeswapRouter: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, SafeswapLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, 'SafeswapRouter: INVALID_PATH');
        require(!_isBlacklisted[to],"Address is blacklisted");
        amounts = SafeswapLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'SafeswapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, SafeswapLibrary.pairFor(factory, path[0], path[1]), amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'SafeswapRouter: INVALID_PATH');
        require(!_isBlacklisted[to],"Address is blacklisted");
        amounts = SafeswapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'SafeswapRouter: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(SafeswapLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
        // refund dust eth, if any
        if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = SafeswapLibrary.sortTokens(input, output);
            ISafeswapPair pair = ISafeswapPair(SafeswapLibrary.pairFor(factory, input, output));
            uint amountInput;
            uint amountOutput;
            { // scope to avoid stack too deep errors
            (uint reserve0, uint reserve1,) = pair.getReserves();
            (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
            amountInput = IERC20(input).balanceOf(address(pair)).sub(reserveInput);
            amountOutput = SafeswapLibrary.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? SafeswapLibrary.pairFor(factory, output, path[i + 2]) : _to;
            pair.swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) {
        require(!_isBlacklisted[to],"Address is blacklisted");
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, SafeswapLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'SafeswapRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(!_isBlacklisted[to],"Address is blacklisted");
        require(path[0] == WETH, 'SafeswapRouter: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(SafeswapLibrary.pairFor(factory, path[0], path[1]), amountIn));
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'SafeswapRouter: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        ensure(deadline)
    {
        require(!_isBlacklisted[to],"Address is blacklisted");
        require(path[path.length - 1] == WETH, 'SafeswapRouter: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, SafeswapLibrary.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'SafeswapRouter: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).withdraw(amountOut);
        TransferHelper.safeTransferETH(to, amountOut);
    }

    // **** LIBRARY FUNCTIONS ****
    function quote(uint amountA, uint reserveA, uint reserveB) public pure virtual override returns (uint amountB) {
        return SafeswapLibrary.quote(amountA, reserveA, reserveB);
    }

    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut)
        public
        pure
        virtual
        override
        returns (uint amountOut)
    {
        return SafeswapLibrary.getAmountOut(amountIn, reserveIn, reserveOut);
    }

    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut)
        public
        pure
        virtual
        override
        returns (uint amountIn)
    {
        return SafeswapLibrary.getAmountIn(amountOut, reserveIn, reserveOut);
    }

    function getAmountsOut(uint amountIn, address[] memory path)
        public
        view
        virtual
        override
        returns (uint[] memory amounts)
    {
        return SafeswapLibrary.getAmountsOut(factory, amountIn, path);
    }

    function getAmountsIn(uint amountOut, address[] memory path)
        public
        view
        virtual
        override
        returns (uint[] memory amounts)
    {
        return SafeswapLibrary.getAmountsIn(factory, amountOut, path);
    }

    function blacklistAddress(address account) public onlyOwner() {
        _isBlacklisted[account] = true;
    }

    function unBlacklistAddress(address account) public onlyOwner() {
        _isBlacklisted[account] = false;
    }

    function approveLiquidityPartner(address account) public onlyOwner {
        _approvePartner[account] = true;
    }

    function unApproveLiquidityPartner(address account) public onlyOwner {
        _approvePartner[account] = false;
    }

    function lockLP(address LPtoken, uint256 time) public onlyOwner {
        _lpTokenLockStatus[LPtoken] = true;
        _locktime[LPtoken] = block.timestamp + time;
    }

}

File 2 of 10 : ISafeswapFactory.sol
pragma solidity >=0.5.0;

interface ISafeswapFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

File 3 of 10 : TransferHelper.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity >=0.6.0;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
  function safeApprove(
    address token,
    address to,
    uint256 value
) internal {
    // bytes4(keccak256(bytes('approve(address,uint256)')));
    (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
    require(
      success && (data.length == 0 || abi.decode(data, (bool))),
      'TransferHelper::safeApprove: approve failed'
    );
  }

  function safeTransfer(
    address token,
    address to,
    uint256 value
) internal {
    // bytes4(keccak256(bytes('transfer(address,uint256)')));
    (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
    require(
      success && (data.length == 0 || abi.decode(data, (bool))),
      'TransferHelper::safeTransfer: transfer failed'
    );
  }

  function safeTransferFrom(
    address token,
    address from,
    address to,
    uint256 value
) internal {
    // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
    (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
    require(
      success && (data.length == 0 || abi.decode(data, (bool))),
      'TransferHelper::transferFrom: transferFrom failed'
    );
  }

  function safeTransferETH(address to, uint256 value) internal {
    (bool success, ) = to.call{value: value}(new bytes(0));
    require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');
  }
}

File 4 of 10 : ISafeswapRouter02.sol
pragma solidity >=0.6.2;

import './ISafeswapRouter01.sol';

interface ISafeswapRouter02 is ISafeswapRouter01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

File 5 of 10 : SafeswapLibrary.sol
pragma solidity >=0.5.0;

import '../interfaces/ISafeswapPair.sol';

import "./SafeMath.sol";

library SafeswapLibrary {
    using SafeMath for uint;

    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'SafeswapLibrary: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'SafeswapLibrary: ZERO_ADDRESS');
    }

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = address(uint(keccak256(abi.encodePacked(
                hex'ff',
                factory,
                keccak256(abi.encodePacked(token0, token1)),
                hex'8bc8f8336dcfcba44096a139671d89637695b1be1cf88aad5d7de56ae35b8bfd' // init code hash
            ))));
    }

    // fetches and sorts the reserves for a pair
    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        pairFor(factory, tokenA, tokenB);
        (uint reserve0, uint reserve1,) = ISafeswapPair(pairFor(factory, tokenA, tokenB)).getReserves();
        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }

    // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
    function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
        require(amountA > 0, 'SafeswapLibrary: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'SafeswapLibrary: INSUFFICIENT_LIQUIDITY');
        amountB = amountA.mul(reserveB) / reserveA;
    }

    // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
        require(amountIn > 0, 'SafeswapLibrary: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'SafeswapLibrary: INSUFFICIENT_LIQUIDITY');
        uint amountInWithFee = amountIn.mul(998);
        uint numerator = amountInWithFee.mul(reserveOut);
        uint denominator = reserveIn.mul(1000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }

    // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {
        require(amountOut > 0, 'SafeswapLibrary: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'SafeswapLibrary: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut).mul(1000);
        uint denominator = reserveOut.sub(amountOut).mul(998);
        amountIn = (numerator / denominator).add(1);
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(address factory, uint amountIn, address[] memory path) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'SafeswapLibrary: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[0] = amountIn;
        for (uint i; i < path.length - 1; i++) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i], path[i + 1]);
            amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
        }
    }

    // performs chained getAmountIn calculations on any number of pairs
    function getAmountsIn(address factory, uint amountOut, address[] memory path) internal view returns (uint[] memory amounts) {
        require(path.length >= 2, 'SafeswapLibrary: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[amounts.length - 1] = amountOut;
        for (uint i = path.length - 1; i > 0; i--) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);
            amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
        }
    }
}

File 6 of 10 : SafeMath.sol
pragma solidity =0.6.6;

// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)

library SafeMath {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x, 'ds-math-add-overflow');
    }

    function sub(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x, 'ds-math-sub-underflow');
    }

    function mul(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
    }
}

File 7 of 10 : IERC20.sol
pragma solidity >=0.5.0;

interface IERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
}

File 8 of 10 : IWETH.sol
pragma solidity >=0.5.0;

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}

File 9 of 10 : ISafeswapRouter01.sol
pragma solidity >=0.6.2;

interface ISafeswapRouter01 {
    function factory() external pure returns (address);
    function WETH() 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 removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    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);
}

File 10 of 10 : ISafeswapPair.sol
pragma solidity >=0.5.0;

interface ISafeswapPair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_approvePartner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"approveLiquidityPartner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"blacklistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"LPtoken","type":"address"},{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lockLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unApproveLiquidityPartner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unBlacklistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b5060405162004d4738038062004d478339818101604052604081101561003557600080fd5b508051602090910151600080546001600160a01b039384166001600160a01b03199182161790915560018054939092169281169290921790556002805490911633179055614cbe80620000896000396000f3fe6080604052600436106101e75760003560e01c8063ad5c464811610102578063d40cf65911610095578063f305d71911610064578063f305d71914610d93578063f3290d7514610dd9578063f851a44014610e0c578063fb3bdb4114610e2157610202565b8063d40cf65914610c3a578063ded9382a14610c6d578063e3d164d314610ce0578063e8e3370014610d1357610202565b8063baa2abde116100d1578063baa2abde14610ae0578063c45a015514610b3d578063c471cffb14610b52578063d06ca61f14610b8557610202565b8063ad5c4648146109a2578063ad615dec146109d3578063af2979eb14610a09578063b6f9de9514610a5c57610202565b806338ed17391161017a578063791ac94711610149578063791ac947146107bc5780637ff36ab51461085257806385f8c259146108d65780638803dbee1461090c57610202565b806338ed1739146105875780634a25d94a1461061d5780635b0d5984146106b35780635c11d7951461072657610202565b80631cdd3be3116101b65780631cdd3be3146103d45780631f00ca741461041b5780632195995c146104d05780632295c42d1461054e57610202565b806302751cec14610207578063054d50d4146102735780631260dedb146102bb57806318cbafe5146102ee57610202565b36610202576001546001600160a01b0316331461020057fe5b005b600080fd5b34801561021357600080fd5b5061025a600480360360c081101561022a57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610ea5565b6040805192835260208301919091528051918290030190f35b34801561027f57600080fd5b506102a96004803603606081101561029657600080fd5b5080359060208101359060400135610fef565b60408051918252519081900360200190f35b3480156102c757600080fd5b50610200600480360360208110156102de57600080fd5b50356001600160a01b0316611004565b3480156102fa57600080fd5b50610384600480360360a081101561031157600080fd5b813591602081013591810190606081016040820135600160201b81111561033757600080fd5b82018360208201111561034957600080fd5b803590602001918460208302840111600160201b8311171561036a57600080fd5b91935091506001600160a01b038135169060200135611072565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103c05781810151838201526020016103a8565b505050509050019250505060405180910390f35b3480156103e057600080fd5b50610407600480360360208110156103f757600080fd5b50356001600160a01b03166113a5565b604080519115158252519081900360200190f35b34801561042757600080fd5b506103846004803603604081101561043e57600080fd5b81359190810190604081016020820135600160201b81111561045f57600080fd5b82018360208201111561047157600080fd5b803590602001918460208302840111600160201b8311171561049257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506113ba945050505050565b3480156104dc57600080fd5b5061025a60048036036101608110156104f457600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff61010082013516906101208101359061014001356113dd565b34801561055a57600080fd5b506102006004803603604081101561057157600080fd5b506001600160a01b03813516906020013561151d565b34801561059357600080fd5b50610384600480360360a08110156105aa57600080fd5b813591602081013591810190606081016040820135600160201b8111156105d057600080fd5b8201836020820111156105e257600080fd5b803590602001918460208302840111600160201b8311171561060357600080fd5b91935091506001600160a01b0381351690602001356115a0565b34801561062957600080fd5b50610384600480360360a081101561064057600080fd5b813591602081013591810190606081016040820135600160201b81111561066657600080fd5b82018360208201111561067857600080fd5b803590602001918460208302840111600160201b8311171561069957600080fd5b91935091506001600160a01b038135169060200135611733565b3480156106bf57600080fd5b506102a960048036036101408110156106d757600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356118e9565b34801561073257600080fd5b50610200600480360360a081101561074957600080fd5b813591602081013591810190606081016040820135600160201b81111561076f57600080fd5b82018360208201111561078157600080fd5b803590602001918460208302840111600160201b831117156107a257600080fd5b91935091506001600160a01b038135169060200135611a24565b3480156107c857600080fd5b50610200600480360360a08110156107df57600080fd5b813591602081013591810190606081016040820135600160201b81111561080557600080fd5b82018360208201111561081757600080fd5b803590602001918460208302840111600160201b8311171561083857600080fd5b91935091506001600160a01b038135169060200135611d09565b6103846004803603608081101561086857600080fd5b81359190810190604081016020820135600160201b81111561088957600080fd5b82018360208201111561089b57600080fd5b803590602001918460208302840111600160201b831117156108bc57600080fd5b91935091506001600160a01b038135169060200135611f93565b3480156108e257600080fd5b506102a9600480360360608110156108f957600080fd5b50803590602081013590604001356122c0565b34801561091857600080fd5b50610384600480360360a081101561092f57600080fd5b813591602081013591810190606081016040820135600160201b81111561095557600080fd5b82018360208201111561096757600080fd5b803590602001918460208302840111600160201b8311171561098857600080fd5b91935091506001600160a01b0381351690602001356122cd565b3480156109ae57600080fd5b506109b761240e565b604080516001600160a01b039092168252519081900360200190f35b3480156109df57600080fd5b506102a9600480360360608110156109f657600080fd5b508035906020810135906040013561241d565b348015610a1557600080fd5b506102a9600480360360c0811015610a2c57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a0013561242a565b61020060048036036080811015610a7257600080fd5b81359190810190604081016020820135600160201b811115610a9357600080fd5b820183602082011115610aa557600080fd5b803590602001918460208302840111600160201b83111715610ac657600080fd5b91935091506001600160a01b0381351690602001356125db565b348015610aec57600080fd5b5061025a600480360360e0811015610b0357600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612957565b348015610b4957600080fd5b506109b7612be2565b348015610b5e57600080fd5b5061020060048036036020811015610b7557600080fd5b50356001600160a01b0316612bf1565b348015610b9157600080fd5b5061038460048036036040811015610ba857600080fd5b81359190810190604081016020820135600160201b811115610bc957600080fd5b820183602082011115610bdb57600080fd5b803590602001918460208302840111600160201b83111715610bfc57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612c62945050505050565b348015610c4657600080fd5b5061020060048036036020811015610c5d57600080fd5b50356001600160a01b0316612c7c565b348015610c7957600080fd5b5061025a6004803603610140811015610c9157600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135612cea565b348015610cec57600080fd5b5061040760048036036020811015610d0357600080fd5b50356001600160a01b0316612e42565b348015610d1f57600080fd5b50610d756004803603610100811015610d3757600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135612e57565b60408051938452602084019290925282820152519081900360600190f35b610d75600480360360c0811015610da957600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135613049565b348015610de557600080fd5b5061020060048036036020811015610dfc57600080fd5b50356001600160a01b03166132e3565b348015610e1857600080fd5b506109b7613354565b61038460048036036080811015610e3757600080fd5b81359190810190604081016020820135600160201b811115610e5857600080fd5b820183602082011115610e6a57600080fd5b803590602001918460208302840111600160201b83111715610e8b57600080fd5b91935091506001600160a01b038135169060200135613363565b6000808242811015610eec576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001600160a01b03851660009081526003602052604090205460ff1615610f48576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b600154610f64908a906001600160a01b03168a8a8a308a612957565b9093509150610f748986856136bf565b60015460408051632e1a7d4d60e01b81526004810185905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b158015610fc157600080fd5b505af1158015610fd5573d6000803e3d6000fd5b50505050610fe38583613813565b50965096945050505050565b6000610ffc84848461390b565b949350505050565b6002546001600160a01b03163314611051576040805162461bcd60e51b81526020600482018190526024820152600080516020614b62833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152600460205260409020805460ff19169055565b606081428110156110b8576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001546001600160a01b0316868660001981018181106110d457fe5b905060200201356001600160a01b03166001600160a01b03161461112d576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a19833981519152604482015290519081900360640190fd5b6001600160a01b03841660009081526003602052604090205460ff1615611189576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b60005460408051602080890282810182019093528882526111d3936001600160a01b0316928c92918b918b918291908501908490808284376000920191909152506139fb92505050565b915086826001845103815181106111e657fe5b6020026020010151101561122b5760405162461bcd60e51b815260040180806020018281038252602a815260200180614b82602a913960400191505060405180910390fd5b6112bd8686600081811061123b57fe5b905060200201356001600160a01b0316336112a36000809054906101000a90046001600160a01b03168a8a600081811061127157fe5b905060200201356001600160a01b03168b8b600181811061128e57fe5b905060200201356001600160a01b0316613b47565b856000815181106112b057fe5b6020026020010151613c07565b6112fc82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613d64915050565b60015482516001600160a01b0390911690632e1a7d4d908490600019810190811061132357fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561136157600080fd5b505af1158015611375573d6000803e3d6000fd5b5050505061139a848360018551038151811061138d57fe5b6020026020010151613813565b509695505050505050565b60036020526000908152604090205460ff1681565b6000546060906113d4906001600160a01b03168484613f87565b90505b92915050565b6001600160a01b038616600090815260036020526040812054819060ff161561143b576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b60008054611453906001600160a01b03168f8f613b47565b9050600087611462578c611466565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156114dc57600080fd5b505af11580156114f0573d6000803e3d6000fd5b505050506115038f8f8f8f8f8f8f612957565b809450819550505050509b509b9950505050505050505050565b6002546001600160a01b0316331461156a576040805162461bcd60e51b81526020600482018190526024820152600080516020614b62833981519152604482015290519081900360640190fd5b6001600160a01b039091166000908152600560209081526040808320805460ff1916600117905560069091529020429091019055565b606081428110156115e6576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001600160a01b03841660009081526003602052604090205460ff1615611642576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b600054604080516020808902828101820190935288825261168c936001600160a01b0316928c92918b918b918291908501908490808284376000920191909152506139fb92505050565b9150868260018451038151811061169f57fe5b602002602001015110156116e45760405162461bcd60e51b815260040180806020018281038252602a815260200180614b82602a913960400191505060405180910390fd5b6116f48686600081811061123b57fe5b61139a82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613d64915050565b60608142811015611779576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001546001600160a01b03168686600019810181811061179557fe5b905060200201356001600160a01b03166001600160a01b0316146117ee576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a19833981519152604482015290519081900360640190fd5b6001600160a01b03841660009081526003602052604090205460ff161561184a576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b6000546040805160208089028281018201909352888252611894936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250613f8792505050565b915086826000815181106118a457fe5b6020026020010151111561122b5760405162461bcd60e51b8152600401808060200182810382526026815260200180614bcc6026913960400191505060405180910390fd5b6001600160a01b03861660009081526003602052604081205460ff1615611945576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b60008054600154611964916001600160a01b03908116918f9116613b47565b9050600086611973578b611977565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156119ed57600080fd5b505af1158015611a01573d6000803e3d6000fd5b50505050611a138d8d8d8d8d8d61242a565b9d9c50505050505050505050505050565b8042811015611a68576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001600160a01b03831660009081526003602052604090205460ff1615611ac4576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b611b2d85856000818110611ad457fe5b905060200201356001600160a01b031633611b276000809054906101000a90046001600160a01b031689896000818110611b0a57fe5b905060200201356001600160a01b03168a8a600181811061128e57fe5b8a613c07565b600085856000198101818110611b3f57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611ba457600080fd5b505afa158015611bb8573d6000803e3d6000fd5b505050506040513d6020811015611bce57600080fd5b50516040805160208881028281018201909352888252929350611c109290918991899182918501908490808284376000920191909152508892506140bf915050565b86611cc28288886000198101818110611c2557fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611c8a57600080fd5b505afa158015611c9e573d6000803e3d6000fd5b505050506040513d6020811015611cb457600080fd5b50519063ffffffff6143a716565b1015611cff5760405162461bcd60e51b815260040180806020018281038252602a815260200180614b82602a913960400191505060405180910390fd5b5050505050505050565b8042811015611d4d576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001600160a01b03831660009081526003602052604090205460ff1615611da9576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b6001546001600160a01b031685856000198101818110611dc557fe5b905060200201356001600160a01b03166001600160a01b031614611e1e576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a19833981519152604482015290519081900360640190fd5b611e2e85856000818110611ad457fe5b611e6c8585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506140bf915050565b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611eb757600080fd5b505afa158015611ecb573d6000803e3d6000fd5b505050506040513d6020811015611ee157600080fd5b5051905086811015611f245760405162461bcd60e51b815260040180806020018281038252602a815260200180614b82602a913960400191505060405180910390fd5b60015460408051632e1a7d4d60e01b81526004810184905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b158015611f7157600080fd5b505af1158015611f85573d6000803e3d6000fd5b50505050611cff8482613813565b60608142811015611fd9576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001546001600160a01b03168686600081611ff057fe5b905060200201356001600160a01b03166001600160a01b031614612049576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a19833981519152604482015290519081900360640190fd5b6001600160a01b03841660009081526003602052604090205460ff16156120a5576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b60005460408051602080890282810182019093528882526120ef936001600160a01b0316923492918b918b918291908501908490808284376000920191909152506139fb92505050565b9150868260018451038151811061210257fe5b602002602001015110156121475760405162461bcd60e51b815260040180806020018281038252602a815260200180614b82602a913960400191505060405180910390fd5b60015482516001600160a01b039091169063d0e30db090849060009061216957fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561219c57600080fd5b505af11580156121b0573d6000803e3d6000fd5b5050600154600080546001600160a01b03928316955063a9059cbb94506121e19350909116908a908a9081611b0a57fe5b846000815181106121ee57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561224557600080fd5b505af1158015612259573d6000803e3d6000fd5b505050506040513d602081101561226f57600080fd5b505161227757fe5b6122b682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613d64915050565b5095945050505050565b6000610ffc8484846143f7565b60608142811015612313576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001600160a01b03841660009081526003602052604090205460ff161561236f576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b60005460408051602080890282810182019093528882526123b9936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250613f8792505050565b915086826000815181106123c957fe5b602002602001015111156116e45760405162461bcd60e51b8152600401808060200182810382526026815260200180614bcc6026913960400191505060405180910390fd5b6001546001600160a01b031681565b6000610ffc8484846144e7565b60008142811015612470576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001600160a01b03841660009081526003602052604090205460ff16156124cc576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b6001546124e89089906001600160a01b03168989893089612957565b604080516370a0823160e01b8152306004820152905191945061256c92508a9187916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561253b57600080fd5b505afa15801561254f573d6000803e3d6000fd5b505050506040513d602081101561256557600080fd5b50516136bf565b60015460408051632e1a7d4d60e01b81526004810185905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b1580156125b957600080fd5b505af11580156125cd573d6000803e3d6000fd5b5050505061139a8483613813565b804281101561261f576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001600160a01b03831660009081526003602052604090205460ff161561267b576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b6001546001600160a01b0316858560008161269257fe5b905060200201356001600160a01b03166001600160a01b0316146126eb576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a19833981519152604482015290519081900360640190fd5b60015460408051630d0e30db60e41b8152905134926001600160a01b03169163d0e30db091849160048082019260009290919082900301818588803b15801561273357600080fd5b505af1158015612747573d6000803e3d6000fd5b5050600154600080546001600160a01b03928316955063a9059cbb94506127789350909116908a908a9081611b0a57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156127c857600080fd5b505af11580156127dc573d6000803e3d6000fd5b505050506040513d60208110156127f257600080fd5b50516127fa57fe5b60008686600019810181811061280c57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561287157600080fd5b505afa158015612885573d6000803e3d6000fd5b505050506040513d602081101561289b57600080fd5b505160408051602089810282810182019093528982529293506128dd9290918a918a9182918501908490808284376000920191909152508992506140bf915050565b87611cc282898960001981018181106128f257fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611c8a57600080fd5b600080824281101561299e576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001600160a01b03851660009081526003602052604090205460ff16156129fa576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b60008054612a12906001600160a01b03168c8c613b47565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b158015612a6d57600080fd5b505af1158015612a81573d6000803e3d6000fd5b505050506040513d6020811015612a9757600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b158015612ae457600080fd5b505af1158015612af8573d6000803e3d6000fd5b505050506040513d6040811015612b0e57600080fd5b50805160209091015190925090506000612b288e8e614593565b509050806001600160a01b03168e6001600160a01b031614612b4b578183612b4e565b82825b90975095508a871015612b925760405162461bcd60e51b8152600401808060200182810382526025815260200180614c646025913960400191505060405180910390fd5b89861015612bd15760405162461bcd60e51b8152600401808060200182810382526025815260200180614bf26025913960400191505060405180910390fd5b505050505097509795505050505050565b6000546001600160a01b031681565b6002546001600160a01b03163314612c3e576040805162461bcd60e51b81526020600482018190526024820152600080516020614b62833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b6000546060906113d4906001600160a01b031684846139fb565b6002546001600160a01b03163314612cc9576040805162461bcd60e51b81526020600482018190526024820152600080516020614b62833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152600360205260409020805460ff19169055565b6001600160a01b038616600090815260036020526040812054819060ff1615612d48576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b6000612d7e6000809054906101000a90046001600160a01b03168e600160009054906101000a90046001600160a01b0316613b47565b9050600087612d8d578c612d91565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b158015612e0757600080fd5b505af1158015612e1b573d6000803e3d6000fd5b50505050612e2d8e8e8e8e8e8e610ea5565b909f909e509c50505050505050505050505050565b60046020526000908152604090205460ff1681565b60008060008342811015612ea0576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001600160a01b03861660009081526003602052604090205460ff1615612efc576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b6001600160a01b03861660009081526004602052604090205460ff16612f69576040805162461bcd60e51b815260206004820152601c60248201527f57616974696e6720666f7220706172746e657220617070726f76616c00000000604482015290519081900360640190fd5b612f778c8c8c8c8c8c614671565b6000805492965090945090612f96906001600160a01b03168e8e613b47565b9050612fa48d338388613c07565b612fb08c338387613c07565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561300857600080fd5b505af115801561301c573d6000803e3d6000fd5b505050506040513d602081101561303257600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015613092576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001546130ad908b906001600160a01b03168b348c8c614671565b6001600160a01b038816600090815260046020526040902054919550935060ff1661311f576040805162461bcd60e51b815260206004820152601c60248201527f57616974696e6720666f7220706172746e657220617070726f76616c00000000604482015290519081900360640190fd5b6000805460015461313e916001600160a01b03908116918e9116613b47565b905061314c8b338388613c07565b600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561319c57600080fd5b505af11580156131b0573d6000803e3d6000fd5b50506001546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018b9052915191909216945063a9059cbb9350604480830193506020928290030181600087803b15801561320957600080fd5b505af115801561321d573d6000803e3d6000fd5b505050506040513d602081101561323357600080fd5b505161323b57fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561329357600080fd5b505af11580156132a7573d6000803e3d6000fd5b505050506040513d60208110156132bd57600080fd5b50519250348410156132d5576132d533853403613813565b505096509650969350505050565b6002546001600160a01b03163314613330576040805162461bcd60e51b81526020600482018190526024820152600080516020614b62833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152600360205260409020805460ff19166001179055565b6002546001600160a01b031681565b606081428110156133a9576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001546001600160a01b031686866000816133c057fe5b905060200201356001600160a01b03166001600160a01b031614613419576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a19833981519152604482015290519081900360640190fd5b6001600160a01b03841660009081526003602052604090205460ff1615613475576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b60005460408051602080890282810182019093528882526134bf936001600160a01b0316928b92918b918b91829190850190849080828437600092019190915250613f8792505050565b915034826000815181106134cf57fe5b602002602001015111156135145760405162461bcd60e51b8152600401808060200182810382526026815260200180614bcc6026913960400191505060405180910390fd5b60015482516001600160a01b039091169063d0e30db090849060009061353657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561356957600080fd5b505af115801561357d573d6000803e3d6000fd5b5050600154600080546001600160a01b03928316955063a9059cbb94506135ae9350909116908a908a9081611b0a57fe5b846000815181106135bb57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561361257600080fd5b505af1158015613626573d6000803e3d6000fd5b505050506040513d602081101561363c57600080fd5b505161364457fe5b61368382878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613d64915050565b8160008151811061369057fe5b60200260200101513411156122b6576122b633836000815181106136b057fe5b60200260200101513403613813565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b6020831061373c5780518252601f19909201916020918201910161371d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461379e576040519150601f19603f3d011682016040523d82523d6000602084013e6137a3565b606091505b50915091508180156137d15750805115806137d157508080602001905160208110156137ce57600080fd5b50515b61380c5760405162461bcd60e51b815260040180806020018281038252602d815260200180614c17602d913960400191505060405180910390fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b6020831061385f5780518252601f199092019160209182019101613840565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146138c1576040519150601f19603f3d011682016040523d82523d6000602084013e6138c6565b606091505b50509050806139065760405162461bcd60e51b8152600401808060200182810382526034815260200180614a8e6034913960400191505060405180910390fd5b505050565b600080841161394b5760405162461bcd60e51b815260040180806020018281038252602a815260200180614ae9602a913960400191505060405180910390fd5b60008311801561395b5750600082115b6139965760405162461bcd60e51b8152600401808060200182810382526027815260200180614ac26027913960400191505060405180910390fd5b60006139aa856103e663ffffffff61489316565b905060006139be828563ffffffff61489316565b905060006139e4836139d8886103e863ffffffff61489316565b9063ffffffff6148f616565b90508082816139ef57fe5b04979650505050505050565b6060600282511015613a54576040805162461bcd60e51b815260206004820152601d60248201527f53616665737761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613a6c57600080fd5b50604051908082528060200260200182016040528015613a96578160200160208202803683370190505b5090508281600081518110613aa757fe5b60200260200101818152505060005b6001835103811015613b3f57600080613af987868581518110613ad557fe5b6020026020010151878660010181518110613aec57fe5b6020026020010151614945565b91509150613b1b848481518110613b0c57fe5b6020026020010151838361390b565b848460010181518110613b2a57fe5b60209081029190910101525050600101613ab6565b509392505050565b6000806000613b568585614593565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f8bc8f8336dcfcba44096a139671d89637695b1be1cf88aad5d7de56ae35b8bfd609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b60208310613c8c5780518252601f199092019160209182019101613c6d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613cee576040519150601f19603f3d011682016040523d82523d6000602084013e613cf3565b606091505b5091509150818015613d21575080511580613d215750808060200190516020811015613d1e57600080fd5b50515b613d5c5760405162461bcd60e51b8152600401808060200182810382526031815260200180614a5d6031913960400191505060405180910390fd5b505050505050565b60005b6001835103811015613f8157600080848381518110613d8257fe5b6020026020010151858460010181518110613d9957fe5b6020026020010151915091506000613db18383614593565b5090506000878560010181518110613dc557fe5b60200260200101519050600080836001600160a01b0316866001600160a01b031614613df357826000613df7565b6000835b91509150600060028a51038810613e0e5788613e3f565b6000548a51613e3f916001600160a01b03169088908d9060028d01908110613e3257fe5b6020026020010151613b47565b600054909150613e59906001600160a01b03168888613b47565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613e96576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613f07578181015183820152602001613eef565b50505050905090810190601f168015613f345780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613f5657600080fd5b505af1158015613f6a573d6000803e3d6000fd5b505060019099019850613d67975050505050505050565b50505050565b6060600282511015613fe0576040805162461bcd60e51b815260206004820152601d60248201527f53616665737761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613ff857600080fd5b50604051908082528060200260200182016040528015614022578160200160208202803683370190505b509050828160018351038151811061403657fe5b60209081029190910101528151600019015b8015613b3f576000806140788786600186038151811061406457fe5b6020026020010151878681518110613aec57fe5b9150915061409a84848151811061408b57fe5b602002602001015183836143f7565b8460018503815181106140a957fe5b6020908102919091010152505060001901614048565b60005b6001835103811015613906576000808483815181106140dd57fe5b60200260200101518584600101815181106140f457fe5b602002602001015191509150600061410c8383614593565b506000805491925090614129906001600160a01b03168585613b47565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561416a57600080fd5b505afa15801561417e573d6000803e3d6000fd5b505050506040513d606081101561419457600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a8116908916146141ca5782846141cd565b83835b9150915061422b828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611c8a57600080fd5b955061423886838361390b565b945050505050600080856001600160a01b0316886001600160a01b03161461426257826000614266565b6000835b91509150600060028c51038a1061427d578a6142a1565b6000548c516142a1916001600160a01b0316908a908f9060028f01908110613e3257fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b8381101561432b578181015183820152602001614313565b50505050905090810190601f1680156143585780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561437a57600080fd5b505af115801561438e573d6000803e3d6000fd5b50506001909b019a506140c29950505050505050505050565b808203828111156113d7576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b60008084116144375760405162461bcd60e51b815260040180806020018281038252602b815260200180614b37602b913960400191505060405180910390fd5b6000831180156144475750600082115b6144825760405162461bcd60e51b8152600401808060200182810382526027815260200180614ac26027913960400191505060405180910390fd5b60006144a66103e861449a868863ffffffff61489316565b9063ffffffff61489316565b905060006144c06103e661449a868963ffffffff6143a716565b90506144dd60018284816144d057fe5b049063ffffffff6148f616565b9695505050505050565b60008084116145275760405162461bcd60e51b8152600401808060200182810382526024815260200180614b136024913960400191505060405180910390fd5b6000831180156145375750600082115b6145725760405162461bcd60e51b8152600401808060200182810382526027815260200180614ac26027913960400191505060405180910390fd5b82614583858463ffffffff61489316565b8161458a57fe5b04949350505050565b600080826001600160a01b0316846001600160a01b031614156145e75760405162461bcd60e51b8152600401808060200182810382526024815260200180614a396024913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b03161061460757828461460a565b83835b90925090506001600160a01b03821661466a576040805162461bcd60e51b815260206004820152601d60248201527f53616665737761704c6962726172793a205a45524f5f41444452455353000000604482015290519081900360640190fd5b9250929050565b600080546040805163e6a4390560e01b81526001600160a01b038a811660048301528981166024830152915184938493169163e6a43905916044808301926020929190829003018186803b1580156146c857600080fd5b505afa1580156146dc573d6000803e3d6000fd5b505050506040513d60208110156146f257600080fd5b50516001600160a01b0316141561478a5760008054604080516364e329cb60e11b81526001600160a01b038c811660048301528b811660248301529151919092169263c9c6539692604480820193602093909283900390910190829087803b15801561475d57600080fd5b505af1158015614771573d6000803e3d6000fd5b505050506040513d602081101561478757600080fd5b50505b6000805481906147a4906001600160a01b03168b8b614945565b915091508160001480156147b6575080155b156147c657879350869250614886565b60006147d38984846144e7565b9050878111614826578581101561481b5760405162461bcd60e51b8152600401808060200182810382526025815260200180614bf26025913960400191505060405180910390fd5b889450925082614884565b60006148338984866144e7565b90508981111561483f57fe5b8781101561487e5760405162461bcd60e51b8152600401808060200182810382526025815260200180614c646025913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806148ae575050808202828282816148ab57fe5b04145b6113d7576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b808201828110156113d7576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60008060006149548585614593565b509050614962868686613b47565b50600080614971888888613b47565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156149a957600080fd5b505afa1580156149bd573d6000803e3d6000fd5b505050506040513d60608110156149d357600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b0387811690841614614a06578082614a09565b81815b9099909850965050505050505056fe5361666573776170526f757465723a20494e56414c49445f504154480000000053616665737761704c6962726172793a204944454e544943414c5f4144445245535345535472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c65645472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c656453616665737761704c6962726172793a20494e53554646494349454e545f4c495155494449545953616665737761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e5453616665737761704c6962726172793a20494e53554646494349454e545f414d4f554e5453616665737761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e544f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666573776170526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e544164647265737320697320626c61636b6c6973746564000000000000000000005361666573776170526f757465723a204558434553534956455f494e5055545f414d4f554e545361666573776170526f757465723a20494e53554646494349454e545f425f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c65645361666573776170526f757465723a20455850495245440000000000000000005361666573776170526f757465723a20494e53554646494349454e545f415f414d4f554e54a2646970667358221220d99dc9e1328620067116e74feef04ed4c4a0d92910ae8d6a5ba310fa5dc977ce64736f6c634300060600330000000000000000000000009cf2f35e3656d4c68474525d67d9459da3a000cd000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2

Deployed Bytecode

0x6080604052600436106101e75760003560e01c8063ad5c464811610102578063d40cf65911610095578063f305d71911610064578063f305d71914610d93578063f3290d7514610dd9578063f851a44014610e0c578063fb3bdb4114610e2157610202565b8063d40cf65914610c3a578063ded9382a14610c6d578063e3d164d314610ce0578063e8e3370014610d1357610202565b8063baa2abde116100d1578063baa2abde14610ae0578063c45a015514610b3d578063c471cffb14610b52578063d06ca61f14610b8557610202565b8063ad5c4648146109a2578063ad615dec146109d3578063af2979eb14610a09578063b6f9de9514610a5c57610202565b806338ed17391161017a578063791ac94711610149578063791ac947146107bc5780637ff36ab51461085257806385f8c259146108d65780638803dbee1461090c57610202565b806338ed1739146105875780634a25d94a1461061d5780635b0d5984146106b35780635c11d7951461072657610202565b80631cdd3be3116101b65780631cdd3be3146103d45780631f00ca741461041b5780632195995c146104d05780632295c42d1461054e57610202565b806302751cec14610207578063054d50d4146102735780631260dedb146102bb57806318cbafe5146102ee57610202565b36610202576001546001600160a01b0316331461020057fe5b005b600080fd5b34801561021357600080fd5b5061025a600480360360c081101561022a57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610ea5565b6040805192835260208301919091528051918290030190f35b34801561027f57600080fd5b506102a96004803603606081101561029657600080fd5b5080359060208101359060400135610fef565b60408051918252519081900360200190f35b3480156102c757600080fd5b50610200600480360360208110156102de57600080fd5b50356001600160a01b0316611004565b3480156102fa57600080fd5b50610384600480360360a081101561031157600080fd5b813591602081013591810190606081016040820135600160201b81111561033757600080fd5b82018360208201111561034957600080fd5b803590602001918460208302840111600160201b8311171561036a57600080fd5b91935091506001600160a01b038135169060200135611072565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103c05781810151838201526020016103a8565b505050509050019250505060405180910390f35b3480156103e057600080fd5b50610407600480360360208110156103f757600080fd5b50356001600160a01b03166113a5565b604080519115158252519081900360200190f35b34801561042757600080fd5b506103846004803603604081101561043e57600080fd5b81359190810190604081016020820135600160201b81111561045f57600080fd5b82018360208201111561047157600080fd5b803590602001918460208302840111600160201b8311171561049257600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506113ba945050505050565b3480156104dc57600080fd5b5061025a60048036036101608110156104f457600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff61010082013516906101208101359061014001356113dd565b34801561055a57600080fd5b506102006004803603604081101561057157600080fd5b506001600160a01b03813516906020013561151d565b34801561059357600080fd5b50610384600480360360a08110156105aa57600080fd5b813591602081013591810190606081016040820135600160201b8111156105d057600080fd5b8201836020820111156105e257600080fd5b803590602001918460208302840111600160201b8311171561060357600080fd5b91935091506001600160a01b0381351690602001356115a0565b34801561062957600080fd5b50610384600480360360a081101561064057600080fd5b813591602081013591810190606081016040820135600160201b81111561066657600080fd5b82018360208201111561067857600080fd5b803590602001918460208302840111600160201b8311171561069957600080fd5b91935091506001600160a01b038135169060200135611733565b3480156106bf57600080fd5b506102a960048036036101408110156106d757600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356118e9565b34801561073257600080fd5b50610200600480360360a081101561074957600080fd5b813591602081013591810190606081016040820135600160201b81111561076f57600080fd5b82018360208201111561078157600080fd5b803590602001918460208302840111600160201b831117156107a257600080fd5b91935091506001600160a01b038135169060200135611a24565b3480156107c857600080fd5b50610200600480360360a08110156107df57600080fd5b813591602081013591810190606081016040820135600160201b81111561080557600080fd5b82018360208201111561081757600080fd5b803590602001918460208302840111600160201b8311171561083857600080fd5b91935091506001600160a01b038135169060200135611d09565b6103846004803603608081101561086857600080fd5b81359190810190604081016020820135600160201b81111561088957600080fd5b82018360208201111561089b57600080fd5b803590602001918460208302840111600160201b831117156108bc57600080fd5b91935091506001600160a01b038135169060200135611f93565b3480156108e257600080fd5b506102a9600480360360608110156108f957600080fd5b50803590602081013590604001356122c0565b34801561091857600080fd5b50610384600480360360a081101561092f57600080fd5b813591602081013591810190606081016040820135600160201b81111561095557600080fd5b82018360208201111561096757600080fd5b803590602001918460208302840111600160201b8311171561098857600080fd5b91935091506001600160a01b0381351690602001356122cd565b3480156109ae57600080fd5b506109b761240e565b604080516001600160a01b039092168252519081900360200190f35b3480156109df57600080fd5b506102a9600480360360608110156109f657600080fd5b508035906020810135906040013561241d565b348015610a1557600080fd5b506102a9600480360360c0811015610a2c57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a0013561242a565b61020060048036036080811015610a7257600080fd5b81359190810190604081016020820135600160201b811115610a9357600080fd5b820183602082011115610aa557600080fd5b803590602001918460208302840111600160201b83111715610ac657600080fd5b91935091506001600160a01b0381351690602001356125db565b348015610aec57600080fd5b5061025a600480360360e0811015610b0357600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612957565b348015610b4957600080fd5b506109b7612be2565b348015610b5e57600080fd5b5061020060048036036020811015610b7557600080fd5b50356001600160a01b0316612bf1565b348015610b9157600080fd5b5061038460048036036040811015610ba857600080fd5b81359190810190604081016020820135600160201b811115610bc957600080fd5b820183602082011115610bdb57600080fd5b803590602001918460208302840111600160201b83111715610bfc57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612c62945050505050565b348015610c4657600080fd5b5061020060048036036020811015610c5d57600080fd5b50356001600160a01b0316612c7c565b348015610c7957600080fd5b5061025a6004803603610140811015610c9157600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135612cea565b348015610cec57600080fd5b5061040760048036036020811015610d0357600080fd5b50356001600160a01b0316612e42565b348015610d1f57600080fd5b50610d756004803603610100811015610d3757600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135612e57565b60408051938452602084019290925282820152519081900360600190f35b610d75600480360360c0811015610da957600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135613049565b348015610de557600080fd5b5061020060048036036020811015610dfc57600080fd5b50356001600160a01b03166132e3565b348015610e1857600080fd5b506109b7613354565b61038460048036036080811015610e3757600080fd5b81359190810190604081016020820135600160201b811115610e5857600080fd5b820183602082011115610e6a57600080fd5b803590602001918460208302840111600160201b83111715610e8b57600080fd5b91935091506001600160a01b038135169060200135613363565b6000808242811015610eec576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001600160a01b03851660009081526003602052604090205460ff1615610f48576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b600154610f64908a906001600160a01b03168a8a8a308a612957565b9093509150610f748986856136bf565b60015460408051632e1a7d4d60e01b81526004810185905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b158015610fc157600080fd5b505af1158015610fd5573d6000803e3d6000fd5b50505050610fe38583613813565b50965096945050505050565b6000610ffc84848461390b565b949350505050565b6002546001600160a01b03163314611051576040805162461bcd60e51b81526020600482018190526024820152600080516020614b62833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152600460205260409020805460ff19169055565b606081428110156110b8576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001546001600160a01b0316868660001981018181106110d457fe5b905060200201356001600160a01b03166001600160a01b03161461112d576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a19833981519152604482015290519081900360640190fd5b6001600160a01b03841660009081526003602052604090205460ff1615611189576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b60005460408051602080890282810182019093528882526111d3936001600160a01b0316928c92918b918b918291908501908490808284376000920191909152506139fb92505050565b915086826001845103815181106111e657fe5b6020026020010151101561122b5760405162461bcd60e51b815260040180806020018281038252602a815260200180614b82602a913960400191505060405180910390fd5b6112bd8686600081811061123b57fe5b905060200201356001600160a01b0316336112a36000809054906101000a90046001600160a01b03168a8a600081811061127157fe5b905060200201356001600160a01b03168b8b600181811061128e57fe5b905060200201356001600160a01b0316613b47565b856000815181106112b057fe5b6020026020010151613c07565b6112fc82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613d64915050565b60015482516001600160a01b0390911690632e1a7d4d908490600019810190811061132357fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561136157600080fd5b505af1158015611375573d6000803e3d6000fd5b5050505061139a848360018551038151811061138d57fe5b6020026020010151613813565b509695505050505050565b60036020526000908152604090205460ff1681565b6000546060906113d4906001600160a01b03168484613f87565b90505b92915050565b6001600160a01b038616600090815260036020526040812054819060ff161561143b576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b60008054611453906001600160a01b03168f8f613b47565b9050600087611462578c611466565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156114dc57600080fd5b505af11580156114f0573d6000803e3d6000fd5b505050506115038f8f8f8f8f8f8f612957565b809450819550505050509b509b9950505050505050505050565b6002546001600160a01b0316331461156a576040805162461bcd60e51b81526020600482018190526024820152600080516020614b62833981519152604482015290519081900360640190fd5b6001600160a01b039091166000908152600560209081526040808320805460ff1916600117905560069091529020429091019055565b606081428110156115e6576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001600160a01b03841660009081526003602052604090205460ff1615611642576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b600054604080516020808902828101820190935288825261168c936001600160a01b0316928c92918b918b918291908501908490808284376000920191909152506139fb92505050565b9150868260018451038151811061169f57fe5b602002602001015110156116e45760405162461bcd60e51b815260040180806020018281038252602a815260200180614b82602a913960400191505060405180910390fd5b6116f48686600081811061123b57fe5b61139a82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613d64915050565b60608142811015611779576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001546001600160a01b03168686600019810181811061179557fe5b905060200201356001600160a01b03166001600160a01b0316146117ee576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a19833981519152604482015290519081900360640190fd5b6001600160a01b03841660009081526003602052604090205460ff161561184a576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b6000546040805160208089028281018201909352888252611894936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250613f8792505050565b915086826000815181106118a457fe5b6020026020010151111561122b5760405162461bcd60e51b8152600401808060200182810382526026815260200180614bcc6026913960400191505060405180910390fd5b6001600160a01b03861660009081526003602052604081205460ff1615611945576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b60008054600154611964916001600160a01b03908116918f9116613b47565b9050600086611973578b611977565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156119ed57600080fd5b505af1158015611a01573d6000803e3d6000fd5b50505050611a138d8d8d8d8d8d61242a565b9d9c50505050505050505050505050565b8042811015611a68576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001600160a01b03831660009081526003602052604090205460ff1615611ac4576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b611b2d85856000818110611ad457fe5b905060200201356001600160a01b031633611b276000809054906101000a90046001600160a01b031689896000818110611b0a57fe5b905060200201356001600160a01b03168a8a600181811061128e57fe5b8a613c07565b600085856000198101818110611b3f57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611ba457600080fd5b505afa158015611bb8573d6000803e3d6000fd5b505050506040513d6020811015611bce57600080fd5b50516040805160208881028281018201909352888252929350611c109290918991899182918501908490808284376000920191909152508892506140bf915050565b86611cc28288886000198101818110611c2557fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611c8a57600080fd5b505afa158015611c9e573d6000803e3d6000fd5b505050506040513d6020811015611cb457600080fd5b50519063ffffffff6143a716565b1015611cff5760405162461bcd60e51b815260040180806020018281038252602a815260200180614b82602a913960400191505060405180910390fd5b5050505050505050565b8042811015611d4d576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001600160a01b03831660009081526003602052604090205460ff1615611da9576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b6001546001600160a01b031685856000198101818110611dc557fe5b905060200201356001600160a01b03166001600160a01b031614611e1e576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a19833981519152604482015290519081900360640190fd5b611e2e85856000818110611ad457fe5b611e6c8585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506140bf915050565b600154604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015611eb757600080fd5b505afa158015611ecb573d6000803e3d6000fd5b505050506040513d6020811015611ee157600080fd5b5051905086811015611f245760405162461bcd60e51b815260040180806020018281038252602a815260200180614b82602a913960400191505060405180910390fd5b60015460408051632e1a7d4d60e01b81526004810184905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b158015611f7157600080fd5b505af1158015611f85573d6000803e3d6000fd5b50505050611cff8482613813565b60608142811015611fd9576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001546001600160a01b03168686600081611ff057fe5b905060200201356001600160a01b03166001600160a01b031614612049576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a19833981519152604482015290519081900360640190fd5b6001600160a01b03841660009081526003602052604090205460ff16156120a5576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b60005460408051602080890282810182019093528882526120ef936001600160a01b0316923492918b918b918291908501908490808284376000920191909152506139fb92505050565b9150868260018451038151811061210257fe5b602002602001015110156121475760405162461bcd60e51b815260040180806020018281038252602a815260200180614b82602a913960400191505060405180910390fd5b60015482516001600160a01b039091169063d0e30db090849060009061216957fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561219c57600080fd5b505af11580156121b0573d6000803e3d6000fd5b5050600154600080546001600160a01b03928316955063a9059cbb94506121e19350909116908a908a9081611b0a57fe5b846000815181106121ee57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561224557600080fd5b505af1158015612259573d6000803e3d6000fd5b505050506040513d602081101561226f57600080fd5b505161227757fe5b6122b682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613d64915050565b5095945050505050565b6000610ffc8484846143f7565b60608142811015612313576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001600160a01b03841660009081526003602052604090205460ff161561236f576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b60005460408051602080890282810182019093528882526123b9936001600160a01b0316928c92918b918b91829190850190849080828437600092019190915250613f8792505050565b915086826000815181106123c957fe5b602002602001015111156116e45760405162461bcd60e51b8152600401808060200182810382526026815260200180614bcc6026913960400191505060405180910390fd5b6001546001600160a01b031681565b6000610ffc8484846144e7565b60008142811015612470576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001600160a01b03841660009081526003602052604090205460ff16156124cc576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b6001546124e89089906001600160a01b03168989893089612957565b604080516370a0823160e01b8152306004820152905191945061256c92508a9187916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561253b57600080fd5b505afa15801561254f573d6000803e3d6000fd5b505050506040513d602081101561256557600080fd5b50516136bf565b60015460408051632e1a7d4d60e01b81526004810185905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b1580156125b957600080fd5b505af11580156125cd573d6000803e3d6000fd5b5050505061139a8483613813565b804281101561261f576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001600160a01b03831660009081526003602052604090205460ff161561267b576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b6001546001600160a01b0316858560008161269257fe5b905060200201356001600160a01b03166001600160a01b0316146126eb576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a19833981519152604482015290519081900360640190fd5b60015460408051630d0e30db60e41b8152905134926001600160a01b03169163d0e30db091849160048082019260009290919082900301818588803b15801561273357600080fd5b505af1158015612747573d6000803e3d6000fd5b5050600154600080546001600160a01b03928316955063a9059cbb94506127789350909116908a908a9081611b0a57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156127c857600080fd5b505af11580156127dc573d6000803e3d6000fd5b505050506040513d60208110156127f257600080fd5b50516127fa57fe5b60008686600019810181811061280c57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561287157600080fd5b505afa158015612885573d6000803e3d6000fd5b505050506040513d602081101561289b57600080fd5b505160408051602089810282810182019093528982529293506128dd9290918a918a9182918501908490808284376000920191909152508992506140bf915050565b87611cc282898960001981018181106128f257fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611c8a57600080fd5b600080824281101561299e576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001600160a01b03851660009081526003602052604090205460ff16156129fa576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b60008054612a12906001600160a01b03168c8c613b47565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b158015612a6d57600080fd5b505af1158015612a81573d6000803e3d6000fd5b505050506040513d6020811015612a9757600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b158015612ae457600080fd5b505af1158015612af8573d6000803e3d6000fd5b505050506040513d6040811015612b0e57600080fd5b50805160209091015190925090506000612b288e8e614593565b509050806001600160a01b03168e6001600160a01b031614612b4b578183612b4e565b82825b90975095508a871015612b925760405162461bcd60e51b8152600401808060200182810382526025815260200180614c646025913960400191505060405180910390fd5b89861015612bd15760405162461bcd60e51b8152600401808060200182810382526025815260200180614bf26025913960400191505060405180910390fd5b505050505097509795505050505050565b6000546001600160a01b031681565b6002546001600160a01b03163314612c3e576040805162461bcd60e51b81526020600482018190526024820152600080516020614b62833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b6000546060906113d4906001600160a01b031684846139fb565b6002546001600160a01b03163314612cc9576040805162461bcd60e51b81526020600482018190526024820152600080516020614b62833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152600360205260409020805460ff19169055565b6001600160a01b038616600090815260036020526040812054819060ff1615612d48576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b6000612d7e6000809054906101000a90046001600160a01b03168e600160009054906101000a90046001600160a01b0316613b47565b9050600087612d8d578c612d91565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b158015612e0757600080fd5b505af1158015612e1b573d6000803e3d6000fd5b50505050612e2d8e8e8e8e8e8e610ea5565b909f909e509c50505050505050505050505050565b60046020526000908152604090205460ff1681565b60008060008342811015612ea0576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001600160a01b03861660009081526003602052604090205460ff1615612efc576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b6001600160a01b03861660009081526004602052604090205460ff16612f69576040805162461bcd60e51b815260206004820152601c60248201527f57616974696e6720666f7220706172746e657220617070726f76616c00000000604482015290519081900360640190fd5b612f778c8c8c8c8c8c614671565b6000805492965090945090612f96906001600160a01b03168e8e613b47565b9050612fa48d338388613c07565b612fb08c338387613c07565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561300857600080fd5b505af115801561301c573d6000803e3d6000fd5b505050506040513d602081101561303257600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015613092576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001546130ad908b906001600160a01b03168b348c8c614671565b6001600160a01b038816600090815260046020526040902054919550935060ff1661311f576040805162461bcd60e51b815260206004820152601c60248201527f57616974696e6720666f7220706172746e657220617070726f76616c00000000604482015290519081900360640190fd5b6000805460015461313e916001600160a01b03908116918e9116613b47565b905061314c8b338388613c07565b600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561319c57600080fd5b505af11580156131b0573d6000803e3d6000fd5b50506001546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018b9052915191909216945063a9059cbb9350604480830193506020928290030181600087803b15801561320957600080fd5b505af115801561321d573d6000803e3d6000fd5b505050506040513d602081101561323357600080fd5b505161323b57fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561329357600080fd5b505af11580156132a7573d6000803e3d6000fd5b505050506040513d60208110156132bd57600080fd5b50519250348410156132d5576132d533853403613813565b505096509650969350505050565b6002546001600160a01b03163314613330576040805162461bcd60e51b81526020600482018190526024820152600080516020614b62833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152600360205260409020805460ff19166001179055565b6002546001600160a01b031681565b606081428110156133a9576040805162461bcd60e51b81526020600482015260176024820152600080516020614c44833981519152604482015290519081900360640190fd5b6001546001600160a01b031686866000816133c057fe5b905060200201356001600160a01b03166001600160a01b031614613419576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a19833981519152604482015290519081900360640190fd5b6001600160a01b03841660009081526003602052604090205460ff1615613475576040805162461bcd60e51b81526020600482015260166024820152600080516020614bac833981519152604482015290519081900360640190fd5b60005460408051602080890282810182019093528882526134bf936001600160a01b0316928b92918b918b91829190850190849080828437600092019190915250613f8792505050565b915034826000815181106134cf57fe5b602002602001015111156135145760405162461bcd60e51b8152600401808060200182810382526026815260200180614bcc6026913960400191505060405180910390fd5b60015482516001600160a01b039091169063d0e30db090849060009061353657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561356957600080fd5b505af115801561357d573d6000803e3d6000fd5b5050600154600080546001600160a01b03928316955063a9059cbb94506135ae9350909116908a908a9081611b0a57fe5b846000815181106135bb57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561361257600080fd5b505af1158015613626573d6000803e3d6000fd5b505050506040513d602081101561363c57600080fd5b505161364457fe5b61368382878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613d64915050565b8160008151811061369057fe5b60200260200101513411156122b6576122b633836000815181106136b057fe5b60200260200101513403613813565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b6020831061373c5780518252601f19909201916020918201910161371d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461379e576040519150601f19603f3d011682016040523d82523d6000602084013e6137a3565b606091505b50915091508180156137d15750805115806137d157508080602001905160208110156137ce57600080fd5b50515b61380c5760405162461bcd60e51b815260040180806020018281038252602d815260200180614c17602d913960400191505060405180910390fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b6020831061385f5780518252601f199092019160209182019101613840565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146138c1576040519150601f19603f3d011682016040523d82523d6000602084013e6138c6565b606091505b50509050806139065760405162461bcd60e51b8152600401808060200182810382526034815260200180614a8e6034913960400191505060405180910390fd5b505050565b600080841161394b5760405162461bcd60e51b815260040180806020018281038252602a815260200180614ae9602a913960400191505060405180910390fd5b60008311801561395b5750600082115b6139965760405162461bcd60e51b8152600401808060200182810382526027815260200180614ac26027913960400191505060405180910390fd5b60006139aa856103e663ffffffff61489316565b905060006139be828563ffffffff61489316565b905060006139e4836139d8886103e863ffffffff61489316565b9063ffffffff6148f616565b90508082816139ef57fe5b04979650505050505050565b6060600282511015613a54576040805162461bcd60e51b815260206004820152601d60248201527f53616665737761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613a6c57600080fd5b50604051908082528060200260200182016040528015613a96578160200160208202803683370190505b5090508281600081518110613aa757fe5b60200260200101818152505060005b6001835103811015613b3f57600080613af987868581518110613ad557fe5b6020026020010151878660010181518110613aec57fe5b6020026020010151614945565b91509150613b1b848481518110613b0c57fe5b6020026020010151838361390b565b848460010181518110613b2a57fe5b60209081029190910101525050600101613ab6565b509392505050565b6000806000613b568585614593565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f8bc8f8336dcfcba44096a139671d89637695b1be1cf88aad5d7de56ae35b8bfd609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b60208310613c8c5780518252601f199092019160209182019101613c6d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613cee576040519150601f19603f3d011682016040523d82523d6000602084013e613cf3565b606091505b5091509150818015613d21575080511580613d215750808060200190516020811015613d1e57600080fd5b50515b613d5c5760405162461bcd60e51b8152600401808060200182810382526031815260200180614a5d6031913960400191505060405180910390fd5b505050505050565b60005b6001835103811015613f8157600080848381518110613d8257fe5b6020026020010151858460010181518110613d9957fe5b6020026020010151915091506000613db18383614593565b5090506000878560010181518110613dc557fe5b60200260200101519050600080836001600160a01b0316866001600160a01b031614613df357826000613df7565b6000835b91509150600060028a51038810613e0e5788613e3f565b6000548a51613e3f916001600160a01b03169088908d9060028d01908110613e3257fe5b6020026020010151613b47565b600054909150613e59906001600160a01b03168888613b47565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613e96576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613f07578181015183820152602001613eef565b50505050905090810190601f168015613f345780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613f5657600080fd5b505af1158015613f6a573d6000803e3d6000fd5b505060019099019850613d67975050505050505050565b50505050565b6060600282511015613fe0576040805162461bcd60e51b815260206004820152601d60248201527f53616665737761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613ff857600080fd5b50604051908082528060200260200182016040528015614022578160200160208202803683370190505b509050828160018351038151811061403657fe5b60209081029190910101528151600019015b8015613b3f576000806140788786600186038151811061406457fe5b6020026020010151878681518110613aec57fe5b9150915061409a84848151811061408b57fe5b602002602001015183836143f7565b8460018503815181106140a957fe5b6020908102919091010152505060001901614048565b60005b6001835103811015613906576000808483815181106140dd57fe5b60200260200101518584600101815181106140f457fe5b602002602001015191509150600061410c8383614593565b506000805491925090614129906001600160a01b03168585613b47565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561416a57600080fd5b505afa15801561417e573d6000803e3d6000fd5b505050506040513d606081101561419457600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a8116908916146141ca5782846141cd565b83835b9150915061422b828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611c8a57600080fd5b955061423886838361390b565b945050505050600080856001600160a01b0316886001600160a01b03161461426257826000614266565b6000835b91509150600060028c51038a1061427d578a6142a1565b6000548c516142a1916001600160a01b0316908a908f9060028f01908110613e3257fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b8381101561432b578181015183820152602001614313565b50505050905090810190601f1680156143585780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561437a57600080fd5b505af115801561438e573d6000803e3d6000fd5b50506001909b019a506140c29950505050505050505050565b808203828111156113d7576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b60008084116144375760405162461bcd60e51b815260040180806020018281038252602b815260200180614b37602b913960400191505060405180910390fd5b6000831180156144475750600082115b6144825760405162461bcd60e51b8152600401808060200182810382526027815260200180614ac26027913960400191505060405180910390fd5b60006144a66103e861449a868863ffffffff61489316565b9063ffffffff61489316565b905060006144c06103e661449a868963ffffffff6143a716565b90506144dd60018284816144d057fe5b049063ffffffff6148f616565b9695505050505050565b60008084116145275760405162461bcd60e51b8152600401808060200182810382526024815260200180614b136024913960400191505060405180910390fd5b6000831180156145375750600082115b6145725760405162461bcd60e51b8152600401808060200182810382526027815260200180614ac26027913960400191505060405180910390fd5b82614583858463ffffffff61489316565b8161458a57fe5b04949350505050565b600080826001600160a01b0316846001600160a01b031614156145e75760405162461bcd60e51b8152600401808060200182810382526024815260200180614a396024913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b03161061460757828461460a565b83835b90925090506001600160a01b03821661466a576040805162461bcd60e51b815260206004820152601d60248201527f53616665737761704c6962726172793a205a45524f5f41444452455353000000604482015290519081900360640190fd5b9250929050565b600080546040805163e6a4390560e01b81526001600160a01b038a811660048301528981166024830152915184938493169163e6a43905916044808301926020929190829003018186803b1580156146c857600080fd5b505afa1580156146dc573d6000803e3d6000fd5b505050506040513d60208110156146f257600080fd5b50516001600160a01b0316141561478a5760008054604080516364e329cb60e11b81526001600160a01b038c811660048301528b811660248301529151919092169263c9c6539692604480820193602093909283900390910190829087803b15801561475d57600080fd5b505af1158015614771573d6000803e3d6000fd5b505050506040513d602081101561478757600080fd5b50505b6000805481906147a4906001600160a01b03168b8b614945565b915091508160001480156147b6575080155b156147c657879350869250614886565b60006147d38984846144e7565b9050878111614826578581101561481b5760405162461bcd60e51b8152600401808060200182810382526025815260200180614bf26025913960400191505060405180910390fd5b889450925082614884565b60006148338984866144e7565b90508981111561483f57fe5b8781101561487e5760405162461bcd60e51b8152600401808060200182810382526025815260200180614c646025913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806148ae575050808202828282816148ab57fe5b04145b6113d7576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b808201828110156113d7576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60008060006149548585614593565b509050614962868686613b47565b50600080614971888888613b47565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156149a957600080fd5b505afa1580156149bd573d6000803e3d6000fd5b505050506040513d60608110156149d357600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b0387811690841614614a06578082614a09565b81815b9099909850965050505050505056fe5361666573776170526f757465723a20494e56414c49445f504154480000000053616665737761704c6962726172793a204944454e544943414c5f4144445245535345535472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c65645472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c656453616665737761704c6962726172793a20494e53554646494349454e545f4c495155494449545953616665737761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e5453616665737761704c6962726172793a20494e53554646494349454e545f414d4f554e5453616665737761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e544f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666573776170526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e544164647265737320697320626c61636b6c6973746564000000000000000000005361666573776170526f757465723a204558434553534956455f494e5055545f414d4f554e545361666573776170526f757465723a20494e53554646494349454e545f425f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c65645361666573776170526f757465723a20455850495245440000000000000000005361666573776170526f757465723a20494e53554646494349454e545f415f414d4f554e54a2646970667358221220d99dc9e1328620067116e74feef04ed4c4a0d92910ae8d6a5ba310fa5dc977ce64736f6c63430006060033

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

0000000000000000000000009cf2f35e3656d4c68474525d67d9459da3a000cd000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2

-----Decoded View---------------
Arg [0] : _factory (address): 0x9Cf2f35E3656D4C68474525d67D9459Da3A000CD
Arg [1] : _WETH (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000009cf2f35e3656d4c68474525d67d9459da3a000cd
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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