ETH Price: $3,311.75 (-0.68%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Remove Liquidity...213503612024-12-07 11:36:5950 days ago1733571419IN
0xA7eCe091...56e07afF1
0 ETH0.0024177611.14239671
Remove Liquidity...213500922024-12-07 10:42:4750 days ago1733568167IN
0xA7eCe091...56e07afF1
0 ETH0.0025532311.8925705
Swap Exact ETH F...204532992024-08-04 6:08:59175 days ago1722751739IN
0xA7eCe091...56e07afF1
0.0015 ETH0.000023411
Swap Exact ETH F...204090712024-07-29 1:55:11181 days ago1722218111IN
0xA7eCe091...56e07afF1
0.001 ETH0.000023811
Swap Exact ETH F...204083572024-07-28 23:31:47181 days ago1722209507IN
0xA7eCe091...56e07afF1
0.001 ETH0.000023411
Swap Exact Token...152879692022-08-06 9:43:05904 days ago1659778985IN
0xA7eCe091...56e07afF1
0 ETH0.000897967.44259776
Swap Exact Token...152856122022-08-06 0:35:49904 days ago1659746149IN
0xA7eCe091...56e07afF1
0 ETH0.0015020912.44858658
Swap Exact Token...152850322022-08-05 22:31:31904 days ago1659738691IN
0xA7eCe091...56e07afF1
0 ETH0.0014062711.65446149
Swap Exact Token...152817712022-08-05 10:34:32905 days ago1659695672IN
0xA7eCe091...56e07afF1
0 ETH0.000870247.21216631
Swap Exact Token...152817292022-08-05 10:25:36905 days ago1659695136IN
0xA7eCe091...56e07afF1
0 ETH0.000950937.88081722
Swap Exact Token...152784342022-08-04 22:08:05905 days ago1659650885IN
0xA7eCe091...56e07afF1
0 ETH0.0015086912.50325929
Swap Exact Token...152761212022-08-04 13:20:50906 days ago1659619250IN
0xA7eCe091...56e07afF1
0 ETH0.00105688.75826336
Swap Exact Token...152755612022-08-04 11:15:37906 days ago1659611737IN
0xA7eCe091...56e07afF1
0 ETH0.00087956.38414232
Swap Exact Token...152755242022-08-04 11:08:07906 days ago1659611287IN
0xA7eCe091...56e07afF1
0 ETH0.000971427.0520114
Swap Exact Token...152754942022-08-04 11:03:06906 days ago1659610986IN
0xA7eCe091...56e07afF1
0 ETH0.000929866.74967659
Swap Exact Token...152729192022-08-04 1:18:12906 days ago1659575892IN
0xA7eCe091...56e07afF1
0 ETH0.000892686.47980458
Swap Exact Token...152728632022-08-04 1:06:59906 days ago1659575219IN
0xA7eCe091...56e07afF1
0 ETH0.0015149712.55530946
Swap Exact Token...152727202022-08-04 0:35:21906 days ago1659573321IN
0xA7eCe091...56e07afF1
0 ETH0.001199168.70450456
Swap Exact Token...152690782022-08-03 11:01:39907 days ago1659524499IN
0xA7eCe091...56e07afF1
0 ETH0.0017793314.74620413
Swap Exact Token...152675962022-08-03 5:26:28907 days ago1659504388IN
0xA7eCe091...56e07afF1
0 ETH0.001073898.89989687
Swap Exact Token...152675792022-08-03 5:21:11907 days ago1659504071IN
0xA7eCe091...56e07afF1
0 ETH0.000740676.13833825
Swap Exact Token...152674162022-08-03 4:45:04907 days ago1659501904IN
0xA7eCe091...56e07afF1
0 ETH0.000781675.67402323
Swap Exact Token...152661002022-08-02 23:39:26907 days ago1659483566IN
0xA7eCe091...56e07afF1
0 ETH0.000867987.19338359
Swap Exact Token...152659942022-08-02 23:16:51907 days ago1659482211IN
0xA7eCe091...56e07afF1
0 ETH0.001006847.3084906
Swap Exact Token...152628872022-08-02 11:36:59908 days ago1659440219IN
0xA7eCe091...56e07afF1
0 ETH0.000600244.35706836
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
213503612024-12-07 11:36:5950 days ago1733571419
0xA7eCe091...56e07afF1
0.01131555 ETH
213503612024-12-07 11:36:5950 days ago1733571419
0xA7eCe091...56e07afF1
0.01131555 ETH
152404152022-07-29 23:46:52911 days ago1659138412
0xA7eCe091...56e07afF1
0.00017392 ETH
152404152022-07-29 23:46:52911 days ago1659138412
0xA7eCe091...56e07afF1
0.00052607 ETH
141540592022-02-06 18:09:001084 days ago1644170940
0xA7eCe091...56e07afF1
0.43431731 ETH
141540592022-02-06 18:09:001084 days ago1644170940
0xA7eCe091...56e07afF1
0.43431731 ETH
136910962021-11-26 17:27:021156 days ago1637947622
0xA7eCe091...56e07afF1
0.91860914 ETH
136910962021-11-26 17:27:021156 days ago1637947622
0xA7eCe091...56e07afF1
0.91860914 ETH
136910872021-11-26 17:24:561156 days ago1637947496
0xA7eCe091...56e07afF1
0.92650795 ETH
136910872021-11-26 17:24:561156 days ago1637947496
0xA7eCe091...56e07afF1
0.92650795 ETH
136740792021-11-24 0:37:231159 days ago1637714243
0xA7eCe091...56e07afF1
0.98589045 ETH
136740792021-11-24 0:37:231159 days ago1637714243
0xA7eCe091...56e07afF1
0.98589045 ETH
136735932021-11-23 22:53:111159 days ago1637707991
0xA7eCe091...56e07afF1
1.04 ETH
136731742021-11-23 21:21:111159 days ago1637702471
0xA7eCe091...56e07afF1
1 ETH
136728652021-11-23 20:08:011159 days ago1637698081
0xA7eCe091...56e07afF1
1.12 ETH
136726052021-11-23 19:11:081159 days ago1637694668
0xA7eCe091...56e07afF1
1.09 ETH
136657662021-11-22 17:16:571160 days ago1637601417
0xA7eCe091...56e07afF1
0.98 ETH
136652532021-11-22 15:21:261160 days ago1637594486
0xA7eCe091...56e07afF1
0.69703112 ETH
136652532021-11-22 15:21:261160 days ago1637594486
0xA7eCe091...56e07afF1
0.69703112 ETH
136359712021-11-17 23:49:571165 days ago1637192997
0xA7eCe091...56e07afF1
1.04 ETH
136335972021-11-17 14:50:521166 days ago1637160652
0xA7eCe091...56e07afF1
1.085 ETH
136327752021-11-17 11:53:561166 days ago1637150036
0xA7eCe091...56e07afF1
1.33 ETH
136327682021-11-17 11:51:521166 days ago1637149912
0xA7eCe091...56e07afF1
1.31 ETH
136327462021-11-17 11:45:441166 days ago1637149544
0xA7eCe091...56e07afF1
1.24 ETH
136257172021-11-16 9:06:101167 days ago1637053570
0xA7eCe091...56e07afF1
0.79129484 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LinkswapRouter

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 10 : LinkswapRouter.sol
pragma solidity 0.6.6;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "./interfaces/ILinkswapFactory.sol";
import "./interfaces/ILinkswapPair.sol";
import "./interfaces/ILinkswapRouter.sol";
import "./interfaces/IWETH.sol";
import "./libraries/LinkswapLibrary.sol";
import "./libraries/SafeMathLinkswap.sol";
import "./libraries/TransferHelper.sol";

contract LinkswapRouter is ILinkswapRouter {
    using SafeMathLinkswap for uint256;

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

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

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

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

    // **** CREATE PAIR ****
    // ETH amount must cover listing fee (if listingFeeToken==ETH) and lockupTokenAmount (if lockupToken==ETH)
    // approvals (for WETH, newToken, lockupToken) must be done beforehand
    function createPairUsingETH(
        address newToken,
        uint256 newTokenAmount,
        address lockupToken,
        uint256 lockupTokenAmount,
        uint256 lockupPeriod,
        address listingFeeToken
    ) external payable virtual override returns (address pair) {
        IWETH(WETH).deposit{value: msg.value}();
        IERC20(WETH).approve(factory, msg.value);

        pair = ILinkswapFactory(factory).createPair(
            newToken,
            newTokenAmount,
            lockupToken,
            lockupTokenAmount,
            lockupPeriod,
            listingFeeToken
        );

        // refund dust eth, if any
        TransferHelper.safeTransfer(WETH, msg.sender, IERC20(WETH).balanceOf(address(this)));
    }

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin
    ) internal view virtual returns (uint256 amountA, uint256 amountB) {
        require(ILinkswapFactory(factory).getPair(tokenA, tokenB) != address(0), "LinkswapRouter: PAIR_NOT_CREATED");
        (uint256 reserveA, uint256 reserveB) = LinkswapLibrary.getReserves(factory, tokenA, tokenB);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint256 amountBOptimal = LinkswapLibrary.quote(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, "LinkswapRouter: INSUFFICIENT_B_AMOUNT");
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint256 amountAOptimal = LinkswapLibrary.quote(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, "LinkswapRouter: INSUFFICIENT_A_AMOUNT");
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }

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

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

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) public virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) {
        address pair = LinkswapLibrary.pairFor(factory, tokenA, tokenB);
        IERC20(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
        (uint256 amount0, uint256 amount1) = ILinkswapPair(pair).burn(to);
        (address token0, ) = LinkswapLibrary.sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, "LinkswapRouter: INSUFFICIENT_A_AMOUNT");
        require(amountB >= amountBMin, "LinkswapRouter: INSUFFICIENT_B_AMOUNT");
    }

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

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external virtual override returns (uint256 amountToken, uint256 amountETH) {
        address pair = LinkswapLibrary.pairFor(factory, token, WETH);
        uint256 value = approveMax ? uint256(-1) : liquidity;
        ILinkswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) public virtual override ensure(deadline) returns (uint256 amountETH) {
        (, amountETH) = removeLiquidity(token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline);
        TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external virtual override returns (uint256 amountETH) {
        address pair = LinkswapLibrary.pairFor(factory, token, WETH);
        uint256 value = approveMax ? uint256(-1) : liquidity;
        ILinkswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
            token,
            liquidity,
            amountTokenMin,
            amountETHMin,
            to,
            deadline
        );
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(
        uint256[] memory amounts,
        address[] memory path,
        address _to
    ) internal virtual {
        for (uint256 i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = LinkswapLibrary.sortTokens(input, output);
            uint256 amountOut = amounts[i + 1];
            (uint256 amount0Out, uint256 amount1Out) = input == token0
                ? (uint256(0), amountOut)
                : (amountOut, uint256(0));
            address to = i < path.length - 2 ? LinkswapLibrary.pairFor(factory, output, path[i + 2]) : _to;
            ILinkswapPair(LinkswapLibrary.pairFor(factory, input, output)).swap(
                amount0Out,
                amount1Out,
                to,
                new bytes(0)
            );
        }
    }

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
        amounts = LinkswapLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, "LinkswapRouter: INSUFFICIENT_OUTPUT_AMOUNT");
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            LinkswapLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, to);
    }

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

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) {
        require(path[0] == WETH, "LinkswapRouter: INVALID_PATH");
        amounts = LinkswapLibrary.getAmountsOut(factory, msg.value, path);
        require(amounts[amounts.length - 1] >= amountOutMin, "LinkswapRouter: INSUFFICIENT_OUTPUT_AMOUNT");
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(LinkswapLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
    }

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
        require(path[path.length - 1] == WETH, "LinkswapRouter: INVALID_PATH");
        amounts = LinkswapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= amountInMax, "LinkswapRouter: EXCESSIVE_INPUT_AMOUNT");
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            LinkswapLibrary.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external virtual override ensure(deadline) returns (uint256[] memory amounts) {
        require(path[path.length - 1] == WETH, "LinkswapRouter: INVALID_PATH");
        amounts = LinkswapLibrary.getAmountsOut(factory, amountIn, path);
        require(amounts[amounts.length - 1] >= amountOutMin, "LinkswapRouter: INSUFFICIENT_OUTPUT_AMOUNT");
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            LinkswapLibrary.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(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) {
        require(path[0] == WETH, "LinkswapRouter: INVALID_PATH");
        amounts = LinkswapLibrary.getAmountsIn(factory, amountOut, path);
        require(amounts[0] <= msg.value, "LinkswapRouter: EXCESSIVE_INPUT_AMOUNT");
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(IWETH(WETH).transfer(LinkswapLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
        _swap(amounts, path, to);
        // refund dust eth, if any
        if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual {
        for (uint256 i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0, ) = LinkswapLibrary.sortTokens(input, output);
            ILinkswapPair pair = ILinkswapPair(LinkswapLibrary.pairFor(factory, input, output));
            uint256 amountInput;
            uint256 amountOutput;
            {
                // scope to avoid stack too deep errors
                (uint256 reserve0, uint256 reserve1, ) = pair.getReserves();
                (uint256 reserveInput, uint256 reserveOutput) = input == token0
                    ? (reserve0, reserve1)
                    : (reserve1, reserve0);
                amountInput = IERC20(input).balanceOf(address(pair)).sub(reserveInput);
                amountOutput = LinkswapLibrary.getAmountOut(
                    amountInput,
                    reserveInput,
                    reserveOutput,
                    pair.tradingFeePercent()
                );
            }
            (uint256 amount0Out, uint256 amount1Out) = input == token0
                ? (uint256(0), amountOutput)
                : (amountOutput, uint256(0));
            address to = i < path.length - 2 ? LinkswapLibrary.pairFor(factory, output, path[i + 2]) : _to;
            pair.swap(amount0Out, amount1Out, to, new bytes(0));
        }
    }

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

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

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

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

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut,
        uint256 tradingFeePercent
    ) public pure virtual override returns (uint256 amountOut) {
        return LinkswapLibrary.getAmountOut(amountIn, reserveIn, reserveOut, tradingFeePercent);
    }

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut,
        uint256 tradingFeePercent
    ) public pure virtual override returns (uint256 amountIn) {
        return LinkswapLibrary.getAmountIn(amountOut, reserveIn, reserveOut, tradingFeePercent);
    }

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

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

File 2 of 10 : ILinkswapERC20.sol
pragma solidity 0.6.6;

interface ILinkswapERC20 {
    event Approval(address indexed owner, address indexed spender, uint256 value);
    event Transfer(address indexed from, address indexed to, uint256 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 (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 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 (uint256);

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

File 3 of 10 : ILinkswapFactory.sol
pragma solidity 0.6.6;

interface ILinkswapFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint256 pairNum);

    function LINK() external view returns (address);

    function WETH() external view returns (address);

    function YFL() external view returns (address);

    function governance() external view returns (address);

    function treasury() external view returns (address);

    function priceOracle() external view returns (address);

    // USD amounts should be 8 dp precision
    // frontend should approve transfer of higher amount (e.g. 1.1x) due to price fluctuations
    function linkListingFeeInUsd() external view returns (uint256);

    function wethListingFeeInUsd() external view returns (uint256);

    function yflListingFeeInUsd() external view returns (uint256);

    // need to divide share by 1,000,000 e.g. 100,000 is 10%
    // the rest goes to governance
    function treasuryListingFeeShare() external view returns (uint256);

    function minListingLockupAmountInUsd() external view returns (uint256);

    // if lockup amount is set to this or more, the lockup amount proportion of listing fee discount is fully unlocked
    // if less than this amount, then lockup amount proportion of listing fee discount is linearly interpolated from the distance between min and target lockup amounts e.g. 60% towards target from min means 60% of lockup amount discount
    function targetListingLockupAmountInUsd() external view returns (uint256);

    // in seconds since unix epoch
    // min lockup period for the listing lockup amount
    function minListingLockupPeriod() external view returns (uint256);

    // in seconds since unix epoch
    // if lockup period is set to this or longer, the lockup time proportion of listing fee discount is fully unlocked
    // if less than this period, then lockup time proportion of listing fee discount is linearly interpolated from the distance between min and target lockup times e.g. 60% towards target from min means 60% of lockup time discount
    function targetListingLockupPeriod() external view returns (uint256);

    // need to divide share by 1,000,000 e.g. 100,000 is 10%
    // rest of listing fee discount is determined by lockup period
    function lockupAmountListingFeeDiscountShare() external view returns (uint256);

    // need to divide fee percents by 1,000,000 e.g. 3000 is 0.3000%
    function defaultLinkTradingFeePercent() external view returns (uint256);

    function defaultNonLinkTradingFeePercent() external view returns (uint256);

    // need to divide share by 1,000,000 e.g. 100,000 is 10%
    // the rest goes to governance
    function treasuryProtocolFeeShare() external view returns (uint256);

    // inverse of protocol fee fraction, then multiplied by 1000.
    // e.g. if protocol fee is 3/7th of trading fee, then value = 7/3 * 1000 = 2333
    // set to 0 to disable protocol fee
    function protocolFeeFractionInverse() external view returns (uint256);

    // need to divide by 100 e.g. 50 is 50%
    function maxSlippagePercent() external view returns (uint256);

    // max slippage resets after this many blocks
    function maxSlippageBlocks() external view returns (uint256);

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

    function approvedPair(address tokenA, address tokenB) external view returns (bool approved);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function approvePairViaGovernance(address tokenA, address tokenB) external;

    function createPair(
        address newToken,
        uint256 newTokenAmount,
        address lockupToken, // LINK or WETH
        uint256 lockupTokenAmount,
        uint256 lockupPeriod,
        address listingFeeToken
    ) external returns (address pair);

    function setPriceOracle(address) external;

    function setTreasury(address) external;

    function setGovernance(address) external;

    function setTreasuryProtocolFeeShare(uint256) external;

    function setProtocolFeeFractionInverse(uint256) external;

    function setLinkListingFeeInUsd(uint256) external;

    function setWethListingFeeInUsd(uint256) external;

    function setYflListingFeeInUsd(uint256) external;

    function setTreasuryListingFeeShare(uint256) external;

    function setMinListingLockupAmountInUsd(uint256) external;

    function setTargetListingLockupAmountInUsd(uint256) external;

    function setMinListingLockupPeriod(uint256) external;

    function setTargetListingLockupPeriod(uint256) external;

    function setLockupAmountListingFeeDiscountShare(uint256) external;

    function setDefaultLinkTradingFeePercent(uint256) external;

    function setDefaultNonLinkTradingFeePercent(uint256) external;

    function setMaxSlippagePercent(uint256) external;

    function setMaxSlippageBlocks(uint256) external;
}

File 4 of 10 : ILinkswapPair.sol
pragma solidity 0.6.6;

import "./ILinkswapERC20.sol";

interface ILinkswapPair is ILinkswapERC20 {
    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Lock(address indexed sender, uint256 lockupPeriod, uint256 liquidityLockupAmount);
    event Unlock(address indexed sender, uint256 liquidityUnlocked);
    event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function addressToLockupExpiry(address) external view returns (uint256);

    function addressToLockupAmount(address) external view returns (uint256);

    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 (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function tradingFeePercent() external view returns (uint256);

    function lastSlippageBlocks() external view returns (uint256);

    function priceAtLastSlippageBlocks() external view returns (uint256);

    function lastSwapPrice() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function lock(uint256 lockupPeriod, uint256 liquidityLockupAmount) external;

    function unlock() external;

    function burn(address to) external returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function setTradingFeePercent(uint256 _tradingFeePercent) external;

    // functions only callable by LinkswapFactory
    function initialize(
        address _token0,
        address _token1,
        uint256 _tradingFeePercent
    ) external;

    function listingLock(
        address lister,
        uint256 lockupPeriod,
        uint256 liquidityLockupAmount
    ) external;
}

File 5 of 10 : ILinkswapRouter.sol
pragma solidity 0.6.6;

interface ILinkswapRouter {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function createPairUsingETH(
        address newToken,
        uint256 newTokenAmount,
        address lockupToken,
        uint256 lockupTokenAmount,
        uint256 lockupPeriod,
        address listingFeeToken
    ) external payable returns (address pair);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut,
        uint256 tradingFeePercent
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut,
        uint256 tradingFeePercent
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts);
}

File 6 of 10 : IWETH.sol
pragma solidity 0.6.6;

interface IWETH {
    function deposit() external payable;

    function transfer(address to, uint256 value) external returns (bool);

    function withdraw(uint256) external;
}

File 7 of 10 : LinkswapLibrary.sol
pragma solidity 0.6.6;

import "../interfaces/ILinkswapFactory.sol";
import "../interfaces/ILinkswapPair.sol";
import "./SafeMathLinkswap.sol";

library LinkswapLibrary {
    using SafeMathLinkswap for uint256;

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

    function pairFor(
        address factory,
        address tokenA,
        address tokenB
    ) internal view returns (address pair) {
        pair = ILinkswapFactory(factory).getPair(tokenA, tokenB);
    }

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

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

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

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

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

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

File 8 of 10 : SafeMathLinkswap.sol
pragma solidity 0.6.6;

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

library SafeMathLinkswap {
    function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x + y) >= x, "ds-math-add-overflow");
    }

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

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

File 9 of 10 : TransferHelper.sol
pragma solidity 0.6.6;

// 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: 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: 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: TRANSFER_FROM_FAILED");
    }

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

