ETH Price: $2,958.25 (+0.71%)
 

More Info

Private Name Tags

Multichain Info

Transaction Hash
Method
Block
From
To
Swap287065202026-01-24 11:22:2016 mins ago1769253740IN
SyncSwap: Router
0 ETH0.000000070.0001201
Swap287030002026-01-24 10:11:481 hr ago1769249508IN
SyncSwap: Router
0 ETH0.000000060.000131
Swap287022562026-01-24 9:55:191 hr ago1769248519IN
SyncSwap: Router
0 ETH0.000000050.0001201
Swap287019382026-01-24 9:47:471 hr ago1769248067IN
SyncSwap: Router
0 ETH0.000000050.0001201
Swap287010372026-01-24 9:26:592 hrs ago1769246819IN
SyncSwap: Router
0 ETH0.000000040.000131
Swap287001912026-01-24 9:10:232 hrs ago1769245823IN
SyncSwap: Router
0 ETH0.000000040.000131
Swap286992332026-01-24 8:50:342 hrs ago1769244634IN
SyncSwap: Router
0 ETH0.000000040.0001201
Swap286950612026-01-24 7:18:474 hrs ago1769239127IN
SyncSwap: Router
0 ETH0.000000040.000131
Swap286950072026-01-24 7:17:414 hrs ago1769239061IN
SyncSwap: Router
0 ETH0.000000040.000131
Swap286946652026-01-24 7:12:334 hrs ago1769238753IN
SyncSwap: Router
0 ETH0.000000040.0001201
Swap286921842026-01-24 6:17:005 hrs ago1769235420IN
SyncSwap: Router
0 ETH0.000000040.000131
Swap286920132026-01-24 6:14:215 hrs ago1769235261IN
SyncSwap: Router
0 ETH0.000000050.000131
Swap286907872026-01-24 5:49:415 hrs ago1769233781IN
SyncSwap: Router
0 ETH0.000000040.000131
Swap286903312026-01-24 5:40:055 hrs ago1769233205IN
SyncSwap: Router
0 ETH0.000000040.000131
Swap286891112026-01-24 5:13:006 hrs ago1769231580IN
SyncSwap: Router
0 ETH0.000000040.000131
Swap286868012026-01-24 4:26:097 hrs ago1769228769IN
SyncSwap: Router
0 ETH0.000000050.000131
Swap286864252026-01-24 4:18:107 hrs ago1769228290IN
SyncSwap: Router
0 ETH0.000000050.000131
Swap286845062026-01-24 3:37:178 hrs ago1769225837IN
SyncSwap: Router
0 ETH0.000000050.000131
Swap286840952026-01-24 3:26:328 hrs ago1769225192IN
SyncSwap: Router
0 ETH0.000000050.000131
Swap286840622026-01-24 3:25:568 hrs ago1769225156IN
SyncSwap: Router
0 ETH0.000000050.0001201
Swap Exact ETH F...286838412026-01-24 3:20:328 hrs ago1769224832IN
SyncSwap: Router
0.00127546 ETH0.000000020.00014412
Swap286831322026-01-24 3:05:058 hrs ago1769223905IN
SyncSwap: Router
0 ETH0.000000040.000131
Swap286831232026-01-24 3:04:588 hrs ago1769223898IN
SyncSwap: Router
0 ETH0.000000050.000131
Swap286815852026-01-24 2:22:429 hrs ago1769221362IN
SyncSwap: Router
0 ETH0.000000040.000131
Swap286813312026-01-24 2:16:039 hrs ago1769220963IN
SyncSwap: Router
0 ETH0.000000050.0001201
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
286652922026-01-23 19:30:3316 hrs ago1769196633
SyncSwap: Router
0.07692308 ETH
285889092026-01-22 14:10:3945 hrs ago1769091039
SyncSwap: Router
0.00400138 ETH
285889092026-01-22 14:10:3945 hrs ago1769091039
SyncSwap: Router
0.00400138 ETH
285880122026-01-22 13:50:1345 hrs ago1769089813
SyncSwap: Router
0.012961 ETH
285880122026-01-22 13:50:1345 hrs ago1769089813
SyncSwap: Router
0.012961 ETH
285467042026-01-21 20:04:452 days ago1769025885
SyncSwap: Router
0.04008529 ETH
285268772026-01-21 14:04:542 days ago1769004294
SyncSwap: Router
0.02002812 ETH
285126842026-01-21 8:48:083 days ago1768985288
SyncSwap: Router
0.07692308 ETH
285074362026-01-21 6:29:143 days ago1768976954
SyncSwap: Router
0.002991 ETH
285074362026-01-21 6:29:143 days ago1768976954
SyncSwap: Router
0.002991 ETH
284907642026-01-20 22:33:553 days ago1768948435
SyncSwap: Router
0.07692308 ETH
284907552026-01-20 22:33:503 days ago1768948430
SyncSwap: Router
0.03004221 ETH
284907342026-01-20 22:33:403 days ago1768948420
SyncSwap: Router
0.23076923 ETH
284907112026-01-20 22:33:273 days ago1768948407
SyncSwap: Router
0.07692308 ETH
284906992026-01-20 22:33:213 days ago1768948401
SyncSwap: Router
0.0400563 ETH
284417212026-01-20 8:35:544 days ago1768898154
SyncSwap: Router
0.04005633 ETH
284402972026-01-20 8:13:174 days ago1768896797
SyncSwap: Router
0.04005633 ETH
283748282026-01-19 9:55:065 days ago1768816506
SyncSwap: Router
0.07692308 ETH
283704002026-01-19 8:07:095 days ago1768810029
SyncSwap: Router
0.002991 ETH
283704002026-01-19 8:07:095 days ago1768810029
SyncSwap: Router
0.002991 ETH
283693612026-01-19 7:43:435 days ago1768808623
SyncSwap: Router
0.07692308 ETH
283649082026-01-19 5:46:085 days ago1768801568
SyncSwap: Router
0.15384615 ETH
283534602026-01-19 0:21:085 days ago1768782068
SyncSwap: Router
0.03002379 ETH
283534512026-01-19 0:21:035 days ago1768782063
SyncSwap: Router
0.03005501 ETH
282849372026-01-18 1:38:366 days ago1768700316
SyncSwap: Router
0.00025 ETH
View All Internal Transactions
Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SyncSwapRouter

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity ^0.8.0;

import "./interfaces/IWETH.sol";
import "./interfaces/IRouter.sol";
import "./interfaces/IStakingPool.sol";
import "./interfaces/vault/IVault.sol";
import "./interfaces/pool/IPool.sol";
import "./interfaces/pool/IBasePool.sol";
import "./interfaces/token/IERC20Permit.sol";
import "./interfaces/factory/IPoolFactory.sol";

import "./libraries/TransferHelper.sol";

import "./abstract/SelfPermit.sol";
import "./abstract/Multicall.sol";

error NotEnoughLiquidityMinted();
error TooLittleReceived();
error Expired();

