Contract 0xC94AbA2619BF2ed0CA367F196be548Bd0d64AA4E

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xcfac0e47f49e7adb02dbb4a36f6aad9d66e6cc348d20eb42aee445bfe29280e6Swap Exact ETH F...39166212023-03-28 14:35:2420 hrs 16 mins ago0xeeaf9f8e7a42273d091dd89091b16d3cf08b8101 IN  0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e400 wei0.00031398125
0x9db50f9fd60406c60d24256ebc8f300d842ef63e97d306a87dc188cf0d0f127dSwap Exact ETH F...38897412023-03-24 19:02:544 days 15 hrs ago0xeeaf9f8e7a42273d091dd89091b16d3cf08b8101 IN  0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e300 wei0.00031398125
0x480312699372c62592e33439dfa8d59b03da2fcf74277d3e7b9dee2f710c5a16Swap Exact ETH F...38763532023-03-22 21:31:066 days 13 hrs ago0xeeaf9f8e7a42273d091dd89091b16d3cf08b8101 IN  0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e300 wei0.00031398125
0x01813c9c2b26f99c852540c50783f45b061db091ff0befc1821765b5ee66f56cSwap Exact ETH F...38763502023-03-22 21:30:246 days 13 hrs ago0xeeaf9f8e7a42273d091dd89091b16d3cf08b8101 IN  0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e200 wei0.00008699075
0x98988d98a344491f02a9936f32e3e15a3006ef9515a7de71d65fa6fe58e4bc36Swap Exact ETH F...38763462023-03-22 21:29:306 days 13 hrs ago0xeeaf9f8e7a42273d091dd89091b16d3cf08b8101 IN  0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e250 wei0.00031398125
0x36c2d20834f3fc999259d4b13b444d08c4b300e44d6add57ccfd2bf750a04576Swap Exact ETH F...38763432023-03-22 21:28:546 days 13 hrs ago0xeeaf9f8e7a42273d091dd89091b16d3cf08b8101 IN  0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e250 wei0.00008699075
0x109e8c3c014a188b9bc293c93470a2d82d280fd8b1f3d18f588013de25090a16Swap Exact ETH F...38755642023-03-22 18:51:246 days 16 hrs ago0xeeaf9f8e7a42273d091dd89091b16d3cf08b8101 IN  0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e70 wei0.00031398125
0x2ae0eeaa489f7d43ce09b2be93f115b98b19a841d79667aad3e4cc56db9084e0Swap Exact ETH F...38755602023-03-22 18:50:366 days 16 hrs ago0xeeaf9f8e7a42273d091dd89091b16d3cf08b8101 IN  0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e70 wei0.00008699075
0xdc19627f571ef4fcaa261cff26afc2eeed99fd78a0b964015a9474754604f47aSwap Exact ETH F...38755562023-03-22 18:49:486 days 16 hrs ago0xeeaf9f8e7a42273d091dd89091b16d3cf08b8101 IN  0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e60 wei0.00031398125
0xb547f290db78b260063fa876057115d914a0f465f442d7f286d5aeb159029fbfSwap Exact ETH F...38755402023-03-22 18:46:366 days 16 hrs ago0xeeaf9f8e7a42273d091dd89091b16d3cf08b8101 IN  0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e70 wei0.00008699075
0x9a37317315d99d23996216e305bdae947dae8633ca80b0dec6e1f35d3f418b3aSwap Exact ETH F...38755372023-03-22 18:46:006 days 16 hrs ago0xeeaf9f8e7a42273d091dd89091b16d3cf08b8101 IN  0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e70 wei0.0003528965
0x682c80262e69a8c089bdcfb8c63492c6696d1793626fc0615d03fa1618d64659Swap Exact ETH F...38755342023-03-22 18:45:246 days 16 hrs ago0xeeaf9f8e7a42273d091dd89091b16d3cf08b8101 IN  0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e50 wei0.00008699075
0x6874a0f2dea86d13b01de9b906a174f13d91334deb404a8290732a464aeeb147Swap Exact ETH F...38755292023-03-22 18:44:246 days 16 hrs ago0xeeaf9f8e7a42273d091dd89091b16d3cf08b8101 IN  0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e60 wei0.00031398125
0x8ef75ebc5e81c774bc8e692f9bb9cbfdfa55b8e35434590c18e149c108b2e13bSwap Exact ETH F...38755252023-03-22 18:43:366 days 16 hrs ago0xeeaf9f8e7a42273d091dd89091b16d3cf08b8101 IN  0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e80 wei0.00008699075
0xd8b8d0a0276a3ff3fcc783e6eb02a4cc7aa02809fd9b7b5f62dbccb120879476Swap Exact ETH F...38755212023-03-22 18:42:496 days 16 hrs ago0xeeaf9f8e7a42273d091dd89091b16d3cf08b8101 IN  0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e80 wei0.00031398125
0x7d7db26f96ae8b8d1eadf9c0087aa6a159da052ee0af14ac405a5810d6b04fd7Swap Exact ETH F...38733702023-03-22 11:26:426 days 23 hrs ago0xeeaf9f8e7a42273d091dd89091b16d3cf08b8101 IN  0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e0.000000000000001 MOVR0.00031398125
0x898d203f246049455af0d0420dbebc1f8749656608cdadbc12bf280b721faebfSwap Exact ETH F...38684052023-03-21 18:33:547 days 16 hrs ago0xeeaf9f8e7a42273d091dd89091b16d3cf08b8101 IN  0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e700 wei0.00031398125
0x172ca583ae2680e9f9120479659865432c9dc7eebefbe3b2442af5eff7f66dbdSwap Exact ETH F...38684012023-03-21 18:33:067 days 16 hrs ago0xeeaf9f8e7a42273d091dd89091b16d3cf08b8101 IN  0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e700 wei0.00033071645
0xf874a8f8d382ed539f4f457092501d52792af275a130625c93b5326e3e898622Swap Exact ETH F...38683982023-03-21 18:32:307 days 16 hrs ago0xeeaf9f8e7a42273d091dd89091b16d3cf08b8101 IN  0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e700 wei0.000336530812
0xb268f6cef98769892346fd5863a143bbdf42a95423a583655287a4ff7807028dSwap Exact ETH F...38683942023-03-21 18:31:427 days 16 hrs ago0xeeaf9f8e7a42273d091dd89091b16d3cf08b8101 IN  0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e700 wei0.00031398125
0x36e0816f1c39cca7b17d72ad51509bb28eb9df1e4030dd0e8f23835e50474ab6Swap Exact ETH F...38674612023-03-21 15:20:547 days 19 hrs ago0xeeaf9f8e7a42273d091dd89091b16d3cf08b8101 IN  0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e500 wei0.00031398125
0x6188f866493342bcd5ea00ffd199fae821511a0eaa2fc1376a020da4abe4d74bSwap Exact ETH F...38674582023-03-21 15:20:127 days 19 hrs ago0xeeaf9f8e7a42273d091dd89091b16d3cf08b8101 IN  0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e500 wei0.0003528965
0x24ae4268b2999f5e9614580ee80d975e8dcbb820c755de272a0ad15aaf45b0b6Swap Exact ETH F...38674562023-03-21 15:19:487 days 19 hrs ago0xeeaf9f8e7a42273d091dd89091b16d3cf08b8101 IN  0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e500 wei0.00031398125
0x8dbd3ef638202df36818ccc4a052a93ee8013f72a4359d85ad574fac35470adeSwap Exact ETH F...38674522023-03-21 15:19:007 days 19 hrs ago0xeeaf9f8e7a42273d091dd89091b16d3cf08b8101 IN  0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e500 wei0.00031398125
0xcef8d61f591d1fd85f3dc423e39f583929c21a6cb38ccd1897f6e8be10ffaea4Swap Exact ETH F...38674492023-03-21 15:18:247 days 19 hrs ago0xeeaf9f8e7a42273d091dd89091b16d3cf08b8101 IN  0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e500 wei0.0003528965
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xcfac0e47f49e7adb02dbb4a36f6aad9d66e6cc348d20eb42aee445bfe29280e639166212023-03-28 14:35:2420 hrs 16 mins ago 0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e Moonbeam Foundation: WMOVR Token400 wei
0x9db50f9fd60406c60d24256ebc8f300d842ef63e97d306a87dc188cf0d0f127d38897412023-03-24 19:02:544 days 15 hrs ago 0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e Moonbeam Foundation: WMOVR Token300 wei
0x480312699372c62592e33439dfa8d59b03da2fcf74277d3e7b9dee2f710c5a1638763532023-03-22 21:31:066 days 13 hrs ago 0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e Moonbeam Foundation: WMOVR Token300 wei
0x98988d98a344491f02a9936f32e3e15a3006ef9515a7de71d65fa6fe58e4bc3638763462023-03-22 21:29:306 days 13 hrs ago 0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e Moonbeam Foundation: WMOVR Token250 wei
0x109e8c3c014a188b9bc293c93470a2d82d280fd8b1f3d18f588013de25090a1638755642023-03-22 18:51:246 days 16 hrs ago 0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e Moonbeam Foundation: WMOVR Token70 wei
0xdc19627f571ef4fcaa261cff26afc2eeed99fd78a0b964015a9474754604f47a38755562023-03-22 18:49:486 days 16 hrs ago 0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e Moonbeam Foundation: WMOVR Token60 wei
0x9a37317315d99d23996216e305bdae947dae8633ca80b0dec6e1f35d3f418b3a38755372023-03-22 18:46:006 days 16 hrs ago 0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e Moonbeam Foundation: WMOVR Token70 wei
0x6874a0f2dea86d13b01de9b906a174f13d91334deb404a8290732a464aeeb14738755292023-03-22 18:44:246 days 16 hrs ago 0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e Moonbeam Foundation: WMOVR Token60 wei
0xd8b8d0a0276a3ff3fcc783e6eb02a4cc7aa02809fd9b7b5f62dbccb12087947638755212023-03-22 18:42:496 days 16 hrs ago 0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e Moonbeam Foundation: WMOVR Token80 wei
0x7d7db26f96ae8b8d1eadf9c0087aa6a159da052ee0af14ac405a5810d6b04fd738733702023-03-22 11:26:426 days 23 hrs ago 0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e Moonbeam Foundation: WMOVR Token0.000000000000001 MOVR
0x898d203f246049455af0d0420dbebc1f8749656608cdadbc12bf280b721faebf38684052023-03-21 18:33:547 days 16 hrs ago 0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e Moonbeam Foundation: WMOVR Token700 wei
0x172ca583ae2680e9f9120479659865432c9dc7eebefbe3b2442af5eff7f66dbd38684012023-03-21 18:33:067 days 16 hrs ago 0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e Moonbeam Foundation: WMOVR Token700 wei
0xf874a8f8d382ed539f4f457092501d52792af275a130625c93b5326e3e89862238683982023-03-21 18:32:307 days 16 hrs ago 0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e Moonbeam Foundation: WMOVR Token700 wei
0xb268f6cef98769892346fd5863a143bbdf42a95423a583655287a4ff7807028d38683942023-03-21 18:31:427 days 16 hrs ago 0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e Moonbeam Foundation: WMOVR Token700 wei
0x36e0816f1c39cca7b17d72ad51509bb28eb9df1e4030dd0e8f23835e50474ab638674612023-03-21 15:20:547 days 19 hrs ago 0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e Moonbeam Foundation: WMOVR Token500 wei
0x6188f866493342bcd5ea00ffd199fae821511a0eaa2fc1376a020da4abe4d74b38674582023-03-21 15:20:127 days 19 hrs ago 0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e Moonbeam Foundation: WMOVR Token500 wei
0x24ae4268b2999f5e9614580ee80d975e8dcbb820c755de272a0ad15aaf45b0b638674562023-03-21 15:19:487 days 19 hrs ago 0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e Moonbeam Foundation: WMOVR Token500 wei
0x8dbd3ef638202df36818ccc4a052a93ee8013f72a4359d85ad574fac35470ade38674522023-03-21 15:19:007 days 19 hrs ago 0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e Moonbeam Foundation: WMOVR Token500 wei
0xcef8d61f591d1fd85f3dc423e39f583929c21a6cb38ccd1897f6e8be10ffaea438674492023-03-21 15:18:247 days 19 hrs ago 0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e Moonbeam Foundation: WMOVR Token500 wei
0x41f653057093d97034b72906a27599301baafc4c10f9ec95ba8317ac1f2bbc9638674472023-03-21 15:18:007 days 19 hrs ago 0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e Moonbeam Foundation: WMOVR Token400 wei
0xbc8ee7405684875afbf3fdff49dff37cd52d57702f8201dcdbad802d116d2cc438674362023-03-21 15:15:487 days 19 hrs ago 0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e Moonbeam Foundation: WMOVR Token400 wei
0x20dfc089ec62161172ea90e7b64afc6ad9752d5df162cfdba0740e7407b1c64038674322023-03-21 15:15:007 days 19 hrs ago 0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e Moonbeam Foundation: WMOVR Token400 wei
0x1f4da43518f3953c5e3365eac03d0d4c375fa17c5b6ec2603a44bc7fbe99520638674232023-03-21 15:13:127 days 19 hrs ago 0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e Moonbeam Foundation: WMOVR Token310 wei
0x653460a35cf7ea8c65924d52b79a6ca02b3792f324cb5f3f539d652f43ae62a938674162023-03-21 15:11:487 days 19 hrs ago 0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e Moonbeam Foundation: WMOVR Token100 wei
0x3eb207dcb90905dcaa492d344ce9e617037c48891358e0aee84f23d22d87acae38442712023-03-18 8:38:0011 days 2 hrs ago 0xc94aba2619bf2ed0ca367f196be548bd0d64aa4e0x0e94dd9b9583f4726103b263915e12fe29d2ef811.474433837744651967 MOVR
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ZirconRouter

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 11 : ZirconRouter.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity =0.6.6;
import "@uniswap/lib/contracts/libraries/TransferHelper.sol";
import "@uniswap/v2-periphery/contracts/interfaces/IWETH.sol";
import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";
import "@uniswap/v2-periphery/contracts/interfaces/IERC20.sol";
import "./libraries/UniswapV2Library.sol";
import "./interfaces/IZirconRouter.sol";
import "@zircon/core/contracts/interfaces/IZirconFactory.sol";

