ETH Price: $2,414.48 (-1.38%)

Contract

0xc48F5cBb71a642Fa71535012EeCfeaD99e8C37cc
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Remove Liquidity...181128442023-09-11 11:34:11369 days ago1694432051IN
0xc48F5cBb...99e8C37cc
0 ETH0.0061260512.26102956
Swap Exact ETH F...179700302023-08-22 11:43:11389 days ago1692704591IN
0xc48F5cBb...99e8C37cc
0.02 ETH0.0025551816.85854271
Swap Exact Token...178820682023-08-10 4:20:23401 days ago1691641223IN
0xc48F5cBb...99e8C37cc
0 ETH0.0020203914.00578231
Swap Exact Token...178645942023-08-07 17:38:47404 days ago1691429927IN
0xc48F5cBb...99e8C37cc
0 ETH0.0050139835.95748691
Swap Exact Token...178645852023-08-07 17:36:59404 days ago1691429819IN
0xc48F5cBb...99e8C37cc
0 ETH0.0056954840.95
Swap Exact Token...178645402023-08-07 17:27:59404 days ago1691429279IN
0xc48F5cBb...99e8C37cc
0 ETH0.0039306528.26590781
Swap Exact Token...178644542023-08-07 17:10:47404 days ago1691428247IN
0xc48F5cBb...99e8C37cc
0 ETH0.0046747636.27169517
Swap Exact Token...178644542023-08-07 17:10:47404 days ago1691428247IN
0xc48F5cBb...99e8C37cc
0 ETH0.0055880238.85
Swap Exact Token...178644522023-08-07 17:10:23404 days ago1691428223IN
0xc48F5cBb...99e8C37cc
0 ETH0.0058385736.84203683
Swap Exact Token...178644502023-08-07 17:09:59404 days ago1691428199IN
0xc48F5cBb...99e8C37cc
0 ETH0.0052180537.4177239
Swap Exact ETH F...178644432023-08-07 17:08:35404 days ago1691428115IN
0xc48F5cBb...99e8C37cc
0.13 ETH0.0056419337.22425035
Swap Exact ETH F...178644412023-08-07 17:08:11404 days ago1691428091IN
0xc48F5cBb...99e8C37cc
0.25 ETH0.0051401836.40669248
Swap Exact Token...178644412023-08-07 17:08:11404 days ago1691428091IN
0xc48F5cBb...99e8C37cc
0 ETH0.0057390539.9
Swap Exact ETH F...178644392023-08-07 17:07:47404 days ago1691428067IN
0xc48F5cBb...99e8C37cc
0.358 ETH0.005645237.24879945
Swap Exact ETH F...178644372023-08-07 17:07:23404 days ago1691428043IN
0xc48F5cBb...99e8C37cc
0.28 ETH0.0060394636.79281745
Swap Exact ETH F...178644362023-08-07 17:07:11404 days ago1691428031IN
0xc48F5cBb...99e8C37cc
0.1 ETH0.0048977836.42718464
Swap Exact ETH F...178644352023-08-07 17:06:59404 days ago1691428019IN
0xc48F5cBb...99e8C37cc
0.12 ETH0.0054774836.1393006
Swap Exact ETH F...178644332023-08-07 17:06:35404 days ago1691427995IN
0xc48F5cBb...99e8C37cc
0.3 ETH0.0061020137.17383446
Swap Exact ETH F...178644312023-08-07 17:06:11404 days ago1691427971IN
0xc48F5cBb...99e8C37cc
0.1 ETH0.0055210236.42653613
Swap Exact ETH F...178644302023-08-07 17:05:59404 days ago1691427959IN
0xc48F5cBb...99e8C37cc
0.01 ETH0.0055874936.86507019
Swap Exact ETH F...178644282023-08-07 17:05:35404 days ago1691427935IN
0xc48F5cBb...99e8C37cc
0.2 ETH0.0074125439.9
Add Liquidity ET...178644252023-08-07 17:04:59404 days ago1691427899IN
0xc48F5cBb...99e8C37cc
0.26563194 ETH0.1205498338.23409217
0x60c06040177464222023-07-22 4:55:47420 days ago1690001747IN
 Create: InedibleXRouterV1
0 ETH0.0632572915.7881789

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
181128442023-09-11 11:34:11369 days ago1694432051
0xc48F5cBb...99e8C37cc
0.24868426 ETH
181128442023-09-11 11:34:11369 days ago1694432051
0xc48F5cBb...99e8C37cc
0.24868426 ETH
179700302023-08-22 11:43:11389 days ago1692704591
0xc48F5cBb...99e8C37cc
0.02 ETH
178820682023-08-10 4:20:23401 days ago1691641223
0xc48F5cBb...99e8C37cc
0.016631 ETH
178820682023-08-10 4:20:23401 days ago1691641223
0xc48F5cBb...99e8C37cc
0.016631 ETH
178645942023-08-07 17:38:47404 days ago1691429927
0xc48F5cBb...99e8C37cc
0.09751799 ETH
178645942023-08-07 17:38:47404 days ago1691429927
0xc48F5cBb...99e8C37cc
0.09751799 ETH
178645852023-08-07 17:36:59404 days ago1691429819
0xc48F5cBb...99e8C37cc
0.17719909 ETH
178645852023-08-07 17:36:59404 days ago1691429819
0xc48F5cBb...99e8C37cc
0.17719909 ETH
178645402023-08-07 17:27:59404 days ago1691429279
0xc48F5cBb...99e8C37cc
0.07172935 ETH
178645402023-08-07 17:27:59404 days ago1691429279
0xc48F5cBb...99e8C37cc
0.07172935 ETH
178644542023-08-07 17:10:47404 days ago1691428247
0xc48F5cBb...99e8C37cc
0.15824608 ETH
178644542023-08-07 17:10:47404 days ago1691428247
0xc48F5cBb...99e8C37cc
0.15824608 ETH
178644542023-08-07 17:10:47404 days ago1691428247
0xc48F5cBb...99e8C37cc
0.25177167 ETH
178644542023-08-07 17:10:47404 days ago1691428247
0xc48F5cBb...99e8C37cc
0.25177167 ETH
178644502023-08-07 17:09:59404 days ago1691428199
0xc48F5cBb...99e8C37cc
0.28348511 ETH
178644502023-08-07 17:09:59404 days ago1691428199
0xc48F5cBb...99e8C37cc
0.28348511 ETH
178644432023-08-07 17:08:35404 days ago1691428115
0xc48F5cBb...99e8C37cc
0.13 ETH
178644412023-08-07 17:08:11404 days ago1691428091
0xc48F5cBb...99e8C37cc
0.25 ETH
178644412023-08-07 17:08:11404 days ago1691428091
0xc48F5cBb...99e8C37cc
0.24537688 ETH
178644412023-08-07 17:08:11404 days ago1691428091
0xc48F5cBb...99e8C37cc
0.24537688 ETH
178644392023-08-07 17:07:47404 days ago1691428067
0xc48F5cBb...99e8C37cc
0.358 ETH
178644372023-08-07 17:07:23404 days ago1691428043
0xc48F5cBb...99e8C37cc
0.28 ETH
178644362023-08-07 17:07:11404 days ago1691428031
0xc48F5cBb...99e8C37cc
0.1 ETH
178644352023-08-07 17:06:59404 days ago1691428019
0xc48F5cBb...99e8C37cc
0.12 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
InedibleXRouterV1

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 12 : InedibleXRouterV1.sol
pragma solidity =0.6.6;
pragma experimental ABIEncoderV2;

import "./interfaces/IInedibleXV1Factory.sol";
import "./interfaces/IInedibleXV1Pair.sol";
import "./v2-periphery/UniswapV2Router02.sol";

contract InedibleXRouterV1 is UniswapV2Router02 {
    struct LaunchParams {
        bool deployNewPool;
        bool launch;
        uint16 launchFeePct;
        uint40 lockDuration;
    }

    constructor(
        address factory,
        address WETH
    ) public UniswapV2Router02(factory, WETH) {}

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        LaunchParams memory launchParams
    ) internal virtual returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        if (
            IInedibleXV1Factory(factory).getPair(tokenA, tokenB) == address(0)
        ) {
            require(launchParams.deployNewPool, "can't deploy a new pool");
            IInedibleXV1Factory(factory).createPair(
                tokenA,
                tokenB,
                launchParams.launch,
                launchParams.launchFeePct,
                launchParams.lockDuration
            );
        } else {
            require(!launchParams.deployNewPool, "pool already exists");
        }
        (uint reserveA, uint reserveB) = UniswapV2Library.getReserves(
            factory,
            tokenA,
            tokenB
        );
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = UniswapV2Library.quote(
                amountADesired,
                reserveA,
                reserveB
            );
            if (amountBOptimal <= amountBDesired) {
                require(
                    amountBOptimal >= amountBMin,
                    "UniswapV2Router: INSUFFICIENT_B_AMOUNT"
                );
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = UniswapV2Library.quote(
                    amountBDesired,
                    reserveB,
                    reserveA
                );
                assert(amountAOptimal <= amountADesired);
                require(
                    amountAOptimal >= amountAMin,
                    "UniswapV2Router: INSUFFICIENT_A_AMOUNT"
                );
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        LaunchParams calldata launchParams
    )
        external
        ensure(deadline)
        returns (uint amountA, uint amountB, uint liquidity)
    {
        (amountA, amountB) = _addLiquidity(
            tokenA,
            tokenB,
            amountADesired,
            amountBDesired,
            amountAMin,
            amountBMin,
            launchParams
        );

        address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
        TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
        TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IUniswapV2Pair(pair).mint(to);
    }

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

File 2 of 12 : TransferHelper.sol
pragma solidity >=0.6.0;

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

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

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

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

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

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

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

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

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

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

