ETH Price: $2,976.57 (+3.89%)
Gas: 1 Gwei

Contract

0x9884E77B83880dDfa81457273D21E260d4E3B6eB
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Multicall191095772024-01-29 3:43:59159 days ago1706499839IN
0x9884E77B...0d4E3B6eB
0.0068 ETH0.00116829.19867345
Multicall191051022024-01-28 12:41:35159 days ago1706445695IN
0x9884E77B...0d4E3B6eB
0.95 ETH0.0013231612.03872058
Multicall191033462024-01-28 6:47:35159 days ago1706424455IN
0x9884E77B...0d4E3B6eB
0.15 ETH0.0011000910.00913106
Multicall190955642024-01-27 4:33:47160 days ago1706330027IN
0x9884E77B...0d4E3B6eB
0.3 ETH0.0014631611.52014262
Multicall190698532024-01-23 14:05:59164 days ago1706018759IN
0x9884E77B...0d4E3B6eB
0.035 ETH0.0028169725.6329053
Multicall190618002024-01-22 10:51:23165 days ago1705920683IN
0x9884E77B...0d4E3B6eB
0.062 ETH0.0019223620.71586352
Multicall190614192024-01-22 9:34:59165 days ago1705916099IN
0x9884E77B...0d4E3B6eB
0.04 ETH0.0018710717.02575351
Multicall190477022024-01-20 11:12:59167 days ago1705749179IN
0x9884E77B...0d4E3B6eB
0.1024 ETH0.0020251715.94667399
Multicall190201992024-01-16 14:58:35171 days ago1705417115IN
0x9884E77B...0d4E3B6eB
0.5 ETH0.0067519861.8398278
Multicall190023972024-01-14 3:19:11174 days ago1705202351IN
0x9884E77B...0d4E3B6eB
0.015 ETH0.0017181215.73591001
Multicall189999642024-01-13 19:10:11174 days ago1705173011IN
0x9884E77B...0d4E3B6eB
0.55 ETH0.0021515319.70537988
Multicall189998412024-01-13 18:45:23174 days ago1705171523IN
0x9884E77B...0d4E3B6eB
0.3 ETH0.0023319721.35804309
Multicall189951062024-01-13 2:51:23175 days ago1705114283IN
0x9884E77B...0d4E3B6eB
0.937277 ETH0.0015486816.81580728
Multicall189861022024-01-11 20:37:23176 days ago1705005443IN
0x9884E77B...0d4E3B6eB
0.04 ETH0.004130937.58888423
Multicall189850072024-01-11 16:56:11176 days ago1704992171IN
0x9884E77B...0d4E3B6eB
0.9 ETH0.0033643836.2505848
Multicall189838472024-01-11 13:01:11176 days ago1704978071IN
0x9884E77B...0d4E3B6eB
1 ETH0.0025996228.01048725
Multicall189777232024-01-10 16:24:35177 days ago1704903875IN
0x9884E77B...0d4E3B6eB
0.3 ETH0.0051729147.37752317
Multicall189611942024-01-08 8:43:59179 days ago1704703439IN
0x9884E77B...0d4E3B6eB
0.1 ETH0.0019067917.3488267
Multicall189607112024-01-08 7:06:47179 days ago1704697607IN
0x9884E77B...0d4E3B6eB
1 ETH0.0020646216.25576932
Multicall189560772024-01-07 15:26:11180 days ago1704641171IN
0x9884E77B...0d4E3B6eB
0.01 ETH0.0038545730.35168189
Multicall189500582024-01-06 18:56:59181 days ago1704567419IN
0x9884E77B...0d4E3B6eB
1.2 ETH0.0027493225.01451285
Multicall189397962024-01-05 8:08:35182 days ago1704442115IN
0x9884E77B...0d4E3B6eB
0.0182 ETH0.0017888316.27562363
Multicall189362292024-01-04 20:05:35183 days ago1704398735IN
0x9884E77B...0d4E3B6eB
0.016 ETH0.0028319222.30128955
Multicall189191782024-01-02 10:42:59185 days ago1704192179IN
0x9884E77B...0d4E3B6eB
0.55 ETH0.0014459115.57950786
Multicall189191592024-01-02 10:39:11185 days ago1704191951IN
0x9884E77B...0d4E3B6eB
0.5 ETH0.0018121116.48740352
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
191095772024-01-29 3:43:59159 days ago1706499839
0x9884E77B...0d4E3B6eB
0.0068 ETH
191051022024-01-28 12:41:35159 days ago1706445695
0x9884E77B...0d4E3B6eB
0.95 ETH
191033462024-01-28 6:47:35159 days ago1706424455
0x9884E77B...0d4E3B6eB
0.15 ETH
190955642024-01-27 4:33:47160 days ago1706330027
0x9884E77B...0d4E3B6eB
0.3 ETH
190698532024-01-23 14:05:59164 days ago1706018759
0x9884E77B...0d4E3B6eB
0.035 ETH
190618002024-01-22 10:51:23165 days ago1705920683
0x9884E77B...0d4E3B6eB
0.062 ETH
190614192024-01-22 9:34:59165 days ago1705916099
0x9884E77B...0d4E3B6eB
0.04 ETH
190477022024-01-20 11:12:59167 days ago1705749179
0x9884E77B...0d4E3B6eB
0.1024 ETH
190201992024-01-16 14:58:35171 days ago1705417115
0x9884E77B...0d4E3B6eB
0.5 ETH
190023972024-01-14 3:19:11174 days ago1705202351
0x9884E77B...0d4E3B6eB
0.015 ETH
189999642024-01-13 19:10:11174 days ago1705173011
0x9884E77B...0d4E3B6eB
0.55 ETH
189998412024-01-13 18:45:23174 days ago1705171523
0x9884E77B...0d4E3B6eB
0.3 ETH
189951062024-01-13 2:51:23175 days ago1705114283
0x9884E77B...0d4E3B6eB
0.937277 ETH
189861022024-01-11 20:37:23176 days ago1705005443
0x9884E77B...0d4E3B6eB
0.04 ETH
189850072024-01-11 16:56:11176 days ago1704992171
0x9884E77B...0d4E3B6eB
0.9 ETH
189838472024-01-11 13:01:11176 days ago1704978071
0x9884E77B...0d4E3B6eB
1 ETH
189777232024-01-10 16:24:35177 days ago1704903875
0x9884E77B...0d4E3B6eB
0.3 ETH
189611942024-01-08 8:43:59179 days ago1704703439
0x9884E77B...0d4E3B6eB
0.1 ETH
189607112024-01-08 7:06:47179 days ago1704697607
0x9884E77B...0d4E3B6eB
1 ETH
189560772024-01-07 15:26:11180 days ago1704641171
0x9884E77B...0d4E3B6eB
0.01 ETH
189500582024-01-06 18:56:59181 days ago1704567419
0x9884E77B...0d4E3B6eB
1.2 ETH
189397962024-01-05 8:08:35182 days ago1704442115
0x9884E77B...0d4E3B6eB
0.0182 ETH
189362292024-01-04 20:05:35183 days ago1704398735
0x9884E77B...0d4E3B6eB
0.016 ETH
189191782024-01-02 10:42:59185 days ago1704192179
0x9884E77B...0d4E3B6eB
0.55 ETH
189191592024-01-02 10:39:11185 days ago1704191951
0x9884E77B...0d4E3B6eB
0.5 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Router

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 2000000 runs

