From 2a43ecdfe0c341d7f5f17989e55d476b65566d45 Mon Sep 17 00:00:00 2001 From: Milan Cermak Date: Sun, 25 Jul 2021 18:28:21 +0200 Subject: [PATCH] Initial work on adding Aave inspector --- mev_inspect/config.ini | 2 +- mev_inspect/inspectors/aave.py | 53 ++++++++++++++++++++++++++ mev_inspect/schemas/classifications.py | 4 ++ 3 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 mev_inspect/inspectors/aave.py diff --git a/mev_inspect/config.ini b/mev_inspect/config.ini index 56fa10d..e8f838a 100644 --- a/mev_inspect/config.ini +++ b/mev_inspect/config.ini @@ -2,6 +2,7 @@ Endpoint = http://localhost:8545/ [ADDRESSES] +AaveV2LendingPool = 0x7d2768dE32b0b80b7a3454c06BdAc94A69DDc7A9 UniswapV2Router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D SushiswapV2Router = 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F WETH = 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 @@ -12,4 +13,3 @@ UniswapV2Router = [{"inputs":[{"internalType":"address","name":"_factory","type" UniswapV2Pair = [{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint112","name":"reserve0","type":"uint112"},{"indexed":false,"internalType":"uint112","name":"reserve1","type":"uint112"}],"name":"Sync","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MINIMUM_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"_reserve0","type":"uint112"},{"internalType":"uint112","name":"_reserve1","type":"uint112"},{"internalType":"uint32","name":"_blockTimestampLast","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"kLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"price0CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"price1CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"sync","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}] AaveLendingPool = [{"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "_reserve", "type": "address"}, {"indexed": true, "internalType": "address", "name": "_user", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "_amount", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "_borrowRateMode", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "_borrowRate", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "_originationFee", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "_borrowBalanceIncrease", "type": "uint256"}, {"indexed": true, "internalType": "uint16", "name": "_referral", "type": "uint16"}, {"indexed": false, "internalType": "uint256", "name": "_timestamp", "type": "uint256"}], "name": "Borrow", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "_reserve", "type": "address"}, {"indexed": true, "internalType": "address", "name": "_user", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "_amount", "type": "uint256"}, {"indexed": true, "internalType": "uint16", "name": "_referral", "type": "uint16"}, {"indexed": false, "internalType": "uint256", "name": "_timestamp", "type": "uint256"}], "name": "Deposit", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "_target", "type": "address"}, {"indexed": true, "internalType": "address", "name": "_reserve", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "_amount", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "_totalFee", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "_protocolFee", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "_timestamp", "type": "uint256"}], "name": "FlashLoan", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "_collateral", "type": "address"}, {"indexed": true, "internalType": "address", "name": "_reserve", "type": "address"}, {"indexed": true, "internalType": "address", "name": "_user", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "_purchaseAmount", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "_liquidatedCollateralAmount", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "_accruedBorrowInterest", "type": "uint256"}, {"indexed": false, "internalType": "address", "name": "_liquidator", "type": "address"}, {"indexed": false, "internalType": "bool", "name": "_receiveAToken", "type": "bool"}, {"indexed": false, "internalType": "uint256", "name": "_timestamp", "type": "uint256"}], "name": "LiquidationCall", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "_collateral", "type": "address"}, {"indexed": true, "internalType": "address", "name": "_reserve", "type": "address"}, {"indexed": true, "internalType": "address", "name": "_user", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "_feeLiquidated", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "_liquidatedCollateralForFee", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "_timestamp", "type": "uint256"}], "name": "OriginationFeeLiquidated", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "_reserve", "type": "address"}, {"indexed": true, "internalType": "address", "name": "_user", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "_newStableRate", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "_borrowBalanceIncrease", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "_timestamp", "type": "uint256"}], "name": "RebalanceStableBorrowRate", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "_reserve", "type": "address"}, {"indexed": true, "internalType": "address", "name": "_user", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "_amount", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "_timestamp", "type": "uint256"}], "name": "RedeemUnderlying", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "_reserve", "type": "address"}, {"indexed": true, "internalType": "address", "name": "_user", "type": "address"}, {"indexed": true, "internalType": "address", "name": "_repayer", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "_amountMinusFees", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "_fees", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "_borrowBalanceIncrease", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "_timestamp", "type": "uint256"}], "name": "Repay", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "_reserve", "type": "address"}, {"indexed": true, "internalType": "address", "name": "_user", "type": "address"}], "name": "ReserveUsedAsCollateralDisabled", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "_reserve", "type": "address"}, {"indexed": true, "internalType": "address", "name": "_user", "type": "address"}], "name": "ReserveUsedAsCollateralEnabled", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "_reserve", "type": "address"}, {"indexed": true, "internalType": "address", "name": "_user", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "_newRateMode", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "_newRate", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "_borrowBalanceIncrease", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "_timestamp", "type": "uint256"}], "name": "Swap", "type": "event"}, {"constant": true, "inputs": [], "name": "LENDINGPOOL_REVISION", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "payable": false, "stateMutability": "view", "type": "function"}, {"constant": true, "inputs": [], "name": "UINT_MAX_VALUE", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "payable": false, "stateMutability": "view", "type": "function"}, {"constant": true, "inputs": [], "name": "addressesProvider", "outputs": [{"internalType": "contract LendingPoolAddressesProvider", "name": "", "type": "address"}], "payable": false, "stateMutability": "view", "type": "function"}, {"constant": false, "inputs": [{"internalType": "address", "name": "_reserve", "type": "address"}, {"internalType": "uint256", "name": "_amount", "type": "uint256"}, {"internalType": "uint256", "name": "_interestRateMode", "type": "uint256"}, {"internalType": "uint16", "name": "_referralCode", "type": "uint16"}], "name": "borrow", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function"}, {"constant": true, "inputs": [], "name": "core", "outputs": [{"internalType": "contract LendingPoolCore", "name": "", "type": "address"}], "payable": false, "stateMutability": "view", "type": "function"}, {"constant": true, "inputs": [], "name": "dataProvider", "outputs": [{"internalType": "contract LendingPoolDataProvider", "name": "", "type": "address"}], "payable": false, "stateMutability": "view", "type": "function"}, {"constant": false, "inputs": [{"internalType": "address", "name": "_reserve", "type": "address"}, {"internalType": "uint256", "name": "_amount", "type": "uint256"}, {"internalType": "uint16", "name": "_referralCode", "type": "uint16"}], "name": "deposit", "outputs": [], "payable": true, "stateMutability": "payable", "type": "function"}, {"constant": false, "inputs": [{"internalType": "address", "name": "_receiver", "type": "address"}, {"internalType": "address", "name": "_reserve", "type": "address"}, {"internalType": "uint256", "name": "_amount", "type": "uint256"}, {"internalType": "bytes", "name": "_params", "type": "bytes"}], "name": "flashLoan", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function"}, {"constant": true, "inputs": [{"internalType": "address", "name": "_reserve", "type": "address"}], "name": "getReserveConfigurationData", "outputs": [{"internalType": "uint256", "name": "ltv", "type": "uint256"}, {"internalType": "uint256", "name": "liquidationThreshold", "type": "uint256"}, {"internalType": "uint256", "name": "liquidationBonus", "type": "uint256"}, {"internalType": "address", "name": "interestRateStrategyAddress", "type": "address"}, {"internalType": "bool", "name": "usageAsCollateralEnabled", "type": "bool"}, {"internalType": "bool", "name": "borrowingEnabled", "type": "bool"}, {"internalType": "bool", "name": "stableBorrowRateEnabled", "type": "bool"}, {"internalType": "bool", "name": "isActive", "type": "bool"}], "payable": false, "stateMutability": "view", "type": "function"}, {"constant": true, "inputs": [{"internalType": "address", "name": "_reserve", "type": "address"}], "name": "getReserveData", "outputs": [{"internalType": "uint256", "name": "totalLiquidity", "type": "uint256"}, {"internalType": "uint256", "name": "availableLiquidity", "type": "uint256"}, {"internalType": "uint256", "name": "totalBorrowsStable", "type": "uint256"}, {"internalType": "uint256", "name": "totalBorrowsVariable", "type": "uint256"}, {"internalType": "uint256", "name": "liquidityRate", "type": "uint256"}, {"internalType": "uint256", "name": "variableBorrowRate", "type": "uint256"}, {"internalType": "uint256", "name": "stableBorrowRate", "type": "uint256"}, {"internalType": "uint256", "name": "averageStableBorrowRate", "type": "uint256"}, {"internalType": "uint256", "name": "utilizationRate", "type": "uint256"}, {"internalType": "uint256", "name": "liquidityIndex", "type": "uint256"}, {"internalType": "uint256", "name": "variableBorrowIndex", "type": "uint256"}, {"internalType": "address", "name": "aTokenAddress", "type": "address"}, {"internalType": "uint40", "name": "lastUpdateTimestamp", "type": "uint40"}], "payable": false, "stateMutability": "view", "type": "function"}, {"constant": true, "inputs": [], "name": "getReserves", "outputs": [{"internalType": "address[]", "name": "", "type": "address[]"}], "payable": false, "stateMutability": "view", "type": "function"}, {"constant": true, "inputs": [{"internalType": "address", "name": "_user", "type": "address"}], "name": "getUserAccountData", "outputs": [{"internalType": "uint256", "name": "totalLiquidityETH", "type": "uint256"}, {"internalType": "uint256", "name": "totalCollateralETH", "type": "uint256"}, {"internalType": "uint256", "name": "totalBorrowsETH", "type": "uint256"}, {"internalType": "uint256", "name": "totalFeesETH", "type": "uint256"}, {"internalType": "uint256", "name": "availableBorrowsETH", "type": "uint256"}, {"internalType": "uint256", "name": "currentLiquidationThreshold", "type": "uint256"}, {"internalType": "uint256", "name": "ltv", "type": "uint256"}, {"internalType": "uint256", "name": "healthFactor", "type": "uint256"}], "payable": false, "stateMutability": "view", "type": "function"}, {"constant": true, "inputs": [{"internalType": "address", "name": "_reserve", "type": "address"}, {"internalType": "address", "name": "_user", "type": "address"}], "name": "getUserReserveData", "outputs": [{"internalType": "uint256", "name": "currentATokenBalance", "type": "uint256"}, {"internalType": "uint256", "name": "currentBorrowBalance", "type": "uint256"}, {"internalType": "uint256", "name": "principalBorrowBalance", "type": "uint256"}, {"internalType": "uint256", "name": "borrowRateMode", "type": "uint256"}, {"internalType": "uint256", "name": "borrowRate", "type": "uint256"}, {"internalType": "uint256", "name": "liquidityRate", "type": "uint256"}, {"internalType": "uint256", "name": "originationFee", "type": "uint256"}, {"internalType": "uint256", "name": "variableBorrowIndex", "type": "uint256"}, {"internalType": "uint256", "name": "lastUpdateTimestamp", "type": "uint256"}, {"internalType": "bool", "name": "usageAsCollateralEnabled", "type": "bool"}], "payable": false, "stateMutability": "view", "type": "function"}, {"constant": false, "inputs": [{"internalType": "contract LendingPoolAddressesProvider", "name": "_addressesProvider", "type": "address"}], "name": "initialize", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function"}, {"constant": false, "inputs": [{"internalType": "address", "name": "_collateral", "type": "address"}, {"internalType": "address", "name": "_reserve", "type": "address"}, {"internalType": "address", "name": "_user", "type": "address"}, {"internalType": "uint256", "name": "_purchaseAmount", "type": "uint256"}, {"internalType": "bool", "name": "_receiveAToken", "type": "bool"}], "name": "liquidationCall", "outputs": [], "payable": true, "stateMutability": "payable", "type": "function"}, {"constant": true, "inputs": [], "name": "parametersProvider", "outputs": [{"internalType": "contract LendingPoolParametersProvider", "name": "", "type": "address"}], "payable": false, "stateMutability": "view", "type": "function"}, {"constant": false, "inputs": [{"internalType": "address", "name": "_reserve", "type": "address"}, {"internalType": "address", "name": "_user", "type": "address"}], "name": "rebalanceStableBorrowRate", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function"}, {"constant": false, "inputs": [{"internalType": "address", "name": "_reserve", "type": "address"}, {"internalType": "address payable", "name": "_user", "type": "address"}, {"internalType": "uint256", "name": "_amount", "type": "uint256"}, {"internalType": "uint256", "name": "_aTokenBalanceAfterRedeem", "type": "uint256"}], "name": "redeemUnderlying", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function"}, {"constant": false, "inputs": [{"internalType": "address", "name": "_reserve", "type": "address"}, {"internalType": "uint256", "name": "_amount", "type": "uint256"}, {"internalType": "address payable", "name": "_onBehalfOf", "type": "address"}], "name": "repay", "outputs": [], "payable": true, "stateMutability": "payable", "type": "function"}, {"constant": false, "inputs": [{"internalType": "address", "name": "_reserve", "type": "address"}, {"internalType": "bool", "name": "_useAsCollateral", "type": "bool"}], "name": "setUserUseReserveAsCollateral", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function"}, {"constant": false, "inputs": [{"internalType": "address", "name": "_reserve", "type": "address"}], "name": "swapBorrowRateMode", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function"}] - diff --git a/mev_inspect/inspectors/aave.py b/mev_inspect/inspectors/aave.py new file mode 100644 index 0000000..7b0f400 --- /dev/null +++ b/mev_inspect/inspectors/aave.py @@ -0,0 +1,53 @@ +import json +from typing import Optional + +from web3 import Web3 + +from mev_inspect.config import load_config +from mev_inspect.schemas.blocks import NestedTrace +from mev_inspect.schemas.classifications import Classification, Liquidation +from mev_inspect.utils import check_trace_for_signature + +from .base import Inspector + +config = load_config() + +aave_v2_lending_pool_abi = json.loads(config["ABI"]["AaveLendingPool"]) +aave_v2_lending_pool_address = config["ADDRESSES"]["AaveV2LendingPool"].lower() + + +class AaveInspector(Inspector): + def __init__(self, base_inspector): + super().__init__() + self.w3 = Web3(base_inspector) + self.aave_v2_lendingpool_contract = self.w3.eth.contract( + address=aave_v2_lending_pool_address, abi=aave_v2_lending_pool_abi + ) + + # https://docs.aave.com/developers/the-core-protocol/lendingpool#liquidationcall + liquidation_call = "liquidationCall(address,address,address,uint256,bool)" + self.liquidation_call_signature = self.w3.sha3(text=liquidation_call)[:4] + self.mev_functions = [] + + def inspect(self, nested_trace: NestedTrace) -> Optional[Classification]: + trace = nested_trace.trace + + # fmt: off + if ( + trace.action["to"] == aave_v2_lending_pool_address and + check_trace_for_signature( + trace, + [self.liquidation_call_signature] + ) + ): + # fmt: on + + tx = self.w3.eth.get_transaction(trace.transaction_hash) + _, decoded_input = self.aave_v2_lendingpool_contract.decode_function_input(tx.input) + print(decoded_input) + + # TODO: check if decoded_input is correct, create a Liquidation classification? + # what about reducers? + # return Liquidation() + + return None diff --git a/mev_inspect/schemas/classifications.py b/mev_inspect/schemas/classifications.py index 3e0875f..8b6974a 100644 --- a/mev_inspect/schemas/classifications.py +++ b/mev_inspect/schemas/classifications.py @@ -9,6 +9,10 @@ class Classification(BaseModel): pass +class Liquidation(Classification): + pass + + class UnknownClassification(Classification): trace: Trace internal_classifications: List[Classification]