Contract

0xbfE77A62A1B37bF5897f04A9cd087486BF282c18

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

-

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Add Liquidity17824072024-12-27 23:21:4635 hrs ago1735341706IN
0xbfE77A62...6BF282c18
0 S0.000442721.1
Add Liquidity16432212024-12-26 10:31:573 days ago1735209117IN
0xbfE77A62...6BF282c18
0 S0.00050771.1
Add Liquidity16395742024-12-26 9:43:093 days ago1735206189IN
0xbfE77A62...6BF282c18
0 S0.000441361.11
Add Liquidity16279242024-12-26 6:58:243 days ago1735196304IN
0xbfE77A62...6BF282c18
0 S0.000366941.1
Add Liquidity15501292024-12-25 10:51:003 days ago1735123860IN
0xbfE77A62...6BF282c18
0 S0.004375841.1
Add Liquidity15497502024-12-25 10:45:003 days ago1735123500IN
0xbfE77A62...6BF282c18
0 S0.004373281.1
Add Liquidity15398582024-12-25 7:46:364 days ago1735112796IN
0xbfE77A62...6BF282c18
0 S0.004380871.1
Add Liquidity ET...13540142024-12-23 15:29:155 days ago1734967755IN
0xbfE77A62...6BF282c18
0.01 S0.004443561.1

Latest 1 internal transaction

Parent Transaction Hash Block From To
13540142024-12-23 15:29:155 days ago1734967755
0xbfE77A62...6BF282c18
0.01 S
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RouterV2

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 1 : RouterV2.sol
/**
 *Submitted for verification at FtmScan.com on 2022-02-20
*/

// SPDX-License-Identifier: MIT
// ftm.guru's extension of Solidly's periphery (Router)
// https://github.com/andrecronje/solidly/blob/master/contracts/BaseV1-periphery.sol
// BaseV1Router02.sol : Supporting Fee-on-transfer Tokens
// https://github.com/ftm1337/solidly-with-FoT/blob/master/contracts/BaseV1-periphery.sol

pragma solidity 0.8.13;


interface IBaseV1Factory {
    function allPairsLength() external view returns (uint);
    function isPair(address pair) external view returns (bool);
    function pairCodeHash() external pure returns (bytes32);
    function getPair(address tokenA, address token, bool stable) external view returns (address);
    function createPair(address tokenA, address tokenB, bool stable) external returns (address pair);
}

interface IBaseV1Pair {
    function transferFrom(address src, address dst, uint amount) external returns (bool);
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function burn(address to) external returns (uint amount0, uint amount1);
    function mint(address to) external returns (uint liquidity);
    function getReserves() external view returns (uint _reserve0, uint _reserve1, uint _blockTimestampLast);
    function getAmountOut(uint, address) external view returns (uint);
}

interface erc20 {
    function totalSupply() external view returns (uint256);
    function transfer(address recipient, uint amount) external returns (bool);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function balanceOf(address) external view returns (uint);
    function transferFrom(address sender, address recipient, uint amount) external returns (bool);
    function approve(address spender, uint value) external returns (bool);
}

interface IPairFactory {
    function getFee(bool _stable) external view returns(uint256);
    function MAX_REFERRAL_FEE() external view returns(uint256);
}