Other Settings:
default evmVersion
File 1 of 10 : Router.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity =0.8.16;

import {ERC4626Router} from "./ERC4626Router.sol";
import {IWETH} from "src/interfaces/IWETH.sol";

contract Router is ERC4626Router {
    constructor(string memory name, address forwarder, IWETH _weth) ERC4626Router(name) {
        _setTrustedForwarder(forwarder);
        weth = _weth;
    }

    IWETH public immutable weth;

    function depositNative() external payable {
        weth.deposit{value: msg.value}();
    }

    function versionRecipient() external view virtual override returns (string memory) {
        return "1";
    }
}

File 2 of 10 : BaseRelayRecipient.sol
// SPDX-License-Identifier: MIT
// solhint-disable no-inline-assembly
pragma solidity >=0.6.9;

import "./interfaces/IRelayRecipient.sol";

/**
 * A base contract to be inherited by any contract that want to receive relayed transactions
 * A subclass must use "_msgSender()" instead of "msg.sender"
 */
abstract contract BaseRelayRecipient is IRelayRecipient {

    /*
     * Forwarder singleton we accept calls from
     */
    address private _trustedForwarder;

    function trustedForwarder() public virtual view returns (address){
        return _trustedForwarder;
    }

    function _setTrustedForwarder(address _forwarder) internal {
        _trustedForwarder = _forwarder;
    }

    function isTrustedForwarder(address forwarder) public virtual override view returns(bool) {
        return forwarder == _trustedForwarder;
    }

    /**
     * return the sender of this call.
     * if the call came through our trusted forwarder, return the original sender.
     * otherwise, return `msg.sender`.
     * should be used in the contract anywhere instead of msg.sender
     */
    function _msgSender() internal override virtual view returns (address ret) {
        if (msg.data.length >= 20 && isTrustedForwarder(msg.sender)) {
            // At this point we know that the sender is a trusted forwarder,
            // so we trust that the last bytes of msg.data are the verified sender address.
            // extract sender address from the end of msg.data
            assembly {
                ret := shr(96,calldataload(sub(calldatasize(),20)))
            }
        } else {
            ret = msg.sender;
        }
    }

    /**
     * return the msg.data of this call.
     * if the call came through our trusted forwarder, then the real sender was appended as the last 20 bytes
     * of the msg.data - so this method will strip those 20 bytes off.
     * otherwise (if the call was made directly and not through the forwarder), return `msg.data`
     * should be used in the contract instead of msg.data, where this difference matters.
     */
    function _msgData() internal override virtual view returns (bytes calldata ret) {
        if (msg.data.length >= 20 && isTrustedForwarder(msg.sender)) {
            return msg.data[0:msg.data.length-20];
        } else {
            return msg.data;
        }
    }
}

File 3 of 10 : IRelayRecipient.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0;

/**
 * a contract must implement this interface in order to support relayed transaction.
 * It is better to inherit the BaseRelayRecipient as its implementation.
 */
