ETH Price: $2,524.33 (+0.22%)

Contract

0xFF0e9437818258BDEdd1aA374095968ABC82a9E2
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Swap Exact Token...177671052023-07-25 2:22:11403 days ago1690251731IN
0xFF0e9437...ABC82a9E2
0 ETH0.0046910827.48162384
Swap Exact ETH F...177651322023-07-24 19:45:35403 days ago1690227935IN
0xFF0e9437...ABC82a9E2
0.54 ETH0.0062513136.509148
Swap Exact Token...176964912023-07-15 4:40:23412 days ago1689396023IN
0xFF0e9437...ABC82a9E2
0 ETH0.0020441411.97511647
Swap Exact ETH F...176750672023-07-12 4:18:47416 days ago1689135527IN
0xFF0e9437...ABC82a9E2
0.0001 ETH0.0022930213.39180425
Remove Liquidity...175781172023-06-28 13:28:47429 days ago1687958927IN
0xFF0e9437...ABC82a9E2
0 ETH0.003155115.4814311
Swap Exact ETH F...175091052023-06-18 20:41:47439 days ago1687120907IN
0xFF0e9437...ABC82a9E2
0.01046575 ETH0.0023967513.99762681
Swap Exact Token...174977462023-06-17 6:28:35440 days ago1686983315IN
0xFF0e9437...ABC82a9E2
0 ETH0.0027520216.11981201
Swap Exact ETH F...174956522023-06-16 23:26:23441 days ago1686957983IN
0xFF0e9437...ABC82a9E2
0.15 ETH0.0029273818.99343605
Swap Exact ETH F...174956492023-06-16 23:25:47441 days ago1686957947IN
0xFF0e9437...ABC82a9E2
0.15 ETH0.0034123419.92888447
Remove Liquidity...174918722023-06-16 10:41:23441 days ago1686912083IN
0xFF0e9437...ABC82a9E2
0 ETH0.002955414.50155268
Swap Exact ETH F...174896462023-06-16 3:11:35442 days ago1686885095IN
0xFF0e9437...ABC82a9E2
0.229488 ETH0.0026580815.52384353
Swap Exact Token...174615062023-06-12 4:07:35446 days ago1686542855IN
0xFF0e9437...ABC82a9E2
0 ETH0.0024266814.21517946
Swap Exact Token...174477452023-06-10 5:37:23447 days ago1686375443IN
0xFF0e9437...ABC82a9E2
0 ETH0.0063413537.15192773
Swap Exact Token...174296412023-06-07 16:20:35450 days ago1686154835IN
0xFF0e9437...ABC82a9E2
0 ETH0.0050629929.66035801
Swap Exact Token...174275642023-06-07 9:19:23450 days ago1686129563IN
0xFF0e9437...ABC82a9E2
0 ETH0.0035701120.91320305
Swap Exact Token...173469032023-05-27 0:42:47462 days ago1685148167IN
0xFF0e9437...ABC82a9E2
0 ETH0.0040013324.12083554
Remove Liquidity...173207622023-05-23 8:30:23465 days ago1684830623IN
0xFF0e9437...ABC82a9E2
0 ETH0.0113572755.72784519
Add Liquidity ET...173093422023-05-21 17:52:47467 days ago1684691567IN
0xFF0e9437...ABC82a9E2
0.00633928 ETH0.0094479355.84445793
Swap Exact Token...173010562023-05-20 13:53:11468 days ago1684590791IN
0xFF0e9437...ABC82a9E2
0 ETH0.0057944233.94287077
Remove Liquidity...172950352023-05-19 17:31:59469 days ago1684517519IN
0xFF0e9437...ABC82a9E2
0 ETH0.0089638343.98584545
Swap Exact Token...172500032023-05-13 8:54:47475 days ago1683968087IN
0xFF0e9437...ABC82a9E2
0 ETH0.0062963136.88550758
Swap Exact Token...171998372023-05-06 6:41:47482 days ago1683355307IN
0xFF0e9437...ABC82a9E2
0 ETH0.02343761137.29413255
Swap Exact Token...171956152023-05-05 16:26:59483 days ago1683304019IN
0xFF0e9437...ABC82a9E2
0 ETH0.03459881202.70329264
Swap Exact Token...171809962023-05-03 15:11:59485 days ago1683126719IN
0xFF0e9437...ABC82a9E2
0 ETH0.0139023381.44358613
Swap Exact Token...171806432023-05-03 13:58:47485 days ago1683122327IN
0xFF0e9437...ABC82a9E2
0 ETH0.0118149969.20565179
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
203851272024-07-25 17:42:3536 days ago1721929355
0xFF0e9437...ABC82a9E2
0.09291867 ETH
203851272024-07-25 17:42:3536 days ago1721929355
0xFF0e9437...ABC82a9E2
0.09291867 ETH
193333132024-02-29 12:56:47183 days ago1709211407
0xFF0e9437...ABC82a9E2
0.4658389 ETH
193333132024-02-29 12:56:47183 days ago1709211407
0xFF0e9437...ABC82a9E2
0.4658389 ETH
191017322024-01-28 1:21:23216 days ago1706404883
0xFF0e9437...ABC82a9E2
0.24183814 ETH
191017322024-01-28 1:21:23216 days ago1706404883
0xFF0e9437...ABC82a9E2
0.24183814 ETH
190509952024-01-20 22:16:11223 days ago1705788971
0xFF0e9437...ABC82a9E2
0.03768471 ETH
190509952024-01-20 22:16:11223 days ago1705788971
0xFF0e9437...ABC82a9E2
0.03768471 ETH
187188912023-12-05 8:15:35269 days ago1701764135
0xFF0e9437...ABC82a9E2
0.37732653 ETH
187188912023-12-05 8:15:35269 days ago1701764135
0xFF0e9437...ABC82a9E2
0.37732653 ETH
186020072023-11-18 23:32:23286 days ago1700350343
0xFF0e9437...ABC82a9E2
0.23654113 ETH
186020072023-11-18 23:32:23286 days ago1700350343
0xFF0e9437...ABC82a9E2
0.23654113 ETH
184679532023-10-31 5:13:35304 days ago1698729215
0xFF0e9437...ABC82a9E2
0.24209062 ETH
184679532023-10-31 5:13:35304 days ago1698729215
0xFF0e9437...ABC82a9E2
0.24209062 ETH
184244352023-10-25 2:58:35311 days ago1698202715
0xFF0e9437...ABC82a9E2
0.16948593 ETH
184244352023-10-25 2:58:35311 days ago1698202715
0xFF0e9437...ABC82a9E2
0.16948593 ETH
183463052023-10-14 4:40:59321 days ago1697258459
0xFF0e9437...ABC82a9E2
0.11459375 ETH
183463052023-10-14 4:40:59321 days ago1697258459
0xFF0e9437...ABC82a9E2
0.11459375 ETH
183377082023-10-12 23:47:35323 days ago1697154455
0xFF0e9437...ABC82a9E2
0.11175395 ETH
183377082023-10-12 23:47:35323 days ago1697154455
0xFF0e9437...ABC82a9E2
0.11175395 ETH
180242982023-08-30 1:59:11367 days ago1693360751
0xFF0e9437...ABC82a9E2
0.00236141 ETH
180242982023-08-30 1:59:11367 days ago1693360751
0xFF0e9437...ABC82a9E2
0.00236141 ETH
180242982023-08-30 1:59:11367 days ago1693360751
0xFF0e9437...ABC82a9E2
0.45399529 ETH
180242982023-08-30 1:59:11367 days ago1693360751
0xFF0e9437...ABC82a9E2
0.45399529 ETH
179168312023-08-15 1:01:23382 days ago1692061283
0xFF0e9437...ABC82a9E2
0.21185142 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
UniswapV2Router02

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 11 : UniswapV2Router02.sol
pragma solidity =0.6.6;

