ETH Price: $2,451.60 (+2.35%)

Contract

0xF99bc624ecd66700FD024A2A77112f27ec4B0f13
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Redeem182858412023-10-05 17:35:59335 days ago1696527359IN
0xF99bc624...7ec4B0f13
0 ETH0.0010535517.23046423
Deposit182727112023-10-03 21:33:47337 days ago1696368827IN
0xF99bc624...7ec4B0f13
0 ETH0.0011283413.27058958
Deposit182727032023-10-03 21:32:11337 days ago1696368731IN
0xF99bc624...7ec4B0f13
0 ETH0.001126613.64180382
Redeem182727012023-10-03 21:31:47337 days ago1696368707IN
0xF99bc624...7ec4B0f13
0 ETH0.0011484113.83484276
Redeem182700662023-10-03 12:39:23337 days ago1696336763IN
0xF99bc624...7ec4B0f13
0 ETH0.000602719.14468741
Redeem182678442023-10-03 5:12:47337 days ago1696309967IN
0xF99bc624...7ec4B0f13
0 ETH0.0008106112.2968192
Redeem182677112023-10-03 4:45:59337 days ago1696308359IN
0xF99bc624...7ec4B0f13
0 ETH0.000236586.78080855
Redeem182677102023-10-03 4:45:47337 days ago1696308347IN
0xF99bc624...7ec4B0f13
0 ETH0.000398026.03894125
Redeem182674262023-10-03 3:47:59337 days ago1696304879IN
0xF99bc624...7ec4B0f13
0 ETH0.000538518.16916474
Redeem182658352023-10-02 22:28:11338 days ago1696285691IN
0xF99bc624...7ec4B0f13
0 ETH0.0010487715.91242386
Redeem182657562023-10-02 22:12:23338 days ago1696284743IN
0xF99bc624...7ec4B0f13
0 ETH0.0015412823.385038
Redeem182657512023-10-02 22:11:23338 days ago1696284683IN
0xF99bc624...7ec4B0f13
0 ETH0.0014105821.39811133
Withdraw182657372023-10-02 22:08:35338 days ago1696284515IN
0xF99bc624...7ec4B0f13
0 ETH0.0012761119.37472365
Deposit182656922023-10-02 21:59:35338 days ago1696283975IN
0xF99bc624...7ec4B0f13
0 ETH0.0021882625.7364173
Harvest Vault182656752023-10-02 21:55:59338 days ago1696283759IN
0xF99bc624...7ec4B0f13
0 ETH0.0029376725.34622814
Deposit182656332023-10-02 21:47:35338 days ago1696283255IN
0xF99bc624...7ec4B0f13
0 ETH0.0020982624.68135592
Redeem182656172023-10-02 21:44:23338 days ago1696283063IN
0xF99bc624...7ec4B0f13
0 ETH0.0014937222.66341019
Redeem182656132023-10-02 21:43:35338 days ago1696283015IN
0xF99bc624...7ec4B0f13
0 ETH0.0014615322.17100599
Redeem182656122023-10-02 21:43:23338 days ago1696283003IN
0xF99bc624...7ec4B0f13
0 ETH0.0014401921.84729128
Deposit182656052023-10-02 21:41:59338 days ago1696282919IN
0xF99bc624...7ec4B0f13
0 ETH0.0022076521.61953094
Deposit182655882023-10-02 21:38:35338 days ago1696282715IN
0xF99bc624...7ec4B0f13
0 ETH0.0014856414.11541811
Deposit182655642023-10-02 21:33:47338 days ago1696282427IN
0xF99bc624...7ec4B0f13
0 ETH0.0007461414.24513745
Deposit182655632023-10-02 21:33:35338 days ago1696282415IN
0xF99bc624...7ec4B0f13
0 ETH0.0012342114.51784143
Deposit182655332023-10-02 21:27:35338 days ago1696282055IN
0xF99bc624...7ec4B0f13
0 ETH0.0014726914.42208861
Deposit182655172023-10-02 21:24:23338 days ago1696281863IN
0xF99bc624...7ec4B0f13
0 ETH0.0017359317
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Vault

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
File 1 of 8 : Vault.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
import {Owned} from "solmate/auth/Owned.sol";
import {SafeTransferLib} from "solmate/utils/SafeTransferLib.sol";
import {ERC20} from "solmate/tokens/ERC20.sol";
import {WETH} from "solmate/tokens/WETH.sol";
import {ERC4626} from "solmate/mixins/ERC4626.sol";
import {IUniswapV2Router} from "./interfaces/IUniswapV2Router.sol";

