Address io1z37d4c4l06qfh9uf45rktzvuq6ekr3ww6tju03

Contract Overview

Balance:
0 IOTX

IOTX Value:
$ 0

Token:
Txn Hash
Block
From
To
Value [Txn Fee]
bd774ef436b1e96fab850f4b74065b904dfb74ae92f84863e9db4ecf00211e1b 18985940 2022-08-15 16:17:35 +0000 UTC 3 minutes ago io1c9x7alng0px94z4wxhrlrl3cj8hxt8aqp9xl9s  IN    Contract: MimoV2Router02NoReferral 0 IOTX 1.958036
3c953a4313ddaef514f72b42cc0d3f47c3e722f26c19e85995e2e6815040f35a 18985923 2022-08-15 16:16:10 +0000 UTC 4 minutes ago io1rg5twul0c8tv5ph8syhs4y8csra8zr7p8xph9m  IN    Contract: MimoV2Router02NoReferral 0 IOTX 0.12937
8727cb884d3490c5c11e64d1bea62c2dc78e324e9f86027374aae9f75620ebb2 18985919 2022-08-15 16:15:50 +0000 UTC 5 minutes ago io127sqwjkwhdmjs059m988mn7q808gyhkvuu443k  IN    Contract: MimoV2Router02NoReferral 21723 IOTX 0.128673
19e7854154a093ddc0ba52c088bbb7babd7eb62891cf55608c67aca43f53f318 18985919 2022-08-15 16:15:50 +0000 UTC 5 minutes ago io1lz6uzff4ndfa4dj3k04eedwxtg3vdvfmrhknf5  IN    Contract: MimoV2Router02NoReferral 25129 IOTX 0.142657
94074553164337115c74185470c0e160027eb7b13f031c53f162120f988c7b08 18985911 2022-08-15 16:15:10 +0000 UTC 5 minutes ago io1pf50qvww6y6u9dux7g2vk3zv28slv2e0gfagr5  IN    Contract: MimoV2Router02NoReferral 3332 IOTX 0.24796
ca928213355499a993b524fdc643358975aea3b654256444957fcef8df2a72a6 18985905 2022-08-15 16:14:40 +0000 UTC 6 minutes ago io1pf50qvww6y6u9dux7g2vk3zv28slv2e0gfagr5  IN    Contract: MimoV2Router02NoReferral 3433 IOTX 0.24796
d2399cc0f9cb4e8ae12c4cee615472f0fd53f326ee566e873a2c50e1cda7509e 18985900 2022-08-15 16:14:15 +0000 UTC 6 minutes ago io1zcunxwn96czz2qgmglhxzxpll8duuwpguphw4r  IN    Contract: MimoV2Router02NoReferral 17897 IOTX 0.248088
c76733998ce69cf7b45fd9ddfcb8e29cfd6e0234ecf3fb940698cdffd0aa408f 18985893 2022-08-15 16:13:40 +0000 UTC 7 minutes ago io1zcunxwn96czz2qgmglhxzxpll8duuwpguphw4r  IN    Contract: MimoV2Router02NoReferral 9609 IOTX 0.248088
37e6685f2a70dff6cfdbb58f9c6d2c131305a05cb2f0eac2e3283aceef422e9a 18985881 2022-08-15 16:12:40 +0000 UTC 8 minutes ago io17jwe07u3y7ht9m4pysns5jtewzmkcgdq540df0  IN    Contract: MimoV2Router02NoReferral 0 IOTX 0.128571
af3e70885a670fdcd6a31b80e7e9f24aa2cd314f4559ab2d3e5610e83b0c67ed 18985875 2022-08-15 16:12:10 +0000 UTC 8 minutes ago io1pf50qvww6y6u9dux7g2vk3zv28slv2e0gfagr5  IN    Contract: MimoV2Router02NoReferral 3437 IOTX 0.24796
0e61478b154c107156b99f35959111ebc5ca00db637ca1bc1a279298fe60a4f4 18985872 2022-08-15 16:11:55 +0000 UTC 9 minutes ago io17jwe07u3y7ht9m4pysns5jtewzmkcgdq540df0  IN    Contract: MimoV2Router02NoReferral 0 IOTX 0.207822
d1d87a8e6e096d0e65021c2f600a720fa5dda3360c98af69a2db1ff2733d557d 18985790 2022-08-15 16:05:05 +0000 UTC 15 minutes ago io14uekqnx8us6cfus364u3zwdqy73mj2vcf67yva  IN    Contract: MimoV2Router02NoReferral 0 IOTX 0.214066
38edb9137fd496789ab996c1d7b336000cecc01752bce785695fcd874780b96f 18985790 2022-08-15 16:05:05 +0000 UTC 15 minutes ago io1pf50qvww6y6u9dux7g2vk3zv28slv2e0gfagr5  IN    Contract: MimoV2Router02NoReferral 0 IOTX 0.288894
3c44b83d7730a173b2c89391850fe5c46139452aadab24a2603d41b2a9816303 18985776 2022-08-15 16:03:55 +0000 UTC 17 minutes ago io1aw4m62j2pqpa5k3ccqtc5l0kwj8s9h0t0ahmlv  IN    Contract: MimoV2Router02NoReferral 0 IOTX 0.141594
76b4a4224fbf149989942c4ddcc6d5bcca31b17be8973a6be525fda36cef9b53 18985744 2022-08-15 16:01:15 +0000 UTC 19 minutes ago io1e2rfj7mh4ejawp9dy2ns035305xyahlwmhc0c3  IN    Contract: MimoV2Router02NoReferral 0 IOTX 0.144827
c749aadf4159d7adca335cff031d23a057502ff32e68e4411795125639185919 18985633 2022-08-15 15:52:00 +0000 UTC 29 minutes ago io1zcunxwn96czz2qgmglhxzxpll8duuwpguphw4r  IN    Contract: MimoV2Router02NoReferral 0 IOTX 0.288742
d7a6375b0c5bac7531cfd0ddf2ab22bb2523061b94afcbe2686f1dc99012888c 18985612 2022-08-15 15:50:15 +0000 UTC 30 minutes ago io1z5lcg87p95a0n3qgs30mhue34escuet2jlg2gz  IN    Contract: MimoV2Router02NoReferral 0 IOTX 0.214066
7a2a30360d8c9c34515eb42c81275eb3d1e94052cd1ac5f4c295b84799ef4137 18985395 2022-08-15 15:32:10 +0000 UTC 48 minutes ago io1sffxhxeul00aa6lz40wneqgrw5p9gvfujmynh3  IN    Contract: MimoV2Router02NoReferral 127.874243 IOTX 0.135748
4c530b91b631c0d91e6433fafc9f899933b1d1789564c6c1d36dc0326b0cb3ee 18985308 2022-08-15 15:24:55 +0000 UTC 56 minutes ago io1expkruujxlcq2c4f5ljw0fqph400mfp5pqdvqd  IN    Contract: MimoV2Router02NoReferral 0 IOTX 0.192142
f768a7ee47a76dd3c27f358335f5c42e43e5f37d41a292e546b352ababbe13c4 18985285 2022-08-15 15:23:00 +0000 UTC 58 minutes ago io1gw7lzx7f4w3fnkw3q9jl6yg2hnrm8pksgpjw7w  IN    Contract: MimoV2Router02NoReferral 0 IOTX 0.192142
02557603de75bbaec1f5c89b642b288c421097bb0c173d61a77804b96ac35493 18984885 2022-08-15 14:49:40 +0000 UTC 2 hours ago io1p5y0h7snn0zvvdpxmeu8q7ndckm2jvw2g95x8f  IN    Contract: MimoV2Router02NoReferral 0 IOTX 0.129625
18d0ac593ff0f2f0b363299c7b209cc1bff54f3e3201edc3bbfe845f1be88412 18984858 2022-08-15 14:47:25 +0000 UTC 2 hours ago io16yjnztkuq8pttfjgkje8ztecudtlp3fw02a4xz  IN    Contract: MimoV2Router02NoReferral 0 IOTX 0.126594
3b706a492e44723926f18b1daf70b53225b1599c4c6738f031786ff283dffa64 18984667 2022-08-15 14:31:30 +0000 UTC 2 hours ago io1a3cmkp0jx2a5cy5v6jhxr48xv7vksmesfy5vwj  IN    Contract: MimoV2Router02NoReferral 0 IOTX 0.144364
c654580380cf859fc153fa832199692789d80be4f1eca25fa285c038e0ebb70c 18984613 2022-08-15 14:27:00 +0000 UTC 2 hours ago io186z8dhgzwmkvjx8lqa505d6krsjl8cl6v8q6k2  IN    Contract: MimoV2Router02NoReferral 0 IOTX 0.149193
d6a32f22b33d3228fd781a0819f18111f531ab0e5a11ea8e6fd77852887bbd7e 18984575 2022-08-15 14:23:50 +0000 UTC 2 hours ago io1c9x7alng0px94z4wxhrlrl3cj8hxt8aqp9xl9s  IN    Contract: MimoV2Router02NoReferral 0 IOTX 1.958036
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MimoV2Router02NoReferral

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