abstract contract IRelayRecipient {

    /**
     * return if the forwarder is trusted to forward relayed transactions to us.
     * the forwarder is required to verify the sender's signature, and verify
     * the call is not a replay.
     */
    function isTrustedForwarder(address forwarder) public virtual view returns(bool);

    /**
     * return the sender of this call.
     * if the call came through our trusted forwarder, then the real sender is appended as the last 20 bytes
     * of the msg.data.
     * otherwise, return `msg.sender`
     * should be used in the contract anywhere instead of msg.sender
     */
    function _msgSender() internal virtual view returns (address);

    /**
     * return the msg.data of this call.
     * if the call came through our trusted forwarder, then the real sender was appended as the last 20 bytes
     * of the msg.data - so this method will strip those 20 bytes off.
     * otherwise (if the call was made directly and not through the forwarder), return `msg.data`
     * should be used in the contract instead of msg.data, where this difference matters.
     */
    function _msgData() internal virtual view returns (bytes calldata);

    function versionRecipient() external virtual view returns (string memory);
}

File 4 of 10 : Multicallable.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Contract that enables a single call to call multiple methods on itself.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/Multicallable.sol)
/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/Multicallable.sol)
/// @dev WARNING!
/// Multicallable is NOT SAFE for use in contracts with checks / requires on `msg.value`
/// (e.g. in NFT minting / auction contracts) without a suitable nonce mechanism.
/// It WILL open up your contract to double-spend vulnerabilities / exploits.
/// See: (https://www.paradigm.xyz/2021/08/two-rights-might-make-a-wrong/)
abstract contract Multicallable {
    function multicall(bytes[] calldata data) public payable returns (bytes[] memory results) {
        assembly {
            if data.length {
                results := mload(0x40) // Point `results` to start of free memory.
                mstore(results, data.length) // Store `data.length` into `results`.
                results := add(results, 0x20)

                // `shl` 5 is equivalent to multiplying by 0x20.
                let end := shl(5, data.length)
                // Copy the offsets from calldata into memory.
                calldatacopy(results, data.offset, end)
                // Pointer to the top of the memory (i.e. start of the free memory).
                let memPtr := add(results, end)
                end := add(results, end)

                // prettier-ignore
                for {} 1 {} {
                    // The offset of the current bytes in the calldata.
                    let o := add(data.offset, mload(results))
                    // Copy the current bytes from calldata to the memory.
                    calldatacopy(
                        memPtr,
                        add(o, 0x20), // The offset of the current bytes' bytes.
                        calldataload(o) // The length of the current bytes.
                    )
                    if iszero(delegatecall(gas(), address(), memPtr, calldataload(o), 0x00, 0x00)) {
                        // Bubble up the revert if the delegatecall reverts.
                        returndatacopy(0x00, 0x00, returndatasize())
                        revert(0x00, returndatasize())
                    }
                    // Append the current `memPtr` into `results`.
                    mstore(results, memPtr)
                    results := add(results, 0x20)
                    // Append the `returndatasize()`, and the return data.
                    mstore(memPtr, returndatasize())
                    returndatacopy(add(memPtr, 0x20), 0x00, returndatasize())
                    // Advance the `memPtr` by `returndatasize() + 0x20`,
                    // rounded up to the next multiple of 32.
                    memPtr := and(add(add(memPtr, returndatasize()), 0x3f), 0xffffffffffffffe0)
                    // prettier-ignore
                    if iszero(lt(results, end)) { break }
                }
                // Restore `results` and allocate memory for it.
                results := mload(0x40)
                mstore(0x40, memPtr)
            }
        }
    }
}

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

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

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

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

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

    string public name;

    string public symbol;

    uint8 public immutable decimals;

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

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

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

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

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

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

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

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

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

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

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

        return true;
    }

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

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

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

        return true;
    }

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

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

        balanceOf[from] -= amount;

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

        emit Transfer(from, to, amount);

        return true;
    }

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

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

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

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

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        require(success, "ETH_TRANSFER_FAILED");
    }

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

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

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

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

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

        require(success, "TRANSFER_FROM_FAILED");
    }

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

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

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

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

        require(success, "TRANSFER_FAILED");
    }

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

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

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

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

        require(success, "APPROVE_FAILED");
    }
}

File 7 of 10 : IERC4626.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity =0.8.16;