// import '@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol';
import './interfaces/IUniswapV2Pair.sol';
import './interfaces/IUniswapV2Factory.sol';
import '@uniswap/lib/contracts/libraries/TransferHelper.sol';

import './interfaces/IUniswapV2Router02.sol';
import './libraries/UniswapV2Library.sol';
import './libraries/SafeMath.sol';
import './interfaces/IERC20.sol';
import './interfaces/IWETH.sol';

contract UniswapV2Router02 is IUniswapV2Router02 {
    using SafeMath for uint256;
    // string public name = 'PolkaBridgeAMM: Router';
    address public immutable override factory;
    address public immutable override WETH;
    // address public owner;
    // string public debugStr;

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

    // modifier onlyOwner() {
    //     require(msg.sender == owner, 'Only Owner');
    //     _;
    // }
    constructor(address _factory, address _WETH) public {
        factory = _factory;
        WETH = _WETH;
        // owner = msg.sender;
    }

    receive() external payable {
        require(msg.sender == WETH, 'transfer ETH from unexpected sender'); // only accept ETH via fallback from the WETH contract
    }

    // function transferOwnership(address _new_owner) public onlyOwner {
    //     owner = _new_owner;
    // }

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin
    ) internal virtual returns (uint256 amountA, uint256 amountB) {
        // create the pair if it doesn't exist yet
        if (IUniswapV2Factory(factory).getPair(tokenA, tokenB) == address(0)) {
            IUniswapV2Factory(factory).createPair(tokenA, tokenB);
        }
        (uint256 reserveA, uint256 reserveB) = UniswapV2Library.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint256 amountBOptimal = UniswapV2Library.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'UniswapV2Router: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint256 amountAOptimal = UniswapV2Library.quote(amountBDesired, reserveB, reserveA);
                require(amountAOptimal <= amountADesired, 'amountA should less or equal than amountB'); // assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'UniswapV2Router: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        )
    {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);

        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IUniswapV2Pair(pair).mint(to);
    }

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        virtual
        override
        ensure(deadline)
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        )
    {
        (amountToken, amountETH) = _addLiquidity(
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = UniswapV2Library.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        require(IWETH(WETH).transfer(pair, amountETH), 'WETH transfer failed in addLiquidityETH'); // assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = IUniswapV2Pair(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,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) public virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) {
        address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
        bool bTransfered = IUniswapV2Pair(pair).transferFrom(msg.sender, pair, liquidity);
        require(bTransfered, 'Failed in sending liquidity to pair'); // send liquidity to pair
        (uint256 amount0, uint256 amount1) = IUniswapV2Pair(pair).burn(to);
        (address token0, ) = UniswapV2Library.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'UniswapV2Router: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'UniswapV2Router: INSUFFICIENT_B_AMOUNT');
    }

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountETH) {
        (amountToken, 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 removeLiquidityWithPermit(
    //     address tokenA,
    //     address tokenB,
    //     uint256 liquidity,
    //     uint256 amountAMin,
    //     uint256 amountBMin,
    //     address to,
    //     uint256 deadline,
    //     bool approveMax,
    //     uint8 v,
    //     bytes32 r,
    //     bytes32 s
    // ) external virtual override returns (uint256 amountA, uint256 amountB) {
    //     address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
    //     uint256 value = approveMax ? uint256(-1) : liquidity;
    //     IUniswapV2Pair(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,
    //     uint256 liquidity,
    //     uint256 amountTokenMin,
    //     uint256 amountETHMin,
    //     address to,
    //     uint256 deadline,
    //     bool approveMax,
    //     uint8 v,
    //     bytes32 r,
    //     bytes32 s
    // ) external virtual override returns (uint256 amountToken, uint256 amountETH) {
    //     address pair = UniswapV2Library.pairFor(factory, token, WETH);
    //     uint256 value = approveMax ? uint256(-1) : liquidity;
    //     IUniswapV2Pair(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,
    //     uint256 liquidity,
    //     uint256 amountTokenMin,
    //     uint256 amountETHMin,
    //     address to,
    //     uint256 deadline
    // ) public virtual override ensure(deadline) returns (uint256 amountETH) {
    //     // (, 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);
    //     (, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
    // }

    // function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
    //     address token,
    //     uint256 liquidity,
    //     uint256 amountTokenMin,
    //     uint256 amountETHMin,
    //     address to,
    //     uint256 deadline,
    //     bool approveMax,
    //     uint8 v,
    //     bytes32 r,
    //     bytes32 s
    // ) external virtual override returns (uint256 amountETH) {
    //     address pair = UniswapV2Library.pairFor(factory, token, WETH);
    //     uint256 value = approveMax ? uint256(-1) : liquidity;
    //     IUniswapV2Pair(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(
        uint256[] memory amounts,
        address[] memory path,
        address _to
    ) internal virtual {
        for (uint256 i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = UniswapV2Library.sortTokens(input, output);
            uint256 amountOut = amounts[i + 1];
            (uint256 amount0Out, uint256 amount1Out) = input == token0
                ? (uint256(0), amountOut)
                : (amountOut, uint256(0));
            address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to;
            IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output)).swap(amount0Out, amount1Out, to);
        }
    }

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) { //returns (uint256[] memory amounts) {
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            UniswapV2Library.pairFor(factory, path[0], path[1]),
            amountIn
        );
        uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
        // amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);
        // require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        // TransferHelper.safeTransferFrom(
        //     path[0],
        //     msg.sender,
        //     UniswapV2Library.pairFor(factory, path[0], path[1]),
        //     // amounts[0]
        //     amountIn
        // );
        // _swap(amounts, path, to);
    }

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
        amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            UniswapV2Library.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, to);
    }

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable virtual override ensure(deadline) { //returns (uint256[] memory amounts) {
        require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
        uint256 amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        require(
            IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn),
            'UniswapV2Router: WETH transfer failed in swapExactETHForTokens'
        ); // assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn));
        uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
        // require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
        // amounts = UniswapV2Library.getAmountsOut(factory, msg.value, path);
        // require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        // // IWETH(WETH).deposit{value: amounts[0]}();
        // IWETH(WETH).deposit{value: msg.value}();
        // require(
        //     // IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]),
        //     IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), msg.value),
        //     'UniswapV2Router: WETH transfer failed in swapExactETHForTokens'
        // ); // assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]));
        // _swap(amounts, path, to);
    }

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
        require(path[path.length - 1] == WETH, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            UniswapV2Library.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(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) { //returns (uint256[] memory amounts) {
        require(path[path.length - 1] == WETH, 'UniswapV2Router: INVALID_PATH');
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            UniswapV2Library.pairFor(factory, path[0], path[1]),
            amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint256 amountOut = IERC20(WETH).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).withdraw(amountOut);
        TransferHelper.safeTransferETH(to, amountOut);
        // require(path[path.length - 1] == WETH, 'UniswapV2Router: INVALID_PATH');
        // amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);
        // require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
        // TransferHelper.safeTransferFrom(
        //     path[0],
        //     msg.sender,
        //     UniswapV2Library.pairFor(factory, path[0], path[1]),
        //     // amounts[0]
        //     amountIn
        // );
        // _swap(amounts, path, address(this));
        // IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        // TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) {
        require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        require(
            IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]),
            'UniswapV2Router: WETH transfer failed in swapETHForExactTokens'
        ); // assert(IWETH(WETH).transfer(UniswapV2Library.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 (uint256 i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = UniswapV2Library.sortTokens(input, output);
            IUniswapV2Pair pair = IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output));
            uint256 amountInput;
            uint256 amountOutput;
            {
                // scope to avoid stack too deep errors
                (uint256 reserve0, uint256 reserve1, ) = pair.getReserves();
                (uint256 reserveInput, uint256 reserveOutput) = input == token0
                    ? (reserve0, reserve1)
                    : (reserve1, reserve0);
                amountInput = IERC20(input).balanceOf(address(pair)).sub(reserveInput);
                amountOutput = UniswapV2Library.getAmountOut(amountInput, reserveInput, reserveOutput);
            }
            (uint256 amount0Out, uint256 amount1Out) = input == token0
                ? (uint256(0), amountOutput)
                : (amountOutput, uint256(0));
            address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to;
            pair.swap(amount0Out, amount1Out, to);
        }
    }

    // function swapExactTokensForTokensSupportingFeeOnTransferTokens(
    //     uint256 amountIn,
    //     uint256 amountOutMin,
    //     address[] calldata path,
    //     address to,
    //     uint256 deadline
    // ) external virtual override ensure(deadline) {
    //     TransferHelper.safeTransferFrom(
    //         path[0],
    //         msg.sender,
    //         UniswapV2Library.pairFor(factory, path[0], path[1]),
    //         amountIn
    //     );
    //     uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
    //     _swapSupportingFeeOnTransferTokens(path, to);
    //     require(
    //         IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
    //         'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'
    //     );
    // }

    // function swapExactETHForTokensSupportingFeeOnTransferTokens(
    //     uint256 amountOutMin,
    //     address[] calldata path,
    //     address to,
    //     uint256 deadline
    // ) external payable virtual override ensure(deadline) {
    //     require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
    //     uint256 amountIn = msg.value;
    //     IWETH(WETH).deposit{value: amountIn}();
    //     require(
    //         IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn),
    //         'UniswapV2Router: WETH transfer failed in swapExactETHForTokensSupportingFeeOnTransferTokens'
    //     ); // assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn));
    //     uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
    //     _swapSupportingFeeOnTransferTokens(path, to);
    //     require(
    //         IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
    //         'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'
    //     );
    // }

    // function swapExactTokensForETHSupportingFeeOnTransferTokens(
    //     uint256 amountIn,
    //     uint256 amountOutMin,
    //     address[] calldata path,
    //     address to,
    //     uint256 deadline
    // ) external virtual override ensure(deadline) {
    //     require(path[path.length - 1] == WETH, 'UniswapV2Router: INVALID_PATH');
    //     TransferHelper.safeTransferFrom(
    //         path[0],
    //         msg.sender,
    //         UniswapV2Library.pairFor(factory, path[0], path[1]),
    //         amountIn
    //     );
    //     _swapSupportingFeeOnTransferTokens(path, address(this));
    //     uint256 amountOut = IERC20(WETH).balanceOf(address(this));
    //     require(amountOut >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');
    //     IWETH(WETH).withdraw(amountOut);
    //     TransferHelper.safeTransferETH(to, amountOut);
    // }

    // **** LIBRARY FUNCTIONS ****
    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure virtual override returns (uint256 amountB) {
        return UniswapV2Library.quote(amountA, reserveA, reserveB);
    }

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure virtual override returns (uint256 amountOut) {
        return UniswapV2Library.getAmountOut(amountIn, reserveIn, reserveOut);
    }

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure virtual override returns (uint256 amountIn) {
        return UniswapV2Library.getAmountIn(amountOut, reserveIn, reserveOut);
    }

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        virtual
        override
        returns (uint256[] memory amounts)
    {
        return UniswapV2Library.getAmountsOut(factory, amountIn, path);
    }

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        virtual
        override
        returns (uint256[] memory amounts)
    {
        return UniswapV2Library.getAmountsIn(factory, amountOut, path);
    }
}

