ETH Price: $3,669.70 (+0.72%)
 

Overview

ETH Balance

0.00016186 ETH

Eth Value

$0.59 (@ $3,669.70/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Uni Swap V2To174958202023-06-17 0:00:11570 days ago1686960011IN
0x621B01E5...9452a019f
0 ETH0.000529516.79795787
Uni Swap V2To174958112023-06-16 23:58:23570 days ago1686959903IN
0x621B01E5...9452a019f
0 ETH0.0004796615.21689201
Balancer Swap To174451722023-06-09 20:55:35577 days ago1686344135IN
0x621B01E5...9452a019f
0 ETH0.0018766625.76390864
Balancer Swap To174451632023-06-09 20:53:47577 days ago1686344027IN
0x621B01E5...9452a019f
0 ETH0.0019173426.32234548
Balancer Swap To174451482023-06-09 20:50:47577 days ago1686343847IN
0x621B01E5...9452a019f
0 ETH0.0022940631.49411075
Uni Swap V2To174159912023-06-05 18:08:47581 days ago1685988527IN
0x621B01E5...9452a019f
0 ETH0.0090401557.74724467
Uni Swap V3To174113242023-06-05 2:17:59582 days ago1685931479IN
0x621B01E5...9452a019f
0 ETH0.000567918.1997792
Uni Swap V2To173733762023-05-30 17:59:23587 days ago1685469563IN
0x621B01E5...9452a019f
0 ETH0.0016153751.26555973
Uni Swap V2To173733702023-05-30 17:57:59587 days ago1685469479IN
0x621B01E5...9452a019f
0 ETH0.0015289248.52203992
Balancer Swap To173729772023-05-30 16:38:59587 days ago1685464739IN
0x621B01E5...9452a019f
0 ETH0.0042858759.03980462
Balancer Swap To173729402023-05-30 16:31:35587 days ago1685464295IN
0x621B01E5...9452a019f
0 ETH0.0046914264.3957596
Balancer Swap To173678452023-05-29 23:16:11588 days ago1685402171IN
0x621B01E5...9452a019f
0 ETH0.0026699736.65488861
Balancer Swap To173678252023-05-29 23:12:11588 days ago1685401931IN
0x621B01E5...9452a019f
0 ETH0.0024702633.9130898
Balancer Swap To173678222023-05-29 23:11:35588 days ago1685401895IN
0x621B01E5...9452a019f
0 ETH0.0025743535.34206043
Uni Swap V2To173654202023-05-29 15:05:23588 days ago1685372723IN
0x621B01E5...9452a019f
0 ETH0.0021157267.11901404
Balancer Swap To173623642023-05-29 4:46:47589 days ago1685335607IN
0x621B01E5...9452a019f
0 ETH0.0018922926.067134
Uni Swap V2To173622942023-05-29 4:32:35589 days ago1685334755IN
0x621B01E5...9452a019f
0 ETH0.0007315823.21757187
Uni Swap V2To173622672023-05-29 4:26:59589 days ago1685334419IN
0x621B01E5...9452a019f
0 ETH0.0007985725.34345377
Uni Swap V2To173400402023-05-26 1:34:23592 days ago1685064863IN
0x621B01E5...9452a019f
0 ETH0.00081425.82324514
Uni Swap V2To173400362023-05-26 1:33:35592 days ago1685064815IN
0x621B01E5...9452a019f
0 ETH0.0009152829.03632149
Balancer Swap To173398562023-05-26 0:57:11592 days ago1685062631IN
0x621B01E5...9452a019f
0 ETH0.0019962327.49452076
Balancer Swap To173175402023-05-22 21:35:23595 days ago1684791323IN
0x621B01E5...9452a019f
0 ETH0.0057806679
Balancer Swap To173155612023-05-22 14:56:11595 days ago1684767371IN
0x621B01E5...9452a019f
0 ETH0.0040569755.88665009
Uni Swap V3To173128892023-05-22 5:54:35596 days ago1684734875IN
0x621B01E5...9452a019f
0 ETH0.0008028925.74028476
Uni Swap V3To173117352023-05-22 1:59:47596 days ago1684720787IN
0x621B01E5...9452a019f
0 ETH0.0008511727.28813116
View all transactions

Latest 16 internal transactions

Advanced mode:
Parent Transaction Hash Block
From
To
171708682023-05-02 4:57:59616 days ago1683003479
0x621B01E5...9452a019f
15.30425095 ETH
171708682023-05-02 4:57:59616 days ago1683003479
0x621B01E5...9452a019f
15.30425095 ETH
170906092023-04-20 22:24:23627 days ago1682029463
0x621B01E5...9452a019f
0.089982 ETH
170215032023-04-11 1:04:59637 days ago1681175099
0x621B01E5...9452a019f
0.52269544 ETH
169868722023-04-06 3:07:47642 days ago1680750467
0x621B01E5...9452a019f
0.009998 ETH
168030112023-03-11 6:18:23668 days ago1678515503
0x621B01E5...9452a019f
0.069986 ETH
167660262023-03-06 1:23:35673 days ago1678065815
0x621B01E5...9452a019f
0.019996 ETH
166952792023-02-24 2:34:59683 days ago1677206099
0x621B01E5...9452a019f
0.04999 ETH
166578382023-02-18 20:18:35688 days ago1676751515
0x621B01E5...9452a019f
0.034993 ETH
165995122023-02-10 16:20:47696 days ago1676046047
0x621B01E5...9452a019f
6.94861 ETH
165820272023-02-08 5:38:59699 days ago1675834739
0x621B01E5...9452a019f
0.04999 ETH
165768812023-02-07 12:23:35699 days ago1675772615
0x621B01E5...9452a019f
0.0009998 ETH
165671122023-02-06 3:38:59701 days ago1675654739
0x621B01E5...9452a019f
0.129974 ETH
162320462022-12-21 9:00:59748 days ago1671613259
0x621B01E5...9452a019f
0.0009998 ETH
162197362022-12-19 15:47:47749 days ago1671464867
0x621B01E5...9452a019f
0.004999 ETH
162197192022-12-19 15:44:23749 days ago1671464663
0x621B01E5...9452a019f
0.0044991 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MainnetRouter

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 13 : MainnetRouter.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

import "../interfaces/router/IUniswapV1Router.sol";
import "../interfaces/router/IUniswapV2Router.sol";
import "../interfaces/router/IUniswapV3Router.sol";
import "../interfaces/router/IBalancerRouter.sol";
import "../interfaces/router/ICurveTC1Router.sol";
import "../interfaces/router/IBancorRouter.sol";
import "../interfaces/router/IDodoRouter.sol";
import "../interfaces/router/IKyberRouter.sol";
import "@rari-capital/solmate/src/utils/SafeTransferLib.sol";
import "@rari-capital/solmate/src/tokens/ERC20.sol";
import "@rari-capital/solmate/src/tokens/WETH.sol";

// Import hardhat console
import "hardhat/console.sol";

/// @title Router contract that swaps tokens with different DEXs.
contract MainnetRouter {
    IUniswapV3Router private immutable UniV3Router;
    ICurveTC1Router private immutable curveTC1Router;
    IBalancerRouter private immutable balancer;
    IBancorRouter private immutable bancorRouter;
    IDodoRouter private immutable DodoV2Router;
    address public immutable DODOApproveProxy;
    WETH private immutable WETHContract;
    address private constant ETH_ADDRESS =
        0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
    uint32 public immutable _fee;

    constructor(
        IUniswapV3Router _uniswapV3Router,
        IBalancerRouter _balancer,
        ICurveTC1Router _curveTC1Router,
        IBancorRouter _bancorRouter,
        IDodoRouter _DodoRouter,
        address _dodoApproveProxy,
        address payable _WETHAddress,
        uint32 fee
    ) {
        UniV3Router = _uniswapV3Router;
        balancer = _balancer;
        curveTC1Router = _curveTC1Router;
        bancorRouter = _bancorRouter;
        DodoV2Router = _DodoRouter;
        DODOApproveProxy = _dodoApproveProxy;
        WETHContract = WETH(_WETHAddress);
        _fee = fee;
    }

    struct Amounts {
        uint256 amountIn;
        uint256 amountOutMin;
        uint256 minETH;
    }

    /// @notice Swap tokens using UniV1 router with to address specified
    // NOTE: No input checks - should be checked in the frontend
    /// @param amounts Struct with amountIn, Out, and minEth to avoid stack to deep error
    /// @param path The addresses of tokens to be swapped - source token and destination token
    /// @param pair The pool address for the tokens to be swapped
    /// @param deadline The deadline for the swap
    /// @param to The receiver address
    /// @return amountOut The amount of destination token received
    function uniSwapV1To(
        Amounts memory amounts,
        address[] calldata path,
        address pair,
        uint256 deadline,
        address to,
        bool toETH
    ) public payable returns (uint256 amountOut) {
        if (msg.value != 0) {
            unchecked {
                amountOut = IUniswapV1Router(pair).ethToTokenTransferInput{
                    value: (msg.value * _fee) / 10000
                }(amounts.amountOutMin, deadline, to);
            }
        } else {
            SafeTransferLib.safeTransferFrom(
                ERC20(path[0]),
                msg.sender,
                address(this),
                amounts.amountIn
            );
            unchecked {
                amounts.amountIn = (amounts.amountIn * _fee) / 10000;
            }
            SafeTransferLib.safeApprove(ERC20(path[0]), pair, amounts.amountIn);
            if (toETH) {
                amountOut = IUniswapV1Router(pair).tokenToEthTransferInput(
                    amounts.amountIn,
                    amounts.amountOutMin,
                    deadline,
                    to
                );
            } else {
                amountOut = IUniswapV1Router(pair).tokenToTokenTransferInput(
                    amounts.amountIn,
                    amounts.amountOutMin,
                    amounts.minETH,
                    deadline,
                    to,
                    path[1]
                );
            }
        }
    }

    /// @notice Swap tokens using Sushiswap pool with to address specified
    // NOTE: No input checks - should be checked in the frontend
    /// @param amountIn The amount of source token to be swapped
    /// @param amountOutMin The minimum amount of destination token to be received
    /// @param path The addresses of tokens to be swapped - source token and destination token
    /// @param deadline The deadline for the swap
    /// @param to The receiver address
    /// @param router The address for the router being that forked UniV2 e.g. UniV2. Sushiswap, PancakeSwap etc.
    /// @return amountOut The amount of destination token received
    function uniSwapV2To(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] memory path,
        uint256 deadline,
        address to,
        IUniswapV2Router router
    ) public payable returns (uint256 amountOut) {
        uint256[] memory amounts;
        if (msg.value != 0) {
            unchecked {
                amounts = router.swapExactETHForTokens{
                    value: (msg.value * _fee) / 10000
                }(amountOutMin, path, to, deadline);
            }
        } else {
            bool ToETH = path[1] == address(0);
            SafeTransferLib.safeTransferFrom(
                ERC20(path[0]),
                msg.sender,
                address(this),
                amountIn
            );
            unchecked {
                amountIn = (amountIn * _fee) / 10000;
            }
            SafeTransferLib.safeApprove(
                ERC20(path[0]),
                address(router),
                amountIn
            );
            if (!ToETH) {
                amounts = router.swapExactTokensForTokens(
                    amountIn,
                    amountOutMin,
                    path,
                    to,
                    deadline
                );
            } else {
                path[1] = address(WETHContract);
                amounts = router.swapExactTokensForETH(
                    amountIn,
                    amountOutMin,
                    path,
                    to,
                    deadline
                );
            }
        }
        return amounts[1];
    }

    /// @notice Swap tokens using UniV3 router with to address specified
    // NOTE: No input checks - should be checked in the frontend
    /// @param amountIn The amount of source token to be swapped
    /// @param amountOutMin The minimum amount of destination token to be received
    /// @param path The addresses of tokens to be swapped - source token and destination token
    /// @param deadline The deadline for the swap
    /// @param fee The fee for the pool being swapped with
    /// @param to The receiver address
    /// @return amountOut The amount of destination token received
    function uniSwapV3To(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] memory path,
        uint256 deadline,
        uint24 fee,
        address payable to
    ) public payable returns (uint256 amountOut) {
        if (msg.value != 0) {
            unchecked {
                amountIn = (msg.value * _fee) / 10000;
            }
            WETHContract.deposit{value: amountIn}();
            SafeTransferLib.safeApprove(
                ERC20(path[0]),
                address(UniV3Router),
                amountIn
            );
            amountOut = UniV3Router.exactInputSingle(
                IUniswapV3Router.ExactInputSingleParams(
                    path[0],
                    path[1],
                    fee,
                    to,
                    deadline,
                    amountIn,
                    amountOutMin,
                    0
                )
            );
        } else {
            SafeTransferLib.safeTransferFrom(
                ERC20(path[0]),
                msg.sender,
                address(this),
                amountIn
            );
            unchecked {
                amountIn = (amountIn * _fee) / 10000;
            }
            SafeTransferLib.safeApprove(
                ERC20(path[0]),
                address(UniV3Router),
                amountIn
            );
            bool toETH = path[1] == address(0);
            if (!toETH) {
                amountOut = UniV3Router.exactInputSingle(
                    IUniswapV3Router.ExactInputSingleParams(
                        path[0],
                        path[1],
                        fee,
                        to,
                        deadline,
                        amountIn,
                        amountOutMin,
                        0
                    )
                );
            } else {
                amountOut = UniV3Router.exactInputSingle(
                    IUniswapV3Router.ExactInputSingleParams(
                        path[0],
                        address(WETHContract),
                        fee,
                        address(this),
                        deadline,
                        amountIn,
                        amountOutMin,
                        0
                    )
                );
                WETHContract.withdraw(amountOut);
                SafeTransferLib.safeTransferETH(to, amountOut);
            }
        }
    }

    /// @notice Swap tokens using Balancer router with to specified
    // NOTE: No input checks - should be checked in the frontend
    /// @param amountIn The amount of source token to be swapped
    /// @param amountOutMin The minimum amount of destination token to be received
    /// @param path The addresses of tokens to be swapped
    /// @param deadline The deadline for the swap
    /// @param poolId The id for the balancer pool
    /// @param to The receiver address
    /// @return amountOut The amount of destination token received from the swap
    function balancerSwapTo(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        uint256 deadline,
        bytes32 poolId,
        address payable to
    ) public payable returns (uint256 amountOut) {
        SafeTransferLib.safeTransferFrom(
            ERC20(path[0]),
            msg.sender,
            address(this),
            amountIn
        );
        unchecked {
            amountIn = (amountIn * _fee) / 10000;
        }
        SafeTransferLib.safeApprove(
            ERC20(path[0]),
            address(balancer),
            amountIn
        );
        amountOut = balancer.swap(
            IBalancerRouter.SingleSwap({
                poolId: poolId,
                kind: IBalancerRouter.SwapKind.GIVEN_IN,
                assetIn: path[0],
                assetOut: path[1],
                amount: amountIn,
                userData: "0x"
            }),
            IBalancerRouter.FundManagement({
                sender: address(this),
                fromInternalBalance: false,
                recipient: to,
                toInternalBalance: false
            }),
            amountOutMin,
            deadline
        );
    }

    /// @notice Swap tokens using Curve router with to address specified
    // NOTE: No input checks - should be checked in the frontend
    /// @param amountIn The amount of source token to be swapped
    /// @param amountOutMin The minimum amount of destination token to be received
    /// @param path The addresses of tokens to be swapped - token A and token B
    /// @param pair The pool address for the tokens to be swapped
    /// @param to The receiver address
    /// @return amountOut The amount of destination token received
    function curveSwapTo(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address pair,
        address to
    ) public payable returns (uint256 amountOut) {
        if (msg.value != 0) {
            unchecked {
                amountIn = (msg.value * _fee) / 10000;
                amountOut = curveTC1Router.exchange{value: amountIn}(
                    pair,
                    path[0],
                    path[1],
                    amountIn,
                    amountOutMin,
                    to
                );
            }
        } else {
            SafeTransferLib.safeTransferFrom(
                ERC20(path[0]),
                msg.sender,
                address(this),
                amountIn
            );
            unchecked {
                amountIn = (amountIn * _fee) / 10000;
            }
            SafeTransferLib.safeApprove(
                ERC20(path[0]),
                address(curveTC1Router),
                amountIn
            );
            amountOut = curveTC1Router.exchange(
                pair,
                path[0],
                path[1],
                amountIn,
                amountOutMin,
                to
            );
        }
    }

    /// @notice Swap tokens using UniV2 router with to address specified
    // NOTE: No input checks - should be checked in the frontend
    /// @param amountIn The amount of source token to be swapped
    /// @param amountOutMin The minimum amount of destination token to be received
    /// @param path The addresses of tokens to be swapped - source token and destination token
    /// @param deadline The deadline for the swap
    /// @param to The receiver address
    /// @return amountOut The amount of destination token received
    function bancorSwapTo(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] memory path,
        uint256 deadline,
        address to
    ) public payable returns (uint256 amountOut) {
        if (msg.value != 0) {
            unchecked {
                amountIn = (msg.value * _fee) / 10000;
                amountOut = bancorRouter.tradeBySourceAmount{value: amountIn}(
                    path[0],
                    path[1],
                    amountIn,
                    amountOutMin,
                    deadline,
                    to
                );
            }
        } else {
            SafeTransferLib.safeTransferFrom(
                ERC20(path[0]),
                msg.sender,
                address(this),
                amountIn
            );
            unchecked {
                amountIn = (amountIn * _fee) / 10000;
            }
            SafeTransferLib.safeApprove(
                ERC20(path[0]),
                address(bancorRouter),
                amountIn
            );
            amountOut = bancorRouter.tradeBySourceAmount(
                path[0],
                path[1],
                amountIn,
                amountOutMin,
                deadline,
                to
            );
        }
    }

    /// @notice Swap tokens using UniV2 router with to address specified
    // NOTE: No input checks - should be checked in the frontend
    /// @param amountIn The amount of source token to be swapped
    /// @param amountOutMin The minimum amount of destination token to be received
    /// @param path The addresses of tokens to be swapped - source token and destination token
    /// @param deadline The deadline for the swap
    /// @param to The receiver address
    /// @return amountOut The amount of destination token received
    function dodoSwapTo(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] memory path,
        address[] calldata pair,
        uint256 deadline,
        uint256 direction,
        address to
    ) public payable returns (uint256 amountOut) {
        if (msg.value != 0) {
            amountOut = DodoV2Router.dodoSwapV2ETHToToken{
                value: (msg.value * _fee) / 10000
            }(path[1], amountOutMin, pair, direction, false, deadline);
            SafeTransferLib.safeTransfer(ERC20(path[1]), to, amountOut);
        } else {
            bool toETH = path[1] == address(0);
            SafeTransferLib.safeTransferFrom(
                ERC20(path[0]),
                msg.sender,
                address(this),
                amountIn
            );
            unchecked {
                amountIn = (amountIn * _fee) / 10000;
            }
            SafeTransferLib.safeApprove(
                ERC20(path[0]),
                DODOApproveProxy,
                amountIn
            );
            if (toETH) {
                amountOut = DodoV2Router.dodoSwapV2TokenToETH(
                    path[0],
                    amountIn,
                    amountOutMin,
                    pair,
                    direction,
                    false,
                    deadline
                );
                SafeTransferLib.safeTransferETH(to, amountOut);
            } else {
                amountOut = DodoV2Router.dodoSwapV2TokenToToken(
                    path[0],
                    path[1],
                    amountIn,
                    amountOutMin,
                    pair,
                    direction,
                    false,
                    deadline
                );
                SafeTransferLib.safeTransfer(ERC20(path[1]), to, amountOut);
            }
        }
    }

    /// @notice Swap tokens using UniV3 router with to address specified
    // NOTE: No input checks - should be checked in the frontend
    /// @param amountIn The amount of source token to be swapped
    /// @param amountOutMin The minimum amount of destination token to be received
    /// @param path The addresses of tokens to be swapped - source token and destination token
    /// @param deadline The deadline for the swap
    /// @param fee The fee for the pool being swapped with
    /// @param to The receiver address
    /// @return amountOut The amount of destination token received
    function kyberSwapTo(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] memory path,
        uint256 deadline,
        uint24 fee,
        IKyberRouter router,
        address payable to
    ) public payable returns (uint256 amountOut) {
        if (msg.value != 0) {
            unchecked {
                amountIn = (msg.value * _fee) / 10000;
            }
            WETHContract.deposit{value: amountIn}();
            SafeTransferLib.safeApprove(
                ERC20(path[0]),
                address(router),
                amountIn
            );
            amountOut = router.swapExactInputSingle(
                IKyberRouter.ExactInputSingleParams(
                    path[0],
                    path[1],
                    fee,
                    to,
                    deadline,
                    amountIn,
                    amountOutMin,
                    0
                )
            );
        } else {
            SafeTransferLib.safeTransferFrom(
                ERC20(path[0]),
                msg.sender,
                address(this),
                amountIn
            );
            unchecked {
                amountIn = (amountIn * _fee) / 10000;
            }
            bool toETH = path[1] == address(0);
            SafeTransferLib.safeApprove(
                ERC20(path[0]),
                address(router),
                amountIn
            );
            if (!toETH) {
                amountOut = router.swapExactInputSingle(
                    IKyberRouter.ExactInputSingleParams(
                        path[0],
                        path[path.length - 1],
                        fee,
                        to,
                        deadline,
                        amountIn,
                        amountOutMin,
                        0
                    )
                );
            } else {
                amountOut = router.swapExactInputSingle(
                    IKyberRouter.ExactInputSingleParams(
                        path[0],
                        address(WETHContract),
                        fee,
                        address(this),
                        deadline,
                        amountIn,
                        amountOutMin,
                        0
                    )
                );
                WETHContract.withdraw(amountOut);
                SafeTransferLib.safeTransferETH(to, amountOut);
            }
        }
    }

    ////////////////////////////////////////// ADMIN FUNCTIONS //////////////////////////////////////////

    /// @notice Flushes the balance of the contract for a token to an address
    /// @param _token The address of the token to be flushed
    /// @param _to The address to which the balance will be flushed
    function flush(ERC20 _token, address _to) external {
        uint256 amount = _token.balanceOf(address(this));
        assembly {
            if iszero(
                eq(caller(), 0x123CB0304c7f65B0D48276b9857F4DF4733d1dd8) // Required address to flush
            ) {
                revert(0, 0)
            }
            // We'll write our calldata to this slot.
            let memPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with function selector
            mstore(0x00, 0xa9059cbb)
            mstore(0x20, _to) // append the 'to' argument
            mstore(0x40, amount) // append the 'amount' argument

            if iszero(
                and(
                    // Set success to whether the call reverted, if not we check it either
                    // returned exactly 1 (can't just be non-zero data), or had no return data.
                    or(eq(mload(0x00), 1), iszero(returndatasize())),
                    // We use 0x64 because that's the total length of our call data (0x04 + 0x20 * 3)
                    // Counterintuitively, this call() must be positioned after the or() in the
                    // surrounding and() because and() evaluates its arguments from right to left.
                    call(gas(), _token, 0, 0x1c, 0x60, 0x00, 0x20)
                    // Adjusted above by changing 0x64 to 0x60
                )
            ) {
                // Store the function selector of TransferFromFailed()
                mstore(0x00, 0x7939f424)
                // Revert with (offset, size)
                revert(0x1c, 0x04)
            }
            mstore(0x60, 0) // Restore the zero slot to zero
            mstore(0x40, memPointer) // Restore the mempointer
        }
    }

    /// @notice Flushes the ETH balance of the contract to an address
    /// @param to The address to which the balance will be flushed
    function flushETH(address to) external {
        uint256 amount = address(this).balance;
        assembly {
            if iszero(
                eq(caller(), 0x123CB0304c7f65B0D48276b9857F4DF4733d1dd8) // Required address to flush
            ) {
                revert(0, 0)
            }
            if iszero(
                and(
                    // Set success to whether the call reverted, if not we check it either
                    // returned exactly 1 (can't just be non-zero data), or had no return data.
                    or(eq(mload(0x00), 1), iszero(returndatasize())),
                    // We use 0x64 because that's the total length of our call data (0x04 + 0x20 * 3)
                    // Counterintuitively, this call() must be positioned after the or() in the
                    // surrounding and() because and() evaluates its arguments from right to left.
                    call(gas(), to, amount, 0, 0, 0, 0)
                    // Adjusted above by changing 0x64 to 0x60
                )
            ) {
                // Store the function selector of TransferFromFailed()
                mstore(0x00, 0x7939f424)
                // Revert with (offset, size)
                revert(0x1c, 0x04)
            }
        }
    }

    /// @notice receive fallback function for empty call data
    receive() external payable {}

    /// @notice fallback function when no other function matches
    fallback() external payable {}
}