/// @author Open Zeppelin
interface IERC4626 {
    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
    );

    /**
     * @dev Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing.
     *
     * - MUST be an ERC-20 token contract.
     * - MUST NOT revert.
     */
    function asset() external view returns (address assetTokenAddress);

    /**
     * @dev Returns the total amount of the underlying asset that is “managed” by Vault.
     *
     * - SHOULD include any compounding that occurs from yield.
     * - MUST be inclusive of any fees that are charged against assets in the Vault.
     * - MUST NOT revert.
     */
    function totalAssets() external view returns (uint256 totalManagedAssets);

    /**
     * @dev Returns 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.
     *
     * - MUST NOT be inclusive of any fees that are charged against assets in the Vault.
     * - MUST NOT show any variations depending on the caller.
     * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.
     * - MUST NOT revert.
     *
     * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the
     * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and
     * from.
     */
    function convertToShares(uint256 assets) external view returns (uint256 shares);

    /**
     * @dev Returns 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.
     *
     * - MUST NOT be inclusive of any fees that are charged against assets in the Vault.
     * - MUST NOT show any variations depending on the caller.
     * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange.
     * - MUST NOT revert.
     *
     * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the
     * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and
     * from.
     */
    function convertToAssets(uint256 shares) external view returns (uint256 assets);

    /**
     * @dev Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver,
     * through a deposit call.
     *
     * - MUST return a limited value if receiver is subject to some deposit limit.
     * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited.
     * - MUST NOT revert.
     */
    function maxDeposit(address receiver) external view returns (uint256 maxAssets);

    /**
     * @dev Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given
     * current on-chain conditions.
     *
     * - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit
     * call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called
     * in the same transaction.
     * - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the
     * deposit would be accepted, regardless if the user has enough tokens approved, etc.
     * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.
     * - MUST NOT revert.
     *
     * NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in
     * share price or some other type of condition, meaning the depositor will lose assets by depositing.
     */
    function previewDeposit(uint256 assets) external view returns (uint256 shares);

    /**
     * @dev Mints shares Vault shares to receiver by depositing exactly amount of underlying tokens.
     *
     * - MUST emit the Deposit event.
     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
     * deposit execution, and are accounted for during deposit.
     * - MUST revert if all of assets cannot be deposited (due to deposit limit being reached, slippage, the user not
     * approving enough underlying tokens to the Vault contract, etc).
     *
     * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.
     */
    function deposit(uint256 assets, address receiver) external returns (uint256 shares);

    /**
     * @dev Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call.
     * - MUST return a limited value if receiver is subject to some mint limit.
     * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted.
     * - MUST NOT revert.
     */
    function maxMint(address receiver) external view returns (uint256 maxShares);

    /**
     * @dev Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given
     * current on-chain conditions.
     *
     * - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call
     * in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the
     * same transaction.
     * - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint
     * would be accepted, regardless if the user has enough tokens approved, etc.
     * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees.
     * - MUST NOT revert.
     *
     * NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in
     * share price or some other type of condition, meaning the depositor will lose assets by minting.
     */
    function previewMint(uint256 shares) external view returns (uint256 assets);

    /**
     * @dev Mints exactly shares Vault shares to receiver by depositing amount of underlying tokens.
     *
     * - MUST emit the Deposit event.
     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint
     * execution, and are accounted for during mint.
     * - MUST revert if all of shares cannot be minted (due to deposit limit being reached, slippage, the user not
     * approving enough underlying tokens to the Vault contract, etc).
     *
     * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token.
     */
    function mint(uint256 shares, address receiver) external returns (uint256 assets);

    /**
     * @dev Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the
     * Vault, through a withdraw call.
     *
     * - MUST return a limited value if owner is subject to some withdrawal limit or timelock.
     * - MUST NOT revert.
     */
    function maxWithdraw(address owner) external view returns (uint256 maxAssets);

    /**
     * @dev Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block,
     * given current on-chain conditions.
     *
     * - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw
     * call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if
     * called
     * in the same transaction.
     * - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though
     * the withdrawal would be accepted, regardless if the user has enough shares, etc.
     * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.
     * - MUST NOT revert.
     *
     * NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in
     * share price or some other type of condition, meaning the depositor will lose assets by depositing.
     */
    function previewWithdraw(uint256 assets) external view returns (uint256 shares);

    /**
     * @dev Burns shares from owner and sends exactly assets of underlying tokens to receiver.
     *
     * - MUST emit the Withdraw event.
     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
     * withdraw execution, and are accounted for during withdraw.
     * - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner
     * not having enough shares, etc).
     *
     * Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed.
     * Those methods should be performed separately.
     */
    function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares);

    /**
     * @dev Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault,
     * through a redeem call.
     *
     * - MUST return a limited value if owner is subject to some withdrawal limit or timelock.
     * - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock.
     * - MUST NOT revert.
     */
    function maxRedeem(address owner) external view returns (uint256 maxShares);

    /**
     * @dev Allows an on-chain or off-chain user to simulate the effects of their redeemption at the current block,
     * given current on-chain conditions.
     *
     * - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call
     * in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the
     * same transaction.
     * - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the
     * redemption would be accepted, regardless if the user has enough shares, etc.
     * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees.
     * - MUST NOT revert.
     *
     * NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in
     * share price or some other type of condition, meaning the depositor will lose assets by redeeming.
     */
    function previewRedeem(uint256 shares) external view returns (uint256 assets);

    /**
     * @dev Burns exactly shares from owner and sends assets of underlying tokens to receiver.
     *
     * - MUST emit the Withdraw event.
     * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the
     * redeem execution, and are accounted for during redeem.
     * - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner
     * not having enough shares, etc).
     *
     * NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed.
     * Those methods should be performed separately.
     */
    function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets);
}

File 8 of 10 : IWETH.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity =0.8.16;

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

File 9 of 10 : ERC4626Router.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity =0.8.16;