contract Vault is ERC4626, Owned {
    using SafeTransferLib for ERC20;
    ERC20 public underlying;
    WETH public weth;
    IUniswapV2Router uniswapV2Router;
    mapping(address => uint256) public shares;

    constructor(
        ERC20 _underlying,
        address uniV2Router
    )
        ERC4626(
            _underlying,
            string(abi.encodePacked("Enshrined ", _underlying.name())),
            string(abi.encodePacked("s", _underlying.symbol()))
        )
        Owned(msg.sender)
    {
        underlying = _underlying;
        uniswapV2Router = IUniswapV2Router(uniV2Router);

        weth = WETH(payable(uniswapV2Router.WETH()));

        weth.approve(uniV2Router, type(uint256).max);
    }

    function harvestVault() public onlyOwner {
        uint256 wethBalance = weth.balanceOf(address(this));
        swapForUnderlying(wethBalance);
    }

    function swapForUnderlying(uint256 amount) internal {
        address[] memory path = new address[](2);
        path[0] = address(weth);
        path[1] = address(underlying);
        uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function totalAssets() public view virtual override returns (uint256) {
        return underlying.balanceOf(address(this));
    }
}

File 2 of 8 : Owned.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Simple single owner authorization mixin.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Owned.sol)
abstract contract Owned {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event OwnershipTransferred(address indexed user, address indexed newOwner);

    /*//////////////////////////////////////////////////////////////
                            OWNERSHIP STORAGE
    //////////////////////////////////////////////////////////////*/

    address public owner;

    modifier onlyOwner() virtual {
        require(msg.sender == owner, "UNAUTHORIZED");

        _;
    }

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

    constructor(address _owner) {
        owner = _owner;

        emit OwnershipTransferred(address(0), _owner);
    }

    /*//////////////////////////////////////////////////////////////
                             OWNERSHIP LOGIC
    //////////////////////////////////////////////////////////////*/

    function transferOwnership(address newOwner) public virtual onlyOwner {
        owner = newOwner;

        emit OwnershipTransferred(msg.sender, newOwner);
    }
}

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

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

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

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

        /// @solidity memory-safe-assembly
        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;

        /// @solidity memory-safe-assembly
        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), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "from" argument.
            mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.

            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;

        /// @solidity memory-safe-assembly
        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), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.

            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;

        /// @solidity memory-safe-assembly
        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), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.

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

        require(success, "APPROVE_FAILED");
    }
}

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

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

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

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

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

    string public name;

    string public symbol;

    uint8 public immutable decimals;

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

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

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

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

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

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

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

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

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

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

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

        return true;
    }

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

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

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

        return true;
    }

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

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

        balanceOf[from] -= amount;

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

        emit Transfer(from, to, amount);

        return true;
    }

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

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

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

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

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    event Deposit(address indexed from, uint256 amount);

    event Withdrawal(address indexed to, uint256 amount);

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

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

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

        emit Withdrawal(msg.sender, amount);

        msg.sender.safeTransferETH(amount);
    }

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

File 6 of 8 : ERC4626.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

import {ERC20} from "../tokens/ERC20.sol";
import {SafeTransferLib} from "../utils/SafeTransferLib.sol";
import {FixedPointMathLib} from "../utils/FixedPointMathLib.sol";

/// @notice Minimal ERC4626 tokenized Vault implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/mixins/ERC4626.sol)
abstract contract ERC4626 is ERC20 {
    using SafeTransferLib for ERC20;
    using FixedPointMathLib for uint256;

    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Deposit(address indexed caller, address indexed owner, uint256 assets, uint256 shares);

    event Withdraw(
        address indexed caller,
        address indexed receiver,
        address indexed owner,
        uint256 assets,
        uint256 shares
    );

    /*//////////////////////////////////////////////////////////////
                               IMMUTABLES
    //////////////////////////////////////////////////////////////*/

    ERC20 public immutable asset;

    constructor(
        ERC20 _asset,
        string memory _name,
        string memory _symbol
    ) ERC20(_name, _symbol, _asset.decimals()) {
        asset = _asset;
    }

    /*//////////////////////////////////////////////////////////////
                        DEPOSIT/WITHDRAWAL LOGIC
    //////////////////////////////////////////////////////////////*/

    function deposit(uint256 assets, address receiver) public virtual returns (uint256 shares) {
        // Check for rounding error since we round down in previewDeposit.
        require((shares = previewDeposit(assets)) != 0, "ZERO_SHARES");

        // Need to transfer before minting or ERC777s could reenter.
        asset.safeTransferFrom(msg.sender, address(this), assets);

        _mint(receiver, shares);

        emit Deposit(msg.sender, receiver, assets, shares);

        afterDeposit(assets, shares);
    }

    function mint(uint256 shares, address receiver) public virtual returns (uint256 assets) {
        assets = previewMint(shares); // No need to check for rounding error, previewMint rounds up.

        // Need to transfer before minting or ERC777s could reenter.
        asset.safeTransferFrom(msg.sender, address(this), assets);

        _mint(receiver, shares);

        emit Deposit(msg.sender, receiver, assets, shares);

        afterDeposit(assets, shares);
    }

    function withdraw(
        uint256 assets,
        address receiver,
        address owner
    ) public virtual returns (uint256 shares) {
        shares = previewWithdraw(assets); // No need to check for rounding error, previewWithdraw rounds up.

        if (msg.sender != owner) {
            uint256 allowed = allowance[owner][msg.sender]; // Saves gas for limited approvals.

            if (allowed != type(uint256).max) allowance[owner][msg.sender] = allowed - shares;
        }

        beforeWithdraw(assets, shares);

        _burn(owner, shares);

        emit Withdraw(msg.sender, receiver, owner, assets, shares);

        asset.safeTransfer(receiver, assets);
    }

    function redeem(
        uint256 shares,
        address receiver,
        address owner
    ) public virtual returns (uint256 assets) {
        if (msg.sender != owner) {
            uint256 allowed = allowance[owner][msg.sender]; // Saves gas for limited approvals.

            if (allowed != type(uint256).max) allowance[owner][msg.sender] = allowed - shares;
        }

        // Check for rounding error since we round down in previewRedeem.
        require((assets = previewRedeem(shares)) != 0, "ZERO_ASSETS");

        beforeWithdraw(assets, shares);

        _burn(owner, shares);

        emit Withdraw(msg.sender, receiver, owner, assets, shares);

        asset.safeTransfer(receiver, assets);
    }

    /*//////////////////////////////////////////////////////////////
                            ACCOUNTING LOGIC
    //////////////////////////////////////////////////////////////*/

    function totalAssets() public view virtual returns (uint256);

    function convertToShares(uint256 assets) public view virtual returns (uint256) {
        uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero.

        return supply == 0 ? assets : assets.mulDivDown(supply, totalAssets());
    }

    function convertToAssets(uint256 shares) public view virtual returns (uint256) {
        uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero.

        return supply == 0 ? shares : shares.mulDivDown(totalAssets(), supply);
    }

    function previewDeposit(uint256 assets) public view virtual returns (uint256) {
        return convertToShares(assets);
    }

    function previewMint(uint256 shares) public view virtual returns (uint256) {
        uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero.

        return supply == 0 ? shares : shares.mulDivUp(totalAssets(), supply);
    }

    function previewWithdraw(uint256 assets) public view virtual returns (uint256) {
        uint256 supply = totalSupply; // Saves an extra SLOAD if totalSupply is non-zero.

        return supply == 0 ? assets : assets.mulDivUp(supply, totalAssets());
    }

    function previewRedeem(uint256 shares) public view virtual returns (uint256) {
        return convertToAssets(shares);
    }

    /*//////////////////////////////////////////////////////////////
                     DEPOSIT/WITHDRAWAL LIMIT LOGIC
    //////////////////////////////////////////////////////////////*/

    function maxDeposit(address) public view virtual returns (uint256) {
        return type(uint256).max;
    }

    function maxMint(address) public view virtual returns (uint256) {
        return type(uint256).max;
    }

    function maxWithdraw(address owner) public view virtual returns (uint256) {
        return convertToAssets(balanceOf[owner]);
    }

    function maxRedeem(address owner) public view virtual returns (uint256) {
        return balanceOf[owner];
    }

    /*//////////////////////////////////////////////////////////////
                          INTERNAL HOOKS LOGIC
    //////////////////////////////////////////////////////////////*/

    function beforeWithdraw(uint256 assets, uint256 shares) internal virtual {}

    function afterDeposit(uint256 assets, uint256 shares) internal virtual {}
}