File 2 of 13 : IUniswapV1Router.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.9;

interface IUniswapV1Router {
    function tokenToEthTransferInput(
        uint256 amountIn,
        uint256 amountOutMin,
        uint256 deadline,
        address to
    ) external returns (uint256 amountOut);

    function ethToTokenTransferInput(
        uint256 amountOutMin,
        uint256 deadline,
        address to
    ) external payable returns (uint256 amountOut);

    function tokenToTokenTransferInput(
        uint256 amountIn,
        uint256 amountOutMin,
        uint256 minETHOut,
        uint256 deadline,
        address recipient,
        address tokenAddress
    )
        external
        payable
        returns (uint256 amountOut);
}

File 3 of 13 : IUniswapV2Router.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.9;

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

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

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

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

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

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

File 4 of 13 : IUniswapV3Router.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

// import "@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol";

/// @title Router token swapping functionality
/// @notice Functions for swapping tokens via Uniswap V3
interface IUniswapV3Router {
    struct ExactInputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint256 deadline;
        uint256 amountIn;
        uint256 amountOutMinimum;
        uint160 sqrtPriceLimitX96;
    }

    /// @notice Swaps `amountIn` of one token for as much as possible of another token
    /// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata
    /// @return amountOut The amount of the received token
    function exactInputSingle(ExactInputSingleParams calldata params)
        external
        payable
        returns (uint256 amountOut);

    
    struct ExactInputParams {
        bytes path;
        address recipient;
        uint256 deadline;
        uint256 amountIn;
        uint256 amountOutMin;
    }

    function exactInput(ExactInputParams calldata params)
        external
        payable
        returns (uint256 amountOut);
}