/// @notice The router is a universal interface for users to access
/// functions across different protocol parts in one place.
///
/// It handles the allowances and transfers of tokens, and
/// allows chained swaps/operations across multiple pools, with
/// additional features like slippage protection and permit support.
///
contract SyncSwapRouter is IRouter, SelfPermit, Multicall {

    struct TokenInput {
        address token;
        uint amount;
    }

    address public immutable vault;
    address public immutable wETH;
    address private constant NATIVE_ETH = address(0);

    mapping(address => mapping(address => bool)) public isPoolEntered;
    mapping(address => address[]) public enteredPools;

    modifier ensure(uint deadline) {
        // solhint-disable-next-line not-rely-on-time
        if (block.timestamp > deadline) {
            revert Expired();
        }
        _;
    }

    constructor(address _vault, address _wETH) {
        vault = _vault;
        wETH = _wETH;
    }

    function enteredPoolsLength(address account) external view returns (uint) {
        return enteredPools[account].length;
    }

    // Add Liquidity
    function _transferFromSender(address token, address to, uint amount) private {
        if (token == NATIVE_ETH) {
            // Deposit ETH to the vault.
            IVault(vault).deposit{value: amount}(token, to);
        } else {
            // Transfer tokens to the vault.
            TransferHelper.safeTransferFrom(token, msg.sender, vault, amount);

            // Notify the vault to deposit.
            IVault(vault).deposit(token, to);
        }
    }

    function _transferAndAddLiquidity(
        address pool,
        TokenInput[] calldata inputs,
        bytes calldata data,
        uint minLiquidity,
        address callback,
        bytes calldata callbackData
    ) private returns (uint liquidity) {
        // Send all input tokens to the pool.
        uint n = inputs.length;

        TokenInput memory input;

        for (uint i; i < n; ) {
            input = inputs[i];

            _transferFromSender(input.token, pool, input.amount);

            unchecked {
                ++i;
            }
        }

        liquidity = IPool(pool).mint(data, msg.sender, callback, callbackData);

        if (liquidity < minLiquidity) {
            revert NotEnoughLiquidityMinted();
        }
    }

    function _markPoolEntered(address pool) private {
        if (!isPoolEntered[pool][msg.sender]) {
            isPoolEntered[pool][msg.sender] = true;
            enteredPools[msg.sender].push(pool);
        }
    }

    function addLiquidity(
        address pool,
        TokenInput[] calldata inputs,
        bytes calldata data,
        uint minLiquidity,
        address callback,
        bytes calldata callbackData
    ) external payable returns (uint liquidity) {
        liquidity = _transferAndAddLiquidity(
            pool,
            inputs,
            data,
            minLiquidity,
            callback,
            callbackData
        );
    }

    function addLiquidity2(
        address pool,
        TokenInput[] calldata inputs,
        bytes calldata data,
        uint minLiquidity,
        address callback,
        bytes calldata callbackData
    ) external payable returns (uint liquidity) {
        liquidity = _transferAndAddLiquidity(
            pool,
            inputs,
            data,
            minLiquidity,
            callback,
            callbackData
        );

        _markPoolEntered(pool);
    }

    function addLiquidityWithPermit(
        address pool,
        TokenInput[] calldata inputs,
        bytes calldata data,
        uint minLiquidity,
        address callback,
        bytes calldata callbackData,
        SplitPermitParams[] memory permits
    ) public payable returns (uint liquidity) {
        // Approve all tokens via permit.
        uint n = permits.length;

        SplitPermitParams memory params;

        for (uint i; i < n; ) {
            params = permits[i];

            IERC20Permit(params.token).permit(
                msg.sender,
                address(this),
                params.approveAmount,
                params.deadline,
                params.v,
                params.r,
                params.s
            );

            unchecked {
                ++i;
            }
        }

        liquidity = _transferAndAddLiquidity(
            pool,
            inputs,
            data,
            minLiquidity,
            callback,
            callbackData
        );
    }

    function addLiquidityWithPermit2(
        address pool,
        TokenInput[] calldata inputs,
        bytes calldata data,
        uint minLiquidity,
        address callback,
        bytes calldata callbackData,
        SplitPermitParams[] memory permits
    ) public payable returns (uint liquidity) {
        liquidity = addLiquidityWithPermit(
            pool,
            inputs,
            data,
            minLiquidity,
            callback,
            callbackData,
            permits
        );

        _markPoolEntered(pool);
    }

    // Burn Liquidity
    function _transferAndBurnLiquidity(
        address pool,
        uint liquidity,
        bytes memory data,
        uint[] memory minAmounts,
        address callback,
        bytes calldata callbackData
    ) private returns (IPool.TokenAmount[] memory amounts) {
        IBasePool(pool).transferFrom(msg.sender, pool, liquidity);

        amounts = IPool(pool).burn(data, msg.sender, callback, callbackData);

        uint n = amounts.length;

        for (uint i; i < n; ) {
            if (amounts[i].amount < minAmounts[i]) {
                revert TooLittleReceived();
            }

            unchecked {
                ++i;
            }
        }
    }

    function burnLiquidity(
        address pool,
        uint liquidity,
        bytes calldata data,
        uint[] calldata minAmounts,
        address callback,
        bytes calldata callbackData
    ) external returns (IPool.TokenAmount[] memory amounts) {
        amounts = _transferAndBurnLiquidity(
            pool,
            liquidity,
            data,
            minAmounts,
            callback,
            callbackData
        );
    }

    function burnLiquidityWithPermit(
        address pool,
        uint liquidity,
        bytes calldata data,
        uint[] calldata minAmounts,
        address callback,
        bytes calldata callbackData,
        ArrayPermitParams memory permit
    ) external returns (IPool.TokenAmount[] memory amounts) {
        // Approve liquidity via permit.
        IBasePool(pool).permit2(
            msg.sender,
            address(this),
            permit.approveAmount,
            permit.deadline,
            permit.signature
        );

        amounts = _transferAndBurnLiquidity(
            pool,
            liquidity,
            data,
            minAmounts,
            callback,
            callbackData
        );
    }

    // Burn Liquidity Single
    function _transferAndBurnLiquiditySingle(
        address pool,
        uint liquidity,
        bytes memory data,
        uint minAmount,
        address callback,
        bytes memory callbackData
    ) private returns (IPool.TokenAmount memory amountOut) {
        IBasePool(pool).transferFrom(msg.sender, pool, liquidity);

        amountOut = IPool(pool).burnSingle(data, msg.sender, callback, callbackData);

        if (amountOut.amount < minAmount) {
            revert TooLittleReceived();
        }
    }

    function burnLiquiditySingle(
        address pool,
        uint liquidity,
        bytes memory data,
        uint minAmount,
        address callback,
        bytes memory callbackData
    ) external returns (IPool.TokenAmount memory amountOut) {
        amountOut = _transferAndBurnLiquiditySingle(
            pool,
            liquidity,
            data,
            minAmount,
            callback,
            callbackData
        );
    }

    function burnLiquiditySingleWithPermit(
        address pool,
        uint liquidity,
        bytes memory data,
        uint minAmount,
        address callback,
        bytes memory callbackData,
        ArrayPermitParams calldata permit
    ) external returns (IPool.TokenAmount memory amountOut) {
        // Approve liquidity via permit.
        IBasePool(pool).permit2(
            msg.sender,
            address(this),
            permit.approveAmount,
            permit.deadline,
            permit.signature
        );

        amountOut = _transferAndBurnLiquiditySingle(
            pool,
            liquidity,
            data,
            minAmount,
            callback,
            callbackData
        );
    }

    // Swap
    function _swap(
        SwapPath[] memory paths,
        uint amountOutMin
    ) private returns (IPool.TokenAmount memory amountOut) {
        uint pathsLength = paths.length;

        SwapPath memory path;
        SwapStep memory step;
        IPool.TokenAmount memory tokenAmount;
        uint stepsLength;
        uint j;

        for (uint i; i < pathsLength; ) {
            path = paths[i];

            // Prefund the first step.
            step = path.steps[0];
            _transferFromSender(path.tokenIn, step.pool, path.amountIn);

            // Cache steps length.
            stepsLength = path.steps.length;

            for (j = 0; j < stepsLength; ) {
                if (j == stepsLength - 1) {
                    // Accumulate output amount at the last step.
                    tokenAmount = IBasePool(step.pool).swap(
                        step.data, msg.sender, step.callback, step.callbackData
                    );

                    amountOut.token = tokenAmount.token;
                    amountOut.amount += tokenAmount.amount;

                    break;
                } else {
                    // Swap and send tokens to the next step.
                    IBasePool(step.pool).swap(step.data, msg.sender, step.callback, step.callbackData);

                    // Cache the next step.
                    step = path.steps[j + 1];
                }

                unchecked {
                    ++j;
                }
            }

            unchecked {
                ++i;
            }
        }

        if (amountOut.amount < amountOutMin) {
            revert TooLittleReceived();
        }
    }

    function swap(
        SwapPath[] memory paths,
        uint amountOutMin,
        uint deadline
    ) external payable ensure(deadline) returns (IPool.TokenAmount memory amountOut) {
        amountOut = _swap(
            paths,
            amountOutMin
        );
    }

    function swapWithPermit(
        SwapPath[] memory paths,
        uint amountOutMin,
        uint deadline,
        SplitPermitParams calldata permit
    ) external payable ensure(deadline) returns (IPool.TokenAmount memory amountOut) {
        // Approve input tokens via permit.
        IERC20Permit(permit.token).permit(
            msg.sender,
            address(this),
            permit.approveAmount,
            permit.deadline,
            permit.v,
            permit.r,
            permit.s
        );

        amountOut = _swap(
            paths,
            amountOutMin
        );
    }

    /// @notice Wrapper function to allow pool deployment to be batched.
    function createPool(address _factory, bytes calldata data) external payable returns (address) {
        return IPoolFactory(_factory).createPool(data);
    }

    function stake(address stakingPool, address token, uint amount, address onBehalf) external {
        TransferHelper.safeTransferFrom(token, msg.sender, address(this), amount);

        if (IERC20(token).allowance(address(this), stakingPool) < amount) {
            TransferHelper.safeApprove(token, stakingPool, type(uint).max);
        }

        IStakingPool(stakingPool).stake(amount, onBehalf);
    }
}

File 2 of 20 : Multicall.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.8.0;

/// @notice Helper utility that enables calling multiple local methods in a single call.
/// @author Modified from Uniswap (https://github.com/Uniswap/v3-periphery/blob/main/contracts/base/Multicall.sol)
/// License-Identifier: GPL-2.0-or-later
abstract contract Multicall {
    function multicall(bytes[] calldata data) public payable returns (bytes[] memory results) {
        results = new bytes[](data.length);
        
        for (uint i; i < data.length;) {
            (bool success, bytes memory result) = address(this).delegatecall(data[i]);

            if (!success) {
                // Next 5 lines from https://ethereum.stackexchange.com/a/83577
                if (result.length < 68) revert();
                assembly {
                    result := add(result, 0x04)
                }
                revert(abi.decode(result, (string)));
            }

            results[i] = result;

            // cannot realistically overflow on human timescales
            unchecked {
                ++i;
            }
        }
    }
}

// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.8.0;

import "../interfaces/token/IERC20Permit2.sol";
import "../interfaces/token/IERC20PermitAllowed.sol";