File 2 of 11 : UniswapV2Library.sol
pragma solidity 0.6.6;

// import '@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol';
import '../interfaces/IUniswapV2Pair.sol';

import './SafeMath.sol';

library UniswapV2Library {
    using SafeMath for uint256;

    // 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, 'UniswapV2Library: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'UniswapV2Library: 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(
            uint256(
                keccak256(
                    abi.encodePacked(
                        hex'ff',
                        factory,
                        keccak256(abi.encodePacked(token0, token1)),
                        hex'8b59d0fbd3a2da5e26f61e1d4b91f355d2c382ec32c993635b0d80dce6e1ef1c' // init code hash of factory
                    )
                )
            )
        );
    }

    // fetches and sorts the reserves for a pair
    function getReserves(
        address factory,
        address tokenA,
        address tokenB
    ) internal view returns (uint256 reserveA, uint256 reserveB) {
        (address token0, ) = sortTokens(tokenA, tokenB);
        (uint256 reserve0, uint256 reserve1, ) = IUniswapV2Pair(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(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) internal pure returns (uint256 amountB) {
        require(amountA > 0, 'UniswapV2Library: INSUFFICIENT_AMOUNT');
        require(reserveA > 0 && reserveB > 0, 'UniswapV2Library: 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(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) internal pure returns (uint256 amountOut) {
        require(amountIn > 0, 'UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
        uint256 amountInWithFee = amountIn.mul(998);
        // uint256 amountInWithFee = amountIn.mul(9984);
        uint256 numerator = amountInWithFee.mul(reserveOut);
        uint256 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(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) internal pure returns (uint256 amountIn) {
        require(amountOut > 0, 'UniswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
        // uint256 numerator = reserveIn.mul(amountOut).mul(10000);
        uint256 numerator = reserveIn.mul(amountOut).mul(1000);
        // uint256 denominator = reserveOut.sub(amountOut).mul(9984);
        uint256 denominator = reserveOut.sub(amountOut).mul(998);

        amountIn = (numerator / denominator).add(1);
    }

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

File 3 of 11 : 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');
    }
    function div(uint x, uint y) internal pure returns (uint z) {
        z = x / y;
    }
}

File 4 of 11 : 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 5 of 11 : IUniswapV2Router02.sol
pragma solidity >=0.6.2;

import './IUniswapV2Router01.sol';

interface IUniswapV2Router02 is IUniswapV2Router01 {
    // 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 6 of 11 : IUniswapV2Router01.sol
pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
    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 7 of 11 : IUniswapV2Pair.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.6;

import './IUniswapV2ERC20.sol';

interface IUniswapV2Pair is IUniswapV2ERC20 {
    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);
    // event TreasurySet(address _address);

    // function setTreasuryAddress(address _address) external;

    // 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 burnETH(address to, address to1) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to) external;
    // function skim(address to) external;
    function sync() external;    
    function initialize(address, address, address) external;
}

File 8 of 11 : IUniswapV2Factory.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.6;

interface IUniswapV2Factory {

    event PairCreated(address indexed token0, address indexed token1, address pair, uint);
    event TreasurySet(address _address);
    

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

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

}

File 9 of 11 : IUniswapV2ERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.6;

interface IUniswapV2ERC20 {
    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;
}

File 10 of 11 : IERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.6;

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 11 of 11 : 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');
    }
}

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

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":"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":"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":"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":"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":[],"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":[],"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":[],"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"},{"stateMutability":"payable","type":"receive"}]

60c060405234801561001057600080fd5b50604051613af1380380613af18339818101604052604081101561003357600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c6139ba6101376000398061011252806108ff52806109af5280610aa45280610c185280610cce5280611034528061123a528061133f52806113d4528061144852806118115280611cd25280611d285280611d5c5280611dd05280611fa552806120e85280612170525080610b535280610d6552806110c25280611196528061147a5280611712528061188e5280611ac55280611aee5280611baa5280611d06528061203852806121a252806128ce5280612a4d5280612d725280612da8528061324852806132f6528061337652506139ba6000f3fe6080604052600436106101025760003560e01c80638803dbee11610095578063c45a015511610064578063c45a0155146106d1578063d06ca61f146106e6578063e8e3370014610768578063f305d719146107e8578063fb3bdb411461082e57610170565b80638803dbee14610577578063ad5c46481461060d578063ad615dec1461063e578063baa2abde1461067457610170565b806338ed1739116100d157806338ed1739146103915780634a25d94a146104275780637ff36ab5146104bd57806385f8c2591461054157610170565b806302751cec14610175578063054d50d4146101e157806318cbafe5146102295780631f00ca74146102bf57610170565b3661017057336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461016e5760405162461bcd60e51b815260040180806020018281038252602381526020018061363a6023913960400191505060405180910390fd5b005b600080fd5b34801561018157600080fd5b506101c8600480360360c081101561019857600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a001356108b2565b6040805192835260208301919091528051918290030190f35b3480156101ed57600080fd5b506102176004803603606081101561020457600080fd5b5080359060208101359060400135610a41565b60408051918252519081900360200190f35b34801561023557600080fd5b5061016e600480360360a081101561024c57600080fd5b813591602081013591810190606081016040820135600160201b81111561027257600080fd5b82018360208201111561028457600080fd5b803590602001918460208302840111600160201b831117156102a557600080fd5b91935091506001600160a01b038135169060200135610a56565b3480156102cb57600080fd5b50610341600480360360408110156102e257600080fd5b81359190810190604081016020820135600160201b81111561030357600080fd5b82018360208201111561031557600080fd5b803590602001918460208302840111600160201b8311171561033657600080fd5b509092509050610d5e565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561037d578181015183820152602001610365565b505050509050019250505060405180910390f35b34801561039d57600080fd5b5061016e600480360360a08110156103b457600080fd5b813591602081013591810190606081016040820135600160201b8111156103da57600080fd5b8201836020820111156103ec57600080fd5b803590602001918460208302840111600160201b8311171561040d57600080fd5b91935091506001600160a01b038135169060200135610dbe565b34801561043357600080fd5b50610341600480360360a081101561044a57600080fd5b813591602081013591810190606081016040820135600160201b81111561047057600080fd5b82018360208201111561048257600080fd5b803590602001918460208302840111600160201b831117156104a357600080fd5b91935091506001600160a01b038135169060200135610fe4565b61016e600480360360808110156104d357600080fd5b81359190810190604081016020820135600160201b8111156104f457600080fd5b82018360208201111561050657600080fd5b803590602001918460208302840111600160201b8311171561052757600080fd5b91935091506001600160a01b0381351690602001356112f9565b34801561054d57600080fd5b506102176004803603606081101561056457600080fd5b50803590602081013590604001356116ba565b34801561058357600080fd5b50610341600480360360a081101561059a57600080fd5b813591602081013591810190606081016040820135600160201b8111156105c057600080fd5b8201836020820111156105d257600080fd5b803590602001918460208302840111600160201b831117156105f357600080fd5b91935091506001600160a01b0381351690602001356116c7565b34801561061957600080fd5b5061062261180f565b604080516001600160a01b039092168252519081900360200190f35b34801561064a57600080fd5b506102176004803603606081101561066157600080fd5b5080359060208101359060400135611833565b34801561068057600080fd5b506101c8600480360360e081101561069757600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135611840565b3480156106dd57600080fd5b50610622611ac3565b3480156106f257600080fd5b506103416004803603604081101561070957600080fd5b81359190810190604081016020820135600160201b81111561072a57600080fd5b82018360208201111561073c57600080fd5b803590602001918460208302840111600160201b8311171561075d57600080fd5b509092509050611ae7565b34801561077457600080fd5b506107ca600480360361010081101561078c57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135611b47565b60408051938452602084019290925282820152519081900360600190f35b6107ca600480360360c08110156107fe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611c83565b6103416004803603608081101561084457600080fd5b81359190810190604081016020820135600160201b81111561086557600080fd5b82018360208201111561087757600080fd5b803590602001918460208302840111600160201b8311171561089857600080fd5b91935091506001600160a01b038135169060200135611f5d565b60008082428110156108f9576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b610928897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a611840565b604080516370a0823160e01b815230600482015290519295509093506109ad918b9188916001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561097c57600080fd5b505afa158015610990573d6000803e3d6000fd5b505050506040513d60208110156109a657600080fd5b505161231e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610a1357600080fd5b505af1158015610a27573d6000803e3d6000fd5b50505050610a358583612472565b50965096945050505050565b6000610a4e84848461256a565b949350505050565b8042811015610a9a576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001685856000198101818110610ad457fe5b905060200201356001600160a01b03166001600160a01b031614610b2d576040805162461bcd60e51b815260206004820152601d6024820152600080516020613829833981519152604482015290519081900360640190fd5b610bb785856000818110610b3d57fe5b905060200201356001600160a01b031633610bb17f000000000000000000000000000000000000000000000000000000000000000089896000818110610b7f57fe5b905060200201356001600160a01b03168a8a6001818110610b9c57fe5b905060200201356001600160a01b031661265a565b8a61271a565b610bf5858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612877915050565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015610c5f57600080fd5b505afa158015610c73573d6000803e3d6000fd5b505050506040513d6020811015610c8957600080fd5b5051905086811015610ccc5760405162461bcd60e51b815260040180806020018281038252602b815260200180613896602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d3257600080fd5b505af1158015610d46573d6000803e3d6000fd5b50505050610d548482612472565b5050505050505050565b6060610a4e7f000000000000000000000000000000000000000000000000000000000000000085858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612b2092505050565b8042811015610e02576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b610e1285856000818110610b3d57fe5b600085856000198101818110610e2457fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610e8957600080fd5b505afa158015610e9d573d6000803e3d6000fd5b505050506040513d6020811015610eb357600080fd5b50516040805160208881028281018201909352888252929350610ef5929091899189918291850190849080828437600092019190915250889250612877915050565b86610fa78288886000198101818110610f0a57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610f6f57600080fd5b505afa158015610f83573d6000803e3d6000fd5b505050506040513d6020811015610f9957600080fd5b50519063ffffffff612c6d16565b1015610d545760405162461bcd60e51b815260040180806020018281038252602b815260200180613896602b913960400191505060405180910390fd5b6060814281101561102a576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061106457fe5b905060200201356001600160a01b03166001600160a01b0316146110bd576040805162461bcd60e51b815260206004820152601d6024820152600080516020613829833981519152604482015290519081900360640190fd5b61111b7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612b2092505050565b9150868260008151811061112b57fe5b602002602001015111156111705760405162461bcd60e51b81526004018080602001828103825260278152602001806137c46027913960400191505060405180910390fd5b6111f98686600081811061118057fe5b905060200201356001600160a01b0316336111df7f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106111c257fe5b905060200201356001600160a01b03168b8b6001818110610b9c57fe5b856000815181106111ec57fe5b602002602001015161271a565b61123882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612cc3915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061127757fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156112b557600080fd5b505af11580156112c9573d6000803e3d6000fd5b505050506112ee84836001855103815181106112e157fe5b6020026020010151612472565b509695505050505050565b804281101561133d576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061137457fe5b905060200201356001600160a01b03166001600160a01b0316146113cd576040805162461bcd60e51b815260206004820152601d6024820152600080516020613829833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561142d57600080fd5b505af1158015611441573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6114a67f000000000000000000000000000000000000000000000000000000000000000089896000818110610b7f57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156114f657600080fd5b505af115801561150a573d6000803e3d6000fd5b505050506040513d602081101561152057600080fd5b505161155d5760405162461bcd60e51b815260040180806020018281038252603e815260200180613761603e913960400191505060405180910390fd5b60008686600019810181811061156f57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156115d457600080fd5b505afa1580156115e8573d6000803e3d6000fd5b505050506040513d60208110156115fe57600080fd5b505160408051602089810282810182019093528982529293506116409290918a918a918291850190849080828437600092019190915250899250612877915050565b87610fa7828989600019810181811061165557fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610f6f57600080fd5b6000610a4e848484612e66565b6060814281101561170d576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b61176b7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612b2092505050565b9150868260008151811061177b57fe5b602002602001015111156117c05760405162461bcd60e51b81526004018080602001828103825260278152602001806137c46027913960400191505060405180910390fd5b6117d08686600081811061118057fe5b6112ee82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612cc3915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610a4e848484612f56565b6000808242811015611887576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b60006118b47f00000000000000000000000000000000000000000000000000000000000000008c8c61265a565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d905291519293506000926323b872dd9160648082019260209290919082900301818787803b15801561190f57600080fd5b505af1158015611923573d6000803e3d6000fd5b505050506040513d602081101561193957600080fd5b50519050806119795760405162461bcd60e51b81526004018080602001828103825260238152602001806139626023913960400191505060405180910390fd5b6040805163226bf2d160e21b81526001600160a01b03898116600483015282516000938493928716926389afcb44926024808301939282900301818787803b1580156119c457600080fd5b505af11580156119d8573d6000803e3d6000fd5b505050506040513d60408110156119ee57600080fd5b50805160209091015190925090506000611a088f8f613002565b509050806001600160a01b03168f6001600160a01b031614611a2b578183611a2e565b82825b90985096508b881015611a725760405162461bcd60e51b81526004018080602001828103825260268152602001806138706026913960400191505060405180910390fd5b8a871015611ab15760405162461bcd60e51b81526004018080602001828103825260268152602001806137136026913960400191505060405180910390fd5b50505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060610a4e7f0000000000000000000000000000000000000000000000000000000000000000858585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506130e092505050565b60008060008342811015611b90576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b611b9e8c8c8c8c8c8c613217565b90945092506000611bd07f00000000000000000000000000000000000000000000000000000000000000008e8e61265a565b9050611bde8d33838861271a565b611bea8c33838761271a565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611c4257600080fd5b505af1158015611c56573d6000803e3d6000fd5b505050506040513d6020811015611c6c57600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015611ccc576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b611cfa8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613217565b90945092506000611d4c7f00000000000000000000000000000000000000000000000000000000000000008c7f000000000000000000000000000000000000000000000000000000000000000061265a565b9050611d5a8b33838861271a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015611db557600080fd5b505af1158015611dc9573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611e4e57600080fd5b505af1158015611e62573d6000803e3d6000fd5b505050506040513d6020811015611e7857600080fd5b5051611eb55760405162461bcd60e51b81526004018080602001828103825260278152602001806138496027913960400191505060405180910390fd5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611f0d57600080fd5b505af1158015611f21573d6000803e3d6000fd5b505050506040513d6020811015611f3757600080fd5b5051925034841015611f4f57611f4f33853403612472565b505096509650969350505050565b60608142811015611fa3576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611fda57fe5b905060200201356001600160a01b03166001600160a01b031614612033576040805162461bcd60e51b815260206004820152601d6024820152600080516020613829833981519152604482015290519081900360640190fd5b6120917f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612b2092505050565b915034826000815181106120a157fe5b602002602001015111156120e65760405162461bcd60e51b81526004018080602001828103825260278152602001806137c46027913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08360008151811061212257fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561215557600080fd5b505af1158015612169573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6121ce7f000000000000000000000000000000000000000000000000000000000000000089896000818110610b7f57fe5b846000815181106121db57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561223257600080fd5b505af1158015612246573d6000803e3d6000fd5b505050506040513d602081101561225c57600080fd5b50516122995760405162461bcd60e51b815260040180806020018281038252603e8152602001806137eb603e913960400191505060405180910390fd5b6122d882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612cc3915050565b816000815181106122e557fe5b602002602001015134111561231457612314338360008151811061230557fe5b60200260200101513403612472565b5095945050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b6020831061239b5780518252601f19909201916020918201910161237c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146123fd576040519150601f19603f3d011682016040523d82523d6000602084013e612402565b606091505b5091509150818015612430575080511580612430575080806020019051602081101561242d57600080fd5b50515b61246b5760405162461bcd60e51b815260040180806020018281038252602d8152602001806138c1602d913960400191505060405180910390fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106124be5780518252601f19909201916020918201910161249f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612520576040519150601f19603f3d011682016040523d82523d6000602084013e612525565b606091505b50509050806125655760405162461bcd60e51b81526004018080602001828103825260348152602001806136ba6034913960400191505060405180910390fd5b505050565b60008084116125aa5760405162461bcd60e51b815260040180806020018281038252602b815260200180613917602b913960400191505060405180910390fd5b6000831180156125ba5750600082115b6125f55760405162461bcd60e51b81526004018080602001828103825260288152602001806137396028913960400191505060405180910390fd5b6000612609856103e663ffffffff6134c016565b9050600061261d828563ffffffff6134c016565b9050600061264383612637886103e863ffffffff6134c016565b9063ffffffff61352316565b905080828161264e57fe5b04979650505050505050565b60008060006126698585613002565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f8b59d0fbd3a2da5e26f61e1d4b91f355d2c382ec32c993635b0d80dce6e1ef1c609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b6020831061279f5780518252601f199092019160209182019101612780565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612801576040519150601f19603f3d011682016040523d82523d6000602084013e612806565b606091505b5091509150818015612834575080511580612834575080806020019051602081101561283157600080fd5b50515b61286f5760405162461bcd60e51b81526004018080602001828103825260318152602001806136896031913960400191505060405180910390fd5b505050505050565b60005b60018351038110156125655760008084838151811061289557fe5b60200260200101518584600101815181106128ac57fe5b60200260200101519150915060006128c48383613002565b50905060006128f47f0000000000000000000000000000000000000000000000000000000000000000858561265a565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561293557600080fd5b505afa158015612949573d6000803e3d6000fd5b505050506040513d606081101561295f57600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614612995578284612998565b83835b915091506129f6828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610f6f57600080fd5b9550612a0386838361256a565b945050505050600080856001600160a01b0316886001600160a01b031614612a2d57826000612a31565b6000835b91509150600060028c51038a10612a48578a612a89565b612a897f0000000000000000000000000000000000000000000000000000000000000000898e8d60020181518110612a7c57fe5b602002602001015161265a565b9050856001600160a01b0316636d9a640a8484846040518463ffffffff1660e01b815260040180848152602001838152602001826001600160a01b03166001600160a01b031681526020019350505050600060405180830381600087803b158015612af357600080fd5b505af1158015612b07573d6000803e3d6000fd5b50506001909b019a5061287a9950505050505050505050565b6060600282511015612b79576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff81118015612b9157600080fd5b50604051908082528060200260200182016040528015612bbb578160200160208202803683370190505b5090508281600183510381518110612bcf57fe5b60209081029190910101528151600019015b8015612c6557600080612c1e87866001860381518110612bfd57fe5b6020026020010151878681518110612c1157fe5b6020026020010151613572565b91509150612c40848481518110612c3157fe5b60200260200101518383612e66565b846001850381518110612c4f57fe5b6020908102919091010152505060001901612be1565b509392505050565b80820382811115612cbd576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b92915050565b60005b6001835103811015612e6057600080848381518110612ce157fe5b6020026020010151858460010181518110612cf857fe5b6020026020010151915091506000612d108383613002565b5090506000878560010181518110612d2457fe5b60200260200101519050600080836001600160a01b0316866001600160a01b031614612d5257826000612d56565b6000835b91509150600060028a51038810612d6d5788612da1565b612da17f0000000000000000000000000000000000000000000000000000000000000000878c8b60020181518110612a7c57fe5b9050612dce7f0000000000000000000000000000000000000000000000000000000000000000888861265a565b6001600160a01b0316636d9a640a8484846040518463ffffffff1660e01b815260040180848152602001838152602001826001600160a01b03166001600160a01b031681526020019350505050600060405180830381600087803b158015612e3557600080fd5b505af1158015612e49573d6000803e3d6000fd5b505060019099019850612cc6975050505050505050565b50505050565b6000808411612ea65760405162461bcd60e51b815260040180806020018281038252602c81526020018061365d602c913960400191505060405180910390fd5b600083118015612eb65750600082115b612ef15760405162461bcd60e51b81526004018080602001828103825260288152602001806137396028913960400191505060405180910390fd5b6000612f156103e8612f09868863ffffffff6134c016565b9063ffffffff6134c016565b90506000612f2f6103e6612f09868963ffffffff612c6d16565b9050612f4c6001828481612f3f57fe5b049063ffffffff61352316565b9695505050505050565b6000808411612f965760405162461bcd60e51b815260040180806020018281038252602581526020018061379f6025913960400191505060405180910390fd5b600083118015612fa65750600082115b612fe15760405162461bcd60e51b81526004018080602001828103825260288152602001806137396028913960400191505060405180910390fd5b82612ff2858463ffffffff6134c016565b81612ff957fe5b04949350505050565b600080826001600160a01b0316846001600160a01b031614156130565760405162461bcd60e51b81526004018080602001828103825260258152602001806136ee6025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613076578284613079565b83835b90925090506001600160a01b0382166130d9576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b6060600282511015613139576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561315157600080fd5b5060405190808252806020026020018201604052801561317b578160200160208202803683370190505b509050828160008151811061318c57fe5b60200260200101818152505060005b6001835103811015612c65576000806131d1878685815181106131ba57fe5b6020026020010151878660010181518110612c1157fe5b915091506131f38484815181106131e457fe5b6020026020010151838361256a565b84846001018151811061320257fe5b6020908102919091010152505060010161319b565b6040805163e6a4390560e01b81526001600160a01b03888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b15801561329157600080fd5b505afa1580156132a5573d6000803e3d6000fd5b505050506040513d60208110156132bb57600080fd5b50516001600160a01b0316141561336e57604080516364e329cb60e11b81526001600160a01b038a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b15801561334157600080fd5b505af1158015613355573d6000803e3d6000fd5b505050506040513d602081101561336b57600080fd5b50505b60008061339c7f00000000000000000000000000000000000000000000000000000000000000008b8b613572565b915091508160001480156133ae575080155b156133be578793508692506134b3565b60006133cb898484612f56565b905087811161341e57858110156134135760405162461bcd60e51b81526004018080602001828103825260268152602001806137136026913960400191505060405180910390fd5b8894509250826134b1565b600061342b898486612f56565b90508981111561346c5760405162461bcd60e51b81526004018080602001828103825260298152602001806138ee6029913960400191505060405180910390fd5b878110156134ab5760405162461bcd60e51b81526004018080602001828103825260268152602001806138706026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806134db575050808202828282816134d857fe5b04145b612cbd576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015612cbd576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60008060006135818585613002565b50905060008061359288888861265a565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156135ca57600080fd5b505afa1580156135de573d6000803e3d6000fd5b505050506040513d60608110156135f457600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b038781169084161461362757808261362a565b81815b9099909850965050505050505056fe7472616e73666572204554482066726f6d20756e65787065637465642073656e646572556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c65645472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c6564556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459556e69737761705632526f757465723a2057455448207472616e73666572206661696c656420696e20737761704578616374455448466f72546f6b656e73556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54556e69737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54556e69737761705632526f757465723a2057455448207472616e73666572206661696c656420696e2073776170455448466f724578616374546f6b656e73556e69737761705632526f757465723a20494e56414c49445f5041544800000057455448207472616e73666572206661696c656420696e206164644c6971756964697479455448556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e54556e69737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564616d6f756e74412073686f756c64206c657373206f7220657175616c207468616e20616d6f756e7442556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54556e69737761705632526f757465723a204558504952454400000000000000004661696c656420696e2073656e64696e67206c697175696469747920746f2070616972a264697066735822122007fa60c233a402a9cebe612a5a5704ea0805a744a15b950845a4189e4049d2f264736f6c63430006060033000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d68000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2

Deployed Bytecode

0x6080604052600436106101025760003560e01c80638803dbee11610095578063c45a015511610064578063c45a0155146106d1578063d06ca61f146106e6578063e8e3370014610768578063f305d719146107e8578063fb3bdb411461082e57610170565b80638803dbee14610577578063ad5c46481461060d578063ad615dec1461063e578063baa2abde1461067457610170565b806338ed1739116100d157806338ed1739146103915780634a25d94a146104275780637ff36ab5146104bd57806385f8c2591461054157610170565b806302751cec14610175578063054d50d4146101e157806318cbafe5146102295780631f00ca74146102bf57610170565b3661017057336001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2161461016e5760405162461bcd60e51b815260040180806020018281038252602381526020018061363a6023913960400191505060405180910390fd5b005b600080fd5b34801561018157600080fd5b506101c8600480360360c081101561019857600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a001356108b2565b6040805192835260208301919091528051918290030190f35b3480156101ed57600080fd5b506102176004803603606081101561020457600080fd5b5080359060208101359060400135610a41565b60408051918252519081900360200190f35b34801561023557600080fd5b5061016e600480360360a081101561024c57600080fd5b813591602081013591810190606081016040820135600160201b81111561027257600080fd5b82018360208201111561028457600080fd5b803590602001918460208302840111600160201b831117156102a557600080fd5b91935091506001600160a01b038135169060200135610a56565b3480156102cb57600080fd5b50610341600480360360408110156102e257600080fd5b81359190810190604081016020820135600160201b81111561030357600080fd5b82018360208201111561031557600080fd5b803590602001918460208302840111600160201b8311171561033657600080fd5b509092509050610d5e565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561037d578181015183820152602001610365565b505050509050019250505060405180910390f35b34801561039d57600080fd5b5061016e600480360360a08110156103b457600080fd5b813591602081013591810190606081016040820135600160201b8111156103da57600080fd5b8201836020820111156103ec57600080fd5b803590602001918460208302840111600160201b8311171561040d57600080fd5b91935091506001600160a01b038135169060200135610dbe565b34801561043357600080fd5b50610341600480360360a081101561044a57600080fd5b813591602081013591810190606081016040820135600160201b81111561047057600080fd5b82018360208201111561048257600080fd5b803590602001918460208302840111600160201b831117156104a357600080fd5b91935091506001600160a01b038135169060200135610fe4565b61016e600480360360808110156104d357600080fd5b81359190810190604081016020820135600160201b8111156104f457600080fd5b82018360208201111561050657600080fd5b803590602001918460208302840111600160201b8311171561052757600080fd5b91935091506001600160a01b0381351690602001356112f9565b34801561054d57600080fd5b506102176004803603606081101561056457600080fd5b50803590602081013590604001356116ba565b34801561058357600080fd5b50610341600480360360a081101561059a57600080fd5b813591602081013591810190606081016040820135600160201b8111156105c057600080fd5b8201836020820111156105d257600080fd5b803590602001918460208302840111600160201b831117156105f357600080fd5b91935091506001600160a01b0381351690602001356116c7565b34801561061957600080fd5b5061062261180f565b604080516001600160a01b039092168252519081900360200190f35b34801561064a57600080fd5b506102176004803603606081101561066157600080fd5b5080359060208101359060400135611833565b34801561068057600080fd5b506101c8600480360360e081101561069757600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135611840565b3480156106dd57600080fd5b50610622611ac3565b3480156106f257600080fd5b506103416004803603604081101561070957600080fd5b81359190810190604081016020820135600160201b81111561072a57600080fd5b82018360208201111561073c57600080fd5b803590602001918460208302840111600160201b8311171561075d57600080fd5b509092509050611ae7565b34801561077457600080fd5b506107ca600480360361010081101561078c57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135611b47565b60408051938452602084019290925282820152519081900360600190f35b6107ca600480360360c08110156107fe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611c83565b6103416004803603608081101561084457600080fd5b81359190810190604081016020820135600160201b81111561086557600080fd5b82018360208201111561087757600080fd5b803590602001918460208302840111600160201b8311171561089857600080fd5b91935091506001600160a01b038135169060200135611f5d565b60008082428110156108f9576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b610928897f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28a8a8a308a611840565b604080516370a0823160e01b815230600482015290519295509093506109ad918b9188916001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561097c57600080fd5b505afa158015610990573d6000803e3d6000fd5b505050506040513d60208110156109a657600080fd5b505161231e565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610a1357600080fd5b505af1158015610a27573d6000803e3d6000fd5b50505050610a358583612472565b50965096945050505050565b6000610a4e84848461256a565b949350505050565b8042811015610a9a576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21685856000198101818110610ad457fe5b905060200201356001600160a01b03166001600160a01b031614610b2d576040805162461bcd60e51b815260206004820152601d6024820152600080516020613829833981519152604482015290519081900360640190fd5b610bb785856000818110610b3d57fe5b905060200201356001600160a01b031633610bb17f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d6889896000818110610b7f57fe5b905060200201356001600160a01b03168a8a6001818110610b9c57fe5b905060200201356001600160a01b031661265a565b8a61271a565b610bf5858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612877915050565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216916370a0823191602480820192602092909190829003018186803b158015610c5f57600080fd5b505afa158015610c73573d6000803e3d6000fd5b505050506040513d6020811015610c8957600080fd5b5051905086811015610ccc5760405162461bcd60e51b815260040180806020018281038252602b815260200180613896602b913960400191505060405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d3257600080fd5b505af1158015610d46573d6000803e3d6000fd5b50505050610d548482612472565b5050505050505050565b6060610a4e7f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d6885858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612b2092505050565b8042811015610e02576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b610e1285856000818110610b3d57fe5b600085856000198101818110610e2457fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610e8957600080fd5b505afa158015610e9d573d6000803e3d6000fd5b505050506040513d6020811015610eb357600080fd5b50516040805160208881028281018201909352888252929350610ef5929091899189918291850190849080828437600092019190915250889250612877915050565b86610fa78288886000198101818110610f0a57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610f6f57600080fd5b505afa158015610f83573d6000803e3d6000fd5b505050506040513d6020811015610f9957600080fd5b50519063ffffffff612c6d16565b1015610d545760405162461bcd60e51b815260040180806020018281038252602b815260200180613896602b913960400191505060405180910390fd5b6060814281101561102a576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2168686600019810181811061106457fe5b905060200201356001600160a01b03166001600160a01b0316146110bd576040805162461bcd60e51b815260206004820152601d6024820152600080516020613829833981519152604482015290519081900360640190fd5b61111b7f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d6889888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612b2092505050565b9150868260008151811061112b57fe5b602002602001015111156111705760405162461bcd60e51b81526004018080602001828103825260278152602001806137c46027913960400191505060405180910390fd5b6111f98686600081811061118057fe5b905060200201356001600160a01b0316336111df7f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d688a8a60008181106111c257fe5b905060200201356001600160a01b03168b8b6001818110610b9c57fe5b856000815181106111ec57fe5b602002602001015161271a565b61123882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612cc3915050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d8360018551038151811061127757fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156112b557600080fd5b505af11580156112c9573d6000803e3d6000fd5b505050506112ee84836001855103815181106112e157fe5b6020026020010151612472565b509695505050505050565b804281101561133d576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03168585600081811061137457fe5b905060200201356001600160a01b03166001600160a01b0316146113cd576040805162461bcd60e51b815260206004820152601d6024820152600080516020613829833981519152604482015290519081900360640190fd5b60003490507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561142d57600080fd5b505af1158015611441573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb6114a67f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d6889896000818110610b7f57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156114f657600080fd5b505af115801561150a573d6000803e3d6000fd5b505050506040513d602081101561152057600080fd5b505161155d5760405162461bcd60e51b815260040180806020018281038252603e815260200180613761603e913960400191505060405180910390fd5b60008686600019810181811061156f57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156115d457600080fd5b505afa1580156115e8573d6000803e3d6000fd5b505050506040513d60208110156115fe57600080fd5b505160408051602089810282810182019093528982529293506116409290918a918a918291850190849080828437600092019190915250899250612877915050565b87610fa7828989600019810181811061165557fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610f6f57600080fd5b6000610a4e848484612e66565b6060814281101561170d576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b61176b7f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d6889888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612b2092505050565b9150868260008151811061177b57fe5b602002602001015111156117c05760405162461bcd60e51b81526004018080602001828103825260278152602001806137c46027913960400191505060405180910390fd5b6117d08686600081811061118057fe5b6112ee82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612cc3915050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6000610a4e848484612f56565b6000808242811015611887576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b60006118b47f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d688c8c61265a565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d905291519293506000926323b872dd9160648082019260209290919082900301818787803b15801561190f57600080fd5b505af1158015611923573d6000803e3d6000fd5b505050506040513d602081101561193957600080fd5b50519050806119795760405162461bcd60e51b81526004018080602001828103825260238152602001806139626023913960400191505060405180910390fd5b6040805163226bf2d160e21b81526001600160a01b03898116600483015282516000938493928716926389afcb44926024808301939282900301818787803b1580156119c457600080fd5b505af11580156119d8573d6000803e3d6000fd5b505050506040513d60408110156119ee57600080fd5b50805160209091015190925090506000611a088f8f613002565b509050806001600160a01b03168f6001600160a01b031614611a2b578183611a2e565b82825b90985096508b881015611a725760405162461bcd60e51b81526004018080602001828103825260268152602001806138706026913960400191505060405180910390fd5b8a871015611ab15760405162461bcd60e51b81526004018080602001828103825260268152602001806137136026913960400191505060405180910390fd5b50505050505097509795505050505050565b7f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d6881565b6060610a4e7f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d68858585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506130e092505050565b60008060008342811015611b90576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b611b9e8c8c8c8c8c8c613217565b90945092506000611bd07f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d688e8e61265a565b9050611bde8d33838861271a565b611bea8c33838761271a565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611c4257600080fd5b505af1158015611c56573d6000803e3d6000fd5b505050506040513d6020811015611c6c57600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015611ccc576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b611cfa8a7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28b348c8c613217565b90945092506000611d4c7f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d688c7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc261265a565b9050611d5a8b33838861271a565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015611db557600080fd5b505af1158015611dc9573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611e4e57600080fd5b505af1158015611e62573d6000803e3d6000fd5b505050506040513d6020811015611e7857600080fd5b5051611eb55760405162461bcd60e51b81526004018080602001828103825260278152602001806138496027913960400191505060405180910390fd5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611f0d57600080fd5b505af1158015611f21573d6000803e3d6000fd5b505050506040513d6020811015611f3757600080fd5b5051925034841015611f4f57611f4f33853403612472565b505096509650969350505050565b60608142811015611fa3576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031686866000818110611fda57fe5b905060200201356001600160a01b03166001600160a01b031614612033576040805162461bcd60e51b815260206004820152601d6024820152600080516020613829833981519152604482015290519081900360640190fd5b6120917f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d6888888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612b2092505050565b915034826000815181106120a157fe5b602002602001015111156120e65760405162461bcd60e51b81526004018080602001828103825260278152602001806137c46027913960400191505060405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db08360008151811061212257fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561215557600080fd5b505af1158015612169573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb6121ce7f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d6889896000818110610b7f57fe5b846000815181106121db57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561223257600080fd5b505af1158015612246573d6000803e3d6000fd5b505050506040513d602081101561225c57600080fd5b50516122995760405162461bcd60e51b815260040180806020018281038252603e8152602001806137eb603e913960400191505060405180910390fd5b6122d882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612cc3915050565b816000815181106122e557fe5b602002602001015134111561231457612314338360008151811061230557fe5b60200260200101513403612472565b5095945050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b6020831061239b5780518252601f19909201916020918201910161237c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146123fd576040519150601f19603f3d011682016040523d82523d6000602084013e612402565b606091505b5091509150818015612430575080511580612430575080806020019051602081101561242d57600080fd5b50515b61246b5760405162461bcd60e51b815260040180806020018281038252602d8152602001806138c1602d913960400191505060405180910390fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106124be5780518252601f19909201916020918201910161249f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612520576040519150601f19603f3d011682016040523d82523d6000602084013e612525565b606091505b50509050806125655760405162461bcd60e51b81526004018080602001828103825260348152602001806136ba6034913960400191505060405180910390fd5b505050565b60008084116125aa5760405162461bcd60e51b815260040180806020018281038252602b815260200180613917602b913960400191505060405180910390fd5b6000831180156125ba5750600082115b6125f55760405162461bcd60e51b81526004018080602001828103825260288152602001806137396028913960400191505060405180910390fd5b6000612609856103e663ffffffff6134c016565b9050600061261d828563ffffffff6134c016565b9050600061264383612637886103e863ffffffff6134c016565b9063ffffffff61352316565b905080828161264e57fe5b04979650505050505050565b60008060006126698585613002565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f8b59d0fbd3a2da5e26f61e1d4b91f355d2c382ec32c993635b0d80dce6e1ef1c609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b6020831061279f5780518252601f199092019160209182019101612780565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612801576040519150601f19603f3d011682016040523d82523d6000602084013e612806565b606091505b5091509150818015612834575080511580612834575080806020019051602081101561283157600080fd5b50515b61286f5760405162461bcd60e51b81526004018080602001828103825260318152602001806136896031913960400191505060405180910390fd5b505050505050565b60005b60018351038110156125655760008084838151811061289557fe5b60200260200101518584600101815181106128ac57fe5b60200260200101519150915060006128c48383613002565b50905060006128f47f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d68858561265a565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561293557600080fd5b505afa158015612949573d6000803e3d6000fd5b505050506040513d606081101561295f57600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614612995578284612998565b83835b915091506129f6828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610f6f57600080fd5b9550612a0386838361256a565b945050505050600080856001600160a01b0316886001600160a01b031614612a2d57826000612a31565b6000835b91509150600060028c51038a10612a48578a612a89565b612a897f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d68898e8d60020181518110612a7c57fe5b602002602001015161265a565b9050856001600160a01b0316636d9a640a8484846040518463ffffffff1660e01b815260040180848152602001838152602001826001600160a01b03166001600160a01b031681526020019350505050600060405180830381600087803b158015612af357600080fd5b505af1158015612b07573d6000803e3d6000fd5b50506001909b019a5061287a9950505050505050505050565b6060600282511015612b79576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff81118015612b9157600080fd5b50604051908082528060200260200182016040528015612bbb578160200160208202803683370190505b5090508281600183510381518110612bcf57fe5b60209081029190910101528151600019015b8015612c6557600080612c1e87866001860381518110612bfd57fe5b6020026020010151878681518110612c1157fe5b6020026020010151613572565b91509150612c40848481518110612c3157fe5b60200260200101518383612e66565b846001850381518110612c4f57fe5b6020908102919091010152505060001901612be1565b509392505050565b80820382811115612cbd576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b92915050565b60005b6001835103811015612e6057600080848381518110612ce157fe5b6020026020010151858460010181518110612cf857fe5b6020026020010151915091506000612d108383613002565b5090506000878560010181518110612d2457fe5b60200260200101519050600080836001600160a01b0316866001600160a01b031614612d5257826000612d56565b6000835b91509150600060028a51038810612d6d5788612da1565b612da17f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d68878c8b60020181518110612a7c57fe5b9050612dce7f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d68888861265a565b6001600160a01b0316636d9a640a8484846040518463ffffffff1660e01b815260040180848152602001838152602001826001600160a01b03166001600160a01b031681526020019350505050600060405180830381600087803b158015612e3557600080fd5b505af1158015612e49573d6000803e3d6000fd5b505060019099019850612cc6975050505050505050565b50505050565b6000808411612ea65760405162461bcd60e51b815260040180806020018281038252602c81526020018061365d602c913960400191505060405180910390fd5b600083118015612eb65750600082115b612ef15760405162461bcd60e51b81526004018080602001828103825260288152602001806137396028913960400191505060405180910390fd5b6000612f156103e8612f09868863ffffffff6134c016565b9063ffffffff6134c016565b90506000612f2f6103e6612f09868963ffffffff612c6d16565b9050612f4c6001828481612f3f57fe5b049063ffffffff61352316565b9695505050505050565b6000808411612f965760405162461bcd60e51b815260040180806020018281038252602581526020018061379f6025913960400191505060405180910390fd5b600083118015612fa65750600082115b612fe15760405162461bcd60e51b81526004018080602001828103825260288152602001806137396028913960400191505060405180910390fd5b82612ff2858463ffffffff6134c016565b81612ff957fe5b04949350505050565b600080826001600160a01b0316846001600160a01b031614156130565760405162461bcd60e51b81526004018080602001828103825260258152602001806136ee6025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613076578284613079565b83835b90925090506001600160a01b0382166130d9576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b6060600282511015613139576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561315157600080fd5b5060405190808252806020026020018201604052801561317b578160200160208202803683370190505b509050828160008151811061318c57fe5b60200260200101818152505060005b6001835103811015612c65576000806131d1878685815181106131ba57fe5b6020026020010151878660010181518110612c1157fe5b915091506131f38484815181106131e457fe5b6020026020010151838361256a565b84846001018151811061320257fe5b6020908102919091010152505060010161319b565b6040805163e6a4390560e01b81526001600160a01b03888116600483015287811660248301529151600092839283927f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d689092169163e6a4390591604480820192602092909190829003018186803b15801561329157600080fd5b505afa1580156132a5573d6000803e3d6000fd5b505050506040513d60208110156132bb57600080fd5b50516001600160a01b0316141561336e57604080516364e329cb60e11b81526001600160a01b038a81166004830152898116602483015291517f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d689092169163c9c65396916044808201926020929091908290030181600087803b15801561334157600080fd5b505af1158015613355573d6000803e3d6000fd5b505050506040513d602081101561336b57600080fd5b50505b60008061339c7f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d688b8b613572565b915091508160001480156133ae575080155b156133be578793508692506134b3565b60006133cb898484612f56565b905087811161341e57858110156134135760405162461bcd60e51b81526004018080602001828103825260268152602001806137136026913960400191505060405180910390fd5b8894509250826134b1565b600061342b898486612f56565b90508981111561346c5760405162461bcd60e51b81526004018080602001828103825260298152602001806138ee6029913960400191505060405180910390fd5b878110156134ab5760405162461bcd60e51b81526004018080602001828103825260268152602001806138706026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806134db575050808202828282816134d857fe5b04145b612cbd576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015612cbd576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60008060006135818585613002565b50905060008061359288888861265a565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156135ca57600080fd5b505afa1580156135de573d6000803e3d6000fd5b505050506040513d60608110156135f457600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b038781169084161461362757808261362a565b81815b9099909850965050505050505056fe7472616e73666572204554482066726f6d20756e65787065637465642073656e646572556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c65645472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c6564556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459556e69737761705632526f757465723a2057455448207472616e73666572206661696c656420696e20737761704578616374455448466f72546f6b656e73556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54556e69737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54556e69737761705632526f757465723a2057455448207472616e73666572206661696c656420696e2073776170455448466f724578616374546f6b656e73556e69737761705632526f757465723a20494e56414c49445f5041544800000057455448207472616e73666572206661696c656420696e206164644c6971756964697479455448556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e54556e69737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564616d6f756e74412073686f756c64206c657373206f7220657175616c207468616e20616d6f756e7442556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54556e69737761705632526f757465723a204558504952454400000000000000004661696c656420696e2073656e64696e67206c697175696469747920746f2070616972a264697066735822122007fa60c233a402a9cebe612a5a5704ea0805a744a15b950845a4189e4049d2f264736f6c63430006060033

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

000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d68000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2

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

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d68
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.