ETH Price: $3,879.96 (-1.06%)
Gas: 21.9 Gwei

Contract

0x1112dbCF805682e828606f74AB717abf4b4FD8DE
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Deposit To Vault189873692024-01-12 0:53:35329 days ago1705020815IN
Yearn: 4626 Router
0 ETH0.0020759919.23640344
Deposit To Vault189862432024-01-11 21:05:47329 days ago1705007147IN
Yearn: 4626 Router
0 ETH0.0023754622.00363569
Approve189805012024-01-11 1:44:59330 days ago1704937499IN
Yearn: 4626 Router
0 ETH0.0017476234.90288435

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Yearn4626Router

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-08-08
*/

// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity 0.8.18;

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

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

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

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

    string public name;

    string public symbol;

    uint8 public immutable decimals;

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

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

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

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

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

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

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

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

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

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

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

        return true;
    }

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

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

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

        return true;
    }

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

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

        balanceOf[from] -= amount;

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

        emit Transfer(from, to, amount);

        return true;
    }

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

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

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

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

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

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

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

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

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

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

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

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

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

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

/// @title ERC4626 interface
/// See: https://eips.ethereum.org/EIPS/eip-4626
abstract contract IERC4626 is ERC20 {
    /*////////////////////////////////////////////////////////
                      Events
    ////////////////////////////////////////////////////////*/

    /// @notice `sender` has exchanged `assets` for `shares`,
    /// and transferred those `shares` to `receiver`.
    event Deposit(address indexed sender, address indexed receiver, uint256 assets, uint256 shares);

    /// @notice `sender` has exchanged `shares` for `assets`,
    /// and transferred those `assets` to `receiver`.
    event Withdraw(address indexed sender, address indexed receiver, uint256 assets, uint256 shares);

    /*////////////////////////////////////////////////////////
                      Vault properties
    ////////////////////////////////////////////////////////*/

    /// @notice The address of the underlying ERC20 token used for
    /// the Vault for accounting, depositing, and withdrawing.
    function asset() external view virtual returns (address asset);

    /// @notice Total amount of the underlying asset that
    /// is "managed" by Vault.
    function totalAssets() external view virtual returns (uint256 totalAssets);

    /*////////////////////////////////////////////////////////
                      Deposit/Withdrawal Logic
    ////////////////////////////////////////////////////////*/

    /// @notice Mints `shares` Vault shares to `receiver` by
    /// depositing exactly `assets` of underlying tokens.
    function deposit(uint256 assets, address receiver) external virtual returns (uint256 shares);

    /// @notice Mints exactly `shares` Vault shares to `receiver`
    /// by depositing `assets` of underlying tokens.
    function mint(uint256 shares, address receiver) external virtual returns (uint256 assets);

    /// @notice Redeems `shares` from `owner` and sends `assets`
    /// of underlying tokens to `receiver`.
    function withdraw(
        uint256 assets,
        address receiver,
        address owner
    ) external virtual returns (uint256 shares);

    /// @notice Redeems `shares` from `owner` and sends `assets`
    /// of underlying tokens to `receiver`.
    function redeem(
        uint256 shares,
        address receiver,
        address owner
    ) external virtual returns (uint256 assets);

    /*////////////////////////////////////////////////////////
                      Vault Accounting Logic
    ////////////////////////////////////////////////////////*/

    /// @notice The amount of shares that the vault would
    /// exchange for the amount of assets provided, in an
    /// ideal scenario where all the conditions are met.
    function convertToShares(uint256 assets) external view virtual returns (uint256 shares);

    /// @notice The amount of assets that the vault would
    /// exchange for the amount of shares provided, in an
    /// ideal scenario where all the conditions are met.
    function convertToAssets(uint256 shares) external view virtual returns (uint256 assets);

    /// @notice Total number of underlying assets that can
    /// be deposited by `owner` into the Vault, where `owner`
    /// corresponds to the input parameter `receiver` of a
    /// `deposit` call.
    function maxDeposit(address owner) external view virtual returns (uint256 maxAssets);

    /// @notice Allows an on-chain or off-chain user to simulate
    /// the effects of their deposit at the current block, given
    /// current on-chain conditions.
    function previewDeposit(uint256 assets) external view virtual returns (uint256 shares);

    /// @notice Total number of underlying shares that can be minted
    /// for `owner`, where `owner` corresponds to the input
    /// parameter `receiver` of a `mint` call.
    function maxMint(address owner) external view virtual returns (uint256 maxShares);

    /// @notice Allows an on-chain or off-chain user to simulate
    /// the effects of their mint at the current block, given
    /// current on-chain conditions.
    function previewMint(uint256 shares) external view virtual returns (uint256 assets);

    /// @notice Total number of underlying assets that can be
    /// withdrawn from the Vault by `owner`, where `owner`
    /// corresponds to the input parameter of a `withdraw` call.
    function maxWithdraw(address owner) external view virtual returns (uint256 maxAssets);

    /// @notice Allows an on-chain or off-chain user to simulate
    /// the effects of their withdrawal at the current block,
    /// given current on-chain conditions.
    function previewWithdraw(uint256 assets) external view virtual returns (uint256 shares);

    /// @notice Total number of underlying shares that can be
    /// redeemed from the Vault by `owner`, where `owner` corresponds
    /// to the input parameter of a `redeem` call.
    function maxRedeem(address owner) external view virtual returns (uint256 maxShares);

    /// @notice Allows an on-chain or off-chain user to simulate
    /// the effects of their redeemption at the current block,
    /// given current on-chain conditions.
    function previewRedeem(uint256 shares) external view virtual returns (uint256 assets);
}

/// @title Yearn V3 ERC4626 interface
/// @notice Extends the normal 4626 standard with some added Yearn specific functionality
abstract contract IYearn4626 is IERC4626 {
    /*////////////////////////////////////////////////////////
                    Yearn Specific Functions
    ////////////////////////////////////////////////////////*/

    function withdraw(
        uint256 assets,
        address receiver,
        address owner,
        uint256 maxLoss
    ) external virtual returns (uint256 shares);

    /// @notice Yearn Specific "withdraw" with withdrawal stack included
    function withdraw(
        uint256 assets,
        address receiver,
        address owner,
        uint256 maxLoss,
        address[] memory strategies
    ) external virtual returns (uint256 shares);

    function redeem(
        uint256 shares,
        address receiver,
        address owner,
        uint256 maxLoss
    ) external virtual returns (uint256 assets);

    /// @notice Yearn Specific "redeem" with withdrawal stack included
    function redeem(
        uint256 shares,
        address receiver,
        address owner,
        uint256 maxLoss,
        address[] memory strategies
    ) external virtual returns (uint256 assets);
}

/** 
 @title ERC4626Router Base Interface
 @notice A canonical router between ERC4626 Vaults https://eips.ethereum.org/EIPS/eip-4626

 The base router is a multicall style router inspired by Uniswap v3 with built-in features for permit, WETH9 wrap/unwrap, and ERC20 token pulling/sweeping/approving.
 It includes methods for the four mutable ERC4626 functions deposit/mint/withdraw/redeem as well.

 These can all be arbitrarily composed using the multicall functionality of the router.

 NOTE the router is capable of pulling any approved token from your wallet. This is only possible when your address is msg.sender, but regardless be careful when interacting with the router or ERC4626 Vaults.
 The router makes no special considerations for unique ERC20 implementations such as fee on transfer. 
 There are no built in protections for unexpected behavior beyond enforcing the minSharesOut is received.
 */
interface IYearn4626RouterBase {
    /*//////////////////////////////////////////////////////////////
                                MINT
    //////////////////////////////////////////////////////////////*/

    /** 
     @notice mint `shares` from an ERC4626 vault.
     @param vault The ERC4626 vault to mint shares from.
     @param shares The amount of shares to mint from `vault`.
     @param to The destination of ownership shares.
     @param maxAmountIn The max amount of assets used to mint.
     @return amountIn the amount of assets used to mint by `to`.
     @dev throws "!maxAmount" Error   
    */
    function mint(
        IYearn4626 vault,
        uint256 shares,
        address to,
        uint256 maxAmountIn
    ) external payable returns (uint256 amountIn);

    /*//////////////////////////////////////////////////////////////
                                DEPOSIT
    //////////////////////////////////////////////////////////////*/

    /** 
     @notice deposit `amount` to an ERC4626 vault.
     @param vault The ERC4626 vault to deposit assets to.
     @param amount The amount of assets to deposit to `vault`.
     @param to The destination of ownership shares.
     @param minSharesOut The min amount of `vault` shares received by `to`.
     @return sharesOut the amount of shares received by `to`.
     @dev throws "!minShares" Error   
    */
    function deposit(
        IYearn4626 vault,
        uint256 amount,
        address to,
        uint256 minSharesOut
    ) external payable returns (uint256 sharesOut);

    /*//////////////////////////////////////////////////////////////
                                WITHDRAW
    //////////////////////////////////////////////////////////////*/

    /** 
     @notice withdraw `amount` from an ERC4626 vault.
     @dev Uses the Yearn specific 'maxLoss' accounting.
     @param vault The ERC4626 vault to redeem shares from.
     @param vault The ERC4626 vault to withdraw assets from.
     @param amount The amount of assets to withdraw from vault.
     @param to The destination of assets.
     @param maxLoss The acceptable loss in Basis Points.
     @return sharesOut the amount of shares received by `to`.
     @dev throws "to much loss" Error   
    */
    function withdraw(
        IYearn4626 vault,
        uint256 amount,
        address to,
        uint256 maxLoss
    ) external payable returns (uint256);

    /** 
     @notice withdraw `amount` from an ERC4626 vault.
     @dev Uses the default 4626 syntax, throws !maxShares" Error.
     @param vault The ERC4626 vault to withdraw assets from.
     @param amount The amount of assets to withdraw from vault.
     @param to The destination of assets.
     @param minSharesOut The min amount of shares received by `to`.
     @return sharesOut the amount of shares received by `to`. 
    */
    function withdrawDefault(
        IYearn4626 vault,
        uint256 amount,
        address to,
        uint256 minSharesOut
    ) external payable returns (uint256 sharesOut);

    /*//////////////////////////////////////////////////////////////
                                REDEEM
    //////////////////////////////////////////////////////////////*/

    /** 
     @notice redeem `shares` shares from an ERC4626 vault.
     @dev Uses the Yearn specific 'maxLoss' accounting.
     @param vault The ERC4626 vault to redeem shares from.
     @param shares The amount of shares to redeem from vault.
     @param to The destination of assets.
     @param maxLoss The acceptable loss in Basis Points.
     @return amountOut the amount of assets received by `to`.
     @dev throws "to much loss" Error   
    */
    function redeem(
        IYearn4626 vault,
        uint256 shares,
        address to,
        uint256 maxLoss
    ) external payable returns (uint256);