// Sources flattened with hardhat v2.3.0 https://hardhat.org

// File contracts/swap/interfaces/IMimoPair.sol

pragma solidity >=0.5.0;

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

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

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

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

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

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

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

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

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

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}


// File contracts/swap/libraries/SafeMath.sol

pragma solidity =0.6.12;

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

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

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

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

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "division by zero");
        uint256 c = a / b;
        return c;
    }
}


// File contracts/swap/libraries/MimoV2Library.sol

pragma solidity >=0.5.0;

library MimoV2Library {
    using SafeMath for uint256;

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

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

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

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

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

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

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

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


// File contracts/swap/libraries/TransferHelper.sol

pragma solidity >=0.6.0;

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

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

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

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


// File contracts/swap/interfaces/IMimoFactory.sol

pragma solidity >=0.5.0;

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

    function referral() external view returns (address);

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

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

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;

    function setReferral(address) external;
}


// File contracts/swap/interfaces/IERC20.sol

pragma solidity >=0.5.0;

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

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

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

    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint256);

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

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

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

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

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


// File contracts/swap/interfaces/IWETH.sol

pragma solidity >=0.5.0;

interface IWETH {
    function deposit() external payable;

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

    function withdraw(uint256) external;
}


// File contracts/swap/MimoV2Router02NoReferral.sol