File 5 of 13 : IBalancerRouter.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.9;

interface IBalancerRouter {
    enum SwapKind {
        GIVEN_IN,
        GIVEN_OUT
    }

    struct SingleSwap {
        bytes32 poolId;
        SwapKind kind;
        address assetIn;
        address assetOut;
        uint256 amount;
        bytes userData;
    }

    struct FundManagement {
        address sender;
        bool fromInternalBalance;
        address payable recipient;
        bool toInternalBalance;
    }

    struct Asset {
        string symbol;
        uint8 decimals;
        uint256 limit;
    }

    struct BatchSwapStep {
        bytes32 poolId;
        uint256 assetInIndex;
        uint256 assetOutIndex;
        uint256 amount;
        bytes userData;
    }

    function swap(
        SingleSwap memory swap,
        FundManagement memory fund,
        uint256 limit,
        uint256 deadline
    ) external payable returns (uint256);

    function batchSwap(
        SwapKind kind,
        BatchSwapStep[] calldata swaps,
        address[] calldata assets,
        FundManagement memory fund,
        int256[] calldata limits,
        uint256 deadline
    ) external payable returns (int256[] calldata assetDeltas);
}

File 6 of 13 : ICurveTC1Router.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.9;

interface ICurveTC1Router {
    function exchange_with_best_rate(
        address _from,
        address _to,
        uint256 _amount,
        uint256 _expected,
        address _receiver
    ) external returns (uint256);

    function exchange(
        address pool,
        address _from,
        address _to,
        uint256 _amount,
        uint256 _expected,
        address _receiver
    ) payable external returns (uint256);

    function exchange_multiple(
        address[9] calldata _route,
        uint256[3][4] calldata _swap_params,
        uint256 _amount,
        uint256 _expected,
        address[4] calldata _pools,
        address _receiver
    ) external payable returns (uint256);

    function is_killed() external view returns (bool);

    function registry() external view returns (address);
}

File 7 of 13 : IBancorRouter.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.9;

interface IBancorRouter {
    function tradeBySourceAmount(
        address sourceToken,
        address targetToken,
        uint256 sourceAmount,
        uint256 minReturnAmount,
        uint256 deadline,
        address receipient
    ) external payable returns (uint256 targetAmount);
}

File 8 of 13 : IDodoRouter.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.9;

interface IDodoRouter {
    function dodoSwapV2TokenToETH(
        address fromToken,
        uint256 fromTokenAmount,
        uint256 minReturnAmount,
        address[] memory dodoPairs,
        uint256 directions,
        bool isIncentive,
        uint256 deadLine
    ) external returns (uint256 amountOut);

    function dodoSwapV2ETHToToken(
        address toToken,
        uint256 minReturnAmount,
        address[] memory dodoPairs,
        uint256 direction,
        bool isIncentive,
        uint256 deadLine
    ) external payable returns (uint256 amountOut);

    function dodoSwapV2TokenToToken(
        address fromToken,
        address toToken,
        uint256 fromTokenAmount,
        uint256 minReturnAmount,
        address[] memory dodoPairs,
        uint256 directions,
        bool isIncentive,
        uint256 deadLine
    ) external returns (uint256 amountOut);
}

File 9 of 13 : IKyberRouter.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;

// import "@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol";

/// @title Router token swapping functionality
/// @notice Functions for swapping tokens via Uniswap V3
interface IKyberRouter {
    struct ExactInputSingleParams {
        address tokenIn;
        address tokenOut;
        uint24 fee;
        address recipient;
        uint256 deadline;
        uint256 amountIn;
        uint256 amountOutMinimum;
        uint160 sqrtPriceLimitX96;
    }

    /// @notice Swaps `amountIn` of one token for as much as possible of another token
    /// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata
    /// @return amountOut The amount of the received token
    function swapExactInputSingle(ExactInputSingleParams calldata params)
        external
        payable
        returns (uint256 amountOut);

    struct ExactInputParams {
        bytes path;
        address recipient;
        uint256 deadline;
        uint256 amountIn;
        uint256 amountOutMin;
    }

    function swapExactInput(ExactInputParams calldata params)
        external
        payable
        returns (uint256 amountOut);
}

File 10 of 13 : SafeTransferLib.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

import {ERC20} from "../tokens/ERC20.sol";

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.
library SafeTransferLib {
    /*//////////////////////////////////////////////////////////////
                             ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferETH(address to, uint256 amount) internal {
        bool success;

        assembly {
            // Transfer the ETH and store if it succeeded or not.
            success := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(success, "ETH_TRANSFER_FAILED");
    }

    /*//////////////////////////////////////////////////////////////
                            ERC20 OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferFrom(
        ERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        bool success;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), from) // Append the "from" argument.
            mstore(add(freeMemoryPointer, 36), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)
            )
        }

        require(success, "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "TRANSFER_FAILED");
    }

    function safeApprove(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "APPROVE_FAILED");
    }
}

File 11 of 13 : ERC20.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*//////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

File 12 of 13 : WETH.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

import {ERC20} from "./ERC20.sol";

import {SafeTransferLib} from "../utils/SafeTransferLib.sol";

/// @notice Minimalist and modern Wrapped Ether implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/WETH.sol)
/// @author Inspired by WETH9 (https://github.com/dapphub/ds-weth/blob/master/src/weth9.sol)
contract WETH is ERC20("Wrapped Ether", "WETH", 18) {
    using SafeTransferLib for address;

    event Deposit(address indexed from, uint256 amount);

    event Withdrawal(address indexed to, uint256 amount);

    function deposit() public payable virtual {
        _mint(msg.sender, msg.value);

        emit Deposit(msg.sender, msg.value);
    }

    function withdraw(uint256 amount) public virtual {
        _burn(msg.sender, amount);

        emit Withdrawal(msg.sender, amount);

        msg.sender.safeTransferETH(amount);
    }

    receive() external payable virtual {
        deposit();
    }
}

File 13 of 13 : console.sol
// SPDX-License-Identifier: MIT
pragma solidity >= 0.4.22 <0.9.0;

