Contract 0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a7 2

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x05be15fabdb3703e2c2076eff668fcda1a7ef80c34291dd65c5631b79885a6fcSwap Exact Token...477920302022-09-26 13:13:324 mins ago0x6a7904f0ba2ded9c41a8b03a36b3880c174a5597 IN  0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70 FTM0.000473509875
0x64cc9cd8a19241048912e33fcd421c3db8f17150186fcb3b1c24581499676eb4Swap Exact Token...477919922022-09-26 13:12:434 mins ago0x6160d7945eef4658088939504e3d4ab9fc64d30a IN  0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70 FTM0.00035537531
0x2dab4c2cee4c00caa8cbd9b2bc5a9be11404d03e4107a4b2e1dde45d9014bb8dSwap Exact Token...477917312022-09-26 13:08:149 mins ago0xe8147a6d8504c767215e08733f66957a2d138cd0 IN  0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70 FTM0.00029609733
0x2d02536240674dfa172f52c5822feb3a2309413aa54f0ba1799d32599afb5644Add Liquidity477916382022-09-26 13:06:3311 mins ago0x55b5a04c491564d1cbf437ecde7d2ee7a068f513 IN  0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70 FTM0.000483875948
0x0d564b56b66a7bab3bcf0c6141bc6c7b18c9b7aa414e15dd47a52f4a517e2591Swap Exact ETH F...477915802022-09-26 13:05:3412 mins ago0x55b5a04c491564d1cbf437ecde7d2ee7a068f513 IN  0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70.4 FTM0.000374760117
0x3fb926645d39cddbdc6a7b2ac5fd1c773155687d6cd20e96447d6044a83a9707Swap Exact Token...477915592022-09-26 13:05:1412 mins ago0xc910dfc7c06b766113c7a0b6b3ee67ab0bed18a7 IN  0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70 FTM0.000362963806
0x42c523b97036b116f288a0b56a6d05e79fb28d830ceaa2213b25c60ef7f1331fSwap Exact ETH F...477915562022-09-26 13:05:1012 mins ago0x55b5a04c491564d1cbf437ecde7d2ee7a068f513 IN  0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70.4 FTM0.000406100074
0xc1a83a0af0cdba81c4d474af032aeee9c9ee5c19ac553b2ae467599448fc7109Swap Tokens For ...477914992022-09-26 13:04:1013 mins ago0x9e3d3336562c696a66861ec97fa548f851ea307b IN  0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70 FTM0.000316833011
0xa6dbb600e76bcf34e0e667304104e6473a0b1245e7cdeb632180cacb310de5d6Swap Tokens For ...477914682022-09-26 13:03:3814 mins ago0x9e3d3336562c696a66861ec97fa548f851ea307b IN  0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70 FTM0.000342409865
0x9ffea626c1893ef690dc67ab9c181aef936f8fae64d698b9a2343cc40ca3a376Add Liquidity ET...477913572022-09-26 13:01:4715 mins ago0x0bfe2fc6f358088b6ab19946e62d5cd44abd542f IN  0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a710.55254971395705 FTM0.000524060584
0x7dfb5f946aeffabc84700fc9d4c616e81e87552ad02d296745ba9470051d051fSwap Exact Token...477913272022-09-26 13:01:1616 mins ago0x0bfe2fc6f358088b6ab19946e62d5cd44abd542f IN  0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70 FTM0.00039290649
0x45bee96da59f256f96017d3737cfc1e952665b6da74810828d3fc2d88456acd3Swap Exact Token...477903852022-09-26 12:41:3136 mins ago0x9a71f8a76add70cf553656498b4168bce3cd46dd IN  0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70 FTM0.00031891322
0x589f73fe23533e13209aed1fb35c3860b55710fc38908f4099c3e1e2283e20ffSwap Exact Token...477899432022-09-26 12:32:4644 mins ago0xb2b4dfb67f3aeba9789659867188dd3c61c39b64 IN  0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70 FTM0.000452095
0x96a9b84e6f02983e0d4cadf705b1cb858af52776660315a744fdbe0229ff5097Swap Exact Token...477899232022-09-26 12:32:2545 mins ago0x5a407865411253e5a991d3e49e8bc7a1fdbe82b0 IN  0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70 FTM0.0002888925
0xee1955a27d805f231121615b71526fc90422825ea3e858abb2fa1f10f789931bSwap Exact ETH F...477898892022-09-26 12:31:4345 mins ago0xb2b4dfb67f3aeba9789659867188dd3c61c39b64 IN  0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a75,713.915169249601918 FTM0.00030131
0x2b5d13be6ff703ef846880adb63101bce7a79c9390ae06a9625fe0de7f97d530Swap Exact Token...477898122022-09-26 12:30:2547 mins ago0x47e50bb109cd4a244b1376e18a0b0e596f19b7b9 IN  0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70 FTM0.000317153996
0x939af6b73f96b77aa00a2fcfef578df83fe00211d25637dbfcec8ed764b54efeSwap Exact Token...477897912022-09-26 12:29:5347 mins ago0xe941c1410af4d67dfe4a3932ec0944d155a8622a IN  0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70 FTM0.000305025
0xd5967b06e4e648b50523ad4e9701520f6ddea000a245ca048fd39384d696e6e2Swap Exact Token...477897632022-09-26 12:29:2548 mins ago0xb2b4dfb67f3aeba9789659867188dd3c61c39b64 IN  0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70 FTM0.00043319
0xdfe57d37b1b17d83c13ae5eed70428ba883f285fd8b4c491e4ed100bb9a03734Swap Exact Token...477896642022-09-26 12:27:4649 mins ago0xfde89dafe9f5c5b0c1323fe68f711ba037075097 IN  0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70 FTM0.0002932025
0x2bfef11ae4d8afc74019e4daf3877daac9281ec42f894bd76c49553fdb3f9711Swap Exact Token...477896162022-09-26 12:26:4950 mins ago0x9a71f8a76add70cf553656498b4168bce3cd46dd IN  0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70 FTM0.000306711317
0x3b70600c63ccdd84c56de2b64ad6f22124e27a1c561a8041bb86f6516a3e4d85Swap Exact Token...477895992022-09-26 12:26:3151 mins ago0x6059895f7f20cc25c251d4d283f525f7400ce034 IN  0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70 FTM0.000529454
0xc5959b5ae231a215e4354de8c64c9521950299c7773e284b765969792f906499Remove Liquidity...477895972022-09-26 12:26:3051 mins ago0xb2b4dfb67f3aeba9789659867188dd3c61c39b64 IN  0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70 FTM0.00165559
0x60fa125d09d1ee8ddfcfbd5796bbb39d67d66537cce20d9f06f0574127efe6a2Add Liquidity477894702022-09-26 12:24:2353 mins ago0x47be39c48ff065ccc68403225dd3e89618468cc1 IN  0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70 FTM0.000234532013
0x8e7024c4121569f115a5bdb210af1ad5d46f7d8e09dc2eda6d452ba6f07f549aSwap Exact Token...477891342022-09-26 12:18:3259 mins ago0x47be39c48ff065ccc68403225dd3e89618468cc1 IN  0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70 FTM0.000348690139
0x996df9778f9f76fe01351a691dd036d54a3ffc31a9cb4d0aaecff219c9f048e4Swap Exact Token...477889262022-09-26 12:14:581 hr 2 mins ago0x9a71f8a76add70cf553656498b4168bce3cd46dd IN  0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70 FTM0.000302496386
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x64cc9cd8a19241048912e33fcd421c3db8f17150186fcb3b1c24581499676eb4477919922022-09-26 13:12:434 mins ago 0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70x6160d7945eef4658088939504e3d4ab9fc64d30a1,481.767332217127528493 FTM
0x64cc9cd8a19241048912e33fcd421c3db8f17150186fcb3b1c24581499676eb4477919922022-09-26 13:12:434 mins ago Fantom Finance: Wrapped Fantom Token 0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a71,481.767332217127528493 FTM
0x0d564b56b66a7bab3bcf0c6141bc6c7b18c9b7aa414e15dd47a52f4a517e2591477915802022-09-26 13:05:3412 mins ago 0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a7 Fantom Finance: Wrapped Fantom Token0.4 FTM
0x3fb926645d39cddbdc6a7b2ac5fd1c773155687d6cd20e96447d6044a83a9707477915592022-09-26 13:05:1412 mins ago 0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70xc910dfc7c06b766113c7a0b6b3ee67ab0bed18a74.567320438518334678 FTM
0x3fb926645d39cddbdc6a7b2ac5fd1c773155687d6cd20e96447d6044a83a9707477915592022-09-26 13:05:1412 mins ago Fantom Finance: Wrapped Fantom Token 0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a74.567320438518334678 FTM
0x42c523b97036b116f288a0b56a6d05e79fb28d830ceaa2213b25c60ef7f1331f477915562022-09-26 13:05:1012 mins ago 0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a7 Fantom Finance: Wrapped Fantom Token0.4 FTM
0x9ffea626c1893ef690dc67ab9c181aef936f8fae64d698b9a2343cc40ca3a376477913572022-09-26 13:01:4715 mins ago 0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a7 Fantom Finance: Wrapped Fantom Token10.552549713957050185 FTM
0x7dfb5f946aeffabc84700fc9d4c616e81e87552ad02d296745ba9470051d051f477913272022-09-26 13:01:1616 mins ago 0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70x0bfe2fc6f358088b6ab19946e62d5cd44abd542f10.499978808677009546 FTM
0x7dfb5f946aeffabc84700fc9d4c616e81e87552ad02d296745ba9470051d051f477913272022-09-26 13:01:1616 mins ago Fantom Finance: Wrapped Fantom Token 0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a710.499978808677009546 FTM
0x45bee96da59f256f96017d3737cfc1e952665b6da74810828d3fc2d88456acd3477903852022-09-26 12:41:3136 mins ago 0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70x9a71f8a76add70cf553656498b4168bce3cd46dd0.072264601273599387 FTM
0x45bee96da59f256f96017d3737cfc1e952665b6da74810828d3fc2d88456acd3477903852022-09-26 12:41:3136 mins ago Fantom Finance: Wrapped Fantom Token 0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70.072264601273599387 FTM
0xee1955a27d805f231121615b71526fc90422825ea3e858abb2fa1f10f789931b477898892022-09-26 12:31:4345 mins ago 0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a7 Fantom Finance: Wrapped Fantom Token5,713.915169249601918654 FTM
0x2bfef11ae4d8afc74019e4daf3877daac9281ec42f894bd76c49553fdb3f9711477896162022-09-26 12:26:4950 mins ago 0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70x9a71f8a76add70cf553656498b4168bce3cd46dd0.073335426111375943 FTM
0x2bfef11ae4d8afc74019e4daf3877daac9281ec42f894bd76c49553fdb3f9711477896162022-09-26 12:26:4950 mins ago Fantom Finance: Wrapped Fantom Token 0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70.073335426111375943 FTM
0xc5959b5ae231a215e4354de8c64c9521950299c7773e284b765969792f906499477895972022-09-26 12:26:3051 mins ago 0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70xb2b4dfb67f3aeba9789659867188dd3c61c39b646,012.32434810791519387 FTM
0xc5959b5ae231a215e4354de8c64c9521950299c7773e284b765969792f906499477895972022-09-26 12:26:3051 mins ago Fantom Finance: Wrapped Fantom Token 0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a76,012.32434810791519387 FTM
0x996df9778f9f76fe01351a691dd036d54a3ffc31a9cb4d0aaecff219c9f048e4477889262022-09-26 12:14:581 hr 2 mins ago 0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70x9a71f8a76add70cf553656498b4168bce3cd46dd0.058575739880232418 FTM
0x996df9778f9f76fe01351a691dd036d54a3ffc31a9cb4d0aaecff219c9f048e4477889262022-09-26 12:14:581 hr 2 mins ago Fantom Finance: Wrapped Fantom Token 0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70.058575739880232418 FTM
0x7e20974ccd83b68ae2bd85ae93df1a4f811511af55d293e102596c8018946640477886292022-09-26 12:09:491 hr 7 mins ago 0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70x9a71f8a76add70cf553656498b4168bce3cd46dd0.05825845406207598 FTM
0x7e20974ccd83b68ae2bd85ae93df1a4f811511af55d293e102596c8018946640477886292022-09-26 12:09:491 hr 7 mins ago Fantom Finance: Wrapped Fantom Token 0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70.05825845406207598 FTM
0x5e36381708ef9a03c9fddc492e1271beec91fe78d2b1182ad9d2a940bfd245f0477885212022-09-26 12:07:481 hr 9 mins ago 0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70x9a71f8a76add70cf553656498b4168bce3cd46dd0.055216082560354035 FTM
0x5e36381708ef9a03c9fddc492e1271beec91fe78d2b1182ad9d2a940bfd245f0477885212022-09-26 12:07:481 hr 9 mins ago Fantom Finance: Wrapped Fantom Token 0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70.055216082560354035 FTM
0xcdacc33acccc8f3e04523399f22bc0438d540e97bf0d8c6c405ed18f0dbd3e68477883722022-09-26 12:05:201 hr 12 mins ago 0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70x9a71f8a76add70cf553656498b4168bce3cd46dd0.223614420926301356 FTM
0xcdacc33acccc8f3e04523399f22bc0438d540e97bf0d8c6c405ed18f0dbd3e68477883722022-09-26 12:05:201 hr 12 mins ago Fantom Finance: Wrapped Fantom Token 0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70.223614420926301356 FTM
0x942c86507cb8250171b7575e01f0c1468b3f714c5c8f0c4735050a463f00afe1477881822022-09-26 12:01:551 hr 15 mins ago 0x6d0176c5ea1e44b08d3dd001b0784ce42f47a3a70x55d5bbe8e9532f18426af58f9adee674c21ffaf25.081467083970171932 FTM
[ Download CSV Export 
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

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 10 : UniswapV2Router02.sol
pragma solidity =0.6.6;

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 uint;

    address public immutable override factory;
    address public immutable override WETH;

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

    constructor(address _factory, address _WETH) public {
        factory = _factory;
        WETH = _WETH;
    }

    receive() external payable {
        assert(msg.sender == WETH); // only accept ETH via fallback from the WETH contract
    }

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal virtual returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        if (IUniswapV2Factory(factory).getPair(tokenA, tokenB) == address(0)) {
            IUniswapV2Factory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = UniswapV2Library.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = UniswapV2Library.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'UniswapV2Router: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = UniswapV2Library.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'UniswapV2Router: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (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,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
        (amountToken, amountETH) = _addLiquidity(
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = UniswapV2Library.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        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,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
        address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
        IUniswapV2Pair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint 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,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountToken, uint amountETH) {
        (amountToken, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountA, uint amountB) {
        address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-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,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountToken, uint amountETH) {
        address pair = UniswapV2Library.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-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,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint 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);
    }
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountETH) {
        address pair = UniswapV2Library.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-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(uint[] memory amounts, address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = UniswapV2Library.sortTokens(input, output);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to;
            IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        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]
        );
        _swap(amounts, path, to);
    }
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint[] memory amounts) {
        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(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        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]}();
        assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
    }
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, '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(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, '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]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        virtual
        override
        payable
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
        amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        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 (uint 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));
            uint amountInput;
            uint amountOutput;
            { // scope to avoid stack too deep errors
            (uint reserve0, uint reserve1,) = pair.getReserves();
            (uint reserveInput, uint reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
            amountInput = IERC20(input).balanceOf(address(pair)).sub(reserveInput);
            amountOutput = UniswapV2Library.getAmountOut(factory, amountInput, reserveInput, reserveOutput);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to;
            pair.swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) {
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn
        );
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        payable
        ensure(deadline)
    {
        require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH');
        uint amountIn = msg.value;
        IWETH(WETH).deposit{value: amountIn}();
        assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn));
        uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint 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));
        uint 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(uint amountA, uint reserveA, uint reserveB) public pure virtual override returns (uint amountB) {
        return UniswapV2Library.quote(amountA, reserveA, reserveB);
    }

    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut)
        public
        view
        virtual
        override
        returns (uint amountOut)
    {
        return UniswapV2Library.getAmountOut(factory, amountIn, reserveIn, reserveOut);
    }

    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut)
        public
        view
        virtual
        override
        returns (uint amountIn)
    {
        return UniswapV2Library.getAmountIn(factory, amountOut, reserveIn, reserveOut);
    }

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

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