import {ERC4626RouterBase, SafeTransferLib, ERC20, IERC4626} from "./ERC4626RouterBase.sol";

/// @title ERC4626Router contract
contract ERC4626Router is ERC4626RouterBase {
    using SafeTransferLib for ERC20;

    constructor(string memory name) {}

    function depositToVault(IERC4626 vault, address to, uint256 amount, uint256 minSharesOut)
        external
        payable
        returns (uint256 sharesOut)
    {
        ERC20(vault.asset()).safeTransferFrom(_msgSender(), address(this), amount);
        return deposit(vault, to, amount, minSharesOut);
    }

    function withdrawToDeposit(
        IERC4626 fromVault,
        IERC4626 toVault,
        address to,
        uint256 amount,
        uint256 maxSharesIn,
        uint256 minSharesOut
    ) external payable returns (uint256 sharesOut) {
        withdraw(fromVault, address(this), amount, maxSharesIn);
        return deposit(toVault, to, amount, minSharesOut);
    }

    function redeemToDeposit(IERC4626 fromVault, IERC4626 toVault, address to, uint256 shares, uint256 minSharesOut)
        external
        payable
        returns (uint256 sharesOut)
    {
        uint256 amount = redeem(fromVault, address(this), shares, 0);
        return deposit(toVault, to, amount, minSharesOut);
    }

    function depositMax(IERC4626 vault, address to, uint256 minSharesOut) public payable returns (uint256 sharesOut) {
        ERC20 asset = ERC20(vault.asset());
        uint256 assetBalance = asset.balanceOf(_msgSender());
        uint256 maxDeposit = vault.maxDeposit(to);
        uint256 amount = maxDeposit < assetBalance ? maxDeposit : assetBalance;
        ERC20(vault.asset()).safeTransferFrom(_msgSender(), address(this), amount);
        return deposit(vault, to, amount, minSharesOut);
    }

    function redeemMax(IERC4626 vault, address to, uint256 minAmountOut) public payable returns (uint256 amountOut) {
        uint256 shareBalance = ERC20(address(vault)).balanceOf(_msgSender());
        uint256 maxRedeem = vault.maxRedeem(_msgSender());
        uint256 amountShares = maxRedeem < shareBalance ? maxRedeem : shareBalance;
        return redeem(vault, to, amountShares, minAmountOut);
    }

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

    function versionRecipient() external view virtual override returns (string memory) {
        return "1";
    }
}

File 10 of 10 : ERC4626RouterBase.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity =0.8.16;

import {ERC20} from "solmate/src/tokens/ERC20.sol";
import {SafeTransferLib} from "solmate/src/utils/SafeTransferLib.sol";
import {IERC4626} from "src/interfaces/IERC4626.sol";
import {Multicallable} from "solady/src/utils/Multicallable.sol";
import {BaseRelayRecipient} from "@opengsn/contracts/src/BaseRelayRecipient.sol";

/// @title ERC4626 Router Base Contract
abstract contract ERC4626RouterBase is Multicallable, BaseRelayRecipient {
    using SafeTransferLib for ERC20;

    error MinAmountError();

    /// @notice thrown when amount of shares received is below the min set by caller
    error MinSharesError();

    /// @notice thrown when amount of assets received is above the max set by caller
    error MaxAmountError();

    /// @notice thrown when amount of shares received is above the max set by caller
    error MaxSharesError();

    function mint(IERC4626 vault, address to, uint256 shares, uint256 maxAmountIn)
        public
        payable
        virtual
        returns (uint256 amountIn)
    {
        if ((amountIn = vault.mint(shares, to)) > maxAmountIn) {
            revert MaxAmountError();
        }
    }

    function deposit(IERC4626 vault, address to, uint256 amount, uint256 minSharesOut)
        public
        payable
        virtual
        returns (uint256 sharesOut)
    {
        if ((sharesOut = vault.deposit(amount, to)) < minSharesOut) {
            revert MinSharesError();
        }
    }

    function withdraw(IERC4626 vault, address to, uint256 amount, uint256 maxSharesOut)
        public
        payable
        virtual
        returns (uint256 sharesOut)
    {
        if ((sharesOut = vault.withdraw(amount, to, _msgSender())) > maxSharesOut) {
            revert MaxSharesError();
        }
    }

    function redeem(IERC4626 vault, address to, uint256 shares, uint256 minAmountOut)
        public
        payable
        virtual
        returns (uint256 amountOut)
    {
        if ((amountOut = vault.redeem(shares, to, _msgSender())) < minAmountOut) {
            revert MinAmountError();
        }
    }
}