contract ZirconRouter is IZirconRouter {
    using SafeMath for uint;

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

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

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

    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 (IZirconFactory(factory).getPair(tokenA, tokenB) == address(0)) {
            IZirconFactory(factory).createPair(tokenA, tokenB, pylonFactory);
        }
        (uint reserveA, uint reserveB) = UniswapV2Library.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = UniswapV2Library.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'UniswapV2Router: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = UniswapV2Library.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'UniswapV2Router: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IUniswapV2Pair(pair).mint(to);
    }

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
        (amountToken, amountETH) = _addLiquidity(
            token,
            WETH,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = UniswapV2Library.pairFor(factory, token, WETH);
        TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
        IWETH(WETH).deposit{value: amountETH}();
        assert(IWETH(WETH).transfer(pair, amountETH));
        liquidity = IUniswapV2Pair(pair).mint(to);
        // refund dust eth, if any
        if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
    }

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

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

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

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

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

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

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

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

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

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

pragma solidity >=0.6.0;

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

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

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

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

File 3 of 11 : IWETH.sol
pragma solidity >=0.5.0;

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

File 4 of 11 : IUniswapV2Router02.sol
pragma solidity >=0.6.2;

import './IUniswapV2Router01.sol';

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

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

File 5 of 11 : 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 6 of 11 : UniswapV2Library.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.5.0;

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