File 10 of 10 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newToken","type":"address"},{"internalType":"uint256","name":"newTokenAmount","type":"uint256"},{"internalType":"address","name":"lockupToken","type":"address"},{"internalType":"uint256","name":"lockupTokenAmount","type":"uint256"},{"internalType":"uint256","name":"lockupPeriod","type":"uint256"},{"internalType":"address","name":"listingFeeToken","type":"address"}],"name":"createPairUsingETH","outputs":[{"internalType":"address","name":"pair","type":"address"}],"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"},{"internalType":"uint256","name":"tradingFeePercent","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"},{"internalType":"uint256","name":"tradingFeePercent","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405234801561001057600080fd5b5060405162004d1638038062004d168339818101604052604081101561003557600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c614b7d62000199600039806101795280610d095280610d7d5280610f245280610ffe5280611039528061111b528061133952806116c3528061184e5280611c155280611d0f5280611dc55280611e935280611fd952806120615280612299528061231c528061239a528061246652806124fb528061256f5280612a6d5280612ce05280612d365280612d6a5280612dde5280612f7e52806130c15280613149525080610dac5280610e8e52806111a9528061128052806113ff528061143852806115735280611751528061182c528061199c5280611f26528061209352806121e952806125a152806127fa52806129f25280612a1b5280612a4b5280612bb85280612d145280613011528061317b5280613a2c5280613a6f528061408a528061423d528061457d52806146565250614b7d6000f3fe6080604052600436106101695760003560e01c80637ff36ab5116100d1578063baa2abde1161008a578063ded9382a11610064578063ded9382a14610b48578063e8e3370014610bbb578063f305d71914610c3b578063fb3bdb4114610c81576101a2565b8063baa2abde14610a21578063c45a015514610a7e578063d06ca61f14610a93576101a2565b80637ff36ab5146107e55780638803dbee14610869578063ad5c4648146108ff578063ad615dec14610914578063af2979eb1461094a578063b6f9de951461099d576101a2565b80634a25d94a116101235780634a25d94a1461052657806352707d8c146105bc578063571fd0121461060a5780635b0d5984146106465780635c11d795146106b9578063791ac9471461074f576101a2565b80629d2793146101a757806302751cec1461020b57806318cbafe5146102775780631f00ca741461035d5780632195995c1461041257806338ed173914610490576101a2565b366101a257336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a057fe5b005b600080fd5b6101ef600480360360c08110156101bd57600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359160808201359160a0013516610d05565b604080516001600160a01b039092168252519081900360200190f35b34801561021757600080fd5b5061025e600480360360c081101561022e57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610fb1565b6040805192835260208301919091528051918290030190f35b34801561028357600080fd5b5061030d600480360360a081101561029a57600080fd5b813591602081013591810190606081016040820135600160201b8111156102c057600080fd5b8201836020820111156102d257600080fd5b803590602001918460208302840111600160201b831117156102f357600080fd5b91935091506001600160a01b0381351690602001356110cb565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610349578181015183820152602001610331565b505050509050019250505060405180910390f35b34801561036957600080fd5b5061030d6004803603604081101561038057600080fd5b81359190810190604081016020820135600160201b8111156103a157600080fd5b8201836020820111156103b357600080fd5b803590602001918460208302840111600160201b831117156103d457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506113f8945050505050565b34801561041e57600080fd5b5061025e600480360361016081101561043657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561142e565b34801561049c57600080fd5b5061030d600480360360a08110156104b357600080fd5b813591602081013591810190606081016040820135600160201b8111156104d957600080fd5b8201836020820111156104eb57600080fd5b803590602001918460208302840111600160201b8311171561050c57600080fd5b91935091506001600160a01b038135169060200135611528565b34801561053257600080fd5b5061030d600480360360a081101561054957600080fd5b813591602081013591810190606081016040820135600160201b81111561056f57600080fd5b82018360208201111561058157600080fd5b803590602001918460208302840111600160201b831117156105a257600080fd5b91935091506001600160a01b038135169060200135611673565b3480156105c857600080fd5b506105f8600480360360808110156105df57600080fd5b50803590602081013590604081013590606001356117ff565b60408051918252519081900360200190f35b34801561061657600080fd5b506105f86004803603608081101561062d57600080fd5b5080359060208101359060408101359060600135611816565b34801561065257600080fd5b506105f8600480360361014081101561066a57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611824565b3480156106c557600080fd5b506101a0600480360360a08110156106dc57600080fd5b813591602081013591810190606081016040820135600160201b81111561070257600080fd5b82018360208201111561071457600080fd5b803590602001918460208302840111600160201b8311171561073557600080fd5b91935091506001600160a01b038135169060200135611932565b34801561075b57600080fd5b506101a0600480360360a081101561077257600080fd5b813591602081013591810190606081016040820135600160201b81111561079857600080fd5b8201836020820111156107aa57600080fd5b803590602001918460208302840111600160201b831117156107cb57600080fd5b91935091506001600160a01b038135169060200135611bc7565b61030d600480360360808110156107fb57600080fd5b81359190810190604081016020820135600160201b81111561081c57600080fd5b82018360208201111561082e57600080fd5b803590602001918460208302840111600160201b8311171561084f57600080fd5b91935091506001600160a01b038135169060200135611e4b565b34801561087557600080fd5b5061030d600480360360a081101561088c57600080fd5b813591602081013591810190606081016040820135600160201b8111156108b257600080fd5b8201836020820111156108c457600080fd5b803590602001918460208302840111600160201b831117156108e557600080fd5b91935091506001600160a01b03813516906020013561219e565b34801561090b57600080fd5b506101ef612297565b34801561092057600080fd5b506105f86004803603606081101561093757600080fd5b50803590602081013590604001356122bb565b34801561095657600080fd5b506105f8600480360360c081101561096d57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a001356122d0565b6101a0600480360360808110156109b357600080fd5b81359190810190604081016020820135600160201b8111156109d457600080fd5b8201836020820111156109e657600080fd5b803590602001918460208302840111600160201b83111715610a0757600080fd5b91935091506001600160a01b038135169060200135612420565b348015610a2d57600080fd5b5061025e600480360360e0811015610a4457600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c001356127ac565b348015610a8a57600080fd5b506101ef6129f0565b348015610a9f57600080fd5b5061030d60048036036040811015610ab657600080fd5b81359190810190604081016020820135600160201b811115610ad757600080fd5b820183602082011115610ae957600080fd5b803590602001918460208302840111600160201b83111715610b0a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612a14945050505050565b348015610b5457600080fd5b5061025e6004803603610140811015610b6c57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135612a41565b348015610bc757600080fd5b50610c1d6004803603610100811015610bdf57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135612b55565b60408051938452602084019290925282820152519081900360600190f35b610c1d600480360360c0811015610c5157600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612c91565b61030d60048036036080811015610c9757600080fd5b81359190810190604081016020820135600160201b811115610cb857600080fd5b820183602082011115610cca57600080fd5b803590602001918460208302840111600160201b83111715610ceb57600080fd5b91935091506001600160a01b038135169060200135612f36565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610d6257600080fd5b505af1158015610d76573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000346040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610e1b57600080fd5b505af1158015610e2f573d6000803e3d6000fd5b505050506040513d6020811015610e4557600080fd5b505060408051631d701adb60e31b81526001600160a01b038981166004830152602482018990528781166044830152606482018790526084820186905284811660a483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163eb80d6d89160c4808201926020929091908290030181600087803b158015610ed957600080fd5b505af1158015610eed573d6000803e3d6000fd5b505050506040513d6020811015610f0357600080fd5b5051604080516370a0823160e01b81523060048201529051919250610fa7917f00000000000000000000000000000000000000000000000000000000000000009133916001600160a01b038416916370a08231916024808301926020929190829003018186803b158015610f7657600080fd5b505afa158015610f8a573d6000803e3d6000fd5b505050506040513d6020811015610fa057600080fd5b50516132b8565b9695505050505050565b6000808242811015610ff8576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b611027897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6127ac565b90935091506110378986856132b8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561109d57600080fd5b505af11580156110b1573d6000803e3d6000fd5b505050506110bf8583613422565b50965096945050505050565b60608142811015611111576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061114b57fe5b905060200201356001600160a01b03166001600160a01b0316146111a4576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a6e833981519152604482015290519081900360640190fd5b6112027f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061351a92505050565b9150868260018451038151811061121557fe5b6020026020010151101561125a5760405162461bcd60e51b815260040180806020018281038252602a81526020018061498d602a913960400191505060405180910390fd5b6112f88686600081811061126a57fe5b905060200201356001600160a01b0316336112de7f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106112ac57fe5b905060200201356001600160a01b03168b8b60018181106112c957fe5b905060200201356001600160a01b0316613799565b856000815181106112eb57fe5b6020026020010151613820565b6113378287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061397d915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061137657fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156113b457600080fd5b505af11580156113c8573d6000803e3d6000fd5b505050506113ed84836001855103815181106113e057fe5b6020026020010151613422565b509695505050505050565b60606114257f00000000000000000000000000000000000000000000000000000000000000008484613bc3565b90505b92915050565b600080600061145e7f00000000000000000000000000000000000000000000000000000000000000008f8f613799565b905060008761146d578c611471565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156114e757600080fd5b505af11580156114fb573d6000803e3d6000fd5b5050505061150e8f8f8f8f8f8f8f6127ac565b809450819550505050509b509b9950505050505050505050565b6060814281101561156e576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b6115cc7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061351a92505050565b915086826001845103815181106115df57fe5b602002602001015110156116245760405162461bcd60e51b815260040180806020018281038252602a81526020018061498d602a913960400191505060405180910390fd5b6116348686600081811061126a57fe5b6113ed8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061397d915050565b606081428110156116b9576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016868660001981018181106116f357fe5b905060200201356001600160a01b03166001600160a01b03161461174c576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a6e833981519152604482015290519081900360640190fd5b6117aa7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613bc392505050565b915086826000815181106117ba57fe5b6020026020010151111561125a5760405162461bcd60e51b81526004018080602001828103825260268152602001806149dc6026913960400191505060405180910390fd5b600061180d85858585613e2e565b95945050505050565b600061180d85858585613f31565b6000806118727f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613799565b9050600086611881578b611885565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156118fb57600080fd5b505af115801561190f573d6000803e3d6000fd5b505050506119218d8d8d8d8d8d6122d0565b9d9c50505050505050505050505050565b8042811015611976576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b6119eb8585600081811061198657fe5b905060200201356001600160a01b0316336119e57f0000000000000000000000000000000000000000000000000000000000000000898960008181106119c857fe5b905060200201356001600160a01b03168a8a60018181106112c957fe5b8a613820565b6000858560001981018181106119fd57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611a6257600080fd5b505afa158015611a76573d6000803e3d6000fd5b505050506040513d6020811015611a8c57600080fd5b50516040805160208881028281018201909352888252929350611ace929091899189918291850190849080828437600092019190915250889250614033915050565b86611b808288886000198101818110611ae357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611b4857600080fd5b505afa158015611b5c573d6000803e3d6000fd5b505050506040513d6020811015611b7257600080fd5b50519063ffffffff61437216565b1015611bbd5760405162461bcd60e51b815260040180806020018281038252602a81526020018061498d602a913960400191505060405180910390fd5b5050505050505050565b8042811015611c0b576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001685856000198101818110611c4557fe5b905060200201356001600160a01b03166001600160a01b031614611c9e576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a6e833981519152604482015290519081900360640190fd5b611cae8585600081811061198657fe5b611cec858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614033915050565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015611d5657600080fd5b505afa158015611d6a573d6000803e3d6000fd5b505050506040513d6020811015611d8057600080fd5b5051905086811015611dc35760405162461bcd60e51b815260040180806020018281038252602a81526020018061498d602a913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611e2957600080fd5b505af1158015611e3d573d6000803e3d6000fd5b50505050611bbd8482613422565b60608142811015611e91576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611ec857fe5b905060200201356001600160a01b03166001600160a01b031614611f21576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a6e833981519152604482015290519081900360640190fd5b611f7f7f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061351a92505050565b91508682600184510381518110611f9257fe5b60200260200101511015611fd75760405162461bcd60e51b815260040180806020018281038252602a81526020018061498d602a913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08360008151811061201357fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561204657600080fd5b505af115801561205a573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6120bf7f0000000000000000000000000000000000000000000000000000000000000000898960008181106119c857fe5b846000815181106120cc57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561212357600080fd5b505af1158015612137573d6000803e3d6000fd5b505050506040513d602081101561214d57600080fd5b505161215557fe5b6121948287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061397d915050565b5095945050505050565b606081428110156121e4576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b6122427f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613bc392505050565b9150868260008151811061225257fe5b602002602001015111156116245760405162461bcd60e51b81526004018080602001828103825260268152602001806149dc6026913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b60006122c88484846143c2565b949350505050565b60008142811015612316576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b612345887f000000000000000000000000000000000000000000000000000000000000000089898930896127ac565b604080516370a0823160e01b8152306004820152905191945061239892508a9187916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015610f7657600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156123fe57600080fd5b505af1158015612412573d6000803e3d6000fd5b505050506113ed8483613422565b8042811015612464576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061249b57fe5b905060200201356001600160a01b03166001600160a01b0316146124f4576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a6e833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561255457600080fd5b505af1158015612568573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6125cd7f0000000000000000000000000000000000000000000000000000000000000000898960008181106119c857fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561261d57600080fd5b505af1158015612631573d6000803e3d6000fd5b505050506040513d602081101561264757600080fd5b505161264f57fe5b60008686600019810181811061266157fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156126c657600080fd5b505afa1580156126da573d6000803e3d6000fd5b505050506040513d60208110156126f057600080fd5b505160408051602089810282810182019093528982529293506127329290918a918a918291850190849080828437600092019190915250899250614033915050565b87611b80828989600019810181811061274757fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611b4857600080fd5b60008082428110156127f3576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b60006128207f00000000000000000000000000000000000000000000000000000000000000008c8c613799565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561287b57600080fd5b505af115801561288f573d6000803e3d6000fd5b505050506040513d60208110156128a557600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156128f257600080fd5b505af1158015612906573d6000803e3d6000fd5b505050506040513d604081101561291c57600080fd5b508051602090910151909250905060006129368e8e61446e565b509050806001600160a01b03168e6001600160a01b03161461295957818361295c565b82825b90975095508a8710156129a05760405162461bcd60e51b8152600401808060200182810382526025815260200180614a496025913960400191505060405180910390fd5b898610156129df5760405162461bcd60e51b81526004018080602001828103825260258152602001806149b76025913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606114257f0000000000000000000000000000000000000000000000000000000000000000848461351a565b6000806000612a917f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613799565b9050600087612aa0578c612aa4565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b158015612b1a57600080fd5b505af1158015612b2e573d6000803e3d6000fd5b50505050612b408e8e8e8e8e8e610fb1565b909f909e509c50505050505050505050505050565b60008060008342811015612b9e576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b612bac8c8c8c8c8c8c61454c565b90945092506000612bde7f00000000000000000000000000000000000000000000000000000000000000008e8e613799565b9050612bec8d338388613820565b612bf88c338387613820565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612c5057600080fd5b505af1158015612c64573d6000803e3d6000fd5b505050506040513d6020811015612c7a57600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015612cda576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b612d088a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c61454c565b90945092506000612d5a7f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613799565b9050612d688b338388613820565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612dc357600080fd5b505af1158015612dd7573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612e5c57600080fd5b505af1158015612e70573d6000803e3d6000fd5b505050506040513d6020811015612e8657600080fd5b5051612e8e57fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612ee657600080fd5b505af1158015612efa573d6000803e3d6000fd5b505050506040513d6020811015612f1057600080fd5b5051925034841015612f2857612f2833853403613422565b505096509650969350505050565b60608142811015612f7c576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110612fb357fe5b905060200201356001600160a01b03166001600160a01b03161461300c576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a6e833981519152604482015290519081900360640190fd5b61306a7f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613bc392505050565b9150348260008151811061307a57fe5b602002602001015111156130bf5760405162461bcd60e51b81526004018080602001828103825260268152602001806149dc6026913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836000815181106130fb57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561312e57600080fd5b505af1158015613142573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6131a77f0000000000000000000000000000000000000000000000000000000000000000898960008181106119c857fe5b846000815181106131b457fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561320b57600080fd5b505af115801561321f573d6000803e3d6000fd5b505050506040513d602081101561323557600080fd5b505161323d57fe5b61327c8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061397d915050565b8160008151811061328957fe5b60200260200101513411156121945761219433836000815181106132a957fe5b60200260200101513403613422565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106133355780518252601f199092019160209182019101613316565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613397576040519150601f19603f3d011682016040523d82523d6000602084013e61339c565b606091505b50915091508180156133ca5750805115806133ca57508080602001905160208110156133c757600080fd5b50515b61341b576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b6020831061346e5780518252601f19909201916020918201910161344f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146134d0576040519150601f19603f3d011682016040523d82523d6000602084013e6134d5565b606091505b50509050806135155760405162461bcd60e51b8152600401808060200182810382526023815260200180614ab26023913960400191505060405180910390fd5b505050565b6060600282511015613573576040805162461bcd60e51b815260206004820152601d60248201527f4c696e6b737761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561358b57600080fd5b506040519080825280602002602001820160405280156135b5578160200160208202803683370190505b50905082816000815181106135c657fe5b60200260200101818152505060005b600183510381101561379157600080613618878685815181106135f457fe5b602002602001015187866001018151811061360b57fe5b602002602001015161476b565b9150915061376d84848151811061362b57fe5b602002602001015183838a6001600160a01b031663e6a439058a898151811061365057fe5b60200260200101518b8a6001018151811061366757fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b1580156136ce57600080fd5b505afa1580156136e2573d6000803e3d6000fd5b505050506040513d60208110156136f857600080fd5b505160408051632a32402760e01b815290516001600160a01b0390921691632a32402791600480820192602092909190829003018186803b15801561373c57600080fd5b505afa158015613750573d6000803e3d6000fd5b505050506040513d602081101561376657600080fd5b5051613e2e565b84846001018151811061377c57fe5b602090810291909101015250506001016135d5565b509392505050565b6040805163e6a4390560e01b81526001600160a01b0384811660048301528381166024830152915160009286169163e6a43905916044808301926020929190829003018186803b1580156137ec57600080fd5b505afa158015613800573d6000803e3d6000fd5b505050506040513d602081101561381657600080fd5b5051949350505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106138a55780518252601f199092019160209182019101613886565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613907576040519150601f19603f3d011682016040523d82523d6000602084013e61390c565b606091505b509150915081801561393a57508051158061393a575080806020019051602081101561393757600080fd5b50515b6139755760405162461bcd60e51b8152600401808060200182810382526024815260200180614b246024913960400191505060405180910390fd5b505050505050565b60005b6001835103811015613bbd5760008084838151811061399b57fe5b60200260200101518584600101815181106139b257fe5b60200260200101519150915060006139ca838361446e565b50905060008785600101815181106139de57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b031614613a0c57826000613a10565b6000835b91509150600060028a51038810613a275788613a68565b613a687f0000000000000000000000000000000000000000000000000000000000000000878c8b60020181518110613a5b57fe5b6020026020010151613799565b9050613a957f00000000000000000000000000000000000000000000000000000000000000008888613799565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613ad2576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613b43578181015183820152602001613b2b565b50505050905090810190601f168015613b705780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613b9257600080fd5b505af1158015613ba6573d6000803e3d6000fd5b505060019099019850613980975050505050505050565b50505050565b6060600282511015613c1c576040805162461bcd60e51b815260206004820152601d60248201527f4c696e6b737761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613c3457600080fd5b50604051908082528060200260200182016040528015613c5e578160200160208202803683370190505b5090508281600183510381518110613c7257fe5b60209081029190910101528151600019015b801561379157600080613cb487866001860381518110613ca057fe5b602002602001015187868151811061360b57fe5b91509150613e09848481518110613cc757fe5b602002602001015183838a6001600160a01b031663e6a439058a60018a0381518110613cef57fe5b60200260200101518b8a81518110613d0357fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b158015613d6a57600080fd5b505afa158015613d7e573d6000803e3d6000fd5b505050506040513d6020811015613d9457600080fd5b505160408051632a32402760e01b815290516001600160a01b0390921691632a32402791600480820192602092909190829003018186803b158015613dd857600080fd5b505afa158015613dec573d6000803e3d6000fd5b505050506040513d6020811015613e0257600080fd5b5051613f31565b846001850381518110613e1857fe5b6020908102919091010152505060001901613c84565b6000808511613e6e5760405162461bcd60e51b815260040180806020018281038252602a815260200180614963602a913960400191505060405180910390fd5b600084118015613e7e5750600083115b613eb95760405162461bcd60e51b8152600401808060200182810382526027815260200180614a026027913960400191505060405180910390fd5b6000613ede613ed1620f42408563ffffffff61437216565b879063ffffffff6148b016565b90506000613ef2828663ffffffff6148b016565b90506000613f1983613f0d89620f424063ffffffff6148b016565b9063ffffffff61491316565b9050808281613f2457fe5b0498975050505050505050565b6000808511613f715760405162461bcd60e51b815260040180806020018281038252602b815260200180614ad5602b913960400191505060405180910390fd5b600084118015613f815750600083115b613fbc5760405162461bcd60e51b8152600401808060200182810382526027815260200180614a026027913960400191505060405180910390fd5b6000613fe1620f4240613fd5878963ffffffff6148b016565b9063ffffffff6148b016565b9050600061400b613ffb620f42408663ffffffff61437216565b613fd5878a63ffffffff61437216565b9050614028600182848161401b57fe5b049063ffffffff61491316565b979650505050505050565b60005b60018351038110156135155760008084838151811061405157fe5b602002602001015185846001018151811061406857fe5b6020026020010151915091506000614080838361446e565b50905060006140b07f00000000000000000000000000000000000000000000000000000000000000008585613799565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156140f157600080fd5b505afa158015614105573d6000803e3d6000fd5b505050506040513d606081101561411b57600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614614151578284614154565b83835b915091506141b2828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611b4857600080fd5b95506141f38683838a6001600160a01b0316632a3240276040518163ffffffff1660e01b815260040160206040518083038186803b15801561373c57600080fd5b945050505050600080856001600160a01b0316886001600160a01b03161461421d57826000614221565b6000835b91509150600060028c51038a10614238578a61426c565b61426c7f0000000000000000000000000000000000000000000000000000000000000000898e8d60020181518110613a5b57fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b838110156142f65781810151838201526020016142de565b50505050905090810190601f1680156143235780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561434557600080fd5b505af1158015614359573d6000803e3d6000fd5b50506001909b019a506140369950505050505050505050565b80820382811115611428576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b60008084116144025760405162461bcd60e51b8152600401808060200182810382526024815260200180614a8e6024913960400191505060405180910390fd5b6000831180156144125750600082115b61444d5760405162461bcd60e51b8152600401808060200182810382526027815260200180614a026027913960400191505060405180910390fd5b8261445e858463ffffffff6148b016565b8161446557fe5b04949350505050565b600080826001600160a01b0316846001600160a01b031614156144c25760405162461bcd60e51b8152600401808060200182810382526024815260200180614b006024913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b0316106144e25782846144e5565b83835b90925090506001600160a01b038216614545576040805162461bcd60e51b815260206004820152601d60248201527f4c696e6b737761704c6962726172793a205a45524f5f41444452455353000000604482015290519081900360640190fd5b9250929050565b6040805163e6a4390560e01b81526001600160a01b03888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b1580156145c657600080fd5b505afa1580156145da573d6000803e3d6000fd5b505050506040513d60208110156145f057600080fd5b50516001600160a01b0316141561464e576040805162461bcd60e51b815260206004820181905260248201527f4c696e6b73776170526f757465723a20504149525f4e4f545f43524541544544604482015290519081900360640190fd5b60008061467c7f00000000000000000000000000000000000000000000000000000000000000008b8b61476b565b9150915081600014801561468e575080155b1561469e5787935086925061475e565b60006146ab8984846143c2565b90508781116146fe57858110156146f35760405162461bcd60e51b81526004018080602001828103825260258152602001806149b76025913960400191505060405180910390fd5b88945092508261475c565b600061470b8984866143c2565b90508981111561471757fe5b878110156147565760405162461bcd60e51b8152600401808060200182810382526025815260200180614a496025913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b600080600061477a858561446e565b506040805163e6a4390560e01b81526001600160a01b0388811660048301528781166024830152915192935060009283928a169163e6a43905916044808301926020929190829003018186803b1580156147d357600080fd5b505afa1580156147e7573d6000803e3d6000fd5b505050506040513d60208110156147fd57600080fd5b505160408051630240bc6b60e21b815290516001600160a01b0390921691630902f1ac91600480820192606092909190829003018186803b15801561484157600080fd5b505afa158015614855573d6000803e3d6000fd5b505050506040513d606081101561486b57600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b038781169084161461489e5780826148a1565b81815b90999098509650505050505050565b60008115806148cb575050808202828282816148c857fe5b04145b611428576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611428576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fdfe4c696e6b737761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e544c696e6b73776170526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e544c696e6b73776170526f757465723a20494e53554646494349454e545f425f414d4f554e544c696e6b73776170526f757465723a204558434553534956455f494e5055545f414d4f554e544c696e6b737761704c6962726172793a20494e53554646494349454e545f4c49515549444954594c696e6b73776170526f757465723a20455850495245440000000000000000004c696e6b73776170526f757465723a20494e53554646494349454e545f415f414d4f554e544c696e6b73776170526f757465723a20494e56414c49445f50415448000000004c696e6b737761704c6962726172793a20494e53554646494349454e545f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45444c696e6b737761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e544c696e6b737761704c6962726172793a204944454e544943414c5f4144445245535345535472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a2646970667358221220780aaf565b01feac9e5eb78e0dbf2bfb48bbdad122bbc1470f8c3a33667600c864736f6c63430006060033000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2