abstract contract SelfPermit {
    function selfPermit(
        address token,
        uint value,
        uint deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public payable {
        IERC20Permit(token).permit(msg.sender, address(this), value, deadline, v, r, s);
    }

    function selfPermitIfNecessary(
        address token,
        uint value,
        uint deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external payable {
        if (IERC20(token).allowance(msg.sender, address(this)) < value) {
            selfPermit(token, value, deadline, v, r, s);
        }
    }

    function selfPermitAllowed(
        address token,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public payable {
        IERC20PermitAllowed(token).permit(msg.sender, address(this), nonce, expiry, true, v, r, s);
    }

    function selfPermitAllowedIfNecessary(
        address token,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external payable {
        if (IERC20(token).allowance(msg.sender, address(this)) < type(uint256).max) {
            selfPermitAllowed(token, nonce, expiry, v, r, s);
        }
    }

    function selfPermit2(
        address token,
        uint value,
        uint deadline,
        bytes calldata signature
    ) public payable {
        IERC20Permit2(token).permit2(msg.sender, address(this), value, deadline, signature);
    }

    function selfPermit2IfNecessary(
        address token,
        uint value,
        uint deadline,
        bytes calldata signature
    ) external payable {
        if (IERC20(token).allowance(msg.sender, address(this)) < value) {
            selfPermit2(token, value, deadline, signature);
        }
    }
}

// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity >=0.5.0;

interface IPoolFactory {
    function master() external view returns (address);

    function getDeployData() external view returns (bytes memory);

    function createPool(bytes calldata data) external returns (address pool);
}

File 5 of 20 : IRouter.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity >=0.5.0;

interface IRouter {
    struct SwapStep {
        address pool;
        bytes data;
        address callback;
        bytes callbackData;
    }

    struct SwapPath {
        SwapStep[] steps;
        address tokenIn;
        uint amountIn;
    }

    struct SplitPermitParams {
        address token;
        uint approveAmount;
        uint deadline;
        uint8 v;
        bytes32 r;
        bytes32 s;
    }

    struct ArrayPermitParams {
        uint approveAmount;
        uint deadline;
        bytes signature;
    }
}

// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity >=0.5.0;

interface IStakingPool {
    function stake(uint amount, address onBehalf) external;
}

// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity >=0.5.0;

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

// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity >=0.5.0;

import "./IPool.sol";
import "../token/IERC20Permit2.sol";

interface IBasePool is IPool, IERC20Permit2 {
    function token0() external view returns (address);
    function token1() external view returns (address);

    function reserve0() external view returns (uint);
    function reserve1() external view returns (uint);
    function invariantLast() external view returns (uint);

    function getReserves() external view returns (uint, uint);
    function getAmountOut(address tokenIn, uint amountIn, address sender) external view returns (uint amountOut);
    function getAmountIn(address tokenOut, uint amountOut, address sender) external view returns (uint amountIn);

    event Mint(
        address indexed sender,
        uint amount0,
        uint amount1,
        uint liquidity,
        address indexed to
    );

    event Burn(
        address indexed sender,
        uint amount0,
        uint amount1,
        uint liquidity,
        address indexed to
    );

    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );

    event Sync(
        uint reserve0,
        uint reserve1
    );
}

// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity >=0.5.0;

interface IPool {
    struct TokenAmount {
        address token;
        uint amount;
    }

    /// @dev Returns the address of pool master.
    function master() external view returns (address);

    /// @dev Returns the vault.
    function vault() external view returns (address);

    /// @dev Returns the pool type.
    function poolType() external view returns (uint16);

    /// @dev Returns the assets of the pool.
    function getAssets() external view returns (address[] memory assets);

    /// @dev Returns the swap fee of the pool.
    function getSwapFee(address sender, address tokenIn, address tokenOut, bytes calldata data) external view returns (uint24 swapFee);

    /// @dev Returns the protocol fee of the pool.
    function getProtocolFee() external view returns (uint24 protocolFee);

    /// @dev Mints liquidity.
    function mint(
        bytes calldata data,
        address sender,
        address callback,
        bytes calldata callbackData
    ) external returns (uint liquidity);

    /// @dev Burns liquidity.
    function burn(
        bytes calldata data,
        address sender,
        address callback,
        bytes calldata callbackData
    ) external returns (TokenAmount[] memory tokenAmounts);

    /// @dev Burns liquidity with single output token.
    function burnSingle(
        bytes calldata data,
        address sender,
        address callback,
        bytes calldata callbackData
    ) external returns (TokenAmount memory tokenAmount);

    /// @dev Swaps between tokens.
    function swap(
        bytes calldata data,
        address sender,
        address callback,
        bytes calldata callbackData
    ) external returns (TokenAmount memory tokenAmount);
}

// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity >=0.5.0;

import "./IERC20Base.sol";

interface IERC20 is IERC20Base {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity >=0.5.0;

interface IERC20Base {
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint amount) external returns (bool);
    function transfer(address to, uint amount) external returns (bool);
    function transferFrom(address from, address to, uint amount) external returns (bool);
    
    event Approval(address indexed owner, address indexed spender, uint amount);
    event Transfer(address indexed from, address indexed to, uint amount);
}

// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity >=0.5.0;

import "./IERC20.sol";

interface IERC20Permit is IERC20 {
    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
    function nonces(address owner) external view returns (uint);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity >=0.5.0;

import "./IERC20Permit.sol";

interface IERC20Permit2 is IERC20Permit {
    function permit2(address owner, address spender, uint amount, uint deadline, bytes calldata signature) external;
}

File 14 of 20 : IERC20PermitAllowed.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity >=0.5.0;

/// @title Interface for permit
/// @notice Interface used by DAI/CHAI for permit
interface IERC20PermitAllowed {
    /// @notice Approve the spender to spend some tokens via the holder signature
    /// @dev This is the permit interface used by DAI and CHAI
    /// @param holder The address of the token holder, the token owner
    /// @param spender The address of the token spender
    /// @param nonce The holder's nonce, increases at each call to permit
    /// @param expiry The timestamp at which the permit is no longer valid
    /// @param allowed Boolean that sets approval amount, true for type(uint256).max and false for 0
    /// @param v Must produce valid secp256k1 signature from the holder along with `r` and `s`
    /// @param r Must produce valid secp256k1 signature from the holder along with `v` and `s`
    /// @param s Must produce valid secp256k1 signature from the holder along with `r` and `v`
    function permit(
        address holder,
        address spender,
        uint256 nonce,
        uint256 expiry,
        bool allowed,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
}

File 15 of 20 : IERC3156FlashBorrower.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity >=0.5.0;

interface IERC3156FlashBorrower {
    /**
     * @dev Receive a flash loan.
     * @param initiator The initiator of the loan.
     * @param token The loan currency.
     * @param amount The amount of tokens lent.
     * @param fee The additional amount of tokens to repay.
     * @param data Arbitrary data structure, intended to contain user-defined parameters.
     * @return The keccak256 hash of "ERC3156FlashBorrower.onFlashLoan"
     */
    function onFlashLoan(
        address initiator,
        address token,
        uint256 amount,
        uint256 fee,
        bytes calldata data
    ) external returns (bytes32);
}

// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity >=0.5.0;

import "./IERC3156FlashBorrower.sol";

interface IERC3156FlashLender {
    /**
     * @dev The amount of currency available to be lent.
     * @param token The loan currency.
     * @return The amount of `token` that can be borrowed.
     */
    function maxFlashLoan(
        address token
    ) external view returns (uint256);

    /**
     * @dev The fee to be charged for a given loan.
     * @param token The loan currency.
     * @param amount The amount of tokens lent.
     * @return The amount of `token` to be charged for the loan, on top of the returned principal.
     */
    function flashFee(
        address token,
        uint256 amount
    ) external view returns (uint256);

    /**
     * @dev Initiate a flash loan.
     * @param receiver The receiver of the tokens in the loan, and the receiver of the callback.
     * @param token The loan currency.
     * @param amount The amount of tokens lent.
     * @param data Arbitrary data structure, intended to contain user-defined parameters.
     */
    function flashLoan(
        IERC3156FlashBorrower receiver,
        address token,
        uint256 amount,
        bytes calldata data
    ) external returns (bool);
}

// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity >=0.5.0;

import "./IFlashLoanRecipient.sol";
import "./IERC3156FlashLender.sol";

interface IFlashLoan is IERC3156FlashLender {
    function flashLoanFeePercentage() external view returns (uint);

    /**
     * @dev Performs a 'flash loan', sending tokens to `recipient`, executing the `receiveFlashLoan` hook on it,
     * and then reverting unless the tokens plus a proportional protocol fee have been returned.
     *
     * The `tokens` and `amounts` arrays must have the same length, and each entry in these indicates the loan amount
     * for each token contract. `tokens` must be sorted in ascending order.
     *
     * The 'userData' field is ignored by the Vault, and forwarded as-is to `recipient` as part of the
     * `receiveFlashLoan` call.
     *
     * Emits `FlashLoan` events.
     */
    function flashLoanMultiple(
        IFlashLoanRecipient recipient,
        address[] memory tokens,
        uint[] memory amounts,
        bytes memory userData
    ) external;

    /**
     * @dev Emitted for each individual flash loan performed by `flashLoan`.
     */
    event FlashLoan(address indexed recipient, address indexed token, uint amount, uint feeAmount);
}

File 18 of 20 : IFlashLoanRecipient.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity >=0.7.0 <0.9.0;

// Inspired by Aave Protocol's IFlashLoanReceiver.

interface IFlashLoanRecipient {
    /**
     * @dev When `flashLoan` is called on the Vault, it invokes the `receiveFlashLoan` hook on the recipient.
     *
     * At the time of the call, the Vault will have transferred `amounts` for `tokens` to the recipient. Before this
     * call returns, the recipient must have transferred `amounts` plus `feeAmounts` for each token back to the
     * Vault, or else the entire flash loan will revert.
     *
     * `userData` is the same value passed in the `IVault.flashLoan` call.
     */
    function receiveFlashLoan(
        address[] memory tokens,
        uint[] memory amounts,
        uint[] memory feeAmounts,
        bytes memory userData
    ) external;
}

// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity >=0.5.0;

import "./IFlashLoan.sol";

interface IVault is IFlashLoan {
    function wETH() external view returns (address);

    function reserves(address token) external view returns (uint reserve);

    function balanceOf(address token, address owner) external view returns (uint balance);

    function deposit(address token, address to) external payable returns (uint amount);

    function depositETH(address to) external payable returns (uint amount);

    function transferAndDeposit(address token, address to, uint amount) external payable returns (uint);

    function transfer(address token, address to, uint amount) external;

    function withdraw(address token, address to, uint amount) external;

    function withdrawAlternative(address token, address to, uint amount, uint8 mode) external;

    function withdrawETH(address to, uint amount) external;
}

// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity ^0.8.0;

/// @dev The ETH transfer has failed.
error ETHTransferFailed();

/// @dev The ERC20 `transferFrom` has failed.
error TransferFromFailed();

/// @dev The ERC20 `transfer` has failed.
error TransferFailed();

/// @dev The ERC20 `approve` has failed.
error ApproveFailed();

/// @dev Helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true / false.
library TransferHelper {
    function safeApprove(
        address token,
        address to,
        uint value
    ) internal {
        // bytes4(keccak256(bytes("approve(address,uint256)")));
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));

        if (!success || (data.length != 0 && !abi.decode(data, (bool)))) {
            revert ApproveFailed();
        }
    }

    function safeTransfer(
        address token,
        address to,
        uint value
    ) internal {
        // bytes4(keccak256(bytes("transfer(address,uint256)")));
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));

        if (!success || (data.length != 0 && !abi.decode(data, (bool)))) {
            revert TransferFailed();
        }
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint value
    ) internal {
        // bytes4(keccak256(bytes("transferFrom(address,address,uint256)")));
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));

        if (!success || (data.length != 0 && !abi.decode(data, (bool)))) {
            revert TransferFromFailed();
        }
    }

    function safeTransferETH(address to, uint value) internal {
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, ) = to.call{value: value}("");

        if (!success) {
            revert ETHTransferFailed();
        }
    }
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_wETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApproveFailed","type":"error"},{"inputs":[],"name":"Expired","type":"error"},{"inputs":[],"name":"NotEnoughLiquidityMinted","type":"error"},{"inputs":[],"name":"TooLittleReceived","type":"error"},{"inputs":[],"name":"TransferFromFailed","type":"error"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct SyncSwapRouter.TokenInput[]","name":"inputs","type":"tuple[]"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"minLiquidity","type":"uint256"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct SyncSwapRouter.TokenInput[]","name":"inputs","type":"tuple[]"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"minLiquidity","type":"uint256"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"}],"name":"addLiquidity2","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct SyncSwapRouter.TokenInput[]","name":"inputs","type":"tuple[]"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"minLiquidity","type":"uint256"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"approveAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct IRouter.SplitPermitParams[]","name":"permits","type":"tuple[]"}],"name":"addLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct SyncSwapRouter.TokenInput[]","name":"inputs","type":"tuple[]"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"minLiquidity","type":"uint256"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"approveAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct IRouter.SplitPermitParams[]","name":"permits","type":"tuple[]"}],"name":"addLiquidityWithPermit2","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256[]","name":"minAmounts","type":"uint256[]"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"}],"name":"burnLiquidity","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount[]","name":"amounts","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"}],"name":"burnLiquiditySingle","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount","name":"amountOut","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"},{"components":[{"internalType":"uint256","name":"approveAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct IRouter.ArrayPermitParams","name":"permit","type":"tuple"}],"name":"burnLiquiditySingleWithPermit","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount","name":"amountOut","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256[]","name":"minAmounts","type":"uint256[]"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"},{"components":[{"internalType":"uint256","name":"approveAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct IRouter.ArrayPermitParams","name":"permit","type":"tuple"}],"name":"burnLiquidityWithPermit","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount[]","name":"amounts","type":"tuple[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"createPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"enteredPools","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"enteredPoolsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isPoolEntered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"selfPermit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"selfPermit2","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"selfPermit2IfNecessary","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"selfPermitAllowed","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"selfPermitAllowedIfNecessary","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"selfPermitIfNecessary","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"stakingPool","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"onBehalf","type":"address"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"}],"internalType":"struct IRouter.SwapStep[]","name":"steps","type":"tuple[]"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"internalType":"struct IRouter.SwapPath[]","name":"paths","type":"tuple[]"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swap","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount","name":"amountOut","type":"tuple"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"address","name":"callback","type":"address"},{"internalType":"bytes","name":"callbackData","type":"bytes"}],"internalType":"struct IRouter.SwapStep[]","name":"steps","type":"tuple[]"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"internalType":"struct IRouter.SwapPath[]","name":"paths","type":"tuple[]"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"approveAmount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct IRouter.SplitPermitParams","name":"permit","type":"tuple"}],"name":"swapWithPermit","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct IPool.TokenAmount","name":"amountOut","type":"tuple"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60c06040523480156200001157600080fd5b506040516200318438038062003184833981016040819052620000349162000086565b6001600160a01b039182166080521660a052620000c9565b60006001600160a01b0382165b92915050565b6200006a816200004c565b81146200007657600080fd5b50565b805162000059816200005f565b600080604083850312156200009e576200009e600080fd5b6000620000ac858562000079565b9250506020620000bf8582860162000079565b9150509250929050565b60805160a0516130806200010460003960006103e00152600081816104270152818161179801528181611821015261185d01526130806000f3fe60806040526004361061014b5760003560e01c80639dd41df2116100b6578063c4b3fc401161006f578063c4b3fc4014610395578063ced78795146103a8578063e84d494b146103bb578063f2428621146103ce578063f3995c6714610402578063fbfa77cf1461041557600080fd5b80639dd41df2146102e6578063a4a78f0c146102f9578063ac9650d81461030c578063ad271fa31461032c578063b956b3fb1461034c578063c2e3140a1461038257600080fd5b80636291027c116101085780636291027c1461024d578063688ee44c1461026d5780636cbe96fa146102805780636cc781cd146102a05780637d10c9d6146102b357806394ec6d78146102d357600080fd5b80632b4abadb146101505780632cc4081e14610186578063353766c6146101a65780634659a494146101d35780634f25b858146101e857806353c43f151461022d575b600080fd5b34801561015c57600080fd5b5061017061016b36600461191a565b610449565b60405161017d9190611966565b60405180910390f35b610199610194366004611ce1565b610481565b60405161017d9190611d74565b3480156101b257600080fd5b506101c66101c1366004611e89565b6104ca565b60405161017d9190611ffa565b6101e66101e136600461201f565b6105c3565b005b3480156101f457600080fd5b506102206102033660046120a9565b600060208181529281526040808220909352908152205460ff1681565b60405161017d91906120e4565b34801561023957600080fd5b506101996102483660046120f2565b610638565b34801561025957600080fd5b506101e66102683660046121a3565b610665565b6101e661027b366004612207565b61075b565b61029361028e3660046122d4565b6107e6565b60405161017d91906123ba565b6101e66102ae366004612207565b610807565b3480156102bf57600080fd5b506101996102ce3660046123e3565b610876565b6102936102e13660046122d4565b61091c565b6101706102f43660046124d0565b610947565b6101e661030736600461201f565b6109c5565b61031f61031a36600461252b565b610a54565b60405161017d9190612644565b34801561033857600080fd5b506101c6610347366004612655565b610ba9565b34801561035857600080fd5b506102936103673660046126fe565b6001600160a01b031660009081526001602052604090205490565b6101e661039036600461201f565b610c22565b6102936103a3366004612830565b610ca7565b6102936103b6366004612830565b610db4565b6101996103c9366004612947565b610dd3565b3480156103da57600080fd5b506101707f000000000000000000000000000000000000000000000000000000000000000081565b6101e661041036600461201f565b610eb2565b34801561042157600080fd5b506101707f000000000000000000000000000000000000000000000000000000000000000081565b6001602052816000526040600020818154811061046557600080fd5b6000918252602090912001546001600160a01b03169150829050565b604080518082019091526000808252602082015281804211156104b757604051630407b05b60e31b815260040160405180910390fd5b6104c18585610eea565b95945050505050565b805160208201516040808401519051630b00663360e21b81526060936001600160a01b038f1693632c0198cc9361050b9333933093909290916004016129b9565b600060405180830381600087803b15801561052557600080fd5b505af1158015610539573d6000803e3d6000fd5b505050506105b48b8b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d9182918501908490808284376000920191909152508c92508b91508a9050611176565b9b9a5050505050505050505050565b6040516323f2ebc360e21b81526001600160a01b03871690638fcbaf0c906105fe90339030908a908a906001908b908b908b90600401612a09565b600060405180830381600087803b15801561061857600080fd5b505af115801561062c573d6000803e3d6000fd5b50505050505050505050565b604080518082019091526000808252602082015261065a8787878787876112e4565b979650505050505050565b61067183333085611405565b604051636eb1769f60e11b815282906001600160a01b0385169063dd62ed3e906106a19030908990600401612a73565b602060405180830381865afa1580156106be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e29190612a99565b10156106f5576106f583856000196114f3565b604051637acb775760e01b81526001600160a01b03851690637acb7757906107239085908590600401612aba565b600060405180830381600087803b15801561073d57600080fd5b505af1158015610751573d6000803e3d6000fd5b5050505050505050565b604051636eb1769f60e11b815284906001600160a01b0387169063dd62ed3e9061078b9033903090600401612a73565b602060405180830381865afa1580156107a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cc9190612a99565b10156107df576107df8585858585610807565b5050505050565b60006107f98a8a8a8a8a8a8a8a8a6115df565b9a9950505050505050505050565b604051630b00663360e21b81526001600160a01b03861690632c0198cc9061083d90339030908990899089908990600401612aeb565b600060405180830381600087803b15801561085757600080fd5b505af115801561086b573d6000803e3d6000fd5b505050505050505050565b60408051808201909152600080825260208201526001600160a01b038816632c0198cc3330853560208701356108af6040890189612b33565b6040518763ffffffff1660e01b81526004016108d096959493929190612aeb565b600060405180830381600087803b1580156108ea57600080fd5b505af11580156108fe573d6000803e3d6000fd5b505050506109108888888888886112e4565b98975050505050505050565b600061092f8a8a8a8a8a8a8a8a8a6115df565b905061093a8a6116f4565b9998505050505050505050565b6040516313b8683f60e01b81526000906001600160a01b038516906313b8683f906109789086908690600401612b91565b6020604051808303816000875af1158015610997573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109bb9190612bae565b90505b9392505050565b604051636eb1769f60e11b8152600019906001600160a01b0388169063dd62ed3e906109f79033903090600401612a73565b602060405180830381865afa158015610a14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a389190612a99565b1015610a4c57610a4c8686868686866105c3565b505050505050565b6060816001600160401b03811115610a6e57610a6e611974565b604051908082528060200260200182016040528015610aa157816020015b6060815260200190600190039081610a8c5790505b50905060005b82811015610ba25760008030868685818110610ac557610ac5612bcf565b9050602002810190610ad79190612b33565b604051610ae5929190612bf8565b600060405180830381855af49150503d8060008114610b20576040519150601f19603f3d011682016040523d82523d6000602084013e610b25565b606091505b509150915081610b7a57604481511015610b3e57600080fd5b60048101905080806020019051810190610b589190612c5d565b60405162461bcd60e51b8152600401610b719190612c97565b60405180910390fd5b80848481518110610b8d57610b8d612bcf565b60209081029190910101525050600101610aa7565b5092915050565b60606107f98a8a8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b92508a9150899050611176565b604051636eb1769f60e11b815285906001600160a01b0388169063dd62ed3e90610c529033903090600401612a73565b602060405180830381865afa158015610c6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c939190612a99565b1015610a4c57610a4c868686868686610eb2565b80516040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905290919060005b82811015610d9157848181518110610cfa57610cfa612bcf565b6020026020010151915081600001516001600160a01b031663d505accf333085602001518660400151876060015188608001518960a001516040518863ffffffff1660e01b8152600401610d549796959493929190612ca8565b600060405180830381600087803b158015610d6e57600080fd5b505af1158015610d82573d6000803e3d6000fd5b50505050806001019050610ce0565b50610da38d8d8d8d8d8d8d8d8d6115df565b9d9c50505050505050505050505050565b6000610dc88b8b8b8b8b8b8b8b8b8b610ca7565b90506107f98b6116f4565b60408051808201909152600080825260208201528280421115610e0957604051630407b05b60e31b815260040160405180910390fd5b610e1660208401846126fe565b6001600160a01b031663d505accf333060208701356040880135610e4060808a0160608b01612d04565b89608001358a60a001356040518863ffffffff1660e01b8152600401610e6c9796959493929190612ca8565b600060405180830381600087803b158015610e8657600080fd5b505af1158015610e9a573d6000803e3d6000fd5b50505050610ea88686610eea565b9695505050505050565b60405163d505accf60e01b81526001600160a01b0387169063d505accf906105fe90339030908a908a908a908a908a90600401612ca8565b604080518082019091526000808252602082015282516040805160608082018352808252600060208084018290528385018290528451608081018652828152808201849052808601839052808401939093528451808601909552818552840152909160008060005b8681101561114457898181518110610f6c57610f6c612bcf565b602002602001015195508560000151600081518110610f8d57610f8d612bcf565b60200260200101519450610fae866020015186600001518860400151611773565b8551519250600091505b8282101561113c57610fcb600184612d3b565b82036110855784600001516001600160a01b0316637132bb7f866020015133886040015189606001516040518563ffffffff1660e01b81526004016110139493929190612d52565b60408051808303816000875af1158015611031573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110559190612ddb565b80516001600160a01b03168952602080820151908a018051929650909161107d908390612dfc565b90525061113c565b84600001516001600160a01b0316637132bb7f866020015133886040015189606001516040518563ffffffff1660e01b81526004016110c79493929190612d52565b60408051808303816000875af11580156110e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111099190612ddb565b508551611117836001612dfc565b8151811061112757611127612bcf565b60200260200101519450816001019150610fb8565b600101610f52565b50878760200151101561116a5760405163c9f52c7160e01b815260040160405180910390fd5b50505050505092915050565b6040516323b872dd60e01b81526060906001600160a01b038916906323b872dd906111a99033908c908c90600401612e14565b6020604051808303816000875af11580156111c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ec9190612e4f565b5060405163f66eab5b60e01b81526001600160a01b0389169063f66eab5b906112219089903390899089908990600401612e70565b6000604051808303816000875af1158015611240573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112689190810190612f27565b805190915060005b818110156112d75786818151811061128a5761128a612bcf565b60200260200101518382815181106112a4576112a4612bcf565b60200260200101516020015110156112cf5760405163c9f52c7160e01b815260040160405180910390fd5b600101611270565b5050979650505050505050565b6040805180820182526000808252602082015290516323b872dd60e01b81526001600160a01b038816906323b872dd906113269033908b908b90600401612e14565b6020604051808303816000875af1158015611345573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113699190612e4f565b506040516313d85e7560e11b81526001600160a01b038816906327b0bcea9061139c908890339088908890600401612d52565b60408051808303816000875af11580156113ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113de9190612ddb565b90508381602001511015610ea85760405163c9f52c7160e01b815260040160405180910390fd5b600080856001600160a01b03166323b872dd86868660405160240161142c93929190612e14565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516114659190612f83565b6000604051808303816000865af19150503d80600081146114a2576040519150601f19603f3d011682016040523d82523d6000602084013e6114a7565b606091505b50915091508115806114d557508051158015906114d55750808060200190518101906114d39190612e4f565b155b15610a4c57604051631e4e7d0960e21b815260040160405180910390fd5b600080846001600160a01b031663095ea7b38585604051602401611518929190612f8f565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516115519190612f83565b6000604051808303816000865af19150503d806000811461158e576040519150601f19603f3d011682016040523d82523d6000602084013e611593565b606091505b50915091508115806115c157508051158015906115c15750808060200190518101906115bf9190612e4f565b155b156107df57604051633e3f8f7360e01b815260040160405180910390fd5b6040805180820190915260008082526020820181905290889060005b82811015611648578b8b8281811061161557611615612bcf565b90506040020180360381019061162b9190612fe8565b915061164082600001518e8460200151611773565b6001016115fb565b506040516301f3943560e11b81526001600160a01b038d16906303e7286a9061167f908c908c9033908c908c908c90600401613009565b6020604051808303816000875af115801561169e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c29190612a99565b9250868310156116e55760405163124ca15f60e11b815260040160405180910390fd5b50509998505050505050505050565b6001600160a01b03811660009081526020818152604080832033845290915290205460ff16611770576001600160a01b0381166000818152602081815260408083203384528252808320805460ff1916600190811790915580835290832080549182018155835291200180546001600160a01b03191690911790555b50565b6001600160a01b03831661181a57604051631f2c13e160e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063f9609f089083906117d19087908790600401612a73565b60206040518083038185885af11580156117ef573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906118149190612a99565b50505050565b61184683337f000000000000000000000000000000000000000000000000000000000000000084611405565b604051631f2c13e160e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063f9609f08906118949086908690600401612a73565b6020604051808303816000875af11580156118b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118149190612a99565b60006001600160a01b0382165b92915050565b6118f3816118d7565b811461177057600080fd5b80356118e4816118ea565b806118f3565b80356118e481611909565b6000806040838503121561193057611930600080fd5b600061193c85856118fe565b925050602061194d8582860161190f565b9150509250929050565b611960816118d7565b82525050565b602081016118e48284611957565b634e487b7160e01b600052604160045260246000fd5b601f19601f83011681018181106001600160401b03821117156119af576119af611974565b6040525050565b60006119c160405190565b90506119cd828261198a565b919050565b60006001600160401b038211156119eb576119eb611974565b5060209081020190565b60006001600160401b03821115611a0e57611a0e611974565b601f19601f83011660200192915050565b82818337506000910152565b6000611a3e611a39846119f5565b6119b6565b905082815260208101848484011115611a5957611a59600080fd5b611a64848285611a1f565b509392505050565b600082601f830112611a8057611a80600080fd5b8135611a90848260208601611a2b565b949350505050565b600060808284031215611aad57611aad600080fd5b611ab760806119b6565b90506000611ac584846118fe565b82525060208201356001600160401b03811115611ae457611ae4600080fd5b611af084828501611a6c565b6020830152506040611b04848285016118fe565b60408301525060608201356001600160401b03811115611b2657611b26600080fd5b611b3284828501611a6c565b60608301525092915050565b6000611b4c611a39846119d2565b83815290506020808201908402830185811115611b6b57611b6b600080fd5b835b81811015611bab5780356001600160401b03811115611b8e57611b8e600080fd5b808601611b9b8982611a98565b8552505060209283019201611b6d565b5050509392505050565b600082601f830112611bc957611bc9600080fd5b8135611a90848260208601611b3e565b600060608284031215611bee57611bee600080fd5b611bf860606119b6565b905081356001600160401b03811115611c1357611c13600080fd5b611c1f84828501611bb5565b8252506020611c30848483016118fe565b6020830152506040611c448482850161190f565b60408301525092915050565b6000611c5e611a39846119d2565b83815290506020808201908402830185811115611c7d57611c7d600080fd5b835b81811015611bab5780356001600160401b03811115611ca057611ca0600080fd5b808601611cad8982611bd9565b8552505060209283019201611c7f565b600082601f830112611cd157611cd1600080fd5b8135611a90848260208601611c50565b600080600060608486031215611cf957611cf9600080fd5b83356001600160401b03811115611d1257611d12600080fd5b611d1e86828701611cbd565b9350506020611d2f8682870161190f565b9250506040611d408682870161190f565b9150509250925092565b80611960565b80516040830190611d618482611957565b5060208201516118146020850182611d4a565b604081016118e48284611d50565b60008083601f840112611d9757611d97600080fd5b5081356001600160401b03811115611db157611db1600080fd5b602083019150836001820283011115611dcc57611dcc600080fd5b9250929050565b60008083601f840112611de857611de8600080fd5b5081356001600160401b03811115611e0257611e02600080fd5b602083019150836020820283011115611dcc57611dcc600080fd5b600060608284031215611e3257611e32600080fd5b611e3c60606119b6565b90506000611e4a848461190f565b8252506020611e5b8484830161190f565b60208301525060408201356001600160401b03811115611e7d57611e7d600080fd5b611c4484828501611a6c565b60008060008060008060008060008060e08b8d031215611eab57611eab600080fd5b6000611eb78d8d6118fe565b9a50506020611ec88d828e0161190f565b99505060408b01356001600160401b03811115611ee757611ee7600080fd5b611ef38d828e01611d82565b985098505060608b01356001600160401b03811115611f1457611f14600080fd5b611f208d828e01611dd3565b96509650506080611f338d828e016118fe565b94505060a08b01356001600160401b03811115611f5257611f52600080fd5b611f5e8d828e01611d82565b935093505060c08b01356001600160401b03811115611f7f57611f7f600080fd5b611f8b8d828e01611e1d565b9150509295989b9194979a5092959850565b6000611fa98383611d50565b505060400190565b6000611fbb825190565b80845260209384019383018060005b83811015611fef578151611fde8882611f9d565b975060208301925050600101611fca565b509495945050505050565b602080825281016109be8184611fb1565b60ff81166118f3565b80356118e48161200b565b60008060008060008060c0878903121561203b5761203b600080fd5b600061204789896118fe565b965050602061205889828a0161190f565b955050604061206989828a0161190f565b945050606061207a89828a01612014565b935050608061208b89828a0161190f565b92505060a061209c89828a0161190f565b9150509295509295509295565b600080604083850312156120bf576120bf600080fd5b60006120cb85856118fe565b925050602061194d858286016118fe565b801515611960565b602081016118e482846120dc565b60008060008060008060c0878903121561210e5761210e600080fd5b600061211a89896118fe565b965050602061212b89828a0161190f565b95505060408701356001600160401b0381111561214a5761214a600080fd5b61215689828a01611a6c565b945050606061216789828a0161190f565b935050608061217889828a016118fe565b92505060a08701356001600160401b0381111561219757612197600080fd5b61209c89828a01611a6c565b600080600080608085870312156121bc576121bc600080fd5b60006121c887876118fe565b94505060206121d9878288016118fe565b93505060406121ea8782880161190f565b92505060606121fb878288016118fe565b91505092959194509250565b60008060008060006080868803121561222257612222600080fd5b600061222e88886118fe565b955050602061223f8882890161190f565b94505060406122508882890161190f565b93505060608601356001600160401b0381111561226f5761226f600080fd5b61227b88828901611d82565b92509250509295509295909350565b60008083601f84011261229f5761229f600080fd5b5081356001600160401b038111156122b9576122b9600080fd5b602083019150836040820283011115611dcc57611dcc600080fd5b600080600080600080600080600060c08a8c0312156122f5576122f5600080fd5b60006123018c8c6118fe565b99505060208a01356001600160401b0381111561232057612320600080fd5b61232c8c828d0161228a565b985098505060408a01356001600160401b0381111561234d5761234d600080fd5b6123598c828d01611d82565b9650965050606061236c8c828d0161190f565b945050608061237d8c828d016118fe565b93505060a08a01356001600160401b0381111561239c5761239c600080fd5b6123a88c828d01611d82565b92509250509295985092959850929598565b602081016118e48284611d4a565b6000606082840312156123dd576123dd600080fd5b50919050565b600080600080600080600060e0888a03121561240157612401600080fd5b600061240d8a8a6118fe565b975050602061241e8a828b0161190f565b96505060408801356001600160401b0381111561243d5761243d600080fd5b6124498a828b01611a6c565b955050606061245a8a828b0161190f565b945050608061246b8a828b016118fe565b93505060a08801356001600160401b0381111561248a5761248a600080fd5b6124968a828b01611a6c565b92505060c08801356001600160401b038111156124b5576124b5600080fd5b6124c18a828b016123c8565b91505092959891949750929550565b6000806000604084860312156124e8576124e8600080fd5b60006124f486866118fe565b93505060208401356001600160401b0381111561251357612513600080fd5b61251f86828701611d82565b92509250509250925092565b6000806020838503121561254157612541600080fd5b82356001600160401b0381111561255a5761255a600080fd5b61256685828601611dd3565b92509250509250929050565b60005b8381101561258d578181015183820152602001612575565b838111156118145750506000910152565b60006125a8825190565b8084526020840193506125bf818560208601612572565b601f19601f8201165b9093019392505050565b60006109be838361259e565b60006125e8825190565b808452602084019350836020820285016126028560200190565b8060005b85811015612637578484038952815161261f85826125d2565b94506020830160209a909a0199925050600101612606565b5091979650505050505050565b602080825281016109be81846125de565b600080600080600080600080600060c08a8c03121561267657612676600080fd5b60006126828c8c6118fe565b99505060206126938c828d0161190f565b98505060408a01356001600160401b038111156126b2576126b2600080fd5b6126be8c828d01611d82565b975097505060608a01356001600160401b038111156126df576126df600080fd5b6126eb8c828d01611dd3565b9550955050608061237d8c828d016118fe565b60006020828403121561271357612713600080fd5b6000611a9084846118fe565b600060c0828403121561273457612734600080fd5b61273e60c06119b6565b9050600061274c84846118fe565b825250602061275d8484830161190f565b60208301525060406127718482850161190f565b604083015250606061278584828501612014565b60608301525060806127998482850161190f565b60808301525060a06127ad8482850161190f565b60a08301525092915050565b60006127c7611a39846119d2565b83815290506020810160c084028301858111156127e6576127e6600080fd5b835b81811015611bab57806127fb888261271f565b84525060209092019160c0016127e8565b600082601f83011261282057612820600080fd5b8135611a908482602086016127b9565b60008060008060008060008060008060e08b8d03121561285257612852600080fd5b600061285e8d8d6118fe565b9a505060208b01356001600160401b0381111561287d5761287d600080fd5b6128898d828e0161228a565b995099505060408b01356001600160401b038111156128aa576128aa600080fd5b6128b68d828e01611d82565b975097505060606128c98d828e0161190f565b95505060806128da8d828e016118fe565b94505060a08b01356001600160401b038111156128f9576128f9600080fd5b6129058d828e01611d82565b935093505060c08b01356001600160401b0381111561292657612926600080fd5b611f8b8d828e0161280c565b600060c082840312156123dd576123dd600080fd5b600080600080610120858703121561296157612961600080fd5b84356001600160401b0381111561297a5761297a600080fd5b61298687828801611cbd565b94505060206129978782880161190f565b93505060406129a88782880161190f565b92505060606121fb87828801612932565b60a081016129c78288611957565b6129d46020830187611957565b6129e16040830186611d4a565b6129ee6060830185611d4a565b818103608083015261065a818461259e565b60ff8116611960565b6101008101612a18828b611957565b612a25602083018a611957565b612a326040830189611d4a565b612a3f6060830188611d4a565b612a4c60808301876120dc565b612a5960a0830186612a00565b612a6660c0830185611d4a565b61093a60e0830184611d4a565b60408101612a818285611957565b6109be6020830184611957565b80516118e481611909565b600060208284031215612aae57612aae600080fd5b6000611a908484612a8e565b60408101612a818285611d4a565b8183526000602084019350612ade838584611a1f565b601f19601f8401166125c8565b60a08101612af98289611957565b612b066020830188611957565b612b136040830187611d4a565b612b206060830186611d4a565b8181036080830152610910818486612ac8565b6000808335601e1936859003018112612b4e57612b4e600080fd5b8084019250823591506001600160401b03821115612b6e57612b6e600080fd5b602083019250600182023603831315612b8957612b89600080fd5b509250929050565b602080825281016109bb818486612ac8565b80516118e4816118ea565b600060208284031215612bc357612bc3600080fd5b6000611a908484612ba3565b634e487b7160e01b600052603260045260246000fd5b6000612bf2838584611a1f565b50500190565b6000611a90828486612be5565b6000612c13611a39846119f5565b905082815260208101848484011115612c2e57612c2e600080fd5b611a64848285612572565b600082601f830112612c4d57612c4d600080fd5b8151611a90848260208601612c05565b600060208284031215612c7257612c72600080fd5b81516001600160401b03811115612c8b57612c8b600080fd5b611a9084828501612c39565b602080825281016109be818461259e565b60e08101612cb6828a611957565b612cc36020830189611957565b612cd06040830188611d4a565b612cdd6060830187611d4a565b612cea6080830186612a00565b612cf760a0830185611d4a565b61091060c0830184611d4a565b600060208284031215612d1957612d19600080fd5b6000611a908484612014565b634e487b7160e01b600052601160045260246000fd5b600082821015612d4d57612d4d612d25565b500390565b60808082528101612d63818761259e565b9050612d726020830186611957565b612d7f6040830185611957565b8181036060830152610ea8818461259e565b600060408284031215612da657612da6600080fd5b612db060406119b6565b90506000612dbe8484612ba3565b8252506020612dcf84848301612a8e565b60208301525092915050565b600060408284031215612df057612df0600080fd5b6000611a908484612d91565b60008219821115612e0f57612e0f612d25565b500190565b60608101612e228286611957565b612e2f6020830185611957565b611a906040830184611d4a565b8015156118f3565b80516118e481612e3c565b600060208284031215612e6457612e64600080fd5b6000611a908484612e44565b60808082528101612e81818861259e565b9050612e906020830187611957565b612e9d6040830186611957565b818103606083015261065a818486612ac8565b6000612ebe611a39846119d2565b83815290506020810160408402830185811115612edd57612edd600080fd5b835b81811015611bab5780612ef28882612d91565b845250602090920191604001612edf565b600082601f830112612f1757612f17600080fd5b8151611a90848260208601612eb0565b600060208284031215612f3c57612f3c600080fd5b81516001600160401b03811115612f5557612f55600080fd5b611a9084828501612f03565b6000612f6b825190565b612f79818560208601612572565b9290920192915050565b60006109be8284612f61565b60408101612f9d8285611957565b6109be6020830184611d4a565b600060408284031215612fbf57612fbf600080fd5b612fc960406119b6565b90506000612fd784846118fe565b8252506020612dcf8484830161190f565b600060408284031215612ffd57612ffd600080fd5b6000611a908484612faa565b6080808252810161301b81888a612ac8565b905061302a6020830187611957565b6130376040830186611957565b8181036060830152610910818486612ac856fea264697066735822122021d6dea4e36ea46e8e3b1cdfed26aba18483ad533843a5be49c86ecbdef0e8d964736f6c634300080f00330000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b0000000000000000000000005300000000000000000000000000000000000004