pragma solidity =0.6.12;






contract MimoV2Router02NoReferral {
    using SafeMath for uint256;

    address public immutable factory;
    address public immutable WETH;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

Contract Creation Code

60806040526004361061012e5760003560e01c80638803dbee116100ab578063baa2abde1161006f578063baa2abde146108a1578063c45a0155146108fe578063d06ca61f14610913578063e8e33700146109c8578063f305d71914610a48578063fb3bdb4114610a8e57610167565b80638803dbee146106cd578063ad5c464814610763578063ad615dec14610794578063af2979eb146107ca578063b6f9de951461081d57610167565b80634a25d94a116100f25780634a25d94a146104515780635c11d795146104e7578063791ac9471461057d5780637ff36ab51461061357806385f8c2591461069757610167565b806302751cec1461016c578063054d50d4146101d857806318cbafe5146102205780631f00ca741461030657806338ed1739146103bb57610167565b3661016757336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461016557fe5b005b600080fd5b34801561017857600080fd5b506101bf600480360360c081101561018f57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135610b12565b6040805192835260208301919091528051918290030190f35b3480156101e457600080fd5b5061020e600480360360608110156101fb57600080fd5b5080359060208101359060400135610c2c565b60408051918252519081900360200190f35b34801561022c57600080fd5b506102b6600480360360a081101561024357600080fd5b813591602081013591810190606081016040820135600160201b81111561026957600080fd5b82018360208201111561027b57600080fd5b803590602001918460208302840111600160201b8311171561029c57600080fd5b91935091506001600160a01b038135169060200135610c41565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102f25781810151838201526020016102da565b505050509050019250505060405180910390f35b34801561031257600080fd5b506102b66004803603604081101561032957600080fd5b81359190810190604081016020820135600160201b81111561034a57600080fd5b82018360208201111561035c57600080fd5b803590602001918460208302840111600160201b8311171561037d57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610f6e945050505050565b3480156103c757600080fd5b506102b6600480360360a08110156103de57600080fd5b813591602081013591810190606081016040820135600160201b81111561040457600080fd5b82018360208201111561041657600080fd5b803590602001918460208302840111600160201b8311171561043757600080fd5b91935091506001600160a01b038135169060200135610fa4565b34801561045d57600080fd5b506102b6600480360360a081101561047457600080fd5b813591602081013591810190606081016040820135600160201b81111561049a57600080fd5b8201836020820111156104ac57600080fd5b803590602001918460208302840111600160201b831117156104cd57600080fd5b91935091506001600160a01b0381351690602001356110ef565b3480156104f357600080fd5b50610165600480360360a081101561050a57600080fd5b813591602081013591810190606081016040820135600160201b81111561053057600080fd5b82018360208201111561054257600080fd5b803590602001918460208302840111600160201b8311171561056357600080fd5b91935091506001600160a01b03813516906020013561127b565b34801561058957600080fd5b50610165600480360360a08110156105a057600080fd5b813591602081013591810190606081016040820135600160201b8111156105c657600080fd5b8201836020820111156105d857600080fd5b803590602001918460208302840111600160201b831117156105f957600080fd5b91935091506001600160a01b0381351690602001356114f8565b6102b66004803603608081101561062957600080fd5b81359190810190604081016020820135600160201b81111561064a57600080fd5b82018360208201111561065c57600080fd5b803590602001918460208302840111600160201b8311171561067d57600080fd5b91935091506001600160a01b038135169060200135611781565b3480156106a357600080fd5b5061020e600480360360608110156106ba57600080fd5b5080359060208101359060400135611acb565b3480156106d957600080fd5b506102b6600480360360a08110156106f057600080fd5b813591602081013591810190606081016040820135600160201b81111561071657600080fd5b82018360208201111561072857600080fd5b803590602001918460208302840111600160201b8311171561074957600080fd5b91935091506001600160a01b038135169060200135611ad8565b34801561076f57600080fd5b50610778611bd1565b604080516001600160a01b039092168252519081900360200190f35b3480156107a057600080fd5b5061020e600480360360608110156107b757600080fd5b5080359060208101359060400135611bf5565b3480156107d657600080fd5b5061020e600480360360c08110156107ed57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611c02565b6101656004803603608081101561083357600080fd5b81359190810190604081016020820135600160201b81111561085457600080fd5b82018360208201111561086657600080fd5b803590602001918460208302840111600160201b8311171561088757600080fd5b91935091506001600160a01b038135169060200135611d88565b3480156108ad57600080fd5b506101bf600480360360e08110156108c457600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c001356120f9565b34801561090a57600080fd5b5061077861233d565b34801561091f57600080fd5b506102b66004803603604081101561093657600080fd5b81359190810190604081016020820135600160201b81111561095757600080fd5b82018360208201111561096957600080fd5b803590602001918460208302840111600160201b8311171561098a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612361945050505050565b3480156109d457600080fd5b50610a2a60048036036101008110156109ec57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e0013561238e565b60408051938452602084019290925282820152519081900360600190f35b610a2a600480360360c0811015610a5e57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a001356124c1565b6102b660048036036080811015610aa457600080fd5b81359190810190604081016020820135600160201b811115610ac557600080fd5b820183602082011115610ad757600080fd5b803590602001918460208302840111600160201b83111715610af857600080fd5b91935091506001600160a01b038135169060200135612754565b6000808242811015610b59576040805162461bcd60e51b81526020600482015260156024820152600080516020613e9d833981519152604482015290519081900360640190fd5b610b88897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6120f9565b9093509150610b98898685612acd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610bfe57600080fd5b505af1158015610c12573d6000803e3d6000fd5b50505050610c208583612c37565b50965096945050505050565b6000610c39848484612d2f565b949350505050565b60608142811015610c87576040805162461bcd60e51b81526020600482015260156024820152600080516020613e9d833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866000198101818110610cc157fe5b905060200201356001600160a01b03166001600160a01b031614610d1a576040805162461bcd60e51b815260206004820152601a6024820152600080516020613ee2833981519152604482015290519081900360640190fd5b610d787f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612e0792505050565b91508682600184510381518110610d8b57fe5b60200260200101511015610dd05760405162461bcd60e51b8152600401808060200182810382526028815260200180613fd86028913960400191505060405180910390fd5b610e6e86866000818110610de057fe5b905060200201356001600160a01b031633610e547f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610e2257fe5b905060200201356001600160a01b03168b8b6001818110610e3f57fe5b905060200201356001600160a01b0316612f53565b85600081518110610e6157fe5b6020026020010151613012565b610ead8287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061316f915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d83600185510381518110610eec57fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f2a57600080fd5b505af1158015610f3e573d6000803e3d6000fd5b50505050610f638483600185510381518110610f5657fe5b6020026020010151612c37565b509695505050505050565b6060610f9b7f000000000000000000000000000000000000000000000000000000000000000084846133ac565b90505b92915050565b60608142811015610fea576040805162461bcd60e51b81526020600482015260156024820152600080516020613e9d833981519152604482015290519081900360640190fd5b6110487f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612e0792505050565b9150868260018451038151811061105b57fe5b602002602001015110156110a05760405162461bcd60e51b8152600401808060200182810382526028815260200180613fd86028913960400191505060405180910390fd5b6110b086866000818110610de057fe5b610f638287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061316f915050565b60608142811015611135576040805162461bcd60e51b81526020600482015260156024820152600080516020613e9d833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061116f57fe5b905060200201356001600160a01b03166001600160a01b0316146111c8576040805162461bcd60e51b815260206004820152601a6024820152600080516020613ee2833981519152604482015290519081900360640190fd5b6112267f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133ac92505050565b9150868260008151811061123657fe5b60200260200101511115610dd05760405162461bcd60e51b8152600401808060200182810382526024815260200180613f6f6024913960400191505060405180910390fd5b80428110156112bf576040805162461bcd60e51b81526020600482015260156024820152600080516020613e9d833981519152604482015290519081900360640190fd5b611334858560008181106112cf57fe5b905060200201356001600160a01b03163361132e7f00000000000000000000000000000000000000000000000000000000000000008989600081811061131157fe5b905060200201356001600160a01b03168a8a6001818110610e3f57fe5b8a613012565b60008585600019810181811061134657fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156113a257600080fd5b505afa1580156113b6573d6000803e3d6000fd5b505050506040513d60208110156113cc57600080fd5b5051604080516020888102828101820190935288825292935061140e9290918991899182918501908490808284376000920191909152508892506134e4915050565b866114b1828888600019810181811061142357fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561147f57600080fd5b505afa158015611493573d6000803e3d6000fd5b505050506040513d60208110156114a957600080fd5b5051906137e6565b10156114ee5760405162461bcd60e51b8152600401808060200182810382526028815260200180613fd86028913960400191505060405180910390fd5b5050505050505050565b804281101561153c576040805162461bcd60e51b81526020600482015260156024820152600080516020613e9d833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585600019810181811061157657fe5b905060200201356001600160a01b03166001600160a01b0316146115cf576040805162461bcd60e51b815260206004820152601a6024820152600080516020613ee2833981519152604482015290519081900360640190fd5b6115df858560008181106112cf57fe5b61161d8585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503092506134e4915050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561168c57600080fd5b505afa1580156116a0573d6000803e3d6000fd5b505050506040513d60208110156116b657600080fd5b50519050868110156116f95760405162461bcd60e51b8152600401808060200182810382526028815260200180613fd86028913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561175f57600080fd5b505af1158015611773573d6000803e3d6000fd5b505050506114ee8482612c37565b606081428110156117c7576040805162461bcd60e51b81526020600482015260156024820152600080516020613e9d833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316868660008181106117fe57fe5b905060200201356001600160a01b03166001600160a01b031614611857576040805162461bcd60e51b815260206004820152601a6024820152600080516020613ee2833981519152604482015290519081900360640190fd5b6118b57f000000000000000000000000000000000000000000000000000000000000000034888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612e0792505050565b915086826001845103815181106118c857fe5b6020026020010151101561190d5760405162461bcd60e51b8152600401808060200182810382526028815260200180613fd86028913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08360008151811061194957fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561197c57600080fd5b505af1158015611990573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6119f57f00000000000000000000000000000000000000000000000000000000000000008989600081811061131157fe5b84600081518110611a0257fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611a5057600080fd5b505af1158015611a64573d6000803e3d6000fd5b505050506040513d6020811015611a7a57600080fd5b5051611a8257fe5b611ac18287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061316f915050565b5095945050505050565b6000610c39848484613836565b60608142811015611b1e576040805162461bcd60e51b81526020600482015260156024820152600080516020613e9d833981519152604482015290519081900360640190fd5b611b7c7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133ac92505050565b91508682600081518110611b8c57fe5b602002602001015111156110a05760405162461bcd60e51b8152600401808060200182810382526024815260200180613f6f6024913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610c3984848461390e565b60008142811015611c48576040805162461bcd60e51b81526020600482015260156024820152600080516020613e9d833981519152604482015290519081900360640190fd5b611c77887f000000000000000000000000000000000000000000000000000000000000000089898930896120f9565b905080925050611d0088858a6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015611ccf57600080fd5b505afa158015611ce3573d6000803e3d6000fd5b505050506040513d6020811015611cf957600080fd5b5051612acd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611d6657600080fd5b505af1158015611d7a573d6000803e3d6000fd5b50505050610f638483612c37565b8042811015611dcc576040805162461bcd60e51b81526020600482015260156024820152600080516020613e9d833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685856000818110611e0357fe5b905060200201356001600160a01b03166001600160a01b031614611e5c576040805162461bcd60e51b815260206004820152601a6024820152600080516020613ee2833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ebc57600080fd5b505af1158015611ed0573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611f357f00000000000000000000000000000000000000000000000000000000000000008989600081811061131157fe5b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611f7c57600080fd5b505af1158015611f90573d6000803e3d6000fd5b505050506040513d6020811015611fa657600080fd5b5051611fae57fe5b600086866000198101818110611fc057fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561201c57600080fd5b505afa158015612030573d6000803e3d6000fd5b505050506040513d602081101561204657600080fd5b505160408051602089810282810182019093528982529293506120889290918a918a9182918501908490808284376000920191909152508992506134e4915050565b876114b1828989600019810181811061209d57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561147f57600080fd5b6000808242811015612140576040805162461bcd60e51b81526020600482015260156024820152600080516020613e9d833981519152604482015290519081900360640190fd5b600061216d7f00000000000000000000000000000000000000000000000000000000000000008c8c612f53565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b1580156121c857600080fd5b505af11580156121dc573d6000803e3d6000fd5b505050506040513d60208110156121f257600080fd5b50506040805163226bf2d160e21b81526001600160a01b03888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b15801561223f57600080fd5b505af1158015612253573d6000803e3d6000fd5b505050506040513d604081101561226957600080fd5b508051602090910151909250905060006122838e8e6139b4565b509050806001600160a01b03168e6001600160a01b0316146122a65781836122a9565b82825b90975095508a8710156122ed5760405162461bcd60e51b81526004018080602001828103825260238152602001806140006023913960400191505060405180910390fd5b8986101561232c5760405162461bcd60e51b8152600401808060200182810382526023815260200180613f246023913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060610f9b7f00000000000000000000000000000000000000000000000000000000000000008484612e07565b600080600083428110156123d7576040805162461bcd60e51b81526020600482015260156024820152600080516020613e9d833981519152604482015290519081900360640190fd5b6123e58c8c8c8c8c8c613a92565b909450925060006124177f00000000000000000000000000000000000000000000000000000000000000008e8e612f53565b90506124258d338388613012565b6124318c338387613012565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561248057600080fd5b505af1158015612494573d6000803e3d6000fd5b505050506040513d60208110156124aa57600080fd5b5051949d939c50939a509198505050505050505050565b6000806000834281101561250a576040805162461bcd60e51b81526020600482015260156024820152600080516020613e9d833981519152604482015290519081900360640190fd5b6125388a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613a92565b9094509250600061258a7f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000612f53565b90506125988b338388613012565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b1580156125f357600080fd5b505af1158015612607573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561268357600080fd5b505af1158015612697573d6000803e3d6000fd5b505050506040513d60208110156126ad57600080fd5b50516126b557fe5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050602060405180830381600087803b15801561270457600080fd5b505af1158015612718573d6000803e3d6000fd5b505050506040513d602081101561272e57600080fd5b50519250348410156127465761274633853403612c37565b505096509650969350505050565b6060814281101561279a576040805162461bcd60e51b81526020600482015260156024820152600080516020613e9d833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316868660008181106127d157fe5b905060200201356001600160a01b03166001600160a01b03161461282a576040805162461bcd60e51b815260206004820152601a6024820152600080516020613ee2833981519152604482015290519081900360640190fd5b6128887f0000000000000000000000000000000000000000000000000000000000000000888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506133ac92505050565b9150348260008151811061289857fe5b602002602001015111156128dd5760405162461bcd60e51b8152600401808060200182810382526024815260200180613f6f6024913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08360008151811061291957fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561294c57600080fd5b505af1158015612960573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6129c57f00000000000000000000000000000000000000000000000000000000000000008989600081811061131157fe5b846000815181106129d257fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015612a2057600080fd5b505af1158015612a34573d6000803e3d6000fd5b505050506040513d6020811015612a4a57600080fd5b5051612a5257fe5b612a918287878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061316f915050565b81600081518110612a9e57fe5b6020026020010151341115611ac157611ac13383600081518110612abe57fe5b60200260200101513403612c37565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310612b4a5780518252601f199092019160209182019101612b2b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612bac576040519150601f19603f3d011682016040523d82523d6000602084013e612bb1565b606091505b5091509150818015612bdf575080511580612bdf5750808060200190516020811015612bdc57600080fd5b50515b612c30576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b60208310612c835780518252601f199092019160209182019101612c64565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612ce5576040519150601f19603f3d011682016040523d82523d6000602084013e612cea565b606091505b5050905080612d2a5760405162461bcd60e51b8152600401808060200182810382526023815260200180613fb56023913960400191505060405180910390fd5b505050565b6000808411612d6f5760405162461bcd60e51b8152600401808060200182810382526028815260200180613f476028913960400191505060405180910390fd5b600083118015612d7f5750600082115b612dba5760405162461bcd60e51b8152600401808060200182810382526025815260200180613ebd6025913960400191505060405180910390fd5b6000612dc8856103e5613d23565b90506000612dd68285613d23565b90506000612df083612dea886103e8613d23565b90613d86565b9050808281612dfb57fe5b04979650505050505050565b6060600282511015612e60576040805162461bcd60e51b815260206004820152601b60248201527f4d696d6f56324c6962726172793a20494e56414c49445f504154480000000000604482015290519081900360640190fd5b815167ffffffffffffffff81118015612e7857600080fd5b50604051908082528060200260200182016040528015612ea2578160200160208202803683370190505b5090508281600081518110612eb357fe5b60200260200101818152505060005b6001835103811015612f4b57600080612f0587868581518110612ee157fe5b6020026020010151878660010181518110612ef857fe5b6020026020010151613dd5565b91509150612f27848481518110612f1857fe5b60200260200101518383612d2f565b848460010181518110612f3657fe5b60209081029190910101525050600101612ec2565b509392505050565b6000806000612f6285856139b4565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527ed8258f07455ccf2a627e421c1b67a5235293aa73a2d17be60109e9200cb37f609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106130975780518252601f199092019160209182019101613078565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146130f9576040519150601f19603f3d011682016040523d82523d6000602084013e6130fe565b606091505b509150915081801561312c57508051158061312c575080806020019051602081101561312957600080fd5b50515b6131675760405162461bcd60e51b81526004018080602001828103825260248152602001806140236024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156133a65760008084838151811061318d57fe5b60200260200101518584600101815181106131a457fe5b60200260200101519150915060006131bc83836139b4565b50905060008785600101815181106131d057fe5b60200260200101519050600080836001600160a01b0316866001600160a01b0316146131fe57826000613202565b6000835b91509150600060028a51038810613219578861325a565b61325a7f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061324d57fe5b6020026020010151612f53565b90506132877f00000000000000000000000000000000000000000000000000000000000000008888612f53565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f1916602001820160405280156132c4576020820181803683370190505b506040518563ffffffff1660e01b815260040180858152602001848152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561332c578181015183820152602001613314565b50505050905090810190601f1680156133595780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561337b57600080fd5b505af115801561338f573d6000803e3d6000fd5b505060019099019850613172975050505050505050565b50505050565b6060600282511015613405576040805162461bcd60e51b815260206004820152601b60248201527f4d696d6f56324c6962726172793a20494e56414c49445f504154480000000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561341d57600080fd5b50604051908082528060200260200182016040528015613447578160200160208202803683370190505b509050828160018351038151811061345b57fe5b60209081029190910101528151600019015b8015612f4b5760008061349d8786600186038151811061348957fe5b6020026020010151878681518110612ef857fe5b915091506134bf8484815181106134b057fe5b60200260200101518383613836565b8460018503815181106134ce57fe5b602090810291909101015250506000190161346d565b60005b6001835103811015612d2a5760008084838151811061350257fe5b602002602001015185846001018151811061351957fe5b602002602001015191509150600061353183836139b4565b50905060006135617f00000000000000000000000000000000000000000000000000000000000000008585612f53565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156135a257600080fd5b505afa1580156135b6573d6000803e3d6000fd5b505050506040513d60608110156135cc57600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614613602578284613605565b83835b9150915061365a828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561147f57600080fd5b9550613667868383612d2f565b945050505050600080856001600160a01b0316886001600160a01b03161461369157826000613695565b6000835b91509150600060028c51038a106136ac578a6136e0565b6136e07f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061324d57fe5b604080516000808252602082019283905263022c0d9f60e01b835260248201878152604483018790526001600160a01b038086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b8381101561376a578181015183820152602001613752565b50505050905090810190601f1680156137975780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156137b957600080fd5b505af11580156137cd573d6000803e3d6000fd5b50506001909b019a506134e79950505050505050505050565b80820382811115610f9e576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b60008084116138765760405162461bcd60e51b81526004018080602001828103825260298152602001806140476029913960400191505060405180910390fd5b6000831180156138865750600082115b6138c15760405162461bcd60e51b8152600401808060200182810382526025815260200180613ebd6025913960400191505060405180910390fd5b60006138d96103e86138d38688613d23565b90613d23565b905060006138ed6103e56138d386896137e6565b905061390460018284816138fd57fe5b0490613d86565b9695505050505050565b600080841161394e5760405162461bcd60e51b8152600401808060200182810382526022815260200180613f026022913960400191505060405180910390fd5b60008311801561395e5750600082115b6139995760405162461bcd60e51b8152600401808060200182810382526025815260200180613ebd6025913960400191505060405180910390fd5b826139a48584613d23565b816139ab57fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415613a085760405162461bcd60e51b8152600401808060200182810382526022815260200180613f936022913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613a28578284613a2b565b83835b90925090506001600160a01b038216613a8b576040805162461bcd60e51b815260206004820152601b60248201527f4d696d6f56324c6962726172793a205a45524f5f414444524553530000000000604482015290519081900360640190fd5b9250929050565b60008060006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a439058a8a6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015613b1e57600080fd5b505afa158015613b32573d6000803e3d6000fd5b505050506040513d6020811015613b4857600080fd5b50516001600160a01b03161415613c06577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c9c6539689896040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b0316815260200192505050602060405180830381600087803b158015613bd957600080fd5b505af1158015613bed573d6000803e3d6000fd5b505050506040513d6020811015613c0357600080fd5b50505b600080613c347f00000000000000000000000000000000000000000000000000000000000000008b8b613dd5565b91509150816000148015613c46575080155b15613c5657879350869250613d16565b6000613c6389848461390e565b9050878111613cb65785811015613cab5760405162461bcd60e51b8152600401808060200182810382526023815260200180613f246023913960400191505060405180910390fd5b889450925082613d14565b6000613cc389848661390e565b905089811115613ccf57fe5b87811015613d0e5760405162461bcd60e51b81526004018080602001828103825260238152602001806140006023913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b6000811580613d3e57505080820282828281613d3b57fe5b04145b610f9e576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015610f9e576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b6000806000613de485856139b4565b509050600080613df5888888612f53565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015613e2d57600080fd5b505afa158015613e41573d6000803e3d6000fd5b505050506040513d6060811015613e5757600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b0387811690841614613e8a578082613e8d565b81815b9099909850965050505050505056fe4d696d6f5632526f757465723a204558504952454400000000000000000000004d696d6f56324c6962726172793a20494e53554646494349454e545f4c49515549444954594d696d6f5632526f757465723a20494e56414c49445f504154480000000000004d696d6f56324c6962726172793a20494e53554646494349454e545f414d4f554e544d696d6f5632526f757465723a20494e53554646494349454e545f425f414d4f554e544d696d6f56324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e544d696d6f5632526f757465723a204558434553534956455f494e5055545f414d4f554e544d696d6f56324c6962726172793a204944454e544943414c5f4144445245535345535472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45444d696d6f5632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e544d696d6f5632526f757465723a20494e53554646494349454e545f415f414d4f554e545472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c45444d696d6f56324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e54a26469706673582212202d3dea9a32169db938068bfb246c15b23848360cc58747d272c74df8b12370f064736f6c634300060c0033

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