From de4a682061cdf638490a0c9cfbb64696616bdb19 Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Tue, 18 Jan 2022 15:16:35 -0500 Subject: [PATCH] Adjust AAVE and include prices fromm #231 --- mev_inspect/classifiers/specs/aave.py | 87 +++++++++++---------- mev_inspect/classifiers/specs/compound.py | 11 ++- mev_inspect/schemas/prices.py | 1 + tests/{liquidation_test.py => test_aave.py} | 0 4 files changed, 56 insertions(+), 43 deletions(-) rename tests/{liquidation_test.py => test_aave.py} (100%) diff --git a/mev_inspect/classifiers/specs/aave.py b/mev_inspect/classifiers/specs/aave.py index 997e9b6..e82388d 100644 --- a/mev_inspect/classifiers/specs/aave.py +++ b/mev_inspect/classifiers/specs/aave.py @@ -1,4 +1,4 @@ -from typing import List, Optional, Tuple +from typing import List, Optional from mev_inspect.schemas.classifiers import ( ClassifiedTrace, @@ -21,35 +21,43 @@ class AaveLiquidationClassifier(LiquidationClassifier): ) -> Optional[Liquidation]: liquidator = liquidation_trace.from_address + liquidated = liquidation_trace.inputs["_user"] - (debt_token_address, debt_purchase_amount) = _get_debt_data( - liquidation_trace, child_transfers, liquidator - ) + debt_token_address = liquidation_trace.inputs["_reserve"] + received_token_address = liquidation_trace.inputs["_collateral"] - if debt_purchase_amount == 0: + debt_purchase_amount = None + received_amount = None + + debt_transfer = _get_debt_transfer(liquidator, child_transfers) + + received_transfer = _get_received_transfer(liquidator, child_transfers) + + if debt_transfer is not None and received_transfer is not None: + + debt_token_address = debt_transfer.token_address + debt_purchase_amount = debt_transfer.amount + + received_token_address = received_transfer.token_address + received_amount = received_transfer.amount + + return Liquidation( + liquidated_user=liquidated, + debt_token_address=debt_token_address, + liquidator_user=liquidator, + debt_purchase_amount=debt_purchase_amount, + protocol=Protocol.aave, + received_amount=received_amount, + received_token_address=received_token_address, + transaction_hash=liquidation_trace.transaction_hash, + trace_address=liquidation_trace.trace_address, + block_number=liquidation_trace.block_number, + error=liquidation_trace.error, + ) + + else: return None - (received_token_address, received_amount) = _get_received_data( - liquidation_trace, child_transfers, liquidator - ) - - if received_amount == 0: - return None - - return Liquidation( - liquidated_user=liquidation_trace.inputs["_user"], - debt_token_address=debt_token_address, - liquidator_user=liquidator, - debt_purchase_amount=debt_purchase_amount, - protocol=Protocol.aave, - received_amount=received_amount, - received_token_address=received_token_address, - transaction_hash=liquidation_trace.transaction_hash, - trace_address=liquidation_trace.trace_address, - block_number=liquidation_trace.block_number, - error=liquidation_trace.error, - ) - class AaveTransferClassifier(TransferClassifier): @staticmethod @@ -84,30 +92,25 @@ ATOKENS_SPEC = ClassifierSpec( AAVE_CLASSIFIER_SPECS: List[ClassifierSpec] = [AAVE_SPEC, ATOKENS_SPEC] -def _get_received_data( - liquidation_trace: DecodedCallTrace, - child_transfers: List[Transfer], - liquidator: str, -) -> Tuple[str, int]: +def _get_received_transfer( + liquidator: str, child_transfers: List[Transfer] +) -> Optional[Transfer]: + """Get transfer from AAVE to liquidator""" - """Look for and return liquidator payback from liquidation""" for transfer in child_transfers: - if transfer.to_address == liquidator: - return transfer.token_address, transfer.amount + return transfer - return liquidation_trace.inputs["_collateral"], 0 + return None -def _get_debt_data( - liquidation_trace: DecodedCallTrace, - child_transfers: List[Transfer], - liquidator: str, -) -> Tuple[str, int]: +def _get_debt_transfer( + liquidator: str, child_transfers: List[Transfer] +) -> Optional[Transfer]: """Get transfer from liquidator to AAVE""" for transfer in child_transfers: if transfer.from_address == liquidator: - return transfer.token_address, transfer.amount + return transfer - return liquidation_trace.inputs["_reserve"], 0 + return None diff --git a/mev_inspect/classifiers/specs/compound.py b/mev_inspect/classifiers/specs/compound.py index 33e9e05..05c4d73 100644 --- a/mev_inspect/classifiers/specs/compound.py +++ b/mev_inspect/classifiers/specs/compound.py @@ -9,6 +9,7 @@ from mev_inspect.schemas.classifiers import ( SeizeClassifier, ) from mev_inspect.schemas.liquidations import Liquidation +from mev_inspect.schemas.prices import CETH_TOKEN_ADDRESS from mev_inspect.schemas.traces import Protocol from mev_inspect.schemas.transfers import Transfer @@ -23,11 +24,19 @@ class CompoundLiquidationClassifier(LiquidationClassifier): liquidator = liquidation_trace.from_address liquidated = liquidation_trace.inputs["borrower"] + debt_token_address = liquidation_trace.to_address - debt_purchase_amount = liquidation_trace.inputs["repayAmount"] received_token_address = liquidation_trace.inputs["cTokenCollateral"] + + debt_purchase_amount = None received_amount = None + if debt_token_address == CETH_TOKEN_ADDRESS: + debt_purchase_amount = liquidation_trace.value + + else: + debt_purchase_amount = liquidation_trace.inputs["repayAmount"] + debt_transfer = _get_debt_transfer(liquidator, child_transfers) received_transfer = _get_received_transfer(liquidator, child_transfers) diff --git a/mev_inspect/schemas/prices.py b/mev_inspect/schemas/prices.py index b04000f..4cce2c9 100644 --- a/mev_inspect/schemas/prices.py +++ b/mev_inspect/schemas/prices.py @@ -53,6 +53,7 @@ COINGECKO_ID_BY_ADDRESS = { } + class Price(BaseModel): token_address: str usd_price: float diff --git a/tests/liquidation_test.py b/tests/test_aave.py similarity index 100% rename from tests/liquidation_test.py rename to tests/test_aave.py