File 7 of 8 : IUniswapV2Router.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

interface IUniswapV2Router {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);

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

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

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

File 8 of 8 : FixedPointMathLib.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Arithmetic library with operations for fixed-point numbers.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/FixedPointMathLib.sol)
/// @author Inspired by USM (https://github.com/usmfum/USM/blob/master/contracts/WadMath.sol)
library FixedPointMathLib {
    /*//////////////////////////////////////////////////////////////
                    SIMPLIFIED FIXED POINT OPERATIONS
    //////////////////////////////////////////////////////////////*/

    uint256 internal constant MAX_UINT256 = 2**256 - 1;

    uint256 internal constant WAD = 1e18; // The scalar of ETH and most ERC20s.

    function mulWadDown(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivDown(x, y, WAD); // Equivalent to (x * y) / WAD rounded down.
    }

    function mulWadUp(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivUp(x, y, WAD); // Equivalent to (x * y) / WAD rounded up.
    }

    function divWadDown(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivDown(x, WAD, y); // Equivalent to (x * WAD) / y rounded down.
    }

    function divWadUp(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivUp(x, WAD, y); // Equivalent to (x * WAD) / y rounded up.
    }

    /*//////////////////////////////////////////////////////////////
                    LOW LEVEL FIXED POINT OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function mulDivDown(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Equivalent to require(denominator != 0 && (y == 0 || x <= type(uint256).max / y))
            if iszero(mul(denominator, iszero(mul(y, gt(x, div(MAX_UINT256, y)))))) {
                revert(0, 0)
            }

            // Divide x * y by the denominator.
            z := div(mul(x, y), denominator)
        }
    }

    function mulDivUp(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Equivalent to require(denominator != 0 && (y == 0 || x <= type(uint256).max / y))
            if iszero(mul(denominator, iszero(mul(y, gt(x, div(MAX_UINT256, y)))))) {
                revert(0, 0)
            }

            // If x * y modulo the denominator is strictly greater than 0,
            // 1 is added to round up the division of x * y by the denominator.
            z := add(gt(mod(mul(x, y), denominator), 0), div(mul(x, y), denominator))
        }
    }

    function rpow(
        uint256 x,
        uint256 n,
        uint256 scalar
    ) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            switch x
            case 0 {
                switch n
                case 0 {
                    // 0 ** 0 = 1
                    z := scalar
                }
                default {
                    // 0 ** n = 0
                    z := 0
                }
            }
            default {
                switch mod(n, 2)
                case 0 {
                    // If n is even, store scalar in z for now.
                    z := scalar
                }
                default {
                    // If n is odd, store x in z for now.
                    z := x
                }

                // Shifting right by 1 is like dividing by 2.
                let half := shr(1, scalar)

                for {
                    // Shift n right by 1 before looping to halve it.
                    n := shr(1, n)
                } n {
                    // Shift n right by 1 each iteration to halve it.
                    n := shr(1, n)
                } {
                    // Revert immediately if x ** 2 would overflow.
                    // Equivalent to iszero(eq(div(xx, x), x)) here.
                    if shr(128, x) {
                        revert(0, 0)
                    }

                    // Store x squared.
                    let xx := mul(x, x)

                    // Round to the nearest number.
                    let xxRound := add(xx, half)

                    // Revert if xx + half overflowed.
                    if lt(xxRound, xx) {
                        revert(0, 0)
                    }

                    // Set x to scaled xxRound.
                    x := div(xxRound, scalar)

                    // If n is even:
                    if mod(n, 2) {
                        // Compute z * x.
                        let zx := mul(z, x)

                        // If z * x overflowed:
                        if iszero(eq(div(zx, x), z)) {
                            // Revert if x is non-zero.
                            if iszero(iszero(x)) {
                                revert(0, 0)
                            }
                        }

                        // Round to the nearest number.
                        let zxRound := add(zx, half)

                        // Revert if zx + half overflowed.
                        if lt(zxRound, zx) {
                            revert(0, 0)
                        }

                        // Return properly scaled zxRound.
                        z := div(zxRound, scalar)
                    }
                }
            }
        }
    }

    /*//////////////////////////////////////////////////////////////
                        GENERAL NUMBER UTILITIES
    //////////////////////////////////////////////////////////////*/

    function sqrt(uint256 x) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            let y := x // We start y at x, which will help us make our initial estimate.

            z := 181 // The "correct" value is 1, but this saves a multiplication later.

            // This segment is to get a reasonable initial estimate for the Babylonian method. With a bad
            // start, the correct # of bits increases ~linearly each iteration instead of ~quadratically.

            // We check y >= 2^(k + 8) but shift right by k bits
            // each branch to ensure that if x >= 256, then y >= 256.
            if iszero(lt(y, 0x10000000000000000000000000000000000)) {
                y := shr(128, y)
                z := shl(64, z)
            }
            if iszero(lt(y, 0x1000000000000000000)) {
                y := shr(64, y)
                z := shl(32, z)
            }
            if iszero(lt(y, 0x10000000000)) {
                y := shr(32, y)
                z := shl(16, z)
            }
            if iszero(lt(y, 0x1000000)) {
                y := shr(16, y)
                z := shl(8, z)
            }

            // Goal was to get z*z*y within a small factor of x. More iterations could
            // get y in a tighter range. Currently, we will have y in [256, 256*2^16).
            // We ensured y >= 256 so that the relative difference between y and y+1 is small.
            // That's not possible if x < 256 but we can just verify those cases exhaustively.

            // Now, z*z*y <= x < z*z*(y+1), and y <= 2^(16+8), and either y >= 256, or x < 256.
            // Correctness can be checked exhaustively for x < 256, so we assume y >= 256.
            // Then z*sqrt(y) is within sqrt(257)/sqrt(256) of sqrt(x), or about 20bps.

            // For s in the range [1/256, 256], the estimate f(s) = (181/1024) * (s+1) is in the range
            // (1/2.84 * sqrt(s), 2.84 * sqrt(s)), with largest error when s = 1 and when s = 256 or 1/256.

            // Since y is in [256, 256*2^16), let a = y/65536, so that a is in [1/256, 256). Then we can estimate
            // sqrt(y) using sqrt(65536) * 181/1024 * (a + 1) = 181/4 * (y + 65536)/65536 = 181 * (y + 65536)/2^18.

            // There is no overflow risk here since y < 2^136 after the first branch above.
            z := shr(18, mul(z, add(y, 65536))) // A mul() is saved from starting z at 181.

            // Given the worst case multiplicative error of 2.84 above, 7 iterations should be enough.
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))

            // If x+1 is a perfect square, the Babylonian method cycles between
            // floor(sqrt(x)) and ceil(sqrt(x)). This statement ensures we return floor.
            // See: https://en.wikipedia.org/wiki/Integer_square_root#Using_only_integer_division
            // Since the ceil is rare, we save gas on the assignment and repeat division in the rare case.
            // If you don't care whether the floor or ceil square root is returned, you can remove this statement.
            z := sub(z, lt(div(x, z), z))
        }
    }

    function unsafeMod(uint256 x, uint256 y) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Mod x by y. Note this will return
            // 0 instead of reverting if y is zero.
            z := mod(x, y)
        }
    }

    function unsafeDiv(uint256 x, uint256 y) internal pure returns (uint256 r) {
        /// @solidity memory-safe-assembly
        assembly {
            // Divide x by y. Note this will return
            // 0 instead of reverting if y is zero.
            r := div(x, y)
        }
    }

    function unsafeDivUp(uint256 x, uint256 y) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Add 1 to x * y if x % y > 0. Note this will
            // return 0 instead of reverting if y is zero.
            z := add(gt(mod(x, y), 0), div(x, y))
        }
    }
}