library Math {
    function min(uint a, uint b) internal pure returns (uint) {
        return a < b ? a : b;
    }
    function sqrt(uint y) internal pure returns (uint z) {
        if (y > 3) {
            z = y;
            uint x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
    function sub(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x, 'Math: Sub-underflow');
    }
}

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

// Experimental Extension [ftm.guru/solidly/BaseV1Router02]
// contract BaseV1Router02 is BaseV1Router01
// with Support for Fee-on-Transfer Tokens
contract RouterV2 {

	using Math for uint;

    struct route {
        address from;
        address to;
        bool stable;
    }

    address public immutable factory;
    IWETH public immutable wETH;
    uint internal constant MINIMUM_LIQUIDITY = 10**3;
    bytes32 immutable pairCodeHash;

    
    // swap event for the referral system
    event Swap(address indexed sender,uint amount0In,address _tokenIn, address indexed to, bool stable);  

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

    constructor(address _factory, address _wETH) {
        factory = _factory;
        pairCodeHash = IBaseV1Factory(_factory).pairCodeHash();
        wETH = IWETH(_wETH);
    }

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

    function sortTokens(address tokenA, address tokenB) public pure returns (address token0, address token1) {
        require(tokenA != tokenB, 'BaseV1Router: IDENTICAL_ADDRESSES');
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), 'BaseV1Router: ZERO_ADDRESS');
    }

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

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

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

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountOut(uint amountIn, address tokenIn, address tokenOut) public view returns (uint amount, bool stable) {
        address pair = pairFor(tokenIn, tokenOut, true);
        uint amountStable;
        uint amountVolatile;
        if (IBaseV1Factory(factory).isPair(pair)) {
            amountStable = IBaseV1Pair(pair).getAmountOut(amountIn, tokenIn);
        }
        pair = pairFor(tokenIn, tokenOut, false);
        if (IBaseV1Factory(factory).isPair(pair)) {
            amountVolatile = IBaseV1Pair(pair).getAmountOut(amountIn, tokenIn);
        }
        return amountStable > amountVolatile ? (amountStable, true) : (amountVolatile, false);
    }

    // performs chained getAmountOut calculations on any number of pairs
    function getAmountsOut(uint amountIn, route[] memory routes) public view returns (uint[] memory amounts) {
        require(routes.length >= 1, 'BaseV1Router: INVALID_PATH');
        amounts = new uint[](routes.length+1);
        amounts[0] = amountIn;
        for (uint i = 0; i < routes.length; i++) {
            address pair = pairFor(routes[i].from, routes[i].to, routes[i].stable);
            if (IBaseV1Factory(factory).isPair(pair)) {
                amounts[i+1] = IBaseV1Pair(pair).getAmountOut(amounts[i], routes[i].from);
            }
        }
    }

    function isPair(address pair) external view returns (bool) {
        return IBaseV1Factory(factory).isPair(pair);
    }


    function quoteAddLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired
    ) external view returns (uint amountA, uint amountB, uint liquidity) {
        // create the pair if it doesn't exist yet
        address _pair = IBaseV1Factory(factory).getPair(tokenA, tokenB, stable);
        (uint reserveA, uint reserveB) = (0,0);
        uint _totalSupply = 0;
        if (_pair != address(0)) {
            _totalSupply = erc20(_pair).totalSupply();
            (reserveA, reserveB) = getReserves(tokenA, tokenB, stable);
        }
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
            liquidity = Math.sqrt(amountA * amountB) - MINIMUM_LIQUIDITY;
        } else {

            uint amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                (amountA, amountB) = (amountADesired, amountBOptimal);
                liquidity = Math.min(amountA * _totalSupply / reserveA, amountB * _totalSupply / reserveB);
            } else {
                uint amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA);
                (amountA, amountB) = (amountAOptimal, amountBDesired);
                liquidity = Math.min(amountA * _totalSupply / reserveA, amountB * _totalSupply / reserveB);
            }
        }
    }

    function quoteRemoveLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint liquidity
    ) external view returns (uint amountA, uint amountB) {
        // create the pair if it doesn't exist yet
        address _pair = IBaseV1Factory(factory).getPair(tokenA, tokenB, stable);

        if (_pair == address(0)) {
            return (0,0);
        }

        (uint reserveA, uint reserveB) = getReserves(tokenA, tokenB, stable);
        uint _totalSupply = erc20(_pair).totalSupply();

        amountA = liquidity * reserveA / _totalSupply; // using balances ensures pro-rata distribution
        amountB = liquidity * reserveB / _totalSupply; // using balances ensures pro-rata distribution

    }

    function _addLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin
    ) internal returns (uint amountA, uint amountB) {
        require(amountADesired >= amountAMin);
        require(amountBDesired >= amountBMin);
        // create the pair if it doesn't exist yet
        address _pair = IBaseV1Factory(factory).getPair(tokenA, tokenB, stable);
        if (_pair == address(0)) {
            _pair = IBaseV1Factory(factory).createPair(tokenA, tokenB, stable);
        }
        (uint reserveA, uint reserveB) = getReserves(tokenA, tokenB, stable);
        if (reserveA == 0 && reserveB == 0) {
            (amountA, amountB) = (amountADesired, amountBDesired);
        } else {
            uint amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB);
            if (amountBOptimal <= amountBDesired) {
                require(amountBOptimal >= amountBMin, 'BaseV1Router: INSUFFICIENT_B_AMOUNT');
                (amountA, amountB) = (amountADesired, amountBOptimal);
            } else {
                uint amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA);
                assert(amountAOptimal <= amountADesired);
                require(amountAOptimal >= amountAMin, 'BaseV1Router: INSUFFICIENT_A_AMOUNT');
                (amountA, amountB) = (amountAOptimal, amountBDesired);
            }
        }
    }

    function addLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
        (amountA, amountB) = _addLiquidity(tokenA, tokenB, stable, amountADesired, amountBDesired, amountAMin, amountBMin);
        address pair = pairFor(tokenA, tokenB, stable);
        _safeTransferFrom(tokenA, msg.sender, pair, amountA);
        _safeTransferFrom(tokenB, msg.sender, pair, amountB);
        liquidity = IBaseV1Pair(pair).mint(to);
    }

    function addLiquidityETH(
        address token,
        bool stable,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) {
        (amountToken, amountETH) = _addLiquidity(
            token,
            address(wETH),
            stable,
            amountTokenDesired,
            msg.value,
            amountTokenMin,
            amountETHMin
        );
        address pair = pairFor(token, address(wETH), stable);
        _safeTransferFrom(token, msg.sender, pair, amountToken);
        wETH.deposit{value: amountETH}();
        assert(wETH.transfer(pair, amountETH));
        liquidity = IBaseV1Pair(pair).mint(to);
        // refund dust ETH, if any
        if (msg.value > amountETH) _safeTransferETH(msg.sender, msg.value - amountETH);
    }

    // **** REMOVE LIQUIDITY ****
    function removeLiquidity(
        address tokenA,
        address tokenB,
        bool stable,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public ensure(deadline) returns (uint amountA, uint amountB) {
        address pair = pairFor(tokenA, tokenB, stable);
        require(IBaseV1Pair(pair).transferFrom(msg.sender, pair, liquidity)); // send liquidity to pair
        (uint amount0, uint amount1) = IBaseV1Pair(pair).burn(to);
        (address token0,) = sortTokens(tokenA, tokenB);
        (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
        require(amountA >= amountAMin, 'BaseV1Router: INSUFFICIENT_A_AMOUNT');
        require(amountB >= amountBMin, 'BaseV1Router: INSUFFICIENT_B_AMOUNT');
    }

    function removeLiquidityETH(
        address token,
        bool stable,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public ensure(deadline) returns (uint amountToken, uint amountETH) {
        (amountToken, amountETH) = removeLiquidity(
            token,
            address(wETH),
            stable,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        _safeTransfer(token, to, amountToken);
        wETH.withdraw(amountETH);
        _safeTransferETH(to, amountETH);
    }

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        bool stable,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB) {
        address pair = pairFor(tokenA, tokenB, stable);
        {
            uint value = approveMax ? type(uint).max : liquidity;
            IBaseV1Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        }

        (amountA, amountB) = removeLiquidity(tokenA, tokenB, stable, liquidity, amountAMin, amountBMin, to, deadline);
    }

    function removeLiquidityETHWithPermit(
        address token,
        bool stable,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH) {
        address pair = pairFor(token, address(wETH), stable);
        uint value = approveMax ? type(uint).max : liquidity;
        IBaseV1Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETH(token, stable, liquidity, amountTokenMin, amountETHMin, to, deadline);
    }

    // **** SWAP ****
    // requires the initial amount to have already been sent to the first pair
    function _swap(uint[] memory amounts, route[] memory routes, address _to) internal virtual {
        for (uint i = 0; i < routes.length; i++) {
            (address token0,) = sortTokens(routes[i].from, routes[i].to);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = routes[i].from == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < routes.length - 1 ? pairFor(routes[i+1].from, routes[i+1].to, routes[i+1].stable) : _to;
            IBaseV1Pair(pairFor(routes[i].from, routes[i].to, routes[i].stable)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );

            emit Swap(msg.sender,amounts[i],routes[i].from, _to, routes[i].stable); 
        }
    }

    function swapExactTokensForTokensSimple(
        uint amountIn,
        uint amountOutMin,
        address tokenFrom,
        address tokenTo,
        bool stable,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint[] memory amounts) {
        route[] memory routes = new route[](1);
        routes[0].from = tokenFrom;
        routes[0].to = tokenTo;
        routes[0].stable = stable;
        amounts = getAmountsOut(amountIn, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, 'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
        _safeTransferFrom(
            routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
        );
        _swap(amounts, routes, to);
    }

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        route[] calldata routes,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint[] memory amounts) {
        amounts = getAmountsOut(amountIn, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, 'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
        _safeTransferFrom(
            routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
        );
        _swap(amounts, routes, to);
    }

    function swapExactETHForTokens(uint amountOutMin, route[] calldata routes, address to, uint deadline) external payable ensure(deadline) returns (uint[] memory amounts) {
        require(routes[0].from == address(wETH), 'BaseV1Router: INVALID_PATH');
        amounts = getAmountsOut(msg.value, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, 'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
        wETH.deposit{value: amounts[0]}();
        assert(wETH.transfer(pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]));
        _swap(amounts, routes, to);
    }

    function swapExactTokensForETH(uint amountIn, uint amountOutMin, route[] calldata routes, address to, uint deadline)
    external
    ensure(deadline)
    returns (uint[] memory amounts)
    {
        require(routes[routes.length - 1].to == address(wETH), 'BaseV1Router: INVALID_PATH');
        amounts = getAmountsOut(amountIn, routes);
        require(amounts[amounts.length - 1] >= amountOutMin, 'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
        _safeTransferFrom(
            routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]
        );
        _swap(amounts, routes, address(this));
        wETH.withdraw(amounts[amounts.length - 1]);
        _safeTransferETH(to, amounts[amounts.length - 1]);
    }

    function UNSAFE_swapExactTokensForTokens(
        uint[] memory amounts,
        route[] calldata routes,
        address to,
        uint deadline
    ) external ensure(deadline) returns (uint[] memory) {
        _safeTransferFrom(routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]);
        _swap(amounts, routes, to);
        return amounts;
    }

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

    function _safeTransfer(address token, address to, uint256 value) internal {
        require(token.code.length > 0);
        (bool success, bytes memory data) =
        token.call(abi.encodeWithSelector(erc20.transfer.selector, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))));
    }

    function _safeTransferFrom(address token, address from, address to, uint256 value) internal {
        require(token.code.length > 0);
        (bool success, bytes memory data) =
        token.call(abi.encodeWithSelector(erc20.transferFrom.selector, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))));
    }

    // Experimental Extension [ETH.guru/solidly/BaseV1Router02]

    // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens)****
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        bool stable,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) public ensure(deadline) returns (uint amountToken, uint amountETH) {
        (amountToken, amountETH) = removeLiquidity(
            token,
            address(wETH),
            stable,
            liquidity,
            amountTokenMin,
            amountETHMin,
            address(this),
            deadline
        );
        _safeTransfer(token, to, erc20(token).balanceOf(address(this)));
        wETH.withdraw(amountETH);
        _safeTransferETH(to, amountETH);
    }
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        bool stable,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH) {
        address pair = pairFor(token, address(wETH), stable);
        uint value = approveMax ? type(uint).max : liquidity;
        IBaseV1Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
        (amountToken, amountETH) = removeLiquidityETHSupportingFeeOnTransferTokens(
            token, stable, liquidity, amountTokenMin, amountETHMin, to, deadline
        );
    }
    
    // **** SWAP (supporting fee-on-transfer tokens) ****
    // requires the initial amount to have already been sent to the first pair
    function _swapSupportingFeeOnTransferTokens(route[] calldata routes, address _to) internal virtual {
        for (uint i; i < routes.length; i++) {
        	(address input, address output) = (routes[i].from, routes[i].to);
            (address token0,) = sortTokens(input, output);
            IBaseV1Pair pair = IBaseV1Pair(pairFor(routes[i].from, routes[i].to, routes[i].stable));
            uint amountInput;
            uint amountOutput;
            { // scope to avoid stack too deep errors
            (uint reserve0, uint reserve1,) = pair.getReserves();
            (uint reserveInput,) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
            amountInput = erc20(input).balanceOf(address(pair)).sub(reserveInput);
            (amountOutput,) = getAmountOut(amountInput, input, output);
            }
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0));
            address to = i < routes.length - 1 ? pairFor(routes[i+1].from, routes[i+1].to, routes[i+1].stable) : _to;
            pair.swap(amount0Out, amount1Out, to, new bytes(0));

            bool _stable = routes[i].stable;
            emit Swap(msg.sender,amountInput,input,_to,_stable);  
        }
    }
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        route[] calldata routes,
        address to,
        uint deadline
    ) external ensure(deadline) {
        _safeTransferFrom(
        	routes[0].from,
        	msg.sender,
        	pairFor(routes[0].from, routes[0].to, routes[0].stable),
        	amountIn
        );
        uint balanceBefore = erc20(routes[routes.length - 1].to).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(routes, to);
        require(
            erc20(routes[routes.length - 1].to).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        route[] calldata routes,
        address to,
        uint deadline
    )
        external
        payable
        ensure(deadline)
    {
        require(routes[0].from == address(wETH), 'BaseV1Router: INVALID_PATH');
        uint amountIn = msg.value;
        wETH.deposit{value: amountIn}();
        assert(wETH.transfer(pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn));
        uint balanceBefore = erc20(routes[routes.length - 1].to).balanceOf(to);
        _swapSupportingFeeOnTransferTokens(routes, to);
        require(
            erc20(routes[routes.length - 1].to).balanceOf(to).sub(balanceBefore) >= amountOutMin,
            'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT'
        );
    }
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        route[] calldata routes,
        address to,
        uint deadline
    )
        external
        ensure(deadline)
    {
        require(routes[routes.length - 1].to == address(wETH), 'BaseV1Router: INVALID_PATH');
        _safeTransferFrom(
            routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn
        );
        _swapSupportingFeeOnTransferTokens(routes, address(this));
        uint amountOut = erc20(address(wETH)).balanceOf(address(this));
        require(amountOut >= amountOutMin, 'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT');
        wETH.withdraw(amountOut);
        _safeTransferETH(to, amountOut);
    }
}

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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"address","name":"_tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bool","name":"stable","type":"bool"}],"name":"Swap","type":"event"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"UNSAFE_swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"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":"bool","name":"stable","type":"bool"},{"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":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"pairFor","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"}],"name":"quoteAddLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"quoteRemoveLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"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":"bool","name":"stable","type":"bool"},{"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":"bool","name":"stable","type":"bool"},{"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":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"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":"bool","name":"stable","type":"bool"},{"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":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"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":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"sortTokens","outputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"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"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"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"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"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"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"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"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"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":"tokenFrom","type":"address"},{"internalType":"address","name":"tokenTo","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSimple","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wETH","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e06040523480156200001157600080fd5b50604051620047ec380380620047ec8339810160408190526200003491620000d8565b6001600160a01b038216608081905260408051631355724960e31b81529051639aab9248916004808201926020929091908290030181865afa1580156200007f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000a5919062000110565b60c0526001600160a01b031660a052506200012a565b80516001600160a01b0381168114620000d357600080fd5b919050565b60008060408385031215620000ec57600080fd5b620000f783620000bb565b91506200010760208401620000bb565b90509250929050565b6000602082840312156200012357600080fd5b5051919050565b60805160a05160c0516145c06200022c6000396000610f8301526000818161019501528181610547015281816109a301528181610be201528181610e330152818161150d01528181611620015281816116ae01528181611b2d01528181611bab01528181611c1f01528181611e2201528181611ed501528181611f80015281816125570152818161258d015281816125c20152818161265701528181612796015281816127e60152818161286c0152612b040152600081816104a301528181610cc801528181610f480152818161121401528181611328015281816121040152818161227801528181612942015281816130b8015261315901526145c06000f3fe6080604052600436106101855760003560e01c806376c72751116100d1578063c45a01551161008a578063e5e31b1311610064578063e5e31b1314610505578063f242862114610535578063f41766d814610569578063fe411f141461058957600080fd5b8063c45a015514610491578063d7b0e0a5146104c5578063e2d9d4dc146104e557600080fd5b806376c72751146103eb5780637af728c8146103fe5780639881fcb41461041e57806398a0fb3c1461043e578063a32b1fcd1461045e578063b7e0d4c01461047e57600080fd5b8063544caa561161013e5780635e60dab5116101185780635e60dab51461037857806367ffb66a146103985780636cc1ae13146103ab5780637301e3c8146103cb57600080fd5b8063544caa56146102c85780635a47ddc3146103085780635e1e63251461034357600080fd5b80630dede6c4146101c957806313dcfc591461020357806318a13086146102305780634386e63c14610250578063448725b4146102705780634c1ee03e1461029057600080fd5b366101c457336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101c2576101c26138e4565b005b600080fd5b3480156101d557600080fd5b506101e96101e436600461392b565b6105a9565b604080519283526020830191909152015b60405180910390f35b34801561020f57600080fd5b5061022361021e3660046139b0565b610763565b6040516101fa9190613a2b565b34801561023c57600080fd5b5061022361024b366004613ab4565b610976565b34801561025c57600080fd5b506101e961026b366004613b27565b610cc1565b34801561027c57600080fd5b506101e961028b366004613b89565b610e28565b34801561029c57600080fd5b506102b06102ab366004613c33565b610f01565b6040516001600160a01b0390911681526020016101fa565b3480156102d457600080fd5b506102e86102e3366004613c7e565b611009565b604080516001600160a01b039384168152929091166020830152016101fa565b34801561031457600080fd5b50610328610323366004613cb7565b6110fc565b604080519384526020840192909252908201526060016101fa565b34801561034f57600080fd5b5061036361035e366004613d46565b6111dc565b604080519283529015156020830152016101fa565b34801561038457600080fd5b506101e9610393366004613c33565b611430565b6102236103a6366004613d7d565b6114e8565b3480156103b757600080fd5b506101c26103c6366004613ab4565b611847565b3480156103d757600080fd5b506102236103e6366004613e4f565b611a34565b6101c26103f9366004613d7d565b611b0a565b34801561040a57600080fd5b506101c2610419366004613ab4565b611df7565b34801561042a57600080fd5b50610223610439366004613f91565b611fee565b34801561044a57600080fd5b50610328610459366004614037565b612270565b34801561046a57600080fd5b506101e9610479366004614092565b612470565b61032861048c36600461414e565b61252b565b34801561049d57600080fd5b506102b07f000000000000000000000000000000000000000000000000000000000000000081565b3480156104d157600080fd5b506101e96104e036600461414e565b61276c565b3480156104f157600080fd5b506101e9610500366004613b89565b612861565b34801561051157600080fd5b506105256105203660046141a9565b612920565b60405190151581526020016101fa565b34801561054157600080fd5b506102b07f000000000000000000000000000000000000000000000000000000000000000081565b34801561057557600080fd5b50610223610584366004613ab4565b6129b5565b34801561059557600080fd5b506101e96105a436600461414e565b612ada565b60008082428110156105d65760405162461bcd60e51b81526004016105cd906141c6565b60405180910390fd5b60006105e38c8c8c610f01565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af1158015610639573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065d91906141f5565b61066657600080fd5b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af11580156106b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d69190614212565b9150915060006106e68f8f611009565b509050806001600160a01b03168f6001600160a01b03161461070957818361070c565b82825b90975095508a8710156107315760405162461bcd60e51b81526004016105cd90614236565b898610156107515760405162461bcd60e51b81526004016105cd90614279565b50505050509850989650505050505050565b606081428110156107865760405162461bcd60e51b81526004016105cd906141c6565b604080516001808252818301909252600091816020015b604080516060810182526000808252602080830182905292820152825260001990920191018161079d57905050905087816000815181106107e0576107e06142bc565b6020026020010151600001906001600160a01b031690816001600160a01b0316815250508681600081518110610818576108186142bc565b6020026020010151602001906001600160a01b031690816001600160a01b0316815250508581600081518110610850576108506142bc565b602090810291909101015190151560409091015261086e8a82611fee565b925088836001855161088091906142e8565b81518110610890576108906142bc565b602002602001015110156108b65760405162461bcd60e51b81526004016105cd906142ff565b61095e816000815181106108cc576108cc6142bc565b6020026020010151600001513361093e846000815181106108ef576108ef6142bc565b6020026020010151600001518560008151811061090e5761090e6142bc565b6020026020010151602001518660008151811061092d5761092d6142bc565b602002602001015160400151610f01565b86600081518110610951576109516142bc565b6020026020010151612ba8565b610969838287612ca0565b5050979650505050505050565b606081428110156109995760405162461bcd60e51b81526004016105cd906141c6565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866109d06001826142e8565b8181106109df576109df6142bc565b90506060020160200160208101906109f791906141a9565b6001600160a01b031614610a1d5760405162461bcd60e51b81526004016105cd90614347565b610a79888787808060200260200160405190810160405280939291908181526020016000905b82821015610a6f57610a606060830286013681900381019061437e565b81526020019060010190610a43565b5050505050611fee565b9150868260018451610a8b91906142e8565b81518110610a9b57610a9b6142bc565b60200260200101511015610ac15760405162461bcd60e51b81526004016105cd906142ff565b610b8386866000818110610ad757610ad76142bc565b610aed92602060609092020190810191506141a9565b33610b7089896000818110610b0457610b046142bc565b610b1a92602060609092020190810191506141a9565b8a8a6000818110610b2d57610b2d6142bc565b9050606002016020016020810190610b4591906141a9565b8b8b6000818110610b5857610b586142bc565b90506060020160400160208101906102ab919061439a565b85600081518110610951576109516142bc565b610be0828787808060200260200160405190810160405280939291908181526020016000905b82821015610bd557610bc66060830286013681900381019061437e565b81526020019060010190610ba9565b505050505030612ca0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551610c1e91906142e8565b81518110610c2e57610c2e6142bc565b60200260200101516040518263ffffffff1660e01b8152600401610c5491815260200190565b600060405180830381600087803b158015610c6e57600080fd5b505af1158015610c82573d6000803e3d6000fd5b50505050610cb6848360018551610c9991906142e8565b81518110610ca957610ca96142bc565b6020026020010151612fb3565b509695505050505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636801cc308888886040518463ffffffff1660e01b8152600401610d16939291906143b7565b602060405180830381865afa158015610d33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5791906143db565b90506001600160a01b038116610d74576000809250925050610e1f565b600080610d82898989611430565b915091506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dea91906143f8565b905080610df78489614411565b610e019190614430565b955080610e0e8389614411565b610e189190614430565b9450505050505b94509492505050565b6000806000610e588e7f00000000000000000000000000000000000000000000000000000000000000008f610f01565b9050600087610e67578c610e6b565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610ea6903390309086908f908e908e908e90600401614452565b600060405180830381600087803b158015610ec057600080fd5b505af1158015610ed4573d6000803e3d6000fd5b50505050610ee78f8f8f8f8f8f8f61276c565b809450819550505050509b509b9950505050505050505050565b6000806000610f108686611009565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015286151560f81b604882015291935091507f000000000000000000000000000000000000000000000000000000000000000090604901604051602081830303815290604052805190602001207f0000000000000000000000000000000000000000000000000000000000000000604051602001610fe7939291906001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b600080826001600160a01b0316846001600160a01b0316036110775760405162461bcd60e51b815260206004820152602160248201527f426173655631526f757465723a204944454e544943414c5f41444452455353456044820152605360f81b60648201526084016105cd565b826001600160a01b0316846001600160a01b03161061109757828461109a565b83835b90925090506001600160a01b0382166110f55760405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a205a45524f5f4144445245535300000000000060448201526064016105cd565b9250929050565b600080600083428110156111225760405162461bcd60e51b81526004016105cd906141c6565b6111318d8d8d8d8d8d8d613081565b909450925060006111438e8e8e610f01565b90506111518e338388612ba8565b61115d8d338387612ba8565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af11580156111a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c991906143f8565b9250505099509950999650505050505050565b60008060006111ed85856001610f01565b60405163e5e31b1360e01b81526001600160a01b03828116600483015291925060009182917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa15801561125d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128191906141f5565b156112fa576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa1580156112d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f791906143f8565b91505b61130687876000610f01565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529194507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa158015611371573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139591906141f5565b1561140e576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa1580156113e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140b91906143f8565b90505b80821161141d57806000611421565b8160015b94509450505050935093915050565b600080600061143f8686611009565b509050600080611450888888610f01565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561148d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b19190614493565b5091509150826001600160a01b0316886001600160a01b0316146114d65780826114d9565b81815b90999098509650505050505050565b6060814281101561150b5760405162461bcd60e51b81526004016105cd906141c6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611548576115486142bc565b61155e92602060609092020190810191506141a9565b6001600160a01b0316146115845760405162461bcd60e51b81526004016105cd90614347565b6115d6348787808060200260200160405190810160405280939291908181526020016000905b82821015610a6f576115c76060830286013681900381019061437e565b815260200190600101906115aa565b91508682600184516115e891906142e8565b815181106115f8576115f86142bc565b6020026020010151101561161e5760405162461bcd60e51b81526004016105cd906142ff565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611660576116606142bc565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561169357600080fd5b505af11580156116a7573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611745888860008181106116f1576116f16142bc565b61170792602060609092020190810191506141a9565b8989600081811061171a5761171a6142bc565b905060600201602001602081019061173291906141a9565b8a8a6000818110610b5857610b586142bc565b84600081518110611758576117586142bc565b60200260200101516040518363ffffffff1660e01b81526004016117919291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af11580156117b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d491906141f5565b6117e0576117e06138e4565b61183d828787808060200260200160405190810160405280939291908181526020016000905b82821015611832576118236060830286013681900381019061437e565b81526020019060010190611806565b505050505086612ca0565b5095945050505050565b80428110156118685760405162461bcd60e51b81526004016105cd906141c6565b6118b18585600081811061187e5761187e6142bc565b61189492602060609092020190810191506141a9565b336118ab888860008181106116f1576116f16142bc565b8a612ba8565b600085856118c06001826142e8565b8181106118cf576118cf6142bc565b90506060020160200160208101906118e791906141a9565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa15801561192f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195391906143f8565b905061196086868661329f565b86611a0c8288886119726001826142e8565b818110611981576119816142bc565b905060600201602001602081019061199991906141a9565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a08231906024015b602060405180830381865afa1580156119e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0691906143f8565b90613639565b1015611a2a5760405162461bcd60e51b81526004016105cd906142ff565b5050505050505050565b60608142811015611a575760405162461bcd60e51b81526004016105cd906141c6565b611aad86866000818110611a6d57611a6d6142bc565b611a8392602060609092020190810191506141a9565b33611a9a89896000818110610b0457610b046142bc565b8a600081518110610951576109516142bc565b611aff878787808060200260200160405190810160405280939291908181526020016000905b8282101561183257611af06060830286013681900381019061437e565b81526020019060010190611ad3565b509495945050505050565b8042811015611b2b5760405162461bcd60e51b81526004016105cd906141c6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685856000818110611b6857611b686142bc565b611b7e92602060609092020190810191506141a9565b6001600160a01b031614611ba45760405162461bcd60e51b81526004016105cd90614347565b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611c0457600080fd5b505af1158015611c18573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611c62888860008181106116f1576116f16142bc565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611caf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd391906141f5565b611cdf57611cdf6138e4565b60008686611cee6001826142e8565b818110611cfd57611cfd6142bc565b9050606002016020016020810190611d1591906141a9565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa158015611d5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8191906143f8565b9050611d8e87878761329f565b87611a0c828989611da06001826142e8565b818110611daf57611daf6142bc565b9050606002016020016020810190611dc791906141a9565b6040516370a0823160e01b81526001600160a01b038a8116600483015291909116906370a08231906024016119c5565b8042811015611e185760405162461bcd60e51b81526004016105cd906141c6565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585611e4f6001826142e8565b818110611e5e57611e5e6142bc565b9050606002016020016020810190611e7691906141a9565b6001600160a01b031614611e9c5760405162461bcd60e51b81526004016105cd90614347565b611eb28585600081811061187e5761187e6142bc565b611ebd85853061329f565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611f24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4891906143f8565b905086811015611f6a5760405162461bcd60e51b81526004016105cd906142ff565b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611fcc57600080fd5b505af1158015611fe0573d6000803e3d6000fd5b50505050611a2a8482612fb3565b60606001825110156120125760405162461bcd60e51b81526004016105cd90614347565b815161201f9060016144c1565b67ffffffffffffffff81111561203757612037613de4565b604051908082528060200260200182016040528015612060578160200160208202803683370190505b5090508281600081518110612077576120776142bc565b60200260200101818152505060005b82518110156122695760006120e28483815181106120a6576120a66142bc565b6020026020010151600001518584815181106120c4576120c46142bc565b60200260200101516020015186858151811061092d5761092d6142bc565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa15801561214d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217191906141f5565b1561225657806001600160a01b031663f140a35a848481518110612197576121976142bc565b60200260200101518685815181106121b1576121b16142bc565b6020026020010151600001516040518363ffffffff1660e01b81526004016121ec9291909182526001600160a01b0316602082015260400190565b602060405180830381865afa158015612209573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222d91906143f8565b836122398460016144c1565b81518110612249576122496142bc565b6020026020010181815250505b5080612261816144d9565b915050612086565b5092915050565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636801cc308a8a8a6040518463ffffffff1660e01b81526004016122c6939291906143b7565b602060405180830381865afa1580156122e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230791906143db565b9050600080806001600160a01b0384161561239157836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561235a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237e91906143f8565b905061238b8c8c8c611430565b90935091505b8215801561239d575081155b156123ce578896508795506103e86123bd6123b8888a614411565b61368d565b6123c791906142e8565b9450612461565b60006123db8a85856136fd565b90508881116124235789975095508561241c846123f8848b614411565b6124029190614430565b8461240d858b614411565b6124179190614430565b6137dd565b955061245f565b60006124308a85876136fd565b985089975088905061245b856124468584614411565b6124509190614430565b8561240d868c614411565b9650505b505b50505050955095509592505050565b60008060006124808f8f8f610f01565b905060008761248f578c612493565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf906124ce903390309086908f908e908e908e90600401614452565b600060405180830381600087803b1580156124e857600080fd5b505af11580156124fc573d6000803e3d6000fd5b50505050506125118f8f8f8f8f8f8f8f6105a9565b8093508194505050509c509c9a5050505050505050505050565b600080600083428110156125515760405162461bcd60e51b81526004016105cd906141c6565b6125808b7f00000000000000000000000000000000000000000000000000000000000000008c8c348d8d613081565b909450925060006125b28c7f00000000000000000000000000000000000000000000000000000000000000008d610f01565b90506125c08c338388612ba8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561261b57600080fd5b505af115801561262f573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af11580156126a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c891906141f5565b6126d4576126d46138e4565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af115801561271c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061274091906143f8565b92508334111561275d5761275d3361275886346142e8565b612fb3565b50509750975097945050505050565b60008082428110156127905760405162461bcd60e51b81526004016105cd906141c6565b6127c08a7f00000000000000000000000000000000000000000000000000000000000000008b8b8b8b308b6105a9565b90935091506127d08a86856137f5565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561283257600080fd5b505af1158015612846573d6000803e3d6000fd5b505050506128548583612fb3565b5097509795505050505050565b60008060006128918e7f00000000000000000000000000000000000000000000000000000000000000008f610f01565b90506000876128a0578c6128a4565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf906128df903390309086908f908e908e908e90600401614452565b600060405180830381600087803b1580156128f957600080fd5b505af115801561290d573d6000803e3d6000fd5b50505050610ee78f8f8f8f8f8f8f612ada565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa15801561298b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129af91906141f5565b92915050565b606081428110156129d85760405162461bcd60e51b81526004016105cd906141c6565b612a2a888787808060200260200160405190810160405280939291908181526020016000905b82821015610a6f57612a1b6060830286013681900381019061437e565b815260200190600101906129fe565b9150868260018451612a3c91906142e8565b81518110612a4c57612a4c6142bc565b60200260200101511015612a725760405162461bcd60e51b81526004016105cd906142ff565b612a8886866000818110610ad757610ad76142bc565b610cb6828787808060200260200160405190810160405280939291908181526020016000905b8282101561183257612acb6060830286013681900381019061437e565b81526020019060010190612aae565b6000808242811015612afe5760405162461bcd60e51b81526004016105cd906141c6565b612b2e8a7f00000000000000000000000000000000000000000000000000000000000000008b8b8b8b308b6105a9565b6040516370a0823160e01b815230600482015291945092506127d0908b9087906001600160a01b038316906370a0823190602401602060405180830381865afa158015612b7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba391906143f8565b6137f5565b6000846001600160a01b03163b11612bbf57600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691612c23919061451e565b6000604051808303816000865af19150503d8060008114612c60576040519150601f19603f3d011682016040523d82523d6000602084013e612c65565b606091505b5091509150818015612c8f575080511580612c8f575080806020019051810190612c8f91906141f5565b612c9857600080fd5b505050505050565b60005b8251811015612fad576000612cf2848381518110612cc357612cc36142bc565b602002602001015160000151858481518110612ce157612ce16142bc565b602002602001015160200151611009565b509050600085612d038460016144c1565b81518110612d1357612d136142bc565b60200260200101519050600080836001600160a01b0316878681518110612d3c57612d3c6142bc565b6020026020010151600001516001600160a01b031614612d5e57826000612d62565b6000835b91509150600060018851612d7691906142e8565b8610612d825786612df5565b612df588612d918860016144c1565b81518110612da157612da16142bc565b60200260200101516000015189886001612dbb91906144c1565b81518110612dcb57612dcb6142bc565b6020026020010151602001518a896001612de591906144c1565b8151811061092d5761092d6142bc565b9050612e48888781518110612e0c57612e0c6142bc565b602002602001015160000151898881518110612e2a57612e2a6142bc565b6020026020010151602001518a898151811061092d5761092d6142bc565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612e85576020820181803683370190505b506040518563ffffffff1660e01b8152600401612ea5949392919061453a565b600060405180830381600087803b158015612ebf57600080fd5b505af1158015612ed3573d6000803e3d6000fd5b50505050866001600160a01b0316336001600160a01b03167f423c093a1f80c354c75d4f9e86fde37d7c9014453df9643f585a1b199d094e508b8981518110612f1e57612f1e6142bc565b60200260200101518b8a81518110612f3857612f386142bc565b6020026020010151600001518c8b81518110612f5657612f566142bc565b602002602001015160400151604051612f8d939291909283526001600160a01b039190911660208301521515604082015260600190565b60405180910390a350505050508080612fa5906144d9565b915050612ca3565b50505050565b604080516000808252602082019092526001600160a01b038416908390604051612fdd919061451e565b60006040518083038185875af1925050503d806000811461301a576040519150601f19603f3d011682016040523d82523d6000602084013e61301f565b606091505b505090508061307c5760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b60648201526084016105cd565b505050565b6000808386101561309157600080fd5b8285101561309e57600080fd5b6040516306801cc360e41b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636801cc30906130f1908d908d908d906004016143b7565b602060405180830381865afa15801561310e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061313291906143db565b90506001600160a01b0381166131d8576040516320b7f73960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906382dfdce490613192908d908d908d906004016143b7565b6020604051808303816000875af11580156131b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131d591906143db565b90505b6000806131e68c8c8c611430565b915091508160001480156131f8575080155b1561320857889450879350613290565b60006132158a84846136fd565b9050888111613249578681101561323e5760405162461bcd60e51b81526004016105cd90614279565b89955093508361328e565b60006132568a84866136fd565b90508a811115613268576132686138e4565b888110156132885760405162461bcd60e51b81526004016105cd90614236565b95508894505b505b50505097509795505050505050565b60005b82811015612fad576000808585848181106132bf576132bf6142bc565b6132d592602060609092020190810191506141a9565b8686858181106132e7576132e76142bc565b90506060020160200160208101906132ff91906141a9565b91509150600061330f8383611009565b509050600061337b888887818110613329576133296142bc565b61333f92602060609092020190810191506141a9565b898988818110613351576133516142bc565b905060600201602001602081019061336991906141a9565b8a8a89818110610b5857610b586142bc565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156133c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e59190614493565b50915091506000866001600160a01b0316896001600160a01b03161461340c57818361340f565b82825b506040516370a0823160e01b81526001600160a01b038881166004830152919250613448918391908c16906370a08231906024016119c5565b9450613455858a8a6111dc565b5080945050505050600080856001600160a01b0316886001600160a01b03161461348157826000613485565b6000835b9092509050600061349760018d6142e8565b8a106134a3578a613528565b6135288d8d6134b38d60016144c1565b8181106134c2576134c26142bc565b6134d892602060609092020190810191506141a9565b8e8e6134e58e60016144c1565b8181106134f4576134f46142bc565b905060600201602001602081019061350c91906141a9565b8f8f6135198f60016144c1565b818110610b5857610b586142bc565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f9061356a908690869086906024810161453a565b600060405180830381600087803b15801561358457600080fd5b505af1158015613598573d6000803e3d6000fd5b5050505060008d8d8c8181106135b0576135b06142bc565b90506060020160400160208101906135c8919061439a565b604080518881526001600160a01b038d81166020830152831515828401529151929350908e169133917f423c093a1f80c354c75d4f9e86fde37d7c9014453df9643f585a1b199d094e50919081900360600190a3505050505050505050508080613631906144d9565b9150506132a2565b60008261364683826142e8565b91508111156129af5760405162461bcd60e51b81526020600482015260136024820152724d6174683a205375622d756e646572666c6f7760681b60448201526064016105cd565b600060038211156136ee57508060006136a7600283614430565b6136b29060016144c1565b90505b818110156136e8579050806002816136cd8186614430565b6136d791906144c1565b6136e19190614430565b90506136b5565b50919050565b81156136f8575060015b919050565b60008084116137585760405162461bcd60e51b815260206004820152602160248201527f426173655631526f757465723a20494e53554646494349454e545f414d4f554e6044820152601560fa1b60648201526084016105cd565b6000831180156137685750600082115b6137c05760405162461bcd60e51b8152602060048201526024808201527f426173655631526f757465723a20494e53554646494349454e545f4c495155496044820152634449545960e01b60648201526084016105cd565b826137cb8386614411565b6137d59190614430565b949350505050565b60008183106137ec57816137ee565b825b9392505050565b6000836001600160a01b03163b1161380c57600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691613868919061451e565b6000604051808303816000865af19150503d80600081146138a5576040519150601f19603f3d011682016040523d82523d6000602084013e6138aa565b606091505b50915091508180156138d45750805115806138d45750808060200190518101906138d491906141f5565b6138dd57600080fd5b5050505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b038116811461390f57600080fd5b50565b80356136f8816138fa565b801515811461390f57600080fd5b600080600080600080600080610100898b03121561394857600080fd5b8835613953816138fa565b97506020890135613963816138fa565b965060408901356139738161391d565b9550606089013594506080890135935060a0890135925060c0890135613998816138fa565b8092505060e089013590509295985092959890939650565b600080600080600080600060e0888a0312156139cb57600080fd5b873596506020880135955060408801356139e4816138fa565b945060608801356139f4816138fa565b93506080880135613a048161391d565b925060a0880135613a14816138fa565b8092505060c0880135905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b81811015613a6357835183529284019291840191600101613a47565b50909695505050505050565b60008083601f840112613a8157600080fd5b50813567ffffffffffffffff811115613a9957600080fd5b6020830191508360206060830285010111156110f557600080fd5b60008060008060008060a08789031215613acd57600080fd5b8635955060208701359450604087013567ffffffffffffffff811115613af257600080fd5b613afe89828a01613a6f565b9095509350506060870135613b12816138fa565b80925050608087013590509295509295509295565b60008060008060808587031215613b3d57600080fd5b8435613b48816138fa565b93506020850135613b58816138fa565b92506040850135613b688161391d565b9396929550929360600135925050565b803560ff811681146136f857600080fd5b60008060008060008060008060008060006101608c8e031215613bab57600080fd5b8b35613bb6816138fa565b9a5060208c0135613bc68161391d565b995060408c0135985060608c0135975060808c0135965060a08c0135613beb816138fa565b955060c08c0135945060e08c0135613c028161391d565b9350613c116101008d01613b78565b92506101208c013591506101408c013590509295989b509295989b9093969950565b600080600060608486031215613c4857600080fd5b8335613c53816138fa565b92506020840135613c63816138fa565b91506040840135613c738161391d565b809150509250925092565b60008060408385031215613c9157600080fd5b8235613c9c816138fa565b91506020830135613cac816138fa565b809150509250929050565b60008060008060008060008060006101208a8c031215613cd657600080fd5b8935613ce1816138fa565b985060208a0135613cf1816138fa565b975060408a0135613d018161391d565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a0135613d2d816138fa565b809250506101008a013590509295985092959850929598565b600080600060608486031215613d5b57600080fd5b833592506020840135613d6d816138fa565b91506040840135613c73816138fa565b600080600080600060808688031215613d9557600080fd5b85359450602086013567ffffffffffffffff811115613db357600080fd5b613dbf88828901613a6f565b9095509350506040860135613dd3816138fa565b949793965091946060013592915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613e2357613e23613de4565b604052919050565b600067ffffffffffffffff821115613e4557613e45613de4565b5060051b60200190565b600080600080600060808688031215613e6757600080fd5b853567ffffffffffffffff80821115613e7f57600080fd5b818801915088601f830112613e9357600080fd5b81356020613ea8613ea383613e2b565b613dfa565b82815260059290921b8401810191818101908c841115613ec757600080fd5b948201945b83861015613ee557853582529482019490820190613ecc565b99505089013592505080821115613efb57600080fd5b50613f0888828901613a6f565b9095509350613dd3905060408701613912565b600060608284031215613f2d57600080fd5b6040516060810181811067ffffffffffffffff82111715613f5057613f50613de4565b6040529050808235613f61816138fa565b81526020830135613f71816138fa565b60208201526040830135613f848161391d565b6040919091015292915050565b60008060408385031215613fa457600080fd5b8235915060208084013567ffffffffffffffff811115613fc357600080fd5b8401601f81018613613fd457600080fd5b8035613fe2613ea382613e2b565b8181526060918202830184019184820191908984111561400157600080fd5b938501935b83851015614027576140188a86613f1b565b83529384019391850191614006565b5080955050505050509250929050565b600080600080600060a0868803121561404f57600080fd5b853561405a816138fa565b9450602086013561406a816138fa565b9350604086013561407a8161391d565b94979396509394606081013594506080013592915050565b6000806000806000806000806000806000806101808d8f0312156140b557600080fd5b8c356140c0816138fa565b9b5060208d01356140d0816138fa565b9a5060408d01356140e08161391d565b995060608d0135985060808d0135975060a08d0135965060c08d0135614105816138fa565b955060e08d013594506101008d013561411d8161391d565b935061412c6101208e01613b78565b92506101408d013591506101608d013590509295989b509295989b509295989b565b600080600080600080600060e0888a03121561416957600080fd5b8735614174816138fa565b965060208801356141848161391d565b955060408801359450606088013593506080880135925060a0880135613a14816138fa565b6000602082840312156141bb57600080fd5b81356137ee816138fa565b60208082526015908201527410985cd9558c549bdd5d195c8e8811561412549151605a1b604082015260600190565b60006020828403121561420757600080fd5b81516137ee8161391d565b6000806040838503121561422557600080fd5b505080516020909101519092909150565b60208082526023908201527f426173655631526f757465723a20494e53554646494349454e545f415f414d4f60408201526215539560ea1b606082015260800190565b60208082526023908201527f426173655631526f757465723a20494e53554646494349454e545f425f414d4f60408201526215539560ea1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156142fa576142fa6142d2565b500390565b60208082526028908201527f426173655631526f757465723a20494e53554646494349454e545f4f555450556040820152671517d05353d5539560c21b606082015260800190565b6020808252601a908201527f426173655631526f757465723a20494e56414c49445f50415448000000000000604082015260600190565b60006060828403121561439057600080fd5b6137ee8383613f1b565b6000602082840312156143ac57600080fd5b81356137ee8161391d565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000602082840312156143ed57600080fd5b81516137ee816138fa565b60006020828403121561440a57600080fd5b5051919050565b600081600019048311821515161561442b5761442b6142d2565b500290565b60008261444d57634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6000806000606084860312156144a857600080fd5b8351925060208401519150604084015190509250925092565b600082198211156144d4576144d46142d2565b500190565b6000600182016144eb576144eb6142d2565b5060010190565b60005b8381101561450d5781810151838201526020016144f5565b83811115612fad5750506000910152565b600082516145308184602087016144f2565b9190910192915050565b84815283602082015260018060a01b038316604082015260806060820152600082518060808401526145738160a08501602087016144f2565b601f01601f19169190910160a0019594505050505056fea2646970667358221220a73eecdb472ff46d66c112164f60f5ab1d631c90951861c279e82870992e643864736f6c634300080d00330000000000000000000000001e58feab693e488dc370cf86b38d5625d22b858f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38

Deployed Bytecode

0x6080604052600436106101855760003560e01c806376c72751116100d1578063c45a01551161008a578063e5e31b1311610064578063e5e31b1314610505578063f242862114610535578063f41766d814610569578063fe411f141461058957600080fd5b8063c45a015514610491578063d7b0e0a5146104c5578063e2d9d4dc146104e557600080fd5b806376c72751146103eb5780637af728c8146103fe5780639881fcb41461041e57806398a0fb3c1461043e578063a32b1fcd1461045e578063b7e0d4c01461047e57600080fd5b8063544caa561161013e5780635e60dab5116101185780635e60dab51461037857806367ffb66a146103985780636cc1ae13146103ab5780637301e3c8146103cb57600080fd5b8063544caa56146102c85780635a47ddc3146103085780635e1e63251461034357600080fd5b80630dede6c4146101c957806313dcfc591461020357806318a13086146102305780634386e63c14610250578063448725b4146102705780634c1ee03e1461029057600080fd5b366101c457336001600160a01b037f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3816146101c2576101c26138e4565b005b600080fd5b3480156101d557600080fd5b506101e96101e436600461392b565b6105a9565b604080519283526020830191909152015b60405180910390f35b34801561020f57600080fd5b5061022361021e3660046139b0565b610763565b6040516101fa9190613a2b565b34801561023c57600080fd5b5061022361024b366004613ab4565b610976565b34801561025c57600080fd5b506101e961026b366004613b27565b610cc1565b34801561027c57600080fd5b506101e961028b366004613b89565b610e28565b34801561029c57600080fd5b506102b06102ab366004613c33565b610f01565b6040516001600160a01b0390911681526020016101fa565b3480156102d457600080fd5b506102e86102e3366004613c7e565b611009565b604080516001600160a01b039384168152929091166020830152016101fa565b34801561031457600080fd5b50610328610323366004613cb7565b6110fc565b604080519384526020840192909252908201526060016101fa565b34801561034f57600080fd5b5061036361035e366004613d46565b6111dc565b604080519283529015156020830152016101fa565b34801561038457600080fd5b506101e9610393366004613c33565b611430565b6102236103a6366004613d7d565b6114e8565b3480156103b757600080fd5b506101c26103c6366004613ab4565b611847565b3480156103d757600080fd5b506102236103e6366004613e4f565b611a34565b6101c26103f9366004613d7d565b611b0a565b34801561040a57600080fd5b506101c2610419366004613ab4565b611df7565b34801561042a57600080fd5b50610223610439366004613f91565b611fee565b34801561044a57600080fd5b50610328610459366004614037565b612270565b34801561046a57600080fd5b506101e9610479366004614092565b612470565b61032861048c36600461414e565b61252b565b34801561049d57600080fd5b506102b07f0000000000000000000000001e58feab693e488dc370cf86b38d5625d22b858f81565b3480156104d157600080fd5b506101e96104e036600461414e565b61276c565b3480156104f157600080fd5b506101e9610500366004613b89565b612861565b34801561051157600080fd5b506105256105203660046141a9565b612920565b60405190151581526020016101fa565b34801561054157600080fd5b506102b07f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3881565b34801561057557600080fd5b50610223610584366004613ab4565b6129b5565b34801561059557600080fd5b506101e96105a436600461414e565b612ada565b60008082428110156105d65760405162461bcd60e51b81526004016105cd906141c6565b60405180910390fd5b60006105e38c8c8c610f01565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af1158015610639573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065d91906141f5565b61066657600080fd5b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af11580156106b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d69190614212565b9150915060006106e68f8f611009565b509050806001600160a01b03168f6001600160a01b03161461070957818361070c565b82825b90975095508a8710156107315760405162461bcd60e51b81526004016105cd90614236565b898610156107515760405162461bcd60e51b81526004016105cd90614279565b50505050509850989650505050505050565b606081428110156107865760405162461bcd60e51b81526004016105cd906141c6565b604080516001808252818301909252600091816020015b604080516060810182526000808252602080830182905292820152825260001990920191018161079d57905050905087816000815181106107e0576107e06142bc565b6020026020010151600001906001600160a01b031690816001600160a01b0316815250508681600081518110610818576108186142bc565b6020026020010151602001906001600160a01b031690816001600160a01b0316815250508581600081518110610850576108506142bc565b602090810291909101015190151560409091015261086e8a82611fee565b925088836001855161088091906142e8565b81518110610890576108906142bc565b602002602001015110156108b65760405162461bcd60e51b81526004016105cd906142ff565b61095e816000815181106108cc576108cc6142bc565b6020026020010151600001513361093e846000815181106108ef576108ef6142bc565b6020026020010151600001518560008151811061090e5761090e6142bc565b6020026020010151602001518660008151811061092d5761092d6142bc565b602002602001015160400151610f01565b86600081518110610951576109516142bc565b6020026020010151612ba8565b610969838287612ca0565b5050979650505050505050565b606081428110156109995760405162461bcd60e51b81526004016105cd906141c6565b6001600160a01b037f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad381686866109d06001826142e8565b8181106109df576109df6142bc565b90506060020160200160208101906109f791906141a9565b6001600160a01b031614610a1d5760405162461bcd60e51b81526004016105cd90614347565b610a79888787808060200260200160405190810160405280939291908181526020016000905b82821015610a6f57610a606060830286013681900381019061437e565b81526020019060010190610a43565b5050505050611fee565b9150868260018451610a8b91906142e8565b81518110610a9b57610a9b6142bc565b60200260200101511015610ac15760405162461bcd60e51b81526004016105cd906142ff565b610b8386866000818110610ad757610ad76142bc565b610aed92602060609092020190810191506141a9565b33610b7089896000818110610b0457610b046142bc565b610b1a92602060609092020190810191506141a9565b8a8a6000818110610b2d57610b2d6142bc565b9050606002016020016020810190610b4591906141a9565b8b8b6000818110610b5857610b586142bc565b90506060020160400160208101906102ab919061439a565b85600081518110610951576109516142bc565b610be0828787808060200260200160405190810160405280939291908181526020016000905b82821015610bd557610bc66060830286013681900381019061437e565b81526020019060010190610ba9565b505050505030612ca0565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b0316632e1a7d4d8360018551610c1e91906142e8565b81518110610c2e57610c2e6142bc565b60200260200101516040518263ffffffff1660e01b8152600401610c5491815260200190565b600060405180830381600087803b158015610c6e57600080fd5b505af1158015610c82573d6000803e3d6000fd5b50505050610cb6848360018551610c9991906142e8565b81518110610ca957610ca96142bc565b6020026020010151612fb3565b509695505050505050565b60008060007f0000000000000000000000001e58feab693e488dc370cf86b38d5625d22b858f6001600160a01b0316636801cc308888886040518463ffffffff1660e01b8152600401610d16939291906143b7565b602060405180830381865afa158015610d33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5791906143db565b90506001600160a01b038116610d74576000809250925050610e1f565b600080610d82898989611430565b915091506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dea91906143f8565b905080610df78489614411565b610e019190614430565b955080610e0e8389614411565b610e189190614430565b9450505050505b94509492505050565b6000806000610e588e7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad388f610f01565b9050600087610e67578c610e6b565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610ea6903390309086908f908e908e908e90600401614452565b600060405180830381600087803b158015610ec057600080fd5b505af1158015610ed4573d6000803e3d6000fd5b50505050610ee78f8f8f8f8f8f8f61276c565b809450819550505050509b509b9950505050505050505050565b6000806000610f108686611009565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015286151560f81b604882015291935091507f0000000000000000000000001e58feab693e488dc370cf86b38d5625d22b858f90604901604051602081830303815290604052805190602001207f6c45999f36731ff6ab43e943fca4b5a700786bbb202116cf6633b32039161e05604051602001610fe7939291906001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b600080826001600160a01b0316846001600160a01b0316036110775760405162461bcd60e51b815260206004820152602160248201527f426173655631526f757465723a204944454e544943414c5f41444452455353456044820152605360f81b60648201526084016105cd565b826001600160a01b0316846001600160a01b03161061109757828461109a565b83835b90925090506001600160a01b0382166110f55760405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a205a45524f5f4144445245535300000000000060448201526064016105cd565b9250929050565b600080600083428110156111225760405162461bcd60e51b81526004016105cd906141c6565b6111318d8d8d8d8d8d8d613081565b909450925060006111438e8e8e610f01565b90506111518e338388612ba8565b61115d8d338387612ba8565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af11580156111a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c991906143f8565b9250505099509950999650505050505050565b60008060006111ed85856001610f01565b60405163e5e31b1360e01b81526001600160a01b03828116600483015291925060009182917f0000000000000000000000001e58feab693e488dc370cf86b38d5625d22b858f9091169063e5e31b1390602401602060405180830381865afa15801561125d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128191906141f5565b156112fa576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa1580156112d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f791906143f8565b91505b61130687876000610f01565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529194507f0000000000000000000000001e58feab693e488dc370cf86b38d5625d22b858f9091169063e5e31b1390602401602060405180830381865afa158015611371573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139591906141f5565b1561140e576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa1580156113e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140b91906143f8565b90505b80821161141d57806000611421565b8160015b94509450505050935093915050565b600080600061143f8686611009565b509050600080611450888888610f01565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561148d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b19190614493565b5091509150826001600160a01b0316886001600160a01b0316146114d65780826114d9565b81815b90999098509650505050505050565b6060814281101561150b5760405162461bcd60e51b81526004016105cd906141c6565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031686866000818110611548576115486142bc565b61155e92602060609092020190810191506141a9565b6001600160a01b0316146115845760405162461bcd60e51b81526004016105cd90614347565b6115d6348787808060200260200160405190810160405280939291908181526020016000905b82821015610a6f576115c76060830286013681900381019061437e565b815260200190600101906115aa565b91508682600184516115e891906142e8565b815181106115f8576115f86142bc565b6020026020010151101561161e5760405162461bcd60e51b81526004016105cd906142ff565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663d0e30db083600081518110611660576116606142bc565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561169357600080fd5b505af11580156116a7573d6000803e3d6000fd5b50505050507f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663a9059cbb611745888860008181106116f1576116f16142bc565b61170792602060609092020190810191506141a9565b8989600081811061171a5761171a6142bc565b905060600201602001602081019061173291906141a9565b8a8a6000818110610b5857610b586142bc565b84600081518110611758576117586142bc565b60200260200101516040518363ffffffff1660e01b81526004016117919291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af11580156117b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d491906141f5565b6117e0576117e06138e4565b61183d828787808060200260200160405190810160405280939291908181526020016000905b82821015611832576118236060830286013681900381019061437e565b81526020019060010190611806565b505050505086612ca0565b5095945050505050565b80428110156118685760405162461bcd60e51b81526004016105cd906141c6565b6118b18585600081811061187e5761187e6142bc565b61189492602060609092020190810191506141a9565b336118ab888860008181106116f1576116f16142bc565b8a612ba8565b600085856118c06001826142e8565b8181106118cf576118cf6142bc565b90506060020160200160208101906118e791906141a9565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa15801561192f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195391906143f8565b905061196086868661329f565b86611a0c8288886119726001826142e8565b818110611981576119816142bc565b905060600201602001602081019061199991906141a9565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a08231906024015b602060405180830381865afa1580156119e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0691906143f8565b90613639565b1015611a2a5760405162461bcd60e51b81526004016105cd906142ff565b5050505050505050565b60608142811015611a575760405162461bcd60e51b81526004016105cd906141c6565b611aad86866000818110611a6d57611a6d6142bc565b611a8392602060609092020190810191506141a9565b33611a9a89896000818110610b0457610b046142bc565b8a600081518110610951576109516142bc565b611aff878787808060200260200160405190810160405280939291908181526020016000905b8282101561183257611af06060830286013681900381019061437e565b81526020019060010190611ad3565b509495945050505050565b8042811015611b2b5760405162461bcd60e51b81526004016105cd906141c6565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031685856000818110611b6857611b686142bc565b611b7e92602060609092020190810191506141a9565b6001600160a01b031614611ba45760405162461bcd60e51b81526004016105cd90614347565b60003490507f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611c0457600080fd5b505af1158015611c18573d6000803e3d6000fd5b50505050507f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663a9059cbb611c62888860008181106116f1576116f16142bc565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611caf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd391906141f5565b611cdf57611cdf6138e4565b60008686611cee6001826142e8565b818110611cfd57611cfd6142bc565b9050606002016020016020810190611d1591906141a9565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa158015611d5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8191906143f8565b9050611d8e87878761329f565b87611a0c828989611da06001826142e8565b818110611daf57611daf6142bc565b9050606002016020016020810190611dc791906141a9565b6040516370a0823160e01b81526001600160a01b038a8116600483015291909116906370a08231906024016119c5565b8042811015611e185760405162461bcd60e51b81526004016105cd906141c6565b6001600160a01b037f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38168585611e4f6001826142e8565b818110611e5e57611e5e6142bc565b9050606002016020016020810190611e7691906141a9565b6001600160a01b031614611e9c5760405162461bcd60e51b81526004016105cd90614347565b611eb28585600081811061187e5761187e6142bc565b611ebd85853061329f565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b0316906370a0823190602401602060405180830381865afa158015611f24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4891906143f8565b905086811015611f6a5760405162461bcd60e51b81526004016105cd906142ff565b604051632e1a7d4d60e01b8152600481018290527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611fcc57600080fd5b505af1158015611fe0573d6000803e3d6000fd5b50505050611a2a8482612fb3565b60606001825110156120125760405162461bcd60e51b81526004016105cd90614347565b815161201f9060016144c1565b67ffffffffffffffff81111561203757612037613de4565b604051908082528060200260200182016040528015612060578160200160208202803683370190505b5090508281600081518110612077576120776142bc565b60200260200101818152505060005b82518110156122695760006120e28483815181106120a6576120a66142bc565b6020026020010151600001518584815181106120c4576120c46142bc565b60200260200101516020015186858151811061092d5761092d6142bc565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f0000000000000000000000001e58feab693e488dc370cf86b38d5625d22b858f9091169063e5e31b1390602401602060405180830381865afa15801561214d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217191906141f5565b1561225657806001600160a01b031663f140a35a848481518110612197576121976142bc565b60200260200101518685815181106121b1576121b16142bc565b6020026020010151600001516040518363ffffffff1660e01b81526004016121ec9291909182526001600160a01b0316602082015260400190565b602060405180830381865afa158015612209573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222d91906143f8565b836122398460016144c1565b81518110612249576122496142bc565b6020026020010181815250505b5080612261816144d9565b915050612086565b5092915050565b6000806000807f0000000000000000000000001e58feab693e488dc370cf86b38d5625d22b858f6001600160a01b0316636801cc308a8a8a6040518463ffffffff1660e01b81526004016122c6939291906143b7565b602060405180830381865afa1580156122e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061230791906143db565b9050600080806001600160a01b0384161561239157836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561235a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237e91906143f8565b905061238b8c8c8c611430565b90935091505b8215801561239d575081155b156123ce578896508795506103e86123bd6123b8888a614411565b61368d565b6123c791906142e8565b9450612461565b60006123db8a85856136fd565b90508881116124235789975095508561241c846123f8848b614411565b6124029190614430565b8461240d858b614411565b6124179190614430565b6137dd565b955061245f565b60006124308a85876136fd565b985089975088905061245b856124468584614411565b6124509190614430565b8561240d868c614411565b9650505b505b50505050955095509592505050565b60008060006124808f8f8f610f01565b905060008761248f578c612493565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf906124ce903390309086908f908e908e908e90600401614452565b600060405180830381600087803b1580156124e857600080fd5b505af11580156124fc573d6000803e3d6000fd5b50505050506125118f8f8f8f8f8f8f8f6105a9565b8093508194505050509c509c9a5050505050505050505050565b600080600083428110156125515760405162461bcd60e51b81526004016105cd906141c6565b6125808b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad388c8c348d8d613081565b909450925060006125b28c7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad388d610f01565b90506125c08c338388612ba8565b7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561261b57600080fd5b505af115801561262f573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3816935063a9059cbb925060440190506020604051808303816000875af11580156126a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c891906141f5565b6126d4576126d46138e4565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af115801561271c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061274091906143f8565b92508334111561275d5761275d3361275886346142e8565b612fb3565b50509750975097945050505050565b60008082428110156127905760405162461bcd60e51b81526004016105cd906141c6565b6127c08a7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad388b8b8b8b308b6105a9565b90935091506127d08a86856137f5565b604051632e1a7d4d60e01b8152600481018390527f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561283257600080fd5b505af1158015612846573d6000803e3d6000fd5b505050506128548583612fb3565b5097509795505050505050565b60008060006128918e7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad388f610f01565b90506000876128a0578c6128a4565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf906128df903390309086908f908e908e908e90600401614452565b600060405180830381600087803b1580156128f957600080fd5b505af115801561290d573d6000803e3d6000fd5b50505050610ee78f8f8f8f8f8f8f612ada565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f0000000000000000000000001e58feab693e488dc370cf86b38d5625d22b858f9091169063e5e31b1390602401602060405180830381865afa15801561298b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129af91906141f5565b92915050565b606081428110156129d85760405162461bcd60e51b81526004016105cd906141c6565b612a2a888787808060200260200160405190810160405280939291908181526020016000905b82821015610a6f57612a1b6060830286013681900381019061437e565b815260200190600101906129fe565b9150868260018451612a3c91906142e8565b81518110612a4c57612a4c6142bc565b60200260200101511015612a725760405162461bcd60e51b81526004016105cd906142ff565b612a8886866000818110610ad757610ad76142bc565b610cb6828787808060200260200160405190810160405280939291908181526020016000905b8282101561183257612acb6060830286013681900381019061437e565b81526020019060010190612aae565b6000808242811015612afe5760405162461bcd60e51b81526004016105cd906141c6565b612b2e8a7f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad388b8b8b8b308b6105a9565b6040516370a0823160e01b815230600482015291945092506127d0908b9087906001600160a01b038316906370a0823190602401602060405180830381865afa158015612b7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba391906143f8565b6137f5565b6000846001600160a01b03163b11612bbf57600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691612c23919061451e565b6000604051808303816000865af19150503d8060008114612c60576040519150601f19603f3d011682016040523d82523d6000602084013e612c65565b606091505b5091509150818015612c8f575080511580612c8f575080806020019051810190612c8f91906141f5565b612c9857600080fd5b505050505050565b60005b8251811015612fad576000612cf2848381518110612cc357612cc36142bc565b602002602001015160000151858481518110612ce157612ce16142bc565b602002602001015160200151611009565b509050600085612d038460016144c1565b81518110612d1357612d136142bc565b60200260200101519050600080836001600160a01b0316878681518110612d3c57612d3c6142bc565b6020026020010151600001516001600160a01b031614612d5e57826000612d62565b6000835b91509150600060018851612d7691906142e8565b8610612d825786612df5565b612df588612d918860016144c1565b81518110612da157612da16142bc565b60200260200101516000015189886001612dbb91906144c1565b81518110612dcb57612dcb6142bc565b6020026020010151602001518a896001612de591906144c1565b8151811061092d5761092d6142bc565b9050612e48888781518110612e0c57612e0c6142bc565b602002602001015160000151898881518110612e2a57612e2a6142bc565b6020026020010151602001518a898151811061092d5761092d6142bc565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612e85576020820181803683370190505b506040518563ffffffff1660e01b8152600401612ea5949392919061453a565b600060405180830381600087803b158015612ebf57600080fd5b505af1158015612ed3573d6000803e3d6000fd5b50505050866001600160a01b0316336001600160a01b03167f423c093a1f80c354c75d4f9e86fde37d7c9014453df9643f585a1b199d094e508b8981518110612f1e57612f1e6142bc565b60200260200101518b8a81518110612f3857612f386142bc565b6020026020010151600001518c8b81518110612f5657612f566142bc565b602002602001015160400151604051612f8d939291909283526001600160a01b039190911660208301521515604082015260600190565b60405180910390a350505050508080612fa5906144d9565b915050612ca3565b50505050565b604080516000808252602082019092526001600160a01b038416908390604051612fdd919061451e565b60006040518083038185875af1925050503d806000811461301a576040519150601f19603f3d011682016040523d82523d6000602084013e61301f565b606091505b505090508061307c5760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b60648201526084016105cd565b505050565b6000808386101561309157600080fd5b8285101561309e57600080fd5b6040516306801cc360e41b81526000906001600160a01b037f0000000000000000000000001e58feab693e488dc370cf86b38d5625d22b858f1690636801cc30906130f1908d908d908d906004016143b7565b602060405180830381865afa15801561310e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061313291906143db565b90506001600160a01b0381166131d8576040516320b7f73960e21b81526001600160a01b037f0000000000000000000000001e58feab693e488dc370cf86b38d5625d22b858f16906382dfdce490613192908d908d908d906004016143b7565b6020604051808303816000875af11580156131b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131d591906143db565b90505b6000806131e68c8c8c611430565b915091508160001480156131f8575080155b1561320857889450879350613290565b60006132158a84846136fd565b9050888111613249578681101561323e5760405162461bcd60e51b81526004016105cd90614279565b89955093508361328e565b60006132568a84866136fd565b90508a811115613268576132686138e4565b888110156132885760405162461bcd60e51b81526004016105cd90614236565b95508894505b505b50505097509795505050505050565b60005b82811015612fad576000808585848181106132bf576132bf6142bc565b6132d592602060609092020190810191506141a9565b8686858181106132e7576132e76142bc565b90506060020160200160208101906132ff91906141a9565b91509150600061330f8383611009565b509050600061337b888887818110613329576133296142bc565b61333f92602060609092020190810191506141a9565b898988818110613351576133516142bc565b905060600201602001602081019061336991906141a9565b8a8a89818110610b5857610b586142bc565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156133c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e59190614493565b50915091506000866001600160a01b0316896001600160a01b03161461340c57818361340f565b82825b506040516370a0823160e01b81526001600160a01b038881166004830152919250613448918391908c16906370a08231906024016119c5565b9450613455858a8a6111dc565b5080945050505050600080856001600160a01b0316886001600160a01b03161461348157826000613485565b6000835b9092509050600061349760018d6142e8565b8a106134a3578a613528565b6135288d8d6134b38d60016144c1565b8181106134c2576134c26142bc565b6134d892602060609092020190810191506141a9565b8e8e6134e58e60016144c1565b8181106134f4576134f46142bc565b905060600201602001602081019061350c91906141a9565b8f8f6135198f60016144c1565b818110610b5857610b586142bc565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f9061356a908690869086906024810161453a565b600060405180830381600087803b15801561358457600080fd5b505af1158015613598573d6000803e3d6000fd5b5050505060008d8d8c8181106135b0576135b06142bc565b90506060020160400160208101906135c8919061439a565b604080518881526001600160a01b038d81166020830152831515828401529151929350908e169133917f423c093a1f80c354c75d4f9e86fde37d7c9014453df9643f585a1b199d094e50919081900360600190a3505050505050505050508080613631906144d9565b9150506132a2565b60008261364683826142e8565b91508111156129af5760405162461bcd60e51b81526020600482015260136024820152724d6174683a205375622d756e646572666c6f7760681b60448201526064016105cd565b600060038211156136ee57508060006136a7600283614430565b6136b29060016144c1565b90505b818110156136e8579050806002816136cd8186614430565b6136d791906144c1565b6136e19190614430565b90506136b5565b50919050565b81156136f8575060015b919050565b60008084116137585760405162461bcd60e51b815260206004820152602160248201527f426173655631526f757465723a20494e53554646494349454e545f414d4f554e6044820152601560fa1b60648201526084016105cd565b6000831180156137685750600082115b6137c05760405162461bcd60e51b8152602060048201526024808201527f426173655631526f757465723a20494e53554646494349454e545f4c495155496044820152634449545960e01b60648201526084016105cd565b826137cb8386614411565b6137d59190614430565b949350505050565b60008183106137ec57816137ee565b825b9392505050565b6000836001600160a01b03163b1161380c57600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691613868919061451e565b6000604051808303816000865af19150503d80600081146138a5576040519150601f19603f3d011682016040523d82523d6000602084013e6138aa565b606091505b50915091508180156138d45750805115806138d45750808060200190518101906138d491906141f5565b6138dd57600080fd5b5050505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b038116811461390f57600080fd5b50565b80356136f8816138fa565b801515811461390f57600080fd5b600080600080600080600080610100898b03121561394857600080fd5b8835613953816138fa565b97506020890135613963816138fa565b965060408901356139738161391d565b9550606089013594506080890135935060a0890135925060c0890135613998816138fa565b8092505060e089013590509295985092959890939650565b600080600080600080600060e0888a0312156139cb57600080fd5b873596506020880135955060408801356139e4816138fa565b945060608801356139f4816138fa565b93506080880135613a048161391d565b925060a0880135613a14816138fa565b8092505060c0880135905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b81811015613a6357835183529284019291840191600101613a47565b50909695505050505050565b60008083601f840112613a8157600080fd5b50813567ffffffffffffffff811115613a9957600080fd5b6020830191508360206060830285010111156110f557600080fd5b60008060008060008060a08789031215613acd57600080fd5b8635955060208701359450604087013567ffffffffffffffff811115613af257600080fd5b613afe89828a01613a6f565b9095509350506060870135613b12816138fa565b80925050608087013590509295509295509295565b60008060008060808587031215613b3d57600080fd5b8435613b48816138fa565b93506020850135613b58816138fa565b92506040850135613b688161391d565b9396929550929360600135925050565b803560ff811681146136f857600080fd5b60008060008060008060008060008060006101608c8e031215613bab57600080fd5b8b35613bb6816138fa565b9a5060208c0135613bc68161391d565b995060408c0135985060608c0135975060808c0135965060a08c0135613beb816138fa565b955060c08c0135945060e08c0135613c028161391d565b9350613c116101008d01613b78565b92506101208c013591506101408c013590509295989b509295989b9093969950565b600080600060608486031215613c4857600080fd5b8335613c53816138fa565b92506020840135613c63816138fa565b91506040840135613c738161391d565b809150509250925092565b60008060408385031215613c9157600080fd5b8235613c9c816138fa565b91506020830135613cac816138fa565b809150509250929050565b60008060008060008060008060006101208a8c031215613cd657600080fd5b8935613ce1816138fa565b985060208a0135613cf1816138fa565b975060408a0135613d018161391d565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a0135613d2d816138fa565b809250506101008a013590509295985092959850929598565b600080600060608486031215613d5b57600080fd5b833592506020840135613d6d816138fa565b91506040840135613c73816138fa565b600080600080600060808688031215613d9557600080fd5b85359450602086013567ffffffffffffffff811115613db357600080fd5b613dbf88828901613a6f565b9095509350506040860135613dd3816138fa565b949793965091946060013592915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613e2357613e23613de4565b604052919050565b600067ffffffffffffffff821115613e4557613e45613de4565b5060051b60200190565b600080600080600060808688031215613e6757600080fd5b853567ffffffffffffffff80821115613e7f57600080fd5b818801915088601f830112613e9357600080fd5b81356020613ea8613ea383613e2b565b613dfa565b82815260059290921b8401810191818101908c841115613ec757600080fd5b948201945b83861015613ee557853582529482019490820190613ecc565b99505089013592505080821115613efb57600080fd5b50613f0888828901613a6f565b9095509350613dd3905060408701613912565b600060608284031215613f2d57600080fd5b6040516060810181811067ffffffffffffffff82111715613f5057613f50613de4565b6040529050808235613f61816138fa565b81526020830135613f71816138fa565b60208201526040830135613f848161391d565b6040919091015292915050565b60008060408385031215613fa457600080fd5b8235915060208084013567ffffffffffffffff811115613fc357600080fd5b8401601f81018613613fd457600080fd5b8035613fe2613ea382613e2b565b8181526060918202830184019184820191908984111561400157600080fd5b938501935b83851015614027576140188a86613f1b565b83529384019391850191614006565b5080955050505050509250929050565b600080600080600060a0868803121561404f57600080fd5b853561405a816138fa565b9450602086013561406a816138fa565b9350604086013561407a8161391d565b94979396509394606081013594506080013592915050565b6000806000806000806000806000806000806101808d8f0312156140b557600080fd5b8c356140c0816138fa565b9b5060208d01356140d0816138fa565b9a5060408d01356140e08161391d565b995060608d0135985060808d0135975060a08d0135965060c08d0135614105816138fa565b955060e08d013594506101008d013561411d8161391d565b935061412c6101208e01613b78565b92506101408d013591506101608d013590509295989b509295989b509295989b565b600080600080600080600060e0888a03121561416957600080fd5b8735614174816138fa565b965060208801356141848161391d565b955060408801359450606088013593506080880135925060a0880135613a14816138fa565b6000602082840312156141bb57600080fd5b81356137ee816138fa565b60208082526015908201527410985cd9558c549bdd5d195c8e8811561412549151605a1b604082015260600190565b60006020828403121561420757600080fd5b81516137ee8161391d565b6000806040838503121561422557600080fd5b505080516020909101519092909150565b60208082526023908201527f426173655631526f757465723a20494e53554646494349454e545f415f414d4f60408201526215539560ea1b606082015260800190565b60208082526023908201527f426173655631526f757465723a20494e53554646494349454e545f425f414d4f60408201526215539560ea1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156142fa576142fa6142d2565b500390565b60208082526028908201527f426173655631526f757465723a20494e53554646494349454e545f4f555450556040820152671517d05353d5539560c21b606082015260800190565b6020808252601a908201527f426173655631526f757465723a20494e56414c49445f50415448000000000000604082015260600190565b60006060828403121561439057600080fd5b6137ee8383613f1b565b6000602082840312156143ac57600080fd5b81356137ee8161391d565b6001600160a01b039384168152919092166020820152901515604082015260600190565b6000602082840312156143ed57600080fd5b81516137ee816138fa565b60006020828403121561440a57600080fd5b5051919050565b600081600019048311821515161561442b5761442b6142d2565b500290565b60008261444d57634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6000806000606084860312156144a857600080fd5b8351925060208401519150604084015190509250925092565b600082198211156144d4576144d46142d2565b500190565b6000600182016144eb576144eb6142d2565b5060010190565b60005b8381101561450d5781810151838201526020016144f5565b83811115612fad5750506000910152565b600082516145308184602087016144f2565b9190910192915050565b84815283602082015260018060a01b038316604082015260806060820152600082518060808401526145738160a08501602087016144f2565b601f01601f19169190910160a0019594505050505056fea2646970667358221220a73eecdb472ff46d66c112164f60f5ab1d631c90951861c279e82870992e643864736f6c634300080d0033

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

0000000000000000000000001e58feab693e488dc370cf86b38d5625d22b858f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38

-----Decoded View---------------
Arg [0] : _factory (address): 0x1e58FEAb693e488dC370cF86b38d5625d22B858F
Arg [1] : _wETH (address): 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000001e58feab693e488dc370cf86b38d5625d22b858f
Arg [1] : 000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38


Block Transaction 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
[ 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.