    /** 
     @notice redeem `shares` shares from an ERC4626 vault.
     @dev Uses the default 4626 syntax, throws "!minAmount" Error.
     @param vault The ERC4626 vault to redeem shares from.
     @param shares The amount of shares to redeem from vault.
     @param to The destination of assets.
     @param minAmountOut The min amount of assets received by `to`.
     @return amountOut the amount of assets received by `to`.
    */
    function redeemDefault(
        IYearn4626 vault,
        uint256 shares,
        address to,
        uint256 minAmountOut
    ) external payable returns (uint256 amountOut);
}

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

    /*//////////////////////////////////////////////////////////////
                             ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

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

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

        require(success, "ETH_TRANSFER_FAILED");
    }

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

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

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

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

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

        require(success, "TRANSFER_FROM_FAILED");
    }

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

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

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

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

        require(success, "TRANSFER_FAILED");
    }

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

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

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

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

        require(success, "APPROVE_FAILED");
    }
}

// forked from https://github.com/Uniswap/v3-periphery/blob/main/contracts/interfaces/ISelfPermit.sol

/// @title Self Permit
/// @notice Functionality to call permit on any EIP-2612-compliant token for use in the route
interface ISelfPermit {
    /// @notice Permits this contract to spend a given token from `msg.sender`
    /// @dev The `owner` is always msg.sender and the `spender` is always address(this).
    /// @param token The address of the token spent
    /// @param value The amount that can be spent of token
    /// @param deadline A timestamp, the current blocktime must be less than or equal to this timestamp
    /// @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 selfPermit(
        address token,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external payable;

    /// @notice Permits this contract to spend a given token from `msg.sender`
    /// @dev The `owner` is always msg.sender and the `spender` is always address(this).
    /// Can be used instead of #selfPermit to prevent calls from failing due to a frontrun of a call to #selfPermit
    /// @param token The address of the token spent
    /// @param value The amount that can be spent of token
    /// @param deadline A timestamp, the current blocktime must be less than or equal to this timestamp
    /// @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 selfPermitIfNecessary(
        address token,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external payable;

    /// @notice Permits this contract to spend the sender's tokens for permit signatures that have the `allowed` parameter
    /// @dev The `owner` is always msg.sender and the `spender` is always address(this)
    /// @param token The address of the token spent
    /// @param nonce The current nonce of the owner
    /// @param expiry The timestamp at which the permit is no longer valid
    /// @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 selfPermitAllowed(
        address token,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external payable;

    /// @notice Permits this contract to spend the sender's tokens for permit signatures that have the `allowed` parameter
    /// @dev The `owner` is always msg.sender and the `spender` is always address(this)
    /// Can be used instead of #selfPermitAllowed to prevent calls from failing due to a frontrun of a call to #selfPermitAllowed.
    /// @param token The address of the token spent
    /// @param nonce The current nonce of the owner
    /// @param expiry The timestamp at which the permit is no longer valid
    /// @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 selfPermitAllowedIfNecessary(
        address token,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external payable;
}

// forked from https://github.com/Uniswap/v3-periphery/blob/main/contracts/interfaces/external/IERC20PermitAllowed.sol

/// @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;
}

/// @title Self Permit
/// @notice Functionality to call permit on any EIP-2612-compliant token for use in the route
/// @dev These functions are expected to be embedded in multicalls to allow EOAs to approve a contract and call a function
/// that requires an approval in a single transaction.
abstract contract SelfPermit is ISelfPermit {
    /// @inheritdoc ISelfPermit
    function selfPermit(
        address token,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public payable override {
        ERC20(token).permit(msg.sender, address(this), value, deadline, v, r, s);
    }

    /// @inheritdoc ISelfPermit
    function selfPermitIfNecessary(
        address token,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external payable override {
        if (ERC20(token).allowance(msg.sender, address(this)) < value) selfPermit(token, value, deadline, v, r, s);
    }

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

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

// forked from https://github.com/Uniswap/v3-periphery/blob/main/contracts/base/Multicall.sol


// forked from https://github.com/Uniswap/v3-periphery/blob/main/contracts/interfaces/IMulticall.sol


/// @title Multicall interface
/// @notice Enables calling multiple methods in a single call to the contract
interface IMulticall {
    /// @notice Call multiple functions in the current contract and return the data from all of them if they all succeed
    /// @dev The `msg.value` should not be trusted for any method callable from multicall.
    /// @param data The encoded function data for each of the calls to make to this contract
    /// @return results The results from each of the calls passed in via data
    function multicall(bytes[] calldata data) external payable returns (bytes[] memory results);
}

/// @title Multicall
/// @notice Enables calling multiple methods in a single call to the contract
abstract contract Multicall is IMulticall {
    /// @inheritdoc IMulticall
    function multicall(bytes[] calldata data) public payable override returns (bytes[] memory results) {
        results = new bytes[](data.length);
        for (uint256 i = 0; i < data.length; i++) {
            (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;
        }
    }
}

/**
 @title Periphery Payments
 @notice Immutable state used by periphery contracts
 Largely Forked from https://github.com/Uniswap/v3-periphery/blob/main/contracts/base/PeripheryPayments.sol 
 Changes:
 * no interface
 * no inheritdoc
 * add immutable WETH9 in constructor instead of PeripheryImmutableState
 * receive from any address
 * Solmate interfaces and transfer lib
 * casting
 * add approve, wrapWETH9 and pullToken
*/
abstract contract PeripheryPayments {
    using SafeTransferLib for *;

    IWETH9 public immutable WETH9;

    constructor(IWETH9 _WETH9) {
        WETH9 = _WETH9;
    }

    receive() external payable {}

    function approve(
        ERC20 token,
        address to,
        uint256 amount
    ) public payable {
        token.safeApprove(to, amount);
    }

    function unwrapWETH9(uint256 amountMinimum, address recipient) public payable {
        uint256 balanceWETH9 = WETH9.balanceOf(address(this));
        require(balanceWETH9 >= amountMinimum, "Insufficient WETH9");

        if (balanceWETH9 > 0) {
            WETH9.withdraw(balanceWETH9);
            recipient.safeTransferETH(balanceWETH9);
        }
    }

    function wrapWETH9() public payable {
        if (address(this).balance > 0) WETH9.deposit{value: address(this).balance}(); // wrap everything
    }

    function pullToken(
        ERC20 token,
        uint256 amount,
        address recipient
    ) public payable {
        token.safeTransferFrom(msg.sender, recipient, amount);
    }

    function sweepToken(
        ERC20 token,
        uint256 amountMinimum,
        address recipient
    ) public payable {
        uint256 balanceToken = token.balanceOf(address(this));
        require(balanceToken >= amountMinimum, "Insufficient token");

        if (balanceToken > 0) {
            token.safeTransfer(recipient, balanceToken);
        }
    }

    function refundETH() external payable {
        if (address(this).balance > 0) SafeTransferLib.safeTransferETH(msg.sender, address(this).balance);
    }
}

abstract contract IWETH9 is ERC20 {
    /// @notice Deposit ether to get wrapped ether
    function deposit() external payable virtual;

    /// @notice Withdraw wrapped ether to get ether
    function withdraw(uint256) external virtual;
}

/// @title ERC4626 Router Base Contract
abstract contract Yearn4626RouterBase is
    IYearn4626RouterBase,
    SelfPermit,
    Multicall,
    PeripheryPayments
{
    using SafeTransferLib for ERC20;

    /// @inheritdoc IYearn4626RouterBase
    function mint(
        IYearn4626 vault,
        uint256 shares,
        address to,
        uint256 maxAmountIn
    ) public payable virtual override returns (uint256 amountIn) {
        require ((amountIn = vault.mint(shares, to)) <= maxAmountIn, "!MaxAmount");
    }

    /// @inheritdoc IYearn4626RouterBase
    function deposit(
        IYearn4626 vault,
        uint256 amount,
        address to,
        uint256 minSharesOut
    ) public payable virtual override returns (uint256 sharesOut) {
        require ((sharesOut = vault.deposit(amount, to)) >= minSharesOut, "!MinShares");
    }

    /// @inheritdoc IYearn4626RouterBase
    function withdraw(
        IYearn4626 vault,
        uint256 amount,
        address to,
        uint256 maxLoss
    ) public payable virtual override returns (uint256) {
        return vault.withdraw(amount, to, msg.sender, maxLoss);
    }

    /// @inheritdoc IYearn4626RouterBase
    function withdrawDefault(
        IYearn4626 vault,
        uint256 amount,
        address to,
        uint256 maxSharesOut
    ) public payable virtual override returns (uint256 sharesOut) {
        require ((sharesOut = vault.withdraw(amount, to, msg.sender)) <= maxSharesOut, "!MaxShares");
    }

    /// @inheritdoc IYearn4626RouterBase
    function redeem(
        IYearn4626 vault,
        uint256 shares,
        address to,
        uint256 maxLoss
    ) public payable virtual override returns (uint256) {
        return vault.redeem(shares, to, msg.sender, maxLoss);
    }

    /// @inheritdoc IYearn4626RouterBase
    function redeemDefault(
        IYearn4626 vault,
        uint256 shares,
        address to,
        uint256 minAmountOut
    ) public payable virtual override returns (uint256 amountOut) {
        require ((amountOut = vault.redeem(shares, to, msg.sender)) >= minAmountOut, "!MinAmount");
    }
}

abstract contract IYearnV2 is ERC20 {
    // NOTE: Vyper produces multiple signatures for a given function with "default" args
    function withdraw() external virtual returns (uint256);

    function withdraw(uint256 maxShares) external virtual returns (uint256);

    function withdraw(uint256 maxShares, address recipient) external virtual returns (uint256);

    function withdraw(
        uint256 maxShares,
        address recipient,
        uint256 maxLoss
    ) external virtual returns (uint256);
}

/** 
 @title ERC4626Router Interface
 @notice Extends the ERC4626RouterBase with specific flows to save gas
 */
interface IYearn4626Router {
    /*//////////////////////////////////////////////////////////////
                            DEPOSIT
    //////////////////////////////////////////////////////////////*/

    /** 
     @notice deposit `amount` to an ERC4626 vault.
     @param vault The ERC4626 vault to deposit assets to.
     @param to The destination of ownership shares.
     @param amount The amount of assets to deposit to `vault`.
     @param minSharesOut The min amount of `vault` shares received by `to`.
     @return . the amount of shares received by `to`.
     @dev throws "!minShares" Error.
    */
    function depositToVault(
        IYearn4626 vault,
        uint256 amount,
        address to,
        uint256 minSharesOut
    ) external payable returns (uint256);

    /*//////////////////////////////////////////////////////////////
                            MIGRATION
    //////////////////////////////////////////////////////////////*/

    /** 
     @notice will redeem `shares` from one vault and deposit amountOut to a different ERC4626 vault.
     @param fromVault The ERC4626 vault to redeem shares from.
     @param toVault The ERC4626 vault to deposit assets to.
     @param shares The amount of shares to redeem from fromVault.
     @param to The destination of ownership shares.
     @param minSharesOut The min amount of toVault shares received by `to`.
     @return . the amount of shares received by `to`.
     @dev throws "!minAmount", "!minShares" Errors.
    */
    function migrate(
        IYearn4626 fromVault,
        IYearn4626 toVault,
        uint256 shares,
        address to,
        uint256 minSharesOut
    ) external payable returns (uint256);

    /*//////////////////////////////////////////////////////////////
                            V2 MIGRATION
    //////////////////////////////////////////////////////////////*/

    /**
     @notice migrate from Yearn V2 vault to a V3 vault'.
     @param fromVault The Yearn V2 vault to withdraw from.
     @param toVault The Yearn V3 vault to deposit assets to.
     @param shares The amount of V2 shares to redeem form 'fromVault'.
     @param to The destination of ownership shares
     @param minSharesOut The min amount of 'toVault' shares to be received by 'to'.
     @return . The actual amount of 'toVault' shares received by 'to'.
     @dev throws "!minAmount", "!minShares" Errors.
    */
    function migrateFromV2(
        IYearnV2 fromVault,
        IYearn4626 toVault,
        uint256 shares,
        address to,
        uint256 minSharesOut
    ) external payable returns (uint256);
}

