Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 162 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Multicall | 19109577 | 179 days ago | IN | 0.0068 ETH | 0.0011682 | ||||
Multicall | 19105102 | 180 days ago | IN | 0.95 ETH | 0.00132316 | ||||
Multicall | 19103346 | 180 days ago | IN | 0.15 ETH | 0.00110009 | ||||
Multicall | 19095564 | 181 days ago | IN | 0.3 ETH | 0.00146316 | ||||
Multicall | 19069853 | 184 days ago | IN | 0.035 ETH | 0.00281697 | ||||
Multicall | 19061800 | 186 days ago | IN | 0.062 ETH | 0.00192236 | ||||
Multicall | 19061419 | 186 days ago | IN | 0.04 ETH | 0.00187107 | ||||
Multicall | 19047702 | 188 days ago | IN | 0.1024 ETH | 0.00202517 | ||||
Multicall | 19020199 | 191 days ago | IN | 0.5 ETH | 0.00675198 | ||||
Multicall | 19002397 | 194 days ago | IN | 0.015 ETH | 0.00171812 | ||||
Multicall | 18999964 | 194 days ago | IN | 0.55 ETH | 0.00215153 | ||||
Multicall | 18999841 | 194 days ago | IN | 0.3 ETH | 0.00233197 | ||||
Multicall | 18995106 | 195 days ago | IN | 0.937277 ETH | 0.00154868 | ||||
Multicall | 18986102 | 196 days ago | IN | 0.04 ETH | 0.0041309 | ||||
Multicall | 18985007 | 196 days ago | IN | 0.9 ETH | 0.00336438 | ||||
Multicall | 18983847 | 197 days ago | IN | 1 ETH | 0.00259962 | ||||
Multicall | 18977723 | 197 days ago | IN | 0.3 ETH | 0.00517291 | ||||
Multicall | 18961194 | 200 days ago | IN | 0.1 ETH | 0.00190679 | ||||
Multicall | 18960711 | 200 days ago | IN | 1 ETH | 0.00206462 | ||||
Multicall | 18956077 | 200 days ago | IN | 0.01 ETH | 0.00385457 | ||||
Multicall | 18950058 | 201 days ago | IN | 1.2 ETH | 0.00274932 | ||||
Multicall | 18939796 | 203 days ago | IN | 0.0182 ETH | 0.00178883 | ||||
Multicall | 18936229 | 203 days ago | IN | 0.016 ETH | 0.00283192 | ||||
Multicall | 18919178 | 206 days ago | IN | 0.55 ETH | 0.00144591 | ||||
Multicall | 18919159 | 206 days ago | IN | 0.5 ETH | 0.00181211 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
19109577 | 179 days ago | 0.0068 ETH | ||||
19105102 | 180 days ago | 0.95 ETH | ||||
19103346 | 180 days ago | 0.15 ETH | ||||
19095564 | 181 days ago | 0.3 ETH | ||||
19069853 | 184 days ago | 0.035 ETH | ||||
19061800 | 186 days ago | 0.062 ETH | ||||
19061419 | 186 days ago | 0.04 ETH | ||||
19047702 | 188 days ago | 0.1024 ETH | ||||
19020199 | 191 days ago | 0.5 ETH | ||||
19002397 | 194 days ago | 0.015 ETH | ||||
18999964 | 194 days ago | 0.55 ETH | ||||
18999841 | 194 days ago | 0.3 ETH | ||||
18995106 | 195 days ago | 0.937277 ETH | ||||
18986102 | 196 days ago | 0.04 ETH | ||||
18985007 | 196 days ago | 0.9 ETH | ||||
18983847 | 197 days ago | 1 ETH | ||||
18977723 | 197 days ago | 0.3 ETH | ||||
18961194 | 200 days ago | 0.1 ETH | ||||
18960711 | 200 days ago | 1 ETH | ||||
18956077 | 200 days ago | 0.01 ETH | ||||
18950058 | 201 days ago | 1.2 ETH | ||||
18939796 | 203 days ago | 0.0182 ETH | ||||
18936229 | 203 days ago | 0.016 ETH | ||||
18919178 | 206 days ago | 0.55 ETH | ||||
18919159 | 206 days ago | 0.5 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
Router
Compiler Version
v0.8.16+commit.07a7930e
Optimization Enabled:
Yes with 2000000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// 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"; } }
// 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; } } }
// 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); }
// 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) } } } }
// 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); } }
// 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"); } }
// 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); }
// 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; }
// 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"; } }
// 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(); } } }
{ "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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.