Contract 0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d 3

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xba0cf5be7caa86c5f489d2d677bc668049b1a1a0de2188d95f56156a16d68e5eSwap Exact Token...414142102022-06-26 22:35:5755 mins ago0xf9c5e78eadbad0e283fe378b7d9aab475fa5f376 IN  0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0 FTM0.057547844538
0x8c88458f9818f6660045c609a9c522bd6b2f41e8228b5c6474d167b6392a053eSwap Exact Token...414130172022-06-26 22:08:591 hr 22 mins ago0xe59150cc54b28d55b9b1df175a3bdff10a29d1ba IN  0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0 FTM0.000363180281
0x581a06fb990174738b37e58f677158e736e9290e4a2cf788fc57141618bde215Swap Exact Token...414114922022-06-26 21:41:371 hr 49 mins ago0xdbfbbffd96ef94cba2569ffa6bdced9c45777d0f IN  0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0 FTM0.000370384977
0x9de9731c88f43812306e075869fe719232368d9f3f608bc155706c431b9f7377Swap Exact Token...414109432022-06-26 21:32:111 hr 59 mins ago0xe59150cc54b28d55b9b1df175a3bdff10a29d1ba IN  0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0 FTM0.000388990825
0x832623f7bcbdd0b33fcf15b97b493ef13b2db6fdf41e6b58ba0fa81313dc6236Swap Exact Token...414069802022-06-26 20:22:433 hrs 8 mins ago0xe59150cc54b28d55b9b1df175a3bdff10a29d1ba IN  0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0 FTM0.009464777376
0x623a7edff90b6787a0ee7f3f0aa975fbaccc7f2966aff7124f9504269c68d706Swap Exact Token...414036652022-06-26 19:23:404 hrs 7 mins ago0x9b5fcc2f81a5e1906247eaf57eacd5c587bd1d59 IN  0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0 FTM0.009090834791
0xd09cabc117067587b408fd064e3ab6edaf0e82b85a6e62704c6a3e895eb861f7Swap Exact Token...414033302022-06-26 19:17:564 hrs 13 mins ago0xe59150cc54b28d55b9b1df175a3bdff10a29d1ba IN  0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0 FTM0.000436693498
0x98a25150891e7e13d03efba8d6979514a2f0de40dc449555d89a6b4dce741c04Swap Exact Token...414007202022-06-26 18:31:155 hrs ago0x1d226020f9deb6d2a9bc96863aa1d21738da6d52 IN  0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0 FTM0.055342361541
0x7fd57e7d8c02aa76dcb33eab24666f9f919456b23e1e2fab071674349ba916a8Swap Exact Token...413998162022-06-26 18:12:365 hrs 18 mins ago0xe59150cc54b28d55b9b1df175a3bdff10a29d1ba IN  0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0 FTM0.053435391345
0x6b0aa7e63c5d8d0ff751ab47d1a826f65952ea60b3dbb1a5de7eb40829b348eeSwap Exact Token...413976772022-06-26 17:33:275 hrs 58 mins ago0xf9c5e78eadbad0e283fe378b7d9aab475fa5f376 IN  0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0 FTM0.000462056274
0xa482b2d88d9aca1c9e9c3e0ed82774a63067e326e32705556e1c1340e9967436Swap Exact Token...413967052022-06-26 17:12:426 hrs 18 mins ago0xe59150cc54b28d55b9b1df175a3bdff10a29d1ba IN  0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0 FTM0.000379307938
0xc98e21c8582c7bc02f27bd358f3de7a2acd6ba410dcad58ec8b40c1f0a6d4831Swap Exact Token...413949682022-06-26 16:41:206 hrs 50 mins ago0xdbfbbffd96ef94cba2569ffa6bdced9c45777d0f IN  0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0 FTM0.00039668778
0x2baae61ff5943c9eda81f705252d713f6b979e0acd915284201dd32c2abea051Swap Exact Token...413944122022-06-26 16:32:086 hrs 59 mins ago0xe59150cc54b28d55b9b1df175a3bdff10a29d1ba IN  0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0 FTM0.000401916499
0x293a0f4899f24c8982ef646331850be32aa6447d02099c7dab567224954ab609Swap Exact Token...413942092022-06-26 16:28:367 hrs 2 mins ago0xe59150cc54b28d55b9b1df175a3bdff10a29d1ba IN  0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0 FTM0.000407164363
0x86522838c9ee9210297d8858b2f89d60ed440d9557a5fa2f586372d1809a6935Swap Exact Token...413916012022-06-26 15:43:287 hrs 48 mins ago0x4600f1ba62ffc703947bd917c057f7b366b9d4f9 IN  0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0 FTM0.000431684218
0x721b9626acf70742a4130ea265225e1741e7ab2659712f14d095aef0be7ebc62Swap Exact Token...413905042022-06-26 15:23:268 hrs 8 mins ago0xe59150cc54b28d55b9b1df175a3bdff10a29d1ba IN  0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0 FTM0.000474509634
0x45754ed1787803a19f55e5728051968acd6e8112504ae8afb47dcbf105829f66Swap Exact Token...413869882022-06-26 14:16:389 hrs 14 mins ago0x9b5fcc2f81a5e1906247eaf57eacd5c587bd1d59 IN  0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0 FTM0.000547024966
0x88618ca2fa4ea8c14d47605bd2a69e66f52837a0427d720a0110a82b6bab6b0dSwap Exact Token...413864622022-06-26 14:06:519 hrs 24 mins ago0xe59150cc54b28d55b9b1df175a3bdff10a29d1ba IN  0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0 FTM0.0004101926
0x39dd248bbf261d021f148581512a95cf480258175ffa6a20d6d3d1f958b3ca5cSwap Exact Token...413864602022-06-26 14:06:499 hrs 24 mins ago0xe59150cc54b28d55b9b1df175a3bdff10a29d1ba IN  0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0 FTM0.0004101926
0xcafe6ece8b5bb3f70041946bcf06d5b7e11253b4f49459f37ea2801f678cad2bSwap Exact Token...413833202022-06-26 13:09:1910 hrs 22 mins ago0xe59150cc54b28d55b9b1df175a3bdff10a29d1ba IN  0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0 FTM0.000415655697
0x96cb21d4e9b98faeb92ebefb758f90fccf0c7849cbb8f6474eb9d824e55bb3afSwap Exact Token...413800452022-06-26 12:08:2411 hrs 23 mins ago0xe59150cc54b28d55b9b1df175a3bdff10a29d1ba IN  0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0 FTM0.001875106385
0x022b66897ba3733786b811a2ef91374b141604b950666556936891e3b7e5b005Swap Exact Token...413797142022-06-26 12:02:3311 hrs 28 mins ago0xdbfbbffd96ef94cba2569ffa6bdced9c45777d0f IN  0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0 FTM0.016323781274
0x569d3eef2b93ca121ca8b8099c0fa29dccce18dc3a270e8d65507964fcc93ba0Swap Exact Token...413776522022-06-26 11:21:5912 hrs 9 mins ago0xe59150cc54b28d55b9b1df175a3bdff10a29d1ba IN  0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0 FTM0.000372618803
0x49d9184dfede81a286500e9ffd2a6b1647f11e8975082d3e69800dcc85e1eb5cSwap Exact Token...413770242022-06-26 11:09:1912 hrs 22 mins ago0x4600f1ba62ffc703947bd917c057f7b366b9d4f9 IN  0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0 FTM0.009265522731
0x9537bbd0d50a1101b63f1107cb348bc135941a58a9e69df6a5d2f46a36915264Swap Exact Token...413738532022-06-26 10:15:0013 hrs 16 mins ago0xe59150cc54b28d55b9b1df175a3bdff10a29d1ba IN  0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0 FTM0.000387030104
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xe7220b05c24990760652e44aa6addd514efcfe852e72027463aa5524b1f98862413179322022-06-25 17:14:011 day 6 hrs ago 0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d Fantom Finance: Wrapped Fantom Token1 FTM
0xd1571cc8402488de5d4583336372588be4955de74863e50d71e2894c3df39329413178702022-06-25 17:12:561 day 6 hrs ago 0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d Fantom Finance: Wrapped Fantom Token4.861433704677325811 FTM
0xc4f26b69e099a215dd7307665c62f41fcfc5e734331e5e8786f9e8b7255a5a6b413178112022-06-25 17:11:361 day 6 hrs ago 0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0xeda687a18d49fdcddfae38475cc4f3ce979ac1336.801379558615389449 FTM
0xc4f26b69e099a215dd7307665c62f41fcfc5e734331e5e8786f9e8b7255a5a6b413178112022-06-25 17:11:361 day 6 hrs ago Fantom Finance: Wrapped Fantom Token 0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d6.801379558615389449 FTM
0x58ff54839ebde0222f9ced28809c6bf7eaaafef19f985344a384cb65838a7d1a413174022022-06-25 17:02:211 day 6 hrs ago 0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d Fantom Finance: Wrapped Fantom Token0.4 FTM
0xdc1f90526b410da2196ebcc0716557ab0fa6d51801fc51641a4dae06af04a871413160392022-06-25 16:38:031 day 6 hrs ago 0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d Fantom Finance: Wrapped Fantom Token0.4 FTM
0x018873d5bbe3416b7d44b7160252d56ac3e2c5b118e45bbbeaf288cedf8913f6412029042022-06-24 4:52:222 days 18 hrs ago 0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0xf8249b8d751f54dc7b317603ffffc4cbd093c54376.907826002637859212 FTM
0x018873d5bbe3416b7d44b7160252d56ac3e2c5b118e45bbbeaf288cedf8913f6412029042022-06-24 4:52:222 days 18 hrs ago Fantom Finance: Wrapped Fantom Token 0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d76.907826002637859212 FTM
0xad54200b84c08e410b73f42f60b328c93f55a945e5033b3ab85d7c23d718ad0b410350672022-06-21 21:59:165 days 1 hr ago 0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0x5c94d4daa0dfa13da7ce47def754c962088c21398.841679004831526525 FTM
0xad54200b84c08e410b73f42f60b328c93f55a945e5033b3ab85d7c23d718ad0b410350672022-06-21 21:59:165 days 1 hr ago Fantom Finance: Wrapped Fantom Token 0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d8.841679004831526525 FTM
0xa2d16f90b3159f47fe8505c2b634f96f02caa0234f713b847031c7dff2ec113a408119032022-06-18 20:51:598 days 2 hrs ago 0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0xae5579e9db179f9b0e096563931bf6102dbf5edf1.002067992477785774 FTM
0xa2d16f90b3159f47fe8505c2b634f96f02caa0234f713b847031c7dff2ec113a408119032022-06-18 20:51:598 days 2 hrs ago Fantom Finance: Wrapped Fantom Token 0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d1.002067992477785774 FTM
0xb937c06662f3a89d303adf8268b227597c680b6060331b01ec73688bbdbcb2d1404990092022-06-14 12:08:3512 days 11 hrs ago 0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d Fantom Finance: Wrapped Fantom Token200 FTM
0x73e84e670100dabd8940d5c1204ee406b3acb3276aff8e36f905810ae2f03a05404983252022-06-14 11:55:3712 days 11 hrs ago 0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d Fantom Finance: Wrapped Fantom Token2 FTM
0xec54053f8c563eaedd630b591fd58b2a4a543324ca19b5538d3c8fcca7b73a80404134632022-06-13 8:30:1013 days 15 hrs ago 0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d Fantom Finance: Wrapped Fantom Token1 FTM
0xc87a0181e3f0d2dbb06a982d2c7a6a9f90eb00b9bc5be8f81ec0faf88f17d258401807192022-06-10 3:12:2716 days 20 hrs ago 0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d Fantom Finance: Wrapped Fantom Token31.4424 FTM
0xeb6368eab96e8013d7cf88cead03b9a8d29fb5eb58817a4ceda2590975467186400999312022-06-09 0:39:4917 days 22 hrs ago 0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d Fantom Finance: Wrapped Fantom Token0.2 FTM
0x6fc4b6942f204626da4e5e1041852d2a249dfa7f27dd8701c8f172cc755ca7b4400947152022-06-08 22:56:2518 days 35 mins ago 0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d Fantom Finance: Wrapped Fantom Token0.1 FTM
0xdc95c5a44269f34ee2faf2ac9dd52158846adb146a4eba3790025aa74811b6fe400790412022-06-08 17:34:1318 days 5 hrs ago 0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0x54298c50301430560c747c9b88eff3dc98613add2.833350389586339004 FTM
0xdc95c5a44269f34ee2faf2ac9dd52158846adb146a4eba3790025aa74811b6fe400790412022-06-08 17:34:1318 days 5 hrs ago Fantom Finance: Wrapped Fantom Token 0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d2.833350389586339004 FTM
0xe930ef00a20596edc1cb18889029ce0b0210093cabc0b8018c34a7e85e5ff49b400171612022-06-07 21:26:0419 days 2 hrs ago 0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d Fantom Finance: Wrapped Fantom Token0.5 FTM
0xa4cd278a897e6464ef74bb5ac58cfaa045643efa5538606d37f59f76bea321c9399786852022-06-07 9:06:0319 days 14 hrs ago 0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0x54298c50301430560c747c9b88eff3dc98613add0.189438856431165229 FTM
0xa4cd278a897e6464ef74bb5ac58cfaa045643efa5538606d37f59f76bea321c9399786852022-06-07 9:06:0319 days 14 hrs ago Fantom Finance: Wrapped Fantom Token 0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0.189438856431165229 FTM
0x106fdf5303b359817de50b9109666bc68b6de0b2c42d4630cb8b11e0308a488e399577102022-06-07 2:19:0519 days 21 hrs ago 0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d Fantom Finance: Wrapped Fantom Token0.01 FTM
0x6ef21ea5c78e7aeaab7dec60bd5bbcd2758336903c111e9a844518d8d6d0fc31398976302022-06-06 6:52:3620 days 16 hrs ago 0x2724b9497b2cf3325c6be3ea430b3cec34b5ef2d0x839375339b030c4a8a2f8bcedd85c308d898307a72.398998968464207039 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
UniswapV2Router02

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 13 : UniswapV2Router02.sol
// SPDX-License-Identifier: MIT
pragma solidity =0.6.12;


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

