Address Contract Verified
Address
0x7e7d5170656657650e062Ad8F78b258B9Da700F2
Balance
0.001000 ETH ($2.13)
Nonce
1
Code Size
8450 bytes
Creator
0x77E76c5b...344d at tx 0x7c11368b...e60af8
Indexed Transactions
0 (1 on-chain, 0.9% indexed)
Contract Bytecode
8450 bytes
0x6080604052600436106101c8575f3560e01c80638456cb59116100f2578063ad5c464811610092578063f14210a611610062578063f14210a61461056c578063f2fde38b1461058b578063f8b2cb4f146105aa578063fa76dcf2146105c9575f80fd5b8063ad5c4648146104d8578063c54e44eb146104ff578063e0bab4c414610526578063e441d7ec1461054d575f80fd5b80638da5cb5b116100cd5780638da5cb5b1461044d57806394d8572a1461046b5780639e281a9814610492578063a82ed9ec146104b1575f80fd5b80638456cb59146103eb57806389a30271146103ff5780638bdcdb9314610426575f80fd5b806343656f11116101685780635c2b2af3116101385780635c2b2af3146103825780635c975abb1461039b5780636e947298146103ba57806375151b63146103cc575f80fd5b806343656f11146102e8578063449de5f11461030f5780634b79cb0f146103365780634d40095914610355575f80fd5b8063277754ed116101a3578063277754ed146102735780632a2cef0a1461029a5780633e1bdd14146102b95780633f4ba83a146102d2575f80fd5b806307b0e2fe146101d357806308a01675146102055780631b11d0ff14610244575f80fd5b366101cf57005b5f80fd5b3480156101de575f80fd5b506101f26101ed366004611abf565b6105e8565b6040519081526020015b60405180910390f35b348015610210575f80fd5b5061022c7387870bca3f3fd6335c3f4ce8392d69350b4fa4e281565b6040516001600160a01b0390911681526020016101fc565b34801561024f575f80fd5b5061026361025e366004611ada565b6106f3565b60405190151581526020016101fc565b34801561027e575f80fd5b5061022c73d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b3480156102a5575f80fd5b506101f26102b4366004611abf565b610855565b3480156102c4575f80fd5b506101f26509184e72a00081565b3480156102dd575f80fd5b506102e66108d0565b005b3480156102f3575f80fd5b5061022c738fffffd4afb6115b954bd326cbe7b4ba576818f681565b34801561031a575f80fd5b5061022c733e7d1eab13ad0104d2750b8863b489d65364e32d81565b348015610341575f80fd5b506101f2610350366004611abf565b610907565b348015610360575f80fd5b5061037461036f366004611b7c565b6109fe565b6040516101fc929190611be9565b34801561038d575f80fd5b506101f265048c2739500081565b3480156103a6575f80fd5b505f5461026390600160a01b900460ff1681565b3480156103c5575f80fd5b50476101f2565b3480156103d7575f80fd5b506102636103e6366004611abf565b610ac9565b3480156103f6575f80fd5b506102e6610ad9565b34801561040a575f80fd5b5061022c73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b348015610431575f80fd5b5061022c73aed0c38402a5d19df6e4c03f4e2dced6e29c1ee981565b348015610458575f80fd5b505f5461022c906001600160a01b031681565b348015610476575f80fd5b5061022c735f4ec3df9cbd43714fe2740f5e3616155c5b841981565b34801561049d575f80fd5b506102e66104ac366004611b7c565b610b16565b3480156104bc575f80fd5b5061022c737a250d5630b4cf539739df2c5dacb4c659f2488d81565b3480156104e3575f80fd5b5061022c73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b34801561050a575f80fd5b5061022c73dac17f958d2ee523a2206206994597c13d831ec781565b348015610531575f80fd5b5061022c736b175474e89094c44da98b954eedeac495271d0f81565b348015610558575f80fd5b50610263610567366004611c0b565b610c1c565b348015610577575f80fd5b506102e6610586366004611c6f565b610fc9565b348015610596575f80fd5b506102e66105a5366004611abf565b611081565b3480156105b5575f80fd5b506101f26105c4366004611abf565b61114d565b3480156105d4575f80fd5b506101f26105e3366004611b7c565b6111b5565b5f806105f3836111c7565b90505f816001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610632573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106569190611ca4565b5050509150505f8190505f856001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561069d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c19190611cf0565b9050816106cf82600a611e04565b6106df9065048c27395000611e12565b6106e99190611e29565b9695505050505050565b5f60015460011461071f5760405162461bcd60e51b815260040161071690611e48565b60405180910390fd5b6002600155337387870bca3f3fd6335c3f4ce8392d69350b4fa4e2146107785760405162461bcd60e51b815260206004820152600e60248201526d13db9b1e4810585d99481c1bdbdb60921b6044820152606401610716565b6001600160a01b03841630146107c45760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b21034b734ba34b0ba37b960791b6044820152606401610716565b5f808080806107d587890189611e75565b94509450945094509450846001600160a01b03168c6001600160a01b0316146108315760405162461bcd60e51b815260206004820152600e60248201526d0a8ded6cadc40dad2e6dac2e8c6d60931b6044820152606401610716565b61084085858d8d878787611310565b505060018080559a9950505050505050505050565b5f80610860836111c7565b90505f816001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561089f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c39190611ca4565b5091979650505050505050565b5f546001600160a01b031633146108f95760405162461bcd60e51b815260040161071690611eb4565b5f805460ff60a01b19169055565b5f80610912836111c7565b90505f816001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610951573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109759190611ca4565b5050509150505f8190505f856001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e09190611cf0565b9050816109ee82600a611e04565b6106df906509184e72a000611e12565b5f60605f610a0c85856116f4565b905065048c27395000811015610a5257505060408051808201909152601581527442656c6f77202435302c303030206d696e696d756d60581b60208201525f9150610ac2565b6509184e72a000811115610a9757505060408051808201909152601681527541626f766520243130302c303030206d6178696d756d60501b60208201525f9150610ac2565b505060408051808201909152600d81526c57697468696e206c696d69747360981b6020820152600191505b9250929050565b5f610ad38261182f565b92915050565b5f546001600160a01b03163314610b025760405162461bcd60e51b815260040161071690611eb4565b5f805460ff60a01b1916600160a01b179055565b5f546001600160a01b03163314610b3f5760405162461bcd60e51b815260040161071690611eb4565b600154600114610b615760405162461bcd60e51b815260040161071690611e48565b600260015560405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303815f875af1158015610bb0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd49190611ed8565b5060405181815233906001600160a01b038416907e1a143d5b175701cb3246058ffac3d63945192075a926ff73a19930f09d587a9060200160405180910390a3505060018055565b5f80546001600160a01b03163314610c465760405162461bcd60e51b815260040161071690611eb4565b5f54600160a01b900460ff1615610c915760405162461bcd60e51b815260206004820152600f60248201526e10dbdb9d1c9858dd081c185d5cd959608a1b6044820152606401610716565b600154600114610cb35760405162461bcd60e51b815260040161071690611e48565b6002600155610cc18661182f565b610d045760405162461bcd60e51b8152602060048201526014602482015273151bdad95b8c081b9bdd081cdd5c1c1bdc9d195960621b6044820152606401610716565b610d0d8261182f565b610d505760405162461bcd60e51b8152602060048201526014602482015273151bdad95b8c481b9bdd081cdd5c1c1bdc9d195960621b6044820152606401610716565b816001600160a01b0316866001600160a01b031603610db15760405162461bcd60e51b815260206004820152601860248201527f546f6b656e73206d75737420626520646966666572656e7400000000000000006044820152606401610716565b5f8511610df55760405162461bcd60e51b81526020600482015260126024820152710416d6f756e74206d757374206265203e20360741b6044820152606401610716565b6001600160a01b038416737a250d5630b4cf539739df2c5dacb4c659f2488d1480610e3c57506001600160a01b03841673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f145b610e7a5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c696420726f757465724160881b6044820152606401610716565b6001600160a01b038316737a250d5630b4cf539739df2c5dacb4c659f2488d1480610ec157506001600160a01b03831673d9e1ce17f2641f24ae83637ab66a2cca9c378b9f145b610eff5760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b2103937baba32b92160891b6044820152606401610716565b610f0986866118ca565b604080516001600160a01b038881166020830152848116828401528681166060830152851660808201523360a0808301919091528251808303909101815260c08201928390526310ac2ddf60e21b9092527387870bca3f3fd6335c3f4ce8392d69350b4fa4e2906342b0b77c90610f8c9030908b908b9087905f9060c401611ef7565b5f604051808303815f87803b158015610fa3575f80fd5b505af1158015610fb5573d5f803e3d5ffd5b505060018080559998505050505050505050565b5f546001600160a01b03163314610ff25760405162461bcd60e51b815260040161071690611eb4565b6001546001146110145760405162461bcd60e51b815260040161071690611e48565b6002600155604051339082156108fc029083905f818181858888f19350505050158015611043573d5f803e3d5ffd5b5060405181815233905f907e1a143d5b175701cb3246058ffac3d63945192075a926ff73a19930f09d587a9060200160405180910390a35060018055565b5f546001600160a01b031633146110aa5760405162461bcd60e51b815260040161071690611eb4565b6001600160a01b0381166110f45760405162461bcd60e51b815260206004820152601160248201527024b73b30b634b2103732bb9037bbb732b960791b6044820152606401610716565b5f80546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516370a0823160e01b81523060048201525f906001600160a01b038316906370a0823190602401602060405180830381865afa158015611191573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ad39190611f3f565b5f6111c083836116f4565b9392505050565b5f73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc1196001600160a01b038316016112085750735f4ec3df9cbd43714fe2740f5e3616155c5b8419919050565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb47196001600160a01b038316016112485750738fffffd4afb6115b954bd326cbe7b4ba576818f6919050565b736b175474e89094c44da98b954eedeac495271d0e196001600160a01b03831601611288575073aed0c38402a5d19df6e4c03f4e2dced6e29c1ee9919050565b73dac17f958d2ee523a2206206994597c13d831ec6196001600160a01b038316016112c85750733e7d1eab13ad0104d2750b8863b489d65364e32d919050565b60405162461bcd60e51b815260206004820152601760248201527f4e6f207072696365206665656420666f7220746f6b656e0000000000000000006044820152606401610716565b60405163095ea7b360e01b81526001600160a01b0384811660048301526024820187905288169063095ea7b3906044016020604051808303815f875af115801561135c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113809190611ed8565b5061138d878787866119a9565b6040516370a0823160e01b81523060048201525f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156113d1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113f59190611f3f565b90505f811161143a5760405162461bcd60e51b8152602060048201526011602482015270119a5c9cdd081cddd85c0819985a5b1959607a1b6044820152606401610716565b60405163095ea7b360e01b81526001600160a01b0384811660048301526024820183905288169063095ea7b3906044016020604051808303815f875af1158015611486573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114aa9190611ed8565b506114b7878983866119a9565b6040516370a0823160e01b81523060048201525f906001600160a01b038a16906370a0823190602401602060405180830381865afa1580156114fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061151f9190611f3f565b90505f61152c8789611f56565b90508082101561157e5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f7420726570617920666c617368206c6f616e0000000000000000006044820152606401610716565b5f6115898284611f69565b60405163095ea7b360e01b81527387870bca3f3fd6335c3f4ce8392d69350b4fa4e26004820152602481018490529091506001600160a01b038c169063095ea7b3906044016020604051808303815f875af11580156115ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061160e9190611ed8565b5080156116875760405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390528c169063a9059cbb906044016020604051808303815f875af1158015611661573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116859190611ed8565b505b846001600160a01b03168a6001600160a01b03168c6001600160a01b03167f3eebd3bcce2cb11e52a53c25c83796b82fc25c077d0324a87d7f897b82f46a238c856040516116df929190918252602082015260400190565b60405180910390a45050505050505050505050565b5f80836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611732573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117569190611cf0565b90505f611762856111c7565b90505f816001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156117a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117c59190611ca4565b5050509150505f811361181a5760405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642070726963652066726f6d20436861696e6c696e6b000000006044820152606401610716565b61182583600a611e04565b6106df8287611e12565b5f6001600160a01b03821673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2148061187757506001600160a01b03821673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48145b8061189e57506001600160a01b038216736b175474e89094c44da98b954eedeac495271d0f145b80610ad357506001600160a01b03821673dac17f958d2ee523a2206206994597c13d831ec71492915050565b5f6118d583836116f4565b905065048c2739500081101561193d5760405162461bcd60e51b815260206004820152602760248201527f426f72726f7720616d6f756e742062656c6f77202435302c30303020555344206044820152666d696e696d756d60c81b6064820152608401610716565b6509184e72a0008111156119a45760405162461bcd60e51b815260206004820152602860248201527f426f72726f7720616d6f756e742061626f766520243130302c30303020555344604482015267206d6178696d756d60c01b6064820152608401610716565b505050565b6040805160028082526060820183525f9260208301908036833701905050905084815f815181106119dc576119dc611f90565b60200260200101906001600160a01b031690816001600160a01b0316815250508381600181518110611a1057611a10611f90565b6001600160a01b03928316602091820292909201015282166338ed17398460018430611a3e4261012c611f56565b6040518663ffffffff1660e01b8152600401611a5e959493929190611fa4565b5f604051808303815f875af1158015611a79573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611aa09190810190612013565b505050505050565b6001600160a01b0381168114611abc575f80fd5b50565b5f60208284031215611acf575f80fd5b81356111c081611aa8565b5f805f805f8060a08789031215611aef575f80fd5b8635611afa81611aa8565b955060208701359450604087013593506060870135611b1881611aa8565b9250608087013567ffffffffffffffff80821115611b34575f80fd5b818901915089601f830112611b47575f80fd5b813581811115611b55575f80fd5b8a6020828501011115611b66575f80fd5b6020830194508093505050509295509295509295565b5f8060408385031215611b8d575f80fd5b8235611b9881611aa8565b946020939093013593505050565b5f81518084525f5b81811015611bca57602081850181015186830182015201611bae565b505f602082860101526020601f19601f83011685010191505092915050565b8215158152604060208201525f611c036040830184611ba6565b949350505050565b5f805f805f60a08688031215611c1f575f80fd5b8535611c2a81611aa8565b9450602086013593506040860135611c4181611aa8565b92506060860135611c5181611aa8565b91506080860135611c6181611aa8565b809150509295509295909350565b5f60208284031215611c7f575f80fd5b5035919050565b805169ffffffffffffffffffff81168114611c9f575f80fd5b919050565b5f805f805f60a08688031215611cb8575f80fd5b611cc186611c86565b9450602086015193506040860151925060608601519150611ce460808701611c86565b90509295509295909350565b5f60208284031215611d00575f80fd5b815160ff811681146111c0575f80fd5b634e487b7160e01b5f52601160045260245ffd5b600181815b80851115611d5e57815f1904821115611d4457611d44611d10565b80851615611d5157918102915b93841c9390800290611d29565b509250929050565b5f82611d7457506001610ad3565b81611d8057505f610ad3565b8160018114611d965760028114611da057611dbc565b6001915050610ad3565b60ff841115611db157611db1611d10565b50506001821b610ad3565b5060208310610133831016604e8410600b8410161715611ddf575081810a610ad3565b611de98383611d24565b805f1904821115611dfc57611dfc611d10565b029392505050565b5f6111c060ff841683611d66565b8082028115828204841417610ad357610ad3611d10565b5f82611e4357634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252601390820152721499595b9d1c985b98de4819195d1958dd1959606a1b604082015260600190565b5f805f805f60a08688031215611e89575f80fd5b8535611e9481611aa8565b94506020860135611ea481611aa8565b93506040860135611c4181611aa8565b6020808252600a908201526927b7363c9037bbb732b960b11b604082015260600190565b5f60208284031215611ee8575f80fd5b815180151581146111c0575f80fd5b6001600160a01b038681168252851660208201526040810184905260a0606082018190525f90611f2990830185611ba6565b905061ffff831660808301529695505050505050565b5f60208284031215611f4f575f80fd5b5051919050565b80820180821115610ad357610ad3611d10565b81810381811115610ad357610ad3611d10565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b81811015611ff25784516001600160a01b031683529383019391830191600101611fcd565b50506001600160a01b03969096166060850152505050608001529392505050565b5f6020808385031215612024575f80fd5b825167ffffffffffffffff8082111561203b575f80fd5b818501915085601f83011261204e575f80fd5b81518181111561206057612060611f7c565b8060051b604051601f19603f8301168101818110858211171561208557612085611f7c565b6040529182528482019250838101850191888311156120a2575f80fd5b938501935b828510156120c0578451845293850193928501926120a7565b9897505050505050505056fea2646970667358221220f1d7c4f5a67cf0ecbf33a91516f86c51023b2fe50da9a6aac1e7f0feda0c13c564736f6c63430008140033
Verified Source Code Full Match
Compiler: v0.8.20+commit.a1b79de6
EVM: shanghai
Optimization: Yes (200 runs)
FlashloanSMAAVE.sol 393 lines
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.20;
// =================== CONFIRMED AAVE V3 ADDRESSES ===================
address constant AAVE_V3_MAINNET_PROVIDER = 0x2f39d218133AFaB8F2B819B1066c7E434Ad94E9e;
address constant AAVE_V3_POOL = 0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2;
// =================== ERC20 INTERFACE ===================
interface IERC20 {
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function approve(address spender, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function decimals() external view returns (uint8);
}
// =================== DEX INTERFACE ===================
interface IUniswapV2Router {
function swapExactTokensForTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
}
// =================== AAWE V3 INTERFACE ===================
interface IAavePool {
function flashLoanSimple(
address receiverAddress,
address asset,
uint256 amount,
bytes calldata params,
uint16 referralCode
) external;
}
// =================== PRICE FEED INTERFACE ===================
interface AggregatorV3Interface {
function latestRoundData() external view returns (
uint80 roundId,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
);
}
// =================== MAIN CONTRACT ===================
contract FlashLoanArbitrage {
address public owner;
bool public paused;
// ✅ Fixed Aave V3 Pool address
IAavePool public constant AAVE_POOL = IAavePool(AAVE_V3_POOL);
// ✅ CONFIRMED: Ethereum Mainnet Token Addresses
address public constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
address public constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;
address public constant DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F;
address public constant USDT = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
// ✅ CONFIRMED: DEX Router Addresses
address public constant UNISWAP_V2_ROUTER = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
address public constant SUSHISWAP_ROUTER = 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F;
// ✅ CONFIRMED: Chainlink Price Feed Addresses
address public constant ETH_USD_FEED = 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419;
address public constant USDC_USD_FEED = 0x8fFfFfd4AfB6115b954Bd326cbe7B4BA576818f6;
address public constant DAI_USD_FEED = 0xAed0c38402a5d19df6E4c03F4E2DceD6e29c1ee9;
address public constant USDT_USD_FEED = 0x3E7d1eAB13ad0104d2750B8863b489D65364e32D;
// Borrow limits in USD (with 8 decimal precision)
uint256 public constant MIN_BORROW_USD = 50000 * 1e8; // $50,000 (8 decimals)
uint256 public constant MAX_BORROW_USD = 100000 * 1e8; // $100,000 (8 decimals)
// Reentrancy guard
uint256 private _locked = 1;
// =================== EVENTS ===================
event ArbitrageExecuted(
address indexed tokenIn,
address indexed tokenOut,
uint256 amount,
uint256 profit,
address indexed executor
);
event Withdrawal(address indexed token, uint256 amount, address indexed to);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
// =================== MODIFIERS ===================
modifier onlyOwner() {
require(msg.sender == owner, "Only owner");
_;
}
modifier whenNotPaused() {
require(!paused, "Contract paused");
_;
}
modifier nonReentrant() {
require(_locked == 1, "Reentrancy detected");
_locked = 2;
_;
_locked = 1;
}
// =================== CONSTRUCTOR ===================
constructor() {
owner = msg.sender;
}
// =================== MAIN FUNCTIONS ===================
/**
* @dev Execute arbitrage with flash loan and USD borrow limits
* This matches your Executor.js call signature
*/
function executeArbitrage(
address token0,
uint256 amount,
address routerA,
address routerB,
address token1
) external onlyOwner whenNotPaused nonReentrant returns (bool) {
// Basic validation
require(_isSupportedToken(token0), "Token0 not supported");
require(_isSupportedToken(token1), "Token1 not supported");
require(token0 != token1, "Tokens must be different");
require(amount > 0, "Amount must be > 0");
require(routerA == UNISWAP_V2_ROUTER || routerA == SUSHISWAP_ROUTER, "Invalid routerA");
require(routerB == UNISWAP_V2_ROUTER || routerB == SUSHISWAP_ROUTER, "Invalid routerB");
// Check borrow limits in USD
_checkBorrowLimits(token0, amount);
bytes memory params = abi.encode(token0, token1, routerA, routerB, msg.sender);
// Request flash loan from Aave V3
AAVE_POOL.flashLoanSimple(
address(this),
token0,
amount,
params,
0
);
return true;
}
/**
* @dev Aave V3 flash loan callback - STANDALONE FUNCTION, NO INHERITANCE
*/
function executeOperation(
address asset,
uint256 amount,
uint256 premium,
address initiator,
bytes calldata params
) external nonReentrant returns (bool) {
require(msg.sender == address(AAVE_POOL), "Only Aave pool");
require(initiator == address(this), "Invalid initiator");
(address token0, address token1, address routerA, address routerB, address executor) =
abi.decode(params, (address, address, address, address, address));
require(asset == token0, "Token mismatch");
// Execute arbitrage
_executeArbitrage(token0, token1, amount, premium, routerA, routerB, executor);
return true;
}
// =================== INTERNAL FUNCTIONS ===================
/**
* @dev Check if borrow amount is within USD limits
*/
function _checkBorrowLimits(address token, uint256 amount) internal view {
uint256 usdValue = _getUSDValue(token, amount);
// Check minimum borrow ($50,000 USD)
require(usdValue >= MIN_BORROW_USD, "Borrow amount below $50,000 USD minimum");
// Check maximum borrow ($100,000 USD)
require(usdValue <= MAX_BORROW_USD, "Borrow amount above $100,000 USD maximum");
}
/**
* @dev Get USD value of token amount using Chainlink price feeds
*/
function _getUSDValue(address token, uint256 amount) internal view returns (uint256) {
// Get token decimals
uint8 tokenDecimals = IERC20(token).decimals();
// Get price feed for token
address priceFeed = _getPriceFeedForToken(token);
// Get price from Chainlink (with 8 decimals)
(, int256 price, , , ) = AggregatorV3Interface(priceFeed).latestRoundData();
require(price > 0, "Invalid price from Chainlink");
// Convert token amount to USD value (8 decimals)
return (amount * uint256(price)) / (10**tokenDecimals);
}
/**
* @dev Get Chainlink price feed address for token
*/
function _getPriceFeedForToken(address token) internal pure returns (address) {
if (token == WETH) return ETH_USD_FEED;
if (token == USDC) return USDC_USD_FEED;
if (token == DAI) return DAI_USD_FEED;
if (token == USDT) return USDT_USD_FEED;
revert("No price feed for token");
}
/**
* @dev Execute the arbitrage
*/
function _executeArbitrage(
address token0,
address token1,
uint256 amount,
uint256 premium,
address routerA,
address routerB,
address executor
) internal {
// Approve and perform first swap
IERC20(token0).approve(routerA, amount);
_swap(token0, token1, amount, routerA);
// Get amount received from first swap
uint256 received1 = IERC20(token1).balanceOf(address(this));
require(received1 > 0, "First swap failed");
// Approve and perform second swap
IERC20(token1).approve(routerB, received1);
_swap(token1, token0, received1, routerB);
// Calculate profit and repay
uint256 finalBalance = IERC20(token0).balanceOf(address(this));
uint256 repayAmount = amount + premium;
require(finalBalance >= repayAmount, "Cannot repay flash loan");
uint256 profit = finalBalance - repayAmount;
// Approve repayment to Aave
IERC20(token0).approve(address(AAVE_POOL), repayAmount);
// Send profit to executor if any
if (profit > 0) {
IERC20(token0).transfer(executor, profit);
}
emit ArbitrageExecuted(token0, token1, amount, profit, executor);
}
/**
* @dev Execute token swap
*/
function _swap(
address fromToken,
address toToken,
uint256 amount,
address router
) internal {
address[] memory path = new address[](2);
path[0] = fromToken;
path[1] = toToken;
IUniswapV2Router(router).swapExactTokensForTokens(
amount,
1,
path,
address(this),
block.timestamp + 300
);
}
/**
* @dev Check if token is supported
*/
function _isSupportedToken(address token) internal pure returns (bool) {
return token == WETH || token == USDC || token == DAI || token == USDT;
}
// =================== ADMIN FUNCTIONS ===================
function pause() external onlyOwner {
paused = true;
}
function unpause() external onlyOwner {
paused = false;
}
function withdrawToken(address token, uint256 amount) external onlyOwner nonReentrant {
IERC20(token).transfer(msg.sender, amount);
emit Withdrawal(token, amount, msg.sender);
}
function withdrawETH(uint256 amount) external onlyOwner nonReentrant {
payable(msg.sender).transfer(amount);
emit Withdrawal(address(0), amount, msg.sender);
}
function transferOwnership(address newOwner) external onlyOwner {
require(newOwner != address(0), "Invalid new owner");
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
// =================== VIEW FUNCTIONS ===================
/**
* @dev Check if borrow amount is within limits - VIEW FUNCTION
*/
function checkBorrowLimits(address token, uint256 amount) external view returns (bool, string memory) {
uint256 usdValue = _getUSDValue(token, amount);
if (usdValue < MIN_BORROW_USD) {
return (false, "Below $50,000 minimum");
}
if (usdValue > MAX_BORROW_USD) {
return (false, "Above $100,000 maximum");
}
return (true, "Within limits");
}
/**
* @dev Get current USD value of token amount
*/
function getUSDValue(address token, uint256 amount) external view returns (uint256) {
return _getUSDValue(token, amount);
}
/**
* @dev Get token price in USD (8 decimals)
*/
function getTokenPriceUSD(address token) external view returns (uint256) {
address priceFeed = _getPriceFeedForToken(token);
(, int256 price, , , ) = AggregatorV3Interface(priceFeed).latestRoundData();
return uint256(price);
}
/**
* @dev Calculate minimum token amount for $50,000 USD
*/
function getMinBorrowAmount(address token) external view returns (uint256) {
address priceFeed = _getPriceFeedForToken(token);
(, int256 priceInt, , , ) = AggregatorV3Interface(priceFeed).latestRoundData();
uint256 price = uint256(priceInt);
uint8 decimals = IERC20(token).decimals();
return (MIN_BORROW_USD * (10**decimals)) / price;
}
/**
* @dev Calculate maximum token amount for $100,000 USD
*/
function getMaxBorrowAmount(address token) external view returns (uint256) {
address priceFeed = _getPriceFeedForToken(token);
(, int256 priceInt, , , ) = AggregatorV3Interface(priceFeed).latestRoundData();
uint256 price = uint256(priceInt);
uint8 decimals = IERC20(token).decimals();
return (MAX_BORROW_USD * (10**decimals)) / price;
}
function isTokenSupported(address token) external pure returns (bool) {
return _isSupportedToken(token);
}
function getBalance(address token) external view returns (uint256) {
return IERC20(token).balanceOf(address(this));
}
function getETHBalance() external view returns (uint256) {
return address(this).balance;
}
// =================== FALLBACK FUNCTIONS ===================
receive() external payable {}
}
Read Contract
AAVE_POOL 0x08a01675 → address
DAI 0xe0bab4c4 → address
DAI_USD_FEED 0x8bdcdb93 → address
ETH_USD_FEED 0x94d8572a → address
MAX_BORROW_USD 0x3e1bdd14 → uint256
MIN_BORROW_USD 0x5c2b2af3 → uint256
SUSHISWAP_ROUTER 0x277754ed → address
UNISWAP_V2_ROUTER 0xa82ed9ec → address
USDC 0x89a30271 → address
USDC_USD_FEED 0x43656f11 → address
USDT 0xc54e44eb → address
USDT_USD_FEED 0x449de5f1 → address
WETH 0xad5c4648 → address
checkBorrowLimits 0x4d400959 → bool, string
getBalance 0xf8b2cb4f → uint256
getETHBalance 0x6e947298 → uint256
getMaxBorrowAmount 0x4b79cb0f → uint256
getMinBorrowAmount 0x07b0e2fe → uint256
getTokenPriceUSD 0x2a2cef0a → uint256
getUSDValue 0xfa76dcf2 → uint256
isTokenSupported 0x75151b63 → bool
owner 0x8da5cb5b → address
paused 0x5c975abb → bool
Write Contract 7 functions
These functions modify contract state and require a wallet transaction to execute.
executeArbitrage 0xe441d7ec
address token0
uint256 amount
address routerA
address routerB
address token1
returns: bool
executeOperation 0x1b11d0ff
address asset
uint256 amount
uint256 premium
address initiator
bytes params
returns: bool
pause 0x8456cb59
No parameters
transferOwnership 0xf2fde38b
address newOwner
unpause 0x3f4ba83a
No parameters
withdrawETH 0xf14210a6
uint256 amount
withdrawToken 0x9e281a98
address token
uint256 amount
Recent Transactions
This address has 1 on-chain transactions, but only 0.9% of the chain is indexed. Transactions will appear as indexing progresses. View on Etherscan →