/**
 * @title Yearn4626Router contract
 * @notice
 *  Router that is meant to be used with Yearn V3 vaults and strategies
 *  for deposits, withdraws and migrations.
 *  
 *  The router was developed from the original router by FEI protocol
 *  https://github.com/fei-protocol/ERC4626
 *
 *  The router is designed to be used with permit and multicall for the 
 *  optimal experience.
 *
 *  NOTE: It is important to never leave tokens in the router at the 
 *  end of a call, otherwise they can be swept by anyone.
 */
contract Yearn4626Router is IYearn4626Router, Yearn4626RouterBase {
    using SafeTransferLib for ERC20;

    // Store name as bytes so it can be immutable
    bytes32 private immutable _name;

    constructor(string memory _name_, IWETH9 weth) PeripheryPayments(weth) {
        _name = bytes32(abi.encodePacked(_name_));
    }

    // Getter function to unpack stored name.
    function name() external view returns(string memory) {
        return string(abi.encodePacked(_name));
    }

    /*//////////////////////////////////////////////////////////////
                            DEPOSIT
    //////////////////////////////////////////////////////////////*/

    // For the below, no approval needed, assumes vault is already max approved

    /// @inheritdoc IYearn4626Router
    function depositToVault(
        IYearn4626 vault,
        uint256 amount,
        address to,
        uint256 minSharesOut
    ) public payable override returns (uint256) {
        pullToken(ERC20(vault.asset()), amount, address(this));
        return deposit(vault, amount, to, minSharesOut);
    }

    //-------- DEPOSIT FUNCTIONS WITH DEFAULT VALUES --------\\ 

    /**
     @notice See {depositToVault} in IYearn4626Router.
     @dev Uses msg.sender as the default for `to`.
    */
    function depositToVault(
        IYearn4626 vault,
        uint256 amount,
        uint256 minSharesOut
    ) external payable returns (uint256) {
        return depositToVault(vault, amount, msg.sender, minSharesOut);
    }

    /**
     @notice See {depositToVault} in IYearn4626Router.
     @dev Uses msg.sender as the default for `to` and their full 
     balance of msg.sender as `amount`.
    */
    function depositToVault(
        IYearn4626 vault, 
        uint256 minSharesOut
    ) external payable returns (uint256) {
        uint256 amount = ERC20(vault.asset()).balanceOf(msg.sender);
        return depositToVault(vault, amount, msg.sender, minSharesOut);
    }

    /**
     @notice See {depositToVault} in IYearn4626Router.
     @dev Uses msg.sender as the default for `to`, their full balance 
     of msg.sender as `amount` and 1 Basis point for `maxLoss`.
     
     NOTE: The slippage tollerance is only useful if {previewDeposit}
     cannot be manipulated for the `vault`.
    */
    function depositToVault(
        IYearn4626 vault
    ) external payable returns (uint256) {
        uint256 assets =  ERC20(vault.asset()).balanceOf(msg.sender);
        // This give a default 1Basis point acceptance for loss. This is only 
        // considered safe if the vaults PPS can not be manipulated.
        uint256 minSharesOut = vault.previewDeposit(assets) * 9_999 / 10_000;
        return depositToVault(vault, assets, msg.sender, minSharesOut);
    }

    /*//////////////////////////////////////////////////////////////
                            REDEEM
    //////////////////////////////////////////////////////////////*/

    //-------- REDEEM FUNCTIONS WITH DEFAULT VALUES --------\\

    /**
     @notice See {redeem} in IYearn4626RouterBase.
     @dev Uses msg.sender as `receiver`.
    */
    function redeem(
        IYearn4626 vault,
        uint256 shares,
        uint256 maxLoss
    ) external payable returns (uint256) {
        return redeem(vault, shares, msg.sender, maxLoss);
    }

    /**
     @notice See {redeem} in IYearn4626RouterBase.
     @dev Uses msg.sender as `receiver` and their full balance as `shares`.
    */
    function redeem(
        IYearn4626 vault,
        uint256 maxLoss
    ) external payable returns (uint256) {
        uint256 shares = vault.balanceOf(msg.sender);
        return redeem(vault, shares, msg.sender, maxLoss);
    }

    /**
     @notice See {redeem} in IYearn4626RouterBase.
     @dev Uses msg.sender as `receiver`, their full balance as `shares`
     and 1 Basis Point for `maxLoss`.
    */
    function redeem(
        IYearn4626 vault
    ) external payable returns (uint256) {
        uint256 shares = vault.balanceOf(msg.sender);
        return redeem(vault, shares, msg.sender, 1);
    }

    /*//////////////////////////////////////////////////////////////
                            MIGRATE
    //////////////////////////////////////////////////////////////*/

    /// @inheritdoc IYearn4626Router
    function migrate(
        IYearn4626 fromVault,
        IYearn4626 toVault,
        uint256 shares,
        address to,
        uint256 minSharesOut
    ) public payable override returns (uint256) {
        // amount out passes through so only one slippage check is needed
        uint256 amount = redeem(fromVault, shares, address(this), 10_000);
        return deposit(toVault, amount, to, minSharesOut);
    }

    //-------- MIGRATE FUNCTIONS WITH DEFAULT VALUES --------\\

    /**
     @notice See {migrate} in IYearn4626Router.
     @dev Uses msg.sender as `to`.
    */
    function migrate(
        IYearn4626 fromVault,
        IYearn4626 toVault,
        uint256 shares,
        uint256 minSharesOut
    ) external payable returns (uint256) {
        return migrate(fromVault, toVault, shares, msg.sender, minSharesOut);
    }

    /**
     @notice See {migrate} in IYearn4626Router.
     @dev Uses msg.sender as `to` and their full balance for `shares`.
    */
    function migrate(
        IYearn4626 fromVault,
        IYearn4626 toVault,
        uint256 minSharesOut
    ) external payable returns (uint256) {
        uint256 shares = fromVault.balanceOf(msg.sender);
        return migrate(fromVault, toVault, shares, msg.sender, minSharesOut);
    }

    /**
     @notice See {migrate} in IYearn4626Router.
     @dev Uses msg.sender as `to`, their full balance for `shares` and no `minamountOut`.

     NOTE: Using this will enforce no slippage checks and should be used with care.
    */
    function migrate(
        IYearn4626 fromVault, 
        IYearn4626 toVault
    ) external payable returns (uint256) {
        uint256 shares = fromVault.balanceOf(msg.sender);
        return migrate(fromVault, toVault, shares, msg.sender, 0);
    }

    /*//////////////////////////////////////////////////////////////
                        V2 MIGRATION
    //////////////////////////////////////////////////////////////*/

    /// @inheritdoc IYearn4626Router
    function migrateFromV2(
        IYearnV2 fromVault,
        IYearn4626 toVault,
        uint256 shares,
        address to,
        uint256 minSharesOut
    ) public payable override returns (uint256) {
        // V2 can't specify owner so we need to first pull the shares
        fromVault.transferFrom(msg.sender, address(this), shares);
        // amount out passes through so only one slippage check is needed
        uint256 redeemed = fromVault.withdraw(shares, address(this));
        return deposit(toVault, redeemed, to, minSharesOut);
    }

    //-------- migrateFromV2 FUNCTIONS WITH DEFAULT VALUES --------\\

    /**
     @notice See {migrateFromV2} in IYearn4626Router.
     @dev Uses msg.sender as `to`.
    */
    function migrateFromV2(
        IYearnV2 fromVault,
        IYearn4626 toVault,
        uint256 shares,
        uint256 minSharesOut
    ) external payable returns (uint256) {
        return migrateFromV2(fromVault, toVault, shares, msg.sender, minSharesOut);
    }

    /**
     @notice See {migrateFromV2} in IYearn4626Router.
     @dev Uses msg.sender as `to` and their full balance as `shares`.
    */
    function migrateFromV2(
        IYearnV2 fromVault,
        IYearn4626 toVault,
        uint256 minSharesOut
    ) external payable returns (uint256) {
        uint256 shares = fromVault.balanceOf(msg.sender);
        return migrateFromV2(fromVault, toVault, shares, msg.sender, minSharesOut);
    }

    /**
     @notice See {migrate} in IYearn4626Router.
     @dev Uses msg.sender as `to`, their full balance for `shares` and no `minamountOut`.

     NOTE: Using this will enforce no slippage checks and should be used with care.
    */
    function migrateFromV2(
        IYearnV2 fromVault,
        IYearn4626 toVault
    ) external payable returns (uint256 sharesOut) {
        uint256 shares = fromVault.balanceOf(msg.sender);
        return migrateFromV2(fromVault, toVault, shares, msg.sender, 0);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name_","type":"string"},{"internalType":"contract IWETH9","name":"weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH9","outputs":[{"internalType":"contract IWETH9","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract ERC20","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IYearn4626","name":"vault","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"minSharesOut","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"sharesOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IYearn4626","name":"vault","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"minSharesOut","type":"uint256"}],"name":"depositToVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IYearn4626","name":"vault","type":"address"},{"internalType":"uint256","name":"minSharesOut","type":"uint256"}],"name":"depositToVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IYearn4626","name":"vault","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minSharesOut","type":"uint256"}],"name":"depositToVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IYearn4626","name":"vault","type":"address"}],"name":"depositToVault","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IYearn4626","name":"fromVault","type":"address"},{"internalType":"contract IYearn4626","name":"toVault","type":"address"}],"name":"migrate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IYearn4626","name":"fromVault","type":"address"},{"internalType":"contract IYearn4626","name":"toVault","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"minSharesOut","type":"uint256"}],"name":"migrate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IYearn4626","name":"fromVault","type":"address"},{"internalType":"contract IYearn4626","name":"toVault","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"minSharesOut","type":"uint256"}],"name":"migrate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IYearn4626","name":"fromVault","type":"address"},{"internalType":"contract IYearn4626","name":"toVault","type":"address"},{"internalType":"uint256","name":"minSharesOut","type":"uint256"}],"name":"migrate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IYearnV2","name":"fromVault","type":"address"},{"internalType":"contract IYearn4626","name":"toVault","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"minSharesOut","type":"uint256"}],"name":"migrateFromV2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IYearnV2","name":"fromVault","type":"address"},{"internalType":"contract IYearn4626","name":"toVault","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"minSharesOut","type":"uint256"}],"name":"migrateFromV2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IYearnV2","name":"fromVault","type":"address"},{"internalType":"contract IYearn4626","name":"toVault","type":"address"},{"internalType":"uint256","name":"minSharesOut","type":"uint256"}],"name":"migrateFromV2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IYearnV2","name":"fromVault","type":"address"},{"internalType":"contract IYearn4626","name":"toVault","type":"address"}],"name":"migrateFromV2","outputs":[{"internalType":"uint256","name":"sharesOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IYearn4626","name":"vault","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"maxAmountIn","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract ERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"pullToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IYearn4626","name":"vault","type":"address"},{"internalType":"uint256","name":"maxLoss","type":"uint256"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IYearn4626","name":"vault","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"maxLoss","type":"uint256"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IYearn4626","name":"vault","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IYearn4626","name":"vault","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"maxLoss","type":"uint256"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IYearn4626","name":"vault","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"redeemDefault","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"refundETH","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":"selfPermit","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":"contract ERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amountMinimum","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"sweepToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountMinimum","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"unwrapWETH9","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IYearn4626","name":"vault","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"maxLoss","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IYearn4626","name":"vault","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"maxSharesOut","type":"uint256"}],"name":"withdrawDefault","outputs":[{"internalType":"uint256","name":"sharesOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"wrapWETH9","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040523480156200001157600080fd5b5060405162002040380380620020408339810160408190526200003491620000d3565b6001600160a01b03811660805260405162000054908390602001620001a0565b6040516020818303038152906040526200006e90620001be565b60a05250620001e69050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620000ad57818101518382015260200162000093565b50506000910152565b80516001600160a01b0381168114620000ce57600080fd5b919050565b60008060408385031215620000e757600080fd5b82516001600160401b0380821115620000ff57600080fd5b818501915085601f8301126200011457600080fd5b8151818111156200012957620001296200007a565b604051601f8201601f19908116603f011681019083821181831017156200015457620001546200007a565b816040528281528860208487010111156200016e57600080fd5b6200018183602083016020880162000090565b80965050505050506200019760208401620000b6565b90509250929050565b60008251620001b481846020870162000090565b9190910192915050565b80516020808301519190811015620001e0576000198160200360031b1b821691505b50919050565b60805160a051611e1f62000221600039600061021f01526000818161034e0152818161089a015281816109bb0152610a910152611e1f6000f3fe6080604052600436106101fd5760003560e01c806390d250741161010d578063c28916f6116100a0578063e1f21c671161006f578063e1f21c67146104c5578063efc7a861146104d8578063f16565ee146104eb578063f3995c67146104fe578063f3f094a11461051157600080fd5b8063c28916f614610479578063c2e3140a1461048c578063dbae02921461049f578063df2ab5bb146104b257600080fd5b8063a3ebe717116100dc578063a3ebe71714610420578063a4a78f0c14610433578063a79721fe14610446578063ac9650d81461045957600080fd5b806390d25074146103d457806395a2251f146103e75780639b4f09af146103fa578063a3d111581461040d57600080fd5b80633f50fd1f116101905780634aa4a4fc1161015f5780634aa4a4fc1461033c5780634b2084e3146103885780635b9a66ee1461039b5780636f63427e146103ae57806373d15414146103c157600080fd5b80633f50fd1f146102fb5780634659a4941461030357806349404b7c146103165780634a2503301461032957600080fd5b80632b83cccd116101cc5780632b83cccd146102af57806330b3484f146102c25780633c173a4f146102d55780633dff6639146102e857600080fd5b806306fdde03146102095780631068361f1461027157806312210e8a146102925780631e9a69501461029c57600080fd5b3661020457005b600080fd5b34801561021557600080fd5b5061025b604080517f0000000000000000000000000000000000000000000000000000000000000000602082015260609101604051602081830303815290604052905090565b6040516102689190611851565b60405180910390f35b61028461027f36600461187c565b610524565b604051908152602001610268565b61029a6105ab565b005b6102846102aa3660046118b5565b6105bd565b6102846102bd3660046118e1565b610638565b6102846102d0366004611916565b61064e565b6102846102e3366004611916565b6106d1565b6102846102f636600461195e565b61078c565b61029a610892565b61029a6103113660046119b9565b61090e565b61029a610324366004611a1b565b6109a3565b61028461033736600461195e565b610b0e565b34801561034857600080fd5b506103707f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610268565b610284610396366004611916565b610b1f565b6102846103a9366004611916565b610ba4565b6102846103bc366004611916565b610c60565b61029a6103cf366004611a40565b610d1c565b6102846103e2366004611916565b610d31565b6102846103f5366004611a82565b610de7565b610284610408366004611a9f565b610e6a565b61028461041b3660046118b5565b610e79565b61028461042e366004611ae5565b610f56565b61029a6104413660046119b9565b610fd2565b610284610454366004611a9f565b611060565b61046c610467366004611b26565b61106f565b6040516102689190611b9b565b6102846104873660046118e1565b6111c7565b61029a61049a3660046119b9565b6111d5565b6102846104ad36600461187c565b611259565b61029a6104c0366004611a40565b6112d6565b61029a6104d3366004611ae5565b6113a8565b6102846104e6366004611a82565b6113bc565b6102846104f9366004611ae5565b611525565b61029a61050c3660046119b9565b6115a1565b61028461051f366004611916565b6115f8565b6040516370a0823160e01b815233600482015260009081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561056d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105919190611bfd565b90506105a1848483336000610b0e565b9150505b92915050565b47156105bb576105bb334761163e565b565b6040516370a0823160e01b815233600482015260009081906001600160a01b038516906370a0823190602401602060405180830381865afa158015610606573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062a9190611bfd565b90506105a1848233866115f8565b6000610646848433856115f8565b949350505050565b60006106bc856001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610691573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b59190611c16565b8530610d1c565b6106c885858585610d31565b95945050505050565b6040516394bf804d60e01b8152600481018490526001600160a01b03838116602483015260009183918716906394bf804d906044016020604051808303816000875af1158015610725573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107499190611bfd565b91508111156106465760405162461bcd60e51b815260206004820152600a6024820152690853585e105b5bdd5b9d60b21b60448201526064015b60405180910390fd5b6040516323b872dd60e01b8152336004820152306024820152604481018490526000906001600160a01b038716906323b872dd906064016020604051808303816000875af11580156107e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108069190611c33565b50604051627b8a6760e11b8152600481018590523060248201526000906001600160a01b0388169062f714ce906044016020604051808303816000875af1158015610855573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108799190611bfd565b905061088786828686610d31565b979650505050505050565b47156105bb577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0476040518263ffffffff1660e01b81526004016000604051808303818588803b1580156108f357600080fd5b505af1158015610907573d6000803e3d6000fd5b5050505050565b6040516323f2ebc360e21b815233600482015230602482015260448101869052606481018590526001608482015260ff841660a482015260c4810183905260e481018290526001600160a01b03871690638fcbaf0c90610104015b600060405180830381600087803b15801561098357600080fd5b505af1158015610997573d6000803e3d6000fd5b50505050505050505050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610a0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2e9190611bfd565b905082811015610a755760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e7420574554483960701b6044820152606401610783565b8015610b0957604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015610add57600080fd5b505af1158015610af1573d6000803e3d6000fd5b50610b09925050506001600160a01b0383168261163e565b505050565b6000806108798786306127106115f8565b6040516328c6306960e21b8152600481018490526001600160a01b038381166024830152336044830152606482018390526000919086169063a318c1a4906084015b6020604051808303816000875af1158015610b80573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c89190611bfd565b604051635d043b2960e11b8152600481018490526001600160a01b038381166024830152336044830152600091839187169063ba087652906064016020604051808303816000875af1158015610bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c229190611bfd565b91508110156106465760405162461bcd60e51b815260206004820152600a60248201526908535a5b905b5bdd5b9d60b21b6044820152606401610783565b604051632d182be560e21b8152600481018490526001600160a01b038381166024830152336044830152600091839187169063b460af94906064016020604051808303816000875af1158015610cba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cde9190611bfd565b91508111156106465760405162461bcd60e51b815260206004820152600a602482015269214d617853686172657360b01b6044820152606401610783565b610b096001600160a01b03841633838561168f565b604051636e553f6560e01b8152600481018490526001600160a01b0383811660248301526000918391871690636e553f65906044016020604051808303816000875af1158015610d85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da99190611bfd565b91508110156106465760405162461bcd60e51b815260206004820152600a602482015269214d696e53686172657360b01b6044820152606401610783565b6040516370a0823160e01b815233600482015260009081906001600160a01b038416906370a0823190602401602060405180830381865afa158015610e30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e549190611bfd565b9050610e6383823360016115f8565b9392505050565b60006106c8858585338661078c565b600080836001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ede9190611c16565b6040516370a0823160e01b81523360048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015610f24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f489190611bfd565b90506105a18482338661064e565b6040516370a0823160e01b815233600482015260009081906001600160a01b038616906370a0823190602401602060405180830381865afa158015610f9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc39190611bfd565b90506106c8858583338761078c565b604051636eb1769f60e11b8152336004820152306024820152600019906001600160a01b0388169063dd62ed3e90604401602060405180830381865afa158015611020573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110449190611bfd565b10156110585761105886868686868661090e565b505050505050565b60006106c88585853386610b0e565b60608167ffffffffffffffff81111561108a5761108a611c55565b6040519080825280602002602001820160405280156110bd57816020015b60608152602001906001900390816110a85790505b50905060005b828110156111c057600080308686858181106110e1576110e1611c6b565b90506020028101906110f39190611c81565b604051611101929190611ccf565b600060405180830381855af49150503d806000811461113c576040519150601f19603f3d011682016040523d82523d6000602084013e611141565b606091505b50915091508161118d5760448151101561115a57600080fd5b600481019050808060200190518101906111749190611cdf565b60405162461bcd60e51b81526004016107839190611851565b808484815181106111a0576111a0611c6b565b6020026020010181905250505080806111b890611d97565b9150506110c3565b5092915050565b60006106468484338561064e565b604051636eb1769f60e11b815233600482015230602482015285906001600160a01b0388169063dd62ed3e90604401602060405180830381865afa158015611221573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112459190611bfd565b1015611058576110588686868686866115a1565b6040516370a0823160e01b815233600482015260009081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156112a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c69190611bfd565b90506105a184848333600061078c565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa15801561131d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113419190611bfd565b9050828110156113885760405162461bcd60e51b815260206004820152601260248201527124b739bab33334b1b4b2b73a103a37b5b2b760711b6044820152606401610783565b80156113a2576113a26001600160a01b0385168383611712565b50505050565b610b096001600160a01b038416838361178a565b600080826001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114219190611c16565b6040516370a0823160e01b81523360048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015611467573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148b9190611bfd565b90506000612710846001600160a01b031663ef8b30f7846040518263ffffffff1660e01b81526004016114c091815260200190565b602060405180830381865afa1580156114dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115019190611bfd565b61150d9061270f611db0565b6115179190611dc7565b90506106468483338461064e565b6040516370a0823160e01b815233600482015260009081906001600160a01b038616906370a0823190602401602060405180830381865afa15801561156e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115929190611bfd565b90506106c88585833387610b0e565b60405163d505accf60e01b8152336004820152306024820152604481018690526064810185905260ff8416608482015260a4810183905260c481018290526001600160a01b0387169063d505accf9060e401610969565b604051639f40a7b360e01b8152600481018490526001600160a01b0383811660248301523360448301526064820183905260009190861690639f40a7b390608401610b61565b600080600080600085875af1905080610b095760405162461bcd60e51b815260206004820152601360248201527211551217d514905394d1915497d19052531151606a1b6044820152606401610783565b60006040516323b872dd60e01b81528460048201528360248201528260448201526020600060648360008a5af13d15601f3d11600160005114161716915050806109075760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b6044820152606401610783565b600060405163a9059cbb60e01b8152836004820152826024820152602060006044836000895af13d15601f3d11600160005114161716915050806113a25760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b6044820152606401610783565b600060405163095ea7b360e01b8152836004820152826024820152602060006044836000895af13d15601f3d11600160005114161716915050806113a25760405162461bcd60e51b815260206004820152600e60248201526d1054141493d59157d1905253115160921b6044820152606401610783565b60005b8381101561181c578181015183820152602001611804565b50506000910152565b6000815180845261183d816020860160208601611801565b601f01601f19169290920160200192915050565b602081526000610e636020830184611825565b6001600160a01b038116811461187957600080fd5b50565b6000806040838503121561188f57600080fd5b823561189a81611864565b915060208301356118aa81611864565b809150509250929050565b600080604083850312156118c857600080fd5b82356118d381611864565b946020939093013593505050565b6000806000606084860312156118f657600080fd5b833561190181611864565b95602085013595506040909401359392505050565b6000806000806080858703121561192c57600080fd5b843561193781611864565b935060208501359250604085013561194e81611864565b9396929550929360600135925050565b600080600080600060a0868803121561197657600080fd5b853561198181611864565b9450602086013561199181611864565b93506040860135925060608601356119a881611864565b949793965091946080013592915050565b60008060008060008060c087890312156119d257600080fd5b86356119dd81611864565b95506020870135945060408701359350606087013560ff81168114611a0157600080fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215611a2e57600080fd5b8235915060208301356118aa81611864565b600080600060608486031215611a5557600080fd5b8335611a6081611864565b9250602084013591506040840135611a7781611864565b809150509250925092565b600060208284031215611a9457600080fd5b8135610e6381611864565b60008060008060808587031215611ab557600080fd5b8435611ac081611864565b93506020850135611ad081611864565b93969395505050506040820135916060013590565b600080600060608486031215611afa57600080fd5b8335611b0581611864565b92506020840135611b1581611864565b929592945050506040919091013590565b60008060208385031215611b3957600080fd5b823567ffffffffffffffff80821115611b5157600080fd5b818501915085601f830112611b6557600080fd5b813581811115611b7457600080fd5b8660208260051b8501011115611b8957600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611bf057603f19888603018452611bde858351611825565b94509285019290850190600101611bc2565b5092979650505050505050565b600060208284031215611c0f57600080fd5b5051919050565b600060208284031215611c2857600080fd5b8151610e6381611864565b600060208284031215611c4557600080fd5b81518015158114610e6357600080fd5b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112611c9857600080fd5b83018035915067ffffffffffffffff821115611cb357600080fd5b602001915036819003821315611cc857600080fd5b9250929050565b8183823760009101908152919050565b600060208284031215611cf157600080fd5b815167ffffffffffffffff80821115611d0957600080fd5b818401915084601f830112611d1d57600080fd5b815181811115611d2f57611d2f611c55565b604051601f8201601f19908116603f01168101908382118183101715611d5757611d57611c55565b81604052828152876020848701011115611d7057600080fd5b610887836020830160208801611801565b634e487b7160e01b600052601160045260246000fd5b600060018201611da957611da9611d81565b5060010190565b80820281158282048414176105a5576105a5611d81565b600082611de457634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220187c490dbdf81e46d460136257a8b4a477c5b7b59c6b04d825a80b7f458070b864736f6c634300081200330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000011596561726e203436323620526f75746572000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101fd5760003560e01c806390d250741161010d578063c28916f6116100a0578063e1f21c671161006f578063e1f21c67146104c5578063efc7a861146104d8578063f16565ee146104eb578063f3995c67146104fe578063f3f094a11461051157600080fd5b8063c28916f614610479578063c2e3140a1461048c578063dbae02921461049f578063df2ab5bb146104b257600080fd5b8063a3ebe717116100dc578063a3ebe71714610420578063a4a78f0c14610433578063a79721fe14610446578063ac9650d81461045957600080fd5b806390d25074146103d457806395a2251f146103e75780639b4f09af146103fa578063a3d111581461040d57600080fd5b80633f50fd1f116101905780634aa4a4fc1161015f5780634aa4a4fc1461033c5780634b2084e3146103885780635b9a66ee1461039b5780636f63427e146103ae57806373d15414146103c157600080fd5b80633f50fd1f146102fb5780634659a4941461030357806349404b7c146103165780634a2503301461032957600080fd5b80632b83cccd116101cc5780632b83cccd146102af57806330b3484f146102c25780633c173a4f146102d55780633dff6639146102e857600080fd5b806306fdde03146102095780631068361f1461027157806312210e8a146102925780631e9a69501461029c57600080fd5b3661020457005b600080fd5b34801561021557600080fd5b5061025b604080517f596561726e203436323620526f75746572000000000000000000000000000000602082015260609101604051602081830303815290604052905090565b6040516102689190611851565b60405180910390f35b61028461027f36600461187c565b610524565b604051908152602001610268565b61029a6105ab565b005b6102846102aa3660046118b5565b6105bd565b6102846102bd3660046118e1565b610638565b6102846102d0366004611916565b61064e565b6102846102e3366004611916565b6106d1565b6102846102f636600461195e565b61078c565b61029a610892565b61029a6103113660046119b9565b61090e565b61029a610324366004611a1b565b6109a3565b61028461033736600461195e565b610b0e565b34801561034857600080fd5b506103707f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6040516001600160a01b039091168152602001610268565b610284610396366004611916565b610b1f565b6102846103a9366004611916565b610ba4565b6102846103bc366004611916565b610c60565b61029a6103cf366004611a40565b610d1c565b6102846103e2366004611916565b610d31565b6102846103f5366004611a82565b610de7565b610284610408366004611a9f565b610e6a565b61028461041b3660046118b5565b610e79565b61028461042e366004611ae5565b610f56565b61029a6104413660046119b9565b610fd2565b610284610454366004611a9f565b611060565b61046c610467366004611b26565b61106f565b6040516102689190611b9b565b6102846104873660046118e1565b6111c7565b61029a61049a3660046119b9565b6111d5565b6102846104ad36600461187c565b611259565b61029a6104c0366004611a40565b6112d6565b61029a6104d3366004611ae5565b6113a8565b6102846104e6366004611a82565b6113bc565b6102846104f9366004611ae5565b611525565b61029a61050c3660046119b9565b6115a1565b61028461051f366004611916565b6115f8565b6040516370a0823160e01b815233600482015260009081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561056d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105919190611bfd565b90506105a1848483336000610b0e565b9150505b92915050565b47156105bb576105bb334761163e565b565b6040516370a0823160e01b815233600482015260009081906001600160a01b038516906370a0823190602401602060405180830381865afa158015610606573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062a9190611bfd565b90506105a1848233866115f8565b6000610646848433856115f8565b949350505050565b60006106bc856001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610691573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b59190611c16565b8530610d1c565b6106c885858585610d31565b95945050505050565b6040516394bf804d60e01b8152600481018490526001600160a01b03838116602483015260009183918716906394bf804d906044016020604051808303816000875af1158015610725573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107499190611bfd565b91508111156106465760405162461bcd60e51b815260206004820152600a6024820152690853585e105b5bdd5b9d60b21b60448201526064015b60405180910390fd5b6040516323b872dd60e01b8152336004820152306024820152604481018490526000906001600160a01b038716906323b872dd906064016020604051808303816000875af11580156107e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108069190611c33565b50604051627b8a6760e11b8152600481018590523060248201526000906001600160a01b0388169062f714ce906044016020604051808303816000875af1158015610855573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108799190611bfd565b905061088786828686610d31565b979650505050505050565b47156105bb577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0476040518263ffffffff1660e01b81526004016000604051808303818588803b1580156108f357600080fd5b505af1158015610907573d6000803e3d6000fd5b5050505050565b6040516323f2ebc360e21b815233600482015230602482015260448101869052606481018590526001608482015260ff841660a482015260c4810183905260e481018290526001600160a01b03871690638fcbaf0c90610104015b600060405180830381600087803b15801561098357600080fd5b505af1158015610997573d6000803e3d6000fd5b50505050505050505050565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316906370a0823190602401602060405180830381865afa158015610a0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2e9190611bfd565b905082811015610a755760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e7420574554483960701b6044820152606401610783565b8015610b0957604051632e1a7d4d60e01b8152600481018290527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015610add57600080fd5b505af1158015610af1573d6000803e3d6000fd5b50610b09925050506001600160a01b0383168261163e565b505050565b6000806108798786306127106115f8565b6040516328c6306960e21b8152600481018490526001600160a01b038381166024830152336044830152606482018390526000919086169063a318c1a4906084015b6020604051808303816000875af1158015610b80573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c89190611bfd565b604051635d043b2960e11b8152600481018490526001600160a01b038381166024830152336044830152600091839187169063ba087652906064016020604051808303816000875af1158015610bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c229190611bfd565b91508110156106465760405162461bcd60e51b815260206004820152600a60248201526908535a5b905b5bdd5b9d60b21b6044820152606401610783565b604051632d182be560e21b8152600481018490526001600160a01b038381166024830152336044830152600091839187169063b460af94906064016020604051808303816000875af1158015610cba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cde9190611bfd565b91508111156106465760405162461bcd60e51b815260206004820152600a602482015269214d617853686172657360b01b6044820152606401610783565b610b096001600160a01b03841633838561168f565b604051636e553f6560e01b8152600481018490526001600160a01b0383811660248301526000918391871690636e553f65906044016020604051808303816000875af1158015610d85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da99190611bfd565b91508110156106465760405162461bcd60e51b815260206004820152600a602482015269214d696e53686172657360b01b6044820152606401610783565b6040516370a0823160e01b815233600482015260009081906001600160a01b038416906370a0823190602401602060405180830381865afa158015610e30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e549190611bfd565b9050610e6383823360016115f8565b9392505050565b60006106c8858585338661078c565b600080836001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610eba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ede9190611c16565b6040516370a0823160e01b81523360048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015610f24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f489190611bfd565b90506105a18482338661064e565b6040516370a0823160e01b815233600482015260009081906001600160a01b038616906370a0823190602401602060405180830381865afa158015610f9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc39190611bfd565b90506106c8858583338761078c565b604051636eb1769f60e11b8152336004820152306024820152600019906001600160a01b0388169063dd62ed3e90604401602060405180830381865afa158015611020573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110449190611bfd565b10156110585761105886868686868661090e565b505050505050565b60006106c88585853386610b0e565b60608167ffffffffffffffff81111561108a5761108a611c55565b6040519080825280602002602001820160405280156110bd57816020015b60608152602001906001900390816110a85790505b50905060005b828110156111c057600080308686858181106110e1576110e1611c6b565b90506020028101906110f39190611c81565b604051611101929190611ccf565b600060405180830381855af49150503d806000811461113c576040519150601f19603f3d011682016040523d82523d6000602084013e611141565b606091505b50915091508161118d5760448151101561115a57600080fd5b600481019050808060200190518101906111749190611cdf565b60405162461bcd60e51b81526004016107839190611851565b808484815181106111a0576111a0611c6b565b6020026020010181905250505080806111b890611d97565b9150506110c3565b5092915050565b60006106468484338561064e565b604051636eb1769f60e11b815233600482015230602482015285906001600160a01b0388169063dd62ed3e90604401602060405180830381865afa158015611221573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112459190611bfd565b1015611058576110588686868686866115a1565b6040516370a0823160e01b815233600482015260009081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156112a2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c69190611bfd565b90506105a184848333600061078c565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa15801561131d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113419190611bfd565b9050828110156113885760405162461bcd60e51b815260206004820152601260248201527124b739bab33334b1b4b2b73a103a37b5b2b760711b6044820152606401610783565b80156113a2576113a26001600160a01b0385168383611712565b50505050565b610b096001600160a01b038416838361178a565b600080826001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114219190611c16565b6040516370a0823160e01b81523360048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015611467573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148b9190611bfd565b90506000612710846001600160a01b031663ef8b30f7846040518263ffffffff1660e01b81526004016114c091815260200190565b602060405180830381865afa1580156114dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115019190611bfd565b61150d9061270f611db0565b6115179190611dc7565b90506106468483338461064e565b6040516370a0823160e01b815233600482015260009081906001600160a01b038616906370a0823190602401602060405180830381865afa15801561156e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115929190611bfd565b90506106c88585833387610b0e565b60405163d505accf60e01b8152336004820152306024820152604481018690526064810185905260ff8416608482015260a4810183905260c481018290526001600160a01b0387169063d505accf9060e401610969565b604051639f40a7b360e01b8152600481018490526001600160a01b0383811660248301523360448301526064820183905260009190861690639f40a7b390608401610b61565b600080600080600085875af1905080610b095760405162461bcd60e51b815260206004820152601360248201527211551217d514905394d1915497d19052531151606a1b6044820152606401610783565b60006040516323b872dd60e01b81528460048201528360248201528260448201526020600060648360008a5af13d15601f3d11600160005114161716915050806109075760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b6044820152606401610783565b600060405163a9059cbb60e01b8152836004820152826024820152602060006044836000895af13d15601f3d11600160005114161716915050806113a25760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b6044820152606401610783565b600060405163095ea7b360e01b8152836004820152826024820152602060006044836000895af13d15601f3d11600160005114161716915050806113a25760405162461bcd60e51b815260206004820152600e60248201526d1054141493d59157d1905253115160921b6044820152606401610783565b60005b8381101561181c578181015183820152602001611804565b50506000910152565b6000815180845261183d816020860160208601611801565b601f01601f19169290920160200192915050565b602081526000610e636020830184611825565b6001600160a01b038116811461187957600080fd5b50565b6000806040838503121561188f57600080fd5b823561189a81611864565b915060208301356118aa81611864565b809150509250929050565b600080604083850312156118c857600080fd5b82356118d381611864565b946020939093013593505050565b6000806000606084860312156118f657600080fd5b833561190181611864565b95602085013595506040909401359392505050565b6000806000806080858703121561192c57600080fd5b843561193781611864565b935060208501359250604085013561194e81611864565b9396929550929360600135925050565b600080600080600060a0868803121561197657600080fd5b853561198181611864565b9450602086013561199181611864565b93506040860135925060608601356119a881611864565b949793965091946080013592915050565b60008060008060008060c087890312156119d257600080fd5b86356119dd81611864565b95506020870135945060408701359350606087013560ff81168114611a0157600080fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215611a2e57600080fd5b8235915060208301356118aa81611864565b600080600060608486031215611a5557600080fd5b8335611a6081611864565b9250602084013591506040840135611a7781611864565b809150509250925092565b600060208284031215611a9457600080fd5b8135610e6381611864565b60008060008060808587031215611ab557600080fd5b8435611ac081611864565b93506020850135611ad081611864565b93969395505050506040820135916060013590565b600080600060608486031215611afa57600080fd5b8335611b0581611864565b92506020840135611b1581611864565b929592945050506040919091013590565b60008060208385031215611b3957600080fd5b823567ffffffffffffffff80821115611b5157600080fd5b818501915085601f830112611b6557600080fd5b813581811115611b7457600080fd5b8660208260051b8501011115611b8957600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611bf057603f19888603018452611bde858351611825565b94509285019290850190600101611bc2565b5092979650505050505050565b600060208284031215611c0f57600080fd5b5051919050565b600060208284031215611c2857600080fd5b8151610e6381611864565b600060208284031215611c4557600080fd5b81518015158114610e6357600080fd5b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112611c9857600080fd5b83018035915067ffffffffffffffff821115611cb357600080fd5b602001915036819003821315611cc857600080fd5b9250929050565b8183823760009101908152919050565b600060208284031215611cf157600080fd5b815167ffffffffffffffff80821115611d0957600080fd5b818401915084601f830112611d1d57600080fd5b815181811115611d2f57611d2f611c55565b604051601f8201601f19908116603f01168101908382118183101715611d5757611d57611c55565b81604052828152876020848701011115611d7057600080fd5b610887836020830160208801611801565b634e487b7160e01b600052601160045260246000fd5b600060018201611da957611da9611d81565b5060010190565b80820281158282048414176105a5576105a5611d81565b600082611de457634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220187c490dbdf81e46d460136257a8b4a477c5b7b59c6b04d825a80b7f458070b864736f6c63430008120033

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

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000011596561726e203436323620526f75746572000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name_ (string): Yearn 4626 Router
Arg [1] : weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000011
Arg [3] : 596561726e203436323620526f75746572000000000000000000000000000000


Deployed Bytecode Sourcemap

42018:8443:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42408:110;;;;;;;;;;;;42486:23;;;42503:5;42486:23;;;11155:19:1;42446:13:0;;11190:12:1;42486:23:0;;;;;;;;;;;;42472:38;;42408:110;;;;;;;;;:::i;:::-;;;;;;;;47971:255;;;;;;:::i;:::-;;:::i;:::-;;;1517:25:1;;;1505:2;1490:18;47971:255:0;1371:177:1;35595:154:0;;;:::i;:::-;;45566:234;;;;;;:::i;:::-;;:::i;45208:204::-;;;;;;:::i;:::-;;:::i;42826:308::-;;;;;;:::i;:::-;;:::i;36260:276::-;;;;;;:::i;:::-;;:::i;48452:562::-;;;;;;:::i;:::-;;:::i;34862:150::-;;;:::i;31271:298::-;;;;;;:::i;:::-;;:::i;34490:364::-;;;;;;:::i;:::-;;:::i;46416:422::-;;;;;;:::i;:::-;;:::i;34184:29::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5595:32:1;;;5577:51;;5565:2;5550:18;34184:29:0;5416:218:1;36922:247:0;;;;;;:::i;:::-;;:::i;37869:303::-;;;;;;:::i;:::-;;:::i;37219:307::-;;;;;;:::i;:::-;;:::i;35020:188::-;;;;;;:::i;:::-;;:::i;36586:286::-;;;;;;:::i;:::-;;:::i;45989:202::-;;;;;;:::i;:::-;;:::i;49203:272::-;;;;;;:::i;:::-;;:::i;43754:276::-;;;;;;:::i;:::-;;:::i;49626:306::-;;;;;;:::i;:::-;;:::i;31610:357::-;;;;;;:::i;:::-;;:::i;47015:262::-;;;;;;:::i;:::-;;:::i;32986:669::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;43335:230::-;;;;;;:::i;:::-;;:::i;30908:322::-;;;;;;:::i;:::-;;:::i;50184:274::-;;;;;;:::i;:::-;;:::i;35216:371::-;;;;;;:::i;:::-;;:::i;34327:155::-;;;;;;:::i;:::-;;:::i;44371:474::-;;;;;;:::i;:::-;;:::i;47423:296::-;;;;;;:::i;:::-;;:::i;30592:275::-;;;;;;:::i;:::-;;:::i;37576:243::-;;;;;;:::i;:::-;;:::i;47971:255::-;48119:31;;-1:-1:-1;;;48119:31:0;;48139:10;48119:31;;;5577:51:1;48082:7:0;;;;-1:-1:-1;;;;;48119:19:0;;;;;5550:18:1;;48119:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48102:48;;48168:50;48176:9;48187:7;48196:6;48204:10;48216:1;48168:7;:50::i;:::-;48161:57;;;47971:255;;;;;:::o;35595:154::-;35648:21;:25;35644:97;;35675:66;35707:10;35719:21;35675:31;:66::i;:::-;35595:154::o;45566:234::-;45705:27;;-1:-1:-1;;;45705:27:0;;45721:10;45705:27;;;5577:51:1;45668:7:0;;;;-1:-1:-1;;;;;45705:15:0;;;;;5550:18:1;;45705:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45688:44;;45750:42;45757:5;45764:6;45772:10;45784:7;45750:6;:42::i;45208:204::-;45335:7;45362:42;45369:5;45376:6;45384:10;45396:7;45362:6;:42::i;:::-;45355:49;45208:204;-1:-1:-1;;;;45208:204:0:o;42826:308::-;42994:7;43014:54;43030:5;-1:-1:-1;;;;;43030:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43046:6;43062:4;43014:9;:54::i;:::-;43086:40;43094:5;43101:6;43109:2;43113:12;43086:7;:40::i;:::-;43079:47;42826:308;-1:-1:-1;;;;;42826:308:0:o;36260:276::-;36475:22;;-1:-1:-1;;;36475:22:0;;;;;12052:25:1;;;-1:-1:-1;;;;;12113:32:1;;;12093:18;;;12086:60;36425:16:0;;36502:11;;36475:10;;;;;12025:18:1;;36475:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36464:33;;;36463:50;;36454:74;;;;-1:-1:-1;;;36454:74:0;;12359:2:1;36454:74:0;;;12341:21:1;12398:2;12378:18;;;12371:30;-1:-1:-1;;;12417:18:1;;;12410:40;12467:18;;36454:74:0;;;;;;;;48452:562;48741:57;;-1:-1:-1;;;48741:57:0;;48764:10;48741:57;;;12736:34:1;48784:4:0;12786:18:1;;;12779:43;12838:18;;;12831:34;;;48650:7:0;;-1:-1:-1;;;;;48741:22:0;;;;;12671:18:1;;48741:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;48903:41:0;;-1:-1:-1;;;48903:41:0;;;;;12052:25:1;;;48938:4:0;12093:18:1;;;12086:60;48884:16:0;;-1:-1:-1;;;;;48903:18:0;;;;;12025::1;;48903:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48884:60;;48962:44;48970:7;48979:8;48989:2;48993:12;48962:7;:44::i;:::-;48955:51;48452:562;-1:-1:-1;;;;;;;48452:562:0:o;34862:150::-;34913:21;:25;34909:76;;34940:5;-1:-1:-1;;;;;34940:13:0;;34961:21;34940:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34862:150::o;31271:298::-;31471:90;;-1:-1:-1;;;31471:90:0;;31505:10;31471:90;;;13529:34:1;31525:4:0;13579:18:1;;;13572:43;13631:18;;;13624:34;;;13674:18;;;13667:34;;;31547:4:0;13717:19:1;;;13710:51;13810:4;13798:17;;13777:19;;;13770:46;13832:19;;;13825:35;;;13876:19;;;13869:35;;;-1:-1:-1;;;;;31471:33:0;;;;;13463:19:1;;31471:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31271:298;;;;;;:::o;34490:364::-;34602:30;;-1:-1:-1;;;34602:30:0;;34626:4;34602:30;;;5577:51:1;34579:20:0;;34602:5;-1:-1:-1;;;;;34602:15:0;;;;5550:18:1;;34602:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34579:53;;34667:13;34651:12;:29;;34643:60;;;;-1:-1:-1;;;34643:60:0;;14117:2:1;34643:60:0;;;14099:21:1;14156:2;14136:18;;;14129:30;-1:-1:-1;;;14175:18:1;;;14168:48;14233:18;;34643:60:0;13915:342:1;34643:60:0;34720:16;;34716:131;;34753:28;;-1:-1:-1;;;34753:28:0;;;;;1517:25:1;;;34753:5:0;-1:-1:-1;;;;;34753:14:0;;;;1490:18:1;;34753:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34796:39:0;;-1:-1:-1;;;;;;;;34796:25:0;;34822:12;34796:25;:39::i;:::-;34568:286;34490:364;;:::o;46416:422::-;46610:7;46705:14;46722:48;46729:9;46740:6;46756:4;46763:6;46722;:48::i;36922:247::-;37114:47;;-1:-1:-1;;;37114:47:0;;;;;14493:25:1;;;-1:-1:-1;;;;;14592:15:1;;;14572:18;;;14565:43;37141:10:0;14624:18:1;;;14617:43;14676:18;;;14669:34;;;37087:7:0;;37114:14;;;;;;14465:19:1;;37114:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37869:303::-;38096:36;;-1:-1:-1;;;38096:36:0;;;;;14916:25:1;;;-1:-1:-1;;;;;15015:15:1;;;14995:18;;;14988:43;38121:10:0;15047:18:1;;;15040:43;38044:17:0;;38137:12;;38096;;;;;14889:18:1;;38096:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38084:48;;;38083:66;;38074:90;;;;-1:-1:-1;;;38074:90:0;;15296:2:1;38074:90:0;;;15278:21:1;15335:2;15315:18;;;15308:30;-1:-1:-1;;;15354:18:1;;;15347:40;15404:18;;38074:90:0;15094:334:1;37219:307:0;37448:38;;-1:-1:-1;;;37448:38:0;;;;;14916:25:1;;;-1:-1:-1;;;;;15015:15:1;;;14995:18;;;14988:43;37475:10:0;15047:18:1;;;15040:43;37396:17:0;;37491:12;;37448:14;;;;;14889:18:1;;37448:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37436:50;;;37435:68;;37426:92;;;;-1:-1:-1;;;37426:92:0;;15635:2:1;37426:92:0;;;15617:21:1;15674:2;15654:18;;;15647:30;-1:-1:-1;;;15693:18:1;;;15686:40;15743:18;;37426:92:0;15433:334:1;35020:188:0;35147:53;-1:-1:-1;;;;;35147:22:0;;35170:10;35182:9;35193:6;35147:22;:53::i;36586:286::-;36807:25;;-1:-1:-1;;;36807:25:0;;;;;12052::1;;;-1:-1:-1;;;;;12113:32:1;;;12093:18;;;12086:60;36755:17:0;;36837:12;;36807:13;;;;;12025:18:1;;36807:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36795:37;;;36794:55;;36785:79;;;;-1:-1:-1;;;36785:79:0;;15974:2:1;36785:79:0;;;15956:21:1;16013:2;15993:18;;;15986:30;-1:-1:-1;;;16032:18:1;;;16025:40;16082:18;;36785:79:0;15772:334:1;45989:202:0;46102:27;;-1:-1:-1;;;46102:27:0;;46118:10;46102:27;;;5577:51:1;46065:7:0;;;;-1:-1:-1;;;;;46102:15:0;;;;;5550:18:1;;46102:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46085:44;;46147:36;46154:5;46161:6;46169:10;46181:1;46147:6;:36::i;:::-;46140:43;45989:202;-1:-1:-1;;;45989:202:0:o;49203:272::-;49373:7;49400:67;49414:9;49425:7;49434:6;49442:10;49454:12;49400:13;:67::i;43754:276::-;43870:7;43890:14;43913:5;-1:-1:-1;;;;;43913:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43907:42;;-1:-1:-1;;;43907:42:0;;43938:10;43907:42;;;5577:51:1;-1:-1:-1;;;;;43907:30:0;;;;;;;5550:18:1;;43907:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43890:59;;43967:55;43982:5;43989:6;43997:10;44009:12;43967:14;:55::i;49626:306::-;49808:31;;-1:-1:-1;;;49808:31:0;;49828:10;49808:31;;;5577:51:1;49771:7:0;;;;-1:-1:-1;;;;;49808:19:0;;;;;5550:18:1;;49808:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49791:48;;49857:67;49871:9;49882:7;49891:6;49899:10;49911:12;49857:13;:67::i;31610:357::-;31827:49;;-1:-1:-1;;;31827:49:0;;31850:10;31827:49;;;16323:34:1;31870:4:0;16373:18:1;;;16366:43;-1:-1:-1;;31879:17:0;-1:-1:-1;;;;;31827:22:0;;;;;16258:18:1;;31827:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:69;31823:136;;;31911:48;31929:5;31936;31943:6;31951:1;31954;31957;31911:17;:48::i;:::-;31610:357;;;;;;:::o;47015:262::-;47181:7;47208:61;47216:9;47227:7;47236:6;47244:10;47256:12;47208:7;:61::i;32986:669::-;33061:22;33118:4;33106:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33096:34;;33146:9;33141:507;33161:15;;;33141:507;;;33199:12;;33244:4;33263;;33268:1;33263:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;33236:35;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33198:73;;;;33293:7;33288:313;;33422:2;33406:6;:13;:18;33402:32;;;33426:8;;;33402:32;33507:4;33499:6;33495:17;33485:27;;33567:6;33556:28;;;;;;;;;;;;:::i;:::-;33549:36;;-1:-1:-1;;;33549:36:0;;;;;;;;:::i;33288:313::-;33630:6;33617:7;33625:1;33617:10;;;;;;;;:::i;:::-;;;;;;:19;;;;33183:465;;33178:3;;;;;:::i;:::-;;;;33141:507;;;;32986:669;;;;:::o;43335:230::-;43475:7;43502:55;43517:5;43524:6;43532:10;43544:12;43502:14;:55::i;30908:322::-;31120:49;;-1:-1:-1;;;31120:49:0;;31143:10;31120:49;;;16323:34:1;31163:4:0;16373:18:1;;;16366:43;31172:5:0;;-1:-1:-1;;;;;31120:22:0;;;;;16258:18:1;;31120:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;31116:106;;;31179:43;31190:5;31197;31204:8;31214:1;31217;31220;31179:10;:43::i;50184:274::-;50345:31;;-1:-1:-1;;;50345:31:0;;50365:10;50345:31;;;5577:51:1;50298:17:0;;;;-1:-1:-1;;;;;50345:19:0;;;;;5550:18:1;;50345:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50328:48;;50394:56;50408:9;50419:7;50428:6;50436:10;50448:1;50394:13;:56::i;35216:371::-;35374:30;;-1:-1:-1;;;35374:30:0;;35398:4;35374:30;;;5577:51:1;35351:20:0;;-1:-1:-1;;;;;35374:15:0;;;;;5550:18:1;;35374:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35351:53;;35439:13;35423:12;:29;;35415:60;;;;-1:-1:-1;;;35415:60:0;;18862:2:1;35415:60:0;;;18844:21:1;18901:2;18881:18;;;18874:30;-1:-1:-1;;;18920:18:1;;;18913:48;18978:18;;35415:60:0;18660:342:1;35415:60:0;35492:16;;35488:92;;35525:43;-1:-1:-1;;;;;35525:18:0;;35544:9;35555:12;35525:18;:43::i;:::-;35340:247;35216:371;;;:::o;34327:155::-;34445:29;-1:-1:-1;;;;;34445:17:0;;34463:2;34467:6;34445:17;:29::i;44371:474::-;44455:7;44475:14;44499:5;-1:-1:-1;;;;;44499:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44493:42;;-1:-1:-1;;;44493:42:0;;44524:10;44493:42;;;5577:51:1;-1:-1:-1;;;;;44493:30:0;;;;;;;5550:18:1;;44493:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44475:60;;44696:20;44758:6;44719:5;-1:-1:-1;;;;;44719:20:0;;44740:6;44719:28;;;;;;;;;;;;;1517:25:1;;1505:2;1490:18;;1371:177;44719:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;;44750:5;44719:36;:::i;:::-;:45;;;;:::i;:::-;44696:68;;44782:55;44797:5;44804:6;44812:10;44824:12;44782:14;:55::i;47423:296::-;47601:31;;-1:-1:-1;;;47601:31:0;;47621:10;47601:31;;;5577:51:1;47564:7:0;;;;-1:-1:-1;;;;;47601:19:0;;;;;5550:18:1;;47601:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47584:48;;47650:61;47658:9;47669:7;47678:6;47686:10;47698:12;47650:7;:61::i;30592:275::-;30787:72;;-1:-1:-1;;;30787:72:0;;30807:10;30787:72;;;19751:34:1;30827:4:0;19801:18:1;;;19794:43;19853:18;;;19846:34;;;19896:18;;;19889:34;;;19972:4;19960:17;;19939:19;;;19932:46;19994:19;;;19987:35;;;20038:19;;;20031:35;;;-1:-1:-1;;;;;30787:19:0;;;;;19685::1;;30787:72:0;19402:670:1;37576:243:0;37766:45;;-1:-1:-1;;;37766:45:0;;;;;14493:25:1;;;-1:-1:-1;;;;;14592:15:1;;;14572:18;;;14565:43;37791:10:0;14624:18:1;;;14617:43;14676:18;;;14669:34;;;37739:7:0;;37766:12;;;;;;14465:19:1;;37766:45:0;14262:447:1;19842:305:0;19915:12;20075:1;20072;20069;20066;20058:6;20054:2;20047:5;20042:35;20031:46;;20108:7;20100:39;;;;-1:-1:-1;;;20100:39:0;;20279:2:1;20100:39:0;;;20261:21:1;20318:2;20298:18;;;20291:30;-1:-1:-1;;;20337:18:1;;;20330:49;20396:18;;20100:39:0;20077:343:1;20343:1604:0;20487:12;20618:4;20612:11;-1:-1:-1;;;20744:17:0;20737:93;20878:4;20874:1;20855:17;20851:25;20844:39;20963:2;20958;20939:17;20935:26;20928:38;21044:6;21039:2;21020:17;21016:26;21009:42;21858:2;21855:1;21850:3;21831:17;21828:1;21821:5;21814;21809:52;21372:16;21365:24;21359:2;21341:16;21338:24;21334:1;21330;21324:8;21321:15;21317:46;21314:76;21111:765;21100:776;;;21907:7;21899:40;;;;-1:-1:-1;;;21899:40:0;;20627:2:1;21899:40:0;;;20609:21:1;20666:2;20646:18;;;20639:30;-1:-1:-1;;;20685:18:1;;;20678:50;20745:18;;21899:40:0;20425:344:1;21955:1485:0;22072:12;22203:4;22197:11;-1:-1:-1;;;22329:17:0;22322:93;22463:2;22459:1;22440:17;22436:25;22429:37;22544:6;22539:2;22520:17;22516:26;22509:42;23356:2;23353:1;23349:2;23330:17;23327:1;23320:5;23313;23308:51;22872:16;22865:24;22859:2;22841:16;22838:24;22834:1;22830;22824:8;22821:15;22817:46;22814:76;22611:763;22600:774;;;23405:7;23397:35;;;;-1:-1:-1;;;23397:35:0;;20976:2:1;23397:35:0;;;20958:21:1;21015:2;20995:18;;;20988:30;-1:-1:-1;;;21034:18:1;;;21027:45;21089:18;;23397:35:0;20774:339:1;23448:1483:0;23564:12;23695:4;23689:11;-1:-1:-1;;;23821:17:0;23814:93;23955:2;23951:1;23932:17;23928:25;23921:37;24036:6;24031:2;24012:17;24008:26;24001:42;24848:2;24845:1;24841:2;24822:17;24819:1;24812:5;24805;24800:51;24364:16;24357:24;24351:2;24333:16;24330:24;24326:1;24322;24316:8;24313:15;24309:46;24306:76;24103:763;24092:774;;;24897:7;24889:34;;;;-1:-1:-1;;;24889:34:0;;21320:2:1;24889:34:0;;;21302:21:1;21359:2;21339:18;;;21332:30;-1:-1:-1;;;21378:18:1;;;21371:44;21432:18;;24889:34:0;21118:338:1;14:250;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:1;238:16;;231:27;14:250::o;269:271::-;311:3;349:5;343:12;376:6;371:3;364:19;392:76;461:6;454:4;449:3;445:14;438:4;431:5;427:16;392:76;:::i;:::-;522:2;501:15;-1:-1:-1;;497:29:1;488:39;;;;529:4;484:50;;269:271;-1:-1:-1;;269:271:1:o;545:220::-;694:2;683:9;676:21;657:4;714:45;755:2;744:9;740:18;732:6;714:45;:::i;770:143::-;-1:-1:-1;;;;;857:31:1;;847:42;;837:70;;903:1;900;893:12;837:70;770:143;:::o;918:448::-;1022:6;1030;1083:2;1071:9;1062:7;1058:23;1054:32;1051:52;;;1099:1;1096;1089:12;1051:52;1138:9;1125:23;1157:43;1194:5;1157:43;:::i;:::-;1219:5;-1:-1:-1;1276:2:1;1261:18;;1248:32;1289:45;1248:32;1289:45;:::i;:::-;1353:7;1343:17;;;918:448;;;;;:::o;1553:345::-;1639:6;1647;1700:2;1688:9;1679:7;1675:23;1671:32;1668:52;;;1716:1;1713;1706:12;1668:52;1755:9;1742:23;1774:43;1811:5;1774:43;:::i;:::-;1836:5;1888:2;1873:18;;;;1860:32;;-1:-1:-1;;;1553:345:1:o;1903:413::-;1998:6;2006;2014;2067:2;2055:9;2046:7;2042:23;2038:32;2035:52;;;2083:1;2080;2073:12;2035:52;2122:9;2109:23;2141:43;2178:5;2141:43;:::i;:::-;2203:5;2255:2;2240:18;;2227:32;;-1:-1:-1;2306:2:1;2291:18;;;2278:32;;1903:413;-1:-1:-1;;;1903:413:1:o;2321:567::-;2425:6;2433;2441;2449;2502:3;2490:9;2481:7;2477:23;2473:33;2470:53;;;2519:1;2516;2509:12;2470:53;2558:9;2545:23;2577:43;2614:5;2577:43;:::i;:::-;2639:5;-1:-1:-1;2691:2:1;2676:18;;2663:32;;-1:-1:-1;2747:2:1;2732:18;;2719:32;2760:45;2719:32;2760:45;:::i;:::-;2321:567;;;;-1:-1:-1;2824:7:1;;2878:2;2863:18;2850:32;;-1:-1:-1;;2321:567:1:o;2893:738::-;3023:6;3031;3039;3047;3055;3108:3;3096:9;3087:7;3083:23;3079:33;3076:53;;;3125:1;3122;3115:12;3076:53;3164:9;3151:23;3183:43;3220:5;3183:43;:::i;:::-;3245:5;-1:-1:-1;3302:2:1;3287:18;;3274:32;3315:45;3274:32;3315:45;:::i;:::-;3379:7;-1:-1:-1;3433:2:1;3418:18;;3405:32;;-1:-1:-1;3489:2:1;3474:18;;3461:32;3502:45;3461:32;3502:45;:::i;:::-;2893:738;;;;-1:-1:-1;2893:738:1;;3620:3;3605:19;3592:33;;2893:738;-1:-1:-1;;2893:738:1:o;3636:699::-;3738:6;3746;3754;3762;3770;3778;3831:3;3819:9;3810:7;3806:23;3802:33;3799:53;;;3848:1;3845;3838:12;3799:53;3887:9;3874:23;3906:43;3943:5;3906:43;:::i;:::-;3968:5;-1:-1:-1;4020:2:1;4005:18;;3992:32;;-1:-1:-1;4071:2:1;4056:18;;4043:32;;-1:-1:-1;4127:2:1;4112:18;;4099:32;4175:4;4162:18;;4150:31;;4140:59;;4195:1;4192;4185:12;4140:59;3636:699;;;;-1:-1:-1;3636:699:1;;4272:3;4257:19;;4244:33;;4324:3;4309:19;;;4296:33;;-1:-1:-1;3636:699:1;-1:-1:-1;;3636:699:1:o;4340:327::-;4408:6;4416;4469:2;4457:9;4448:7;4444:23;4440:32;4437:52;;;4485:1;4482;4475:12;4437:52;4521:9;4508:23;4498:33;;4581:2;4570:9;4566:18;4553:32;4594:43;4631:5;4594:43;:::i;5639:493::-;5729:6;5737;5745;5798:2;5786:9;5777:7;5773:23;5769:32;5766:52;;;5814:1;5811;5804:12;5766:52;5853:9;5840:23;5872:43;5909:5;5872:43;:::i;:::-;5934:5;-1:-1:-1;5986:2:1;5971:18;;5958:32;;-1:-1:-1;6042:2:1;6027:18;;6014:32;6055:45;6014:32;6055:45;:::i;:::-;6119:7;6109:17;;;5639:493;;;;;:::o;6137:277::-;6214:6;6267:2;6255:9;6246:7;6242:23;6238:32;6235:52;;;6283:1;6280;6273:12;6235:52;6322:9;6309:23;6341:43;6378:5;6341:43;:::i;6419:584::-;6540:6;6548;6556;6564;6617:3;6605:9;6596:7;6592:23;6588:33;6585:53;;;6634:1;6631;6624:12;6585:53;6673:9;6660:23;6692:43;6729:5;6692:43;:::i;:::-;6754:5;-1:-1:-1;6811:2:1;6796:18;;6783:32;6824:45;6783:32;6824:45;:::i;:::-;6419:584;;6888:7;;-1:-1:-1;;;;6942:2:1;6927:18;;6914:32;;6993:2;6978:18;6965:32;;6419:584::o;7008:515::-;7120:6;7128;7136;7189:2;7177:9;7168:7;7164:23;7160:32;7157:52;;;7205:1;7202;7195:12;7157:52;7244:9;7231:23;7263:43;7300:5;7263:43;:::i;:::-;7325:5;-1:-1:-1;7382:2:1;7367:18;;7354:32;7395:45;7354:32;7395:45;:::i;:::-;7008:515;;7459:7;;-1:-1:-1;;;7513:2:1;7498:18;;;;7485:32;;7008:515::o;8118:626::-;8215:6;8223;8276:2;8264:9;8255:7;8251:23;8247:32;8244:52;;;8292:1;8289;8282:12;8244:52;8332:9;8319:23;8361:18;8402:2;8394:6;8391:14;8388:34;;;8418:1;8415;8408:12;8388:34;8456:6;8445:9;8441:22;8431:32;;8501:7;8494:4;8490:2;8486:13;8482:27;8472:55;;8523:1;8520;8513:12;8472:55;8563:2;8550:16;8589:2;8581:6;8578:14;8575:34;;;8605:1;8602;8595:12;8575:34;8658:7;8653:2;8643:6;8640:1;8636:14;8632:2;8628:23;8624:32;8621:45;8618:65;;;8679:1;8676;8669:12;8618:65;8710:2;8702:11;;;;;8732:6;;-1:-1:-1;8118:626:1;;-1:-1:-1;;;;8118:626:1:o;8749:801::-;8909:4;8938:2;8978;8967:9;8963:18;9008:2;8997:9;8990:21;9031:6;9066;9060:13;9097:6;9089;9082:22;9135:2;9124:9;9120:18;9113:25;;9197:2;9187:6;9184:1;9180:14;9169:9;9165:30;9161:39;9147:53;;9235:2;9227:6;9223:15;9256:1;9266:255;9280:6;9277:1;9274:13;9266:255;;;9373:2;9369:7;9357:9;9349:6;9345:22;9341:36;9336:3;9329:49;9401:40;9434:6;9425;9419:13;9401:40;:::i;:::-;9391:50;-1:-1:-1;9499:12:1;;;;9464:15;;;;9302:1;9295:9;9266:255;;;-1:-1:-1;9538:6:1;;8749:801;-1:-1:-1;;;;;;;8749:801:1:o;11421:184::-;11491:6;11544:2;11532:9;11523:7;11519:23;11515:32;11512:52;;;11560:1;11557;11550:12;11512:52;-1:-1:-1;11583:16:1;;11421:184;-1:-1:-1;11421:184:1:o;11610:263::-;11680:6;11733:2;11721:9;11712:7;11708:23;11704:32;11701:52;;;11749:1;11746;11739:12;11701:52;11781:9;11775:16;11800:43;11837:5;11800:43;:::i;12876:277::-;12943:6;12996:2;12984:9;12975:7;12971:23;12967:32;12964:52;;;13012:1;13009;13002:12;12964:52;13044:9;13038:16;13097:5;13090:13;13083:21;13076:5;13073:32;13063:60;;13119:1;13116;13109:12;16420:127;16481:10;16476:3;16472:20;16469:1;16462:31;16512:4;16509:1;16502:15;16536:4;16533:1;16526:15;16552:127;16613:10;16608:3;16604:20;16601:1;16594:31;16644:4;16641:1;16634:15;16668:4;16665:1;16658:15;16684:521;16761:4;16767:6;16827:11;16814:25;16921:2;16917:7;16906:8;16890:14;16886:29;16882:43;16862:18;16858:68;16848:96;;16940:1;16937;16930:12;16848:96;16967:33;;17019:20;;;-1:-1:-1;17062:18:1;17051:30;;17048:50;;;17094:1;17091;17084:12;17048:50;17127:4;17115:17;;-1:-1:-1;17158:14:1;17154:27;;;17144:38;;17141:58;;;17195:1;17192;17185:12;17141:58;16684:521;;;;;:::o;17210:271::-;17393:6;17385;17380:3;17367:33;17349:3;17419:16;;17444:13;;;17419:16;17210:271;-1:-1:-1;17210:271:1:o;17486:897::-;17566:6;17619:2;17607:9;17598:7;17594:23;17590:32;17587:52;;;17635:1;17632;17625:12;17587:52;17668:9;17662:16;17697:18;17738:2;17730:6;17727:14;17724:34;;;17754:1;17751;17744:12;17724:34;17792:6;17781:9;17777:22;17767:32;;17837:7;17830:4;17826:2;17822:13;17818:27;17808:55;;17859:1;17856;17849:12;17808:55;17888:2;17882:9;17910:2;17906;17903:10;17900:36;;;17916:18;;:::i;:::-;17991:2;17985:9;17959:2;18045:13;;-1:-1:-1;;18041:22:1;;;18065:2;18037:31;18033:40;18021:53;;;18089:18;;;18109:22;;;18086:46;18083:72;;;18135:18;;:::i;:::-;18175:10;18171:2;18164:22;18210:2;18202:6;18195:18;18250:7;18245:2;18240;18236;18232:11;18228:20;18225:33;18222:53;;;18271:1;18268;18261:12;18222:53;18284:68;18349:2;18344;18336:6;18332:15;18327:2;18323;18319:11;18284:68;:::i;18388:127::-;18449:10;18444:3;18440:20;18437:1;18430:31;18480:4;18477:1;18470:15;18504:4;18501:1;18494:15;18520:135;18559:3;18580:17;;;18577:43;;18600:18;;:::i;:::-;-1:-1:-1;18647:1:1;18636:13;;18520:135::o;19007:168::-;19080:9;;;19111;;19128:15;;;19122:22;;19108:37;19098:71;;19149:18;;:::i;19180:217::-;19220:1;19246;19236:132;;19290:10;19285:3;19281:20;19278:1;19271:31;19325:4;19322:1;19315:15;19353:4;19350:1;19343:15;19236:132;-1:-1:-1;19382:9:1;;19180:217::o

Swarm Source

ipfs://187c490dbdf81e46d460136257a8b4a477c5b7b59c6b04d825a80b7f458070b8

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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.