contract UniswapV2Router02 is IUniswapV2Router02, NativeMetaTransaction{
    using SafeMathUniswap 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;
        _initializeEIP712("UniswapV2Router02");
    }

    receive() external payable {
        assert(_msgSender() == 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) {
        address sender = _msgSender();
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, 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 sender = _msgSender();
        address pair = UniswapV2Library.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, 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(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(_msgSender(), 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(_msgSender(), 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(_msgSender(), 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, IERC20Uniswap(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(_msgSender(), 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], _msgSender(), 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], _msgSender(), 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], _msgSender(), 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], _msgSender(), 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(_msgSender(), 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 = IERC20Uniswap(input).balanceOf(address(pair)).sub(reserveInput);
            amountOutput = UniswapV2Library.getAmountOut(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], _msgSender(), UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn
        );
        uint balanceBefore = IERC20Uniswap(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20Uniswap(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 = IERC20Uniswap(path[path.length - 1]).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(path, to);
        require(
            IERC20Uniswap(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], _msgSender(), UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn
        );
        _swapSupportingFeeOnTransferTokens(path, address(this));
        uint amountOut = IERC20Uniswap(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
        pure
        virtual
        override
        returns (uint amountOut)
    {
        return UniswapV2Library.getAmountOut(amountIn, reserveIn, reserveOut);
    }

    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut)
        public
        pure
        virtual
        override
        returns (uint amountIn)
    {
        return UniswapV2Library.getAmountIn(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 13 : UniswapV2Library.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;

import '../interfaces/IUniswapV2Pair.sol';
import './SafeMath.sol';

library UniswapV2Library {
    using SafeMathUniswap for uint256;

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

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

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

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

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

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

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

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

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

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, uint 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: APPROVE_FAILED');
    }

    function safeTransfer(address token, address to, uint 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: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint 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: TRANSFER_FROM_FAILED');
    }

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

File 4 of 13 : SafeMath.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.12;

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

library SafeMathUniswap {
    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 5 of 13 : NativeMetaTransaction.sol
pragma solidity >= 0.6.6;

import  "../SafeMath.sol";
import  "./EIP712Base.sol";

contract NativeMetaTransaction is EIP712Base {
    using SafeMathUniswap for uint;
    bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256(
        bytes(
            "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
        )
    );
    event MetaTransactionExecuted(
        address userAddress,
        address payable relayerAddress,
        bytes functionSignature
    );
    mapping(address => uint256) nonces;

    /*
     * Meta transaction structure.
     * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas
     * He should call the desired function directly in that case.
     */
    struct MetaTransaction {
        uint256 nonce;
        address from;
        bytes functionSignature;
    }

    function executeMetaTransaction(
        address userAddress,
        bytes memory functionSignature,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) public payable returns (bytes memory) {
        MetaTransaction memory metaTx = MetaTransaction({
            nonce: nonces[userAddress],
            from: userAddress,
            functionSignature: functionSignature
        });

        require(
            verify(userAddress, metaTx, sigR, sigS, sigV),
            "Signer and signature do not match"
        );

        // increase nonce for user (to avoid re-use)
        nonces[userAddress] = nonces[userAddress].add(1);

        emit MetaTransactionExecuted(
            userAddress,
            msg.sender,
            functionSignature
        );

        // Append userAddress and relayer address at the end to extract it from calling context
        (bool success, bytes memory returnData) = address(this).call(
            abi.encodePacked(functionSignature, userAddress)
        );
        require(success, "Function call not successful");

        return returnData;
    }

    function hashMetaTransaction(MetaTransaction memory metaTx)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encode(
                    META_TRANSACTION_TYPEHASH,
                    metaTx.nonce,
                    metaTx.from,
                    keccak256(metaTx.functionSignature)
                )
            );
    }

    function getNonce(address user) public view returns (uint256 nonce) {
        nonce = nonces[user];
    }

    function verify(
        address signer,
        MetaTransaction memory metaTx,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) internal view returns (bool) {
        require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER");
        return
            signer ==
            ecrecover(
                toTypedMessageHash(hashMetaTransaction(metaTx)),
                sigV,
                sigR,
                sigS
            );
    }

    function _msgSender() internal view returns (address payable sender) {
        if(msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
                sender := and(mload(add(array, index)), 0xffffffffffffffffffffffffffffffffffffffff)
            }
        } else {
            sender = msg.sender;
        }
        return sender;
    }

}

File 6 of 13 : Initializable.sol
pragma solidity >= 0.6.6;

contract Initializable {
    bool inited = false;

    modifier initializer() {
        require(!inited, "already inited");
        _;
        inited = true;
    }
}

File 7 of 13 : EIP712Base.sol
pragma solidity >= 0.6.6;

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

contract EIP712Base is Initializable {
    struct EIP712Domain {
        string name;
        string version;
        address verifyingContract;
        bytes32 salt;
    }

    string constant public ERC712_VERSION = "1";

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(
        bytes(
            "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
        )
    );
    bytes32 internal domainSeperator;

    // supposed to be called once while initializing.
    // one of the contractsa that inherits this contract follows proxy pattern
    // so it is not possible to do this in a constructor
    function _initializeEIP712(
        string memory name
    )
        internal
        initializer
    {
        _setDomainSeperator(name);
    }

    function _setDomainSeperator(string memory name) internal {
        domainSeperator = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                keccak256(bytes(ERC712_VERSION)),
                address(this),
                bytes32(getChainId())
            )
        );
    }

    function getDomainSeperator() public view returns (bytes32) {
        return domainSeperator;
    }

    function getChainId() public pure returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }

    /**
     * Accept message hash and returns hash message in EIP712 compatible form
     * So that it can be used to recover signer from signature signed using EIP712 formatted data
     * https://eips.ethereum.org/EIPS/eip-712
     * "\\x19" makes the encoding deterministic
     * "\\x01" is the version byte to make it compatible to EIP-191
     */
    function toTypedMessageHash(bytes32 messageHash)
        internal
        view
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)
            );
    }
}

