Contract 0x7F7F12BA2cFB5c5E143191486C7Fd93Ebf9D18A2 1

Contract Overview

Balance:
0 Ether
Txn Hash
Method
Block
From
To
Value
0xa95da5a4763dabade030afe2650338a857a6df97fee90eb980695b48b9e0c474Remove Liquidity...112608432022-08-24 22:03:4637 days 1 hr ago0xd63b631e3a73ad517bddc618273d28871ba28897 IN  0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20 Ether0.00035193 1.50000001
0xa45d5344da1c7e5ddb60e6148ef7870e0343467d9cbcab68a722bcc187bac926Remove Liquidity...112608372022-08-24 22:02:1637 days 1 hr ago0xd63b631e3a73ad517bddc618273d28871ba28897 IN  0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20 Ether0.00034058 1.5
0x29e1e12d9a4edbcb9a62582e134eaaeffb8fdf792e1821053b338ef406da618cRemove Liquidity...112608342022-08-24 22:01:3137 days 1 hr ago0xd63b631e3a73ad517bddc618273d28871ba28897 IN  0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20 Ether0.00033827 1.5
0xc197ee36b008d29f45da43a5ac4d22f215aa5dd2b6dd15c4eb3bc97f64a880d0Remove Liquidity...112608322022-08-24 22:01:0137 days 1 hr ago0xd63b631e3a73ad517bddc618273d28871ba28897 IN  0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20 Ether0.0002687 1.50000001
0x098dce8a07332755827ff767c5742e0ccc3f408e8ce4516c1bd5de78ccf83026Remove Liquidity...112531982022-08-23 14:10:4338 days 9 hrs ago0xd63b631e3a73ad517bddc618273d28871ba28897 IN  0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20 Ether0.00033142 1.50006321
0xf41c1bf6d4bc5c1b82625615fa172fe05ee98684345bc791b94b379a22a2ad65Remove Liquidity...112531962022-08-23 14:10:1338 days 9 hrs ago0xd63b631e3a73ad517bddc618273d28871ba28897 IN  0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20 Ether0.00033447 1.50006627
0x4e5128a64c3243bddda0b987c9d9a7ecb726a49eb64ad4689307b0660f6286acRemove Liquidity...112531942022-08-23 14:09:4338 days 9 hrs ago0xd63b631e3a73ad517bddc618273d28871ba28897 IN  0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20 Ether0.00039449 1.50006926
0xbce3bb5aa15aa8d0a81982e10542872ae2be9f11b262da7cd8e50a0847eccab9Remove Liquidity...112531912022-08-23 14:08:5838 days 9 hrs ago0xd63b631e3a73ad517bddc618273d28871ba28897 IN  0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20 Ether0.00033258 1.50007912
0x8a5197bdc885607353e52aa06b5531e76d1b03345370431d991e31f6b1523e74Remove Liquidity...112531902022-08-23 14:08:4338 days 9 hrs ago0xd63b631e3a73ad517bddc618273d28871ba28897 IN  0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20 Ether0.00034031 1.5000787
0xea744149b5b0073e79c8d6eeef23339dde6cc6e99f7506b5862cb73e0b6b7c6fRemove Liquidity...112531862022-08-23 14:07:4338 days 9 hrs ago0xd63b631e3a73ad517bddc618273d28871ba28897 IN  0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20 Ether0.00031172 1.50008345
0xdae4068ae2e4e79c64efaa30592278eb55aa5c15e09309f17b04dc57badb814fRemove Liquidity...112422062022-08-21 16:20:1840 days 6 hrs ago0xd63b631e3a73ad517bddc618273d28871ba28897 IN  0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20 Ether0.00031629 1.50000001
0xf7f254e788dd33897e782b8ab0154d12220b9530d658a9f7cae6ef7cfeffa6a7Remove Liquidity...112320652022-08-19 22:03:3642 days 1 hr ago0xd63b631e3a73ad517bddc618273d28871ba28897 IN  0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20 Ether0.00034422 1.50000001
0xa83f463603e9b2ccb5d210e691dd65b15bc66168fc92d0bef3e83b72b7855635Swap Exact ETH F...111991182022-08-14 4:32:4747 days 18 hrs ago0xd63b631e3a73ad517bddc618273d28871ba28897 IN  0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20.01 Ether0.00019599 1.63881805
0x579b650458f127dc82f7cf0392196328b0c2f12fbb09ae8ccb371d69904b0b7fRemove Liquidity...111873202022-08-12 3:17:2449 days 19 hrs ago0xd63b631e3a73ad517bddc618273d28871ba28897 IN  0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20 Ether0.00033252 1.50000001
0x3b8fd655b5bdc133aa01eb0f048fc8fadda767fac75dde1b44eaadd6cea685feAdd Liquidity ET...111873172022-08-12 3:16:3949 days 19 hrs ago0xd63b631e3a73ad517bddc618273d28871ba28897 IN  0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20.03619201 Ether0.00021325 1.50000001
0x80adc8427551b6ce381f90aba7f7f4aa98049678652d4f270a17847bc8619ec5Remove Liquidity...111734652022-08-09 17:26:3652 days 5 hrs ago0xfef9664bb5852680375fe26eeb8e245860bee819 IN  0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20 Ether0.00033817 1.50000001
0xa7e6f17e2cd111a2771505e10d3bfbbe57e0f59b0f0900a55976e573dbf58693Swap Exact Token...111734592022-08-09 17:25:0552 days 5 hrs ago0xfef9664bb5852680375fe26eeb8e245860bee819 IN  0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20 Ether0.00016925 1.50000001
0xeb76c63d5fba11a17306788e50255f0ab04550de6354f1a332f46a06050bbcd5Swap Exact Token...111710082022-08-09 7:10:4752 days 16 hrs ago0xd63b631e3a73ad517bddc618273d28871ba28897 IN  0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20 Ether0.00035312 3.00000001
0x905398760bb857ba30cb711028c8a998ed4d308bf8719726a4737684f615a45eSwap Exact ETH F...111710052022-08-09 7:10:0252 days 16 hrs ago0xd63b631e3a73ad517bddc618273d28871ba28897 IN  0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20.5 Ether0.00030919 3.00000001
0xcf21e2a682699907db74ba299e86715bf22c660334a83f196e5001bc1249cabdAdd Liquidity ET...111709982022-08-09 7:08:1752 days 16 hrs ago0xd63b631e3a73ad517bddc618273d28871ba28897 IN  0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20.05153526 Ether0.00044471 3.00000001
0x9202d2c10bfbe1400ff1629a977464b79b917654ccd9b31cd0bb2aba1793d1d7Swap Exact Token...111580312022-08-07 1:00:2454 days 22 hrs ago0xd63b631e3a73ad517bddc618273d28871ba28897 IN  0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20 Ether0.00017508 1.5
0x80709ad690db551b58c84ede5224c142159968e67b8a6e351bfaaf040bad86cdRemove Liquidity...111580172022-08-07 0:56:5454 days 22 hrs ago0xd63b631e3a73ad517bddc618273d28871ba28897 IN  0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20 Ether0.00038203 1.5
0xb32b5e18fb63b151ed65de128bc27d6fe96e17d647521e0e2ae88c479a6f106bRemove Liquidity...111568582022-08-06 20:06:4255 days 3 hrs ago0xd63b631e3a73ad517bddc618273d28871ba28897 IN  0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20 Ether0.00033221 1.5
0x37e8b5f1d2defd2dd93a21e3fb5d0a275af4120925dcc2d54c6b028fa96eded7Remove Liquidity...111530092022-08-06 4:02:5055 days 19 hrs ago0xb07e01691cf087d0ca236577a2dbcc68622ae5d6 IN  0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20 Ether0.00036474 1.5
0xdf4554e8eb2f01979ef03a5d47d54084966d62c95ad22d3aec2454a41e068cf1Remove Liquidity...111520022022-08-05 23:50:3555 days 23 hrs ago0xd63b631e3a73ad517bddc618273d28871ba28897 IN  0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20 Ether0.00031622 1.5
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xa95da5a4763dabade030afe2650338a857a6df97fee90eb980695b48b9e0c474112608432022-08-24 22:03:4637 days 1 hr ago 0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20xd63b631e3a73ad517bddc618273d28871ba288970.57689265 Ether
0xa95da5a4763dabade030afe2650338a857a6df97fee90eb980695b48b9e0c474112608432022-08-24 22:03:4637 days 1 hr ago 0xc778417e063141139fce010982780140aa0cd5ab 0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20.57689265 Ether
0xa95da5a4763dabade030afe2650338a857a6df97fee90eb980695b48b9e0c474112608432022-08-24 22:03:4637 days 1 hr ago 0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a2 0xc778417e063141139fce010982780140aa0cd5ab0 Ether
0xa95da5a4763dabade030afe2650338a857a6df97fee90eb980695b48b9e0c474112608432022-08-24 22:03:4637 days 1 hr ago 0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a2 0x1f9840a85d5af5bf1d1762f925bdaddc4201f9840 Ether
0xa95da5a4763dabade030afe2650338a857a6df97fee90eb980695b48b9e0c474112608432022-08-24 22:03:4637 days 1 hr ago 0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a2 0xc9e5a8ee7334dfeb4821297524c6d318d4638a090 Ether
0xa95da5a4763dabade030afe2650338a857a6df97fee90eb980695b48b9e0c474112608432022-08-24 22:03:4637 days 1 hr ago 0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a2 0xc9e5a8ee7334dfeb4821297524c6d318d4638a090 Ether
0xa95da5a4763dabade030afe2650338a857a6df97fee90eb980695b48b9e0c474112608432022-08-24 22:03:4637 days 1 hr ago 0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a2 0xc9e5a8ee7334dfeb4821297524c6d318d4638a090 Ether
0xa45d5344da1c7e5ddb60e6148ef7870e0343467d9cbcab68a722bcc187bac926112608372022-08-24 22:02:1637 days 1 hr ago 0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20xd63b631e3a73ad517bddc618273d28871ba288971.73500005 Ether
0xa45d5344da1c7e5ddb60e6148ef7870e0343467d9cbcab68a722bcc187bac926112608372022-08-24 22:02:1637 days 1 hr ago 0xc778417e063141139fce010982780140aa0cd5ab 0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a21.73500005 Ether
0xa45d5344da1c7e5ddb60e6148ef7870e0343467d9cbcab68a722bcc187bac926112608372022-08-24 22:02:1637 days 1 hr ago 0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a2 0xc778417e063141139fce010982780140aa0cd5ab0 Ether
0xa45d5344da1c7e5ddb60e6148ef7870e0343467d9cbcab68a722bcc187bac926112608372022-08-24 22:02:1637 days 1 hr ago 0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a2 0xf9ba5210f91d0474bd1e1dcdaec4c58e359aad850 Ether
0xa45d5344da1c7e5ddb60e6148ef7870e0343467d9cbcab68a722bcc187bac926112608372022-08-24 22:02:1637 days 1 hr ago 0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20xaa0e8d702458bcde12da64ad7d96b753763f71fd0 Ether
0xa45d5344da1c7e5ddb60e6148ef7870e0343467d9cbcab68a722bcc187bac926112608372022-08-24 22:02:1637 days 1 hr ago 0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20xaa0e8d702458bcde12da64ad7d96b753763f71fd0 Ether
0xa45d5344da1c7e5ddb60e6148ef7870e0343467d9cbcab68a722bcc187bac926112608372022-08-24 22:02:1637 days 1 hr ago 0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20xaa0e8d702458bcde12da64ad7d96b753763f71fd0 Ether
0x29e1e12d9a4edbcb9a62582e134eaaeffb8fdf792e1821053b338ef406da618c112608342022-08-24 22:01:3137 days 1 hr ago 0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20xd63b631e3a73ad517bddc618273d28871ba288970.55225542 Ether
0x29e1e12d9a4edbcb9a62582e134eaaeffb8fdf792e1821053b338ef406da618c112608342022-08-24 22:01:3137 days 1 hr ago 0xc778417e063141139fce010982780140aa0cd5ab 0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20.55225542 Ether
0x29e1e12d9a4edbcb9a62582e134eaaeffb8fdf792e1821053b338ef406da618c112608342022-08-24 22:01:3137 days 1 hr ago 0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a2 0xc778417e063141139fce010982780140aa0cd5ab0 Ether
0x29e1e12d9a4edbcb9a62582e134eaaeffb8fdf792e1821053b338ef406da618c112608342022-08-24 22:01:3137 days 1 hr ago 0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a2 0xc7ad46e0b8a400bb3c915120d284aafba8fc47350 Ether
0x29e1e12d9a4edbcb9a62582e134eaaeffb8fdf792e1821053b338ef406da618c112608342022-08-24 22:01:3137 days 1 hr ago 0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a2 0x2ea9767d8fe896f6ae9ed1146115eb1a753fdbad0 Ether
0x29e1e12d9a4edbcb9a62582e134eaaeffb8fdf792e1821053b338ef406da618c112608342022-08-24 22:01:3137 days 1 hr ago 0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a2 0x2ea9767d8fe896f6ae9ed1146115eb1a753fdbad0 Ether
0x29e1e12d9a4edbcb9a62582e134eaaeffb8fdf792e1821053b338ef406da618c112608342022-08-24 22:01:3137 days 1 hr ago 0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a2 0x2ea9767d8fe896f6ae9ed1146115eb1a753fdbad0 Ether
0xc197ee36b008d29f45da43a5ac4d22f215aa5dd2b6dd15c4eb3bc97f64a880d0112608322022-08-24 22:01:0137 days 1 hr ago 0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a2 0xea8de086f3939876a262fe5f42cef9a18fdbecce0 Ether
0xc197ee36b008d29f45da43a5ac4d22f215aa5dd2b6dd15c4eb3bc97f64a880d0112608322022-08-24 22:01:0137 days 1 hr ago 0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a2 0xea8de086f3939876a262fe5f42cef9a18fdbecce0 Ether
0xc197ee36b008d29f45da43a5ac4d22f215aa5dd2b6dd15c4eb3bc97f64a880d0112608322022-08-24 22:01:0137 days 1 hr ago 0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a2 0xea8de086f3939876a262fe5f42cef9a18fdbecce0 Ether
0x098dce8a07332755827ff767c5742e0ccc3f408e8ce4516c1bd5de78ccf83026112531982022-08-23 14:10:4338 days 9 hrs ago 0x7f7f12ba2cfb5c5e143191486c7fd93ebf9d18a20xd63b631e3a73ad517bddc618273d28871ba288970.59720223 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SwapRouterV2

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion
File 1 of 10 : SwapRouterV2.sol
// SPDX-License-Identifier: MIT
pragma solidity =0.6.6;

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

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