Deployed Bytecode

0x6080604052600436106101695760003560e01c80637ff36ab5116100d1578063baa2abde1161008a578063ded9382a11610064578063ded9382a14610b48578063e8e3370014610bbb578063f305d71914610c3b578063fb3bdb4114610c81576101a2565b8063baa2abde14610a21578063c45a015514610a7e578063d06ca61f14610a93576101a2565b80637ff36ab5146107e55780638803dbee14610869578063ad5c4648146108ff578063ad615dec14610914578063af2979eb1461094a578063b6f9de951461099d576101a2565b80634a25d94a116101235780634a25d94a1461052657806352707d8c146105bc578063571fd0121461060a5780635b0d5984146106465780635c11d795146106b9578063791ac9471461074f576101a2565b80629d2793146101a757806302751cec1461020b57806318cbafe5146102775780631f00ca741461035d5780632195995c1461041257806338ed173914610490576101a2565b366101a257336001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216146101a057fe5b005b600080fd5b6101ef600480360360c08110156101bd57600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359160808201359160a0013516610d05565b604080516001600160a01b039092168252519081900360200190f35b34801561021757600080fd5b5061025e600480360360c081101561022e57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610fb1565b6040805192835260208301919091528051918290030190f35b34801561028357600080fd5b5061030d600480360360a081101561029a57600080fd5b813591602081013591810190606081016040820135600160201b8111156102c057600080fd5b8201836020820111156102d257600080fd5b803590602001918460208302840111600160201b831117156102f357600080fd5b91935091506001600160a01b0381351690602001356110cb565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610349578181015183820152602001610331565b505050509050019250505060405180910390f35b34801561036957600080fd5b5061030d6004803603604081101561038057600080fd5b81359190810190604081016020820135600160201b8111156103a157600080fd5b8201836020820111156103b357600080fd5b803590602001918460208302840111600160201b831117156103d457600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506113f8945050505050565b34801561041e57600080fd5b5061025e600480360361016081101561043657600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561142e565b34801561049c57600080fd5b5061030d600480360360a08110156104b357600080fd5b813591602081013591810190606081016040820135600160201b8111156104d957600080fd5b8201836020820111156104eb57600080fd5b803590602001918460208302840111600160201b8311171561050c57600080fd5b91935091506001600160a01b038135169060200135611528565b34801561053257600080fd5b5061030d600480360360a081101561054957600080fd5b813591602081013591810190606081016040820135600160201b81111561056f57600080fd5b82018360208201111561058157600080fd5b803590602001918460208302840111600160201b831117156105a257600080fd5b91935091506001600160a01b038135169060200135611673565b3480156105c857600080fd5b506105f8600480360360808110156105df57600080fd5b50803590602081013590604081013590606001356117ff565b60408051918252519081900360200190f35b34801561061657600080fd5b506105f86004803603608081101561062d57600080fd5b5080359060208101359060408101359060600135611816565b34801561065257600080fd5b506105f8600480360361014081101561066a57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135611824565b3480156106c557600080fd5b506101a0600480360360a08110156106dc57600080fd5b813591602081013591810190606081016040820135600160201b81111561070257600080fd5b82018360208201111561071457600080fd5b803590602001918460208302840111600160201b8311171561073557600080fd5b91935091506001600160a01b038135169060200135611932565b34801561075b57600080fd5b506101a0600480360360a081101561077257600080fd5b813591602081013591810190606081016040820135600160201b81111561079857600080fd5b8201836020820111156107aa57600080fd5b803590602001918460208302840111600160201b831117156107cb57600080fd5b91935091506001600160a01b038135169060200135611bc7565b61030d600480360360808110156107fb57600080fd5b81359190810190604081016020820135600160201b81111561081c57600080fd5b82018360208201111561082e57600080fd5b803590602001918460208302840111600160201b8311171561084f57600080fd5b91935091506001600160a01b038135169060200135611e4b565b34801561087557600080fd5b5061030d600480360360a081101561088c57600080fd5b813591602081013591810190606081016040820135600160201b8111156108b257600080fd5b8201836020820111156108c457600080fd5b803590602001918460208302840111600160201b831117156108e557600080fd5b91935091506001600160a01b03813516906020013561219e565b34801561090b57600080fd5b506101ef612297565b34801561092057600080fd5b506105f86004803603606081101561093757600080fd5b50803590602081013590604001356122bb565b34801561095657600080fd5b506105f8600480360360c081101561096d57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a001356122d0565b6101a0600480360360808110156109b357600080fd5b81359190810190604081016020820135600160201b8111156109d457600080fd5b8201836020820111156109e657600080fd5b803590602001918460208302840111600160201b83111715610a0757600080fd5b91935091506001600160a01b038135169060200135612420565b348015610a2d57600080fd5b5061025e600480360360e0811015610a4457600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c001356127ac565b348015610a8a57600080fd5b506101ef6129f0565b348015610a9f57600080fd5b5061030d60048036036040811015610ab657600080fd5b81359190810190604081016020820135600160201b811115610ad757600080fd5b820183602082011115610ae957600080fd5b803590602001918460208302840111600160201b83111715610b0a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612a14945050505050565b348015610b5457600080fd5b5061025e6004803603610140811015610b6c57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135612a41565b348015610bc757600080fd5b50610c1d6004803603610100811015610bdf57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135612b55565b60408051938452602084019290925282820152519081900360600190f35b610c1d600480360360c0811015610c5157600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135612c91565b61030d60048036036080811015610c9757600080fd5b81359190810190604081016020820135600160201b811115610cb857600080fd5b820183602082011115610cca57600080fd5b803590602001918460208302840111600160201b83111715610ceb57600080fd5b91935091506001600160a01b038135169060200135612f36565b60007f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610d6257600080fd5b505af1158015610d76573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663095ea7b37f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b346040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610e1b57600080fd5b505af1158015610e2f573d6000803e3d6000fd5b505050506040513d6020811015610e4557600080fd5b505060408051631d701adb60e31b81526001600160a01b038981166004830152602482018990528781166044830152606482018790526084820186905284811660a483015291517f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b9092169163eb80d6d89160c4808201926020929091908290030181600087803b158015610ed957600080fd5b505af1158015610eed573d6000803e3d6000fd5b505050506040513d6020811015610f0357600080fd5b5051604080516370a0823160e01b81523060048201529051919250610fa7917f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29133916001600160a01b038416916370a08231916024808301926020929190829003018186803b158015610f7657600080fd5b505afa158015610f8a573d6000803e3d6000fd5b505050506040513d6020811015610fa057600080fd5b50516132b8565b9695505050505050565b6000808242811015610ff8576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b611027897f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28a8a8a308a6127ac565b90935091506110378986856132b8565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561109d57600080fd5b505af11580156110b1573d6000803e3d6000fd5b505050506110bf8583613422565b50965096945050505050565b60608142811015611111576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2168686600019810181811061114b57fe5b905060200201356001600160a01b03166001600160a01b0316146111a4576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a6e833981519152604482015290519081900360640190fd5b6112027f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b8988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061351a92505050565b9150868260018451038151811061121557fe5b6020026020010151101561125a5760405162461bcd60e51b815260040180806020018281038252602a81526020018061498d602a913960400191505060405180910390fd5b6112f88686600081811061126a57fe5b905060200201356001600160a01b0316336112de7f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b8a8a60008181106112ac57fe5b905060200201356001600160a01b03168b8b60018181106112c957fe5b905060200201356001600160a01b0316613799565b856000815181106112eb57fe5b6020026020010151613820565b6113378287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061397d915050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d8360018551038151811061137657fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156113b457600080fd5b505af11580156113c8573d6000803e3d6000fd5b505050506113ed84836001855103815181106113e057fe5b6020026020010151613422565b509695505050505050565b60606114257f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b8484613bc3565b90505b92915050565b600080600061145e7f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b8f8f613799565b905060008761146d578c611471565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156114e757600080fd5b505af11580156114fb573d6000803e3d6000fd5b5050505061150e8f8f8f8f8f8f8f6127ac565b809450819550505050509b509b9950505050505050505050565b6060814281101561156e576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b6115cc7f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b8988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061351a92505050565b915086826001845103815181106115df57fe5b602002602001015110156116245760405162461bcd60e51b815260040180806020018281038252602a81526020018061498d602a913960400191505060405180910390fd5b6116348686600081811061126a57fe5b6113ed8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061397d915050565b606081428110156116b9576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216868660001981018181106116f357fe5b905060200201356001600160a01b03166001600160a01b03161461174c576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a6e833981519152604482015290519081900360640190fd5b6117aa7f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b89888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613bc392505050565b915086826000815181106117ba57fe5b6020026020010151111561125a5760405162461bcd60e51b81526004018080602001828103825260268152602001806149dc6026913960400191505060405180910390fd5b600061180d85858585613e2e565b95945050505050565b600061180d85858585613f31565b6000806118727f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b8d7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2613799565b9050600086611881578b611885565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c4810187905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b1580156118fb57600080fd5b505af115801561190f573d6000803e3d6000fd5b505050506119218d8d8d8d8d8d6122d0565b9d9c50505050505050505050505050565b8042811015611976576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b6119eb8585600081811061198657fe5b905060200201356001600160a01b0316336119e57f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b898960008181106119c857fe5b905060200201356001600160a01b03168a8a60018181106112c957fe5b8a613820565b6000858560001981018181106119fd57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611a6257600080fd5b505afa158015611a76573d6000803e3d6000fd5b505050506040513d6020811015611a8c57600080fd5b50516040805160208881028281018201909352888252929350611ace929091899189918291850190849080828437600092019190915250889250614033915050565b86611b808288886000198101818110611ae357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611b4857600080fd5b505afa158015611b5c573d6000803e3d6000fd5b505050506040513d6020811015611b7257600080fd5b50519063ffffffff61437216565b1015611bbd5760405162461bcd60e51b815260040180806020018281038252602a81526020018061498d602a913960400191505060405180910390fd5b5050505050505050565b8042811015611c0b576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21685856000198101818110611c4557fe5b905060200201356001600160a01b03166001600160a01b031614611c9e576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a6e833981519152604482015290519081900360640190fd5b611cae8585600081811061198657fe5b611cec858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614033915050565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216916370a0823191602480820192602092909190829003018186803b158015611d5657600080fd5b505afa158015611d6a573d6000803e3d6000fd5b505050506040513d6020811015611d8057600080fd5b5051905086811015611dc35760405162461bcd60e51b815260040180806020018281038252602a81526020018061498d602a913960400191505060405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611e2957600080fd5b505af1158015611e3d573d6000803e3d6000fd5b50505050611bbd8482613422565b60608142811015611e91576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031686866000818110611ec857fe5b905060200201356001600160a01b03166001600160a01b031614611f21576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a6e833981519152604482015290519081900360640190fd5b611f7f7f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b3488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061351a92505050565b91508682600184510381518110611f9257fe5b60200260200101511015611fd75760405162461bcd60e51b815260040180806020018281038252602a81526020018061498d602a913960400191505060405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db08360008151811061201357fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561204657600080fd5b505af115801561205a573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb6120bf7f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b898960008181106119c857fe5b846000815181106120cc57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561212357600080fd5b505af1158015612137573d6000803e3d6000fd5b505050506040513d602081101561214d57600080fd5b505161215557fe5b6121948287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061397d915050565b5095945050505050565b606081428110156121e4576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b6122427f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b89888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613bc392505050565b9150868260008151811061225257fe5b602002602001015111156116245760405162461bcd60e51b81526004018080602001828103825260268152602001806149dc6026913960400191505060405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b60006122c88484846143c2565b949350505050565b60008142811015612316576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b612345887f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc289898930896127ac565b604080516370a0823160e01b8152306004820152905191945061239892508a9187916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015610f7657600080fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156123fe57600080fd5b505af1158015612412573d6000803e3d6000fd5b505050506113ed8483613422565b8042811015612464576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03168585600081811061249b57fe5b905060200201356001600160a01b03166001600160a01b0316146124f4576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a6e833981519152604482015290519081900360640190fd5b60003490507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561255457600080fd5b505af1158015612568573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb6125cd7f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b898960008181106119c857fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561261d57600080fd5b505af1158015612631573d6000803e3d6000fd5b505050506040513d602081101561264757600080fd5b505161264f57fe5b60008686600019810181811061266157fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156126c657600080fd5b505afa1580156126da573d6000803e3d6000fd5b505050506040513d60208110156126f057600080fd5b505160408051602089810282810182019093528982529293506127329290918a918a918291850190849080828437600092019190915250899250614033915050565b87611b80828989600019810181811061274757fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611b4857600080fd5b60008082428110156127f3576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b60006128207f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b8c8c613799565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b15801561287b57600080fd5b505af115801561288f573d6000803e3d6000fd5b505050506040513d60208110156128a557600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b1580156128f257600080fd5b505af1158015612906573d6000803e3d6000fd5b505050506040513d604081101561291c57600080fd5b508051602090910151909250905060006129368e8e61446e565b509050806001600160a01b03168e6001600160a01b03161461295957818361295c565b82825b90975095508a8710156129a05760405162461bcd60e51b8152600401808060200182810382526025815260200180614a496025913960400191505060405180910390fd5b898610156129df5760405162461bcd60e51b81526004018080602001828103825260258152602001806149b76025913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b81565b60606114257f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b848461351a565b6000806000612a917f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b8e7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2613799565b9050600087612aa0578c612aa4565b6000195b6040805163d505accf60e01b815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c4810188905290519192506001600160a01b0384169163d505accf9160e48082019260009290919082900301818387803b158015612b1a57600080fd5b505af1158015612b2e573d6000803e3d6000fd5b50505050612b408e8e8e8e8e8e610fb1565b909f909e509c50505050505050505050505050565b60008060008342811015612b9e576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b612bac8c8c8c8c8c8c61454c565b90945092506000612bde7f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b8e8e613799565b9050612bec8d338388613820565b612bf88c338387613820565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612c5057600080fd5b505af1158015612c64573d6000803e3d6000fd5b505050506040513d6020811015612c7a57600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015612cda576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b612d088a7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28b348c8c61454c565b90945092506000612d5a7f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b8c7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2613799565b9050612d688b338388613820565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612dc357600080fd5b505af1158015612dd7573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612e5c57600080fd5b505af1158015612e70573d6000803e3d6000fd5b505050506040513d6020811015612e8657600080fd5b5051612e8e57fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015612ee657600080fd5b505af1158015612efa573d6000803e3d6000fd5b505050506040513d6020811015612f1057600080fd5b5051925034841015612f2857612f2833853403613422565b505096509650969350505050565b60608142811015612f7c576040805162461bcd60e51b81526020600482015260176024820152600080516020614a29833981519152604482015290519081900360640190fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031686866000818110612fb357fe5b905060200201356001600160a01b03166001600160a01b03161461300c576040805162461bcd60e51b815260206004820152601c6024820152600080516020614a6e833981519152604482015290519081900360640190fd5b61306a7f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b88888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613bc392505050565b9150348260008151811061307a57fe5b602002602001015111156130bf5760405162461bcd60e51b81526004018080602001828103825260268152602001806149dc6026913960400191505060405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0836000815181106130fb57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561312e57600080fd5b505af1158015613142573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb6131a77f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b898960008181106119c857fe5b846000815181106131b457fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561320b57600080fd5b505af115801561321f573d6000803e3d6000fd5b505050506040513d602081101561323557600080fd5b505161323d57fe5b61327c8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061397d915050565b8160008151811061328957fe5b60200260200101513411156121945761219433836000815181106132a957fe5b60200260200101513403613422565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106133355780518252601f199092019160209182019101613316565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613397576040519150601f19603f3d011682016040523d82523d6000602084013e61339c565b606091505b50915091508180156133ca5750805115806133ca57508080602001905160208110156133c757600080fd5b50515b61341b576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b6020831061346e5780518252601f19909201916020918201910161344f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146134d0576040519150601f19603f3d011682016040523d82523d6000602084013e6134d5565b606091505b50509050806135155760405162461bcd60e51b8152600401808060200182810382526023815260200180614ab26023913960400191505060405180910390fd5b505050565b6060600282511015613573576040805162461bcd60e51b815260206004820152601d60248201527f4c696e6b737761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561358b57600080fd5b506040519080825280602002602001820160405280156135b5578160200160208202803683370190505b50905082816000815181106135c657fe5b60200260200101818152505060005b600183510381101561379157600080613618878685815181106135f457fe5b602002602001015187866001018151811061360b57fe5b602002602001015161476b565b9150915061376d84848151811061362b57fe5b602002602001015183838a6001600160a01b031663e6a439058a898151811061365057fe5b60200260200101518b8a6001018151811061366757fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b1580156136ce57600080fd5b505afa1580156136e2573d6000803e3d6000fd5b505050506040513d60208110156136f857600080fd5b505160408051632a32402760e01b815290516001600160a01b0390921691632a32402791600480820192602092909190829003018186803b15801561373c57600080fd5b505afa158015613750573d6000803e3d6000fd5b505050506040513d602081101561376657600080fd5b5051613e2e565b84846001018151811061377c57fe5b602090810291909101015250506001016135d5565b509392505050565b6040805163e6a4390560e01b81526001600160a01b0384811660048301528381166024830152915160009286169163e6a43905916044808301926020929190829003018186803b1580156137ec57600080fd5b505afa158015613800573d6000803e3d6000fd5b505050506040513d602081101561381657600080fd5b5051949350505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106138a55780518252601f199092019160209182019101613886565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613907576040519150601f19603f3d011682016040523d82523d6000602084013e61390c565b606091505b509150915081801561393a57508051158061393a575080806020019051602081101561393757600080fd5b50515b6139755760405162461bcd60e51b8152600401808060200182810382526024815260200180614b246024913960400191505060405180910390fd5b505050505050565b60005b6001835103811015613bbd5760008084838151811061399b57fe5b60200260200101518584600101815181106139b257fe5b60200260200101519150915060006139ca838361446e565b50905060008785600101815181106139de57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b031614613a0c57826000613a10565b6000835b91509150600060028a51038810613a275788613a68565b613a687f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b878c8b60020181518110613a5b57fe5b6020026020010151613799565b9050613a957f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b8888613799565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613ad2576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b03166001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613b43578181015183820152602001613b2b565b50505050905090810190601f168015613b705780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613b9257600080fd5b505af1158015613ba6573d6000803e3d6000fd5b505060019099019850613980975050505050505050565b50505050565b6060600282511015613c1c576040805162461bcd60e51b815260206004820152601d60248201527f4c696e6b737761704c6962726172793a20494e56414c49445f50415448000000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613c3457600080fd5b50604051908082528060200260200182016040528015613c5e578160200160208202803683370190505b5090508281600183510381518110613c7257fe5b60209081029190910101528151600019015b801561379157600080613cb487866001860381518110613ca057fe5b602002602001015187868151811061360b57fe5b91509150613e09848481518110613cc757fe5b602002602001015183838a6001600160a01b031663e6a439058a60018a0381518110613cef57fe5b60200260200101518b8a81518110613d0357fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b158015613d6a57600080fd5b505afa158015613d7e573d6000803e3d6000fd5b505050506040513d6020811015613d9457600080fd5b505160408051632a32402760e01b815290516001600160a01b0390921691632a32402791600480820192602092909190829003018186803b158015613dd857600080fd5b505afa158015613dec573d6000803e3d6000fd5b505050506040513d6020811015613e0257600080fd5b5051613f31565b846001850381518110613e1857fe5b6020908102919091010152505060001901613c84565b6000808511613e6e5760405162461bcd60e51b815260040180806020018281038252602a815260200180614963602a913960400191505060405180910390fd5b600084118015613e7e5750600083115b613eb95760405162461bcd60e51b8152600401808060200182810382526027815260200180614a026027913960400191505060405180910390fd5b6000613ede613ed1620f42408563ffffffff61437216565b879063ffffffff6148b016565b90506000613ef2828663ffffffff6148b016565b90506000613f1983613f0d89620f424063ffffffff6148b016565b9063ffffffff61491316565b9050808281613f2457fe5b0498975050505050505050565b6000808511613f715760405162461bcd60e51b815260040180806020018281038252602b815260200180614ad5602b913960400191505060405180910390fd5b600084118015613f815750600083115b613fbc5760405162461bcd60e51b8152600401808060200182810382526027815260200180614a026027913960400191505060405180910390fd5b6000613fe1620f4240613fd5878963ffffffff6148b016565b9063ffffffff6148b016565b9050600061400b613ffb620f42408663ffffffff61437216565b613fd5878a63ffffffff61437216565b9050614028600182848161401b57fe5b049063ffffffff61491316565b979650505050505050565b60005b60018351038110156135155760008084838151811061405157fe5b602002602001015185846001018151811061406857fe5b6020026020010151915091506000614080838361446e565b50905060006140b07f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b8585613799565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156140f157600080fd5b505afa158015614105573d6000803e3d6000fd5b505050506040513d606081101561411b57600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614614151578284614154565b83835b915091506141b2828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015611b4857600080fd5b95506141f38683838a6001600160a01b0316632a3240276040518163ffffffff1660e01b815260040160206040518083038186803b15801561373c57600080fd5b945050505050600080856001600160a01b0316886001600160a01b03161461421d57826000614221565b6000835b91509150600060028c51038a10614238578a61426c565b61426c7f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b898e8d60020181518110613a5b57fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b838110156142f65781810151838201526020016142de565b50505050905090810190601f1680156143235780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561434557600080fd5b505af1158015614359573d6000803e3d6000fd5b50506001909b019a506140369950505050505050505050565b80820382811115611428576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b60008084116144025760405162461bcd60e51b8152600401808060200182810382526024815260200180614a8e6024913960400191505060405180910390fd5b6000831180156144125750600082115b61444d5760405162461bcd60e51b8152600401808060200182810382526027815260200180614a026027913960400191505060405180910390fd5b8261445e858463ffffffff6148b016565b8161446557fe5b04949350505050565b600080826001600160a01b0316846001600160a01b031614156144c25760405162461bcd60e51b8152600401808060200182810382526024815260200180614b006024913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b0316106144e25782846144e5565b83835b90925090506001600160a01b038216614545576040805162461bcd60e51b815260206004820152601d60248201527f4c696e6b737761704c6962726172793a205a45524f5f41444452455353000000604482015290519081900360640190fd5b9250929050565b6040805163e6a4390560e01b81526001600160a01b03888116600483015287811660248301529151600092839283927f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b9092169163e6a4390591604480820192602092909190829003018186803b1580156145c657600080fd5b505afa1580156145da573d6000803e3d6000fd5b505050506040513d60208110156145f057600080fd5b50516001600160a01b0316141561464e576040805162461bcd60e51b815260206004820181905260248201527f4c696e6b73776170526f757465723a20504149525f4e4f545f43524541544544604482015290519081900360640190fd5b60008061467c7f000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b8b8b61476b565b9150915081600014801561468e575080155b1561469e5787935086925061475e565b60006146ab8984846143c2565b90508781116146fe57858110156146f35760405162461bcd60e51b81526004018080602001828103825260258152602001806149b76025913960400191505060405180910390fd5b88945092508261475c565b600061470b8984866143c2565b90508981111561471757fe5b878110156147565760405162461bcd60e51b8152600401808060200182810382526025815260200180614a496025913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b600080600061477a858561446e565b506040805163e6a4390560e01b81526001600160a01b0388811660048301528781166024830152915192935060009283928a169163e6a43905916044808301926020929190829003018186803b1580156147d357600080fd5b505afa1580156147e7573d6000803e3d6000fd5b505050506040513d60208110156147fd57600080fd5b505160408051630240bc6b60e21b815290516001600160a01b0390921691630902f1ac91600480820192606092909190829003018186803b15801561484157600080fd5b505afa158015614855573d6000803e3d6000fd5b505050506040513d606081101561486b57600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b038781169084161461489e5780826148a1565b81815b90999098509650505050505050565b60008115806148cb575050808202828282816148c857fe5b04145b611428576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015611428576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fdfe4c696e6b737761704c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e544c696e6b73776170526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e544c696e6b73776170526f757465723a20494e53554646494349454e545f425f414d4f554e544c696e6b73776170526f757465723a204558434553534956455f494e5055545f414d4f554e544c696e6b737761704c6962726172793a20494e53554646494349454e545f4c49515549444954594c696e6b73776170526f757465723a20455850495245440000000000000000004c696e6b73776170526f757465723a20494e53554646494349454e545f415f414d4f554e544c696e6b73776170526f757465723a20494e56414c49445f50415448000000004c696e6b737761704c6962726172793a20494e53554646494349454e545f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45444c696e6b737761704c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e544c696e6b737761704c6962726172793a204944454e544943414c5f4144445245535345535472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a2646970667358221220780aaf565b01feac9e5eb78e0dbf2bfb48bbdad122bbc1470f8c3a33667600c864736f6c63430006060033

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

000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2

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

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000696708db871b77355d6c2be7290b27cf0bb9b24b
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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