File 8 of 13 : IWETH.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;

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

File 9 of 13 : IUniswapV2Router02.sol
// SPDX-License-Identifier: MIT
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 10 of 13 : IUniswapV2Router01.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

File 11 of 13 : IUniswapV2Pair.sol
// SPDX-License-Identifier: MIT
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 12 of 13 : IUniswapV2Factory.sol
// SPDX-License-Identifier: MIT
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);
    function migrator() external view returns (address);

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

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

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

File 13 of 13 : IERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"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":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","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"}]

60c06040526000805460ff191690553480156200001b57600080fd5b506040516200516a3803806200516a833981810160405260408110156200004157600080fd5b5080516020918201516001600160601b0319606083811b821660805282901b1660a0526040805180820190915260118152702ab734b9bbb0b82b192937baba32b9181960791b9381019390935290916200009b90620000a3565b5050620001d1565b60005460ff1615620000ed576040805162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481a5b9a5d195960921b604482015290519081900360640190fd5b620000f88162000108565b506000805460ff19166001179055565b6040518060800160405280604f81526020016200511b604f913980516020918201208251838301206040805180820190915260018152603160f81b930192909252907fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc63062000176620001cd565b60001b60405160200180868152602001858152602001848152602001836001600160a01b03168152602001828152602001955050505050506040516020818303038152906040528051906020012060018190555050565b4690565b60805160601c60a05160601c614e1c620002ff600039806101cd5280610f725280610fad52806113ce52806115f352806119b65280611b1c5280611ee65280611fc1528061209b528061216952806122af5280612337528061257352806125ee52806126a2528061276e528061280352806128775280612d705280612ffb528061305d52806130915280613105528061329452806133d7528061345f52508061145c528061153a52806116b952806116f852806118665280611a445280611afa5280611c8552806121fc528061236952806124c352806128a95280612ae75280612cf55280612d1e5280612d4e5280612edb528061303b528061332752806134915280613e475280613e8a528061416452806142da52806146cb528061478452806148375250614e1c6000f3fe6080604052600436106101c65760003560e01c8063791ac947116100f7578063b6f9de9511610095578063ded9382a11610064578063ded9382a14610d0a578063e8e3370014610d7d578063f305d71914610dfd578063fb3bdb4114610e435761020f565b8063b6f9de9514610b5f578063baa2abde14610be3578063c45a015514610c40578063d06ca61f14610c555761020f565b80638803dbee116100d15780638803dbee14610a0f578063ad5c464814610aa5578063ad615dec14610ad6578063af2979eb14610b0c5761020f565b8063791ac947146108bf5780637ff36ab51461095557806385f8c259146109d95761020f565b80632195995c1161016457806338ed17391161013e57806338ed17391461068a5780634a25d94a146107205780635b0d5984146107b65780635c11d795146108295761020f565b80632195995c146105c45780632d0335ab146106425780633408e470146106755761020f565b80630f7e5970116101a05780630f7e5970146103ff57806318cbafe5146104145780631f00ca74146104fa57806320379ee5146105af5761020f565b806302751cec14610214578063054d50d4146102805780630c53c51c146102c85761020f565b3661020f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166101fd610ec7565b6001600160a01b03161461020d57fe5b005b600080fd5b34801561022057600080fd5b50610267600480360360c081101561023757600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610f25565b6040805192835260208301919091528051918290030190f35b34801561028c57600080fd5b506102b6600480360360608110156102a357600080fd5b508035906020810135906040013561103f565b60408051918252519081900360200190f35b61038a600480360360a08110156102de57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b81111561030857600080fd5b82018360208201111561031a57600080fd5b803590602001918460018302840111600160201b8311171561033b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550508235935050506020810135906040013560ff16611054565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103c45781810151838201526020016103ac565b50505050905090810190601f1680156103f15780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561040b57600080fd5b5061038a611361565b34801561042057600080fd5b506104aa600480360360a081101561043757600080fd5b813591602081013591810190606081016040820135600160201b81111561045d57600080fd5b82018360208201111561046f57600080fd5b803590602001918460208302840111600160201b8311171561049057600080fd5b91935091506001600160a01b03813516906020013561137e565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156104e65781810151838201526020016104ce565b505050509050019250505060405180910390f35b34801561050657600080fd5b506104aa6004803603604081101561051d57600080fd5b81359190810190604081016020820135600160201b81111561053e57600080fd5b82018360208201111561055057600080fd5b803590602001918460208302840111600160201b8311171561057157600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506116b2945050505050565b3480156105bb57600080fd5b506102b66116e8565b3480156105d057600080fd5b5061026760048036036101608110156105e857600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff61010082013516906101208101359061014001356116ee565b34801561064e57600080fd5b506102b66004803603602081101561066557600080fd5b50356001600160a01b03166117fc565b34801561068157600080fd5b506102b6611817565b34801561069657600080fd5b506104aa600480360360a08110156106ad57600080fd5b813591602081013591810190606081016040820135600160201b8111156106d357600080fd5b8201836020820111156106e557600080fd5b803590602001918460208302840111600160201b8311171561070657600080fd5b91935091506001600160a01b03813516906020013561181b565b34801561072c57600080fd5b506104aa600480360360a081101561074357600080fd5b813591602081013591810190606081016040820135600160201b81111561076957600080fd5b82018360208201111561077b57600080fd5b803590602001918460208302840111600160201b8311171561079c57600080fd5b91935091506001600160a01b038135169060200135611966565b3480156107c257600080fd5b506102b660048036036101408110156107da57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611af2565b34801561083557600080fd5b5061020d600480360360a081101561084c57600080fd5b813591602081013591810190606081016040820135600160201b81111561087257600080fd5b82018360208201111561088457600080fd5b803590602001918460208302840111600160201b831117156108a557600080fd5b91935091506001600160a01b038135169060200135611c14565b3480156108cb57600080fd5b5061020d600480360360a08110156108e257600080fd5b813591602081013591810190606081016040820135600160201b81111561090857600080fd5b82018360208201111561091a57600080fd5b803590602001918460208302840111600160201b8311171561093b57600080fd5b91935091506001600160a01b038135169060200135611e98565b6104aa6004803603608081101561096b57600080fd5b81359190810190604081016020820135600160201b81111561098c57600080fd5b82018360208201111561099e57600080fd5b803590602001918460208302840111600160201b831117156109bf57600080fd5b91935091506001600160a01b038135169060200135612121565b3480156109e557600080fd5b506102b6600480360360608110156109fc57600080fd5b508035906020810135906040013561246b565b348015610a1b57600080fd5b506104aa600480360360a0811015610a3257600080fd5b813591602081013591810190606081016040820135600160201b811115610a5857600080fd5b820183602082011115610a6a57600080fd5b803590602001918460208302840111600160201b83111715610a8b57600080fd5b91935091506001600160a01b038135169060200135612478565b348015610ab157600080fd5b50610aba612571565b604080516001600160a01b039092168252519081900360200190f35b348015610ae257600080fd5b506102b660048036036060811015610af957600080fd5b5080359060208101359060400135612595565b348015610b1857600080fd5b506102b6600480360360c0811015610b2f57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a001356125a2565b61020d60048036036080811015610b7557600080fd5b81359190810190604081016020820135600160201b811115610b9657600080fd5b820183602082011115610ba857600080fd5b803590602001918460208302840111600160201b83111715610bc957600080fd5b91935091506001600160a01b038135169060200135612728565b348015610bef57600080fd5b50610267600480360360e0811015610c0657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612a99565b348015610c4c57600080fd5b50610aba612cf3565b348015610c6157600080fd5b506104aa60048036036040811015610c7857600080fd5b81359190810190604081016020820135600160201b811115610c9957600080fd5b820183602082011115610cab57600080fd5b803590602001918460208302840111600160201b83111715610ccc57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612d17945050505050565b348015610d1657600080fd5b506102676004803603610140811015610d2e57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135612d44565b348015610d8957600080fd5b50610ddf6004803603610100811015610da157600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135612e6c565b60408051938452602084019290925282820152519081900360600190f35b610ddf600480360360c0811015610e1357600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612fac565b6104aa60048036036080811015610e5957600080fd5b81359190810190604081016020820135600160201b811115610e7a57600080fd5b820183602082011115610e8c57600080fd5b803590602001918460208302840111600160201b83111715610ead57600080fd5b91935091506001600160a01b03813516906020013561324c565b600033301415610f1f5760606000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150610f229050565b50335b90565b6000808242811015610f6c576040805162461bcd60e51b81526020600482015260186024820152600080516020614dc7833981519152604482015290519081900360640190fd5b610f9b897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612a99565b9093509150610fab8986856135cc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561101157600080fd5b505af1158015611025573d6000803e3d6000fd5b505050506110338583613736565b50965096945050505050565b600061104c84848461382e565b949350505050565b606061105e614b45565b50604080516060810182526001600160a01b0388166000818152600260209081529084902054835282015290810186905261109c8782878787613906565b6110d75760405162461bcd60e51b8152600401808060200182810382526021815260200180614c776021913960400191505060405180910390fd5b6001600160a01b0387166000908152600260205260409020546110fb9060016139e0565b60026000896001600160a01b03166001600160a01b03168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b87338860405180846001600160a01b03168152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156111a357818101518382015260200161118b565b50505050905090810190601f1680156111d05780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a160006060306001600160a01b0316888a6040516020018083805190602001908083835b602083106112215780518252601f199092019160209182019101611202565b6001836020036101000a038019825116818451168082178552505050505050905001826001600160a01b031660601b8152601401925050506040516020818303038152906040526040518082805190602001908083835b602083106112975780518252601f199092019160209182019101611278565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146112f9576040519150601f19603f3d011682016040523d82523d6000602084013e6112fe565b606091505b509150915081611355576040805162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000604482015290519081900360640190fd5b98975050505050505050565b604051806040016040528060018152602001603160f81b81525081565b606081428110156113c4576040805162461bcd60e51b81526020600482015260186024820152600080516020614dc7833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868660001981018181106113fe57fe5b905060200201356001600160a01b03166001600160a01b031614611457576040805162461bcd60e51b815260206004820152601d6024820152600080516020614ce4833981519152604482015290519081900360640190fd5b6114b57f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a2f92505050565b915086826001845103815181106114c857fe5b6020026020010151101561150d5760405162461bcd60e51b815260040180806020018281038252602b815260200180614d4d602b913960400191505060405180910390fd5b6115b28686600081811061151d57fe5b905060200201356001600160a01b0316611535610ec7565b6115987f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061156657fe5b905060200201356001600160a01b03168b8b600181811061158357fe5b905060200201356001600160a01b0316613b7b565b856000815181106115a557fe5b6020026020010151613c3b565b6115f182878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613d98915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061163057fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561166e57600080fd5b505af1158015611682573d6000803e3d6000fd5b505050506116a7848360018551038151811061169a57fe5b6020026020010151613736565b509695505050505050565b60606116df7f00000000000000000000000000000000000000000000000000000000000000008484613fd5565b90505b92915050565b60015490565b600080600061171e7f00000000000000000000000000000000000000000000000000000000000000008f8f613b7b565b905060008761172d578c611731565b6000195b9050816001600160a01b031663d505accf61174a610ec7565b604080516001600160e01b031960e085901b1681526001600160a01b03909216600483015230602483015260448201859052606482018d905260ff8b16608483015260a482018a905260c482018990525160e480830192600092919082900301818387803b1580156117bb57600080fd5b505af11580156117cf573d6000803e3d6000fd5b505050506117e28f8f8f8f8f8f8f612a99565b809450819550505050509b509b9950505050505050505050565b6001600160a01b031660009081526002602052604090205490565b4690565b60608142811015611861576040805162461bcd60e51b81526020600482015260186024820152600080516020614dc7833981519152604482015290519081900360640190fd5b6118bf7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a2f92505050565b915086826001845103815181106118d257fe5b602002602001015110156119175760405162461bcd60e51b815260040180806020018281038252602b815260200180614d4d602b913960400191505060405180910390fd5b6119278686600081811061151d57fe5b6116a782878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613d98915050565b606081428110156119ac576040805162461bcd60e51b81526020600482015260186024820152600080516020614dc7833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868660001981018181106119e657fe5b905060200201356001600160a01b03166001600160a01b031614611a3f576040805162461bcd60e51b815260206004820152601d6024820152600080516020614ce4833981519152604482015290519081900360640190fd5b611a9d7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613fd592505050565b91508682600081518110611aad57fe5b6020026020010151111561150d5760405162461bcd60e51b8152600401808060200182810382526027815260200180614cbd6027913960400191505060405180910390fd5b600080611b407f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613b7b565b9050600086611b4f578b611b53565b6000195b9050816001600160a01b031663d505accf611b6c610ec7565b604080516001600160e01b031960e085901b1681526001600160a01b03909216600483015230602483015260448201859052606482018c905260ff8a16608483015260a4820189905260c482018890525160e480830192600092919082900301818387803b158015611bdd57600080fd5b505af1158015611bf1573d6000803e3d6000fd5b50505050611c038d8d8d8d8d8d6125a2565b9d9c50505050505050505050505050565b8042811015611c58576040805162461bcd60e51b81526020600482015260186024820152600080516020614dc7833981519152604482015290519081900360640190fd5b611cd485856000818110611c6857fe5b905060200201356001600160a01b0316611c80610ec7565b611cce7f000000000000000000000000000000000000000000000000000000000000000089896000818110611cb157fe5b905060200201356001600160a01b03168a8a600181811061158357fe5b8a613c3b565b600085856000198101818110611ce657fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611d4257600080fd5b505afa158015611d56573d6000803e3d6000fd5b505050506040513d6020811015611d6c57600080fd5b50516040805160208881028281018201909352888252929350611dae92909189918991829185019084908082843760009201919091525088925061410d915050565b86611e518288886000198101818110611dc357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611e1f57600080fd5b505afa158015611e33573d6000803e3d6000fd5b505050506040513d6020811015611e4957600080fd5b50519061440f565b1015611e8e5760405162461bcd60e51b815260040180806020018281038252602b815260200180614d4d602b913960400191505060405180910390fd5b5050505050505050565b8042811015611edc576040805162461bcd60e51b81526020600482015260186024820152600080516020614dc7833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001685856000198101818110611f1657fe5b905060200201356001600160a01b03166001600160a01b031614611f6f576040805162461bcd60e51b815260206004820152601d6024820152600080516020614ce4833981519152604482015290519081900360640190fd5b611f7f85856000818110611c6857fe5b611fbd85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061410d915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561202c57600080fd5b505afa158015612040573d6000803e3d6000fd5b505050506040513d602081101561205657600080fd5b50519050868110156120995760405162461bcd60e51b815260040180806020018281038252602b815260200180614d4d602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120ff57600080fd5b505af1158015612113573d6000803e3d6000fd5b50505050611e8e8482613736565b60608142811015612167576040805162461bcd60e51b81526020600482015260186024820152600080516020614dc7833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061219e57fe5b905060200201356001600160a01b03166001600160a01b0316146121f7576040805162461bcd60e51b815260206004820152601d6024820152600080516020614ce4833981519152604482015290519081900360640190fd5b6122557f000000000000000000000000000000000000000000000000000000000000000034888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a2f92505050565b9150868260018451038151811061226857fe5b602002602001015110156122ad5760405162461bcd60e51b815260040180806020018281038252602b815260200180614d4d602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836000815181106122e957fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561231c57600080fd5b505af1158015612330573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6123957f000000000000000000000000000000000000000000000000000000000000000089896000818110611cb157fe5b846000815181106123a257fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156123f057600080fd5b505af1158015612404573d6000803e3d6000fd5b505050506040513d602081101561241a57600080fd5b505161242257fe5b61246182878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613d98915050565b5095945050505050565b600061104c84848461445f565b606081428110156124be576040805162461bcd60e51b81526020600482015260186024820152600080516020614dc7833981519152604482015290519081900360640190fd5b61251c7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613fd592505050565b9150868260008151811061252c57fe5b602002602001015111156119175760405162461bcd60e51b8152600401808060200182810382526027815260200180614cbd6027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b600061104c848484614537565b600081428110156125e8576040805162461bcd60e51b81526020600482015260186024820152600080516020614dc7833981519152604482015290519081900360640190fd5b612617887f00000000000000000000000000000000000000000000000000000000000000008989893089612a99565b9050809250506126a088858a6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561266f57600080fd5b505afa158015612683573d6000803e3d6000fd5b505050506040513d602081101561269957600080fd5b50516135cc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561270657600080fd5b505af115801561271a573d6000803e3d6000fd5b505050506116a78483613736565b804281101561276c576040805162461bcd60e51b81526020600482015260186024820152600080516020614dc7833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316858560008181106127a357fe5b905060200201356001600160a01b03166001600160a01b0316146127fc576040805162461bcd60e51b815260206004820152601d6024820152600080516020614ce4833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561285c57600080fd5b505af1158015612870573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6128d57f000000000000000000000000000000000000000000000000000000000000000089896000818110611cb157fe5b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561291c57600080fd5b505af1158015612930573d6000803e3d6000fd5b505050506040513d602081101561294657600080fd5b505161294e57fe5b60008686600019810181811061296057fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156129bc57600080fd5b505afa1580156129d0573d6000803e3d6000fd5b505050506040513d60208110156129e657600080fd5b50516040805160208981028281018201909352898252929350612a289290918a918a91829185019084908082843760009201919091525089925061410d915050565b87611e518289896000198101818110612a3d57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611e1f57600080fd5b6000808242811015612ae0576040805162461bcd60e51b81526020600482015260186024820152600080516020614dc7833981519152604482015290519081900360640190fd5b6000612b0d7f00000000000000000000000000000000000000000000000000000000000000008c8c613b7b565b9050806001600160a01b03166323b872dd612b26610ec7565b838c6040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015612b7e57600080fd5b505af1158015612b92573d6000803e3d6000fd5b505050506040513d6020811015612ba857600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b158015612bf557600080fd5b505af1158015612c09573d6000803e3d6000fd5b505050506040513d6040811015612c1f57600080fd5b50805160209091015190925090506000612c398e8e6145dd565b509050806001600160a01b03168e6001600160a01b031614612c5c578183612c5f565b82825b90975095508a871015612ca35760405162461bcd60e51b8152600401808060200182810382526026815260200180614d046026913960400191505060405180910390fd5b89861015612ce25760405162461bcd60e51b8152600401808060200182810382526026815260200180614c046026913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606116df7f00000000000000000000000000000000000000000000000000000000000000008484613a2f565b6000806000612d947f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613b7b565b9050600087612da3578c612da7565b6000195b9050816001600160a01b031663d505accf612dc0610ec7565b604080516001600160e01b031960e085901b1681526001600160a01b03909216600483015230602483015260448201859052606482018d905260ff8b16608483015260a482018a905260c482018990525160e480830192600092919082900301818387803b158015612e3157600080fd5b505af1158015612e45573d6000803e3d6000fd5b50505050612e578e8e8e8e8e8e610f25565b909f909e509c50505050505050505050505050565b60008060008342811015612eb5576040805162461bcd60e51b81526020600482015260186024820152600080516020614dc7833981519152604482015290519081900360640190fd5b6000612ebf610ec7565b9050612ecf8d8d8d8d8d8d6146bb565b90955093506000612f017f00000000000000000000000000000000000000000000000000000000000000008f8f613b7b565b9050612f0f8e838389613c3b565b612f1b8d838388613c3b565b806001600160a01b0316636a627842896040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b158015612f6a57600080fd5b505af1158015612f7e573d6000803e3d6000fd5b505050506040513d6020811015612f9457600080fd5b5051959e949d50949b50929950505050505050505050565b60008060008342811015612ff5576040805162461bcd60e51b81526020600482015260186024820152600080516020614dc7833981519152604482015290519081900360640190fd5b6130238a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c6146bb565b90945092506000613032610ec7565b905060006130817f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613b7b565b905061308f8c838389613c3b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0866040518263ffffffff1660e01b81526004016000604051808303818588803b1580156130ea57600080fd5b505af11580156130fe573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82876040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561317a57600080fd5b505af115801561318e573d6000803e3d6000fd5b505050506040513d60208110156131a457600080fd5b50516131ac57fe5b806001600160a01b0316636a627842896040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b1580156131fb57600080fd5b505af115801561320f573d6000803e3d6000fd5b505050506040513d602081101561322557600080fd5b505193503485101561323d5761323d82863403613736565b50505096509650969350505050565b60608142811015613292576040805162461bcd60e51b81526020600482015260186024820152600080516020614dc7833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316868660008181106132c957fe5b905060200201356001600160a01b03166001600160a01b031614613322576040805162461bcd60e51b815260206004820152601d6024820152600080516020614ce4833981519152604482015290519081900360640190fd5b6133807f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613fd592505050565b9150348260008151811061339057fe5b602002602001015111156133d55760405162461bcd60e51b8152600401808060200182810382526027815260200180614cbd6027913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08360008151811061341157fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561344457600080fd5b505af1158015613458573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6134bd7f000000000000000000000000000000000000000000000000000000000000000089896000818110611cb157fe5b846000815181106134ca57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561351857600080fd5b505af115801561352c573d6000803e3d6000fd5b505050506040513d602081101561354257600080fd5b505161354a57fe5b61358982878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613d98915050565b8160008151811061359657fe5b6020026020010151341115612461576124616135b0610ec7565b836000815181106135bd57fe5b60200260200101513403613736565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106136495780518252601f19909201916020918201910161362a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146136ab576040519150601f19603f3d011682016040523d82523d6000602084013e6136b0565b606091505b50915091508180156136de5750805115806136de57508080602001905160208110156136db57600080fd5b50515b61372f576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106137825780518252601f199092019160209182019101613763565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146137e4576040519150601f19603f3d011682016040523d82523d6000602084013e6137e9565b606091505b50509050806138295760405162461bcd60e51b8152600401808060200182810382526023815260200180614d2a6023913960400191505060405180910390fd5b505050565b600080841161386e5760405162461bcd60e51b815260040180806020018281038252602b815260200180614d9c602b913960400191505060405180910390fd5b60008311801561387e5750600082115b6138b95760405162461bcd60e51b8152600401808060200182810382526028815260200180614c4f6028913960400191505060405180910390fd5b60006138c7856103e561494c565b905060006138d5828561494c565b905060006138ef836138e9886103e861494c565b906139e0565b90508082816138fa57fe5b04979650505050505050565b60006001600160a01b03861661394d5760405162461bcd60e51b8152600401808060200182810382526025815260200180614c2a6025913960400191505060405180910390fd5b600161396061395b876149af565b614a32565b83868660405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156139b7573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b808201828110156116e2576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b6060600282511015613a88576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613aa057600080fd5b50604051908082528060200260200182016040528015613aca578160200160208202803683370190505b5090508281600081518110613adb57fe5b60200260200101818152505060005b6001835103811015613b7357600080613b2d87868581518110613b0957fe5b6020026020010151878660010181518110613b2057fe5b6020026020010151614a7e565b91509150613b4f848481518110613b4057fe5b6020026020010151838361382e565b848460010181518110613b5e57fe5b60209081029190910101525050600101613aea565b509392505050565b6000806000613b8a85856145dd565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527fd3ab2c392f54feb4b3b2a677f449b133c188ad2f1015eff3e94ea9315282c5f5609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b60208310613cc05780518252601f199092019160209182019101613ca1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613d22576040519150601f19603f3d011682016040523d82523d6000602084013e613d27565b606091505b5091509150818015613d55575080511580613d555750808060200190516020811015613d5257600080fd5b50515b613d905760405162461bcd60e51b8152600401808060200182810382526024815260200180614d786024913960400191505060405180910390fd5b505050505050565b60005b6001835103811015613fcf57600080848381518110613db657fe5b6020026020010151858460010181518110613dcd57fe5b6020026020010151915091506000613de583836145dd565b5090506000878560010181518110613df957fe5b60200260200101519050600080836001600160a01b0316866001600160a01b031614613e2757826000613e2b565b6000835b91509150600060028a51038810613e425788613e83565b613e837f0000000000000000000000000000000000000000000000000000000000000000878c8b60020181518110613e7657fe5b6020026020010151613b7b565b9050613eb07f00000000000000000000000000000000000000000000000000000000000000008888613b7b565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613eed576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613f55578181015183820152602001613f3d565b50505050905090810190601f168015613f825780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613fa457600080fd5b505af1158015613fb8573d6000803e3d6000fd5b505060019099019850613d9b975050505050505050565b50505050565b606060028251101561402e576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561404657600080fd5b50604051908082528060200260200182016040528015614070578160200160208202803683370190505b509050828160018351038151811061408457fe5b60209081029190910101528151600019015b8015613b73576000806140c6878660018603815181106140b257fe5b6020026020010151878681518110613b2057fe5b915091506140e88484815181106140d957fe5b6020026020010151838361445f565b8460018503815181106140f757fe5b6020908102919091010152505060001901614096565b60005b60018351038110156138295760008084838151811061412b57fe5b602002602001015185846001018151811061414257fe5b602002602001015191509150600061415a83836145dd565b509050600061418a7f00000000000000000000000000000000000000000000000000000000000000008585613b7b565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156141cb57600080fd5b505afa1580156141df573d6000803e3d6000fd5b505050506040513d60608110156141f557600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a81169089161461422b57828461422e565b83835b91509150614283828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611e1f57600080fd5b955061429086838361382e565b945050505050600080856001600160a01b0316886001600160a01b0316146142ba578260006142be565b6000835b91509150600060028c51038a106142d5578a614309565b6143097f0000000000000000000000000000000000000000000000000000000000000000898e8d60020181518110613e7657fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b8381101561439357818101518382015260200161437b565b50505050905090810190601f1680156143c05780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156143e257600080fd5b505af11580156143f6573d6000803e3d6000fd5b50506001909b019a506141109950505050505050505050565b808203828111156116e2576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b600080841161449f5760405162461bcd60e51b815260040180806020018281038252602c815260200180614bb3602c913960400191505060405180910390fd5b6000831180156144af5750600082115b6144ea5760405162461bcd60e51b8152600401808060200182810382526028815260200180614c4f6028913960400191505060405180910390fd5b60006145026103e86144fc868861494c565b9061494c565b905060006145166103e56144fc868961440f565b905061452d600182848161452657fe5b04906139e0565b9695505050505050565b60008084116145775760405162461bcd60e51b8152600401808060200182810382526025815260200180614c986025913960400191505060405180910390fd5b6000831180156145875750600082115b6145c25760405162461bcd60e51b8152600401808060200182810382526028815260200180614c4f6028913960400191505060405180910390fd5b826145cd858461494c565b816145d457fe5b04949350505050565b600080826001600160a01b0316846001600160a01b031614156146315760405162461bcd60e51b8152600401808060200182810382526025815260200180614bdf6025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610614651578284614654565b83835b90925090506001600160a01b0382166146b4576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561474757600080fd5b505afa15801561475b573d6000803e3d6000fd5b505050506040513d602081101561477157600080fd5b50516001600160a01b0316141561482f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b15801561480257600080fd5b505af1158015614816573d6000803e3d6000fd5b505050506040513d602081101561482c57600080fd5b50505b60008061485d7f00000000000000000000000000000000000000000000000000000000000000008b8b614a7e565b9150915081600014801561486f575080155b1561487f5787935086925061493f565b600061488c898484614537565b90508781116148df57858110156148d45760405162461bcd60e51b8152600401808060200182810382526026815260200180614c046026913960400191505060405180910390fd5b88945092508261493d565b60006148ec898486614537565b9050898111156148f857fe5b878110156149375760405162461bcd60e51b8152600401808060200182810382526026815260200180614d046026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806149675750508082028282828161496457fe5b04145b6116e2576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b6000604051806080016040528060438152602001614b7060439139805190602001208260000151836020015184604001518051906020012060405160200180858152602001848152602001836001600160a01b03168152602001828152602001945050505050604051602081830303815290604052805190602001209050919050565b6000614a3c6116e8565b82604051602001808061190160f01b81525060020183815260200182815260200192505050604051602081830303815290604052805190602001209050919050565b6000806000614a8d85856145dd565b509050600080614a9e888888613b7b565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015614ad657600080fd5b505afa158015614aea573d6000803e3d6000fd5b505050506040513d6060811015614b0057600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b0387811690841614614b33578082614b36565b81815b90999098509650505050505050565b60405180606001604052806000815260200160006001600160a01b0316815260200160608152509056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e544e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5349474e4552556e697377617056324c6962726172793a20494e53554646494349454e545f4c49515549444954595369676e657220616e64207369676e617475726520646f206e6f74206d61746368556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54556e69737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54556e69737761705632526f757465723a20494e56414c49445f50415448000000556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c4544556e69737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54556e69737761705632526f757465723a20455850495245440000000000000000a26469706673582212207ea492d54247fc2b6e50ecf238bd45e35b1d72494bf7e88e05a04658571109b364736f6c634300060c0033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c7429000000000000000000000000d9820a17053d6314b20642e465a84bf01a3d64f500000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83

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

000000000000000000000000d9820a17053d6314b20642e465a84bf01a3d64f500000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83

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

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