File 2 of 10 : TransferHelper.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.6.0;

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

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

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

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

File 3 of 10 : 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 4 of 10 : UniswapV2Library.sol
pragma solidity >=0.5.0;

import '../../../core/contracts/interfaces/IUniswapV2Pair.sol';
import '../../../core/contracts/interfaces/IUniswapV2Factory.sol';

import "./SafeMath.sol";

library UniswapV2Library {
    using SafeMath for uint;

    // returns sorted token addresses, used to handle return values from pairs sorted in this order
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, '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(uint(keccak256(abi.encodePacked(
                hex'ff',
                factory,
                keccak256(abi.encodePacked(token0, token1)),
                hex'2dfbcf1b907f911bc66d083d103a1d7de0b8b21a6cb2a66a78d1f1559018fba4' // init code hash
            ))));
    }

    // fetches and sorts the reserves for a pair
    function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint reserve0, uint 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(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint 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(address factory, uint amountIn, uint reserveIn, uint reserveOut) internal view returns (uint amountOut) {
        require(amountIn > 0, 'UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');

        uint amountInn = (1000-IUniswapV2Factory(factory).swapFee()); // priceDiff 
        uint amountInWithFee = amountIn.mul(amountInn);  // priceDiff 
        uint numerator = amountInWithFee.mul(reserveOut);
        uint denominator = reserveIn.mul(1000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }

    // given an output amount of an asset and pair reserves, returns a required input amount of the other asset
    function getAmountIn(address factory, uint amountOut, uint reserveIn, uint reserveOut) internal view returns (uint amountIn) {
        require(amountOut > 0, 'UniswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
        uint numerator = reserveIn.mul(amountOut).mul(1000);
        uint amountInn = (1000-IUniswapV2Factory(factory).swapFee()); // priceDiff 
        uint denominator = reserveOut.sub(amountOut).mul(amountInn);  // priceDiff
        amountIn = (numerator / denominator).add(1);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

File 8 of 10 : 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 view returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external view 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 9 of 10 : IUniswapV2Pair.sol
pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

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

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

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

    // <TombSwap V2> additions
    function mintFee() external view returns (uint);
    function swapFee() external view returns (uint);
    // <TombSwap V2 />

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"view","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":"view","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":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405234801561001057600080fd5b50604051620048eb380380620048eb8339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c614757620001946000398061015f5280610ce45280610d1f5280610e37528061105552806113df5280611545528061190c5280611a065280611abc5280611b8a5280611cd05280611d585280611fbe528061203952806120e852806121b4528061224952806122bd52806127bb5280612a2e5280612a845280612ab85280612b2c5280612ccc5280612e0f5280612e97525080610db85280610ec55280610f9c528061111b5280611154528061128f528061146d528061152352806116935280611c1d5280611d8a5280611e9c5280611f0e52806122ef528061254852806127405280612769528061279952806129065280612a625280612d5f5280612ec952806137c8528061380b5280613aef5280613c1e5280613c8f528061412c52806141da528061425a52506147576000f3fe60806040526004361061014f5760003560e01c80638803dbee116100b6578063c45a01551161006f578063c45a015514610a10578063d06ca61f14610a25578063ded9382a14610ada578063e8e3370014610b4d578063f305d71914610bcd578063fb3bdb4114610c1357610188565b80638803dbee146107df578063ad5c464814610875578063ad615dec146108a6578063af2979eb146108dc578063b6f9de951461092f578063baa2abde146109b357610188565b80634a25d94a116101085780634a25d94a146104f05780635b0d5984146105865780635c11d795146105f9578063791ac9471461068f5780637ff36ab51461072557806385f8c259146107a957610188565b806302751cec1461018d578063054d50d4146101f957806318cbafe5146102415780631f00ca74146103275780632195995c146103dc57806338ed17391461045a57610188565b3661018857336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461018657fe5b005b600080fd5b34801561019957600080fd5b506101e0600480360360c08110156101b057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610c97565b6040805192835260208301919091528051918290030190f35b34801561020557600080fd5b5061022f6004803603606081101561021c57600080fd5b5080359060208101359060400135610db1565b60408051918252519081900360200190f35b34801561024d57600080fd5b506102d7600480360360a081101561026457600080fd5b813591602081013591810190606081016040820135600160201b81111561028a57600080fd5b82018360208201111561029c57600080fd5b803590602001918460208302840111600160201b831117156102bd57600080fd5b91935091506001600160a01b038135169060200135610de7565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103135781810151838201526020016102fb565b505050509050019250505060405180910390f35b34801561033357600080fd5b506102d76004803603604081101561034a57600080fd5b81359190810190604081016020820135600160201b81111561036b57600080fd5b82018360208201111561037d57600080fd5b803590602001918460208302840111600160201b8311171561039e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611114945050505050565b3480156103e857600080fd5b506101e0600480360361016081101561040057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561114a565b34801561046657600080fd5b506102d7600480360360a081101561047d57600080fd5b813591602081013591810190606081016040820135600160201b8111156104a357600080fd5b8201836020820111156104b557600080fd5b803590602001918460208302840111600160201b831117156104d657600080fd5b91935091506001600160a01b038135169060200135611244565b3480156104fc57600080fd5b506102d7600480360360a081101561051357600080fd5b813591602081013591810190606081016040820135600160201b81111561053957600080fd5b82018360208201111561054b57600080fd5b803590602001918460208302840111600160201b8311171561056c57600080fd5b91935091506001600160a01b03813516906020013561138f565b34801561059257600080fd5b5061022f60048036036101408110156105aa57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e0820135169061010081013590610120013561151b565b34801561060557600080fd5b50610186600480360360a081101561061c57600080fd5b813591602081013591810190606081016040820135600160201b81111561064257600080fd5b82018360208201111561065457600080fd5b803590602001918460208302840111600160201b8311171561067557600080fd5b91935091506001600160a01b038135169060200135611629565b34801561069b57600080fd5b50610186600480360360a08110156106b257600080fd5b813591602081013591810190606081016040820135600160201b8111156106d857600080fd5b8201836020820111156106ea57600080fd5b803590602001918460208302840111600160201b8311171561070b57600080fd5b91935091506001600160a01b0381351690602001356118be565b6102d76004803603608081101561073b57600080fd5b81359190810190604081016020820135600160201b81111561075c57600080fd5b82018360208201111561076e57600080fd5b803590602001918460208302840111600160201b8311171561078f57600080fd5b91935091506001600160a01b038135169060200135611b42565b3480156107b557600080fd5b5061022f600480360360608110156107cc57600080fd5b5080359060208101359060400135611e95565b3480156107eb57600080fd5b506102d7600480360360a081101561080257600080fd5b813591602081013591810190606081016040820135600160201b81111561082857600080fd5b82018360208201111561083a57600080fd5b803590602001918460208302840111600160201b8311171561085b57600080fd5b91935091506001600160a01b038135169060200135611ec3565b34801561088157600080fd5b5061088a611fbc565b604080516001600160a01b039092168252519081900360200190f35b3480156108b257600080fd5b5061022f600480360360608110156108c957600080fd5b5080359060208101359060400135611fe0565b3480156108e857600080fd5b5061022f600480360360c08110156108ff57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611fed565b6101866004803603608081101561094557600080fd5b81359190810190604081016020820135600160201b81111561096657600080fd5b82018360208201111561097857600080fd5b803590602001918460208302840111600160201b8311171561099957600080fd5b91935091506001600160a01b03813516906020013561216e565b3480156109bf57600080fd5b506101e0600480360360e08110156109d657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c001356124fa565b348015610a1c57600080fd5b5061088a61273e565b348015610a3157600080fd5b506102d760048036036040811015610a4857600080fd5b81359190810190604081016020820135600160201b811115610a6957600080fd5b820183602082011115610a7b57600080fd5b803590602001918460208302840111600160201b83111715610a9c57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612762945050505050565b348015610ae657600080fd5b506101e06004803603610140811015610afe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e0820135169061010081013590610120013561278f565b348015610b5957600080fd5b50610baf6004803603610100811015610b7157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e001356128a3565b60408051938452602084019290925282820152519081900360600190f35b610baf600480360360c0811015610be357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a001356129df565b6102d760048036036080811015610c2957600080fd5b81359190810190604081016020820135600160201b811115610c4a57600080fd5b820183602082011115610c5c57600080fd5b803590602001918460208302840111600160201b83111715610c7d57600080fd5b91935091506001600160a01b038135169060200135612c84565b6000808242811015610cde576040805162461bcd60e51b81526020600482015260186024820152600080516020614702833981519152604482015290519081900360640190fd5b610d0d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6124fa565b9093509150610d1d898685613006565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d8357600080fd5b505af1158015610d97573d6000803e3d6000fd5b50505050610da5858361315a565b50965096945050505050565b6000610ddf7f0000000000000000000000000000000000000000000000000000000000000000858585613252565b949350505050565b60608142811015610e2d576040805162461bcd60e51b81526020600482015260186024820152600080516020614702833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610e6757fe5b905060200201356001600160a01b03166001600160a01b031614610ec0576040805162461bcd60e51b815260206004820152601d6024820152600080516020614639833981519152604482015290519081900360640190fd5b610f1e7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133af92505050565b91508682600184510381518110610f3157fe5b60200260200101511015610f765760405162461bcd60e51b815260040180806020018281038252602b81526020018061467f602b913960400191505060405180910390fd5b61101486866000818110610f8657fe5b905060200201356001600160a01b031633610ffa7f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610fc857fe5b905060200201356001600160a01b03168b8b6001818110610fe557fe5b905060200201356001600160a01b03166134fc565b8560008151811061100757fe5b60200260200101516135bc565b61105382878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613719915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061109257fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156110d057600080fd5b505af11580156110e4573d6000803e3d6000fd5b5050505061110984836001855103815181106110fc57fe5b602002602001015161315a565b509695505050505050565b60606111417f0000000000000000000000000000000000000000000000000000000000000000848461395f565b90505b92915050565b600080600061117a7f00000000000000000000000000000000000000000000000000000000000000008f8f6134fc565b9050600087611189578c61118d565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561120357600080fd5b505af1158015611217573d6000803e3d6000fd5b5050505061122a8f8f8f8f8f8f8f6124fa565b809450819550505050509b509b9950505050505050505050565b6060814281101561128a576040805162461bcd60e51b81526020600482015260186024820152600080516020614702833981519152604482015290519081900360640190fd5b6112e87f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133af92505050565b915086826001845103815181106112fb57fe5b602002602001015110156113405760405162461bcd60e51b815260040180806020018281038252602b81526020018061467f602b913960400191505060405180910390fd5b61135086866000818110610f8657fe5b61110982878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613719915050565b606081428110156113d5576040805162461bcd60e51b81526020600482015260186024820152600080516020614702833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061140f57fe5b905060200201356001600160a01b03166001600160a01b031614611468576040805162461bcd60e51b815260206004820152601d6024820152600080516020614639833981519152604482015290519081900360640190fd5b6114c67f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061395f92505050565b915086826000815181106114d657fe5b60200260200101511115610f765760405162461bcd60e51b81526004018080602001828103825260278152602001806146126027913960400191505060405180910390fd5b6000806115697f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006134fc565b9050600086611578578b61157c565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156115f257600080fd5b505af1158015611606573d6000803e3d6000fd5b505050506116188d8d8d8d8d8d611fed565b9d9c50505050505050505050505050565b804281101561166d576040805162461bcd60e51b81526020600482015260186024820152600080516020614702833981519152604482015290519081900360640190fd5b6116e28585600081811061167d57fe5b905060200201356001600160a01b0316336116dc7f0000000000000000000000000000000000000000000000000000000000000000898960008181106116bf57fe5b905060200201356001600160a01b03168a8a6001818110610fe557fe5b8a6135bc565b6000858560001981018181106116f457fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561175957600080fd5b505afa15801561176d573d6000803e3d6000fd5b505050506040513d602081101561178357600080fd5b505160408051602088810282810182019093528882529293506117c5929091899189918291850190849080828437600092019190915250889250613a98915050565b8661187782888860001981018181106117da57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561183f57600080fd5b505afa158015611853573d6000803e3d6000fd5b505050506040513d602081101561186957600080fd5b50519063ffffffff613dc416565b10156118b45760405162461bcd60e51b815260040180806020018281038252602b81526020018061467f602b913960400191505060405180910390fd5b5050505050505050565b8042811015611902576040805162461bcd60e51b81526020600482015260186024820152600080516020614702833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585600019810181811061193c57fe5b905060200201356001600160a01b03166001600160a01b031614611995576040805162461bcd60e51b815260206004820152601d6024820152600080516020614639833981519152604482015290519081900360640190fd5b6119a58585600081811061167d57fe5b6119e3858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613a98915050565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015611a4d57600080fd5b505afa158015611a61573d6000803e3d6000fd5b505050506040513d6020811015611a7757600080fd5b5051905086811015611aba5760405162461bcd60e51b815260040180806020018281038252602b81526020018061467f602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611b2057600080fd5b505af1158015611b34573d6000803e3d6000fd5b505050506118b4848261315a565b60608142811015611b88576040805162461bcd60e51b81526020600482015260186024820152600080516020614702833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611bbf57fe5b905060200201356001600160a01b03166001600160a01b031614611c18576040805162461bcd60e51b815260206004820152601d6024820152600080516020614639833981519152604482015290519081900360640190fd5b611c767f0000000000000000000000000000000000000000000000000000000000000000348888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133af92505050565b91508682600184510381518110611c8957fe5b60200260200101511015611cce5760405162461bcd60e51b815260040180806020018281038252602b81526020018061467f602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611d0a57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d3d57600080fd5b505af1158015611d51573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611db67f0000000000000000000000000000000000000000000000000000000000000000898960008181106116bf57fe5b84600081518110611dc357fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611e1a57600080fd5b505af1158015611e2e573d6000803e3d6000fd5b505050506040513d6020811015611e4457600080fd5b5051611e4c57fe5b611e8b82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613719915050565b5095945050505050565b6000610ddf7f0000000000000000000000000000000000000000000000000000000000000000858585613e14565b60608142811015611f09576040805162461bcd60e51b81526020600482015260186024820152600080516020614702833981519152604482015290519081900360640190fd5b611f677f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061395f92505050565b91508682600081518110611f7757fe5b602002602001015111156113405760405162461bcd60e51b81526004018080602001828103825260278152602001806146126027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610ddf848484613f71565b60008142811015612033576040805162461bcd60e51b81526020600482015260186024820152600080516020614702833981519152604482015290519081900360640190fd5b612062887f000000000000000000000000000000000000000000000000000000000000000089898930896124fa565b604080516370a0823160e01b815230600482015290519194506120e692508a9187916001600160a01b038416916370a0823191602480820192602092909190829003018186803b1580156120b557600080fd5b505afa1580156120c9573d6000803e3d6000fd5b505050506040513d60208110156120df57600080fd5b5051613006565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561214c57600080fd5b505af1158015612160573d6000803e3d6000fd5b50505050611109848361315a565b80428110156121b2576040805162461bcd60e51b81526020600482015260186024820152600080516020614702833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316858560008181106121e957fe5b905060200201356001600160a01b03166001600160a01b031614612242576040805162461bcd60e51b815260206004820152601d6024820152600080516020614639833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156122a257600080fd5b505af11580156122b6573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb61231b7f0000000000000000000000000000000000000000000000000000000000000000898960008181106116bf57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561236b57600080fd5b505af115801561237f573d6000803e3d6000fd5b505050506040513d602081101561239557600080fd5b505161239d57fe5b6000868660001981018181106123af57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561241457600080fd5b505afa158015612428573d6000803e3d6000fd5b505050506040513d602081101561243e57600080fd5b505160408051602089810282810182019093528982529293506124809290918a918a918291850190849080828437600092019190915250899250613a98915050565b87611877828989600019810181811061249557fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561183f57600080fd5b6000808242811015612541576040805162461bcd60e51b81526020600482015260186024820152600080516020614702833981519152604482015290519081900360640190fd5b600061256e7f00000000000000000000000000000000000000000000000000000000000000008c8c6134fc565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b1580156125c957600080fd5b505af11580156125dd573d6000803e3d6000fd5b505050506040513d60208110156125f357600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b15801561264057600080fd5b505af1158015612654573d6000803e3d6000fd5b505050506040513d604081101561266a57600080fd5b508051602090910151909250905060006126848e8e61401d565b509050806001600160a01b03168e6001600160a01b0316146126a75781836126aa565b82825b90975095508a8710156126ee5760405162461bcd60e51b81526004018080602001828103825260268152602001806146596026913960400191505060405180910390fd5b8986101561272d5760405162461bcd60e51b815260040180806020018281038252602681526020018061459f6026913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606111417f000000000000000000000000000000000000000000000000000000000000000084846133af565b60008060006127df7f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006134fc565b90506000876127ee578c6127f2565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561286857600080fd5b505af115801561287c573d6000803e3d6000fd5b5050505061288e8e8e8e8e8e8e610c97565b909f909e509c50505050505050505050505050565b600080600083428110156128ec576040805162461bcd60e51b81526020600482015260186024820152600080516020614702833981519152604482015290519081900360640190fd5b6128fa8c8c8c8c8c8c6140fb565b9094509250600061292c7f00000000000000000000000000000000000000000000000000000000000000008e8e6134fc565b905061293a8d3383886135bc565b6129468c3383876135bc565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b15801561299e57600080fd5b505af11580156129b2573d6000803e3d6000fd5b505050506040513d60208110156129c857600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015612a28576040805162461bcd60e51b81526020600482015260186024820152600080516020614702833981519152604482015290519081900360640190fd5b612a568a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c6140fb565b90945092506000612aa87f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006134fc565b9050612ab68b3383886135bc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612b1157600080fd5b505af1158015612b25573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612baa57600080fd5b505af1158015612bbe573d6000803e3d6000fd5b505050506040513d6020811015612bd457600080fd5b5051612bdc57fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612c3457600080fd5b505af1158015612c48573d6000803e3d6000fd5b505050506040513d6020811015612c5e57600080fd5b5051925034841015612c7657612c763385340361315a565b505096509650969350505050565b60608142811015612cca576040805162461bcd60e51b81526020600482015260186024820152600080516020614702833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612d0157fe5b905060200201356001600160a01b03166001600160a01b031614612d5a576040805162461bcd60e51b815260206004820152601d6024820152600080516020614639833981519152604482015290519081900360640190fd5b612db87f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061395f92505050565b91503482600081518110612dc857fe5b60200260200101511115612e0d5760405162461bcd60e51b81526004018080602001828103825260278152602001806146126027913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612e4957fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612e7c57600080fd5b505af1158015612e90573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612ef57f0000000000000000000000000000000000000000000000000000000000000000898960008181106116bf57fe5b84600081518110612f0257fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612f5957600080fd5b505af1158015612f6d573d6000803e3d6000fd5b505050506040513d6020811015612f8357600080fd5b5051612f8b57fe5b612fca82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613719915050565b81600081518110612fd757fe5b6020026020010151341115611e8b57611e8b3383600081518110612ff757fe5b6020026020010151340361315a565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106130835780518252601f199092019160209182019101613064565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146130e5576040519150601f19603f3d011682016040523d82523d6000602084013e6130ea565b606091505b5091509150818015613118575080511580613118575080806020019051602081101561311557600080fd5b50515b6131535760405162461bcd60e51b815260040180806020018281038252602d8152602001806146aa602d913960400191505060405180910390fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106131a65780518252601f199092019160209182019101613187565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613208576040519150601f19603f3d011682016040523d82523d6000602084013e61320d565b606091505b505090508061324d5760405162461bcd60e51b81526004018080602001828103825260348152602001806145466034913960400191505060405180910390fd5b505050565b60008084116132925760405162461bcd60e51b815260040180806020018281038252602b8152602001806146d7602b913960400191505060405180910390fd5b6000831180156132a25750600082115b6132dd5760405162461bcd60e51b81526004018080602001828103825260288152602001806145c56028913960400191505060405180910390fd5b6000856001600160a01b03166354cf2aeb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561331857600080fd5b505afa15801561332c573d6000803e3d6000fd5b505050506040513d602081101561334257600080fd5b50516103e8039050600061335c868363ffffffff61436f16565b90506000613370828663ffffffff61436f16565b905060006133968361338a896103e863ffffffff61436f16565b9063ffffffff6143d216565b90508082816133a157fe5b049998505050505050505050565b6060600282511015613408576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561342057600080fd5b5060405190808252806020026020018201604052801561344a578160200160208202803683370190505b509050828160008151811061345b57fe5b60200260200101818152505060005b60018351038110156134f4576000806134ad8786858151811061348957fe5b60200260200101518786600101815181106134a057fe5b6020026020010151614421565b915091506134d0878585815181106134c157fe5b60200260200101518484613252565b8484600101815181106134df57fe5b6020908102919091010152505060010161346a565b509392505050565b600080600061350b858561401d565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f2dfbcf1b907f911bc66d083d103a1d7de0b8b21a6cb2a66a78d1f1559018fba4609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106136415780518252601f199092019160209182019101613622565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146136a3576040519150601f19603f3d011682016040523d82523d6000602084013e6136a8565b606091505b50915091508180156136d65750805115806136d657508080602001905160208110156136d357600080fd5b50515b6137115760405162461bcd60e51b81526004018080602001828103825260318152602001806145156031913960400191505060405180910390fd5b505050505050565b60005b60018351038110156139595760008084838151811061373757fe5b602002602001015185846001018151811061374e57fe5b6020026020010151915091506000613766838361401d565b509050600087856001018151811061377a57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146137a8578260006137ac565b6000835b91509150600060028a510388106137c35788613804565b6138047f0000000000000000000000000000000000000000000000000000000000000000878c8b600201815181106137f757fe5b60200260200101516134fc565b90506138317f000000000000000000000000000000000000000000000000000000000000000088886134fc565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f19166020018201604052801561386e576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156138df5781810151838201526020016138c7565b50505050905090810190601f16801561390c5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561392e57600080fd5b505af1158015613942573d6000803e3d6000fd5b50506001909901985061371c975050505050505050565b50505050565b60606002825110156139b8576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff811180156139d057600080fd5b506040519080825280602002602001820160405280156139fa578160200160208202803683370190505b5090508281600183510381518110613a0e57fe5b60209081029190910101528151600019015b80156134f457600080613a5087866001860381518110613a3c57fe5b60200260200101518786815181106134a057fe5b91509150613a7387858581518110613a6457fe5b60200260200101518484613e14565b846001850381518110613a8257fe5b6020908102919091010152505060001901613a20565b60005b600183510381101561324d57600080848381518110613ab657fe5b6020026020010151858460010181518110613acd57fe5b6020026020010151915091506000613ae5838361401d565b5090506000613b157f000000000000000000000000000000000000000000000000000000000000000085856134fc565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613b5657600080fd5b505afa158015613b6a573d6000803e3d6000fd5b505050506040513d6060811015613b8057600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613bb6578284613bb9565b83835b91509150613c17828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561183f57600080fd5b9550613c457f0000000000000000000000000000000000000000000000000000000000000000878484613252565b945050505050600080856001600160a01b0316886001600160a01b031614613c6f57826000613c73565b6000835b91509150600060028c51038a10613c8a578a613cbe565b613cbe7f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106137f757fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613d48578181015183820152602001613d30565b50505050905090810190601f168015613d755780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613d9757600080fd5b505af1158015613dab573d6000803e3d6000fd5b50506001909b019a50613a9b9950505050505050505050565b80820382811115611144576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b6000808411613e545760405162461bcd60e51b815260040180806020018281038252602c8152602001806144e9602c913960400191505060405180910390fd5b600083118015613e645750600082115b613e9f5760405162461bcd60e51b81526004018080602001828103825260288152602001806145c56028913960400191505060405180910390fd5b6000613ec36103e8613eb7868863ffffffff61436f16565b9063ffffffff61436f16565b90506000866001600160a01b03166354cf2aeb6040518163ffffffff1660e01b815260040160206040518083038186803b158015613f0057600080fd5b505afa158015613f14573d6000803e3d6000fd5b505050506040513d6020811015613f2a57600080fd5b50516103e80390506000613f4882613eb7878a63ffffffff613dc416565b9050613f656001828581613f5857fe5b049063ffffffff6143d216565b98975050505050505050565b6000808411613fb15760405162461bcd60e51b81526004018080602001828103825260258152602001806145ed6025913960400191505060405180910390fd5b600083118015613fc15750600082115b613ffc5760405162461bcd60e51b81526004018080602001828103825260288152602001806145c56028913960400191505060405180910390fd5b8261400d858463ffffffff61436f16565b8161401457fe5b04949350505050565b600080826001600160a01b0316846001600160a01b031614156140715760405162461bcd60e51b815260040180806020018281038252602581526020018061457a6025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610614091578284614094565b83835b90925090506001600160a01b0382166140f4576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b6040805163e6a4390560e01b81526001600160a01b03888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b15801561417557600080fd5b505afa158015614189573d6000803e3d6000fd5b505050506040513d602081101561419f57600080fd5b50516001600160a01b0316141561425257604080516364e329cb60e11b81526001600160a01b038a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b15801561422557600080fd5b505af1158015614239573d6000803e3d6000fd5b505050506040513d602081101561424f57600080fd5b50505b6000806142807f00000000000000000000000000000000000000000000000000000000000000008b8b614421565b91509150816000148015614292575080155b156142a257879350869250614362565b60006142af898484613f71565b905087811161430257858110156142f75760405162461bcd60e51b815260040180806020018281038252602681526020018061459f6026913960400191505060405180910390fd5b889450925082614360565b600061430f898486613f71565b90508981111561431b57fe5b8781101561435a5760405162461bcd60e51b81526004018080602001828103825260268152602001806146596026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b600081158061438a5750508082028282828161438757fe5b04145b611144576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611144576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b6000806000614430858561401d565b5090506000806144418888886134fc565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561447957600080fd5b505afa15801561448d573d6000803e3d6000fd5b505050506040513d60608110156144a357600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b03878116908416146144d65780826144d9565b81815b9099909850965050505050505056fe556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c65645472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c6564556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54556e69737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54556e69737761705632526f757465723a20494e56414c49445f50415448000000556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e54556e69737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54556e69737761705632526f757465723a20455850495245440000000000000000a2646970667358221220d0ee0c26a88183b71fba98a14e122112ce28e7132daef5b477e7455aaec2bb4b64736f6c63430006060033000000000000000000000000e236f6890f1824fa0a7ffc39b1597a5a6077cfe900000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83

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

000000000000000000000000e236f6890f1824fa0a7ffc39b1597a5a6077cfe900000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83

-----Decoded View---------------
Arg [0] : _factory (address): 0xe236f6890f1824fa0a7ffc39b1597a5a6077cfe9
Arg [1] : _WETH (address): 0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000e236f6890f1824fa0a7ffc39b1597a5a6077cfe9
Arg [1] : 00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.