Settings
{
  "remappings": [
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "solmate/=lib/solmate/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract ERC20","name":"_underlying","type":"address"},{"internalType":"address","name":"uniV2Router","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"convertToAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"convertToShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"harvestVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"maxRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"maxWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","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":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"previewDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"previewMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"previewRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"previewWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"underlying","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract WETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]

6101006040523480156200001257600080fd5b506040516200204638038062002046833981016040819052620000359162000417565b3382836001600160a01b03166306fdde036040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000076573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620000a0919081019062000492565b604051602001620000b291906200054a565b604051602081830303815290604052846001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000100573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200012a919081019062000492565b6040516020016200013c91906200057e565b6040516020818303038152906040528181846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200018c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001b29190620005a9565b6000620001c0848262000664565b506001620001cf838262000664565b5060ff81166080524660a052620001e562000362565b60c052505050506001600160a01b0391821660e05250600680546001600160a01b03191691831691821790556040516000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600780546001600160a01b038085166001600160a01b031992831617909255600980549284169290911682179055604080516315ab88c960e31b8152905163ad5c4648916004808201926020929091908290030181865afa158015620002a7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002cd919062000730565b600880546001600160a01b0319166001600160a01b0392831690811790915560405163095ea7b360e01b8152918316600483015260001960248301529063095ea7b3906044016020604051808303816000875af115801562000333573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000359919062000750565b505050620007f2565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f600060405162000396919062000774565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b6001600160a01b03811681146200041457600080fd5b50565b600080604083850312156200042b57600080fd5b82516200043881620003fe565b60208401519092506200044b81620003fe565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620004895781810151838201526020016200046f565b50506000910152565b600060208284031215620004a557600080fd5b81516001600160401b0380821115620004bd57600080fd5b818401915084601f830112620004d257600080fd5b815181811115620004e757620004e762000456565b604051601f8201601f19908116603f0116810190838211818310171562000512576200051262000456565b816040528281528760208487010111156200052c57600080fd5b6200053f8360208301602088016200046c565b979650505050505050565b69022b739b43934b732b2160b51b8152600082516200057181600a8501602087016200046c565b91909101600a0192915050565b607360f81b8152600082516200059c8160018501602087016200046c565b9190910160010192915050565b600060208284031215620005bc57600080fd5b815160ff81168114620005ce57600080fd5b9392505050565b600181811c90821680620005ea57607f821691505b6020821081036200060b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200065f57600081815260208120601f850160051c810160208610156200063a5750805b601f850160051c820191505b818110156200065b5782815560010162000646565b5050505b505050565b81516001600160401b0381111562000680576200068062000456565b6200069881620006918454620005d5565b8462000611565b602080601f831160018114620006d05760008415620006b75750858301515b600019600386901b1c1916600185901b1785556200065b565b600085815260208120601f198616915b828110156200070157888601518255948401946001909101908401620006e0565b5085821015620007205787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200074357600080fd5b8151620005ce81620003fe565b6000602082840312156200076357600080fd5b81518015158114620005ce57600080fd5b60008083546200078481620005d5565b600182811680156200079f5760018114620007b557620007e6565b60ff1984168752821515830287019450620007e6565b8760005260208060002060005b85811015620007dd5781548a820152908401908201620007c2565b50505082870194505b50929695505050505050565b60805160a05160c05160e0516117fe62000848600039600081816102e6015281816108700152818161090801528181610aec0152610c2e015260006107e6015260006107b6015260006102a501526117fe6000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80638da5cb5b1161011a578063c6e6f592116100ad578063d905777e1161007c578063d905777e14610496578063dd62ed3e146104bf578063ef8b30f7146104ea578063f2fde38b146104fd578063f3c25ba41461051057600080fd5b8063c6e6f5921461043b578063ce7c2ac21461044e578063ce96cb771461046e578063d505accf1461048157600080fd5b8063b3d7f6b9116100e9578063b3d7f6b914610402578063b460af9414610415578063ba08765214610428578063c63d75b61461033357600080fd5b80638da5cb5b146103c157806394bf804d146103d457806395d89b41146103e7578063a9059cbb146103ef57600080fd5b80633644e5151161019d5780634cdad5061161016c5780634cdad506146103485780636e553f651461035b5780636f307dc31461036e57806370a08231146103815780637ecebe00146103a157600080fd5b80633644e515146102d957806338d52e0f146102e15780633fc8cef314610320578063402d267d1461033357600080fd5b80630a28a477116101d95780630a28a4771461027157806318160ddd1461028457806323b872dd1461028d578063313ce567146102a057600080fd5b806301e1d1141461020b57806306fdde031461022657806307a2d13a1461023b578063095ea7b31461024e575b600080fd5b610213610518565b6040519081526020015b60405180910390f35b61022e61058a565b60405161021d91906113ea565b610213610249366004611438565b610618565b61026161025c36600461146d565b610645565b604051901515815260200161021d565b61021361027f366004611438565b6106b2565b61021360025481565b61026161029b366004611497565b6106d2565b6102c77f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff909116815260200161021d565b6102136107b2565b6103087f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161021d565b600854610308906001600160a01b031681565b6102136103413660046114d3565b5060001990565b610213610356366004611438565b610808565b6102136103693660046114ee565b610813565b600754610308906001600160a01b031681565b61021361038f3660046114d3565b60036020526000908152604090205481565b6102136103af3660046114d3565b60056020526000908152604090205481565b600654610308906001600160a01b031681565b6102136103e23660046114ee565b6108ee565b61022e61097d565b6102616103fd36600461146d565b61098a565b610213610410366004611438565b6109f0565b61021361042336600461151a565b610a0f565b61021361043636600461151a565b610b13565b610213610449366004611438565b610c55565b61021361045c3660046114d3565b600a6020526000908152604090205481565b61021361047c3660046114d3565b610c75565b61049461048f366004611556565b610c97565b005b6102136104a43660046114d3565b6001600160a01b031660009081526003602052604090205490565b6102136104cd3660046115c9565b600460209081526000928352604080842090915290825290205481565b6102136104f8366004611438565b610edb565b61049461050b3660046114d3565b610ee6565b610494610f7b565b6007546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610561573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061058591906115f3565b905090565b600080546105979061160c565b80601f01602080910402602001604051908101604052809291908181526020018280546105c39061160c565b80156106105780601f106105e557610100808354040283529160200191610610565b820191906000526020600020905b8154815290600101906020018083116105f357829003601f168201915b505050505081565b600254600090801561063c5761063761062f610518565b84908361103f565b61063e565b825b9392505050565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906106a09086815260200190565b60405180910390a35060015b92915050565b600254600090801561063c57610637816106ca610518565b85919061105d565b6001600160a01b0383166000908152600460209081526040808320338452909152812054600019811461072e57610709838261165c565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b0385166000908152600360205260408120805485929061075690849061165c565b90915550506001600160a01b03808516600081815260036020526040908190208054870190555190918716906000805160206117a98339815191529061079f9087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146107e357610585611083565b507f000000000000000000000000000000000000000000000000000000000000000090565b60006106ac82610618565b600061081e83610edb565b9050806000036108635760405162461bcd60e51b815260206004820152600b60248201526a5a45524f5f53484152455360a81b60448201526064015b60405180910390fd5b6108986001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633308661111d565b6108a282826111b9565b60408051848152602081018390526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791015b60405180910390a36106ac565b60006108f9836109f0565b90506109306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633308461111d565b61093a82846111b9565b60408051828152602081018590526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791016108e1565b600180546105979061160c565b336000908152600360205260408120805483919083906109ab90849061165c565b90915550506001600160a01b038316600081815260036020526040908190208054850190555133906000805160206117a9833981519152906106a09086815260200190565b600254600090801561063c57610637610a07610518565b84908361105d565b6000610a1a846106b2565b9050336001600160a01b03831614610a8a576001600160a01b03821660009081526004602090815260408083203384529091529020546000198114610a8857610a63828261165c565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b610a948282611213565b60408051858152602081018390526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a461063e6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168486611275565b6000336001600160a01b03831614610b83576001600160a01b03821660009081526004602090815260408083203384529091529020546000198114610b8157610b5c858261165c565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b610b8c84610808565b905080600003610bcc5760405162461bcd60e51b815260206004820152600b60248201526a5a45524f5f41535345545360a81b604482015260640161085a565b610bd68285611213565b60408051828152602081018690526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a461063e6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168483611275565b600254600090801561063c5761063781610c6d610518565b85919061103f565b6001600160a01b0381166000908152600360205260408120546106ac90610618565b42841015610ce75760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f45585049524544000000000000000000604482015260640161085a565b60006001610cf36107b2565b6001600160a01b038a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610dff573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590610e355750876001600160a01b0316816001600160a01b0316145b610e725760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b604482015260640161085a565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b60006106ac82610c55565b6006546001600160a01b03163314610f2f5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015260640161085a565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6006546001600160a01b03163314610fc45760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015260640161085a565b6008546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561100d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103191906115f3565b905061103c816112fc565b50565b600082600019048411830215820261105657600080fd5b5091020490565b600082600019048411830215820261107457600080fd5b50910281810615159190040190565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516110b5919061166f565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60006040516323b872dd60e01b81526001600160a01b03851660048201526001600160a01b03841660248201528260448201526020600060648360008a5af13d15601f3d11600160005114161716915050806111b25760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b604482015260640161085a565b5050505050565b80600260008282546111cb919061170e565b90915550506001600160a01b0382166000818152600360209081526040808320805486019055518481526000805160206117a983398151915291015b60405180910390a35050565b6001600160a01b0382166000908152600360205260408120805483929061123b90849061165c565b90915550506002805482900390556040518181526000906001600160a01b038416906000805160206117a983398151915290602001611207565b600060405163a9059cbb60e01b81526001600160a01b0384166004820152826024820152602060006044836000895af13d15601f3d11600160005114161716915050806112f65760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b604482015260640161085a565b50505050565b604080516002808252606082018352600092602083019080368337505060085482519293506001600160a01b03169183915060009061133d5761133d611721565b6001600160a01b03928316602091820292909201015260075482519116908290600190811061136e5761136e611721565b6001600160a01b039283166020918202929092010152600954604051635c11d79560e01b8152911690635c11d795906113b4908590600090869030904290600401611737565b600060405180830381600087803b1580156113ce57600080fd5b505af11580156113e2573d6000803e3d6000fd5b505050505050565b600060208083528351808285015260005b81811015611417578581018301518582016040015282016113fb565b506000604082860101526040601f19601f8301168501019250505092915050565b60006020828403121561144a57600080fd5b5035919050565b80356001600160a01b038116811461146857600080fd5b919050565b6000806040838503121561148057600080fd5b61148983611451565b946020939093013593505050565b6000806000606084860312156114ac57600080fd5b6114b584611451565b92506114c360208501611451565b9150604084013590509250925092565b6000602082840312156114e557600080fd5b61063e82611451565b6000806040838503121561150157600080fd5b8235915061151160208401611451565b90509250929050565b60008060006060848603121561152f57600080fd5b8335925061153f60208501611451565b915061154d60408501611451565b90509250925092565b600080600080600080600060e0888a03121561157157600080fd5b61157a88611451565b965061158860208901611451565b95506040880135945060608801359350608088013560ff811681146115ac57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156115dc57600080fd5b6115e583611451565b915061151160208401611451565b60006020828403121561160557600080fd5b5051919050565b600181811c9082168061162057607f821691505b60208210810361164057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156106ac576106ac611646565b600080835481600182811c91508083168061168b57607f831692505b602080841082036116aa57634e487b7160e01b86526022600452602486fd5b8180156116be57600181146116d357611700565b60ff1986168952841515850289019650611700565b60008a81526020902060005b868110156116f85781548b8201529085019083016116df565b505084890196505b509498975050505050505050565b808201808211156106ac576106ac611646565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156117875784516001600160a01b031683529383019391830191600101611762565b50506001600160a01b0396909616606085015250505060800152939250505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220dca4597409418d290f26e665cb9335470ecc9eaa7dc378e3bf6de3c537b8fc2e64736f6c634300081400330000000000000000000000002a6da97233d798504008c57a66b6d0a05191ad760000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102065760003560e01c80638da5cb5b1161011a578063c6e6f592116100ad578063d905777e1161007c578063d905777e14610496578063dd62ed3e146104bf578063ef8b30f7146104ea578063f2fde38b146104fd578063f3c25ba41461051057600080fd5b8063c6e6f5921461043b578063ce7c2ac21461044e578063ce96cb771461046e578063d505accf1461048157600080fd5b8063b3d7f6b9116100e9578063b3d7f6b914610402578063b460af9414610415578063ba08765214610428578063c63d75b61461033357600080fd5b80638da5cb5b146103c157806394bf804d146103d457806395d89b41146103e7578063a9059cbb146103ef57600080fd5b80633644e5151161019d5780634cdad5061161016c5780634cdad506146103485780636e553f651461035b5780636f307dc31461036e57806370a08231146103815780637ecebe00146103a157600080fd5b80633644e515146102d957806338d52e0f146102e15780633fc8cef314610320578063402d267d1461033357600080fd5b80630a28a477116101d95780630a28a4771461027157806318160ddd1461028457806323b872dd1461028d578063313ce567146102a057600080fd5b806301e1d1141461020b57806306fdde031461022657806307a2d13a1461023b578063095ea7b31461024e575b600080fd5b610213610518565b6040519081526020015b60405180910390f35b61022e61058a565b60405161021d91906113ea565b610213610249366004611438565b610618565b61026161025c36600461146d565b610645565b604051901515815260200161021d565b61021361027f366004611438565b6106b2565b61021360025481565b61026161029b366004611497565b6106d2565b6102c77f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff909116815260200161021d565b6102136107b2565b6103087f0000000000000000000000002a6da97233d798504008c57a66b6d0a05191ad7681565b6040516001600160a01b03909116815260200161021d565b600854610308906001600160a01b031681565b6102136103413660046114d3565b5060001990565b610213610356366004611438565b610808565b6102136103693660046114ee565b610813565b600754610308906001600160a01b031681565b61021361038f3660046114d3565b60036020526000908152604090205481565b6102136103af3660046114d3565b60056020526000908152604090205481565b600654610308906001600160a01b031681565b6102136103e23660046114ee565b6108ee565b61022e61097d565b6102616103fd36600461146d565b61098a565b610213610410366004611438565b6109f0565b61021361042336600461151a565b610a0f565b61021361043636600461151a565b610b13565b610213610449366004611438565b610c55565b61021361045c3660046114d3565b600a6020526000908152604090205481565b61021361047c3660046114d3565b610c75565b61049461048f366004611556565b610c97565b005b6102136104a43660046114d3565b6001600160a01b031660009081526003602052604090205490565b6102136104cd3660046115c9565b600460209081526000928352604080842090915290825290205481565b6102136104f8366004611438565b610edb565b61049461050b3660046114d3565b610ee6565b610494610f7b565b6007546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610561573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061058591906115f3565b905090565b600080546105979061160c565b80601f01602080910402602001604051908101604052809291908181526020018280546105c39061160c565b80156106105780601f106105e557610100808354040283529160200191610610565b820191906000526020600020905b8154815290600101906020018083116105f357829003601f168201915b505050505081565b600254600090801561063c5761063761062f610518565b84908361103f565b61063e565b825b9392505050565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906106a09086815260200190565b60405180910390a35060015b92915050565b600254600090801561063c57610637816106ca610518565b85919061105d565b6001600160a01b0383166000908152600460209081526040808320338452909152812054600019811461072e57610709838261165c565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b0385166000908152600360205260408120805485929061075690849061165c565b90915550506001600160a01b03808516600081815260036020526040908190208054870190555190918716906000805160206117a98339815191529061079f9087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000146146107e357610585611083565b507fe01e3c68ed837db1c8b5b09744eb8fe6c3f221857e7a62f9f3d025a920aae23790565b60006106ac82610618565b600061081e83610edb565b9050806000036108635760405162461bcd60e51b815260206004820152600b60248201526a5a45524f5f53484152455360a81b60448201526064015b60405180910390fd5b6108986001600160a01b037f0000000000000000000000002a6da97233d798504008c57a66b6d0a05191ad761633308661111d565b6108a282826111b9565b60408051848152602081018390526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791015b60405180910390a36106ac565b60006108f9836109f0565b90506109306001600160a01b037f0000000000000000000000002a6da97233d798504008c57a66b6d0a05191ad761633308461111d565b61093a82846111b9565b60408051828152602081018590526001600160a01b0384169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d791016108e1565b600180546105979061160c565b336000908152600360205260408120805483919083906109ab90849061165c565b90915550506001600160a01b038316600081815260036020526040908190208054850190555133906000805160206117a9833981519152906106a09086815260200190565b600254600090801561063c57610637610a07610518565b84908361105d565b6000610a1a846106b2565b9050336001600160a01b03831614610a8a576001600160a01b03821660009081526004602090815260408083203384529091529020546000198114610a8857610a63828261165c565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b610a948282611213565b60408051858152602081018390526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a461063e6001600160a01b037f0000000000000000000000002a6da97233d798504008c57a66b6d0a05191ad76168486611275565b6000336001600160a01b03831614610b83576001600160a01b03821660009081526004602090815260408083203384529091529020546000198114610b8157610b5c858261165c565b6001600160a01b03841660009081526004602090815260408083203384529091529020555b505b610b8c84610808565b905080600003610bcc5760405162461bcd60e51b815260206004820152600b60248201526a5a45524f5f41535345545360a81b604482015260640161085a565b610bd68285611213565b60408051828152602081018690526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a461063e6001600160a01b037f0000000000000000000000002a6da97233d798504008c57a66b6d0a05191ad76168483611275565b600254600090801561063c5761063781610c6d610518565b85919061103f565b6001600160a01b0381166000908152600360205260408120546106ac90610618565b42841015610ce75760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f45585049524544000000000000000000604482015260640161085a565b60006001610cf36107b2565b6001600160a01b038a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610dff573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590610e355750876001600160a01b0316816001600160a01b0316145b610e725760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b604482015260640161085a565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b60006106ac82610c55565b6006546001600160a01b03163314610f2f5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015260640161085a565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6006546001600160a01b03163314610fc45760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015260640161085a565b6008546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561100d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103191906115f3565b905061103c816112fc565b50565b600082600019048411830215820261105657600080fd5b5091020490565b600082600019048411830215820261107457600080fd5b50910281810615159190040190565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516110b5919061166f565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b60006040516323b872dd60e01b81526001600160a01b03851660048201526001600160a01b03841660248201528260448201526020600060648360008a5af13d15601f3d11600160005114161716915050806111b25760405162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b604482015260640161085a565b5050505050565b80600260008282546111cb919061170e565b90915550506001600160a01b0382166000818152600360209081526040808320805486019055518481526000805160206117a983398151915291015b60405180910390a35050565b6001600160a01b0382166000908152600360205260408120805483929061123b90849061165c565b90915550506002805482900390556040518181526000906001600160a01b038416906000805160206117a983398151915290602001611207565b600060405163a9059cbb60e01b81526001600160a01b0384166004820152826024820152602060006044836000895af13d15601f3d11600160005114161716915050806112f65760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b604482015260640161085a565b50505050565b604080516002808252606082018352600092602083019080368337505060085482519293506001600160a01b03169183915060009061133d5761133d611721565b6001600160a01b03928316602091820292909201015260075482519116908290600190811061136e5761136e611721565b6001600160a01b039283166020918202929092010152600954604051635c11d79560e01b8152911690635c11d795906113b4908590600090869030904290600401611737565b600060405180830381600087803b1580156113ce57600080fd5b505af11580156113e2573d6000803e3d6000fd5b505050505050565b600060208083528351808285015260005b81811015611417578581018301518582016040015282016113fb565b506000604082860101526040601f19601f8301168501019250505092915050565b60006020828403121561144a57600080fd5b5035919050565b80356001600160a01b038116811461146857600080fd5b919050565b6000806040838503121561148057600080fd5b61148983611451565b946020939093013593505050565b6000806000606084860312156114ac57600080fd5b6114b584611451565b92506114c360208501611451565b9150604084013590509250925092565b6000602082840312156114e557600080fd5b61063e82611451565b6000806040838503121561150157600080fd5b8235915061151160208401611451565b90509250929050565b60008060006060848603121561152f57600080fd5b8335925061153f60208501611451565b915061154d60408501611451565b90509250925092565b600080600080600080600060e0888a03121561157157600080fd5b61157a88611451565b965061158860208901611451565b95506040880135945060608801359350608088013560ff811681146115ac57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156115dc57600080fd5b6115e583611451565b915061151160208401611451565b60006020828403121561160557600080fd5b5051919050565b600181811c9082168061162057607f821691505b60208210810361164057634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b818103818111156106ac576106ac611646565b600080835481600182811c91508083168061168b57607f831692505b602080841082036116aa57634e487b7160e01b86526022600452602486fd5b8180156116be57600181146116d357611700565b60ff1986168952841515850289019650611700565b60008a81526020902060005b868110156116f85781548b8201529085019083016116df565b505084890196505b509498975050505050505050565b808201808211156106ac576106ac611646565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156117875784516001600160a01b031683529383019391830191600101611762565b50506001600160a01b0396909616606085015250505060800152939250505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220dca4597409418d290f26e665cb9335470ecc9eaa7dc378e3bf6de3c537b8fc2e64736f6c63430008140033

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

0000000000000000000000002a6da97233d798504008c57a66b6d0a05191ad760000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d

-----Decoded View---------------
Arg [0] : _underlying (address): 0x2a6da97233D798504008C57a66B6d0a05191Ad76
Arg [1] : uniV2Router (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000002a6da97233d798504008c57a66b6d0a05191ad76
Arg [1] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d


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.