File 4 of 12 : IUniswapV2Pair.sol
pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

File 5 of 12 : IERC20.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.5.0;

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

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

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

File 6 of 12 : IInedibleXV1Factory.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.5.0;

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

    event InedibleCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint pairLength,
        bool launch,
        uint lock
    );

    function treasury() external view returns (address);

    function feeTo() external view returns (address);

    function dao() external view returns (address);

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

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

    function allPairsLength() external view returns (uint);

    function createPair(
        address tokenA,
        address tokenB,
        bool launch,
        uint16 launchFeePct,
        uint40 lock
    ) external returns (address pair);

    function setFeeTo(address) external;

    // added by inedible
    function setLaunchFeePct(uint16 _launchFeePct) external;

    function setMinSupplyPct(uint16 _minSupplyPct) external;

    function transferOwnership(address _newDao) external;

    function renounceOwnership() external;

    function acceptOwnership() external;
}

File 7 of 12 : IInedibleXV1Pair.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.5.0;

interface IInedibleXV1Pair {
    struct Balance {
        uint balance0;
        uint balance1;
    }

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

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint);

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

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

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

    function price0CumulativeLast() external view returns (uint);

    function price1CumulativeLast() external view returns (uint);

    function kLast() external view returns (uint);

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

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

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

    function skim(address to) external;

    function sync() external;

    function initialize(
        address _token0,
        address _token1,
        uint16 _minSupplyPct,
        uint16 _launchFeePct,
        bool _launch,
        uint40 _lockDuration
    ) external;
}

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

interface IWETH {
    function deposit() external payable;

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

    function withdraw(uint) external;
}

File 9 of 12 : IUniswapV2Router01.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.6.2;

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 10 of 12 : IUniswapV2Router02.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.6.2;

import "./IUniswapV2Router01.sol";

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);

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

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

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

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

File 11 of 12 : UniswapV2Library.sol
pragma solidity <0.7.0;

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

interface IUniswapFactory {
    function getPair(
        address tokenA,
        address tokenB
    ) external view returns (address pair);
}

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

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

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