import "./SafeMath.sol";

library UniswapV2Library {
    using SafeMath for uint;

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

    // calculates the CREATE2 address for a pair without making any external calls
    // DO NOT CHANGE THIS FUNCTION WILL BE UPDATED BY 'yarn bytecode' inside zircon-core
    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'0ec3a964af2d4288dcee11cf85135843bcfc1e8e4f8a107d634a0818cc792ee7'))));}

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

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

    // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
        require(amountIn > 0, 'UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: 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, 'UniswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: 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, 'UniswapV2Library: INVALID_PATH');
        amounts = new uint[](path.length);
        amounts[0] = amountIn;
        for (uint i; i < path.length - 1; i++) {
            (uint reserveIn, uint reserveOut) = getReserves(factory, path[i], path[i + 1]);
            amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
        }
    }

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

File 7 of 11 : IZirconRouter.sol
pragma solidity >=0.6.2;

import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol";

interface IZirconRouter is IUniswapV2Router01 {
    function pylonFactory() external pure returns (address);

    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 8 of 11 : IZirconFactory.sol
pragma solidity >=0.5.16;

interface IZirconFactory {
    //    function feeTo() external view returns (address);
    //    function feeToSetter() external view returns (address);
    //    function migrator() external view returns (address);
    function energyFactory() external view returns (address);