contract SwapRouterV2 is IUniswapV2Router02 {
    using SafeMath for uint;

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

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

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

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

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

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {
        address pair = SwapLibrary.pairFor(factory, tokenA, tokenB);
        IUniswapV2Pair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint amount0, uint amount1) = IUniswapV2Pair(pair).burn(to);
        (address token0,) = SwapLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'SwapRouterV2: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'SwapRouterV2: 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 = SwapLibrary.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        IUniswapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
    }
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external virtual override returns (uint amountToken, uint amountETH) {
        address pair = SwapLibrary.pairFor(factory, token, WETH);
        uint value = approveMax ? uint(-1) : liquidity;
        IUniswapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

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

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = SwapLibrary.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 ? SwapLibrary.pairFor(factory, output, path[i + 2]) : _to;
            IUniswapV2Pair(SwapLibrary.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 = SwapLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'SwapRouterV2: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, SwapLibrary.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 = SwapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'SwapRouterV2: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, SwapLibrary.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, 'SwapRouterV2: INVALID_PATH');
        amounts = SwapLibrary.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'SwapRouterV2: INSUFFICIENT_OUTPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(SwapLibrary.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, 'SwapRouterV2: INVALID_PATH');
        amounts = SwapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, 'SwapRouterV2: EXCESSIVE_INPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, SwapLibrary.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, 'SwapRouterV2: INVALID_PATH');
        amounts = SwapLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, 'SwapRouterV2: INSUFFICIENT_OUTPUT_AMOUNT');
        TransferHelper.safeTransferFrom(
            path[0], msg.sender, SwapLibrary.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, 'SwapRouterV2: INVALID_PATH');
        amounts = SwapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, 'SwapRouterV2: EXCESSIVE_INPUT_AMOUNT');
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(SwapLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
        // refund dust eth, if any
        if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

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

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

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

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

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

File 2 of 10 : SwapLibrary.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;

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

import "./SafeMath.sol";

library SwapLibrary {
    using SafeMath for uint;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 5 of 10 : IUniswapV2Router02.sol
pragma solidity >=0.6.2;

import './IUniswapV2Router01.sol';

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

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

File 6 of 10 : IUniswapV2Router01.sol
pragma solidity >=0.6.2;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

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

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

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

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

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

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

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

pragma solidity >=0.6.0;

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

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

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

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

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

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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"}]

60c060405234801561001057600080fd5b5060405162004959380380620049598339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c6147d4620001856000398061019f5280610d445280610d7f5280610e8052806110b0528061144e52806115c652806119a15280611aad5280611b635280611c3b5280611d935280611e1b528061206a52806120ef528061219e5280612274528061231b528061238f52806128b05280612b375280612b8d5280612bc15280612c355280612ddf5280612f345280612fbc525080610f205280610ff7528061117652806111af52806112f452806114ee52806115a4528061171e5280611ce05280611e4d5280611fba52806123c152806126245280612835528061285e528061288e5280612a055280612b6b5280612e845280612fee52806138da528061391d5280613c005280613d86528061421c52806142e3528061436352506147d46000f3fe60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e3370014610ba1578063f305d71914610c21578063fb3bdb4114610c67576101c8565b8063c45a015514610a62578063d06ca61f14610a77578063ded9382a14610b2e576101c8565b8063af2979eb116100b0578063af2979eb1461092c578063b6f9de951461097f578063baa2abde14610a05576101c8565b80638803dbee1461082d578063ad5c4648146108c5578063ad615dec146108f6576101c8565b80634a25d94a11610138578063791ac94711610112578063791ac947146106d95780637ff36ab51461077157806385f8c259146107f7576101c8565b80634a25d94a146105365780635b0d5984146105ce5780635c11d79514610641576101c8565b80631f00ca74116101695780631f00ca74146103695780632195995c1461042057806338ed17391461049e576101c8565b806302751cec146101cd578063054d50d41461023957806318cbafe514610281576101c8565b366101c857336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101c657fe5b005b600080fd5b3480156101d957600080fd5b50610220600480360360c08110156101f057600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610ced565b6040805192835260208301919091528051918290030190f35b34801561024557600080fd5b5061026f6004803603606081101561025c57600080fd5b5080359060208101359060400135610e11565b60408051918252519081900360200190f35b34801561028d57600080fd5b50610319600480360360a08110156102a457600080fd5b8135916020810135918101906060810160408201356401000000008111156102cb57600080fd5b8201836020820111156102dd57600080fd5b803590602001918460208302840111640100000000831117156102ff57600080fd5b91935091506001600160a01b038135169060200135610e26565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561035557818101518382015260200161033d565b505050509050019250505060405180910390f35b34801561037557600080fd5b506103196004803603604081101561038c57600080fd5b813591908101906040810160208201356401000000008111156103ae57600080fd5b8201836020820111156103c057600080fd5b803590602001918460208302840111640100000000831117156103e257600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061116f945050505050565b34801561042c57600080fd5b50610220600480360361016081101561044457600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff61010082013516906101208101359061014001356111a5565b3480156104aa57600080fd5b50610319600480360360a08110156104c157600080fd5b8135916020810135918101906060810160408201356401000000008111156104e857600080fd5b8201836020820111156104fa57600080fd5b8035906020019184602083028401116401000000008311171561051c57600080fd5b91935091506001600160a01b03813516906020013561129f565b34801561054257600080fd5b50610319600480360360a081101561055957600080fd5b81359160208101359181019060608101604082013564010000000081111561058057600080fd5b82018360208201111561059257600080fd5b803590602001918460208302840111640100000000831117156105b457600080fd5b91935091506001600160a01b0381351690602001356113f4565b3480156105da57600080fd5b5061026f60048036036101408110156105f257600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e0820135169061010081013590610120013561159c565b34801561064d57600080fd5b506101c6600480360360a081101561066457600080fd5b81359160208101359181019060608101604082013564010000000081111561068b57600080fd5b82018360208201111561069d57600080fd5b803590602001918460208302840111640100000000831117156106bf57600080fd5b91935091506001600160a01b0381351690602001356116aa565b3480156106e557600080fd5b506101c6600480360360a08110156106fc57600080fd5b81359160208101359181019060608101604082013564010000000081111561072357600080fd5b82018360208201111561073557600080fd5b8035906020019184602083028401116401000000008311171561075757600080fd5b91935091506001600160a01b038135169060200135611949565b6103196004803603608081101561078757600080fd5b813591908101906040810160208201356401000000008111156107a957600080fd5b8201836020820111156107bb57600080fd5b803590602001918460208302840111640100000000831117156107dd57600080fd5b91935091506001600160a01b038135169060200135611be9565b34801561080357600080fd5b5061026f6004803603606081101561081a57600080fd5b5080359060208101359060400135611f58565b34801561083957600080fd5b50610319600480360360a081101561085057600080fd5b81359160208101359181019060608101604082013564010000000081111561087757600080fd5b82018360208201111561088957600080fd5b803590602001918460208302840111640100000000831117156108ab57600080fd5b91935091506001600160a01b038135169060200135611f65565b3480156108d157600080fd5b506108da612068565b604080516001600160a01b039092168252519081900360200190f35b34801561090257600080fd5b5061026f6004803603606081101561091957600080fd5b508035906020810135906040013561208c565b34801561093857600080fd5b5061026f600480360360c081101561094f57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612099565b6101c66004803603608081101561099557600080fd5b813591908101906040810160208201356401000000008111156109b757600080fd5b8201836020820111156109c957600080fd5b803590602001918460208302840111640100000000831117156109eb57600080fd5b91935091506001600160a01b038135169060200135612224565b348015610a1157600080fd5b50610220600480360360e0811015610a2857600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c001356125cc565b348015610a6e57600080fd5b506108da612833565b348015610a8357600080fd5b5061031960048036036040811015610a9a57600080fd5b81359190810190604081016020820135640100000000811115610abc57600080fd5b820183602082011115610ace57600080fd5b80359060200191846020830284011164010000000083111715610af057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612857945050505050565b348015610b3a57600080fd5b506102206004803603610140811015610b5257600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135612884565b348015610bad57600080fd5b50610c036004803603610100811015610bc557600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135612998565b60408051938452602084019290925282820152519081900360600190f35b610c03600480360360c0811015610c3757600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612ade565b61031960048036036080811015610c7d57600080fd5b81359190810190604081016020820135640100000000811115610c9f57600080fd5b820183602082011115610cb157600080fd5b80359060200191846020830284011164010000000083111715610cd357600080fd5b91935091506001600160a01b038135169060200135612d8d565b6000808242811015610d3e576040805162461bcd60e51b815260206004820152601560248201527414ddd85c149bdd5d195c958c8e8811561412549151605a1b604482015290519081900360640190fd5b610d6d897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6125cc565b9093509150610d7d89868561312b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610de357600080fd5b505af1158015610df7573d6000803e3d6000fd5b50505050610e0585836132ad565b50965096945050505050565b6000610e1e8484846133a5565b949350505050565b60608142811015610e76576040805162461bcd60e51b815260206004820152601560248201527414ddd85c149bdd5d195c958c8e8811561412549151605a1b604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610eb057fe5b905060200201356001600160a01b03166001600160a01b031614610f1b576040805162461bcd60e51b815260206004820152601a60248201527f53776170526f7574657256323a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b610f797f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061349592505050565b91508682600184510381518110610f8c57fe5b60200260200101511015610fd15760405162461bcd60e51b815260040180806020018281038252602881526020018061462e6028913960400191505060405180910390fd5b61106f86866000818110610fe157fe5b905060200201356001600160a01b0316336110557f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061102357fe5b905060200201356001600160a01b03168b8b600181811061104057fe5b905060200201356001600160a01b03166135e1565b8560008151811061106257fe5b60200260200101516136b9565b6110ae8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061382b915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836001855103815181106110ed57fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561112b57600080fd5b505af115801561113f573d6000803e3d6000fd5b50505050611164848360018551038151811061115757fe5b60200260200101516132ad565b509695505050505050565b606061119c7f00000000000000000000000000000000000000000000000000000000000000008484613a71565b90505b92915050565b60008060006111d57f00000000000000000000000000000000000000000000000000000000000000008f8f6135e1565b90506000876111e4578c6111e8565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561125e57600080fd5b505af1158015611272573d6000803e3d6000fd5b505050506112858f8f8f8f8f8f8f6125cc565b809450819550505050509b509b9950505050505050505050565b606081428110156112ef576040805162461bcd60e51b815260206004820152601560248201527414ddd85c149bdd5d195c958c8e8811561412549151605a1b604482015290519081900360640190fd5b61134d7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061349592505050565b9150868260018451038151811061136057fe5b602002602001015110156113a55760405162461bcd60e51b815260040180806020018281038252602881526020018061462e6028913960400191505060405180910390fd5b6113b586866000818110610fe157fe5b6111648287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061382b915050565b60608142811015611444576040805162461bcd60e51b815260206004820152601560248201527414ddd85c149bdd5d195c958c8e8811561412549151605a1b604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061147e57fe5b905060200201356001600160a01b03166001600160a01b0316146114e9576040805162461bcd60e51b815260206004820152601a60248201527f53776170526f7574657256323a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b6115477f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a7192505050565b9150868260008151811061155757fe5b60200260200101511115610fd15760405162461bcd60e51b81526004018080602001828103825260248152602001806146bb6024913960400191505060405180910390fd5b6000806115ea7f00000000000000000000000000000000000000000000000000000000000000008d7f00000000000000000000000000000000000000000000000000000000000000006135e1565b90506000866115f9578b6115fd565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561167357600080fd5b505af1158015611687573d6000803e3d6000fd5b505050506116998d8d8d8d8d8d612099565b9d9c50505050505050505050505050565b80428110156116f8576040805162461bcd60e51b815260206004820152601560248201527414ddd85c149bdd5d195c958c8e8811561412549151605a1b604482015290519081900360640190fd5b61176d8585600081811061170857fe5b905060200201356001600160a01b0316336117677f00000000000000000000000000000000000000000000000000000000000000008989600081811061174a57fe5b905060200201356001600160a01b03168a8a600181811061104057fe5b8a6136b9565b60008585600019810181811061177f57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156117e457600080fd5b505afa1580156117f8573d6000803e3d6000fd5b505050506040513d602081101561180e57600080fd5b50516040805160208881028281018201909352888252929350611850929091899189918291850190849080828437600092019190915250889250613ba9915050565b86611902828888600019810181811061186557fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156118ca57600080fd5b505afa1580156118de573d6000803e3d6000fd5b505050506040513d60208110156118f457600080fd5b50519063ffffffff613ed416565b101561193f5760405162461bcd60e51b815260040180806020018281038252602881526020018061462e6028913960400191505060405180910390fd5b5050505050505050565b8042811015611997576040805162461bcd60e51b815260206004820152601560248201527414ddd85c149bdd5d195c958c8e8811561412549151605a1b604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016858560001981018181106119d157fe5b905060200201356001600160a01b03166001600160a01b031614611a3c576040805162461bcd60e51b815260206004820152601a60248201527f53776170526f7574657256323a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b611a4c8585600081811061170857fe5b611a8a858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613ba9915050565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015611af457600080fd5b505afa158015611b08573d6000803e3d6000fd5b505050506040513d6020811015611b1e57600080fd5b5051905086811015611b615760405162461bcd60e51b815260040180806020018281038252602881526020018061462e6028913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611bc757600080fd5b505af1158015611bdb573d6000803e3d6000fd5b5050505061193f84826132ad565b60608142811015611c39576040805162461bcd60e51b815260206004820152601560248201527414ddd85c149bdd5d195c958c8e8811561412549151605a1b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611c7057fe5b905060200201356001600160a01b03166001600160a01b031614611cdb576040805162461bcd60e51b815260206004820152601a60248201527f53776170526f7574657256323a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b611d397f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061349592505050565b91508682600184510381518110611d4c57fe5b60200260200101511015611d915760405162461bcd60e51b815260040180806020018281038252602881526020018061462e6028913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611dcd57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611e0057600080fd5b505af1158015611e14573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611e797f00000000000000000000000000000000000000000000000000000000000000008989600081811061174a57fe5b84600081518110611e8657fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611edd57600080fd5b505af1158015611ef1573d6000803e3d6000fd5b505050506040513d6020811015611f0757600080fd5b5051611f0f57fe5b611f4e8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061382b915050565b5095945050505050565b6000610e1e848484613f2c565b60608142811015611fb5576040805162461bcd60e51b815260206004820152601560248201527414ddd85c149bdd5d195c958c8e8811561412549151605a1b604482015290519081900360640190fd5b6120137f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a7192505050565b9150868260008151811061202357fe5b602002602001015111156113a55760405162461bcd60e51b81526004018080602001828103825260248152602001806146bb6024913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610e1e84848461401c565b600081428110156120e9576040805162461bcd60e51b815260206004820152601560248201527414ddd85c149bdd5d195c958c8e8811561412549151605a1b604482015290519081900360640190fd5b612118887f000000000000000000000000000000000000000000000000000000000000000089898930896125cc565b604080516370a0823160e01b8152306004820152905191945061219c92508a9187916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561216b57600080fd5b505afa15801561217f573d6000803e3d6000fd5b505050506040513d602081101561219557600080fd5b505161312b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561220257600080fd5b505af1158015612216573d6000803e3d6000fd5b5050505061116484836132ad565b8042811015612272576040805162461bcd60e51b815260206004820152601560248201527414ddd85c149bdd5d195c958c8e8811561412549151605a1b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316858560008181106122a957fe5b905060200201356001600160a01b03166001600160a01b031614612314576040805162461bcd60e51b815260206004820152601a60248201527f53776170526f7574657256323a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561237457600080fd5b505af1158015612388573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6123ed7f00000000000000000000000000000000000000000000000000000000000000008989600081811061174a57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561243d57600080fd5b505af1158015612451573d6000803e3d6000fd5b505050506040513d602081101561246757600080fd5b505161246f57fe5b60008686600019810181811061248157fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156124e657600080fd5b505afa1580156124fa573d6000803e3d6000fd5b505050506040513d602081101561251057600080fd5b505160408051602089810282810182019093528982529293506125529290918a918a918291850190849080828437600092019190915250899250613ba9915050565b87611902828989600019810181811061256757fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156118ca57600080fd5b600080824281101561261d576040805162461bcd60e51b815260206004820152601560248201527414ddd85c149bdd5d195c958c8e8811561412549151605a1b604482015290519081900360640190fd5b600061264a7f00000000000000000000000000000000000000000000000000000000000000008c8c6135e1565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b1580156126a557600080fd5b505af11580156126b9573d6000803e3d6000fd5b505050506040513d60208110156126cf57600080fd5b5050604080517f89afcb440000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b15801561273557600080fd5b505af1158015612749573d6000803e3d6000fd5b505050506040513d604081101561275f57600080fd5b508051602090910151909250905060006127798e8e6140de565b509050806001600160a01b03168e6001600160a01b03161461279c57818361279f565b82825b90975095508a8710156127e35760405162461bcd60e51b81526004018080602001828103825260238152602001806146df6023913960400191505060405180910390fd5b898610156128225760405162461bcd60e51b815260040180806020018281038252602381526020018061460b6023913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b606061119c7f00000000000000000000000000000000000000000000000000000000000000008484613495565b60008060006128d47f00000000000000000000000000000000000000000000000000000000000000008e7f00000000000000000000000000000000000000000000000000000000000000006135e1565b90506000876128e3578c6128e7565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561295d57600080fd5b505af1158015612971573d6000803e3d6000fd5b505050506129838e8e8e8e8e8e610ced565b909f909e509c50505050505050505050505050565b600080600083428110156129eb576040805162461bcd60e51b815260206004820152601560248201527414ddd85c149bdd5d195c958c8e8811561412549151605a1b604482015290519081900360640190fd5b6129f98c8c8c8c8c8c6141d2565b90945092506000612a2b7f00000000000000000000000000000000000000000000000000000000000000008e8e6135e1565b9050612a398d3383886136b9565b612a458c3383876136b9565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612a9d57600080fd5b505af1158015612ab1573d6000803e3d6000fd5b505050506040513d6020811015612ac757600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015612b31576040805162461bcd60e51b815260206004820152601560248201527414ddd85c149bdd5d195c958c8e8811561412549151605a1b604482015290519081900360640190fd5b612b5f8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c6141d2565b90945092506000612bb17f00000000000000000000000000000000000000000000000000000000000000008c7f00000000000000000000000000000000000000000000000000000000000000006135e1565b9050612bbf8b3383886136b9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612c1a57600080fd5b505af1158015612c2e573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612cb357600080fd5b505af1158015612cc7573d6000803e3d6000fd5b505050506040513d6020811015612cdd57600080fd5b5051612ce557fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612d3d57600080fd5b505af1158015612d51573d6000803e3d6000fd5b505050506040513d6020811015612d6757600080fd5b5051925034841015612d7f57612d7f338534036132ad565b505096509650969350505050565b60608142811015612ddd576040805162461bcd60e51b815260206004820152601560248201527414ddd85c149bdd5d195c958c8e8811561412549151605a1b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612e1457fe5b905060200201356001600160a01b03166001600160a01b031614612e7f576040805162461bcd60e51b815260206004820152601a60248201527f53776170526f7574657256323a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b612edd7f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a7192505050565b91503482600081518110612eed57fe5b60200260200101511115612f325760405162461bcd60e51b81526004018080602001828103825260248152602001806146bb6024913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612f6e57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612fa157600080fd5b505af1158015612fb5573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb61301a7f00000000000000000000000000000000000000000000000000000000000000008989600081811061174a57fe5b8460008151811061302757fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561307e57600080fd5b505af1158015613092573d6000803e3d6000fd5b505050506040513d60208110156130a857600080fd5b50516130b057fe5b6130ef8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061382b915050565b816000815181106130fc57fe5b6020026020010151341115611f4e57611f4e338360008151811061311c57fe5b602002602001015134036132ad565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b602083106131d65780518252601f1990920191602091820191016131b7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613238576040519150601f19603f3d011682016040523d82523d6000602084013e61323d565b606091505b509150915081801561326b57508051158061326b575080806020019051602081101561326857600080fd5b50515b6132a65760405162461bcd60e51b815260040180806020018281038252602d815260200180614772602d913960400191505060405180910390fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106132f95780518252601f1990920191602091820191016132da565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461335b576040519150601f19603f3d011682016040523d82523d6000602084013e613360565b606091505b50509050806133a05760405162461bcd60e51b81526004018080602001828103825260348152602001806146876034913960400191505060405180910390fd5b505050565b60008084116133e55760405162461bcd60e51b81526004018080602001828103825260268152602001806147256026913960400191505060405180910390fd5b6000831180156133f55750600082115b6134305760405162461bcd60e51b81526004018080602001828103825260238152602001806147026023913960400191505060405180910390fd5b6000613444856103e563ffffffff61447816565b90506000613458828563ffffffff61447816565b9050600061347e83613472886103e863ffffffff61447816565b9063ffffffff6144e416565b905080828161348957fe5b04979650505050505050565b60606002825110156134ee576040805162461bcd60e51b815260206004820152601960248201527f537761704c6962726172793a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561350657600080fd5b50604051908082528060200260200182016040528015613530578160200160208202803683370190505b509050828160008151811061354157fe5b60200260200101818152505060005b60018351038110156135d9576000806135938786858151811061356f57fe5b602002602001015187866001018151811061358657fe5b602002602001015161453c565b915091506135b58484815181106135a657fe5b602002602001015183836133a5565b8484600101815181106135c457fe5b60209081029190910101525050600101613550565b509392505050565b60008060006135f085856140de565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f2f211982b095720b3c15b915eb6422e033e6a52128f910a70c0b0981509a1c85609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106137535780518252601f199092019160209182019101613734565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146137b5576040519150601f19603f3d011682016040523d82523d6000602084013e6137ba565b606091505b50915091508180156137e85750805115806137e857508080602001905160208110156137e557600080fd5b50515b6138235760405162461bcd60e51b81526004018080602001828103825260318152602001806146566031913960400191505060405180910390fd5b505050505050565b60005b6001835103811015613a6b5760008084838151811061384957fe5b602002602001015185846001018151811061386057fe5b602002602001015191509150600061387883836140de565b509050600087856001018151811061388c57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146138ba578260006138be565b6000835b91509150600060028a510388106138d55788613916565b6139167f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061390957fe5b60200260200101516135e1565b90506139437f000000000000000000000000000000000000000000000000000000000000000088886135e1565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613980576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156139f15781810151838201526020016139d9565b50505050905090810190601f168015613a1e5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613a4057600080fd5b505af1158015613a54573d6000803e3d6000fd5b50506001909901985061382e975050505050505050565b50505050565b6060600282511015613aca576040805162461bcd60e51b815260206004820152601960248201527f537761704c6962726172793a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613ae257600080fd5b50604051908082528060200260200182016040528015613b0c578160200160208202803683370190505b5090508281600183510381518110613b2057fe5b60209081029190910101528151600019015b80156135d957600080613b6287866001860381518110613b4e57fe5b602002602001015187868151811061358657fe5b91509150613b84848481518110613b7557fe5b60200260200101518383613f2c565b846001850381518110613b9357fe5b6020908102919091010152505060001901613b32565b60005b60018351038110156133a057600080848381518110613bc757fe5b6020026020010151858460010181518110613bde57fe5b6020026020010151915091506000613bf683836140de565b5090506000613c267f000000000000000000000000000000000000000000000000000000000000000085856135e1565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613c6757600080fd5b505afa158015613c7b573d6000803e3d6000fd5b505050506040513d6060811015613c9157600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506000806001600160a01b038a811690891614613cce578284613cd1565b83835b91509150613d2f828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156118ca57600080fd5b9550613d3c8683836133a5565b945050505050600080856001600160a01b0316886001600160a01b031614613d6657826000613d6a565b6000835b91509150600060028c51038a10613d81578a613db5565b613db57f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061390957fe5b60408051600080825260208201928390527f022c0d9f00000000000000000000000000000000000000000000000000000000835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613e58578181015183820152602001613e40565b50505050905090810190601f168015613e855780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613ea757600080fd5b505af1158015613ebb573d6000803e3d6000fd5b50506001909b019a50613bac9950505050505050505050565b8082038281111561119f576040805162461bcd60e51b815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411613f6c5760405162461bcd60e51b815260040180806020018281038252602781526020018061474b6027913960400191505060405180910390fd5b600083118015613f7c5750600082115b613fb75760405162461bcd60e51b81526004018080602001828103825260238152602001806147026023913960400191505060405180910390fd5b6000613fdb6103e8613fcf868863ffffffff61447816565b9063ffffffff61447816565b90506000613ff56103e5613fcf868963ffffffff613ed416565b9050614012600182848161400557fe5b049063ffffffff6144e416565b9695505050505050565b6000808411614072576040805162461bcd60e51b815260206004820181905260248201527f537761704c6962726172793a20494e53554646494349454e545f414d4f554e54604482015290519081900360640190fd5b6000831180156140825750600082115b6140bd5760405162461bcd60e51b81526004018080602001828103825260238152602001806147026023913960400191505060405180910390fd5b826140ce858463ffffffff61447816565b816140d557fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415614148576040805162461bcd60e51b815260206004820181905260248201527f537761704c6962726172793a204944454e544943414c5f414444524553534553604482015290519081900360640190fd5b826001600160a01b0316846001600160a01b03161061416857828461416b565b83835b90925090506001600160a01b0382166141cb576040805162461bcd60e51b815260206004820152601960248201527f537761704c6962726172793a205a45524f5f4144445245535300000000000000604482015290519081900360640190fd5b9250929050565b604080517fe6a439050000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b15801561426557600080fd5b505afa158015614279573d6000803e3d6000fd5b505050506040513d602081101561428f57600080fd5b50516001600160a01b0316141561435b57604080517fc9c653960000000000000000000000000000000000000000000000000000000081526001600160a01b038a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b15801561432e57600080fd5b505af1158015614342573d6000803e3d6000fd5b505050506040513d602081101561435857600080fd5b50505b6000806143897f00000000000000000000000000000000000000000000000000000000000000008b8b61453c565b9150915081600014801561439b575080155b156143ab5787935086925061446b565b60006143b889848461401c565b905087811161440b57858110156144005760405162461bcd60e51b815260040180806020018281038252602381526020018061460b6023913960400191505060405180910390fd5b889450925082614469565b600061441889848661401c565b90508981111561442457fe5b878110156144635760405162461bcd60e51b81526004018080602001828103825260238152602001806146df6023913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806144935750508082028282828161449057fe5b04145b61119f576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b8082018281101561119f576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b600080600061454b85856140de565b50905060008061455c8888886135e1565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561459457600080fd5b505afa1580156145a8573d6000803e3d6000fd5b505050506040513d60608110156145be57600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506001600160a01b03878116908416146145f85780826145fb565b81815b9099909850965050505050505056fe53776170526f7574657256323a20494e53554646494349454e545f425f414d4f554e5453776170526f7574657256323a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c65645472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c656453776170526f7574657256323a204558434553534956455f494e5055545f414d4f554e5453776170526f7574657256323a20494e53554646494349454e545f415f414d4f554e54537761704c6962726172793a20494e53554646494349454e545f4c4951554944495459537761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54537761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564a2646970667358221220ff2455a8507111343f5c16f446c264f6d828e49cdddeaeccbcde3c772125398964736f6c634300060600330000000000000000000000009b16a862127f130ed7d13e2630462647cb5eb8c8000000000000000000000000c778417e063141139fce010982780140aa0cd5ab

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

0000000000000000000000009b16a862127f130ed7d13e2630462647cb5eb8c8000000000000000000000000c778417e063141139fce010982780140aa0cd5ab

-----Decoded View---------------
Arg [0] : _factory (address): 0x9B16a862127F130Ed7D13e2630462647Cb5eb8c8
Arg [1] : _WETH (address): 0xc778417E063141139Fce010982780140Aa0cD5Ab

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000009b16a862127f130ed7d13e2630462647cb5eb8c8
Arg [1] : 000000000000000000000000c778417e063141139fce010982780140aa0cd5ab


Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading

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