More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 107 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Flash | 18519053 | 240 days ago | IN | 0 ETH | 0.00555046 | ||||
Flash | 18422103 | 254 days ago | IN | 0 ETH | 0.01393012 | ||||
Flash | 18313161 | 269 days ago | IN | 0 ETH | 0.00624706 | ||||
Flash | 18312438 | 269 days ago | IN | 0 ETH | 0.0012203 | ||||
Flash | 18312418 | 269 days ago | IN | 0 ETH | 0.00123812 | ||||
Flash | 18312409 | 269 days ago | IN | 0 ETH | 0.00121584 | ||||
Flash | 18312399 | 269 days ago | IN | 0 ETH | 0.00115776 | ||||
Flash | 18312388 | 269 days ago | IN | 0 ETH | 0.00129091 | ||||
Flash | 18312379 | 269 days ago | IN | 0 ETH | 0.00138796 | ||||
Flash | 18312368 | 269 days ago | IN | 0 ETH | 0.00147408 | ||||
Flash | 18312359 | 269 days ago | IN | 0 ETH | 0.00155609 | ||||
Flash | 18312349 | 269 days ago | IN | 0 ETH | 0.00161504 | ||||
Flash | 18312338 | 269 days ago | IN | 0 ETH | 0.00165993 | ||||
Flash | 18312335 | 269 days ago | IN | 0 ETH | 0.00166748 | ||||
Flash | 18312329 | 269 days ago | IN | 0 ETH | 0.0019006 | ||||
Flash | 18312318 | 269 days ago | IN | 0 ETH | 0.00172725 | ||||
Flash | 18312308 | 269 days ago | IN | 0 ETH | 0.0015664 | ||||
Flash | 18312298 | 269 days ago | IN | 0 ETH | 0.00152176 | ||||
Flash | 18312288 | 269 days ago | IN | 0 ETH | 0.00150711 | ||||
Flash | 18312278 | 269 days ago | IN | 0 ETH | 0.00154982 | ||||
Flash | 18312268 | 269 days ago | IN | 0 ETH | 0.00171044 | ||||
Flash | 18312260 | 269 days ago | IN | 0 ETH | 0.00171279 | ||||
Flash | 18312248 | 269 days ago | IN | 0 ETH | 0.00156139 | ||||
Flash | 18312238 | 269 days ago | IN | 0 ETH | 0.00170397 | ||||
Flash | 18312228 | 269 days ago | IN | 0 ETH | 0.00178529 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
17065989 | 444 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
FlashMEV
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 2000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity >=0.8.17 <0.9.0; /// ============ Imports ============ import {ERC20} from "solmate/tokens/ERC20.sol"; import {IFlashBorrower} from "./interfaces/IFlashBorrower.sol"; import {IFlashLoanReceiver} from "./interfaces/IFlashLoanReceiver.sol"; import {IFlashLoanRecipient} from "./interfaces/IFlashLoanRecipient.sol"; import {IVault} from "./interfaces/IVault.sol"; import {ILendingPool} from "./interfaces/ILendingPool.sol"; import {IBentoBoxV1} from "./interfaces/IBentoBoxV1.sol"; import {SafeTransferLib} from "solmate/utils/SafeTransferLib.sol"; import {IProtocolDataProvider} from "./interfaces/IProtocolDataProvider.sol"; import {IUniswapV2Router02} from "./interfaces/IUniswapV2Router02.sol"; /// @title FlashMEV /// @author Sandy Bradley <@sandybradley> /// @notice Generic flash loan for MEV execution (loans from Balancer (0% fee), BentoBox (0.05%), Aave (0.09%)) contract FlashMEV is IFlashLoanRecipient, IFlashBorrower, IFlashLoanReceiver { using SafeTransferLib for ERC20; error ZeroAddress(); error Unauthorized(); error UnsupportedToken(); error InsufficientOutputAmount(); event MEV(address indexed token, uint256 value); uint8 internal GOV_FEE; address internal GOV; address internal mevETH; address internal ORACLE_ROUTER; address internal constant WETH09 = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; address internal constant BENTO = 0xF5BCE5077908a1b7370B9ae04AdC565EBd643966; // bentobox vault address internal constant LENDING_POOL_ADDRESS = 0x7d2768dE32b0b80b7a3454c06BdAc94A69DDc7A9; // aave lending pool address address internal constant AAVE_DATA_PROVIDER = 0x057835Ad21a177dbdd3090bB1CAE03EaCF78Fc6d; // aave data provider address internal constant VAULT = 0xBA12222222228d8Ba445958a75a0704d566BF2C8; // balancer vault mapping(address => bool) internal FLASH_FRIEND; // flashloan execute user access // address internal constant SPLIT_SWAP = // 0x77337dEEA78720542f0A1325394Def165918D562; // Manifold split swap router /// @dev setup contract with governance fee and mevETH address /// @param _govFee governance fee on mev profit as 1/100 th of a decimal i.e. 1 == 0.01% /// @param _mevETH mevETH address /// @param _oracleRouter uni V2 style router for eth value lookup constructor(uint8 _govFee, address _mevETH, address _oracleRouter) { GOV = tx.origin; // tx.origin used over msg.sender for create2 deployment mevETH = _mevETH; GOV_FEE = _govFee; ORACLE_ROUTER = _oracleRouter; FLASH_FRIEND[GOV] = true; } /// @notice Admin can change ownership /// @param newGov Address of new owner function updateGov(address newGov) external { if (msg.sender != GOV) revert Unauthorized(); if (newGov == address(0)) revert ZeroAddress(); GOV = newGov; } /// @notice Admin can change fee /// @param _newFee New fee (1 == 0.01%) function updateFee(uint8 _newFee) external { if (msg.sender != GOV) revert Unauthorized(); GOV_FEE = _newFee; } /// @notice Admin can change oracle router /// @param _oracleRouter uni V2 style router function updateOracle(address _oracleRouter) external { if (msg.sender != GOV) revert Unauthorized(); ORACLE_ROUTER = _oracleRouter; } /// @notice Update internal Flash friend list /// @param flashAllowed Boolean flagging if user is allowed to execute /// @param friend Address of friend function updateFriend(bool flashAllowed, address friend) external { if (msg.sender != GOV) revert Unauthorized(); FLASH_FRIEND[friend] = flashAllowed; } /// @notice Admin can change mevETH address /// @param newMevEth Address of new mevETH function updateMevETH(address newMevEth) external { if (msg.sender != GOV) revert Unauthorized(); if (newMevEth == address(0)) revert ZeroAddress(); mevETH = newMevEth; } /// @notice returns flash freind mapping for given address /// @param friend user address to query function isFriend(address friend) external view returns (bool) { return FLASH_FRIEND[friend]; } /// @notice returns governance address function gov() external view returns (address) { return GOV; } /// @notice Main Flash loan call to execute MEV /// @param useBalancer true if its okay to use balancer flashloan (reentrancy protection makes it impossible to use balancer flashloan with balancer swaps) /// @param token token to loan /// @param amount Amount to loan of token /// @param transactions packed list of transaction data (value(256),contract(160),data_len(16),data(data_len*8)) function flash( bool useBalancer, address token, uint256 amount, bytes calldata transactions ) external { if (!FLASH_FRIEND[msg.sender]) revert Unauthorized(); address me = address(this); address sender = msg.sender; uint256 startGas = gasleft(); uint256 balBefore = ERC20(token).balanceOf(me); // loan preference // 1) balancer // 2) bentobox // 3) aave if (useBalancer && ERC20(token).balanceOf(VAULT) >= amount) { // addresses of the reserves to flashloan address[] memory assets = new address[](1); assets[0] = token; // amounts of assets to flashloan. uint256[] memory amounts = new uint256[](1); amounts[0] = amount; IVault(VAULT).flashLoan( IFlashLoanRecipient(me), assets, amounts, transactions ); } else if (ERC20(token).balanceOf(BENTO) >= amount) { IBentoBoxV1(BENTO).flashLoan( IFlashBorrower(me), me, token, amount, transactions ); } else if ( IProtocolDataProvider(AAVE_DATA_PROVIDER).getReserveData(token) >= amount ) { { // addresses of the reserves to flashloan address[] memory assets = new address[](1); assets[0] = token; // amounts of assets to flashloan. uint256[] memory amounts = new uint256[](1); amounts[0] = amount; // 0 = no debt (just revert), 1 = stable, 2 = variable uint256[] memory modes = new uint256[](1); modes[0] = 0; ILendingPool(LENDING_POOL_ADDRESS).flashLoan( me, assets, amounts, modes, me, transactions, uint16(0) ); } } else { revert UnsupportedToken(); } // check profit exceeds gas cost uint256 profit = ((ERC20(token).balanceOf(me) - balBefore) * (10000 - uint256(GOV_FEE))) / 10000; if ((startGas - gasleft()) * block.basefee > _ethValue(token, profit)) revert InsufficientOutputAmount(); ERC20(token).safeTransfer(sender, profit); emit MEV(token, profit); // emit MEV event } /// @notice Sweep tokens and eth to recipient /// @param tokens Array of token addresses /// @param recipient Address of recipient function sweep(address[] calldata tokens, address recipient) external { if (msg.sender != GOV) revert Unauthorized(); for (uint256 i; i < tokens.length; i++) { address token = tokens[i]; ERC20(token).safeTransfer( recipient, ERC20(token).balanceOf(address(this)) ); } SafeTransferLib.safeTransferETH(recipient, address(this).balance); } /// @notice Admin function to remove code from blockchain and receive rebate /// @param recipient Address of rebate recipient function destroy(address payable recipient) external { if (msg.sender != GOV) revert Unauthorized(); selfdestruct(recipient); } /// @notice Called from BentoBox Lending pool after contract has received the flash loaned amount /// @dev Reverts if not profitable. /// @param sender Address of flashloan initiator /// @param token Token to loan /// @param amount Amount to loan /// @param fee Fee to repay on loan amount /// @param data Encoded factories and tokens function onFlashLoan( address sender, address token, uint256 amount, uint256 fee, bytes calldata data ) external { if (msg.sender != BENTO) revert Unauthorized(); _executeTransactions(data); ERC20(token).safeTransfer(BENTO, amount + fee); } /// @notice Called from Aave Lending pool after contract has received the flash loaned amount (https://docs.aave.com/developers/v/2.0/guides/flash-loans) /// @dev Reverts if not profitable. /// @param assets Array of tokens to loan /// @param amounts Array of amounts to loan /// @param premiums Array of premiums to repay on loan amounts /// @param initiator Address of flashloan initiator /// @param params Encoded factories and tokens /// @return success indicating success function executeOperation( address[] calldata assets, uint256[] calldata amounts, uint256[] calldata premiums, address initiator, bytes calldata params ) external returns (bool) { if (msg.sender != LENDING_POOL_ADDRESS) revert Unauthorized(); _executeTransactions(params); ERC20(assets[0]).safeApprove( LENDING_POOL_ADDRESS, amounts[0] + premiums[0] ); return true; } /// @notice Called from Balancer vault after contract has received flashloan /// @param tokens Array of tokens to loan /// @param amounts Array of amounts to loan /// @param feeAmounts Array of fees to repay on loan amounts function receiveFlashLoan( address[] memory tokens, uint256[] memory amounts, uint256[] memory feeAmounts, bytes memory userData ) external override { if (msg.sender != VAULT) revert Unauthorized(); _executeTransactions(userData); ERC20(tokens[0]).safeTransfer(VAULT, amounts[0] + feeAmounts[0]); } /// @notice Calculate eth value of a token amount /// @param token Address of token /// @param amount Amount of token /// @return eth value function _ethValue( address token, uint256 amount ) internal view returns (uint256) { if (token == WETH09) return amount; if (token == mevETH) return amount; address[] memory path = new address[](2); path[0] = token; path[1] = WETH09; uint256[] memory amounts = IUniswapV2Router02(ORACLE_ROUTER) .getAmountsOut(amount, path); if (amounts.length < 2) return 0; return amounts[1]; } /// @dev Sends multiple transactions /// @param transactions Encoded transactions. Each transaction is encoded as a packed bytes of /// value as a uint256 (=> 32 bytes), /// contract address (20 bytes) /// data length as a uint16 (=> 2 bytes), /// data as bytes. /// see abi.encodePacked for more information on packed encoding function _executeTransactions(bytes memory transactions) internal { assembly ("memory-safe") { let length := mload(transactions) let i := 0x20 for { // Pre block is not used in "while mode" } lt(i, length) { // Post block is not used in "while mode" } { // let value = mload(add(transactions, i)) let to := and( shr(96, mload(add(transactions, add(i, 0x20)))), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ) let dataLength := and( shr(240, mload(add(transactions, add(i, 0x34)))), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ) let success := call( gas(), // gas left to, // router mload(add(transactions, i)), // value add(transactions, add(i, 0x36)), // input data (0x(4 byte func sig hash)(abi encoded args)) dataLength, // input data byte length 0, // output 0 // output byte length ) if iszero(success) { revert(0, 0) } // Next entry starts at 0x35 byte + data length i := add(i, add(0x36, dataLength)) } } } /// @notice Function to receive Ether. msg.data must be empty receive() external payable {} /// @notice Fallback function is called when msg.data is not empty fallback() external payable {} }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. abstract contract ERC20 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); /*////////////////////////////////////////////////////////////// METADATA STORAGE //////////////////////////////////////////////////////////////*/ string public name; string public symbol; uint8 public immutable decimals; /*////////////////////////////////////////////////////////////// ERC20 STORAGE //////////////////////////////////////////////////////////////*/ uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; /*////////////////////////////////////////////////////////////// EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ uint256 internal immutable INITIAL_CHAIN_ID; bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor( string memory _name, string memory _symbol, uint8 _decimals ) { name = _name; symbol = _symbol; decimals = _decimals; INITIAL_CHAIN_ID = block.chainid; INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); } /*////////////////////////////////////////////////////////////// ERC20 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 amount) public virtual returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) public virtual returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(msg.sender, to, amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(from, to, amount); return true; } /*////////////////////////////////////////////////////////////// EIP-2612 LOGIC //////////////////////////////////////////////////////////////*/ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing // the owner's nonce which cannot realistically overflow. unchecked { address recoveredAddress = ecrecover( keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256( abi.encode( keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ), owner, spender, value, nonces[owner]++, deadline ) ) ) ), v, r, s ); require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); allowance[recoveredAddress][spender] = value; } emit Approval(owner, spender, value); } function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function computeDomainSeparator() internal view virtual returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256("1"), block.chainid, address(this) ) ); } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 amount) internal virtual { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint256 amount) internal virtual { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. unchecked { totalSupply -= amount; } emit Transfer(from, address(0), amount); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; import {ERC20} from "../tokens/ERC20.sol"; /// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol) /// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer. /// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller. library SafeTransferLib { /*////////////////////////////////////////////////////////////// ETH OPERATIONS //////////////////////////////////////////////////////////////*/ function safeTransferETH(address to, uint256 amount) internal { bool success; /// @solidity memory-safe-assembly assembly { // Transfer the ETH and store if it succeeded or not. success := call(gas(), to, amount, 0, 0, 0, 0) } require(success, "ETH_TRANSFER_FAILED"); } /*////////////////////////////////////////////////////////////// ERC20 OPERATIONS //////////////////////////////////////////////////////////////*/ function safeTransferFrom( ERC20 token, address from, address to, uint256 amount ) internal { bool success; /// @solidity memory-safe-assembly assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), 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; /// @solidity memory-safe-assembly assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), 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; /// @solidity memory-safe-assembly assembly { // Get a pointer to some free memory. let freeMemoryPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000) mstore(add(freeMemoryPointer, 4), 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: MIT pragma solidity >=0.8.17 <0.9.0; import "./IFlashBorrower.sol"; /// @notice Minimal interface for BentoBox token vault (V1) interactions interface IBentoBoxV1 { function flashLoan( IFlashBorrower borrower, address receiver, address token, uint256 amount, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.17 <0.9.0; interface IFlashBorrower { /// @notice The flashloan callback. `amount` + `fee` needs to repayed to msg.sender before this call returns. /// @param sender The address of the invoker of this flashloan. /// @param token The address of the token that is loaned. /// @param amount of the `token` that is loaned. /// @param fee The fee that needs to be paid on top for this loan. Needs to be the same as `token`. /// @param data Additional data that was passed to the flashloan function. function onFlashLoan( address sender, address token, uint256 amount, uint256 fee, bytes calldata data ) external; }
// SPDX-License-Identifier: agpl-3.0 pragma solidity >=0.8.17 <0.9.0; /** * @title IFlashLoanReceiver interface * @notice Interface for the Aave fee IFlashLoanReceiver. * @author Aave * @dev implement this interface to develop a flashloan-compatible flashLoanReceiver contract **/ interface IFlashLoanReceiver { function executeOperation( address[] calldata assets, uint256[] calldata amounts, uint256[] calldata premiums, address initiator, bytes calldata params ) external returns (bool); }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity >=0.7.0 <0.9.0; // Inspired by Aave Protocol's IFlashLoanReceiver. interface IFlashLoanRecipient { /** * @dev When `flashLoan` is called on the Vault, it invokes the `receiveFlashLoan` hook on the recipient. * * At the time of the call, the Vault will have transferred `amounts` for `tokens` to the recipient. Before this * call returns, the recipient must have transferred `amounts` plus `feeAmounts` for each token back to the * Vault, or else the entire flash loan will revert. * * `userData` is the same value passed in the `IVault.flashLoan` call. */ function receiveFlashLoan( address[] memory tokens, uint256[] memory amounts, uint256[] memory feeAmounts, bytes memory userData ) external; }
// SPDX-License-Identifier: agpl-3.0 pragma solidity >=0.8.17 <0.9.0; interface ILendingPool { /** * @dev Allows smartcontracts to access the liquidity of the pool within one transaction, * as long as the amount taken plus a fee is returned. * IMPORTANT There are security concerns for developers of flashloan receiver contracts that must be kept into consideration. * For further details please visit https://developers.aave.com * @param receiverAddress The address of the contract receiving the funds, implementing the IFlashLoanReceiver interface * @param assets The addresses of the assets being flash-borrowed * @param amounts The amounts amounts being flash-borrowed * @param modes Types of the debt to open if the flash loan is not returned: * 0 -> Don't open any debt, just revert if funds can't be transferred from the receiver * 1 -> Open debt at stable rate for the value of the amount flash-borrowed to the `onBehalfOf` address * 2 -> Open debt at variable rate for the value of the amount flash-borrowed to the `onBehalfOf` address * @param onBehalfOf The address that will receive the debt in the case of using on `modes` 1 or 2 * @param params Variadic packed params to pass to the receiver as extra information * @param referralCode Code used to register the integrator originating the operation, for potential rewards. * 0 if the action is executed directly by the user, without any middle-man **/ function flashLoan( address receiverAddress, address[] calldata assets, uint256[] calldata amounts, uint256[] calldata modes, address onBehalfOf, bytes calldata params, uint16 referralCode ) external; }
// SPDX-License-Identifier: agpl-3.0 pragma solidity >=0.8.17 <0.9.0; interface IProtocolDataProvider { /** * @notice getReserveData() allows users to get the available liquidity of a given asset. * @dev getReserveData() takes an address of an asset as an argument and returns the available liquidity of that asset. */ function getReserveData( address asset ) external view returns (uint256 availableLiquidity); }
// SPDX-License-Identifier: UNLICENSED pragma solidity >=0.8.13 <0.9.0; interface IUniswapV2Router02 { function getAmountsOut( uint256 amountIn, address[] calldata path ) external view returns (uint256[] memory amounts); function swapExactETHForTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable returns (uint[] memory amounts); }
// SPDX-License-Identifier: GPL-3.0-or-later // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity >=0.8.17 <0.9.0; import "./IFlashLoanRecipient.sol"; /** * @dev Full external interface for the Vault core contract - no external or public methods exist in the contract that * don't override one of these declarations. */ interface IVault { // Flash Loans /** * @dev Performs a 'flash loan', sending tokens to `recipient`, executing the `receiveFlashLoan` hook on it, * and then reverting unless the tokens plus a proportional protocol fee have been returned. * * The `tokens` and `amounts` arrays must have the same length, and each entry in these indicates the loan amount * for each token contract. `tokens` must be sorted in ascending order. * * The 'userData' field is ignored by the Vault, and forwarded as-is to `recipient` as part of the * `receiveFlashLoan` call. * * Emits `FlashLoan` events. */ function flashLoan( IFlashLoanRecipient recipient, address[] memory tokens, uint256[] memory amounts, bytes memory userData ) external; }
{ "remappings": [ "ds-test/=lib/solmate/lib/ds-test/src/", "forge-std/=lib/forge-std/src/", "solmate/=lib/solmate/src/" ], "optimizer": { "enabled": true, "runs": 2000, "details": { "constantOptimizer": true, "yul": true, "yulDetails": { "stackAllocation": true } } }, "metadata": { "bytecodeHash": "ipfs" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "london", "viaIR": true, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint8","name":"_govFee","type":"uint8"},{"internalType":"address","name":"_mevETH","type":"address"},{"internalType":"address","name":"_oracleRouter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InsufficientOutputAmount","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UnsupportedToken","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"MEV","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"}],"name":"destroy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"premiums","type":"uint256[]"},{"internalType":"address","name":"initiator","type":"address"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"executeOperation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"useBalancer","type":"bool"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"transactions","type":"bytes"}],"name":"flash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gov","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"friend","type":"address"}],"name":"isFriend","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onFlashLoan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"feeAmounts","type":"uint256[]"},{"internalType":"bytes","name":"userData","type":"bytes"}],"name":"receiveFlashLoan","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"address","name":"recipient","type":"address"}],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_newFee","type":"uint8"}],"name":"updateFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flashAllowed","type":"bool"},{"internalType":"address","name":"friend","type":"address"}],"name":"updateFriend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newGov","type":"address"}],"name":"updateGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMevEth","type":"address"}],"name":"updateMevETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracleRouter","type":"address"}],"name":"updateOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080346100da57601f6116da38819003918201601f19168301916001600160401b038311848410176100df578084926060946040528339810103126100da5780519060ff82168092036100da57610064604061005d602084016100f5565b92016100f5565b9060005460018060a01b039384918260018060a01b03199416846001541617600155610100600160a81b033260081b169060018060a81b031916171792836000551690600254161760025560081c1660005260036020526040600020600160ff198254161790556040516115d0908161010a8239f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036100da5756fe608080604052600436101561001a575b50361561001857005b005b600090813560e01c908162f55d9d1461104e575080630b33ba7a14610fd257806312d43a5114610fa95780631cb44dfc14610f4c57806323e30c8b14610e4b57806359ea653114610df457806368125a1b14610db7578063920f5c8414610bf1578063949c09b814610bb2578063b763ed2214610b25578063d20c88bd146109a6578063e11e40c1146102b35763f04f27070361000f57346102b05760806003193601126102b05760043567ffffffffffffffff8082116102ac57366023830112156102ac578160040135906100ef826111b0565b6100fc604051918261118d565b8281526020938482016024809560051b830101913683116102a8578501905b8282106102845750505082358281116102805761013c9036906004016111c8565b9160443581811161027c576101559036906004016111c8565b9060643590811161027c573660238201121561027c5761017e9036908681600401359101611226565b9173ba12222222228d8ba445958a75a0704d566bf2c8908133036102525786946101de6044946101d76101d06001600160a01b036101c860009a976101c38c99611550565b61126d565b51169461126d565b519161126d565b51906113b6565b6040519363a9059cbb60e01b85526004850152878401525af13d15601f3d116001600051141617161561020f578280f35b90600f6064926040519262461bcd60e51b845260048401528201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152fd5b60046040517f82b42900000000000000000000000000000000000000000000000000000000008152fd5b8680fd5b8580fd5b81356001600160a01b03811681036102a357815290860190860161011b565b600080fd5b8780fd5b8280fd5b80fd5b50346102b05760806003193601126102b0576102cd611107565b6102d56110c3565b6044359160643567ffffffffffffffff8111610596576102f99036906004016110d9565b9190913386526020926003845260ff604088205416156102525786915a96604051946370a0823160e01b865230600487015286866024816001600160a01b038c165afa95861561096c578596610977575b50806108eb575b156105a5576040519161036383611171565b600183528636818501376001600160a01b0388166103808461126d565b526040519161038e83611171565b600183528736818501376103a18361126d565b5273ba12222222228d8ba445958a75a0704d566bf2c890813b15610280578580946104356104239761041194604051998a98899788967f5c38449e0000000000000000000000000000000000000000000000000000000088523060048901526080602489015260848801906112a0565b906003198783030160448801526112dd565b91600319858403016064860152611311565b03925af1801561059a57610582575b50505b604051906370a0823160e01b825230600483015282826024816001600160a01b0388165afa8015610577578690610548575b6104839250611332565b60ff855416906127109182039082821161053457916104a86104b1926104b894611355565b04945a90611332565b4890611355565b6104c284846113c3565b1061050a576001600160a01b037fefc93621c32b1131b9091d3b843e27aca33a49c5d94aeaeae14d5612a45a8083926104fe8533848416611368565b6040519485521692a280f35b60046040517f42301c23000000000000000000000000000000000000000000000000000000008152fd5b602487634e487b7160e01b81526011600452fd5b508282813d8311610570575b61055e818361118d565b810103126102a3576104839151610479565b503d610554565b6040513d88823e3d90fd5b61058b90611147565b610596578438610444565b8480fd5b6040513d84823e3d90fd5b6040929192516370a0823160e01b815273f5bce5077908a1b7370b9ae04adc565ebd6439669081600482015287816024816001600160a01b038d165afa801561057757839187916108ba575b501061068c57803b15610596576001600160a01b0385896106628296604051988997889687957ff1676d37000000000000000000000000000000000000000000000000000000008752306004880152306024880152166044860152606485015260a0608485015260a4840191611311565b03925af1801561059a57610678575b5050610447565b61068190611147565b610596578438610671565b509250906040517f35ea6a750000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152858160248173057835ad21a177dbdd3090bb1cae03eacf78fc6d5afa80156108af5784918a9161087a575b501061085057604051889261070482611171565b600182528636818401376001600160a01b0388166107218361126d565b526040519461072f86611171565b600186528736818801376107428661126d565b526040519061075082611171565b60018252873681840137846107648361126d565b52737d2768de32b0b80b7a3454c06bdac94a69ddc7a93b15610596576107d0936107f461080c936107e2604051998a9889987fab9c4b5d000000000000000000000000000000000000000000000000000000008a523060048b015260e060248b015260e48a01906112a0565b906003198983030160448a01526112dd565b906003198783030160648801526112dd565b913060848601526003198584030160a4860152611311565b8360c4830152038183737d2768de32b0b80b7a3454c06bdac94a69ddc7a95af180156105775761083d575b50610447565b61084990959195611147565b9338610837565b60046040517f6a172882000000000000000000000000000000000000000000000000000000008152fd5b809250878092503d83116108a8575b610893818361118d565b810103126108a457839051386106f0565b8880fd5b503d610889565b6040513d8b823e3d90fd5b809250898092503d83116108e4575b6108d3818361118d565b8101031261028057829051386105f1565b503d6108c9565b506040516370a0823160e01b815273ba12222222228d8ba445958a75a0704d566bf2c8600482015286816024816001600160a01b038c165afa801561096c578291869161093b575b501015610351565b809250888092503d8311610965575b610954818361118d565b810103126105965781905138610933565b503d61094a565b6040513d87823e3d90fd5b9095508681813d831161099f575b61098f818361118d565b810103126105965751943861034a565b503d610985565b50346102b05760406003193601126102b05760043567ffffffffffffffff8111610b21576109d8903690600401611116565b91906109e26110c3565b906001600160a01b039081845460081c16330361025257835b858110610a5757848080808047895af115610a135780f35b606460405162461bcd60e51b815260206004820152601360248201527f4554485f5452414e534645525f4641494c4544000000000000000000000000006044820152fd5b82610a668260051b84016113a2565b166040516370a0823160e01b81523060048201526020908181602481865afa918215610b16579087918993610ae4575b5050610aa192611368565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ad0576001016109fb565b602485634e487b7160e01b81526011600452fd5b8193508092503d8311610b0f575b610afc818361118d565b8101031261027c575185610aa138610a96565b503d610af2565b6040513d8a823e3d90fd5b5080fd5b50346102b05760206003193601126102b057610b3f6110ad565b6001600160a01b039081835460081c16330361025257168015610b88577fffffffffffffffffffffffff0000000000000000000000000000000000000000600154161760015580f35b60046040517fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b50346102b05760206003193601126102b05760043560ff8116809103610b215781546001600160a01b038160081c1633036102525760ff191617815580f35b50346102b05760a06003193601126102b05767ffffffffffffffff90600435828111610b2157610c25903690600401611116565b90602493843581811161059657610c40903690600401611116565b939060443583811161027c57610c5a903690600401611116565b90936001600160a01b0390606435828116036108a4576084359081116108a457610c889036906004016110d9565b969094737d2768de32b0b80b7a3454c06bdac94a69ddc7a99586330361025257610cb8610cbd918c9a3691611226565b611550565b15610da457610ccb906113a2565b169515610d915715610d7e57602094610cea85926044953590356113b6565b604051937f095ea7b30000000000000000000000000000000000000000000000000000000085526004850152888401525af19051600114601f3d11163d15171615610d3a57602060405160018152f35b606490600e6040519162461bcd60e51b8352602060048401528201527f415050524f56455f4641494c45440000000000000000000000000000000000006044820152fd5b8684634e487b7160e01b81526032600452fd5b8785634e487b7160e01b81526032600452fd5b8987634e487b7160e01b81526032600452fd5b50346102b05760206003193601126102b05760ff60406020926001600160a01b03610de06110ad565b168152600384522054166040519015158152f35b50346102b05760406003193601126102b057610e0e611107565b610e166110c3565b6001600160a01b039081845460081c163303610252571682526003602052604082209060ff60ff198354169115151617905580f35b50346102b05760a06003193601126102b057610e656110ad565b50610e6e6110c3565b60843567ffffffffffffffff81116102ac57610e8e9036906004016110d9565b909173f5bce5077908a1b7370b9ae04adc565ebd64396680330361025257846001600160a01b03604493610eca610cb860209885983691611226565b610ed760643586356113b6565b6040519463a9059cbb60e01b865260048601526024850152165af13d15601f3d11600184511416171615610f085780f35b606460405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152fd5b50346102b05760206003193601126102b057610f666110ad565b6001600160a01b039081835460081c16330361025257167fffffffffffffffffffffffff0000000000000000000000000000000000000000600254161760025580f35b50346102b057806003193601126102b0576001600160a01b036020915460081c16604051908152f35b50346102b05760206003193601126102b057610fec6110ad565b8154906001600160a01b03808360081c16330361025257811615610b885774ffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffff0000000000000000000000000000000000000000ff9160081b16911617815580f35b905034610b21576020600319360112610b2157600435916001600160a01b039081841684036102b0575460081c1633036110855750ff5b807f82b429000000000000000000000000000000000000000000000000000000000060049252fd5b600435906001600160a01b03821682036102a357565b602435906001600160a01b03821682036102a357565b9181601f840112156102a35782359167ffffffffffffffff83116102a357602083818601950101116102a357565b6004359081151582036102a357565b9181601f840112156102a35782359167ffffffffffffffff83116102a3576020808501948460051b0101116102a357565b67ffffffffffffffff811161115b57604052565b634e487b7160e01b600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761115b57604052565b90601f601f19910116810190811067ffffffffffffffff82111761115b57604052565b67ffffffffffffffff811161115b5760051b60200190565b81601f820112156102a3578035916111df836111b0565b926111ed604051948561118d565b808452602092838086019260051b8201019283116102a3578301905b828210611217575050505090565b81358152908301908301611209565b92919267ffffffffffffffff821161115b57604051916112506020601f19601f840116018461118d565b8294818452818301116102a3578281602093846000960137010152565b80511561127a5760200190565b634e487b7160e01b600052603260045260246000fd5b80516001101561127a5760400190565b90815180825260208080930193019160005b8281106112c0575050505090565b83516001600160a01b0316855293810193928101926001016112b2565b90815180825260208080930193019160005b8281106112fd575050505090565b8351855293810193928101926001016112ef565b601f8260209493601f19938186528686013760008582860101520116010190565b9190820391821161133f57565b634e487b7160e01b600052601160045260246000fd5b8181029291811591840414171561133f57565b600091826044926020956040519363a9059cbb60e01b8552600485015260248401525af13d15601f3d1160016000511416171615610f0857565b356001600160a01b03811681036102a35790565b9190820180921161133f57565b6001600160a01b038091169173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28084146115495782600154168414611549576040918251606081019467ffffffffffffffff958281108782111761115b578552600282526020938483019786368a3783511561127a57611485985261143b83611290565b52600254169184519283917fd06ca61f000000000000000000000000000000000000000000000000000000008352600483015285602483015281806000998a9560448301906112a0565b03915afa93841561153f5785946114b6575b5050505060028151106114b2576114ae9150611290565b5190565b5090565b90919293503d8086843e6114ca818461118d565b8201918381840312610280578051918211610280570181601f82011215610596578051906115036114fa836111b0565b9551958661118d565b818552838086019260051b820101928311610280578301905b828210611530575050505038808080611497565b8151815290830190830161151c565b83513d87823e3d90fd5b5091505090565b90815191602090815b848110611567575050509050565b8082018381015160601c91603482015160f01c80926000809281926036978882019151905af1156102b05750010161155956fea2646970667358221220c10190cb8257d6aab42b7a7354fadd44bd6fb7189e796cd0f12e4600a468409164736f6c6343000811003300000000000000000000000000000000000000000000000000000000000000010000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca000000000000000000000000077337deea78720542f0a1325394def165918d562
Deployed Bytecode
0x608080604052600436101561001a575b50361561001857005b005b600090813560e01c908162f55d9d1461104e575080630b33ba7a14610fd257806312d43a5114610fa95780631cb44dfc14610f4c57806323e30c8b14610e4b57806359ea653114610df457806368125a1b14610db7578063920f5c8414610bf1578063949c09b814610bb2578063b763ed2214610b25578063d20c88bd146109a6578063e11e40c1146102b35763f04f27070361000f57346102b05760806003193601126102b05760043567ffffffffffffffff8082116102ac57366023830112156102ac578160040135906100ef826111b0565b6100fc604051918261118d565b8281526020938482016024809560051b830101913683116102a8578501905b8282106102845750505082358281116102805761013c9036906004016111c8565b9160443581811161027c576101559036906004016111c8565b9060643590811161027c573660238201121561027c5761017e9036908681600401359101611226565b9173ba12222222228d8ba445958a75a0704d566bf2c8908133036102525786946101de6044946101d76101d06001600160a01b036101c860009a976101c38c99611550565b61126d565b51169461126d565b519161126d565b51906113b6565b6040519363a9059cbb60e01b85526004850152878401525af13d15601f3d116001600051141617161561020f578280f35b90600f6064926040519262461bcd60e51b845260048401528201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152fd5b60046040517f82b42900000000000000000000000000000000000000000000000000000000008152fd5b8680fd5b8580fd5b81356001600160a01b03811681036102a357815290860190860161011b565b600080fd5b8780fd5b8280fd5b80fd5b50346102b05760806003193601126102b0576102cd611107565b6102d56110c3565b6044359160643567ffffffffffffffff8111610596576102f99036906004016110d9565b9190913386526020926003845260ff604088205416156102525786915a96604051946370a0823160e01b865230600487015286866024816001600160a01b038c165afa95861561096c578596610977575b50806108eb575b156105a5576040519161036383611171565b600183528636818501376001600160a01b0388166103808461126d565b526040519161038e83611171565b600183528736818501376103a18361126d565b5273ba12222222228d8ba445958a75a0704d566bf2c890813b15610280578580946104356104239761041194604051998a98899788967f5c38449e0000000000000000000000000000000000000000000000000000000088523060048901526080602489015260848801906112a0565b906003198783030160448801526112dd565b91600319858403016064860152611311565b03925af1801561059a57610582575b50505b604051906370a0823160e01b825230600483015282826024816001600160a01b0388165afa8015610577578690610548575b6104839250611332565b60ff855416906127109182039082821161053457916104a86104b1926104b894611355565b04945a90611332565b4890611355565b6104c284846113c3565b1061050a576001600160a01b037fefc93621c32b1131b9091d3b843e27aca33a49c5d94aeaeae14d5612a45a8083926104fe8533848416611368565b6040519485521692a280f35b60046040517f42301c23000000000000000000000000000000000000000000000000000000008152fd5b602487634e487b7160e01b81526011600452fd5b508282813d8311610570575b61055e818361118d565b810103126102a3576104839151610479565b503d610554565b6040513d88823e3d90fd5b61058b90611147565b610596578438610444565b8480fd5b6040513d84823e3d90fd5b6040929192516370a0823160e01b815273f5bce5077908a1b7370b9ae04adc565ebd6439669081600482015287816024816001600160a01b038d165afa801561057757839187916108ba575b501061068c57803b15610596576001600160a01b0385896106628296604051988997889687957ff1676d37000000000000000000000000000000000000000000000000000000008752306004880152306024880152166044860152606485015260a0608485015260a4840191611311565b03925af1801561059a57610678575b5050610447565b61068190611147565b610596578438610671565b509250906040517f35ea6a750000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152858160248173057835ad21a177dbdd3090bb1cae03eacf78fc6d5afa80156108af5784918a9161087a575b501061085057604051889261070482611171565b600182528636818401376001600160a01b0388166107218361126d565b526040519461072f86611171565b600186528736818801376107428661126d565b526040519061075082611171565b60018252873681840137846107648361126d565b52737d2768de32b0b80b7a3454c06bdac94a69ddc7a93b15610596576107d0936107f461080c936107e2604051998a9889987fab9c4b5d000000000000000000000000000000000000000000000000000000008a523060048b015260e060248b015260e48a01906112a0565b906003198983030160448a01526112dd565b906003198783030160648801526112dd565b913060848601526003198584030160a4860152611311565b8360c4830152038183737d2768de32b0b80b7a3454c06bdac94a69ddc7a95af180156105775761083d575b50610447565b61084990959195611147565b9338610837565b60046040517f6a172882000000000000000000000000000000000000000000000000000000008152fd5b809250878092503d83116108a8575b610893818361118d565b810103126108a457839051386106f0565b8880fd5b503d610889565b6040513d8b823e3d90fd5b809250898092503d83116108e4575b6108d3818361118d565b8101031261028057829051386105f1565b503d6108c9565b506040516370a0823160e01b815273ba12222222228d8ba445958a75a0704d566bf2c8600482015286816024816001600160a01b038c165afa801561096c578291869161093b575b501015610351565b809250888092503d8311610965575b610954818361118d565b810103126105965781905138610933565b503d61094a565b6040513d87823e3d90fd5b9095508681813d831161099f575b61098f818361118d565b810103126105965751943861034a565b503d610985565b50346102b05760406003193601126102b05760043567ffffffffffffffff8111610b21576109d8903690600401611116565b91906109e26110c3565b906001600160a01b039081845460081c16330361025257835b858110610a5757848080808047895af115610a135780f35b606460405162461bcd60e51b815260206004820152601360248201527f4554485f5452414e534645525f4641494c4544000000000000000000000000006044820152fd5b82610a668260051b84016113a2565b166040516370a0823160e01b81523060048201526020908181602481865afa918215610b16579087918993610ae4575b5050610aa192611368565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ad0576001016109fb565b602485634e487b7160e01b81526011600452fd5b8193508092503d8311610b0f575b610afc818361118d565b8101031261027c575185610aa138610a96565b503d610af2565b6040513d8a823e3d90fd5b5080fd5b50346102b05760206003193601126102b057610b3f6110ad565b6001600160a01b039081835460081c16330361025257168015610b88577fffffffffffffffffffffffff0000000000000000000000000000000000000000600154161760015580f35b60046040517fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b50346102b05760206003193601126102b05760043560ff8116809103610b215781546001600160a01b038160081c1633036102525760ff191617815580f35b50346102b05760a06003193601126102b05767ffffffffffffffff90600435828111610b2157610c25903690600401611116565b90602493843581811161059657610c40903690600401611116565b939060443583811161027c57610c5a903690600401611116565b90936001600160a01b0390606435828116036108a4576084359081116108a457610c889036906004016110d9565b969094737d2768de32b0b80b7a3454c06bdac94a69ddc7a99586330361025257610cb8610cbd918c9a3691611226565b611550565b15610da457610ccb906113a2565b169515610d915715610d7e57602094610cea85926044953590356113b6565b604051937f095ea7b30000000000000000000000000000000000000000000000000000000085526004850152888401525af19051600114601f3d11163d15171615610d3a57602060405160018152f35b606490600e6040519162461bcd60e51b8352602060048401528201527f415050524f56455f4641494c45440000000000000000000000000000000000006044820152fd5b8684634e487b7160e01b81526032600452fd5b8785634e487b7160e01b81526032600452fd5b8987634e487b7160e01b81526032600452fd5b50346102b05760206003193601126102b05760ff60406020926001600160a01b03610de06110ad565b168152600384522054166040519015158152f35b50346102b05760406003193601126102b057610e0e611107565b610e166110c3565b6001600160a01b039081845460081c163303610252571682526003602052604082209060ff60ff198354169115151617905580f35b50346102b05760a06003193601126102b057610e656110ad565b50610e6e6110c3565b60843567ffffffffffffffff81116102ac57610e8e9036906004016110d9565b909173f5bce5077908a1b7370b9ae04adc565ebd64396680330361025257846001600160a01b03604493610eca610cb860209885983691611226565b610ed760643586356113b6565b6040519463a9059cbb60e01b865260048601526024850152165af13d15601f3d11600184511416171615610f085780f35b606460405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152fd5b50346102b05760206003193601126102b057610f666110ad565b6001600160a01b039081835460081c16330361025257167fffffffffffffffffffffffff0000000000000000000000000000000000000000600254161760025580f35b50346102b057806003193601126102b0576001600160a01b036020915460081c16604051908152f35b50346102b05760206003193601126102b057610fec6110ad565b8154906001600160a01b03808360081c16330361025257811615610b885774ffffffffffffffffffffffffffffffffffffffff007fffffffffffffffffffffff0000000000000000000000000000000000000000ff9160081b16911617815580f35b905034610b21576020600319360112610b2157600435916001600160a01b039081841684036102b0575460081c1633036110855750ff5b807f82b429000000000000000000000000000000000000000000000000000000000060049252fd5b600435906001600160a01b03821682036102a357565b602435906001600160a01b03821682036102a357565b9181601f840112156102a35782359167ffffffffffffffff83116102a357602083818601950101116102a357565b6004359081151582036102a357565b9181601f840112156102a35782359167ffffffffffffffff83116102a3576020808501948460051b0101116102a357565b67ffffffffffffffff811161115b57604052565b634e487b7160e01b600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761115b57604052565b90601f601f19910116810190811067ffffffffffffffff82111761115b57604052565b67ffffffffffffffff811161115b5760051b60200190565b81601f820112156102a3578035916111df836111b0565b926111ed604051948561118d565b808452602092838086019260051b8201019283116102a3578301905b828210611217575050505090565b81358152908301908301611209565b92919267ffffffffffffffff821161115b57604051916112506020601f19601f840116018461118d565b8294818452818301116102a3578281602093846000960137010152565b80511561127a5760200190565b634e487b7160e01b600052603260045260246000fd5b80516001101561127a5760400190565b90815180825260208080930193019160005b8281106112c0575050505090565b83516001600160a01b0316855293810193928101926001016112b2565b90815180825260208080930193019160005b8281106112fd575050505090565b8351855293810193928101926001016112ef565b601f8260209493601f19938186528686013760008582860101520116010190565b9190820391821161133f57565b634e487b7160e01b600052601160045260246000fd5b8181029291811591840414171561133f57565b600091826044926020956040519363a9059cbb60e01b8552600485015260248401525af13d15601f3d1160016000511416171615610f0857565b356001600160a01b03811681036102a35790565b9190820180921161133f57565b6001600160a01b038091169173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28084146115495782600154168414611549576040918251606081019467ffffffffffffffff958281108782111761115b578552600282526020938483019786368a3783511561127a57611485985261143b83611290565b52600254169184519283917fd06ca61f000000000000000000000000000000000000000000000000000000008352600483015285602483015281806000998a9560448301906112a0565b03915afa93841561153f5785946114b6575b5050505060028151106114b2576114ae9150611290565b5190565b5090565b90919293503d8086843e6114ca818461118d565b8201918381840312610280578051918211610280570181601f82011215610596578051906115036114fa836111b0565b9551958661118d565b818552838086019260051b820101928311610280578301905b828210611530575050505038808080611497565b8151815290830190830161151c565b83513d87823e3d90fd5b5091505090565b90815191602090815b848110611567575050509050565b8082018381015160601c91603482015160f01c80926000809281926036978882019151905af1156102b05750010161155956fea2646970667358221220c10190cb8257d6aab42b7a7354fadd44bd6fb7189e796cd0f12e4600a468409164736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000010000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca000000000000000000000000077337deea78720542f0a1325394def165918d562
-----Decoded View---------------
Arg [0] : _govFee (uint8): 1
Arg [1] : _mevETH (address): 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0
Arg [2] : _oracleRouter (address): 0x77337dEEA78720542f0A1325394Def165918D562
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [1] : 0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0
Arg [2] : 00000000000000000000000077337deea78720542f0a1325394def165918d562
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.