    function getPair(address, address) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
    function dynamicRatio() external view returns (uint);
    function liquidityFee() external view returns (uint);
    function setLiquidityFee(uint _liquidityFee) external;

    function pairCodeHash() external pure returns (bytes32);
    function createPair(address tokenA, address tokenB, address _pylonFactory) external returns (address pair);

    function setMigrator(address _migrator) external;
    function setFeeToSetter(address _feeToSetter) external;
    function changeEnergyRevAddress(address _pairAddress, address _tokenA, address _tokenB, address _pylonFactory) external returns (address newEnergy);

    function changeEnergyFactoryAddress(address _newEnergyFactory) external;
    function setDynamicRatio(uint _dynamicRatio) external;

}

File 9 of 11 : IUniswapV2Router01.sol
pragma solidity >=0.6.2;

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

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

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

File 10 of 11 : 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 11 of 11 : SafeMath.sol
// SPDX-License-Identifier: GPL-3.0
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');
    }
}

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

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_pylonFactory","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":[],"name":"pylonFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"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"}]

60e060405234801561001057600080fd5b50604051620049af380380620049af8339818101604052606081101561003557600080fd5b50805160208201516040909201516001600160601b0319606083811b821660805282811b821660c05284901b1660a0526001600160a01b03918216928216911661480d620001a2600039806101aa5280610d5a5280610d955280610e8c52806110bc528061144652806115be52806119855280611a915280611b475280611c155280611d6d5280611df5528061203a52806120b55280612164528061223052806122d7528061234b52806128625280612af95280612b4f5280612b835280612bf75280612d975280612eec5280612f74525080612a88528061426d525080610f2c5280611003528061118252806111bb52806112f652806114e6528061159c528061170c5280611cba5280611e275280611f8a528061237d52806125d652806127e75280612810528061284052806129ad5280612b2d5280612e3c5280612fa6528061389252806138d55280613bb85280613d3e52806141a852806142975280614317525061480d6000f3fe60806040526004361061019a5760003560e01c80638803dbee116100e1578063c45a01551161008a578063e8e3370011610064578063e8e3370014610bac578063ef8863b414610c2c578063f305d71914610c41578063fb3bdb4114610c87576101d3565b8063c45a015514610a6d578063d06ca61f14610a82578063ded9382a14610b39576101d3565b8063af2979eb116100bb578063af2979eb14610937578063b6f9de951461098a578063baa2abde14610a10576101d3565b80638803dbee14610838578063ad5c4648146108d0578063ad615dec14610901576101d3565b80634a25d94a11610143578063791ac9471161011d578063791ac947146106e45780637ff36ab51461077c57806385f8c25914610802576101d3565b80634a25d94a146105415780635b0d5984146105d95780635c11d7951461064c576101d3565b80631f00ca74116101745780631f00ca74146103745780632195995c1461042b57806338ed1739146104a9576101d3565b806302751cec146101d8578063054d50d41461024457806318cbafe51461028c576101d3565b366101d357336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101d157fe5b005b600080fd5b3480156101e457600080fd5b5061022b600480360360c08110156101fb57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610d0d565b6040805192835260208301919091528051918290030190f35b34801561025057600080fd5b5061027a6004803603606081101561026757600080fd5b5080359060208101359060400135610e27565b60408051918252519081900360200190f35b34801561029857600080fd5b50610324600480360360a08110156102af57600080fd5b8135916020810135918101906060810160408201356401000000008111156102d657600080fd5b8201836020820111156102e857600080fd5b8035906020019184602083028401116401000000008311171561030a57600080fd5b91935091506001600160a01b038135169060200135610e3c565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610360578181015183820152602001610348565b505050509050019250505060405180910390f35b34801561038057600080fd5b506103246004803603604081101561039757600080fd5b813591908101906040810160208201356401000000008111156103b957600080fd5b8201836020820111156103cb57600080fd5b803590602001918460208302840111640100000000831117156103ed57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061117b945050505050565b34801561043757600080fd5b5061022b600480360361016081101561044f57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff61010082013516906101208101359061014001356111b1565b3480156104b557600080fd5b50610324600480360360a08110156104cc57600080fd5b8135916020810135918101906060810160408201356401000000008111156104f357600080fd5b82018360208201111561050557600080fd5b8035906020019184602083028401116401000000008311171561052757600080fd5b91935091506001600160a01b0381351690602001356112ab565b34801561054d57600080fd5b50610324600480360360a081101561056457600080fd5b81359160208101359181019060608101604082013564010000000081111561058b57600080fd5b82018360208201111561059d57600080fd5b803590602001918460208302840111640100000000831117156105bf57600080fd5b91935091506001600160a01b0381351690602001356113f6565b3480156105e557600080fd5b5061027a60048036036101408110156105fd57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611594565b34801561065857600080fd5b506101d1600480360360a081101561066f57600080fd5b81359160208101359181019060608101604082013564010000000081111561069657600080fd5b8201836020820111156106a857600080fd5b803590602001918460208302840111640100000000831117156106ca57600080fd5b91935091506001600160a01b0381351690602001356116a2565b3480156106f057600080fd5b506101d1600480360360a081101561070757600080fd5b81359160208101359181019060608101604082013564010000000081111561072e57600080fd5b82018360208201111561074057600080fd5b8035906020019184602083028401116401000000008311171561076257600080fd5b91935091506001600160a01b038135169060200135611937565b6103246004803603608081101561079257600080fd5b813591908101906040810160208201356401000000008111156107b457600080fd5b8201836020820111156107c657600080fd5b803590602001918460208302840111640100000000831117156107e857600080fd5b91935091506001600160a01b038135169060200135611bcd565b34801561080e57600080fd5b5061027a6004803603606081101561082557600080fd5b5080359060208101359060400135611f32565b34801561084457600080fd5b50610324600480360360a081101561085b57600080fd5b81359160208101359181019060608101604082013564010000000081111561088257600080fd5b82018360208201111561089457600080fd5b803590602001918460208302840111640100000000831117156108b657600080fd5b91935091506001600160a01b038135169060200135611f3f565b3480156108dc57600080fd5b506108e5612038565b604080516001600160a01b039092168252519081900360200190f35b34801561090d57600080fd5b5061027a6004803603606081101561092457600080fd5b508035906020810135906040013561205c565b34801561094357600080fd5b5061027a600480360360c081101561095a57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612069565b6101d1600480360360808110156109a057600080fd5b813591908101906040810160208201356401000000008111156109c257600080fd5b8201836020820111156109d457600080fd5b803590602001918460208302840111640100000000831117156109f657600080fd5b91935091506001600160a01b0381351690602001356121ea565b348015610a1c57600080fd5b5061022b600480360360e0811015610a3357600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612588565b348015610a7957600080fd5b506108e56127e5565b348015610a8e57600080fd5b5061032460048036036040811015610aa557600080fd5b81359190810190604081016020820135640100000000811115610ac757600080fd5b820183602082011115610ad957600080fd5b80359060200191846020830284011164010000000083111715610afb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612809945050505050565b348015610b4557600080fd5b5061022b6004803603610140811015610b5d57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135612836565b348015610bb857600080fd5b50610c0e6004803603610100811015610bd057600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e0013561294a565b60408051938452602084019290925282820152519081900360600190f35b348015610c3857600080fd5b506108e5612a86565b610c0e600480360360c0811015610c5757600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612aaa565b61032460048036036080811015610c9d57600080fd5b81359190810190604081016020820135640100000000811115610cbf57600080fd5b820183602082011115610cd157600080fd5b80359060200191846020830284011164010000000083111715610cf357600080fd5b91935091506001600160a01b038135169060200135612d4f565b6000808242811015610d54576040805162461bcd60e51b815260206004820152601860248201526000805160206147b8833981519152604482015290519081900360640190fd5b610d83897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612588565b9093509150610d938986856130e3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610df957600080fd5b505af1158015610e0d573d6000803e3d6000fd5b50505050610e1b8583613265565b50965096945050505050565b6000610e3484848461335d565b949350505050565b60608142811015610e82576040805162461bcd60e51b815260206004820152601860248201526000805160206147b8833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610ebc57fe5b905060200201356001600160a01b03166001600160a01b031614610f27576040805162461bcd60e51b815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b610f857f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061344d92505050565b91508682600184510381518110610f9857fe5b60200260200101511015610fdd5760405162461bcd60e51b815260040180806020018281038252602b815260200180614735602b913960400191505060405180910390fd5b61107b86866000818110610fed57fe5b905060200201356001600160a01b0316336110617f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061102f57fe5b905060200201356001600160a01b03168b8b600181811061104c57fe5b905060200201356001600160a01b0316613599565b8560008151811061106e57fe5b6020026020010151613671565b6110ba828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506137e3915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836001855103815181106110f957fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561113757600080fd5b505af115801561114b573d6000803e3d6000fd5b50505050611170848360018551038151811061116357fe5b6020026020010151613265565b509695505050505050565b60606111a87f00000000000000000000000000000000000000000000000000000000000000008484613a29565b90505b92915050565b60008060006111e17f00000000000000000000000000000000000000000000000000000000000000008f8f613599565b90506000876111f0578c6111f4565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561126a57600080fd5b505af115801561127e573d6000803e3d6000fd5b505050506112918f8f8f8f8f8f8f612588565b809450819550505050509b509b9950505050505050505050565b606081428110156112f1576040805162461bcd60e51b815260206004820152601860248201526000805160206147b8833981519152604482015290519081900360640190fd5b61134f7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061344d92505050565b9150868260018451038151811061136257fe5b602002602001015110156113a75760405162461bcd60e51b815260040180806020018281038252602b815260200180614735602b913960400191505060405180910390fd5b6113b786866000818110610fed57fe5b611170828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506137e3915050565b6060814281101561143c576040805162461bcd60e51b815260206004820152601860248201526000805160206147b8833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061147657fe5b905060200201356001600160a01b03166001600160a01b0316146114e1576040805162461bcd60e51b815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b61153f7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a2992505050565b9150868260008151811061154f57fe5b60200260200101511115610fdd5760405162461bcd60e51b81526004018080602001828103825260278152602001806146e86027913960400191505060405180910390fd5b6000806115e27f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613599565b90506000866115f1578b6115f5565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561166b57600080fd5b505af115801561167f573d6000803e3d6000fd5b505050506116918d8d8d8d8d8d612069565b9d9c50505050505050505050505050565b80428110156116e6576040805162461bcd60e51b815260206004820152601860248201526000805160206147b8833981519152604482015290519081900360640190fd5b61175b858560008181106116f657fe5b905060200201356001600160a01b0316336117557f00000000000000000000000000000000000000000000000000000000000000008989600081811061173857fe5b905060200201356001600160a01b03168a8a600181811061104c57fe5b8a613671565b60008585600019810181811061176d57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156117d257600080fd5b505afa1580156117e6573d6000803e3d6000fd5b505050506040513d60208110156117fc57600080fd5b5051604080516020888102828101820190935288825292935061183e929091899189918291850190849080828437600092019190915250889250613b61915050565b866118f0828888600019810181811061185357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156118b857600080fd5b505afa1580156118cc573d6000803e3d6000fd5b505050506040513d60208110156118e257600080fd5b50519063ffffffff613e8c16565b101561192d5760405162461bcd60e51b815260040180806020018281038252602b815260200180614735602b913960400191505060405180910390fd5b5050505050505050565b804281101561197b576040805162461bcd60e51b815260206004820152601860248201526000805160206147b8833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016858560001981018181106119b557fe5b905060200201356001600160a01b03166001600160a01b031614611a20576040805162461bcd60e51b815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b611a30858560008181106116f657fe5b611a6e858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613b61915050565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015611ad857600080fd5b505afa158015611aec573d6000803e3d6000fd5b505050506040513d6020811015611b0257600080fd5b5051905086811015611b455760405162461bcd60e51b815260040180806020018281038252602b815260200180614735602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611bab57600080fd5b505af1158015611bbf573d6000803e3d6000fd5b5050505061192d8482613265565b60608142811015611c13576040805162461bcd60e51b815260206004820152601860248201526000805160206147b8833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611c4a57fe5b905060200201356001600160a01b03166001600160a01b031614611cb5576040805162461bcd60e51b815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b611d137f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061344d92505050565b91508682600184510381518110611d2657fe5b60200260200101511015611d6b5760405162461bcd60e51b815260040180806020018281038252602b815260200180614735602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611da757fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611dda57600080fd5b505af1158015611dee573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611e537f00000000000000000000000000000000000000000000000000000000000000008989600081811061173857fe5b84600081518110611e6057fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611eb757600080fd5b505af1158015611ecb573d6000803e3d6000fd5b505050506040513d6020811015611ee157600080fd5b5051611ee957fe5b611f28828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506137e3915050565b5095945050505050565b6000610e34848484613ee4565b60608142811015611f85576040805162461bcd60e51b815260206004820152601860248201526000805160206147b8833981519152604482015290519081900360640190fd5b611fe37f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a2992505050565b91508682600081518110611ff357fe5b602002602001015111156113a75760405162461bcd60e51b81526004018080602001828103825260278152602001806146e86027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610e34848484613fd4565b600081428110156120af576040805162461bcd60e51b815260206004820152601860248201526000805160206147b8833981519152604482015290519081900360640190fd5b6120de887f00000000000000000000000000000000000000000000000000000000000000008989893089612588565b604080516370a0823160e01b8152306004820152905191945061216292508a9187916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561213157600080fd5b505afa158015612145573d6000803e3d6000fd5b505050506040513d602081101561215b57600080fd5b50516130e3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156121c857600080fd5b505af11580156121dc573d6000803e3d6000fd5b505050506111708483613265565b804281101561222e576040805162461bcd60e51b815260206004820152601860248201526000805160206147b8833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061226557fe5b905060200201356001600160a01b03166001600160a01b0316146122d0576040805162461bcd60e51b815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561233057600080fd5b505af1158015612344573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6123a97f00000000000000000000000000000000000000000000000000000000000000008989600081811061173857fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156123f957600080fd5b505af115801561240d573d6000803e3d6000fd5b505050506040513d602081101561242357600080fd5b505161242b57fe5b60008686600019810181811061243d57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156124a257600080fd5b505afa1580156124b6573d6000803e3d6000fd5b505050506040513d60208110156124cc57600080fd5b5051604080516020898102828101820190935289825292935061250e9290918a918a918291850190849080828437600092019190915250899250613b61915050565b876118f0828989600019810181811061252357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156118b857600080fd5b60008082428110156125cf576040805162461bcd60e51b815260206004820152601860248201526000805160206147b8833981519152604482015290519081900360640190fd5b60006125fc7f00000000000000000000000000000000000000000000000000000000000000008c8c613599565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561265757600080fd5b505af115801561266b573d6000803e3d6000fd5b505050506040513d602081101561268157600080fd5b5050604080517f89afcb440000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156126e757600080fd5b505af11580156126fb573d6000803e3d6000fd5b505050506040513d604081101561271157600080fd5b5080516020909101519092509050600061272b8e8e614080565b509050806001600160a01b03168e6001600160a01b03161461274e578183612751565b82825b90975095508a8710156127955760405162461bcd60e51b815260040180806020018281038252602681526020018061470f6026913960400191505060405180910390fd5b898610156127d45760405162461bcd60e51b81526004018080602001828103825260268152602001806146756026913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606111a87f0000000000000000000000000000000000000000000000000000000000000000848461344d565b60008060006128867f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613599565b9050600087612895578c612899565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b15801561290f57600080fd5b505af1158015612923573d6000803e3d6000fd5b505050506129358e8e8e8e8e8e610d0d565b909f909e509c50505050505050505050505050565b60008060008342811015612993576040805162461bcd60e51b815260206004820152601860248201526000805160206147b8833981519152604482015290519081900360640190fd5b6129a18c8c8c8c8c8c61415e565b909450925060006129d37f00000000000000000000000000000000000000000000000000000000000000008e8e613599565b90506129e18d338388613671565b6129ed8c338387613671565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612a4557600080fd5b505af1158015612a59573d6000803e3d6000fd5b505050506040513d6020811015612a6f57600080fd5b5051949d939c50939a509198505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060008342811015612af3576040805162461bcd60e51b815260206004820152601860248201526000805160206147b8833981519152604482015290519081900360640190fd5b612b218a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c61415e565b90945092506000612b737f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613599565b9050612b818b338388613671565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612bdc57600080fd5b505af1158015612bf0573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612c7557600080fd5b505af1158015612c89573d6000803e3d6000fd5b505050506040513d6020811015612c9f57600080fd5b5051612ca757fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612cff57600080fd5b505af1158015612d13573d6000803e3d6000fd5b505050506040513d6020811015612d2957600080fd5b5051925034841015612d4157612d4133853403613265565b505096509650969350505050565b60608142811015612d95576040805162461bcd60e51b815260206004820152601860248201526000805160206147b8833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612dcc57fe5b905060200201356001600160a01b03166001600160a01b031614612e37576040805162461bcd60e51b815260206004820152601d60248201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604482015290519081900360640190fd5b612e957f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a2992505050565b91503482600081518110612ea557fe5b60200260200101511115612eea5760405162461bcd60e51b81526004018080602001828103825260278152602001806146e86027913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110612f2657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015612f5957600080fd5b505af1158015612f6d573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb612fd27f00000000000000000000000000000000000000000000000000000000000000008989600081811061173857fe5b84600081518110612fdf57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561303657600080fd5b505af115801561304a573d6000803e3d6000fd5b505050506040513d602081101561306057600080fd5b505161306857fe5b6130a7828787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508992506137e3915050565b816000815181106130b457fe5b6020026020010151341115611f2857611f2833836000815181106130d457fe5b60200260200101513403613265565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b6020831061318e5780518252601f19909201916020918201910161316f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146131f0576040519150601f19603f3d011682016040523d82523d6000602084013e6131f5565b606091505b5091509150818015613223575080511580613223575080806020019051602081101561322057600080fd5b50515b61325e5760405162461bcd60e51b815260040180806020018281038252602d815260200180614760602d913960400191505060405180910390fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106132b15780518252601f199092019160209182019101613292565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613313576040519150601f19603f3d011682016040523d82523d6000602084013e613318565b606091505b50509050806133585760405162461bcd60e51b815260040180806020018281038252603481526020018061461c6034913960400191505060405180910390fd5b505050565b600080841161339d5760405162461bcd60e51b815260040180806020018281038252602b81526020018061478d602b913960400191505060405180910390fd5b6000831180156133ad5750600082115b6133e85760405162461bcd60e51b815260040180806020018281038252602881526020018061469b6028913960400191505060405180910390fd5b60006133fc856103e563ffffffff61442c16565b90506000613410828563ffffffff61442c16565b905060006134368361342a886103e863ffffffff61442c16565b9063ffffffff61449816565b905080828161344157fe5b04979650505050505050565b60606002825110156134a6576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff811180156134be57600080fd5b506040519080825280602002602001820160405280156134e8578160200160208202803683370190505b50905082816000815181106134f957fe5b60200260200101818152505060005b60018351038110156135915760008061354b8786858151811061352757fe5b602002602001015187866001018151811061353e57fe5b60200260200101516144f0565b9150915061356d84848151811061355e57fe5b6020026020010151838361335d565b84846001018151811061357c57fe5b60209081029190910101525050600101613508565b509392505050565b60008060006135a88585614080565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f0ec3a964af2d4288dcee11cf85135843bcfc1e8e4f8a107d634a0818cc792ee7609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b17815292518251600094606094938a169392918291908083835b6020831061370b5780518252601f1990920191602091820191016136ec565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461376d576040519150601f19603f3d011682016040523d82523d6000602084013e613772565b606091505b50915091508180156137a05750805115806137a0575080806020019051602081101561379d57600080fd5b50515b6137db5760405162461bcd60e51b81526004018080602001828103825260318152602001806145eb6031913960400191505060405180910390fd5b505050505050565b60005b6001835103811015613a235760008084838151811061380157fe5b602002602001015185846001018151811061381857fe5b60200260200101519150915060006138308383614080565b509050600087856001018151811061384457fe5b60200260200101519050600080836001600160a01b0316866001600160a01b03161461387257826000613876565b6000835b91509150600060028a5103881061388d57886138ce565b6138ce7f0000000000000000000000000000000000000000000000000000000000000000878c8b600201815181106138c157fe5b6020026020010151613599565b90506138fb7f00000000000000000000000000000000000000000000000000000000000000008888613599565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613938576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156139a9578181015183820152602001613991565b50505050905090810190601f1680156139d65780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156139f857600080fd5b505af1158015613a0c573d6000803e3d6000fd5b5050600190990198506137e6975050505050505050565b50505050565b6060600282511015613a82576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613a9a57600080fd5b50604051908082528060200260200182016040528015613ac4578160200160208202803683370190505b5090508281600183510381518110613ad857fe5b60209081029190910101528151600019015b801561359157600080613b1a87866001860381518110613b0657fe5b602002602001015187868151811061353e57fe5b91509150613b3c848481518110613b2d57fe5b60200260200101518383613ee4565b846001850381518110613b4b57fe5b6020908102919091010152505060001901613aea565b60005b600183510381101561335857600080848381518110613b7f57fe5b6020026020010151858460010181518110613b9657fe5b6020026020010151915091506000613bae8383614080565b5090506000613bde7f00000000000000000000000000000000000000000000000000000000000000008585613599565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613c1f57600080fd5b505afa158015613c33573d6000803e3d6000fd5b505050506040513d6060811015613c4957600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506000806001600160a01b038a811690891614613c86578284613c89565b83835b91509150613ce7828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156118b857600080fd5b9550613cf486838361335d565b945050505050600080856001600160a01b0316886001600160a01b031614613d1e57826000613d22565b6000835b91509150600060028c51038a10613d39578a613d6d565b613d6d7f0000000000000000000000000000000000000000000000000000000000000000898e8d600201815181106138c157fe5b60408051600080825260208201928390527f022c0d9f00000000000000000000000000000000000000000000000000000000835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015613e10578181015183820152602001613df8565b50505050905090810190601f168015613e3d5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613e5f57600080fd5b505af1158015613e73573d6000803e3d6000fd5b50506001909b019a50613b649950505050505050505050565b808203828111156111ab576040805162461bcd60e51b815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411613f245760405162461bcd60e51b815260040180806020018281038252602c8152602001806145bf602c913960400191505060405180910390fd5b600083118015613f345750600082115b613f6f5760405162461bcd60e51b815260040180806020018281038252602881526020018061469b6028913960400191505060405180910390fd5b6000613f936103e8613f87868863ffffffff61442c16565b9063ffffffff61442c16565b90506000613fad6103e5613f87868963ffffffff613e8c16565b9050613fca6001828481613fbd57fe5b049063ffffffff61449816565b9695505050505050565b60008084116140145760405162461bcd60e51b81526004018080602001828103825260258152602001806146c36025913960400191505060405180910390fd5b6000831180156140245750600082115b61405f5760405162461bcd60e51b815260040180806020018281038252602881526020018061469b6028913960400191505060405180910390fd5b82614070858463ffffffff61442c16565b8161407757fe5b04949350505050565b600080826001600160a01b0316846001600160a01b031614156140d45760405162461bcd60e51b81526004018080602001828103825260258152602001806146506025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b0316106140f45782846140f7565b83835b90925090506001600160a01b038216614157576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b604080517fe6a439050000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b1580156141f157600080fd5b505afa158015614205573d6000803e3d6000fd5b505050506040513d602081101561421b57600080fd5b50516001600160a01b0316141561430f57604080517f76f797380000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015289811660248301527f00000000000000000000000000000000000000000000000000000000000000008116604483015291517f0000000000000000000000000000000000000000000000000000000000000000909216916376f79738916064808201926020929091908290030181600087803b1580156142e257600080fd5b505af11580156142f6573d6000803e3d6000fd5b505050506040513d602081101561430c57600080fd5b50505b60008061433d7f00000000000000000000000000000000000000000000000000000000000000008b8b6144f0565b9150915081600014801561434f575080155b1561435f5787935086925061441f565b600061436c898484613fd4565b90508781116143bf57858110156143b45760405162461bcd60e51b81526004018080602001828103825260268152602001806146756026913960400191505060405180910390fd5b88945092508261441d565b60006143cc898486613fd4565b9050898111156143d857fe5b878110156144175760405162461bcd60e51b815260040180806020018281038252602681526020018061470f6026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806144475750508082028282828161444457fe5b04145b6111ab576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b808201828110156111ab576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b60008060006144ff8585614080565b509050600080614510888888613599565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561454857600080fd5b505afa15801561455c573d6000803e3d6000fd5b505050506040513d606081101561457257600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506001600160a01b03878116908416146145ac5780826145af565b81815b9099909850965050505050505056fe556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c65645472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c6564556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54556e69737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e54556e69737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54556e69737761705632526f757465723a20455850495245440000000000000000a26469706673582212206cbff6bf6fffd054ea5d180af8a5f32c749c0f5f1ee8d871fff4e3da9478af4964736f6c634300060600330000000000000000000000006b6071ccc534fcee7b699aab87929faf8806d5bd00000000000000000000000009f8e0aea93bcb511276a166e6e57e02e5cc1e0a00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a

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

0000000000000000000000006b6071ccc534fcee7b699aab87929faf8806d5bd00000000000000000000000009f8e0aea93bcb511276a166e6e57e02e5cc1e0a00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a

-----Decoded View---------------
Arg [0] : _factory (address): 0x6b6071ccc534fcee7b699aab87929faf8806d5bd
Arg [1] : _pylonFactory (address): 0x09f8e0aea93bcb511276a166e6e57e02e5cc1e0a
Arg [2] : _WETH (address): 0x98878b06940ae243284ca214f92bb71a2b032b8a

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000006b6071ccc534fcee7b699aab87929faf8806d5bd
Arg [1] : 00000000000000000000000009f8e0aea93bcb511276a166e6e57e02e5cc1e0a
Arg [2] : 00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.