library console {
	address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

	function _sendLogPayload(bytes memory payload) private view {
		uint256 payloadLength = payload.length;
		address consoleAddress = CONSOLE_ADDRESS;
		assembly {
			let payloadStart := add(payload, 32)
			let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
		}
	}

	function log() internal view {
		_sendLogPayload(abi.encodeWithSignature("log()"));
	}

	function logInt(int p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(int)", p0));
	}

	function logUint(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function logString(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function logBool(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function logAddress(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function logBytes(bytes memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
	}

	function logBytes1(bytes1 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
	}

	function logBytes2(bytes2 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
	}

	function logBytes3(bytes3 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
	}

	function logBytes4(bytes4 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
	}

	function logBytes5(bytes5 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
	}

	function logBytes6(bytes6 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
	}

	function logBytes7(bytes7 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
	}

	function logBytes8(bytes8 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
	}

	function logBytes9(bytes9 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
	}

	function logBytes10(bytes10 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
	}

	function logBytes11(bytes11 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
	}

	function logBytes12(bytes12 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
	}

	function logBytes13(bytes13 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
	}

	function logBytes14(bytes14 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
	}

	function logBytes15(bytes15 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
	}

	function logBytes16(bytes16 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
	}

	function logBytes17(bytes17 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
	}

	function logBytes18(bytes18 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
	}

	function logBytes19(bytes19 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
	}

	function logBytes20(bytes20 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
	}

	function logBytes21(bytes21 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
	}

	function logBytes22(bytes22 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
	}

	function logBytes23(bytes23 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
	}

	function logBytes24(bytes24 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
	}

	function logBytes25(bytes25 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
	}

	function logBytes26(bytes26 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
	}

	function logBytes27(bytes27 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
	}

	function logBytes28(bytes28 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
	}

	function logBytes29(bytes29 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
	}

	function logBytes30(bytes30 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
	}

	function logBytes31(bytes31 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
	}

	function logBytes32(bytes32 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
	}

	function log(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function log(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function log(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function log(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function log(uint p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
	}

	function log(uint p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1));
	}

	function log(uint p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1));
	}

	function log(uint p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1));
	}

	function log(string memory p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1));
	}

	function log(string memory p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
	}

	function log(string memory p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
	}

	function log(string memory p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
	}

	function log(bool p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1));
	}

	function log(bool p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
	}

	function log(bool p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
	}

	function log(bool p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
	}

	function log(address p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1));
	}

	function log(address p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
	}

	function log(address p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
	}

	function log(address p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
	}

	function log(uint p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
	}

	function log(uint p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
	}

	function log(uint p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
	}

	function log(uint p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
	}

	function log(uint p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
	}

	function log(uint p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
	}

	function log(uint p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
	}

	function log(uint p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
	}

	function log(uint p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
	}

	function log(uint p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
	}

	function log(uint p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
	}

	function log(uint p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
	}

	function log(string memory p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2));
	}

	function log(string memory p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
	}

	function log(string memory p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
	}

	function log(string memory p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
	}

	function log(bool p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
	}

	function log(bool p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
	}

	function log(bool p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
	}

	function log(bool p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
	}

	function log(bool p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2));
	}

	function log(bool p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
	}

	function log(bool p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
	}

	function log(bool p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
	}

	function log(bool p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2));
	}

	function log(bool p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
	}

	function log(bool p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
	}

	function log(bool p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
	}

	function log(address p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
	}

	function log(address p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
	}

	function log(address p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
	}

	function log(address p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
	}

	function log(address p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2));
	}

	function log(address p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
	}

	function log(address p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
	}

	function log(address p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
	}

	function log(address p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2));
	}

	function log(address p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
	}

	function log(address p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
	}

	function log(address p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
	}

	function log(address p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2));
	}

	function log(address p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
	}

	function log(address p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
	}

	function log(address p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
	}

	function log(uint p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
	}

}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IUniswapV3Router","name":"_uniswapV3Router","type":"address"},{"internalType":"contract IBalancerRouter","name":"_balancer","type":"address"},{"internalType":"contract ICurveTC1Router","name":"_curveTC1Router","type":"address"},{"internalType":"contract IBancorRouter","name":"_bancorRouter","type":"address"},{"internalType":"contract IDodoRouter","name":"_DodoRouter","type":"address"},{"internalType":"address","name":"_dodoApproveProxy","type":"address"},{"internalType":"address payable","name":"_WETHAddress","type":"address"},{"internalType":"uint32","name":"fee","type":"uint32"}],"stateMutability":"nonpayable","type":"constructor"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DODOApproveProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_fee","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes32","name":"poolId","type":"bytes32"},{"internalType":"address payable","name":"to","type":"address"}],"name":"balancerSwapTo","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"bancorSwapTo","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"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":"pair","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"curveSwapTo","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"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":"pair","type":"address[]"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"direction","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"dodoSwapTo","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract ERC20","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"flush","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"flushETH","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":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"contract IKyberRouter","name":"router","type":"address"},{"internalType":"address payable","name":"to","type":"address"}],"name":"kyberSwapTo","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"uint256","name":"minETH","type":"uint256"}],"internalType":"struct MainnetRouter.Amounts","name":"amounts","type":"tuple"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"pair","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"toETH","type":"bool"}],"name":"uniSwapV1To","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"contract IUniswapV2Router","name":"router","type":"address"}],"name":"uniSwapV2To","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"address payable","name":"to","type":"address"}],"name":"uniSwapV3To","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101806040523480156200001257600080fd5b50604051620046b0380380620046b0833981810160405281019062000038919062000413565b8773ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508673ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508573ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508473ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff16815250508373ffffffffffffffffffffffffffffffffffffffff166101008173ffffffffffffffffffffffffffffffffffffffff16815250508273ffffffffffffffffffffffffffffffffffffffff166101208173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff16815250508063ffffffff166101608163ffffffff16815250505050505050505050620004dc565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001fc82620001cf565b9050919050565b60006200021082620001ef565b9050919050565b620002228162000203565b81146200022e57600080fd5b50565b600081519050620002428162000217565b92915050565b60006200025582620001ef565b9050919050565b620002678162000248565b81146200027357600080fd5b50565b60008151905062000287816200025c565b92915050565b60006200029a82620001ef565b9050919050565b620002ac816200028d565b8114620002b857600080fd5b50565b600081519050620002cc81620002a1565b92915050565b6000620002df82620001ef565b9050919050565b620002f181620002d2565b8114620002fd57600080fd5b50565b6000815190506200031181620002e6565b92915050565b60006200032482620001ef565b9050919050565b620003368162000317565b81146200034257600080fd5b50565b60008151905062000356816200032b565b92915050565b6200036781620001ef565b81146200037357600080fd5b50565b60008151905062000387816200035c565b92915050565b60006200039a82620001cf565b9050919050565b620003ac816200038d565b8114620003b857600080fd5b50565b600081519050620003cc81620003a1565b92915050565b600063ffffffff82169050919050565b620003ed81620003d2565b8114620003f957600080fd5b50565b6000815190506200040d81620003e2565b92915050565b600080600080600080600080610100898b031215620004375762000436620001ca565b5b6000620004478b828c0162000231565b98505060206200045a8b828c0162000276565b97505060406200046d8b828c01620002bb565b9650506060620004808b828c0162000300565b9550506080620004938b828c0162000345565b94505060a0620004a68b828c0162000376565b93505060c0620004b98b828c01620003bb565b92505060e0620004cc8b828c01620003fc565b9150509295985092959890939650565b60805160a05160c05160e051610100516101205161014051610160516140876200062960003960008181610317015281816105ec0152818161076401528181610a2401528181610b5501528181610d9a01528181610ef101528181611090015281816111810152818161147f015281816115fd015281816117c00152818161183f01528181611aa901528181611ed5015261217f015260008181610c590152818161187901528181611d2601528181611e2601528181611f0f0152818161245001526125500152600081816107bd015261179c0152600081816105ad015281816107ea01526108d0015260008181610dd401528181610f4a0152610f7101526000818161037d01526103a40152600081816114b901528181611663015261168a015260008181611faf01528181611fd6015281816121d80152818161225201526123d101526140876000f3fe6080604052600436106100ab5760003560e01c8063a354a50211610064578063a354a502146101cd578063a9bf959d146101fd578063c5b37c2214610228578063dc42688114610253578063ee6c571a1461027c578063f5bf2a32146102ac576100b2565b806327b4fbac146100b45780632d75fbc4146100e45780634271a6d11461011457806345534b9d146101445780636ccf08f2146101745780639cfddc36146101a4576100b2565b366100b257005b005b6100ce60048036038101906100c99190612955565b6102dc565b6040516100db9190612a13565b60405180910390f35b6100fe60048036038101906100f99190612bbb565b6105a2565b60405161010b9190612a13565b60405180910390f35b61012e60048036038101906101299190612cd7565b6109f7565b60405161013b9190612a13565b60405180910390f35b61015e60048036038101906101599190612d80565b610d8c565b60405161016b9190612a13565b60405180910390f35b61018e60048036038101906101899190612eb8565b611066565b60405161019b9190612a13565b60405180910390f35b3480156101b057600080fd5b506101cb60048036038101906101c69190612fa6565b611379565b005b6101e760048036038101906101e29190612fe6565b611471565b6040516101f49190612a13565b60405180910390f35b34801561020957600080fd5b5061021261179a565b60405161021f919061308f565b60405180910390f35b34801561023457600080fd5b5061023d6117be565b60405161024a91906130c9565b60405180910390f35b34801561025f57600080fd5b5061027a600480360381019061027591906130e4565b6117e2565b005b6102966004803603810190610291919061318a565b611831565b6040516102a39190612a13565b60405180910390f35b6102c660048036038101906102c19190613248565b611ec7565b6040516102d39190612a13565b60405180910390f35b6000610312868660008181106102f5576102f46132f1565b5b905060200201602081019061030a91906130e4565b33308b6125f0565b6127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff1689028161034c5761034b613320565b5b0497506103a286866000818110610366576103656132f1565b5b905060200201602081019061037b91906130e4565b7f00000000000000000000000000000000000000000000000000000000000000008a61268f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166352bbbe296040518060c00160405280868152602001600060018111156104035761040261334f565b5b81526020018989600081811061041c5761041b6132f1565b5b905060200201602081019061043191906130e4565b73ffffffffffffffffffffffffffffffffffffffff168152602001898960018181106104605761045f6132f1565b5b905060200201602081019061047591906130e4565b73ffffffffffffffffffffffffffffffffffffffff1681526020018b81526020016040518060400160405280600281526020017f307800000000000000000000000000000000000000000000000000000000000081525081525060405180608001604052803073ffffffffffffffffffffffffffffffffffffffff1681526020016000151581526020018673ffffffffffffffffffffffffffffffffffffffff168152602001600015158152508a886040518563ffffffff1660e01b81526004016105439493929190613577565b602060405180830381600087803b15801561055d57600080fd5b505af1158015610571573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059591906135d8565b9050979650505050505050565b60008034146106ea577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635028bb956127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff163461061c9190613634565b610626919061368e565b8960018151811061063a576106396132f1565b5b60200260200101518b8a8a8960008c6040518963ffffffff1660e01b815260040161066b9796959493929190613782565b6020604051808303818588803b15801561068457600080fd5b505af1158015610698573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906106bd91906135d8565b90506106e5876001815181106106d6576106d56132f1565b5b60200260200101518383612727565b6109eb565b60008073ffffffffffffffffffffffffffffffffffffffff1688600181518110610717576107166132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614905061075f8860008151811061074f5761074e6132f1565b5b602002602001015133308d6125f0565b6127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff168b028161079957610798613320565b5b0499506107e2886000815181106107b3576107b26132f1565b5b60200260200101517f00000000000000000000000000000000000000000000000000000000000000008c61268f565b80156108ce577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631e6d24c289600081518110610838576108376132f1565b5b60200260200101518c8c8b8b8a60008d6040518963ffffffff1660e01b815260040161086b9897969594939291906137ec565b602060405180830381600087803b15801561088557600080fd5b505af1158015610899573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bd91906135d8565b91506108c983836127bf565b6109e9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f87dc1b78960008151811061091e5761091d6132f1565b5b60200260200101518a60018151811061093a576109396132f1565b5b60200260200101518d8d8c8c8b60008e6040518a63ffffffff1660e01b815260040161096e99989796959493929190613864565b602060405180830381600087803b15801561098857600080fd5b505af115801561099c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c091906135d8565b91506109e8886001815181106109d9576109d86132f1565b5b60200260200101518484612727565b5b505b98975050505050505050565b6000606060003414610adb578273ffffffffffffffffffffffffffffffffffffffff16637ff36ab56127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff16340281610a5957610a58613320565b5b048989888a6040518663ffffffff1660e01b8152600401610a7d9493929190613971565b6000604051808303818588803b158015610a9657600080fd5b505af1158015610aaa573d6000803e3d6000fd5b50505050506040513d6000823e3d601f19601f82011682018060405250810190610ad49190613a80565b9050610d63565b60008073ffffffffffffffffffffffffffffffffffffffff1687600181518110610b0857610b076132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16149050610b5087600081518110610b4057610b3f6132f1565b5b602002602001015133308c6125f0565b6127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff168a0281610b8a57610b89613320565b5b049850610bb387600081518110610ba457610ba36132f1565b5b6020026020010151858b61268f565b80610c57578373ffffffffffffffffffffffffffffffffffffffff166338ed17398a8a8a898b6040518663ffffffff1660e01b8152600401610bf9959493929190613ac9565b600060405180830381600087803b158015610c1357600080fd5b505af1158015610c27573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610c509190613a80565b9150610d61565b7f000000000000000000000000000000000000000000000000000000000000000087600181518110610c8c57610c8b6132f1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508373ffffffffffffffffffffffffffffffffffffffff166318cbafe58a8a8a898b6040518663ffffffff1660e01b8152600401610d07959493929190613ac9565b600060405180830381600087803b158015610d2157600080fd5b505af1158015610d35573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d5e9190613a80565b91505b505b80600181518110610d7757610d766132f1565b5b60200260200101519150509695505050505050565b6000803414610ec5576127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff16340281610dcf57610dce613320565b5b0495507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3a4acd38786600081518110610e2357610e226132f1565b5b602002602001015187600181518110610e3f57610e3e6132f1565b5b60200260200101518a8a89896040518863ffffffff1660e01b8152600401610e6c96959493929190613b23565b6020604051808303818588803b158015610e8557600080fd5b505af1158015610e99573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ebe91906135d8565b905061105d565b610eec84600081518110610edc57610edb6132f1565b5b60200260200101513330896125f0565b6127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff16870281610f2657610f25613320565b5b049550610f6f84600081518110610f4057610f3f6132f1565b5b60200260200101517f00000000000000000000000000000000000000000000000000000000000000008861268f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d3a4acd385600081518110610fbf57610fbe6132f1565b5b602002602001015186600181518110610fdb57610fda6132f1565b5b6020026020010151898988886040518763ffffffff1660e01b815260040161100896959493929190613b23565b602060405180830381600087803b15801561102257600080fd5b505af1158015611036573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105a91906135d8565b90505b95945050505050565b6000803414611144578473ffffffffffffffffffffffffffffffffffffffff1663ad65d76d6127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff163402816110c5576110c4613320565b5b048a6020015187876040518563ffffffff1660e01b81526004016110eb93929190613b84565b6020604051808303818588803b15801561110457600080fd5b505af1158015611118573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061113d91906135d8565b905061136e565b61117c8787600081811061115b5761115a6132f1565b5b905060200201602081019061117091906130e4565b33308b600001516125f0565b6127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff16896000015102816111ba576111b9613320565b5b048860000181815250506111fb878760008181106111db576111da6132f1565b5b90506020020160208101906111f091906130e4565b868a6000015161268f565b81156112a1578473ffffffffffffffffffffffffffffffffffffffff16637237e03189600001518a6020015187876040518563ffffffff1660e01b81526004016112489493929190613bbb565b602060405180830381600087803b15801561126257600080fd5b505af1158015611276573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129a91906135d8565b905061136d565b8473ffffffffffffffffffffffffffffffffffffffff1663f552d91b89600001518a602001518b6040015188888d8d60018181106112e2576112e16132f1565b5b90506020020160208101906112f791906130e4565b6040518763ffffffff1660e01b815260040161131896959493929190613c00565b602060405180830381600087803b15801561133257600080fd5b505af1158015611346573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136a91906135d8565b90505b5b979650505050505050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113b4919061308f565b60206040518083038186803b1580156113cc57600080fd5b505afa1580156113e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140491906135d8565b905073123cb0304c7f65b0d48276b9857f4df4733d1dd8331461142657600080fd5b60405163a9059cbb6000528260205281604052602060006060601c6000885af13d15600160005114171661146257637939f4246000526004601cfd5b60006060528060405250505050565b60008034146115c4576127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff163402816114b4576114b3613320565b5b0496507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631a4c1ca3888588886000818110611509576115086132f1565b5b905060200201602081019061151e91906130e4565b89896001818110611532576115316132f1565b5b905060200201602081019061154791906130e4565b8c8c896040518863ffffffff1660e01b815260040161156b96959493929190613c61565b6020604051808303818588803b15801561158457600080fd5b505af1158015611598573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906115bd91906135d8565b9050611790565b6115f8858560008181106115db576115da6132f1565b5b90506020020160208101906115f091906130e4565b33308a6125f0565b6127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff1688028161163257611631613320565b5b0496506116888585600081811061164c5761164b6132f1565b5b905060200201602081019061166191906130e4565b7f00000000000000000000000000000000000000000000000000000000000000008961268f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631a4c1ca384878760008181106116d9576116d86132f1565b5b90506020020160208101906116ee91906130e4565b88886001818110611702576117016132f1565b5b905060200201602081019061171791906130e4565b8b8b886040518763ffffffff1660e01b815260040161173b96959493929190613c61565b602060405180830381600087803b15801561175557600080fd5b505af1158015611769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178d91906135d8565b90505b9695505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600047905073123cb0304c7f65b0d48276b9857f4df4733d1dd8331461180757600080fd5b60008060008084865af13d15600160005114171661182d57637939f4246000526004601cfd5b5050565b6000803414611a7d576127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff1634028161187457611873613320565b5b0497507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0896040518263ffffffff1660e01b81526004016000604051808303818588803b1580156118df57600080fd5b505af11580156118f3573d6000803e3d6000fd5b505050505061191e8660008151811061190f5761190e6132f1565b5b6020026020010151848a61268f565b8273ffffffffffffffffffffffffffffffffffffffff1663a8c9ed676040518061010001604052808960008151811061195a576119596132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16815260200189600181518110611991576119906132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018762ffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018b81526020018a8152602001600073ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b8152600401611a249190613d82565b602060405180830381600087803b158015611a3e57600080fd5b505af1158015611a52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7691906135d8565b9050611ebc565b611aa486600081518110611a9457611a936132f1565b5b602002602001015133308b6125f0565b6127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff16890281611ade57611add613320565b5b04975060008073ffffffffffffffffffffffffffffffffffffffff1687600181518110611b0e57611b0d6132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16149050611b5587600081518110611b4657611b456132f1565b5b6020026020010151858b61268f565b80611cc5578373ffffffffffffffffffffffffffffffffffffffff1663a8c9ed676040518061010001604052808a600081518110611b9657611b956132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018a60018c51611bc89190613d9e565b81518110611bd957611bd86132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018862ffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018c81526020018b8152602001600073ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b8152600401611c6c9190613d82565b602060405180830381600087803b158015611c8657600080fd5b505af1158015611c9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cbe91906135d8565b9150611eba565b8373ffffffffffffffffffffffffffffffffffffffff1663a8c9ed676040518061010001604052808a600081518110611d0157611d006132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018862ffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018c81526020018b8152602001600073ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b8152600401611dd09190613d82565b602060405180830381600087803b158015611dea57600080fd5b505af1158015611dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2291906135d8565b91507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b8152600401611e7d9190612a13565b600060405180830381600087803b158015611e9757600080fd5b505af1158015611eab573d6000803e3d6000fd5b50505050611eb983836127bf565b5b505b979650505050505050565b6000803414612153576127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff16340281611f0a57611f09613320565b5b0496507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0886040518263ffffffff1660e01b81526004016000604051808303818588803b158015611f7557600080fd5b505af1158015611f89573d6000803e3d6000fd5b5050505050611fd485600081518110611fa557611fa46132f1565b5b60200260200101517f00000000000000000000000000000000000000000000000000000000000000008961268f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663414bf389604051806101000160405280886000815181106120305761202f6132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16815260200188600181518110612067576120666132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018662ffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018a8152602001898152602001600073ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b81526004016120fa9190613e74565b602060405180830381600087803b15801561211457600080fd5b505af1158015612128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214c91906135d8565b90506125e6565b61217a8560008151811061216a576121696132f1565b5b602002602001015133308a6125f0565b6127107f000000000000000000000000000000000000000000000000000000000000000063ffffffff168802816121b4576121b3613320565b5b0496506121fd856000815181106121ce576121cd6132f1565b5b60200260200101517f00000000000000000000000000000000000000000000000000000000000000008961268f565b60008073ffffffffffffffffffffffffffffffffffffffff168660018151811061222a576122296132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16149050806123cf577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663414bf389604051806101000160405280896000815181106122ac576122ab6132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168152602001896001815181106122e3576122e26132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018762ffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018b81526020018a8152602001600073ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b81526004016123769190613e74565b602060405180830381600087803b15801561239057600080fd5b505af11580156123a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c891906135d8565b91506125e4565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663414bf3896040518061010001604052808960008151811061242b5761242a6132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020018762ffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018b81526020018a8152602001600073ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b81526004016124fa9190613e74565b602060405180830381600087803b15801561251457600080fd5b505af1158015612528573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254c91906135d8565b91507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b81526004016125a79190612a13565b600060405180830381600087803b1580156125c157600080fd5b505af11580156125d5573d6000803e3d6000fd5b505050506125e383836127bf565b5b505b9695505050505050565b60006040517f23b872dd0000000000000000000000000000000000000000000000000000000081528460048201528360248201528260448201526020600060648360008a5af13d15601f3d1160016000511416171691505080612688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267f90613eed565b60405180910390fd5b5050505050565b60006040517f095ea7b3000000000000000000000000000000000000000000000000000000008152836004820152826024820152602060006044836000895af13d15601f3d1160016000511416171691505080612721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271890613f59565b60405180910390fd5b50505050565b60006040517fa9059cbb000000000000000000000000000000000000000000000000000000008152836004820152826024820152602060006044836000895af13d15601f3d11600160005114161716915050806127b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b090613fc5565b60405180910390fd5b50505050565b600080600080600085875af190508061280d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280490614031565b60405180910390fd5b505050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61283981612826565b811461284457600080fd5b50565b60008135905061285681612830565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126128815761288061285c565b5b8235905067ffffffffffffffff81111561289e5761289d612861565b5b6020830191508360208202830111156128ba576128b9612866565b5b9250929050565b6000819050919050565b6128d4816128c1565b81146128df57600080fd5b50565b6000813590506128f1816128cb565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612922826128f7565b9050919050565b61293281612917565b811461293d57600080fd5b50565b60008135905061294f81612929565b92915050565b600080600080600080600060c0888a0312156129745761297361281c565b5b60006129828a828b01612847565b97505060206129938a828b01612847565b965050604088013567ffffffffffffffff8111156129b4576129b3612821565b5b6129c08a828b0161286b565b955095505060606129d38a828b01612847565b93505060806129e48a828b016128e2565b92505060a06129f58a828b01612940565b91505092959891949750929550565b612a0d81612826565b82525050565b6000602082019050612a286000830184612a04565b92915050565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a7782612a2e565b810181811067ffffffffffffffff82111715612a9657612a95612a3f565b5b80604052505050565b6000612aa9612812565b9050612ab58282612a6e565b919050565b600067ffffffffffffffff821115612ad557612ad4612a3f565b5b602082029050602081019050919050565b6000612af1826128f7565b9050919050565b612b0181612ae6565b8114612b0c57600080fd5b50565b600081359050612b1e81612af8565b92915050565b6000612b37612b3284612aba565b612a9f565b90508083825260208201905060208402830185811115612b5a57612b59612866565b5b835b81811015612b835780612b6f8882612b0f565b845260208401935050602081019050612b5c565b5050509392505050565b600082601f830112612ba257612ba161285c565b5b8135612bb2848260208601612b24565b91505092915050565b60008060008060008060008060e0898b031215612bdb57612bda61281c565b5b6000612be98b828c01612847565b9850506020612bfa8b828c01612847565b975050604089013567ffffffffffffffff811115612c1b57612c1a612821565b5b612c278b828c01612b8d565b965050606089013567ffffffffffffffff811115612c4857612c47612821565b5b612c548b828c0161286b565b95509550506080612c678b828c01612847565b93505060a0612c788b828c01612847565b92505060c0612c898b828c01612b0f565b9150509295985092959890939650565b6000612ca482612ae6565b9050919050565b612cb481612c99565b8114612cbf57600080fd5b50565b600081359050612cd181612cab565b92915050565b60008060008060008060c08789031215612cf457612cf361281c565b5b6000612d0289828a01612847565b9650506020612d1389828a01612847565b955050604087013567ffffffffffffffff811115612d3457612d33612821565b5b612d4089828a01612b8d565b9450506060612d5189828a01612847565b9350506080612d6289828a01612b0f565b92505060a0612d7389828a01612cc2565b9150509295509295509295565b600080600080600060a08688031215612d9c57612d9b61281c565b5b6000612daa88828901612847565b9550506020612dbb88828901612847565b945050604086013567ffffffffffffffff811115612ddc57612ddb612821565b5b612de888828901612b8d565b9350506060612df988828901612847565b9250506080612e0a88828901612b0f565b9150509295509295909350565b600080fd5b600060608284031215612e3257612e31612e17565b5b612e3c6060612a9f565b90506000612e4c84828501612847565b6000830152506020612e6084828501612847565b6020830152506040612e7484828501612847565b60408301525092915050565b60008115159050919050565b612e9581612e80565b8114612ea057600080fd5b50565b600081359050612eb281612e8c565b92915050565b6000806000806000806000610100888a031215612ed857612ed761281c565b5b6000612ee68a828b01612e1c565b975050606088013567ffffffffffffffff811115612f0757612f06612821565b5b612f138a828b0161286b565b96509650506080612f268a828b01612b0f565b94505060a0612f378a828b01612847565b93505060c0612f488a828b01612b0f565b92505060e0612f598a828b01612ea3565b91505092959891949750929550565b6000612f7382612ae6565b9050919050565b612f8381612f68565b8114612f8e57600080fd5b50565b600081359050612fa081612f7a565b92915050565b60008060408385031215612fbd57612fbc61281c565b5b6000612fcb85828601612f91565b9250506020612fdc85828601612b0f565b9150509250929050565b60008060008060008060a087890312156130035761300261281c565b5b600061301189828a01612847565b965050602061302289828a01612847565b955050604087013567ffffffffffffffff81111561304357613042612821565b5b61304f89828a0161286b565b9450945050606061306289828a01612b0f565b925050608061307389828a01612b0f565b9150509295509295509295565b61308981612ae6565b82525050565b60006020820190506130a46000830184613080565b92915050565b600063ffffffff82169050919050565b6130c3816130aa565b82525050565b60006020820190506130de60008301846130ba565b92915050565b6000602082840312156130fa576130f961281c565b5b600061310884828501612b0f565b91505092915050565b600062ffffff82169050919050565b61312981613111565b811461313457600080fd5b50565b60008135905061314681613120565b92915050565b600061315782612ae6565b9050919050565b6131678161314c565b811461317257600080fd5b50565b6000813590506131848161315e565b92915050565b600080600080600080600060e0888a0312156131a9576131a861281c565b5b60006131b78a828b01612847565b97505060206131c88a828b01612847565b965050604088013567ffffffffffffffff8111156131e9576131e8612821565b5b6131f58a828b01612b8d565b95505060606132068a828b01612847565b94505060806132178a828b01613137565b93505060a06132288a828b01613175565b92505060c06132398a828b01612940565b91505092959891949750929550565b60008060008060008060c087890312156132655761326461281c565b5b600061327389828a01612847565b965050602061328489828a01612847565b955050604087013567ffffffffffffffff8111156132a5576132a4612821565b5b6132b189828a01612b8d565b94505060606132c289828a01612847565b93505060806132d389828a01613137565b92505060a06132e489828a01612940565b9150509295509295509295565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b613387816128c1565b82525050565b6002811061339e5761339d61334f565b5b50565b60008190506133af8261338d565b919050565b60006133bf826133a1565b9050919050565b6133cf816133b4565b82525050565b6133de81612ae6565b82525050565b6133ed81612826565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561342d578082015181840152602081019050613412565b8381111561343c576000848401525b50505050565b600061344d826133f3565b61345781856133fe565b935061346781856020860161340f565b61347081612a2e565b840191505092915050565b600060c083016000830151613493600086018261337e565b5060208301516134a660208601826133c6565b5060408301516134b960408601826133d5565b5060608301516134cc60608601826133d5565b5060808301516134df60808601826133e4565b5060a083015184820360a08601526134f78282613442565b9150508091505092915050565b61350d81612e80565b82525050565b61351c81612917565b82525050565b60808201600082015161353860008501826133d5565b50602082015161354b6020850182613504565b50604082015161355e6040850182613513565b5060608201516135716060850182613504565b50505050565b600060e0820190508181036000830152613591818761347b565b90506135a06020830186613522565b6135ad60a0830185612a04565b6135ba60c0830184612a04565b95945050505050565b6000815190506135d281612830565b92915050565b6000602082840312156135ee576135ed61281c565b5b60006135fc848285016135c3565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061363f82612826565b915061364a83612826565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561368357613682613605565b5b828202905092915050565b600061369982612826565b91506136a483612826565b9250826136b4576136b3613320565b5b828204905092915050565b600082825260208201905092915050565b6000819050919050565b60006136e683836133d5565b60208301905092915050565b60006137016020840184612b0f565b905092915050565b6000602082019050919050565b600061372283856136bf565b935061372d826136d0565b8060005b858110156137665761374382846136f2565b61374d88826136da565b975061375883613709565b925050600181019050613731565b5085925050509392505050565b61377c81612e80565b82525050565b600060c082019050613797600083018a613080565b6137a46020830189612a04565b81810360408301526137b7818789613716565b90506137c66060830186612a04565b6137d36080830185613773565b6137e060a0830184612a04565b98975050505050505050565b600060e082019050613801600083018b613080565b61380e602083018a612a04565b61381b6040830189612a04565b818103606083015261382e818789613716565b905061383d6080830186612a04565b61384a60a0830185613773565b61385760c0830184612a04565b9998505050505050505050565b60006101008201905061387a600083018c613080565b613887602083018b613080565b613894604083018a612a04565b6138a16060830189612a04565b81810360808301526138b4818789613716565b90506138c360a0830186612a04565b6138d060c0830185613773565b6138dd60e0830184612a04565b9a9950505050505050505050565b600081519050919050565b6000819050602082019050919050565b6000602082019050919050565b600061391e826138eb565b61392881856136bf565b9350613933836138f6565b8060005b8381101561396457815161394b88826136da565b975061395683613906565b925050600181019050613937565b5085935050505092915050565b60006080820190506139866000830187612a04565b81810360208301526139988186613913565b90506139a76040830185613080565b6139b46060830184612a04565b95945050505050565b600067ffffffffffffffff8211156139d8576139d7612a3f565b5b602082029050602081019050919050565b60006139fc6139f7846139bd565b612a9f565b90508083825260208201905060208402830185811115613a1f57613a1e612866565b5b835b81811015613a485780613a3488826135c3565b845260208401935050602081019050613a21565b5050509392505050565b600082601f830112613a6757613a6661285c565b5b8151613a778482602086016139e9565b91505092915050565b600060208284031215613a9657613a9561281c565b5b600082015167ffffffffffffffff811115613ab457613ab3612821565b5b613ac084828501613a52565b91505092915050565b600060a082019050613ade6000830188612a04565b613aeb6020830187612a04565b8181036040830152613afd8186613913565b9050613b0c6060830185613080565b613b196080830184612a04565b9695505050505050565b600060c082019050613b386000830189613080565b613b456020830188613080565b613b526040830187612a04565b613b5f6060830186612a04565b613b6c6080830185612a04565b613b7960a0830184613080565b979650505050505050565b6000606082019050613b996000830186612a04565b613ba66020830185612a04565b613bb36040830184613080565b949350505050565b6000608082019050613bd06000830187612a04565b613bdd6020830186612a04565b613bea6040830185612a04565b613bf76060830184613080565b95945050505050565b600060c082019050613c156000830189612a04565b613c226020830188612a04565b613c2f6040830187612a04565b613c3c6060830186612a04565b613c496080830185613080565b613c5660a0830184613080565b979650505050505050565b600060c082019050613c766000830189613080565b613c836020830188613080565b613c906040830187613080565b613c9d6060830186612a04565b613caa6080830185612a04565b613cb760a0830184613080565b979650505050505050565b613ccb81613111565b82525050565b613cda816128f7565b82525050565b61010082016000820151613cf760008501826133d5565b506020820151613d0a60208501826133d5565b506040820151613d1d6040850182613cc2565b506060820151613d3060608501826133d5565b506080820151613d4360808501826133e4565b5060a0820151613d5660a08501826133e4565b5060c0820151613d6960c08501826133e4565b5060e0820151613d7c60e0850182613cd1565b50505050565b600061010082019050613d986000830184613ce0565b92915050565b6000613da982612826565b9150613db483612826565b925082821015613dc757613dc6613605565b5b828203905092915050565b61010082016000820151613de960008501826133d5565b506020820151613dfc60208501826133d5565b506040820151613e0f6040850182613cc2565b506060820151613e2260608501826133d5565b506080820151613e3560808501826133e4565b5060a0820151613e4860a08501826133e4565b5060c0820151613e5b60c08501826133e4565b5060e0820151613e6e60e0850182613cd1565b50505050565b600061010082019050613e8a6000830184613dd2565b92915050565b600082825260208201905092915050565b7f5452414e534645525f46524f4d5f4641494c4544000000000000000000000000600082015250565b6000613ed7601483613e90565b9150613ee282613ea1565b602082019050919050565b60006020820190508181036000830152613f0681613eca565b9050919050565b7f415050524f56455f4641494c4544000000000000000000000000000000000000600082015250565b6000613f43600e83613e90565b9150613f4e82613f0d565b602082019050919050565b60006020820190508181036000830152613f7281613f36565b9050919050565b7f5452414e534645525f4641494c45440000000000000000000000000000000000600082015250565b6000613faf600f83613e90565b9150613fba82613f79565b602082019050919050565b60006020820190508181036000830152613fde81613fa2565b9050919050565b7f4554485f5452414e534645525f4641494c454400000000000000000000000000600082015250565b600061401b601383613e90565b915061402682613fe5565b602082019050919050565b6000602082019050818103600083015261404a8161400e565b905091905056fea264697066735822122049188845bc30825a516c453a51ee4fdcd0f16dbfb14e1620c9fdb1477d8948f864736f6c63430008090033000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564000000000000000000000000ba12222222228d8ba445958a75a0704d566bf2c800000000000000000000000081c46feca27b31f3adc2b91ee4be9717d1cd3dd7000000000000000000000000eef417e1d5cc832e619ae18d2f140de2999dd4fb000000000000000000000000a356867fdcea8e71aeaf87805808803806231fdc000000000000000000000000cb859ea579b28e02b87a1fde08d087ab9dbe5149000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000270e