library UniswapV2Library {
    using SafeMath for uint;

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

    // calculates the CREATE2 address for a pair without making any external calls
    function pairFor(
        address factory,
        address tokenA,
        address tokenB
    ) internal view returns (address pair) {
        (address token0, address token1) = sortTokens(tokenA, tokenB);
        pair = IUniswapFactory(factory).getPair(token0, token1);
    }

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

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

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

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

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

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

File 12 of 12 : UniswapV2Router02.sol
pragma solidity =0.6.6;

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

import "./interfaces/IUniswapV2Router02.sol";
import "./libraries/UniswapV2Library.sol";
import "../interfaces/IERC20.sol";
import "../interfaces/IWETH.sol";
import "../interfaces/IInedibleXV1Pair.sol";

contract UniswapV2Router02 is IUniswapV2Router02 {
    using SafeMath for uint;

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

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

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

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

    // **** ADD LIQUIDITY ****
    function _addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal virtual returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        if (IUniswapV2Factory(factory).getPair(tokenA, tokenB) == address(0)) {
            IUniswapV2Factory(factory).createPair(tokenA, tokenB);
        }
        (uint reserveA, uint reserveB) = UniswapV2Library.getReserves(
            factory,
            tokenA,
            tokenB
        );
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = UniswapV2Library.quote(
                amountADesired,
                reserveA,
                reserveB
            );
            if (amountBOptimal <= amountBDesired) {
                require(
                    amountBOptimal >= amountBMin,
                    "UniswapV2Router: INSUFFICIENT_B_AMOUNT"
                );
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = UniswapV2Library.quote(
                    amountBDesired,
                    reserveB,
                    reserveA
                );
                assert(amountAOptimal <= amountADesired);
                require(
                    amountAOptimal >= amountAMin,
                    "UniswapV2Router: INSUFFICIENT_A_AMOUNT"
                );
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }

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

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

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

    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    )
        public
        virtual
        override
        ensure(deadline)
        returns (uint amountToken, uint amountETH)
    {
        (amountToken, amountETH) = removeLiquidity(
            token,
            WETH,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        TransferHelper.safeTransfer(token, to, amountToken);
        IWETH(WETH).withdraw(amountETH);
        TransferHelper.safeTransferETH(to, amountETH);
    }

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external virtual override returns (uint amountA, uint amountB) {
        address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
        uint value = approveMax ? uint(-1) : liquidity;
        IUniswapV2Pair(pair).permit(
            msg.sender,
            address(this),
            value,
            deadline,
            v,
            r,
            s
        );
        (amountA, amountB) = removeLiquidity(
            tokenA,
            tokenB,
            liquidity,
            amountAMin,
            amountBMin,
            to,
            deadline
        );
    }

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

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

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

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

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

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

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

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

    function swapExactTokensForETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[path.length - 1] == WETH, "UniswapV2Router: INVALID_PATH");
        amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);
        require(
            amounts[amounts.length - 1] >= amountOutMin,
            "UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT"
        );
        TransferHelper.safeTransferFrom(
            path[0],
            msg.sender,
            UniswapV2Library.pairFor(factory, path[0], path[1]),
            amounts[0]
        );
        _swap(amounts, path, address(this));
        IWETH(WETH).withdraw(amounts[amounts.length - 1]);
        TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
    }

    function swapETHForExactTokens(
        uint amountOut,
        address[] calldata path,
        address to,
        uint deadline
    )
        external
        payable
        virtual
        override
        ensure(deadline)
        returns (uint[] memory amounts)
    {
        require(path[0] == WETH, "UniswapV2Router: INVALID_PATH");
        amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path);
        require(
            amounts[0] <= msg.value,
            "UniswapV2Router: EXCESSIVE_INPUT_AMOUNT"
        );
        IWETH(WETH).deposit{value: amounts[0]}();
        assert(
            IWETH(WETH).transfer(
                UniswapV2Library.pairFor(factory, path[0], path[1]),
                amounts[0]
            )
        );
        _swap(amounts, path, to);
        // refund dust eth, if any
        if (msg.value > amounts[0])
            TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
    }

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

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

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

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

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

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"factory","type":"address"},{"internalType":"address","name":"WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"components":[{"internalType":"bool","name":"deployNewPool","type":"bool"},{"internalType":"bool","name":"launch","type":"bool"},{"internalType":"uint16","name":"launchFeePct","type":"uint16"},{"internalType":"uint40","name":"lockDuration","type":"uint40"}],"internalType":"struct InedibleXRouterV1.LaunchParams","name":"launchParams","type":"tuple"}],"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":"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"},{"components":[{"internalType":"bool","name":"deployNewPool","type":"bool"},{"internalType":"bool","name":"launch","type":"bool"},{"internalType":"uint16","name":"launchFeePct","type":"uint16"},{"internalType":"uint40","name":"lockDuration","type":"uint40"}],"internalType":"struct InedibleXRouterV1.LaunchParams","name":"launchParams","type":"tuple"}],"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":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040523480156200001157600080fd5b50604051620049c7380380620049c7833981016040819052620000349162000053565b6001600160601b0319606092831b8116608052911b1660a052620000aa565b6000806040838503121562000066578182fd5b8251620000738162000091565b6020840151909250620000868162000091565b809150509250929050565b6001600160a01b0381168114620000a757600080fd5b50565b60805160601c60a05160601c6147c26200020560003980610195528061052c528061057c528061063b528061082b5280610a255280610a8a5280610abe5280610b445280610eca5280610ff3528061133c528061140f52806114cd5280611563528061166c52806116f452806118eb52806119435280611a105280611aa45280611b1b5280611b8f5280611ffa52806121fd52806122535280612287528061230d5280612466528061256c52806125f45250806106ab528061076852806108f1528061092a5280610a685280610ca15280610dcc5280610f3a5280610fd1528061110252806115d85280611726528061185a5280611bc15280611dc55280611f7f5280611fa85280611fd85280612101528061223152806124db52806126265280612cdc5280612d1f5280612f065280612fe852806130a052806131cf528061333652806135c7528061367c528061370f52506147c26000f3fe6080604052600436106101855760003560e01c806385f8c259116100d1578063baa2abde1161008a578063ded9382a11610064578063ded9382a14610493578063e8e33700146104b3578063f305d719146104d3578063fb3bdb41146104e6576101be565b8063baa2abde1461043e578063c45a01551461045e578063d06ca61f14610473576101be565b806385f8c259146103895780638803dbee146103a9578063ad5c4648146103c9578063ad615dec146103eb578063af2979eb1461040b578063b6f9de951461042b576101be565b806338ed17391161013e5780635b0d5984116101185780635b0d5984146103165780635c11d79514610336578063791ac947146103565780637ff36ab514610376576101be565b806338ed1739146102b65780633d529f7b146102d65780634a25d94a146102f6576101be565b806302751cec146101c3578063054d50d4146101fa57806318cbafe5146102275780631f00ca74146102545780632195995c1461027457806332e1144514610294576101be565b366101be57336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101bc57fe5b005b600080fd5b3480156101cf57600080fd5b506101e36101de366004613bee565b6104f9565b6040516101f192919061468a565b60405180910390f35b34801561020657600080fd5b5061021a610215366004613fff565b6105f9565b6040516101f19190614681565b34801561023357600080fd5b50610247610242366004613f8e565b61060e565b6040516101f1919061412d565b34801561026057600080fd5b5061024761026f366004613eb4565b6108ea565b34801561028057600080fd5b506101e361028f366004613a3e565b610920565b6102a76102a2366004613ce1565b6109f9565b6040516101f1939291906146e8565b3480156102c257600080fd5b506102476102d1366004613f8e565b610c79565b3480156102e257600080fd5b506102a76102f1366004613b63565b610d82565b34801561030257600080fd5b50610247610311366004613f8e565b610e9d565b34801561032257600080fd5b5061021a610331366004613c4b565b610fc9565b34801561034257600080fd5b506101bc610351366004613f8e565b6110b6565b34801561036257600080fd5b506101bc610371366004613f8e565b611311565b610247610384366004613e4f565b61153e565b34801561039557600080fd5b5061021a6103a4366004613fff565b611825565b3480156103b557600080fd5b506102476103c4366004613f8e565b611832565b3480156103d557600080fd5b506103de6118e9565b6040516101f19190614046565b3480156103f757600080fd5b5061021a610406366004613fff565b61190d565b34801561041757600080fd5b5061021a610426366004613bee565b61191a565b6101bc610439366004613e4f565b611a81565b34801561044a57600080fd5b506101e36104593660046139cd565b611d9a565b34801561046a57600080fd5b506103de611f7d565b34801561047f57600080fd5b5061024761048e366004613eb4565b611fa1565b34801561049f57600080fd5b506101e36104ae366004613c4b565b611fce565b3480156104bf57600080fd5b506102a76104ce366004613ae8565b6120c1565b6102a76104e1366004613bee565b6121d1565b6102476104f4366004613e4f565b612441565b60008082428110156105265760405162461bcd60e51b815260040161051d906141d7565b60405180910390fd5b610555897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a611d9a565b9093509150610565898685612757565b604051632e1a7d4d60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d906105b1908590600401614681565b600060405180830381600087803b1580156105cb57600080fd5b505af11580156105df573d6000803e3d6000fd5b505050506105ed8583612845565b50965096945050505050565b60006106068484846128d7565b949350505050565b606081428110156106315760405162461bcd60e51b815260040161051d906141d7565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061066b57fe5b9050602002016020810190610680919061398e565b6001600160a01b0316146106a65760405162461bcd60e51b815260040161051d90614378565b6107047f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061298992505050565b9150868260018451038151811061071757fe5b6020026020010151101561073d5760405162461bcd60e51b815260040161051d90614570565b6107ea8686600081811061074d57fe5b9050602002016020810190610762919061398e565b336107d07f00000000000000000000000000000000000000000000000000000000000000008a8a600081811061079457fe5b90506020020160208101906107a9919061398e565b8b8b60018181106107b657fe5b90506020020160208101906107cb919061398e565b612aa0565b856000815181106107dd57fe5b6020026020010151612b3c565b61082982878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612c2d915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061086857fe5b60200260200101516040518263ffffffff1660e01b815260040161088c9190614681565b600060405180830381600087803b1580156108a657600080fd5b505af11580156108ba573d6000803e3d6000fd5b505050506108df84836001855103815181106108d257fe5b6020026020010151612845565b509695505050505050565b60606109177f00000000000000000000000000000000000000000000000000000000000000008484612ded565b90505b92915050565b60008060006109507f00000000000000000000000000000000000000000000000000000000000000008f8f612aa0565b905060008761095f578c610963565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf9061099e903390309086908f908e908e908e9060040161405a565b600060405180830381600087803b1580156109b857600080fd5b505af11580156109cc573d6000803e3d6000fd5b505050506109df8f8f8f8f8f8f8f611d9a565b809450819550505050509b509b9950505050505050505050565b60008060008442811015610a1f5760405162461bcd60e51b815260040161051d906141d7565b610a5c8b7f00000000000000000000000000000000000000000000000000000000000000008c348d8d610a57368d90038d018d613d6c565b612ef0565b90945092506000610aae7f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000612aa0565b9050610abc8c338388612b3c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015610b1757600080fd5b505af1158015610b2b573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb9250610b7e915084908890600401614114565b602060405180830381600087803b158015610b9857600080fd5b505af1158015610bac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd09190613d50565b610bd657fe5b6040516335313c2160e11b81526001600160a01b03821690636a62784290610c02908b90600401614046565b602060405180830381600087803b158015610c1c57600080fd5b505af1158015610c30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c549190613e37565b925083341115610c6a57610c6a33853403612845565b50509750975097945050505050565b60608142811015610c9c5760405162461bcd60e51b815260040161051d906141d7565b610cfa7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061298992505050565b91508682600184510381518110610d0d57fe5b60200260200101511015610d335760405162461bcd60e51b815260040161051d90614570565b610d438686600081811061074d57fe5b6108df82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612c2d915050565b60008060008442811015610da85760405162461bcd60e51b815260040161051d906141d7565b610dc08d8d8d8d8d8d610a57368d90038d018d613d6c565b90945092506000610df27f00000000000000000000000000000000000000000000000000000000000000008f8f612aa0565b9050610e008e338388612b3c565b610e0c8d338387612b3c565b6040516335313c2160e11b81526001600160a01b03821690636a62784290610e38908b90600401614046565b602060405180830381600087803b158015610e5257600080fd5b505af1158015610e66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8a9190613e37565b9250505099509950999650505050505050565b60608142811015610ec05760405162461bcd60e51b815260040161051d906141d7565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610efa57fe5b9050602002016020810190610f0f919061398e565b6001600160a01b031614610f355760405162461bcd60e51b815260040161051d90614378565b610f937f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612ded92505050565b91508682600081518110610fa357fe5b6020026020010151111561073d5760405162461bcd60e51b815260040161051d906144a0565b6000806110177f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000612aa0565b9050600086611026578b61102a565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611065903390309086908e908d908d908d9060040161405a565b600060405180830381600087803b15801561107f57600080fd5b505af1158015611093573d6000803e3d6000fd5b505050506110a58d8d8d8d8d8d61191a565b9d9c50505050505050505050505050565b80428110156110d75760405162461bcd60e51b815260040161051d906141d7565b611156858560008181106110e757fe5b90506020020160208101906110fc919061398e565b336111507f00000000000000000000000000000000000000000000000000000000000000008989600081811061112e57fe5b9050602002016020810190611143919061398e565b8a8a60018181106107b657fe5b8a612b3c565b60008585600019810181811061116857fe5b905060200201602081019061117d919061398e565b6001600160a01b03166370a08231856040518263ffffffff1660e01b81526004016111a89190614046565b60206040518083038186803b1580156111c057600080fd5b505afa1580156111d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f89190613e37565b9050611238868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613178915050565b866112e9828888600019810181811061124d57fe5b9050602002016020810190611262919061398e565b6001600160a01b03166370a08231886040518263ffffffff1660e01b815260040161128d9190614046565b60206040518083038186803b1580156112a557600080fd5b505afa1580156112b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112dd9190613e37565b9063ffffffff6133ee16565b10156113075760405162461bcd60e51b815260040161051d90614570565b5050505050505050565b80428110156113325760405162461bcd60e51b815260040161051d906141d7565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585600019810181811061136c57fe5b9050602002016020810190611381919061398e565b6001600160a01b0316146113a75760405162461bcd60e51b815260040161051d90614378565b6113b7858560008181106110e757fe5b6113f5858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613178915050565b6040516370a0823160e01b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190611444903090600401614046565b60206040518083038186803b15801561145c57600080fd5b505afa158015611470573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114949190613e37565b9050868110156114b65760405162461bcd60e51b815260040161051d90614570565b604051632e1a7d4d60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d90611502908490600401614681565b600060405180830381600087803b15801561151c57600080fd5b505af1158015611530573d6000803e3d6000fd5b505050506113078482612845565b606081428110156115615760405162461bcd60e51b815260040161051d906141d7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061159857fe5b90506020020160208101906115ad919061398e565b6001600160a01b0316146115d35760405162461bcd60e51b815260040161051d90614378565b6116317f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061298992505050565b9150868260018451038151811061164457fe5b6020026020010151101561166a5760405162461bcd60e51b815260040161051d90614570565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836000815181106116a657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156116d957600080fd5b505af11580156116ed573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6117527f00000000000000000000000000000000000000000000000000000000000000008989600081811061112e57fe5b8460008151811061175f57fe5b60200260200101516040518363ffffffff1660e01b8152600401611784929190614114565b602060405180830381600087803b15801561179e57600080fd5b505af11580156117b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d69190613d50565b6117dc57fe5b61181b82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612c2d915050565b5095945050505050565b6000610606848484613411565b606081428110156118555760405162461bcd60e51b815260040161051d906141d7565b6118b37f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612ded92505050565b915086826000815181106118c357fe5b60200260200101511115610d335760405162461bcd60e51b815260040161051d906144a0565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006106068484846134b9565b6000814281101561193d5760405162461bcd60e51b815260040161051d906141d7565b61196c887f00000000000000000000000000000000000000000000000000000000000000008989893089611d9a565b6040516370a0823160e01b81529093506119f99150899086906001600160a01b038316906370a08231906119a4903090600401614046565b60206040518083038186803b1580156119bc57600080fd5b505afa1580156119d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f49190613e37565b612757565b604051632e1a7d4d60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d90611a45908590600401614681565b600060405180830381600087803b158015611a5f57600080fd5b505af1158015611a73573d6000803e3d6000fd5b505050506108df8483612845565b8042811015611aa25760405162461bcd60e51b815260040161051d906141d7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685856000818110611ad957fe5b9050602002016020810190611aee919061398e565b6001600160a01b031614611b145760405162461bcd60e51b815260040161051d90614378565b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b7457600080fd5b505af1158015611b88573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611bed7f00000000000000000000000000000000000000000000000000000000000000008989600081811061112e57fe5b836040518363ffffffff1660e01b8152600401611c0b929190614114565b602060405180830381600087803b158015611c2557600080fd5b505af1158015611c39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5d9190613d50565b611c6357fe5b600086866000198101818110611c7557fe5b9050602002016020810190611c8a919061398e565b6001600160a01b03166370a08231866040518263ffffffff1660e01b8152600401611cb59190614046565b60206040518083038186803b158015611ccd57600080fd5b505afa158015611ce1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d059190613e37565b9050611d45878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613178915050565b876112e98289896000198101818110611d5a57fe5b9050602002016020810190611d6f919061398e565b6001600160a01b03166370a08231896040518263ffffffff1660e01b815260040161128d9190614046565b6000808242811015611dbe5760405162461bcd60e51b815260040161051d906141d7565b6000611deb7f00000000000000000000000000000000000000000000000000000000000000008c8c612aa0565b6040516323b872dd60e01b81529091506001600160a01b038216906323b872dd90611e1e90339085908e9060040161409b565b602060405180830381600087803b158015611e3857600080fd5b505af1158015611e4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e709190613d50565b50600080826001600160a01b03166389afcb44896040518263ffffffff1660e01b8152600401611ea09190614046565b6040805180830381600087803b158015611eb957600080fd5b505af1158015611ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef19190613f6b565b915091506000611f018e8e613527565b509050806001600160a01b03168e6001600160a01b031614611f24578183611f27565b82825b90975095508a871015611f4c5760405162461bcd60e51b815260040161051d906144e7565b89861015611f6c5760405162461bcd60e51b815260040161051d90614332565b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606109177f00000000000000000000000000000000000000000000000000000000000000008484612989565b600080600061201e7f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000612aa0565b905060008761202d578c612031565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf9061206c903390309086908f908e908e908e9060040161405a565b600060405180830381600087803b15801561208657600080fd5b505af115801561209a573d6000803e3d6000fd5b505050506120ac8e8e8e8e8e8e6104f9565b909f909e509c50505050505050505050505050565b600080600083428110156120e75760405162461bcd60e51b815260040161051d906141d7565b6120f58c8c8c8c8c8c6135b1565b909450925060006121277f00000000000000000000000000000000000000000000000000000000000000008e8e612aa0565b90506121358d338388612b3c565b6121418c338387612b3c565b6040516335313c2160e11b81526001600160a01b03821690636a6278429061216d908a90600401614046565b602060405180830381600087803b15801561218757600080fd5b505af115801561219b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121bf9190613e37565b92505050985098509895505050505050565b600080600083428110156121f75760405162461bcd60e51b815260040161051d906141d7565b6122258a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c6135b1565b909450925060006122777f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000612aa0565b90506122858b338388612b3c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156122e057600080fd5b505af11580156122f4573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb9250612347915084908890600401614114565b602060405180830381600087803b15801561236157600080fd5b505af1158015612375573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123999190613d50565b61239f57fe5b6040516335313c2160e11b81526001600160a01b03821690636a627842906123cb908a90600401614046565b602060405180830381600087803b1580156123e557600080fd5b505af11580156123f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061241d9190613e37565b9250833411156124335761243333853403612845565b505096509650969350505050565b606081428110156124645760405162461bcd60e51b815260040161051d906141d7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061249b57fe5b90506020020160208101906124b0919061398e565b6001600160a01b0316146124d65760405162461bcd60e51b815260040161051d90614378565b6125347f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612ded92505050565b9150348260008151811061254457fe5b6020026020010151111561256a5760405162461bcd60e51b815260040161051d906144a0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0836000815181106125a657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156125d957600080fd5b505af11580156125ed573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6126527f00000000000000000000000000000000000000000000000000000000000000008989600081811061112e57fe5b8460008151811061265f57fe5b60200260200101516040518363ffffffff1660e01b8152600401612684929190614114565b602060405180830381600087803b15801561269e57600080fd5b505af11580156126b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126d69190613d50565b6126dc57fe5b61271b82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612c2d915050565b8160008151811061272857fe5b602002602001015134111561181b5761181b338360008151811061274857fe5b60200260200101513403612845565b60006060846001600160a01b031663a9059cbb858560405160240161277d929190614114565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516127b6919061402a565b6000604051808303816000865af19150503d80600081146127f3576040519150601f19603f3d011682016040523d82523d6000602084013e6127f8565b606091505b50915091508180156128225750805115806128225750808060200190518101906128229190613d50565b61283e5760405162461bcd60e51b815260040161051d906141a0565b5050505050565b604080516000808252602082019092526001600160a01b03841690839060405161286f919061402a565b60006040518083038185875af1925050503d80600081146128ac576040519150601f19603f3d011682016040523d82523d6000602084013e6128b1565b606091505b50509050806128d25760405162461bcd60e51b815260040161051d9061452d565b505050565b60008084116128f85760405162461bcd60e51b815260040161051d90614636565b6000831180156129085750600082115b6129245760405162461bcd60e51b815260040161051d906143e6565b6000612938856126ec63ffffffff6137e616565b9050600061294c828563ffffffff6137e616565b90506000612972836129668861271063ffffffff6137e616565b9063ffffffff61381d16565b905080828161297d57fe5b04979650505050505050565b60606002825110156129ad5760405162461bcd60e51b815260040161051d906143af565b815167ffffffffffffffff811180156129c557600080fd5b506040519080825280602002602001820160405280156129ef578160200160208202803683370190505b5090508281600081518110612a0057fe5b60200260200101818152505060005b6001835103811015612a9857600080612a5287868581518110612a2e57fe5b6020026020010151878660010181518110612a4557fe5b6020026020010151613840565b91509150612a74848481518110612a6557fe5b602002602001015183836128d7565b848460010181518110612a8357fe5b60209081029190910101525050600101612a0f565b509392505050565b6000806000612aaf8585613527565b60405163e6a4390560e01b815291935091506001600160a01b0387169063e6a4390590612ae290859085906004016140bf565b60206040518083038186803b158015612afa57600080fd5b505afa158015612b0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3291906139b1565b9695505050505050565b60006060856001600160a01b03166323b872dd868686604051602401612b649392919061409b565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051612b9d919061402a565b6000604051808303816000865af19150503d8060008114612bda576040519150601f19603f3d011682016040523d82523d6000602084013e612bdf565b606091505b5091509150818015612c09575080511580612c09575080806020019051810190612c099190613d50565b612c255760405162461bcd60e51b815260040161051d906145f2565b505050505050565b60005b6001835103811015612de757600080848381518110612c4b57fe5b6020026020010151858460010181518110612c6257fe5b6020026020010151915091506000612c7a8383613527565b5090506000878560010181518110612c8e57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b031614612cbc57826000612cc0565b6000835b91509150600060028a51038810612cd75788612d18565b612d187f0000000000000000000000000000000000000000000000000000000000000000878c8b60020181518110612d0b57fe5b6020026020010151612aa0565b9050612d457f00000000000000000000000000000000000000000000000000000000000000008888612aa0565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612d82576020820181803683370190505b506040518563ffffffff1660e01b8152600401612da29493929190614698565b600060405180830381600087803b158015612dbc57600080fd5b505af1158015612dd0573d6000803e3d6000fd5b505060019099019850612c30975050505050505050565b50505050565b6060600282511015612e115760405162461bcd60e51b815260040161051d906143af565b815167ffffffffffffffff81118015612e2957600080fd5b50604051908082528060200260200182016040528015612e53578160200160208202803683370190505b5090508281600183510381518110612e6757fe5b60209081029190910101528151600019015b8015612a9857600080612ea987866001860381518110612e9557fe5b6020026020010151878681518110612a4557fe5b91509150612ecb848481518110612ebc57fe5b60200260200101518383613411565b846001850381518110612eda57fe5b6020908102919091010152505060001901612e79565b60405163e6a4390560e01b8152600090819081907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e6a4390590612f45908d908d906004016140bf565b60206040518083038186803b158015612f5d57600080fd5b505afa158015612f71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f9591906139b1565b6001600160a01b03161415613079578251612fc25760405162461bcd60e51b815260040161051d9061423c565b602083015160408085015160608601519151630c5dcfd360e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016936331773f4c93613021938f938f9392906004016140d9565b602060405180830381600087803b15801561303b57600080fd5b505af115801561304f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307391906139b1565b50613098565b8251156130985760405162461bcd60e51b815260040161051d9061442e565b6000806130c67f00000000000000000000000000000000000000000000000000000000000000008c8c613840565b915091508160001480156130d8575080155b156130e85788935087925061316a565b60006130f58a84846134b9565b9050888111613129578681101561311e5760405162461bcd60e51b815260040161051d90614332565b899450925082613168565b60006131368a84866134b9565b90508a81111561314257fe5b888110156131625760405162461bcd60e51b815260040161051d906144e7565b94508893505b505b505097509795505050505050565b60005b60018351038110156128d25760008084838151811061319657fe5b60200260200101518584600101815181106131ad57fe5b60200260200101519150915060006131c58383613527565b50905060006131f57f00000000000000000000000000000000000000000000000000000000000000008585612aa0565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561323657600080fd5b505afa15801561324a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061326e9190613de3565b506001600160701b031691506001600160701b03169150600080876001600160a01b03168a6001600160a01b0316146132a85782846132ab565b83835b915091506132df828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040161128d9190614046565b95506132ec8683836128d7565b945050505050600080856001600160a01b0316886001600160a01b0316146133165782600061331a565b6000835b91509150600060028c51038a10613331578a613365565b6133657f0000000000000000000000000000000000000000000000000000000000000000898e8d60020181518110612d0b57fe5b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f906133a79086908690869060248101614698565b600060405180830381600087803b1580156133c157600080fd5b505af11580156133d5573d6000803e3d6000fd5b50506001909b019a5061317b9950505050505050505050565b8082038281111561091a5760405162461bcd60e51b815260040161051d90614171565b60008084116134325760405162461bcd60e51b815260040161051d90614273565b6000831180156134425750600082115b61345e5760405162461bcd60e51b815260040161051d906143e6565b6000613482612710613476868863ffffffff6137e616565b9063ffffffff6137e616565b9050600061349c6126ec613476868963ffffffff6133ee16565b9050612b3260018284816134ac57fe5b049063ffffffff61381d16565b60008084116134da5760405162461bcd60e51b815260040161051d9061445b565b6000831180156134ea5750600082115b6135065760405162461bcd60e51b815260040161051d906143e6565b82613517858463ffffffff6137e616565b8161351e57fe5b04949350505050565b600080826001600160a01b0316846001600160a01b0316141561355c5760405162461bcd60e51b815260040161051d906142ed565b826001600160a01b0316846001600160a01b03161061357c57828461357f565b83835b90925090506001600160a01b0382166135aa5760405162461bcd60e51b815260040161051d906145bb565b9250929050565b60405163e6a4390560e01b8152600090819081907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e6a4390590613606908c908c906004016140bf565b60206040518083038186803b15801561361e57600080fd5b505afa158015613632573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061365691906139b1565b6001600160a01b03161415613707576040516364e329cb60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906136b3908b908b906004016140bf565b602060405180830381600087803b1580156136cd57600080fd5b505af11580156136e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061370591906139b1565b505b6000806137357f00000000000000000000000000000000000000000000000000000000000000008b8b613840565b91509150816000148015613747575080155b15613757578793508692506137d9565b60006137648984846134b9565b9050878111613798578581101561378d5760405162461bcd60e51b815260040161051d90614332565b8894509250826137d7565b60006137a58984866134b9565b9050898111156137b157fe5b878110156137d15760405162461bcd60e51b815260040161051d906144e7565b94508793505b505b5050965096945050505050565b6000811580613801575050808202828282816137fe57fe5b04145b61091a5760405162461bcd60e51b815260040161051d9061420e565b8082018281101561091a5760405162461bcd60e51b815260040161051d906142bf565b600080600061384f8585613527565b509050600080613860888888612aa0565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561389857600080fd5b505afa1580156138ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138d09190613de3565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b03161461390757808261390a565b81815b90999098509650505050505050565b803561091a81614751565b60008083601f840112613935578182fd5b50813567ffffffffffffffff81111561394c578182fd5b60208301915083602080830285010111156135aa57600080fd5b600060808284031215613977578081fd5b50919050565b803560ff8116811461091a57600080fd5b60006020828403121561399f578081fd5b81356139aa81614751565b9392505050565b6000602082840312156139c2578081fd5b81516139aa81614751565b600080600080600080600060e0888a0312156139e7578283fd5b87356139f281614751565b96506020880135613a0281614751565b955060408801359450606088013593506080880135925060a0880135613a2781614751565b8092505060c0880135905092959891949750929550565b60008060008060008060008060008060006101608c8e031215613a5f578384fd5b8b35613a6a81614751565b9a5060208c0135613a7a81614751565b995060408c0135985060608c0135975060808c0135965060a08c0135613a9f81614751565b955060c08c0135945060e08c0135613ab681614769565b9350613ac68d6101008e0161397d565b92506101208c013591506101408c013590509295989b509295989b9093969950565b600080600080600080600080610100898b031215613b04578384fd5b8835613b0f81614751565b97506020890135613b1f81614751565b965060408901359550606089013594506080890135935060a0890135925060c0890135613b4b81614751565b8092505060e089013590509295985092959890939650565b60008060008060008060008060006101808a8c031215613b81578283fd5b8935613b8c81614751565b985060208a0135613b9c81614751565b975060408a0135965060608a0135955060808a0135945060a08a0135935060c08a0135613bc881614751565b925060e08a01359150613bdf8b6101008c01613966565b90509295985092959850929598565b60008060008060008060c08789031215613c06578384fd5b8635613c1181614751565b95506020870135945060408701359350606087013592506080870135613c3681614751565b8092505060a087013590509295509295509295565b6000806000806000806000806000806101408b8d031215613c6a578384fd5b8a35613c7581614751565b995060208b0135985060408b0135975060608b0135965060808b0135613c9a81614751565b955060a08b0135945060c08b0135613cb181614769565b9350613cc08c60e08d0161397d565b92506101008b013591506101208b013590509295989b9194979a5092959850565b6000806000806000806000610140888a031215613cfc578081fd5b8735613d0781614751565b96506020880135955060408801359450606088013593506080880135613d2c81614751565b925060a08801359150613d428960c08a01613966565b905092959891949750929550565b600060208284031215613d61578081fd5b81516139aa81614769565b600060808284031215613d7d578081fd5b613d8760806146fe565b8235613d9281614769565b81526020830135613da281614769565b6020820152604083013561ffff81168114613dbb578283fd5b6040820152606083013564ffffffffff81168114613dd7578283fd5b60608201529392505050565b600080600060608486031215613df7578081fd5b8351613e0281614777565b6020850151909350613e1381614777565b604085015190925063ffffffff81168114613e2c578182fd5b809150509250925092565b600060208284031215613e48578081fd5b5051919050565b600080600080600060808688031215613e66578283fd5b85359450602086013567ffffffffffffffff811115613e83578384fd5b613e8f88828901613924565b9095509350506040860135613ea381614751565b949793965091946060013592915050565b60008060408385031215613ec6578182fd5b8235915060208084013567ffffffffffffffff80821115613ee5578384fd5b81860187601f820112613ef6578485fd5b8035925081831115613f06578485fd5b8383029150613f168483016146fe565b8381528481019082860184840187018b1015613f30578788fd5b8794505b85851015613f5a57613f468b82613919565b835260019490940193918601918601613f34565b508096505050505050509250929050565b60008060408385031215613f7d578182fd5b505080516020909101519092909150565b60008060008060008060a08789031215613fa6578384fd5b8635955060208701359450604087013567ffffffffffffffff811115613fca578485fd5b613fd689828a01613924565b9095509350506060870135613fea81614751565b80925050608087013590509295509295509295565b600080600060608486031215614013578081fd5b505081359360208301359350604090920135919050565b6000825161403c818460208701614725565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039586168152939094166020840152901515604083015261ffff16606082015264ffffffffff909116608082015260a00190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b8181101561416557835183529284019291840191600101614149565b50909695505050505050565b60208082526015908201527464732d6d6174682d7375622d756e646572666c6f7760581b604082015260600190565b6020808252601f908201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604082015260600190565b60208082526018908201527f556e69737761705632526f757465723a20455850495245440000000000000000604082015260600190565b60208082526014908201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604082015260600190565b60208082526017908201527f63616e2774206465706c6f792061206e657720706f6f6c000000000000000000604082015260600190565b6020808252602c908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4f60408201526b155514155517d05353d5539560a21b606082015260800190565b60208082526014908201527364732d6d6174682d6164642d6f766572666c6f7760601b604082015260600190565b60208082526025908201527f556e697377617056324c6962726172793a204944454e544943414c5f41444452604082015264455353455360d81b606082015260800190565b60208082526026908201527f556e69737761705632526f757465723a20494e53554646494349454e545f425f604082015265105353d5539560d21b606082015260800190565b6020808252601d908201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604082015260600190565b6020808252601e908201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604082015260600190565b60208082526028908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4c604082015267495155494449545960c01b606082015260800190565b602080825260139082015272706f6f6c20616c72656164792065786973747360681b604082015260600190565b60208082526025908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f416040820152641353d5539560da1b606082015260800190565b60208082526027908201527f556e69737761705632526f757465723a204558434553534956455f494e50555460408201526617d05353d5539560ca1b606082015260800190565b60208082526026908201527f556e69737761705632526f757465723a20494e53554646494349454e545f415f604082015265105353d5539560d21b606082015260800190565b60208082526023908201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960408201526213115160ea1b606082015260800190565b6020808252602b908201527f556e69737761705632526f757465723a20494e53554646494349454e545f4f5560408201526a1514155517d05353d5539560aa1b606082015260800190565b6020808252601e908201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604082015260600190565b60208082526024908201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416040820152631253115160e21b606082015260800190565b6020808252602b908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4960408201526a1394155517d05353d5539560aa1b606082015260800190565b90815260200190565b918252602082015260400190565b600085825284602083015260018060a01b03841660408301526080606083015282518060808401526146d18160a0850160208701614725565b601f01601f19169190910160a00195945050505050565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff8111828210171561471d57600080fd5b604052919050565b60005b83811015614740578181015183820152602001614728565b83811115612de75750506000910152565b6001600160a01b038116811461476657600080fd5b50565b801515811461476657600080fd5b6001600160701b038116811461476657600080fdfea264697066735822122019de977653d2888829ef01f0706abaab007587b253c64104375796d806b2464b64736f6c63430006060033000000000000000000000000dbcb35859c27dade56256c62d547405402a08f15000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2

Deployed Bytecode

0x6080604052600436106101855760003560e01c806385f8c259116100d1578063baa2abde1161008a578063ded9382a11610064578063ded9382a14610493578063e8e33700146104b3578063f305d719146104d3578063fb3bdb41146104e6576101be565b8063baa2abde1461043e578063c45a01551461045e578063d06ca61f14610473576101be565b806385f8c259146103895780638803dbee146103a9578063ad5c4648146103c9578063ad615dec146103eb578063af2979eb1461040b578063b6f9de951461042b576101be565b806338ed17391161013e5780635b0d5984116101185780635b0d5984146103165780635c11d79514610336578063791ac947146103565780637ff36ab514610376576101be565b806338ed1739146102b65780633d529f7b146102d65780634a25d94a146102f6576101be565b806302751cec146101c3578063054d50d4146101fa57806318cbafe5146102275780631f00ca74146102545780632195995c1461027457806332e1144514610294576101be565b366101be57336001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216146101bc57fe5b005b600080fd5b3480156101cf57600080fd5b506101e36101de366004613bee565b6104f9565b6040516101f192919061468a565b60405180910390f35b34801561020657600080fd5b5061021a610215366004613fff565b6105f9565b6040516101f19190614681565b34801561023357600080fd5b50610247610242366004613f8e565b61060e565b6040516101f1919061412d565b34801561026057600080fd5b5061024761026f366004613eb4565b6108ea565b34801561028057600080fd5b506101e361028f366004613a3e565b610920565b6102a76102a2366004613ce1565b6109f9565b6040516101f1939291906146e8565b3480156102c257600080fd5b506102476102d1366004613f8e565b610c79565b3480156102e257600080fd5b506102a76102f1366004613b63565b610d82565b34801561030257600080fd5b50610247610311366004613f8e565b610e9d565b34801561032257600080fd5b5061021a610331366004613c4b565b610fc9565b34801561034257600080fd5b506101bc610351366004613f8e565b6110b6565b34801561036257600080fd5b506101bc610371366004613f8e565b611311565b610247610384366004613e4f565b61153e565b34801561039557600080fd5b5061021a6103a4366004613fff565b611825565b3480156103b557600080fd5b506102476103c4366004613f8e565b611832565b3480156103d557600080fd5b506103de6118e9565b6040516101f19190614046565b3480156103f757600080fd5b5061021a610406366004613fff565b61190d565b34801561041757600080fd5b5061021a610426366004613bee565b61191a565b6101bc610439366004613e4f565b611a81565b34801561044a57600080fd5b506101e36104593660046139cd565b611d9a565b34801561046a57600080fd5b506103de611f7d565b34801561047f57600080fd5b5061024761048e366004613eb4565b611fa1565b34801561049f57600080fd5b506101e36104ae366004613c4b565b611fce565b3480156104bf57600080fd5b506102a76104ce366004613ae8565b6120c1565b6102a76104e1366004613bee565b6121d1565b6102476104f4366004613e4f565b612441565b60008082428110156105265760405162461bcd60e51b815260040161051d906141d7565b60405180910390fd5b610555897f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28a8a8a308a611d9a565b9093509150610565898685612757565b604051632e1a7d4d60e01b81526001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21690632e1a7d4d906105b1908590600401614681565b600060405180830381600087803b1580156105cb57600080fd5b505af11580156105df573d6000803e3d6000fd5b505050506105ed8583612845565b50965096945050505050565b60006106068484846128d7565b949350505050565b606081428110156106315760405162461bcd60e51b815260040161051d906141d7565b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2168686600019810181811061066b57fe5b9050602002016020810190610680919061398e565b6001600160a01b0316146106a65760405162461bcd60e51b815260040161051d90614378565b6107047f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061298992505050565b9150868260018451038151811061071757fe5b6020026020010151101561073d5760405162461bcd60e51b815260040161051d90614570565b6107ea8686600081811061074d57fe5b9050602002016020810190610762919061398e565b336107d07f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158a8a600081811061079457fe5b90506020020160208101906107a9919061398e565b8b8b60018181106107b657fe5b90506020020160208101906107cb919061398e565b612aa0565b856000815181106107dd57fe5b6020026020010151612b3c565b61082982878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612c2d915050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d8360018551038151811061086857fe5b60200260200101516040518263ffffffff1660e01b815260040161088c9190614681565b600060405180830381600087803b1580156108a657600080fd5b505af11580156108ba573d6000803e3d6000fd5b505050506108df84836001855103815181106108d257fe5b6020026020010151612845565b509695505050505050565b60606109177f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158484612ded565b90505b92915050565b60008060006109507f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158f8f612aa0565b905060008761095f578c610963565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf9061099e903390309086908f908e908e908e9060040161405a565b600060405180830381600087803b1580156109b857600080fd5b505af11580156109cc573d6000803e3d6000fd5b505050506109df8f8f8f8f8f8f8f611d9a565b809450819550505050509b509b9950505050505050505050565b60008060008442811015610a1f5760405162461bcd60e51b815260040161051d906141d7565b610a5c8b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28c348d8d610a57368d90038d018d613d6c565b612ef0565b90945092506000610aae7f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158d7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2612aa0565b9050610abc8c338388612b3c565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015610b1757600080fd5b505af1158015610b2b573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216935063a9059cbb9250610b7e915084908890600401614114565b602060405180830381600087803b158015610b9857600080fd5b505af1158015610bac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd09190613d50565b610bd657fe5b6040516335313c2160e11b81526001600160a01b03821690636a62784290610c02908b90600401614046565b602060405180830381600087803b158015610c1c57600080fd5b505af1158015610c30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c549190613e37565b925083341115610c6a57610c6a33853403612845565b50509750975097945050505050565b60608142811015610c9c5760405162461bcd60e51b815260040161051d906141d7565b610cfa7f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061298992505050565b91508682600184510381518110610d0d57fe5b60200260200101511015610d335760405162461bcd60e51b815260040161051d90614570565b610d438686600081811061074d57fe5b6108df82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612c2d915050565b60008060008442811015610da85760405162461bcd60e51b815260040161051d906141d7565b610dc08d8d8d8d8d8d610a57368d90038d018d613d6c565b90945092506000610df27f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158f8f612aa0565b9050610e008e338388612b3c565b610e0c8d338387612b3c565b6040516335313c2160e11b81526001600160a01b03821690636a62784290610e38908b90600401614046565b602060405180830381600087803b158015610e5257600080fd5b505af1158015610e66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8a9190613e37565b9250505099509950999650505050505050565b60608142811015610ec05760405162461bcd60e51b815260040161051d906141d7565b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21686866000198101818110610efa57fe5b9050602002016020810190610f0f919061398e565b6001600160a01b031614610f355760405162461bcd60e51b815260040161051d90614378565b610f937f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f1589888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612ded92505050565b91508682600081518110610fa357fe5b6020026020010151111561073d5760405162461bcd60e51b815260040161051d906144a0565b6000806110177f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158d7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2612aa0565b9050600086611026578b61102a565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90611065903390309086908e908d908d908d9060040161405a565b600060405180830381600087803b15801561107f57600080fd5b505af1158015611093573d6000803e3d6000fd5b505050506110a58d8d8d8d8d8d61191a565b9d9c50505050505050505050505050565b80428110156110d75760405162461bcd60e51b815260040161051d906141d7565b611156858560008181106110e757fe5b90506020020160208101906110fc919061398e565b336111507f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158989600081811061112e57fe5b9050602002016020810190611143919061398e565b8a8a60018181106107b657fe5b8a612b3c565b60008585600019810181811061116857fe5b905060200201602081019061117d919061398e565b6001600160a01b03166370a08231856040518263ffffffff1660e01b81526004016111a89190614046565b60206040518083038186803b1580156111c057600080fd5b505afa1580156111d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f89190613e37565b9050611238868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250613178915050565b866112e9828888600019810181811061124d57fe5b9050602002016020810190611262919061398e565b6001600160a01b03166370a08231886040518263ffffffff1660e01b815260040161128d9190614046565b60206040518083038186803b1580156112a557600080fd5b505afa1580156112b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112dd9190613e37565b9063ffffffff6133ee16565b10156113075760405162461bcd60e51b815260040161051d90614570565b5050505050505050565b80428110156113325760405162461bcd60e51b815260040161051d906141d7565b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2168585600019810181811061136c57fe5b9050602002016020810190611381919061398e565b6001600160a01b0316146113a75760405162461bcd60e51b815260040161051d90614378565b6113b7858560008181106110e757fe5b6113f5858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613178915050565b6040516370a0823160e01b81526000906001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216906370a0823190611444903090600401614046565b60206040518083038186803b15801561145c57600080fd5b505afa158015611470573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114949190613e37565b9050868110156114b65760405162461bcd60e51b815260040161051d90614570565b604051632e1a7d4d60e01b81526001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21690632e1a7d4d90611502908490600401614681565b600060405180830381600087803b15801561151c57600080fd5b505af1158015611530573d6000803e3d6000fd5b505050506113078482612845565b606081428110156115615760405162461bcd60e51b815260040161051d906141d7565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03168686600081811061159857fe5b90506020020160208101906115ad919061398e565b6001600160a01b0316146115d35760405162461bcd60e51b815260040161051d90614378565b6116317f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f153488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061298992505050565b9150868260018451038151811061164457fe5b6020026020010151101561166a5760405162461bcd60e51b815260040161051d90614570565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0836000815181106116a657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156116d957600080fd5b505af11580156116ed573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb6117527f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158989600081811061112e57fe5b8460008151811061175f57fe5b60200260200101516040518363ffffffff1660e01b8152600401611784929190614114565b602060405180830381600087803b15801561179e57600080fd5b505af11580156117b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d69190613d50565b6117dc57fe5b61181b82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612c2d915050565b5095945050505050565b6000610606848484613411565b606081428110156118555760405162461bcd60e51b815260040161051d906141d7565b6118b37f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f1589888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612ded92505050565b915086826000815181106118c357fe5b60200260200101511115610d335760405162461bcd60e51b815260040161051d906144a0565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b60006106068484846134b9565b6000814281101561193d5760405162461bcd60e51b815260040161051d906141d7565b61196c887f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28989893089611d9a565b6040516370a0823160e01b81529093506119f99150899086906001600160a01b038316906370a08231906119a4903090600401614046565b60206040518083038186803b1580156119bc57600080fd5b505afa1580156119d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f49190613e37565b612757565b604051632e1a7d4d60e01b81526001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21690632e1a7d4d90611a45908590600401614681565b600060405180830381600087803b158015611a5f57600080fd5b505af1158015611a73573d6000803e3d6000fd5b505050506108df8483612845565b8042811015611aa25760405162461bcd60e51b815260040161051d906141d7565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031685856000818110611ad957fe5b9050602002016020810190611aee919061398e565b6001600160a01b031614611b145760405162461bcd60e51b815260040161051d90614378565b60003490507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b7457600080fd5b505af1158015611b88573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb611bed7f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158989600081811061112e57fe5b836040518363ffffffff1660e01b8152600401611c0b929190614114565b602060405180830381600087803b158015611c2557600080fd5b505af1158015611c39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5d9190613d50565b611c6357fe5b600086866000198101818110611c7557fe5b9050602002016020810190611c8a919061398e565b6001600160a01b03166370a08231866040518263ffffffff1660e01b8152600401611cb59190614046565b60206040518083038186803b158015611ccd57600080fd5b505afa158015611ce1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d059190613e37565b9050611d45878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613178915050565b876112e98289896000198101818110611d5a57fe5b9050602002016020810190611d6f919061398e565b6001600160a01b03166370a08231896040518263ffffffff1660e01b815260040161128d9190614046565b6000808242811015611dbe5760405162461bcd60e51b815260040161051d906141d7565b6000611deb7f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158c8c612aa0565b6040516323b872dd60e01b81529091506001600160a01b038216906323b872dd90611e1e90339085908e9060040161409b565b602060405180830381600087803b158015611e3857600080fd5b505af1158015611e4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e709190613d50565b50600080826001600160a01b03166389afcb44896040518263ffffffff1660e01b8152600401611ea09190614046565b6040805180830381600087803b158015611eb957600080fd5b505af1158015611ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ef19190613f6b565b915091506000611f018e8e613527565b509050806001600160a01b03168e6001600160a01b031614611f24578183611f27565b82825b90975095508a871015611f4c5760405162461bcd60e51b815260040161051d906144e7565b89861015611f6c5760405162461bcd60e51b815260040161051d90614332565b505050505097509795505050505050565b7f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f1581565b60606109177f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158484612989565b600080600061201e7f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158e7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2612aa0565b905060008761202d578c612031565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf9061206c903390309086908f908e908e908e9060040161405a565b600060405180830381600087803b15801561208657600080fd5b505af115801561209a573d6000803e3d6000fd5b505050506120ac8e8e8e8e8e8e6104f9565b909f909e509c50505050505050505050505050565b600080600083428110156120e75760405162461bcd60e51b815260040161051d906141d7565b6120f58c8c8c8c8c8c6135b1565b909450925060006121277f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158e8e612aa0565b90506121358d338388612b3c565b6121418c338387612b3c565b6040516335313c2160e11b81526001600160a01b03821690636a6278429061216d908a90600401614046565b602060405180830381600087803b15801561218757600080fd5b505af115801561219b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121bf9190613e37565b92505050985098509895505050505050565b600080600083428110156121f75760405162461bcd60e51b815260040161051d906141d7565b6122258a7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28b348c8c6135b1565b909450925060006122777f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158c7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2612aa0565b90506122858b338388612b3c565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156122e057600080fd5b505af11580156122f4573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216935063a9059cbb9250612347915084908890600401614114565b602060405180830381600087803b15801561236157600080fd5b505af1158015612375573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123999190613d50565b61239f57fe5b6040516335313c2160e11b81526001600160a01b03821690636a627842906123cb908a90600401614046565b602060405180830381600087803b1580156123e557600080fd5b505af11580156123f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061241d9190613e37565b9250833411156124335761243333853403612845565b505096509650969350505050565b606081428110156124645760405162461bcd60e51b815260040161051d906141d7565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03168686600081811061249b57fe5b90506020020160208101906124b0919061398e565b6001600160a01b0316146124d65760405162461bcd60e51b815260040161051d90614378565b6125347f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f1588888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612ded92505050565b9150348260008151811061254457fe5b6020026020010151111561256a5760405162461bcd60e51b815260040161051d906144a0565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0836000815181106125a657fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156125d957600080fd5b505af11580156125ed573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb6126527f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158989600081811061112e57fe5b8460008151811061265f57fe5b60200260200101516040518363ffffffff1660e01b8152600401612684929190614114565b602060405180830381600087803b15801561269e57600080fd5b505af11580156126b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126d69190613d50565b6126dc57fe5b61271b82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612c2d915050565b8160008151811061272857fe5b602002602001015134111561181b5761181b338360008151811061274857fe5b60200260200101513403612845565b60006060846001600160a01b031663a9059cbb858560405160240161277d929190614114565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516127b6919061402a565b6000604051808303816000865af19150503d80600081146127f3576040519150601f19603f3d011682016040523d82523d6000602084013e6127f8565b606091505b50915091508180156128225750805115806128225750808060200190518101906128229190613d50565b61283e5760405162461bcd60e51b815260040161051d906141a0565b5050505050565b604080516000808252602082019092526001600160a01b03841690839060405161286f919061402a565b60006040518083038185875af1925050503d80600081146128ac576040519150601f19603f3d011682016040523d82523d6000602084013e6128b1565b606091505b50509050806128d25760405162461bcd60e51b815260040161051d9061452d565b505050565b60008084116128f85760405162461bcd60e51b815260040161051d90614636565b6000831180156129085750600082115b6129245760405162461bcd60e51b815260040161051d906143e6565b6000612938856126ec63ffffffff6137e616565b9050600061294c828563ffffffff6137e616565b90506000612972836129668861271063ffffffff6137e616565b9063ffffffff61381d16565b905080828161297d57fe5b04979650505050505050565b60606002825110156129ad5760405162461bcd60e51b815260040161051d906143af565b815167ffffffffffffffff811180156129c557600080fd5b506040519080825280602002602001820160405280156129ef578160200160208202803683370190505b5090508281600081518110612a0057fe5b60200260200101818152505060005b6001835103811015612a9857600080612a5287868581518110612a2e57fe5b6020026020010151878660010181518110612a4557fe5b6020026020010151613840565b91509150612a74848481518110612a6557fe5b602002602001015183836128d7565b848460010181518110612a8357fe5b60209081029190910101525050600101612a0f565b509392505050565b6000806000612aaf8585613527565b60405163e6a4390560e01b815291935091506001600160a01b0387169063e6a4390590612ae290859085906004016140bf565b60206040518083038186803b158015612afa57600080fd5b505afa158015612b0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b3291906139b1565b9695505050505050565b60006060856001600160a01b03166323b872dd868686604051602401612b649392919061409b565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051612b9d919061402a565b6000604051808303816000865af19150503d8060008114612bda576040519150601f19603f3d011682016040523d82523d6000602084013e612bdf565b606091505b5091509150818015612c09575080511580612c09575080806020019051810190612c099190613d50565b612c255760405162461bcd60e51b815260040161051d906145f2565b505050505050565b60005b6001835103811015612de757600080848381518110612c4b57fe5b6020026020010151858460010181518110612c6257fe5b6020026020010151915091506000612c7a8383613527565b5090506000878560010181518110612c8e57fe5b60200260200101519050600080836001600160a01b0316866001600160a01b031614612cbc57826000612cc0565b6000835b91509150600060028a51038810612cd75788612d18565b612d187f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f15878c8b60020181518110612d0b57fe5b6020026020010151612aa0565b9050612d457f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158888612aa0565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612d82576020820181803683370190505b506040518563ffffffff1660e01b8152600401612da29493929190614698565b600060405180830381600087803b158015612dbc57600080fd5b505af1158015612dd0573d6000803e3d6000fd5b505060019099019850612c30975050505050505050565b50505050565b6060600282511015612e115760405162461bcd60e51b815260040161051d906143af565b815167ffffffffffffffff81118015612e2957600080fd5b50604051908082528060200260200182016040528015612e53578160200160208202803683370190505b5090508281600183510381518110612e6757fe5b60209081029190910101528151600019015b8015612a9857600080612ea987866001860381518110612e9557fe5b6020026020010151878681518110612a4557fe5b91509150612ecb848481518110612ebc57fe5b60200260200101518383613411565b846001850381518110612eda57fe5b6020908102919091010152505060001901612e79565b60405163e6a4390560e01b8152600090819081907f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f156001600160a01b03169063e6a4390590612f45908d908d906004016140bf565b60206040518083038186803b158015612f5d57600080fd5b505afa158015612f71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f9591906139b1565b6001600160a01b03161415613079578251612fc25760405162461bcd60e51b815260040161051d9061423c565b602083015160408085015160608601519151630c5dcfd360e21b81526001600160a01b037f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f1516936331773f4c93613021938f938f9392906004016140d9565b602060405180830381600087803b15801561303b57600080fd5b505af115801561304f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307391906139b1565b50613098565b8251156130985760405162461bcd60e51b815260040161051d9061442e565b6000806130c67f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158c8c613840565b915091508160001480156130d8575080155b156130e85788935087925061316a565b60006130f58a84846134b9565b9050888111613129578681101561311e5760405162461bcd60e51b815260040161051d90614332565b899450925082613168565b60006131368a84866134b9565b90508a81111561314257fe5b888110156131625760405162461bcd60e51b815260040161051d906144e7565b94508893505b505b505097509795505050505050565b60005b60018351038110156128d25760008084838151811061319657fe5b60200260200101518584600101815181106131ad57fe5b60200260200101519150915060006131c58383613527565b50905060006131f57f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158585612aa0565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561323657600080fd5b505afa15801561324a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061326e9190613de3565b506001600160701b031691506001600160701b03169150600080876001600160a01b03168a6001600160a01b0316146132a85782846132ab565b83835b915091506132df828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040161128d9190614046565b95506132ec8683836128d7565b945050505050600080856001600160a01b0316886001600160a01b0316146133165782600061331a565b6000835b91509150600060028c51038a10613331578a613365565b6133657f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f15898e8d60020181518110612d0b57fe5b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f906133a79086908690869060248101614698565b600060405180830381600087803b1580156133c157600080fd5b505af11580156133d5573d6000803e3d6000fd5b50506001909b019a5061317b9950505050505050505050565b8082038281111561091a5760405162461bcd60e51b815260040161051d90614171565b60008084116134325760405162461bcd60e51b815260040161051d90614273565b6000831180156134425750600082115b61345e5760405162461bcd60e51b815260040161051d906143e6565b6000613482612710613476868863ffffffff6137e616565b9063ffffffff6137e616565b9050600061349c6126ec613476868963ffffffff6133ee16565b9050612b3260018284816134ac57fe5b049063ffffffff61381d16565b60008084116134da5760405162461bcd60e51b815260040161051d9061445b565b6000831180156134ea5750600082115b6135065760405162461bcd60e51b815260040161051d906143e6565b82613517858463ffffffff6137e616565b8161351e57fe5b04949350505050565b600080826001600160a01b0316846001600160a01b0316141561355c5760405162461bcd60e51b815260040161051d906142ed565b826001600160a01b0316846001600160a01b03161061357c57828461357f565b83835b90925090506001600160a01b0382166135aa5760405162461bcd60e51b815260040161051d906145bb565b9250929050565b60405163e6a4390560e01b8152600090819081907f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f156001600160a01b03169063e6a4390590613606908c908c906004016140bf565b60206040518083038186803b15801561361e57600080fd5b505afa158015613632573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061365691906139b1565b6001600160a01b03161415613707576040516364e329cb60e11b81526001600160a01b037f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f15169063c9c65396906136b3908b908b906004016140bf565b602060405180830381600087803b1580156136cd57600080fd5b505af11580156136e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061370591906139b1565b505b6000806137357f000000000000000000000000dbcb35859c27dade56256c62d547405402a08f158b8b613840565b91509150816000148015613747575080155b15613757578793508692506137d9565b60006137648984846134b9565b9050878111613798578581101561378d5760405162461bcd60e51b815260040161051d90614332565b8894509250826137d7565b60006137a58984866134b9565b9050898111156137b157fe5b878110156137d15760405162461bcd60e51b815260040161051d906144e7565b94508793505b505b5050965096945050505050565b6000811580613801575050808202828282816137fe57fe5b04145b61091a5760405162461bcd60e51b815260040161051d9061420e565b8082018281101561091a5760405162461bcd60e51b815260040161051d906142bf565b600080600061384f8585613527565b509050600080613860888888612aa0565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561389857600080fd5b505afa1580156138ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138d09190613de3565b506001600160701b031691506001600160701b03169150826001600160a01b0316876001600160a01b03161461390757808261390a565b81815b90999098509650505050505050565b803561091a81614751565b60008083601f840112613935578182fd5b50813567ffffffffffffffff81111561394c578182fd5b60208301915083602080830285010111156135aa57600080fd5b600060808284031215613977578081fd5b50919050565b803560ff8116811461091a57600080fd5b60006020828403121561399f578081fd5b81356139aa81614751565b9392505050565b6000602082840312156139c2578081fd5b81516139aa81614751565b600080600080600080600060e0888a0312156139e7578283fd5b87356139f281614751565b96506020880135613a0281614751565b955060408801359450606088013593506080880135925060a0880135613a2781614751565b8092505060c0880135905092959891949750929550565b60008060008060008060008060008060006101608c8e031215613a5f578384fd5b8b35613a6a81614751565b9a5060208c0135613a7a81614751565b995060408c0135985060608c0135975060808c0135965060a08c0135613a9f81614751565b955060c08c0135945060e08c0135613ab681614769565b9350613ac68d6101008e0161397d565b92506101208c013591506101408c013590509295989b509295989b9093969950565b600080600080600080600080610100898b031215613b04578384fd5b8835613b0f81614751565b97506020890135613b1f81614751565b965060408901359550606089013594506080890135935060a0890135925060c0890135613b4b81614751565b8092505060e089013590509295985092959890939650565b60008060008060008060008060006101808a8c031215613b81578283fd5b8935613b8c81614751565b985060208a0135613b9c81614751565b975060408a0135965060608a0135955060808a0135945060a08a0135935060c08a0135613bc881614751565b925060e08a01359150613bdf8b6101008c01613966565b90509295985092959850929598565b60008060008060008060c08789031215613c06578384fd5b8635613c1181614751565b95506020870135945060408701359350606087013592506080870135613c3681614751565b8092505060a087013590509295509295509295565b6000806000806000806000806000806101408b8d031215613c6a578384fd5b8a35613c7581614751565b995060208b0135985060408b0135975060608b0135965060808b0135613c9a81614751565b955060a08b0135945060c08b0135613cb181614769565b9350613cc08c60e08d0161397d565b92506101008b013591506101208b013590509295989b9194979a5092959850565b6000806000806000806000610140888a031215613cfc578081fd5b8735613d0781614751565b96506020880135955060408801359450606088013593506080880135613d2c81614751565b925060a08801359150613d428960c08a01613966565b905092959891949750929550565b600060208284031215613d61578081fd5b81516139aa81614769565b600060808284031215613d7d578081fd5b613d8760806146fe565b8235613d9281614769565b81526020830135613da281614769565b6020820152604083013561ffff81168114613dbb578283fd5b6040820152606083013564ffffffffff81168114613dd7578283fd5b60608201529392505050565b600080600060608486031215613df7578081fd5b8351613e0281614777565b6020850151909350613e1381614777565b604085015190925063ffffffff81168114613e2c578182fd5b809150509250925092565b600060208284031215613e48578081fd5b5051919050565b600080600080600060808688031215613e66578283fd5b85359450602086013567ffffffffffffffff811115613e83578384fd5b613e8f88828901613924565b9095509350506040860135613ea381614751565b949793965091946060013592915050565b60008060408385031215613ec6578182fd5b8235915060208084013567ffffffffffffffff80821115613ee5578384fd5b81860187601f820112613ef6578485fd5b8035925081831115613f06578485fd5b8383029150613f168483016146fe565b8381528481019082860184840187018b1015613f30578788fd5b8794505b85851015613f5a57613f468b82613919565b835260019490940193918601918601613f34565b508096505050505050509250929050565b60008060408385031215613f7d578182fd5b505080516020909101519092909150565b60008060008060008060a08789031215613fa6578384fd5b8635955060208701359450604087013567ffffffffffffffff811115613fca578485fd5b613fd689828a01613924565b9095509350506060870135613fea81614751565b80925050608087013590509295509295509295565b600080600060608486031215614013578081fd5b505081359360208301359350604090920135919050565b6000825161403c818460208701614725565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039586168152939094166020840152901515604083015261ffff16606082015264ffffffffff909116608082015260a00190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b8181101561416557835183529284019291840191600101614149565b50909695505050505050565b60208082526015908201527464732d6d6174682d7375622d756e646572666c6f7760581b604082015260600190565b6020808252601f908201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604082015260600190565b60208082526018908201527f556e69737761705632526f757465723a20455850495245440000000000000000604082015260600190565b60208082526014908201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604082015260600190565b60208082526017908201527f63616e2774206465706c6f792061206e657720706f6f6c000000000000000000604082015260600190565b6020808252602c908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4f60408201526b155514155517d05353d5539560a21b606082015260800190565b60208082526014908201527364732d6d6174682d6164642d6f766572666c6f7760601b604082015260600190565b60208082526025908201527f556e697377617056324c6962726172793a204944454e544943414c5f41444452604082015264455353455360d81b606082015260800190565b60208082526026908201527f556e69737761705632526f757465723a20494e53554646494349454e545f425f604082015265105353d5539560d21b606082015260800190565b6020808252601d908201527f556e69737761705632526f757465723a20494e56414c49445f50415448000000604082015260600190565b6020808252601e908201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604082015260600190565b60208082526028908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4c604082015267495155494449545960c01b606082015260800190565b602080825260139082015272706f6f6c20616c72656164792065786973747360681b604082015260600190565b60208082526025908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f416040820152641353d5539560da1b606082015260800190565b60208082526027908201527f556e69737761705632526f757465723a204558434553534956455f494e50555460408201526617d05353d5539560ca1b606082015260800190565b60208082526026908201527f556e69737761705632526f757465723a20494e53554646494349454e545f415f604082015265105353d5539560d21b606082015260800190565b60208082526023908201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960408201526213115160ea1b606082015260800190565b6020808252602b908201527f556e69737761705632526f757465723a20494e53554646494349454e545f4f5560408201526a1514155517d05353d5539560aa1b606082015260800190565b6020808252601e908201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604082015260600190565b60208082526024908201527f5472616e7366657248656c7065723a205452414e534645525f46524f4d5f46416040820152631253115160e21b606082015260800190565b6020808252602b908201527f556e697377617056324c6962726172793a20494e53554646494349454e545f4960408201526a1394155517d05353d5539560aa1b606082015260800190565b90815260200190565b918252602082015260400190565b600085825284602083015260018060a01b03841660408301526080606083015282518060808401526146d18160a0850160208701614725565b601f01601f19169190910160a00195945050505050565b9283526020830191909152604082015260600190565b60405181810167ffffffffffffffff8111828210171561471d57600080fd5b604052919050565b60005b83811015614740578181015183820152602001614728565b83811115612de75750506000910152565b6001600160a01b038116811461476657600080fd5b50565b801515811461476657600080fd5b6001600160701b038116811461476657600080fdfea264697066735822122019de977653d2888829ef01f0706abaab007587b253c64104375796d806b2464b64736f6c63430006060033

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

000000000000000000000000dbcb35859c27dade56256c62d547405402a08f15000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2

-----Decoded View---------------
Arg [0] : factory (address): 0xdBcb35859C27DadE56256C62D547405402a08F15
Arg [1] : WETH (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2

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