Deployed Bytecode

0x60806040526004361061014b5760003560e01c80639dd41df2116100b6578063c4b3fc401161006f578063c4b3fc4014610395578063ced78795146103a8578063e84d494b146103bb578063f2428621146103ce578063f3995c6714610402578063fbfa77cf1461041557600080fd5b80639dd41df2146102e6578063a4a78f0c146102f9578063ac9650d81461030c578063ad271fa31461032c578063b956b3fb1461034c578063c2e3140a1461038257600080fd5b80636291027c116101085780636291027c1461024d578063688ee44c1461026d5780636cbe96fa146102805780636cc781cd146102a05780637d10c9d6146102b357806394ec6d78146102d357600080fd5b80632b4abadb146101505780632cc4081e14610186578063353766c6146101a65780634659a494146101d35780634f25b858146101e857806353c43f151461022d575b600080fd5b34801561015c57600080fd5b5061017061016b36600461191a565b610449565b60405161017d9190611966565b60405180910390f35b610199610194366004611ce1565b610481565b60405161017d9190611d74565b3480156101b257600080fd5b506101c66101c1366004611e89565b6104ca565b60405161017d9190611ffa565b6101e66101e136600461201f565b6105c3565b005b3480156101f457600080fd5b506102206102033660046120a9565b600060208181529281526040808220909352908152205460ff1681565b60405161017d91906120e4565b34801561023957600080fd5b506101996102483660046120f2565b610638565b34801561025957600080fd5b506101e66102683660046121a3565b610665565b6101e661027b366004612207565b61075b565b61029361028e3660046122d4565b6107e6565b60405161017d91906123ba565b6101e66102ae366004612207565b610807565b3480156102bf57600080fd5b506101996102ce3660046123e3565b610876565b6102936102e13660046122d4565b61091c565b6101706102f43660046124d0565b610947565b6101e661030736600461201f565b6109c5565b61031f61031a36600461252b565b610a54565b60405161017d9190612644565b34801561033857600080fd5b506101c6610347366004612655565b610ba9565b34801561035857600080fd5b506102936103673660046126fe565b6001600160a01b031660009081526001602052604090205490565b6101e661039036600461201f565b610c22565b6102936103a3366004612830565b610ca7565b6102936103b6366004612830565b610db4565b6101996103c9366004612947565b610dd3565b3480156103da57600080fd5b506101707f000000000000000000000000530000000000000000000000000000000000000481565b6101e661041036600461201f565b610eb2565b34801561042157600080fd5b506101707f0000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b81565b6001602052816000526040600020818154811061046557600080fd5b6000918252602090912001546001600160a01b03169150829050565b604080518082019091526000808252602082015281804211156104b757604051630407b05b60e31b815260040160405180910390fd5b6104c18585610eea565b95945050505050565b805160208201516040808401519051630b00663360e21b81526060936001600160a01b038f1693632c0198cc9361050b9333933093909290916004016129b9565b600060405180830381600087803b15801561052557600080fd5b505af1158015610539573d6000803e3d6000fd5b505050506105b48b8b8b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d9182918501908490808284376000920191909152508c92508b91508a9050611176565b9b9a5050505050505050505050565b6040516323f2ebc360e21b81526001600160a01b03871690638fcbaf0c906105fe90339030908a908a906001908b908b908b90600401612a09565b600060405180830381600087803b15801561061857600080fd5b505af115801561062c573d6000803e3d6000fd5b50505050505050505050565b604080518082019091526000808252602082015261065a8787878787876112e4565b979650505050505050565b61067183333085611405565b604051636eb1769f60e11b815282906001600160a01b0385169063dd62ed3e906106a19030908990600401612a73565b602060405180830381865afa1580156106be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e29190612a99565b10156106f5576106f583856000196114f3565b604051637acb775760e01b81526001600160a01b03851690637acb7757906107239085908590600401612aba565b600060405180830381600087803b15801561073d57600080fd5b505af1158015610751573d6000803e3d6000fd5b5050505050505050565b604051636eb1769f60e11b815284906001600160a01b0387169063dd62ed3e9061078b9033903090600401612a73565b602060405180830381865afa1580156107a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cc9190612a99565b10156107df576107df8585858585610807565b5050505050565b60006107f98a8a8a8a8a8a8a8a8a6115df565b9a9950505050505050505050565b604051630b00663360e21b81526001600160a01b03861690632c0198cc9061083d90339030908990899089908990600401612aeb565b600060405180830381600087803b15801561085757600080fd5b505af115801561086b573d6000803e3d6000fd5b505050505050505050565b60408051808201909152600080825260208201526001600160a01b038816632c0198cc3330853560208701356108af6040890189612b33565b6040518763ffffffff1660e01b81526004016108d096959493929190612aeb565b600060405180830381600087803b1580156108ea57600080fd5b505af11580156108fe573d6000803e3d6000fd5b505050506109108888888888886112e4565b98975050505050505050565b600061092f8a8a8a8a8a8a8a8a8a6115df565b905061093a8a6116f4565b9998505050505050505050565b6040516313b8683f60e01b81526000906001600160a01b038516906313b8683f906109789086908690600401612b91565b6020604051808303816000875af1158015610997573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109bb9190612bae565b90505b9392505050565b604051636eb1769f60e11b8152600019906001600160a01b0388169063dd62ed3e906109f79033903090600401612a73565b602060405180830381865afa158015610a14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a389190612a99565b1015610a4c57610a4c8686868686866105c3565b505050505050565b6060816001600160401b03811115610a6e57610a6e611974565b604051908082528060200260200182016040528015610aa157816020015b6060815260200190600190039081610a8c5790505b50905060005b82811015610ba25760008030868685818110610ac557610ac5612bcf565b9050602002810190610ad79190612b33565b604051610ae5929190612bf8565b600060405180830381855af49150503d8060008114610b20576040519150601f19603f3d011682016040523d82523d6000602084013e610b25565b606091505b509150915081610b7a57604481511015610b3e57600080fd5b60048101905080806020019051810190610b589190612c5d565b60405162461bcd60e51b8152600401610b719190612c97565b60405180910390fd5b80848481518110610b8d57610b8d612bcf565b60209081029190910101525050600101610aa7565b5092915050565b60606107f98a8a8a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b92508a9150899050611176565b604051636eb1769f60e11b815285906001600160a01b0388169063dd62ed3e90610c529033903090600401612a73565b602060405180830381865afa158015610c6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c939190612a99565b1015610a4c57610a4c868686868686610eb2565b80516040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905290919060005b82811015610d9157848181518110610cfa57610cfa612bcf565b6020026020010151915081600001516001600160a01b031663d505accf333085602001518660400151876060015188608001518960a001516040518863ffffffff1660e01b8152600401610d549796959493929190612ca8565b600060405180830381600087803b158015610d6e57600080fd5b505af1158015610d82573d6000803e3d6000fd5b50505050806001019050610ce0565b50610da38d8d8d8d8d8d8d8d8d6115df565b9d9c50505050505050505050505050565b6000610dc88b8b8b8b8b8b8b8b8b8b610ca7565b90506107f98b6116f4565b60408051808201909152600080825260208201528280421115610e0957604051630407b05b60e31b815260040160405180910390fd5b610e1660208401846126fe565b6001600160a01b031663d505accf333060208701356040880135610e4060808a0160608b01612d04565b89608001358a60a001356040518863ffffffff1660e01b8152600401610e6c9796959493929190612ca8565b600060405180830381600087803b158015610e8657600080fd5b505af1158015610e9a573d6000803e3d6000fd5b50505050610ea88686610eea565b9695505050505050565b60405163d505accf60e01b81526001600160a01b0387169063d505accf906105fe90339030908a908a908a908a908a90600401612ca8565b604080518082019091526000808252602082015282516040805160608082018352808252600060208084018290528385018290528451608081018652828152808201849052808601839052808401939093528451808601909552818552840152909160008060005b8681101561114457898181518110610f6c57610f6c612bcf565b602002602001015195508560000151600081518110610f8d57610f8d612bcf565b60200260200101519450610fae866020015186600001518860400151611773565b8551519250600091505b8282101561113c57610fcb600184612d3b565b82036110855784600001516001600160a01b0316637132bb7f866020015133886040015189606001516040518563ffffffff1660e01b81526004016110139493929190612d52565b60408051808303816000875af1158015611031573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110559190612ddb565b80516001600160a01b03168952602080820151908a018051929650909161107d908390612dfc565b90525061113c565b84600001516001600160a01b0316637132bb7f866020015133886040015189606001516040518563ffffffff1660e01b81526004016110c79493929190612d52565b60408051808303816000875af11580156110e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111099190612ddb565b508551611117836001612dfc565b8151811061112757611127612bcf565b60200260200101519450816001019150610fb8565b600101610f52565b50878760200151101561116a5760405163c9f52c7160e01b815260040160405180910390fd5b50505050505092915050565b6040516323b872dd60e01b81526060906001600160a01b038916906323b872dd906111a99033908c908c90600401612e14565b6020604051808303816000875af11580156111c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ec9190612e4f565b5060405163f66eab5b60e01b81526001600160a01b0389169063f66eab5b906112219089903390899089908990600401612e70565b6000604051808303816000875af1158015611240573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112689190810190612f27565b805190915060005b818110156112d75786818151811061128a5761128a612bcf565b60200260200101518382815181106112a4576112a4612bcf565b60200260200101516020015110156112cf5760405163c9f52c7160e01b815260040160405180910390fd5b600101611270565b5050979650505050505050565b6040805180820182526000808252602082015290516323b872dd60e01b81526001600160a01b038816906323b872dd906113269033908b908b90600401612e14565b6020604051808303816000875af1158015611345573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113699190612e4f565b506040516313d85e7560e11b81526001600160a01b038816906327b0bcea9061139c908890339088908890600401612d52565b60408051808303816000875af11580156113ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113de9190612ddb565b90508381602001511015610ea85760405163c9f52c7160e01b815260040160405180910390fd5b600080856001600160a01b03166323b872dd86868660405160240161142c93929190612e14565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516114659190612f83565b6000604051808303816000865af19150503d80600081146114a2576040519150601f19603f3d011682016040523d82523d6000602084013e6114a7565b606091505b50915091508115806114d557508051158015906114d55750808060200190518101906114d39190612e4f565b155b15610a4c57604051631e4e7d0960e21b815260040160405180910390fd5b600080846001600160a01b031663095ea7b38585604051602401611518929190612f8f565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516115519190612f83565b6000604051808303816000865af19150503d806000811461158e576040519150601f19603f3d011682016040523d82523d6000602084013e611593565b606091505b50915091508115806115c157508051158015906115c15750808060200190518101906115bf9190612e4f565b155b156107df57604051633e3f8f7360e01b815260040160405180910390fd5b6040805180820190915260008082526020820181905290889060005b82811015611648578b8b8281811061161557611615612bcf565b90506040020180360381019061162b9190612fe8565b915061164082600001518e8460200151611773565b6001016115fb565b506040516301f3943560e11b81526001600160a01b038d16906303e7286a9061167f908c908c9033908c908c908c90600401613009565b6020604051808303816000875af115801561169e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c29190612a99565b9250868310156116e55760405163124ca15f60e11b815260040160405180910390fd5b50509998505050505050505050565b6001600160a01b03811660009081526020818152604080832033845290915290205460ff16611770576001600160a01b0381166000818152602081815260408083203384528252808320805460ff1916600190811790915580835290832080549182018155835291200180546001600160a01b03191690911790555b50565b6001600160a01b03831661181a57604051631f2c13e160e31b81526001600160a01b037f0000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b169063f9609f089083906117d19087908790600401612a73565b60206040518083038185885af11580156117ef573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906118149190612a99565b50505050565b61184683337f0000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b84611405565b604051631f2c13e160e31b81526001600160a01b037f0000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b169063f9609f08906118949086908690600401612a73565b6020604051808303816000875af11580156118b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118149190612a99565b60006001600160a01b0382165b92915050565b6118f3816118d7565b811461177057600080fd5b80356118e4816118ea565b806118f3565b80356118e481611909565b6000806040838503121561193057611930600080fd5b600061193c85856118fe565b925050602061194d8582860161190f565b9150509250929050565b611960816118d7565b82525050565b602081016118e48284611957565b634e487b7160e01b600052604160045260246000fd5b601f19601f83011681018181106001600160401b03821117156119af576119af611974565b6040525050565b60006119c160405190565b90506119cd828261198a565b919050565b60006001600160401b038211156119eb576119eb611974565b5060209081020190565b60006001600160401b03821115611a0e57611a0e611974565b601f19601f83011660200192915050565b82818337506000910152565b6000611a3e611a39846119f5565b6119b6565b905082815260208101848484011115611a5957611a59600080fd5b611a64848285611a1f565b509392505050565b600082601f830112611a8057611a80600080fd5b8135611a90848260208601611a2b565b949350505050565b600060808284031215611aad57611aad600080fd5b611ab760806119b6565b90506000611ac584846118fe565b82525060208201356001600160401b03811115611ae457611ae4600080fd5b611af084828501611a6c565b6020830152506040611b04848285016118fe565b60408301525060608201356001600160401b03811115611b2657611b26600080fd5b611b3284828501611a6c565b60608301525092915050565b6000611b4c611a39846119d2565b83815290506020808201908402830185811115611b6b57611b6b600080fd5b835b81811015611bab5780356001600160401b03811115611b8e57611b8e600080fd5b808601611b9b8982611a98565b8552505060209283019201611b6d565b5050509392505050565b600082601f830112611bc957611bc9600080fd5b8135611a90848260208601611b3e565b600060608284031215611bee57611bee600080fd5b611bf860606119b6565b905081356001600160401b03811115611c1357611c13600080fd5b611c1f84828501611bb5565b8252506020611c30848483016118fe565b6020830152506040611c448482850161190f565b60408301525092915050565b6000611c5e611a39846119d2565b83815290506020808201908402830185811115611c7d57611c7d600080fd5b835b81811015611bab5780356001600160401b03811115611ca057611ca0600080fd5b808601611cad8982611bd9565b8552505060209283019201611c7f565b600082601f830112611cd157611cd1600080fd5b8135611a90848260208601611c50565b600080600060608486031215611cf957611cf9600080fd5b83356001600160401b03811115611d1257611d12600080fd5b611d1e86828701611cbd565b9350506020611d2f8682870161190f565b9250506040611d408682870161190f565b9150509250925092565b80611960565b80516040830190611d618482611957565b5060208201516118146020850182611d4a565b604081016118e48284611d50565b60008083601f840112611d9757611d97600080fd5b5081356001600160401b03811115611db157611db1600080fd5b602083019150836001820283011115611dcc57611dcc600080fd5b9250929050565b60008083601f840112611de857611de8600080fd5b5081356001600160401b03811115611e0257611e02600080fd5b602083019150836020820283011115611dcc57611dcc600080fd5b600060608284031215611e3257611e32600080fd5b611e3c60606119b6565b90506000611e4a848461190f565b8252506020611e5b8484830161190f565b60208301525060408201356001600160401b03811115611e7d57611e7d600080fd5b611c4484828501611a6c565b60008060008060008060008060008060e08b8d031215611eab57611eab600080fd5b6000611eb78d8d6118fe565b9a50506020611ec88d828e0161190f565b99505060408b01356001600160401b03811115611ee757611ee7600080fd5b611ef38d828e01611d82565b985098505060608b01356001600160401b03811115611f1457611f14600080fd5b611f208d828e01611dd3565b96509650506080611f338d828e016118fe565b94505060a08b01356001600160401b03811115611f5257611f52600080fd5b611f5e8d828e01611d82565b935093505060c08b01356001600160401b03811115611f7f57611f7f600080fd5b611f8b8d828e01611e1d565b9150509295989b9194979a5092959850565b6000611fa98383611d50565b505060400190565b6000611fbb825190565b80845260209384019383018060005b83811015611fef578151611fde8882611f9d565b975060208301925050600101611fca565b509495945050505050565b602080825281016109be8184611fb1565b60ff81166118f3565b80356118e48161200b565b60008060008060008060c0878903121561203b5761203b600080fd5b600061204789896118fe565b965050602061205889828a0161190f565b955050604061206989828a0161190f565b945050606061207a89828a01612014565b935050608061208b89828a0161190f565b92505060a061209c89828a0161190f565b9150509295509295509295565b600080604083850312156120bf576120bf600080fd5b60006120cb85856118fe565b925050602061194d858286016118fe565b801515611960565b602081016118e482846120dc565b60008060008060008060c0878903121561210e5761210e600080fd5b600061211a89896118fe565b965050602061212b89828a0161190f565b95505060408701356001600160401b0381111561214a5761214a600080fd5b61215689828a01611a6c565b945050606061216789828a0161190f565b935050608061217889828a016118fe565b92505060a08701356001600160401b0381111561219757612197600080fd5b61209c89828a01611a6c565b600080600080608085870312156121bc576121bc600080fd5b60006121c887876118fe565b94505060206121d9878288016118fe565b93505060406121ea8782880161190f565b92505060606121fb878288016118fe565b91505092959194509250565b60008060008060006080868803121561222257612222600080fd5b600061222e88886118fe565b955050602061223f8882890161190f565b94505060406122508882890161190f565b93505060608601356001600160401b0381111561226f5761226f600080fd5b61227b88828901611d82565b92509250509295509295909350565b60008083601f84011261229f5761229f600080fd5b5081356001600160401b038111156122b9576122b9600080fd5b602083019150836040820283011115611dcc57611dcc600080fd5b600080600080600080600080600060c08a8c0312156122f5576122f5600080fd5b60006123018c8c6118fe565b99505060208a01356001600160401b0381111561232057612320600080fd5b61232c8c828d0161228a565b985098505060408a01356001600160401b0381111561234d5761234d600080fd5b6123598c828d01611d82565b9650965050606061236c8c828d0161190f565b945050608061237d8c828d016118fe565b93505060a08a01356001600160401b0381111561239c5761239c600080fd5b6123a88c828d01611d82565b92509250509295985092959850929598565b602081016118e48284611d4a565b6000606082840312156123dd576123dd600080fd5b50919050565b600080600080600080600060e0888a03121561240157612401600080fd5b600061240d8a8a6118fe565b975050602061241e8a828b0161190f565b96505060408801356001600160401b0381111561243d5761243d600080fd5b6124498a828b01611a6c565b955050606061245a8a828b0161190f565b945050608061246b8a828b016118fe565b93505060a08801356001600160401b0381111561248a5761248a600080fd5b6124968a828b01611a6c565b92505060c08801356001600160401b038111156124b5576124b5600080fd5b6124c18a828b016123c8565b91505092959891949750929550565b6000806000604084860312156124e8576124e8600080fd5b60006124f486866118fe565b93505060208401356001600160401b0381111561251357612513600080fd5b61251f86828701611d82565b92509250509250925092565b6000806020838503121561254157612541600080fd5b82356001600160401b0381111561255a5761255a600080fd5b61256685828601611dd3565b92509250509250929050565b60005b8381101561258d578181015183820152602001612575565b838111156118145750506000910152565b60006125a8825190565b8084526020840193506125bf818560208601612572565b601f19601f8201165b9093019392505050565b60006109be838361259e565b60006125e8825190565b808452602084019350836020820285016126028560200190565b8060005b85811015612637578484038952815161261f85826125d2565b94506020830160209a909a0199925050600101612606565b5091979650505050505050565b602080825281016109be81846125de565b600080600080600080600080600060c08a8c03121561267657612676600080fd5b60006126828c8c6118fe565b99505060206126938c828d0161190f565b98505060408a01356001600160401b038111156126b2576126b2600080fd5b6126be8c828d01611d82565b975097505060608a01356001600160401b038111156126df576126df600080fd5b6126eb8c828d01611dd3565b9550955050608061237d8c828d016118fe565b60006020828403121561271357612713600080fd5b6000611a9084846118fe565b600060c0828403121561273457612734600080fd5b61273e60c06119b6565b9050600061274c84846118fe565b825250602061275d8484830161190f565b60208301525060406127718482850161190f565b604083015250606061278584828501612014565b60608301525060806127998482850161190f565b60808301525060a06127ad8482850161190f565b60a08301525092915050565b60006127c7611a39846119d2565b83815290506020810160c084028301858111156127e6576127e6600080fd5b835b81811015611bab57806127fb888261271f565b84525060209092019160c0016127e8565b600082601f83011261282057612820600080fd5b8135611a908482602086016127b9565b60008060008060008060008060008060e08b8d03121561285257612852600080fd5b600061285e8d8d6118fe565b9a505060208b01356001600160401b0381111561287d5761287d600080fd5b6128898d828e0161228a565b995099505060408b01356001600160401b038111156128aa576128aa600080fd5b6128b68d828e01611d82565b975097505060606128c98d828e0161190f565b95505060806128da8d828e016118fe565b94505060a08b01356001600160401b038111156128f9576128f9600080fd5b6129058d828e01611d82565b935093505060c08b01356001600160401b0381111561292657612926600080fd5b611f8b8d828e0161280c565b600060c082840312156123dd576123dd600080fd5b600080600080610120858703121561296157612961600080fd5b84356001600160401b0381111561297a5761297a600080fd5b61298687828801611cbd565b94505060206129978782880161190f565b93505060406129a88782880161190f565b92505060606121fb87828801612932565b60a081016129c78288611957565b6129d46020830187611957565b6129e16040830186611d4a565b6129ee6060830185611d4a565b818103608083015261065a818461259e565b60ff8116611960565b6101008101612a18828b611957565b612a25602083018a611957565b612a326040830189611d4a565b612a3f6060830188611d4a565b612a4c60808301876120dc565b612a5960a0830186612a00565b612a6660c0830185611d4a565b61093a60e0830184611d4a565b60408101612a818285611957565b6109be6020830184611957565b80516118e481611909565b600060208284031215612aae57612aae600080fd5b6000611a908484612a8e565b60408101612a818285611d4a565b8183526000602084019350612ade838584611a1f565b601f19601f8401166125c8565b60a08101612af98289611957565b612b066020830188611957565b612b136040830187611d4a565b612b206060830186611d4a565b8181036080830152610910818486612ac8565b6000808335601e1936859003018112612b4e57612b4e600080fd5b8084019250823591506001600160401b03821115612b6e57612b6e600080fd5b602083019250600182023603831315612b8957612b89600080fd5b509250929050565b602080825281016109bb818486612ac8565b80516118e4816118ea565b600060208284031215612bc357612bc3600080fd5b6000611a908484612ba3565b634e487b7160e01b600052603260045260246000fd5b6000612bf2838584611a1f565b50500190565b6000611a90828486612be5565b6000612c13611a39846119f5565b905082815260208101848484011115612c2e57612c2e600080fd5b611a64848285612572565b600082601f830112612c4d57612c4d600080fd5b8151611a90848260208601612c05565b600060208284031215612c7257612c72600080fd5b81516001600160401b03811115612c8b57612c8b600080fd5b611a9084828501612c39565b602080825281016109be818461259e565b60e08101612cb6828a611957565b612cc36020830189611957565b612cd06040830188611d4a565b612cdd6060830187611d4a565b612cea6080830186612a00565b612cf760a0830185611d4a565b61091060c0830184611d4a565b600060208284031215612d1957612d19600080fd5b6000611a908484612014565b634e487b7160e01b600052601160045260246000fd5b600082821015612d4d57612d4d612d25565b500390565b60808082528101612d63818761259e565b9050612d726020830186611957565b612d7f6040830185611957565b8181036060830152610ea8818461259e565b600060408284031215612da657612da6600080fd5b612db060406119b6565b90506000612dbe8484612ba3565b8252506020612dcf84848301612a8e565b60208301525092915050565b600060408284031215612df057612df0600080fd5b6000611a908484612d91565b60008219821115612e0f57612e0f612d25565b500190565b60608101612e228286611957565b612e2f6020830185611957565b611a906040830184611d4a565b8015156118f3565b80516118e481612e3c565b600060208284031215612e6457612e64600080fd5b6000611a908484612e44565b60808082528101612e81818861259e565b9050612e906020830187611957565b612e9d6040830186611957565b818103606083015261065a818486612ac8565b6000612ebe611a39846119d2565b83815290506020810160408402830185811115612edd57612edd600080fd5b835b81811015611bab5780612ef28882612d91565b845250602090920191604001612edf565b600082601f830112612f1757612f17600080fd5b8151611a90848260208601612eb0565b600060208284031215612f3c57612f3c600080fd5b81516001600160401b03811115612f5557612f55600080fd5b611a9084828501612f03565b6000612f6b825190565b612f79818560208601612572565b9290920192915050565b60006109be8284612f61565b60408101612f9d8285611957565b6109be6020830184611d4a565b600060408284031215612fbf57612fbf600080fd5b612fc960406119b6565b90506000612fd784846118fe565b8252506020612dcf8484830161190f565b600060408284031215612ffd57612ffd600080fd5b6000611a908484612faa565b6080808252810161301b81888a612ac8565b905061302a6020830187611957565b6130376040830186611957565b8181036060830152610910818486612ac856fea264697066735822122021d6dea4e36ea46e8e3b1cdfed26aba18483ad533843a5be49c86ecbdef0e8d964736f6c634300080f0033

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

0000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b0000000000000000000000005300000000000000000000000000000000000004

-----Decoded View---------------
Arg [0] : _vault (address): 0x7160570BB153Edd0Ea1775EC2b2Ac9b65F1aB61B
Arg [1] : _wETH (address): 0x5300000000000000000000000000000000000004

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000007160570bb153edd0ea1775ec2b2ac9b65f1ab61b
Arg [1] : 0000000000000000000000005300000000000000000000000000000000000004


Block Transaction Gas Used Reward
view all blocks sequenced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
0x80e38291e06339d10AAB483C65695D004dBD5C69
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.