Deployed Bytecode

0x6080604052600436106100ab5760003560e01c8063a354a50211610064578063a354a502146101cd578063a9bf959d146101fd578063c5b37c2214610228578063dc42688114610253578063ee6c571a1461027c578063f5bf2a32146102ac576100b2565b806327b4fbac146100b45780632d75fbc4146100e45780634271a6d11461011457806345534b9d146101445780636ccf08f2146101745780639cfddc36146101a4576100b2565b366100b257005b005b6100ce60048036038101906100c99190612955565b6102dc565b6040516100db9190612a13565b60405180910390f35b6100fe60048036038101906100f99190612bbb565b6105a2565b60405161010b9190612a13565b60405180910390f35b61012e60048036038101906101299190612cd7565b6109f7565b60405161013b9190612a13565b60405180910390f35b61015e60048036038101906101599190612d80565b610d8c565b60405161016b9190612a13565b60405180910390f35b61018e60048036038101906101899190612eb8565b611066565b60405161019b9190612a13565b60405180910390f35b3480156101b057600080fd5b506101cb60048036038101906101c69190612fa6565b611379565b005b6101e760048036038101906101e29190612fe6565b611471565b6040516101f49190612a13565b60405180910390f35b34801561020957600080fd5b5061021261179a565b60405161021f919061308f565b60405180910390f35b34801561023457600080fd5b5061023d6117be565b60405161024a91906130c9565b60405180910390f35b34801561025f57600080fd5b5061027a600480360381019061027591906130e4565b6117e2565b005b6102966004803603810190610291919061318a565b611831565b6040516102a39190612a13565b60405180910390f35b6102c660048036038101906102c19190613248565b611ec7565b6040516102d39190612a13565b60405180910390f35b6000610312868660008181106102f5576102f46132f1565b5b905060200201602081019061030a91906130e4565b33308b6125f0565b6127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff1689028161034c5761034b613320565b5b0497506103a286866000818110610366576103656132f1565b5b905060200201602081019061037b91906130e4565b7f000000000000000000000000ba12222222228d8ba445958a75a0704d566bf2c88a61268f565b7f000000000000000000000000ba12222222228d8ba445958a75a0704d566bf2c873ffffffffffffffffffffffffffffffffffffffff166352bbbe296040518060c00160405280868152602001600060018111156104035761040261334f565b5b81526020018989600081811061041c5761041b6132f1565b5b905060200201602081019061043191906130e4565b73ffffffffffffffffffffffffffffffffffffffff168152602001898960018181106104605761045f6132f1565b5b905060200201602081019061047591906130e4565b73ffffffffffffffffffffffffffffffffffffffff1681526020018b81526020016040518060400160405280600281526020017f307800000000000000000000000000000000000000000000000000000000000081525081525060405180608001604052803073ffffffffffffffffffffffffffffffffffffffff1681526020016000151581526020018673ffffffffffffffffffffffffffffffffffffffff168152602001600015158152508a886040518563ffffffff1660e01b81526004016105439493929190613577565b602060405180830381600087803b15801561055d57600080fd5b505af1158015610571573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059591906135d8565b9050979650505050505050565b60008034146106ea577f000000000000000000000000a356867fdcea8e71aeaf87805808803806231fdc73ffffffffffffffffffffffffffffffffffffffff16635028bb956127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff163461061c9190613634565b610626919061368e565b8960018151811061063a576106396132f1565b5b60200260200101518b8a8a8960008c6040518963ffffffff1660e01b815260040161066b9796959493929190613782565b6020604051808303818588803b15801561068457600080fd5b505af1158015610698573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906106bd91906135d8565b90506106e5876001815181106106d6576106d56132f1565b5b60200260200101518383612727565b6109eb565b60008073ffffffffffffffffffffffffffffffffffffffff1688600181518110610717576107166132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614905061075f8860008151811061074f5761074e6132f1565b5b602002602001015133308d6125f0565b6127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff168b028161079957610798613320565b5b0499506107e2886000815181106107b3576107b26132f1565b5b60200260200101517f000000000000000000000000cb859ea579b28e02b87a1fde08d087ab9dbe51498c61268f565b80156108ce577f000000000000000000000000a356867fdcea8e71aeaf87805808803806231fdc73ffffffffffffffffffffffffffffffffffffffff16631e6d24c289600081518110610838576108376132f1565b5b60200260200101518c8c8b8b8a60008d6040518963ffffffff1660e01b815260040161086b9897969594939291906137ec565b602060405180830381600087803b15801561088557600080fd5b505af1158015610899573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bd91906135d8565b91506108c983836127bf565b6109e9565b7f000000000000000000000000a356867fdcea8e71aeaf87805808803806231fdc73ffffffffffffffffffffffffffffffffffffffff1663f87dc1b78960008151811061091e5761091d6132f1565b5b60200260200101518a60018151811061093a576109396132f1565b5b60200260200101518d8d8c8c8b60008e6040518a63ffffffff1660e01b815260040161096e99989796959493929190613864565b602060405180830381600087803b15801561098857600080fd5b505af115801561099c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c091906135d8565b91506109e8886001815181106109d9576109d86132f1565b5b60200260200101518484612727565b5b505b98975050505050505050565b6000606060003414610adb578273ffffffffffffffffffffffffffffffffffffffff16637ff36ab56127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff16340281610a5957610a58613320565b5b048989888a6040518663ffffffff1660e01b8152600401610a7d9493929190613971565b6000604051808303818588803b158015610a9657600080fd5b505af1158015610aaa573d6000803e3d6000fd5b50505050506040513d6000823e3d601f19601f82011682018060405250810190610ad49190613a80565b9050610d63565b60008073ffffffffffffffffffffffffffffffffffffffff1687600181518110610b0857610b076132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16149050610b5087600081518110610b4057610b3f6132f1565b5b602002602001015133308c6125f0565b6127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff168a0281610b8a57610b89613320565b5b049850610bb387600081518110610ba457610ba36132f1565b5b6020026020010151858b61268f565b80610c57578373ffffffffffffffffffffffffffffffffffffffff166338ed17398a8a8a898b6040518663ffffffff1660e01b8152600401610bf9959493929190613ac9565b600060405180830381600087803b158015610c1357600080fd5b505af1158015610c27573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610c509190613a80565b9150610d61565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc287600181518110610c8c57610c8b6132f1565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508373ffffffffffffffffffffffffffffffffffffffff166318cbafe58a8a8a898b6040518663ffffffff1660e01b8152600401610d07959493929190613ac9565b600060405180830381600087803b158015610d2157600080fd5b505af1158015610d35573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610d5e9190613a80565b91505b505b80600181518110610d7757610d766132f1565b5b60200260200101519150509695505050505050565b6000803414610ec5576127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff16340281610dcf57610dce613320565b5b0495507f000000000000000000000000eef417e1d5cc832e619ae18d2f140de2999dd4fb73ffffffffffffffffffffffffffffffffffffffff1663d3a4acd38786600081518110610e2357610e226132f1565b5b602002602001015187600181518110610e3f57610e3e6132f1565b5b60200260200101518a8a89896040518863ffffffff1660e01b8152600401610e6c96959493929190613b23565b6020604051808303818588803b158015610e8557600080fd5b505af1158015610e99573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ebe91906135d8565b905061105d565b610eec84600081518110610edc57610edb6132f1565b5b60200260200101513330896125f0565b6127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff16870281610f2657610f25613320565b5b049550610f6f84600081518110610f4057610f3f6132f1565b5b60200260200101517f000000000000000000000000eef417e1d5cc832e619ae18d2f140de2999dd4fb8861268f565b7f000000000000000000000000eef417e1d5cc832e619ae18d2f140de2999dd4fb73ffffffffffffffffffffffffffffffffffffffff1663d3a4acd385600081518110610fbf57610fbe6132f1565b5b602002602001015186600181518110610fdb57610fda6132f1565b5b6020026020010151898988886040518763ffffffff1660e01b815260040161100896959493929190613b23565b602060405180830381600087803b15801561102257600080fd5b505af1158015611036573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105a91906135d8565b90505b95945050505050565b6000803414611144578473ffffffffffffffffffffffffffffffffffffffff1663ad65d76d6127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff163402816110c5576110c4613320565b5b048a6020015187876040518563ffffffff1660e01b81526004016110eb93929190613b84565b6020604051808303818588803b15801561110457600080fd5b505af1158015611118573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061113d91906135d8565b905061136e565b61117c8787600081811061115b5761115a6132f1565b5b905060200201602081019061117091906130e4565b33308b600001516125f0565b6127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff16896000015102816111ba576111b9613320565b5b048860000181815250506111fb878760008181106111db576111da6132f1565b5b90506020020160208101906111f091906130e4565b868a6000015161268f565b81156112a1578473ffffffffffffffffffffffffffffffffffffffff16637237e03189600001518a6020015187876040518563ffffffff1660e01b81526004016112489493929190613bbb565b602060405180830381600087803b15801561126257600080fd5b505af1158015611276573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129a91906135d8565b905061136d565b8473ffffffffffffffffffffffffffffffffffffffff1663f552d91b89600001518a602001518b6040015188888d8d60018181106112e2576112e16132f1565b5b90506020020160208101906112f791906130e4565b6040518763ffffffff1660e01b815260040161131896959493929190613c00565b602060405180830381600087803b15801561133257600080fd5b505af1158015611346573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136a91906135d8565b90505b5b979650505050505050565b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016113b4919061308f565b60206040518083038186803b1580156113cc57600080fd5b505afa1580156113e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140491906135d8565b905073123cb0304c7f65b0d48276b9857f4df4733d1dd8331461142657600080fd5b60405163a9059cbb6000528260205281604052602060006060601c6000885af13d15600160005114171661146257637939f4246000526004601cfd5b60006060528060405250505050565b60008034146115c4576127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff163402816114b4576114b3613320565b5b0496507f00000000000000000000000081c46feca27b31f3adc2b91ee4be9717d1cd3dd773ffffffffffffffffffffffffffffffffffffffff16631a4c1ca3888588886000818110611509576115086132f1565b5b905060200201602081019061151e91906130e4565b89896001818110611532576115316132f1565b5b905060200201602081019061154791906130e4565b8c8c896040518863ffffffff1660e01b815260040161156b96959493929190613c61565b6020604051808303818588803b15801561158457600080fd5b505af1158015611598573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906115bd91906135d8565b9050611790565b6115f8858560008181106115db576115da6132f1565b5b90506020020160208101906115f091906130e4565b33308a6125f0565b6127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff1688028161163257611631613320565b5b0496506116888585600081811061164c5761164b6132f1565b5b905060200201602081019061166191906130e4565b7f00000000000000000000000081c46feca27b31f3adc2b91ee4be9717d1cd3dd78961268f565b7f00000000000000000000000081c46feca27b31f3adc2b91ee4be9717d1cd3dd773ffffffffffffffffffffffffffffffffffffffff16631a4c1ca384878760008181106116d9576116d86132f1565b5b90506020020160208101906116ee91906130e4565b88886001818110611702576117016132f1565b5b905060200201602081019061171791906130e4565b8b8b886040518763ffffffff1660e01b815260040161173b96959493929190613c61565b602060405180830381600087803b15801561175557600080fd5b505af1158015611769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178d91906135d8565b90505b9695505050505050565b7f000000000000000000000000cb859ea579b28e02b87a1fde08d087ab9dbe514981565b7f000000000000000000000000000000000000000000000000000000000000270e81565b600047905073123cb0304c7f65b0d48276b9857f4df4733d1dd8331461180757600080fd5b60008060008084865af13d15600160005114171661182d57637939f4246000526004601cfd5b5050565b6000803414611a7d576127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff1634028161187457611873613320565b5b0497507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0896040518263ffffffff1660e01b81526004016000604051808303818588803b1580156118df57600080fd5b505af11580156118f3573d6000803e3d6000fd5b505050505061191e8660008151811061190f5761190e6132f1565b5b6020026020010151848a61268f565b8273ffffffffffffffffffffffffffffffffffffffff1663a8c9ed676040518061010001604052808960008151811061195a576119596132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16815260200189600181518110611991576119906132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018762ffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018b81526020018a8152602001600073ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b8152600401611a249190613d82565b602060405180830381600087803b158015611a3e57600080fd5b505af1158015611a52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a7691906135d8565b9050611ebc565b611aa486600081518110611a9457611a936132f1565b5b602002602001015133308b6125f0565b6127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff16890281611ade57611add613320565b5b04975060008073ffffffffffffffffffffffffffffffffffffffff1687600181518110611b0e57611b0d6132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16149050611b5587600081518110611b4657611b456132f1565b5b6020026020010151858b61268f565b80611cc5578373ffffffffffffffffffffffffffffffffffffffff1663a8c9ed676040518061010001604052808a600081518110611b9657611b956132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018a60018c51611bc89190613d9e565b81518110611bd957611bd86132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018862ffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018c81526020018b8152602001600073ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b8152600401611c6c9190613d82565b602060405180830381600087803b158015611c8657600080fd5b505af1158015611c9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cbe91906135d8565b9150611eba565b8373ffffffffffffffffffffffffffffffffffffffff1663a8c9ed676040518061010001604052808a600081518110611d0157611d006132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1681526020018862ffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018c81526020018b8152602001600073ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b8152600401611dd09190613d82565b602060405180830381600087803b158015611dea57600080fd5b505af1158015611dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2291906135d8565b91507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b8152600401611e7d9190612a13565b600060405180830381600087803b158015611e9757600080fd5b505af1158015611eab573d6000803e3d6000fd5b50505050611eb983836127bf565b5b505b979650505050505050565b6000803414612153576127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff16340281611f0a57611f09613320565b5b0496507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0886040518263ffffffff1660e01b81526004016000604051808303818588803b158015611f7557600080fd5b505af1158015611f89573d6000803e3d6000fd5b5050505050611fd485600081518110611fa557611fa46132f1565b5b60200260200101517f000000000000000000000000e592427a0aece92de3edee1f18e0157c058615648961268f565b7f000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156473ffffffffffffffffffffffffffffffffffffffff1663414bf389604051806101000160405280886000815181106120305761202f6132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16815260200188600181518110612067576120666132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018662ffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018a8152602001898152602001600073ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b81526004016120fa9190613e74565b602060405180830381600087803b15801561211457600080fd5b505af1158015612128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214c91906135d8565b90506125e6565b61217a8560008151811061216a576121696132f1565b5b602002602001015133308a6125f0565b6127107f000000000000000000000000000000000000000000000000000000000000270e63ffffffff168802816121b4576121b3613320565b5b0496506121fd856000815181106121ce576121cd6132f1565b5b60200260200101517f000000000000000000000000e592427a0aece92de3edee1f18e0157c058615648961268f565b60008073ffffffffffffffffffffffffffffffffffffffff168660018151811061222a576122296132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16149050806123cf577f000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156473ffffffffffffffffffffffffffffffffffffffff1663414bf389604051806101000160405280896000815181106122ac576122ab6132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168152602001896001815181106122e3576122e26132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020018762ffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018b81526020018a8152602001600073ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b81526004016123769190613e74565b602060405180830381600087803b15801561239057600080fd5b505af11580156123a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c891906135d8565b91506125e4565b7f000000000000000000000000e592427a0aece92de3edee1f18e0157c0586156473ffffffffffffffffffffffffffffffffffffffff1663414bf3896040518061010001604052808960008151811061242b5761242a6132f1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1681526020018762ffffff1681526020013073ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018b81526020018a8152602001600073ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b81526004016124fa9190613e74565b602060405180830381600087803b15801561251457600080fd5b505af1158015612528573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254c91906135d8565b91507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b81526004016125a79190612a13565b600060405180830381600087803b1580156125c157600080fd5b505af11580156125d5573d6000803e3d6000fd5b505050506125e383836127bf565b5b505b9695505050505050565b60006040517f23b872dd0000000000000000000000000000000000000000000000000000000081528460048201528360248201528260448201526020600060648360008a5af13d15601f3d1160016000511416171691505080612688576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267f90613eed565b60405180910390fd5b5050505050565b60006040517f095ea7b3000000000000000000000000000000000000000000000000000000008152836004820152826024820152602060006044836000895af13d15601f3d1160016000511416171691505080612721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271890613f59565b60405180910390fd5b50505050565b60006040517fa9059cbb000000000000000000000000000000000000000000000000000000008152836004820152826024820152602060006044836000895af13d15601f3d11600160005114161716915050806127b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b090613fc5565b60405180910390fd5b50505050565b600080600080600085875af190508061280d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280490614031565b60405180910390fd5b505050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61283981612826565b811461284457600080fd5b50565b60008135905061285681612830565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126128815761288061285c565b5b8235905067ffffffffffffffff81111561289e5761289d612861565b5b6020830191508360208202830111156128ba576128b9612866565b5b9250929050565b6000819050919050565b6128d4816128c1565b81146128df57600080fd5b50565b6000813590506128f1816128cb565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612922826128f7565b9050919050565b61293281612917565b811461293d57600080fd5b50565b60008135905061294f81612929565b92915050565b600080600080600080600060c0888a0312156129745761297361281c565b5b60006129828a828b01612847565b97505060206129938a828b01612847565b965050604088013567ffffffffffffffff8111156129b4576129b3612821565b5b6129c08a828b0161286b565b955095505060606129d38a828b01612847565b93505060806129e48a828b016128e2565b92505060a06129f58a828b01612940565b91505092959891949750929550565b612a0d81612826565b82525050565b6000602082019050612a286000830184612a04565b92915050565b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a7782612a2e565b810181811067ffffffffffffffff82111715612a9657612a95612a3f565b5b80604052505050565b6000612aa9612812565b9050612ab58282612a6e565b919050565b600067ffffffffffffffff821115612ad557612ad4612a3f565b5b602082029050602081019050919050565b6000612af1826128f7565b9050919050565b612b0181612ae6565b8114612b0c57600080fd5b50565b600081359050612b1e81612af8565b92915050565b6000612b37612b3284612aba565b612a9f565b90508083825260208201905060208402830185811115612b5a57612b59612866565b5b835b81811015612b835780612b6f8882612b0f565b845260208401935050602081019050612b5c565b5050509392505050565b600082601f830112612ba257612ba161285c565b5b8135612bb2848260208601612b24565b91505092915050565b60008060008060008060008060e0898b031215612bdb57612bda61281c565b5b6000612be98b828c01612847565b9850506020612bfa8b828c01612847565b975050604089013567ffffffffffffffff811115612c1b57612c1a612821565b5b612c278b828c01612b8d565b965050606089013567ffffffffffffffff811115612c4857612c47612821565b5b612c548b828c0161286b565b95509550506080612c678b828c01612847565b93505060a0612c788b828c01612847565b92505060c0612c898b828c01612b0f565b9150509295985092959890939650565b6000612ca482612ae6565b9050919050565b612cb481612c99565b8114612cbf57600080fd5b50565b600081359050612cd181612cab565b92915050565b60008060008060008060c08789031215612cf457612cf361281c565b5b6000612d0289828a01612847565b9650506020612d1389828a01612847565b955050604087013567ffffffffffffffff811115612d3457612d33612821565b5b612d4089828a01612b8d565b9450506060612d5189828a01612847565b9350506080612d6289828a01612b0f565b92505060a0612d7389828a01612cc2565b9150509295509295509295565b600080600080600060a08688031215612d9c57612d9b61281c565b5b6000612daa88828901612847565b9550506020612dbb88828901612847565b945050604086013567ffffffffffffffff811115612ddc57612ddb612821565b5b612de888828901612b8d565b9350506060612df988828901612847565b9250506080612e0a88828901612b0f565b9150509295509295909350565b600080fd5b600060608284031215612e3257612e31612e17565b5b612e3c6060612a9f565b90506000612e4c84828501612847565b6000830152506020612e6084828501612847565b6020830152506040612e7484828501612847565b60408301525092915050565b60008115159050919050565b612e9581612e80565b8114612ea057600080fd5b50565b600081359050612eb281612e8c565b92915050565b6000806000806000806000610100888a031215612ed857612ed761281c565b5b6000612ee68a828b01612e1c565b975050606088013567ffffffffffffffff811115612f0757612f06612821565b5b612f138a828b0161286b565b96509650506080612f268a828b01612b0f565b94505060a0612f378a828b01612847565b93505060c0612f488a828b01612b0f565b92505060e0612f598a828b01612ea3565b91505092959891949750929550565b6000612f7382612ae6565b9050919050565b612f8381612f68565b8114612f8e57600080fd5b50565b600081359050612fa081612f7a565b92915050565b60008060408385031215612fbd57612fbc61281c565b5b6000612fcb85828601612f91565b9250506020612fdc85828601612b0f565b9150509250929050565b60008060008060008060a087890312156130035761300261281c565b5b600061301189828a01612847565b965050602061302289828a01612847565b955050604087013567ffffffffffffffff81111561304357613042612821565b5b61304f89828a0161286b565b9450945050606061306289828a01612b0f565b925050608061307389828a01612b0f565b9150509295509295509295565b61308981612ae6565b82525050565b60006020820190506130a46000830184613080565b92915050565b600063ffffffff82169050919050565b6130c3816130aa565b82525050565b60006020820190506130de60008301846130ba565b92915050565b6000602082840312156130fa576130f961281c565b5b600061310884828501612b0f565b91505092915050565b600062ffffff82169050919050565b61312981613111565b811461313457600080fd5b50565b60008135905061314681613120565b92915050565b600061315782612ae6565b9050919050565b6131678161314c565b811461317257600080fd5b50565b6000813590506131848161315e565b92915050565b600080600080600080600060e0888a0312156131a9576131a861281c565b5b60006131b78a828b01612847565b97505060206131c88a828b01612847565b965050604088013567ffffffffffffffff8111156131e9576131e8612821565b5b6131f58a828b01612b8d565b95505060606132068a828b01612847565b94505060806132178a828b01613137565b93505060a06132288a828b01613175565b92505060c06132398a828b01612940565b91505092959891949750929550565b60008060008060008060c087890312156132655761326461281c565b5b600061327389828a01612847565b965050602061328489828a01612847565b955050604087013567ffffffffffffffff8111156132a5576132a4612821565b5b6132b189828a01612b8d565b94505060606132c289828a01612847565b93505060806132d389828a01613137565b92505060a06132e489828a01612940565b9150509295509295509295565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b613387816128c1565b82525050565b6002811061339e5761339d61334f565b5b50565b60008190506133af8261338d565b919050565b60006133bf826133a1565b9050919050565b6133cf816133b4565b82525050565b6133de81612ae6565b82525050565b6133ed81612826565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561342d578082015181840152602081019050613412565b8381111561343c576000848401525b50505050565b600061344d826133f3565b61345781856133fe565b935061346781856020860161340f565b61347081612a2e565b840191505092915050565b600060c083016000830151613493600086018261337e565b5060208301516134a660208601826133c6565b5060408301516134b960408601826133d5565b5060608301516134cc60608601826133d5565b5060808301516134df60808601826133e4565b5060a083015184820360a08601526134f78282613442565b9150508091505092915050565b61350d81612e80565b82525050565b61351c81612917565b82525050565b60808201600082015161353860008501826133d5565b50602082015161354b6020850182613504565b50604082015161355e6040850182613513565b5060608201516135716060850182613504565b50505050565b600060e0820190508181036000830152613591818761347b565b90506135a06020830186613522565b6135ad60a0830185612a04565b6135ba60c0830184612a04565b95945050505050565b6000815190506135d281612830565b92915050565b6000602082840312156135ee576135ed61281c565b5b60006135fc848285016135c3565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061363f82612826565b915061364a83612826565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561368357613682613605565b5b828202905092915050565b600061369982612826565b91506136a483612826565b9250826136b4576136b3613320565b5b828204905092915050565b600082825260208201905092915050565b6000819050919050565b60006136e683836133d5565b60208301905092915050565b60006137016020840184612b0f565b905092915050565b6000602082019050919050565b600061372283856136bf565b935061372d826136d0565b8060005b858110156137665761374382846136f2565b61374d88826136da565b975061375883613709565b925050600181019050613731565b5085925050509392505050565b61377c81612e80565b82525050565b600060c082019050613797600083018a613080565b6137a46020830189612a04565b81810360408301526137b7818789613716565b90506137c66060830186612a04565b6137d36080830185613773565b6137e060a0830184612a04565b98975050505050505050565b600060e082019050613801600083018b613080565b61380e602083018a612a04565b61381b6040830189612a04565b818103606083015261382e818789613716565b905061383d6080830186612a04565b61384a60a0830185613773565b61385760c0830184612a04565b9998505050505050505050565b60006101008201905061387a600083018c613080565b613887602083018b613080565b613894604083018a612a04565b6138a16060830189612a04565b81810360808301526138b4818789613716565b90506138c360a0830186612a04565b6138d060c0830185613773565b6138dd60e0830184612a04565b9a9950505050505050505050565b600081519050919050565b6000819050602082019050919050565b6000602082019050919050565b600061391e826138eb565b61392881856136bf565b9350613933836138f6565b8060005b8381101561396457815161394b88826136da565b975061395683613906565b925050600181019050613937565b5085935050505092915050565b60006080820190506139866000830187612a04565b81810360208301526139988186613913565b90506139a76040830185613080565b6139b46060830184612a04565b95945050505050565b600067ffffffffffffffff8211156139d8576139d7612a3f565b5b602082029050602081019050919050565b60006139fc6139f7846139bd565b612a9f565b90508083825260208201905060208402830185811115613a1f57613a1e612866565b5b835b81811015613a485780613a3488826135c3565b845260208401935050602081019050613a21565b5050509392505050565b600082601f830112613a6757613a6661285c565b5b8151613a778482602086016139e9565b91505092915050565b600060208284031215613a9657613a9561281c565b5b600082015167ffffffffffffffff811115613ab457613ab3612821565b5b613ac084828501613a52565b91505092915050565b600060a082019050613ade6000830188612a04565b613aeb6020830187612a04565b8181036040830152613afd8186613913565b9050613b0c6060830185613080565b613b196080830184612a04565b9695505050505050565b600060c082019050613b386000830189613080565b613b456020830188613080565b613b526040830187612a04565b613b5f6060830186612a04565b613b6c6080830185612a04565b613b7960a0830184613080565b979650505050505050565b6000606082019050613b996000830186612a04565b613ba66020830185612a04565b613bb36040830184613080565b949350505050565b6000608082019050613bd06000830187612a04565b613bdd6020830186612a04565b613bea6040830185612a04565b613bf76060830184613080565b95945050505050565b600060c082019050613c156000830189612a04565b613c226020830188612a04565b613c2f6040830187612a04565b613c3c6060830186612a04565b613c496080830185613080565b613c5660a0830184613080565b979650505050505050565b600060c082019050613c766000830189613080565b613c836020830188613080565b613c906040830187613080565b613c9d6060830186612a04565b613caa6080830185612a04565b613cb760a0830184613080565b979650505050505050565b613ccb81613111565b82525050565b613cda816128f7565b82525050565b61010082016000820151613cf760008501826133d5565b506020820151613d0a60208501826133d5565b506040820151613d1d6040850182613cc2565b506060820151613d3060608501826133d5565b506080820151613d4360808501826133e4565b5060a0820151613d5660a08501826133e4565b5060c0820151613d6960c08501826133e4565b5060e0820151613d7c60e0850182613cd1565b50505050565b600061010082019050613d986000830184613ce0565b92915050565b6000613da982612826565b9150613db483612826565b925082821015613dc757613dc6613605565b5b828203905092915050565b61010082016000820151613de960008501826133d5565b506020820151613dfc60208501826133d5565b506040820151613e0f6040850182613cc2565b506060820151613e2260608501826133d5565b506080820151613e3560808501826133e4565b5060a0820151613e4860a08501826133e4565b5060c0820151613e5b60c08501826133e4565b5060e0820151613e6e60e0850182613cd1565b50505050565b600061010082019050613e8a6000830184613dd2565b92915050565b600082825260208201905092915050565b7f5452414e534645525f46524f4d5f4641494c4544000000000000000000000000600082015250565b6000613ed7601483613e90565b9150613ee282613ea1565b602082019050919050565b60006020820190508181036000830152613f0681613eca565b9050919050565b7f415050524f56455f4641494c4544000000000000000000000000000000000000600082015250565b6000613f43600e83613e90565b9150613f4e82613f0d565b602082019050919050565b60006020820190508181036000830152613f7281613f36565b9050919050565b7f5452414e534645525f4641494c45440000000000000000000000000000000000600082015250565b6000613faf600f83613e90565b9150613fba82613f79565b602082019050919050565b60006020820190508181036000830152613fde81613fa2565b9050919050565b7f4554485f5452414e534645525f4641494c454400000000000000000000000000600082015250565b600061401b601383613e90565b915061402682613fe5565b602082019050919050565b6000602082019050818103600083015261404a8161400e565b905091905056fea264697066735822122049188845bc30825a516c453a51ee4fdcd0f16dbfb14e1620c9fdb1477d8948f864736f6c63430008090033

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