Settings
{
  "remappings": [
    "@opengsn/=node_modules/@opengsn/",
    "@openzeppelin/=node_modules/@openzeppelin/",
    "@uniswap/=node_modules/@uniswap/",
    "base64-sol/=node_modules/base64-sol/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "hardhat/=node_modules/hardhat/",
    "script/=script/",
    "solady/=node_modules/solady/",
    "solmate/=node_modules/solmate/",
    "src/=src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 2000000
  },
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"forwarder","type":"address"},{"internalType":"contract IWETH","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"MaxAmountError","type":"error"},{"inputs":[],"name":"MaxSharesError","type":"error"},{"inputs":[],"name":"MinAmountError","type":"error"},{"inputs":[],"name":"MinSharesError","type":"error"},{"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 IERC4626","name":"vault","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minSharesOut","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"sharesOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC4626","name":"vault","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"minSharesOut","type":"uint256"}],"name":"depositMax","outputs":[{"internalType":"uint256","name":"sharesOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"depositNative","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC4626","name":"vault","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minSharesOut","type":"uint256"}],"name":"depositToVault","outputs":[{"internalType":"uint256","name":"sharesOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC4626","name":"vault","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"},{"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":[{"internalType":"contract IERC4626","name":"vault","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC4626","name":"vault","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"redeemMax","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC4626","name":"fromVault","type":"address"},{"internalType":"contract IERC4626","name":"toVault","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"minSharesOut","type":"uint256"}],"name":"redeemToDeposit","outputs":[{"internalType":"uint256","name":"sharesOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"trustedForwarder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"versionRecipient","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC4626","name":"vault","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"maxSharesOut","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"sharesOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC4626","name":"fromVault","type":"address"},{"internalType":"contract IERC4626","name":"toVault","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"maxSharesIn","type":"uint256"},{"internalType":"uint256","name":"minSharesOut","type":"uint256"}],"name":"withdrawToDeposit","outputs":[{"internalType":"uint256","name":"sharesOut","type":"uint256"}],"stateMutability":"payable","type":"function"}]

60a06040523480156200001157600080fd5b50604051620013b2380380620013b2833981016040819052620000349162000097565b600080546001600160a01b0319166001600160a01b0384161790556001600160a01b031660805250620001919050565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146200009257600080fd5b919050565b600080600060608486031215620000ad57600080fd5b83516001600160401b0380821115620000c557600080fd5b818601915086601f830112620000da57600080fd5b815181811115620000ef57620000ef62000064565b604051601f8201601f19908116603f011681019083821181831017156200011a576200011a62000064565b816040528281526020935089848487010111156200013757600080fd5b600091505b828210156200015b57848201840151818301850152908301906200013c565b6000848483010152809750505050620001768187016200007a565b9350505062000188604085016200007a565b90509250925092565b6080516111fe620001b460003960008181610130015261091a01526111fe6000f3fe6080604052600436106100f35760003560e01c8063a246bd301161008a578063db6b524611610059578063db6b5246146102cc578063e1f21c67146102d6578063ed01c6e5146102e9578063f943028c146102fc57600080fd5b8063a246bd3014610273578063ac9650d814610286578063b3f1c93d146102a6578063b592e406146102b957600080fd5b8063572b6c05116100c6578063572b6c05146101d65780637bfe950c146102225780637da0a8771461023557806390f328c91461026057600080fd5b806320e8c565146100f85780633fc8cef31461011e578063486ff0cd146101775780634be47418146101c3575b600080fd5b61010b610106366004610ebb565b61030f565b6040519081526020015b60405180910390f35b34801561012a57600080fd5b506101527f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610115565b34801561018357600080fd5b50604080518082018252600181527f3100000000000000000000000000000000000000000000000000000000000000602082015290516101159190610f65565b61010b6101d1366004610ebb565b6103f0565b3480156101e257600080fd5b506102126101f1366004610f7f565b60005473ffffffffffffffffffffffffffffffffffffffff91821691161490565b6040519015158152602001610115565b61010b610230366004610ebb565b6104f1565b34801561024157600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610152565b61010b61026e366004610f9c565b6105f2565b61010b610281366004610ff7565b61061b565b610299610294366004611038565b6107a5565b60405161011591906110ad565b61010b6102b4366004610ebb565b610824565b61010b6102c736600461112d565b6108fd565b6102d4610918565b005b6102d46102e4366004610ff7565b61099b565b61010b6102f7366004610ff7565b6109c1565b61010b61030a366004610ebb565b610c45565b6040517f6e553f650000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff84811660248301526000918391871690636e553f65906044016020604051808303816000875af1158015610389573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ad9190611192565b91508110156103e8576040517fa267cc6000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b949350505050565b6000818573ffffffffffffffffffffffffffffffffffffffff1663ba0876528587610419610cb4565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b168152600481019390935273ffffffffffffffffffffffffffffffffffffffff91821660248401521660448201526064016020604051808303816000875af1158015610492573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b69190611192565b91508110156103e8576040517f6e8c873b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818573ffffffffffffffffffffffffffffffffffffffff1663b460af94858761051a610cb4565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b168152600481019390935273ffffffffffffffffffffffffffffffffffffffff91821660248401521660448201526064016020604051808303816000875af1158015610593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b79190611192565b91508111156103e8576040517fac11961300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061060287308660006103f0565b90506106108686838661030f565b979650505050505050565b6000808473ffffffffffffffffffffffffffffffffffffffff166370a08231610642610cb4565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa1580156106ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106cf9190611192565b905060008573ffffffffffffffffffffffffffffffffffffffff1663d905777e6106f7610cb4565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015610760573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107849190611192565b905060008282106107955782610797565b815b9050610610878783886103f0565b6060811561081e5750604051818152602001600582901b808483378101805b825185018035602082018337600080823584305af46107e7573d6000803e3d6000fd5b508083526020830192503d81523d6000602083013e3d01603f0167ffffffffffffffe0168183106107c45760405192508060405250505b92915050565b6040517f94bf804d0000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff848116602483015260009183918716906394bf804d906044016020604051808303816000875af115801561089e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c29190611192565b91508111156103e8576040517f4e3c485300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061090b873086866104f1565b506106108686868561030f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561098057600080fd5b505af1158015610994573d6000803e3d6000fd5b5050505050565b6109bc73ffffffffffffffffffffffffffffffffffffffff84168383610d13565b505050565b6000808473ffffffffffffffffffffffffffffffffffffffff166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3391906111ab565b905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231610a5b610cb4565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015610ac4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae89190611192565b6040517f402d267d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015291925060009188169063402d267d90602401602060405180830381865afa158015610b5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7e9190611192565b90506000828210610b8f5782610b91565b815b9050610c2d610b9e610cb4565b30838b73ffffffffffffffffffffffffffffffffffffffff166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610beb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0f91906111ab565b73ffffffffffffffffffffffffffffffffffffffff16929190610dd7565b610c398888838961030f565b98975050505050505050565b6000610c9f610c52610cb4565b30858873ffffffffffffffffffffffffffffffffffffffff166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610beb573d6000803e3d6000fd5b610cab8585858561030f565b95945050505050565b600060143610801590610cde575060005473ffffffffffffffffffffffffffffffffffffffff1633145b15610d0e57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90565b503390565b60006040517f095ea7b3000000000000000000000000000000000000000000000000000000008152836004820152826024820152602060006044836000895af13d15601f3d1160016000511416171691505080610dd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f415050524f56455f4641494c454400000000000000000000000000000000000060448201526064015b60405180910390fd5b50505050565b60006040517f23b872dd0000000000000000000000000000000000000000000000000000000081528460048201528360248201528260448201526020600060648360008a5af13d15601f3d1160016000511416171691505080610994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152606401610dc8565b73ffffffffffffffffffffffffffffffffffffffff81168114610eb857600080fd5b50565b60008060008060808587031215610ed157600080fd5b8435610edc81610e96565b93506020850135610eec81610e96565b93969395505050506040820135916060013590565b6000815180845260005b81811015610f2757602081850181015186830182015201610f0b565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610f786020830184610f01565b9392505050565b600060208284031215610f9157600080fd5b8135610f7881610e96565b600080600080600060a08688031215610fb457600080fd5b8535610fbf81610e96565b94506020860135610fcf81610e96565b93506040860135610fdf81610e96565b94979396509394606081013594506080013592915050565b60008060006060848603121561100c57600080fd5b833561101781610e96565b9250602084013561102781610e96565b929592945050506040919091013590565b6000806020838503121561104b57600080fd5b823567ffffffffffffffff8082111561106357600080fd5b818501915085601f83011261107757600080fd5b81358181111561108657600080fd5b8660208260051b850101111561109b57600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611120577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261110e858351610f01565b945092850192908501906001016110d4565b5092979650505050505050565b60008060008060008060c0878903121561114657600080fd5b863561115181610e96565b9550602087013561116181610e96565b9450604087013561117181610e96565b959894975094956060810135955060808101359460a0909101359350915050565b6000602082840312156111a457600080fd5b5051919050565b6000602082840312156111bd57600080fd5b8151610f7881610e9656fea2646970667358221220d134abbbdcd218f6c4a651ce222fab0ad427c7d324f5164ef40307b5b268ff2a64736f6c6343000810003300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000010616666696e652d726f757465722d763200000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106100f35760003560e01c8063a246bd301161008a578063db6b524611610059578063db6b5246146102cc578063e1f21c67146102d6578063ed01c6e5146102e9578063f943028c146102fc57600080fd5b8063a246bd3014610273578063ac9650d814610286578063b3f1c93d146102a6578063b592e406146102b957600080fd5b8063572b6c05116100c6578063572b6c05146101d65780637bfe950c146102225780637da0a8771461023557806390f328c91461026057600080fd5b806320e8c565146100f85780633fc8cef31461011e578063486ff0cd146101775780634be47418146101c3575b600080fd5b61010b610106366004610ebb565b61030f565b6040519081526020015b60405180910390f35b34801561012a57600080fd5b506101527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610115565b34801561018357600080fd5b50604080518082018252600181527f3100000000000000000000000000000000000000000000000000000000000000602082015290516101159190610f65565b61010b6101d1366004610ebb565b6103f0565b3480156101e257600080fd5b506102126101f1366004610f7f565b60005473ffffffffffffffffffffffffffffffffffffffff91821691161490565b6040519015158152602001610115565b61010b610230366004610ebb565b6104f1565b34801561024157600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610152565b61010b61026e366004610f9c565b6105f2565b61010b610281366004610ff7565b61061b565b610299610294366004611038565b6107a5565b60405161011591906110ad565b61010b6102b4366004610ebb565b610824565b61010b6102c736600461112d565b6108fd565b6102d4610918565b005b6102d46102e4366004610ff7565b61099b565b61010b6102f7366004610ff7565b6109c1565b61010b61030a366004610ebb565b610c45565b6040517f6e553f650000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff84811660248301526000918391871690636e553f65906044016020604051808303816000875af1158015610389573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ad9190611192565b91508110156103e8576040517fa267cc6000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b949350505050565b6000818573ffffffffffffffffffffffffffffffffffffffff1663ba0876528587610419610cb4565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b168152600481019390935273ffffffffffffffffffffffffffffffffffffffff91821660248401521660448201526064016020604051808303816000875af1158015610492573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b69190611192565b91508110156103e8576040517f6e8c873b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818573ffffffffffffffffffffffffffffffffffffffff1663b460af94858761051a610cb4565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b168152600481019390935273ffffffffffffffffffffffffffffffffffffffff91821660248401521660448201526064016020604051808303816000875af1158015610593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b79190611192565b91508111156103e8576040517fac11961300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061060287308660006103f0565b90506106108686838661030f565b979650505050505050565b6000808473ffffffffffffffffffffffffffffffffffffffff166370a08231610642610cb4565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa1580156106ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106cf9190611192565b905060008573ffffffffffffffffffffffffffffffffffffffff1663d905777e6106f7610cb4565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015610760573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107849190611192565b905060008282106107955782610797565b815b9050610610878783886103f0565b6060811561081e5750604051818152602001600582901b808483378101805b825185018035602082018337600080823584305af46107e7573d6000803e3d6000fd5b508083526020830192503d81523d6000602083013e3d01603f0167ffffffffffffffe0168183106107c45760405192508060405250505b92915050565b6040517f94bf804d0000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff848116602483015260009183918716906394bf804d906044016020604051808303816000875af115801561089e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c29190611192565b91508111156103e8576040517f4e3c485300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061090b873086866104f1565b506106108686868561030f565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561098057600080fd5b505af1158015610994573d6000803e3d6000fd5b5050505050565b6109bc73ffffffffffffffffffffffffffffffffffffffff84168383610d13565b505050565b6000808473ffffffffffffffffffffffffffffffffffffffff166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3391906111ab565b905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231610a5b610cb4565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015610ac4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae89190611192565b6040517f402d267d00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015291925060009188169063402d267d90602401602060405180830381865afa158015610b5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7e9190611192565b90506000828210610b8f5782610b91565b815b9050610c2d610b9e610cb4565b30838b73ffffffffffffffffffffffffffffffffffffffff166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610beb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0f91906111ab565b73ffffffffffffffffffffffffffffffffffffffff16929190610dd7565b610c398888838961030f565b98975050505050505050565b6000610c9f610c52610cb4565b30858873ffffffffffffffffffffffffffffffffffffffff166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610beb573d6000803e3d6000fd5b610cab8585858561030f565b95945050505050565b600060143610801590610cde575060005473ffffffffffffffffffffffffffffffffffffffff1633145b15610d0e57507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90565b503390565b60006040517f095ea7b3000000000000000000000000000000000000000000000000000000008152836004820152826024820152602060006044836000895af13d15601f3d1160016000511416171691505080610dd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f415050524f56455f4641494c454400000000000000000000000000000000000060448201526064015b60405180910390fd5b50505050565b60006040517f23b872dd0000000000000000000000000000000000000000000000000000000081528460048201528360248201528260448201526020600060648360008a5af13d15601f3d1160016000511416171691505080610994576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152606401610dc8565b73ffffffffffffffffffffffffffffffffffffffff81168114610eb857600080fd5b50565b60008060008060808587031215610ed157600080fd5b8435610edc81610e96565b93506020850135610eec81610e96565b93969395505050506040820135916060013590565b6000815180845260005b81811015610f2757602081850181015186830182015201610f0b565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610f786020830184610f01565b9392505050565b600060208284031215610f9157600080fd5b8135610f7881610e96565b600080600080600060a08688031215610fb457600080fd5b8535610fbf81610e96565b94506020860135610fcf81610e96565b93506040860135610fdf81610e96565b94979396509394606081013594506080013592915050565b60008060006060848603121561100c57600080fd5b833561101781610e96565b9250602084013561102781610e96565b929592945050506040919091013590565b6000806020838503121561104b57600080fd5b823567ffffffffffffffff8082111561106357600080fd5b818501915085601f83011261107757600080fd5b81358181111561108657600080fd5b8660208260051b850101111561109b57600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611120577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261110e858351610f01565b945092850192908501906001016110d4565b5092979650505050505050565b60008060008060008060c0878903121561114657600080fd5b863561115181610e96565b9550602087013561116181610e96565b9450604087013561117181610e96565b959894975094956060810135955060808101359460a0909101359350915050565b6000602082840312156111a457600080fd5b5051919050565b6000602082840312156111bd57600080fd5b8151610f7881610e9656fea2646970667358221220d134abbbdcd218f6c4a651ce222fab0ad427c7d324f5164ef40307b5b268ff2a64736f6c63430008100033

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

00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000010616666696e652d726f757465722d763200000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): affine-router-v2
Arg [1] : forwarder (address): 0x0000000000000000000000000000000000000000
Arg [2] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [4] : 616666696e652d726f757465722d763200000000000000000000000000000000


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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