000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564000000000000000000000000ba12222222228d8ba445958a75a0704d566bf2c800000000000000000000000081c46feca27b31f3adc2b91ee4be9717d1cd3dd7000000000000000000000000eef417e1d5cc832e619ae18d2f140de2999dd4fb000000000000000000000000a356867fdcea8e71aeaf87805808803806231fdc000000000000000000000000cb859ea579b28e02b87a1fde08d087ab9dbe5149000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000000000000000000000000000000000000000270e

-----Decoded View---------------
Arg [0] : _uniswapV3Router (address): 0xE592427A0AEce92De3Edee1F18E0157C05861564
Arg [1] : _balancer (address): 0xBA12222222228d8Ba445958a75a0704d566BF2C8
Arg [2] : _curveTC1Router (address): 0x81C46fECa27B31F3ADC2b91eE4be9717d1cd3DD7
Arg [3] : _bancorRouter (address): 0xeEF417e1D5CC832e619ae18D2F140De2999dD4fB
Arg [4] : _DodoRouter (address): 0xa356867fDCEa8e71AEaF87805808803806231FdC
Arg [5] : _dodoApproveProxy (address): 0xCB859eA579b28e02B87A1FDE08d087ab9dbE5149
Arg [6] : _WETHAddress (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [7] : fee (uint32): 9998

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000e592427a0aece92de3edee1f18e0157c05861564
Arg [1] : 000000000000000000000000ba12222222228d8ba445958a75a0704d566bf2c8
Arg [2] : 00000000000000000000000081c46feca27b31f3adc2b91ee4be9717d1cd3dd7
Arg [3] : 000000000000000000000000eef417e1d5cc832e619ae18d2f140de2999dd4fb
Arg [4] : 000000000000000000000000a356867fdcea8e71aeaf87805808803806231fdc
Arg [5] : 000000000000000000000000cb859ea579b28e02b87a1fde08d087ab9dbe5149
Arg [6] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [7] : 000000000000000000000000000000000000000000000000000000000000270e


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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