From d0ab255a5c9e31ee68b034ff76930f6266699897 Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Mon, 17 Jan 2022 22:01:06 -0500 Subject: [PATCH 01/20] Add LiquidationClassifiers --- mev_inspect/classifiers/specs/aave.py | 75 +++++++++++++++++- mev_inspect/classifiers/specs/compound.py | 96 +++++++++++++++++++++-- mev_inspect/liquidations.py | 72 ++++++++++++++--- mev_inspect/schemas/classifiers.py | 12 ++- 4 files changed, 234 insertions(+), 21 deletions(-) diff --git a/mev_inspect/classifiers/specs/aave.py b/mev_inspect/classifiers/specs/aave.py index 854f057..e4cb959 100644 --- a/mev_inspect/classifiers/specs/aave.py +++ b/mev_inspect/classifiers/specs/aave.py @@ -1,13 +1,81 @@ +from typing import List, Optional, Tuple + from mev_inspect.schemas.classifiers import ( + Classifier, ClassifierSpec, DecodedCallTrace, - LiquidationClassifier, TransferClassifier, ) +from mev_inspect.schemas.liquidations import Liquidation from mev_inspect.schemas.traces import Protocol from mev_inspect.schemas.transfers import Transfer +class AaveLiquidationClassifier(Classifier): + def parse_liquidation( + self, liquidation_trace: DecodedCallTrace, child_transfers: List[Transfer] + ) -> Optional[Liquidation]: + + liquidator = liquidation_trace.from_address + + (debt_token_address, debt_purchase_amount) = self._get_debt_data( + liquidation_trace, child_transfers, liquidator + ) + + if debt_purchase_amount == 0: + return None + + (received_token_address, received_amount) = self._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, + ) + + def _get_received_data( + self, + liquidation_trace: DecodedCallTrace, + child_transfers: List[Transfer], + liquidator: str, + ) -> Tuple[str, int]: + + """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 liquidation_trace.inputs["_collateral"], 0 + + def _get_debt_data( + self, + liquidation_trace: DecodedCallTrace, + child_transfers: List[Transfer], + liquidator: str, + ) -> Tuple[str, int]: + """Get transfer from liquidator to AAVE""" + + for transfer in child_transfers: + if transfer.from_address == liquidator: + return transfer.token_address, transfer.amount + + return liquidation_trace.inputs["_reserve"], 0 + + class AaveTransferClassifier(TransferClassifier): @staticmethod def get_transfer(trace: DecodedCallTrace) -> Transfer: @@ -26,7 +94,7 @@ AAVE_SPEC = ClassifierSpec( abi_name="AaveLendingPool", protocol=Protocol.aave, classifiers={ - "liquidationCall(address,address,address,uint256,bool)": LiquidationClassifier, + "liquidationCall(address,address,address,uint256,bool)": AaveLiquidationClassifier, }, ) @@ -35,8 +103,7 @@ ATOKENS_SPEC = ClassifierSpec( protocol=Protocol.aave, classifiers={ "transferOnLiquidation(address,address,uint256)": AaveTransferClassifier, - "transferFrom(address,address,uint256)": AaveTransferClassifier, }, ) -AAVE_CLASSIFIER_SPECS = [AAVE_SPEC, ATOKENS_SPEC] +AAVE_CLASSIFIER_SPECS: List[ClassifierSpec] = [AAVE_SPEC, ATOKENS_SPEC] diff --git a/mev_inspect/classifiers/specs/compound.py b/mev_inspect/classifiers/specs/compound.py index 039c165..3855d56 100644 --- a/mev_inspect/classifiers/specs/compound.py +++ b/mev_inspect/classifiers/specs/compound.py @@ -1,16 +1,100 @@ +from typing import List, Optional, Tuple + from mev_inspect.schemas.classifiers import ( + Classification, + ClassifiedTrace, + Classifier, ClassifierSpec, - LiquidationClassifier, + DecodedCallTrace, SeizeClassifier, ) +from mev_inspect.schemas.liquidations import Liquidation from mev_inspect.schemas.traces import Protocol +from mev_inspect.schemas.transfers import Transfer + + +class CompoundLiquidationClassifier(Classifier): + def parse_liquidation( + self, + liquidation_trace: DecodedCallTrace, + child_traces: List[ClassifiedTrace], + child_transfers: List[Transfer], + ) -> Optional[Liquidation]: + + seize_trace = self._get_seize_call(child_traces) + + if seize_trace is not None and seize_trace.inputs is not None: + + liquidator = seize_trace.inputs["liquidator"] + + (debt_token_address, debt_purchase_amount) = self._get_debt_data( + liquidator, child_transfers + ) + + if debt_purchase_amount == 0: + return None + + (received_token_address, received_amount) = self._get_received_data( + liquidator, child_transfers + ) + + if received_amount == 0: + return None + + return Liquidation( + liquidated_user=liquidation_trace.inputs["borrower"], + debt_token_address=debt_token_address, + liquidator_user=liquidator, + debt_purchase_amount=debt_purchase_amount, + protocol=liquidation_trace.protocol, + 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, + ) + return None + + def _get_seize_call( + self, traces: List[ClassifiedTrace] + ) -> Optional[ClassifiedTrace]: + """Find the call to `seize` in the child traces (successful liquidation)""" + for trace in traces: + if trace.classification == Classification.seize: + return trace + return None + + def _get_received_data( + self, liquidator: str, child_transfers: List[Transfer] + ) -> Tuple[str, int]: + """Look for and return payment for liquidation""" + + for transfer in child_transfers: + if transfer.to_address == liquidator: + return transfer.token_address, transfer.amount + + return liquidator, 0 + + def _get_debt_data( + self, liquidator: str, child_transfers: List[Transfer] + ) -> Tuple[str, int]: + """Get transfer from liquidator to compound""" + + for transfer in child_transfers: + + if transfer.from_address == liquidator: + return transfer.token_address, transfer.amount + + return liquidator, 0 + COMPOUND_V2_CETH_SPEC = ClassifierSpec( abi_name="CEther", protocol=Protocol.compound_v2, valid_contract_addresses=["0x4ddc2d193948926d02f9b1fe9e1daa0718270ed5"], classifiers={ - "liquidateBorrow(address,address)": LiquidationClassifier, + "liquidateBorrow(address,address)": CompoundLiquidationClassifier, "seize(address,address,uint256)": SeizeClassifier, }, ) @@ -20,7 +104,7 @@ CREAM_CETH_SPEC = ClassifierSpec( protocol=Protocol.cream, valid_contract_addresses=["0xD06527D5e56A3495252A528C4987003b712860eE"], classifiers={ - "liquidateBorrow(address,address)": LiquidationClassifier, + "liquidateBorrow(address,address)": CompoundLiquidationClassifier, "seize(address,address,uint256)": SeizeClassifier, }, ) @@ -48,7 +132,7 @@ COMPOUND_V2_CTOKEN_SPEC = ClassifierSpec( "0x80a2ae356fc9ef4305676f7a3e2ed04e12c33946", ], classifiers={ - "liquidateBorrow(address,uint256,address)": LiquidationClassifier, + "liquidateBorrow(address,uint256,address)": CompoundLiquidationClassifier, "seize(address,address,uint256)": SeizeClassifier, }, ) @@ -150,12 +234,12 @@ CREAM_CTOKEN_SPEC = ClassifierSpec( "0x58da9c9fc3eb30abbcbbab5ddabb1e6e2ef3d2ef", ], classifiers={ - "liquidateBorrow(address,uint256,address)": LiquidationClassifier, + "liquidateBorrow(address,uint256,address)": CompoundLiquidationClassifier, "seize(address,address,uint256)": SeizeClassifier, }, ) -COMPOUND_CLASSIFIER_SPECS = [ +COMPOUND_CLASSIFIER_SPECS: List[ClassifierSpec] = [ COMPOUND_V2_CETH_SPEC, COMPOUND_V2_CTOKEN_SPEC, CREAM_CETH_SPEC, diff --git a/mev_inspect/liquidations.py b/mev_inspect/liquidations.py index 88961f1..f0b6652 100644 --- a/mev_inspect/liquidations.py +++ b/mev_inspect/liquidations.py @@ -1,9 +1,12 @@ -from typing import List +from typing import List, Optional -from mev_inspect.aave_liquidations import get_aave_liquidations -from mev_inspect.compound_liquidations import get_compound_liquidations +from mev_inspect.classifiers.specs import get_classifier +from mev_inspect.schemas.classifiers import LiquidationClassifier from mev_inspect.schemas.liquidations import Liquidation -from mev_inspect.schemas.traces import Classification, ClassifiedTrace +from mev_inspect.schemas.traces import Classification, ClassifiedTrace, DecodedCallTrace +from mev_inspect.schemas.transfers import Transfer +from mev_inspect.traces import get_child_traces, is_child_trace_address +from mev_inspect.transfers import get_child_transfers def has_liquidations(classified_traces: List[ClassifiedTrace]) -> bool: @@ -14,9 +17,58 @@ def has_liquidations(classified_traces: List[ClassifiedTrace]) -> bool: return liquidations_exist -def get_liquidations( - classified_traces: List[ClassifiedTrace], -) -> List[Liquidation]: - aave_liquidations = get_aave_liquidations(classified_traces) - comp_liquidations = get_compound_liquidations(classified_traces) - return aave_liquidations + comp_liquidations +def get_liquidations(classified_traces: List[ClassifiedTrace]) -> List[Liquidation]: + + liquidations: List[Liquidation] = [] + parent_liquidations: List[DecodedCallTrace] = [] + + for trace in classified_traces: + + if not isinstance(trace, DecodedCallTrace): + continue + + if _is_child_liquidation(trace, parent_liquidations): + continue + + if trace.classification == Classification.liquidate: + + parent_liquidations.append(trace) + child_traces = get_child_traces( + trace.transaction_hash, trace.trace_address, classified_traces + ) + child_transfers = get_child_transfers( + trace.transaction_hash, trace.trace_address, child_traces + ) + liquidation = _parse_liquidation(trace, child_traces, child_transfers) + + if liquidation is not None: + liquidations.append(liquidation) + + return liquidations + + +def _parse_liquidation( + trace: DecodedCallTrace, + child_traces: List[ClassifiedTrace], + child_transfers: List[Transfer], +) -> Optional[Liquidation]: + + classifier = get_classifier(trace) + + if classifier is not None and issubclass(classifier, LiquidationClassifier): + return classifier.parse_liquidation(trace, child_transfers, child_traces) + return None + + +def _is_child_liquidation( + trace: DecodedCallTrace, parent_liquidations: List[DecodedCallTrace] +) -> bool: + + for parent in parent_liquidations: + if ( + trace.transaction_hash == parent.transaction_hash + and is_child_trace_address(trace.trace_address, parent.trace_address) + ): + return True + + return False diff --git a/mev_inspect/schemas/classifiers.py b/mev_inspect/schemas/classifiers.py index 043f1ff..4749f37 100644 --- a/mev_inspect/schemas/classifiers.py +++ b/mev_inspect/schemas/classifiers.py @@ -3,9 +3,10 @@ from typing import Dict, List, Optional, Type from pydantic import BaseModel +from .liquidations import Liquidation from .nft_trades import NftTrade from .swaps import Swap -from .traces import Classification, DecodedCallTrace, Protocol +from .traces import Classification, ClassifiedTrace, DecodedCallTrace, Protocol from .transfers import Transfer @@ -47,6 +48,15 @@ class LiquidationClassifier(Classifier): def get_classification() -> Classification: return Classification.liquidate + @staticmethod + @abstractmethod + def parse_liquidation( + trace: ClassifiedTrace, + child_transfers: List[Transfer], + child_traces: List[ClassifiedTrace] = [], + ) -> Optional[Liquidation]: + raise NotImplementedError() + class SeizeClassifier(Classifier): @staticmethod From 9883680dfac16749e5eb4b792ca1be5b39c9ab9b Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Tue, 18 Jan 2022 01:25:39 -0500 Subject: [PATCH 02/20] Update classifiers and tests --- mev_inspect/classifiers/specs/aave.py | 72 +-- mev_inspect/classifiers/specs/compound.py | 76 ++- mev_inspect/schemas/classifiers.py | 4 +- tests/blocks/Terminal Saved Output | 676 ++++++++++++++++++++++ tests/liquidation_test.py | 27 +- tests/test_compound.py | 32 +- 6 files changed, 790 insertions(+), 97 deletions(-) create mode 100644 tests/blocks/Terminal Saved Output diff --git a/mev_inspect/classifiers/specs/aave.py b/mev_inspect/classifiers/specs/aave.py index e4cb959..997e9b6 100644 --- a/mev_inspect/classifiers/specs/aave.py +++ b/mev_inspect/classifiers/specs/aave.py @@ -1,9 +1,10 @@ from typing import List, Optional, Tuple from mev_inspect.schemas.classifiers import ( - Classifier, + ClassifiedTrace, ClassifierSpec, DecodedCallTrace, + LiquidationClassifier, TransferClassifier, ) from mev_inspect.schemas.liquidations import Liquidation @@ -11,21 +12,24 @@ from mev_inspect.schemas.traces import Protocol from mev_inspect.schemas.transfers import Transfer -class AaveLiquidationClassifier(Classifier): +class AaveLiquidationClassifier(LiquidationClassifier): + @staticmethod def parse_liquidation( - self, liquidation_trace: DecodedCallTrace, child_transfers: List[Transfer] + liquidation_trace: DecodedCallTrace, + child_transfers: List[Transfer], + child_traces: List[ClassifiedTrace], ) -> Optional[Liquidation]: liquidator = liquidation_trace.from_address - (debt_token_address, debt_purchase_amount) = self._get_debt_data( + (debt_token_address, debt_purchase_amount) = _get_debt_data( liquidation_trace, child_transfers, liquidator ) if debt_purchase_amount == 0: return None - (received_token_address, received_amount) = self._get_received_data( + (received_token_address, received_amount) = _get_received_data( liquidation_trace, child_transfers, liquidator ) @@ -46,35 +50,6 @@ class AaveLiquidationClassifier(Classifier): error=liquidation_trace.error, ) - def _get_received_data( - self, - liquidation_trace: DecodedCallTrace, - child_transfers: List[Transfer], - liquidator: str, - ) -> Tuple[str, int]: - - """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 liquidation_trace.inputs["_collateral"], 0 - - def _get_debt_data( - self, - liquidation_trace: DecodedCallTrace, - child_transfers: List[Transfer], - liquidator: str, - ) -> Tuple[str, int]: - """Get transfer from liquidator to AAVE""" - - for transfer in child_transfers: - if transfer.from_address == liquidator: - return transfer.token_address, transfer.amount - - return liquidation_trace.inputs["_reserve"], 0 - class AaveTransferClassifier(TransferClassifier): @staticmethod @@ -107,3 +82,32 @@ 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]: + + """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 liquidation_trace.inputs["_collateral"], 0 + + +def _get_debt_data( + liquidation_trace: DecodedCallTrace, + child_transfers: List[Transfer], + liquidator: str, +) -> Tuple[str, int]: + """Get transfer from liquidator to AAVE""" + + for transfer in child_transfers: + if transfer.from_address == liquidator: + return transfer.token_address, transfer.amount + + return liquidation_trace.inputs["_reserve"], 0 diff --git a/mev_inspect/classifiers/specs/compound.py b/mev_inspect/classifiers/specs/compound.py index 3855d56..bf7c4bc 100644 --- a/mev_inspect/classifiers/specs/compound.py +++ b/mev_inspect/classifiers/specs/compound.py @@ -3,9 +3,9 @@ from typing import List, Optional, Tuple from mev_inspect.schemas.classifiers import ( Classification, ClassifiedTrace, - Classifier, ClassifierSpec, DecodedCallTrace, + LiquidationClassifier, SeizeClassifier, ) from mev_inspect.schemas.liquidations import Liquidation @@ -13,28 +13,28 @@ from mev_inspect.schemas.traces import Protocol from mev_inspect.schemas.transfers import Transfer -class CompoundLiquidationClassifier(Classifier): +class CompoundLiquidationClassifier(LiquidationClassifier): + @staticmethod def parse_liquidation( - self, liquidation_trace: DecodedCallTrace, - child_traces: List[ClassifiedTrace], child_transfers: List[Transfer], + child_traces: List[ClassifiedTrace], ) -> Optional[Liquidation]: - seize_trace = self._get_seize_call(child_traces) + seize_trace = _get_seize_call(child_traces) if seize_trace is not None and seize_trace.inputs is not None: liquidator = seize_trace.inputs["liquidator"] - (debt_token_address, debt_purchase_amount) = self._get_debt_data( + (debt_token_address, debt_purchase_amount) = _get_debt_data( liquidator, child_transfers ) if debt_purchase_amount == 0: return None - (received_token_address, received_amount) = self._get_received_data( + (received_token_address, received_amount) = _get_received_data( liquidator, child_transfers ) @@ -56,38 +56,6 @@ class CompoundLiquidationClassifier(Classifier): ) return None - def _get_seize_call( - self, traces: List[ClassifiedTrace] - ) -> Optional[ClassifiedTrace]: - """Find the call to `seize` in the child traces (successful liquidation)""" - for trace in traces: - if trace.classification == Classification.seize: - return trace - return None - - def _get_received_data( - self, liquidator: str, child_transfers: List[Transfer] - ) -> Tuple[str, int]: - """Look for and return payment for liquidation""" - - for transfer in child_transfers: - if transfer.to_address == liquidator: - return transfer.token_address, transfer.amount - - return liquidator, 0 - - def _get_debt_data( - self, liquidator: str, child_transfers: List[Transfer] - ) -> Tuple[str, int]: - """Get transfer from liquidator to compound""" - - for transfer in child_transfers: - - if transfer.from_address == liquidator: - return transfer.token_address, transfer.amount - - return liquidator, 0 - COMPOUND_V2_CETH_SPEC = ClassifierSpec( abi_name="CEther", @@ -245,3 +213,33 @@ COMPOUND_CLASSIFIER_SPECS: List[ClassifierSpec] = [ CREAM_CETH_SPEC, CREAM_CTOKEN_SPEC, ] + + +def _get_seize_call(traces: List[ClassifiedTrace]) -> Optional[ClassifiedTrace]: + """Find the call to `seize` in the child traces (successful liquidation)""" + for trace in traces: + if trace.classification == Classification.seize: + return trace + return None + + +def _get_received_data( + liquidator: str, child_transfers: List[Transfer] +) -> Tuple[str, int]: + """Look for and return payment for liquidation""" + + for transfer in child_transfers: + if transfer.to_address == liquidator: + return transfer.token_address, transfer.amount + + return liquidator, 0 + + +def _get_debt_data(liquidator: str, child_transfers: List[Transfer]) -> Tuple[str, int]: + """Get transfer from liquidator to compound""" + + for transfer in child_transfers: + if transfer.from_address == liquidator: + return transfer.token_address, transfer.amount + + return liquidator, 0 diff --git a/mev_inspect/schemas/classifiers.py b/mev_inspect/schemas/classifiers.py index 4749f37..75b2c0d 100644 --- a/mev_inspect/schemas/classifiers.py +++ b/mev_inspect/schemas/classifiers.py @@ -51,9 +51,9 @@ class LiquidationClassifier(Classifier): @staticmethod @abstractmethod def parse_liquidation( - trace: ClassifiedTrace, + liquidation_trace: DecodedCallTrace, child_transfers: List[Transfer], - child_traces: List[ClassifiedTrace] = [], + child_traces: List[ClassifiedTrace], ) -> Optional[Liquidation]: raise NotImplementedError() diff --git a/tests/blocks/Terminal Saved Output b/tests/blocks/Terminal Saved Output new file mode 100644 index 0000000..e66d5a6 --- /dev/null +++ b/tests/blocks/Terminal Saved Output @@ -0,0 +1,676 @@ +(base) gheise@mac mev-inspect-py % git branch + 0x-bug + 0x-v2 + aave-liquidations-v3 + aave-zero-bug + add-liquidation-addresses + add-liquidation-timestamp + classifier-helpers + coingecko-api + compound-tokens + compound-v2 +* compound-v3 + double-arb-bug + geth + main + migrations-fix + swapmodel + token-decimals +(base) gheise@mac mev-inspect-py % git checkout main +M mev_inspect/classifiers/specs/compound.py +Switched to branch 'main' +Your branch is up to date with 'origin/main'. +(base) gheise@mac mev-inspect-py % git branch -D compound-v3 +Deleted branch compound-v3 (was 9604e01). +(base) gheise@mac mev-inspect-py % git checkout -b liquidation-classifiers +Switched to a new branch 'liquidation-classifiers' +(base) gheise@mac mev-inspect-py % git status +On branch liquidation-classifiers +Changes not staged for commit: + (use "git add ..." to update what will be committed) + (use "git restore ..." to discard changes in working directory) + modified: mev_inspect/classifiers/specs/aave.py + modified: mev_inspect/classifiers/specs/compound.py + modified: mev_inspect/inspect_block.py + modified: mev_inspect/liquidations.py + modified: mev_inspect/schemas/classifiers.py + +Untracked files: + (use "git add ..." to include in what will be committed) + .hypothesis/ + = + +no changes added to commit (use "git add" and/or "git commit -a") +(base) gheise@mac mev-inspect-py % git add mev_inspect +(base) gheise@mac mev-inspect-py % ./mev test +Running tests +Skipping virtualenv creation, as specified in config file. +ImportError while loading conftest '/app/tests/conftest.py'. +tests/conftest.py:6: in + from mev_inspect.classifiers.trace import TraceClassifier +mev_inspect/classifiers/trace.py:15: in + from .specs import ALL_CLASSIFIER_SPECS +mev_inspect/classifiers/specs/__init__.py:3: in + from mev_inspect.schemas.classifiers import Classifier, ClassifierSpec +mev_inspect/schemas/classifiers.py:45: in + class LiquidationClassifier(Classifier): +mev_inspect/schemas/classifiers.py:55: in LiquidationClassifier + ) -> Optional[Liquidation]: +E NameError: name 'Liquidation' is not defined +command terminated with exit code 4 +(base) gheise@mac mev-inspect-py % git add mev_inspect +(base) gheise@mac mev-inspect-py % ./mev test +Running tests +Skipping virtualenv creation, as specified in config file. +ImportError while loading conftest '/app/tests/conftest.py'. +tests/conftest.py:6: in + from mev_inspect.classifiers.trace import TraceClassifier +mev_inspect/classifiers/trace.py:15: in + from .specs import ALL_CLASSIFIER_SPECS +mev_inspect/classifiers/specs/__init__.py:6: in + from .aave import AAVE_CLASSIFIER_SPECS +E File "/app/mev_inspect/classifiers/specs/aave.py", line 17 +E """Inspect list of classified traces and identify liquidation""" +E ^ +E IndentationError: expected an indented block +command terminated with exit code 4 +(base) gheise@mac mev-inspect-py % git add mev_inspect +(base) gheise@mac mev-inspect-py % ./mev test +Running tests +Skipping virtualenv creation, as specified in config file. +ImportError while loading conftest '/app/tests/conftest.py'. +tests/conftest.py:6: in + from mev_inspect.classifiers.trace import TraceClassifier +mev_inspect/classifiers/trace.py:15: in + from .specs import ALL_CLASSIFIER_SPECS +mev_inspect/classifiers/specs/__init__.py:6: in + from .aave import AAVE_CLASSIFIER_SPECS +E File "/app/mev_inspect/classifiers/specs/aave.py", line 47 +E ) +E ^ +E SyntaxError: unmatched ')' +command terminated with exit code 4 +(base) gheise@mac mev-inspect-py % ./mev test +Running tests +Skipping virtualenv creation, as specified in config file. +ImportError while loading conftest '/app/tests/conftest.py'. +tests/conftest.py:6: in + from mev_inspect.classifiers.trace import TraceClassifier +mev_inspect/classifiers/trace.py:15: in + from .specs import ALL_CLASSIFIER_SPECS +mev_inspect/classifiers/specs/__init__.py:6: in + from .aave import AAVE_CLASSIFIER_SPECS +E File "/app/mev_inspect/classifiers/specs/aave.py", line 26 +E continue +E ^ +E SyntaxError: 'continue' not properly in loop +command terminated with exit code 4 +(base) gheise@mac mev-inspect-py % git add mev_inspect +(base) gheise@mac mev-inspect-py % ./mev test +Running tests +Skipping virtualenv creation, as specified in config file. +ImportError while loading conftest '/app/tests/conftest.py'. +tests/conftest.py:6: in + from mev_inspect.classifiers.trace import TraceClassifier +mev_inspect/classifiers/trace.py:15: in + from .specs import ALL_CLASSIFIER_SPECS +mev_inspect/classifiers/specs/__init__.py:6: in + from .aave import AAVE_CLASSIFIER_SPECS +mev_inspect/classifiers/specs/aave.py:10: in + class AaveLiquidationClassifier(LiquidationClassifier): +mev_inspect/classifiers/specs/aave.py:14: in AaveLiquidationClassifier + child_traces: List[Trace] +E NameError: name 'List' is not defined +command terminated with exit code 4 +(base) gheise@mac mev-inspect-py % git add mev_inspect +(base) gheise@mac mev-inspect-py % ./mev test +Running tests +Skipping virtualenv creation, as specified in config file. +ImportError while loading conftest '/app/tests/conftest.py'. +tests/conftest.py:6: in + from mev_inspect.classifiers.trace import TraceClassifier +mev_inspect/classifiers/trace.py:15: in + from .specs import ALL_CLASSIFIER_SPECS +mev_inspect/classifiers/specs/__init__.py:6: in + from .aave import AAVE_CLASSIFIER_SPECS +mev_inspect/classifiers/specs/aave.py:11: in + class AaveLiquidationClassifier(LiquidationClassifier): +mev_inspect/classifiers/specs/aave.py:15: in AaveLiquidationClassifier + child_traces: List[Trace] +E NameError: name 'Trace' is not defined +command terminated with exit code 4 +(base) gheise@mac mev-inspect-py % git add mev_inspect +(base) gheise@mac mev-inspect-py % ./mev test +Running tests +Skipping virtualenv creation, as specified in config file. +ImportError while loading conftest '/app/tests/conftest.py'. +tests/conftest.py:6: in + from mev_inspect.classifiers.trace import TraceClassifier +mev_inspect/classifiers/trace.py:15: in + from .specs import ALL_CLASSIFIER_SPECS +mev_inspect/classifiers/specs/__init__.py:6: in + from .aave import AAVE_CLASSIFIER_SPECS +mev_inspect/classifiers/specs/aave.py:12: in + class AaveLiquidationClassifier(LiquidationClassifier): +mev_inspect/classifiers/specs/aave.py:17: in AaveLiquidationClassifier + ) -> Optional[Liquidation]: +E NameError: name 'Liquidation' is not defined +command terminated with exit code 4 +(base) gheise@mac mev-inspect-py % git add mev_inspect +(base) gheise@mac mev-inspect-py % ./mev test +Running tests +Skipping virtualenv creation, as specified in config file. +ImportError while loading conftest '/app/tests/conftest.py'. +tests/conftest.py:6: in + from mev_inspect.classifiers.trace import TraceClassifier +mev_inspect/classifiers/trace.py:15: in + from .specs import ALL_CLASSIFIER_SPECS +mev_inspect/classifiers/specs/__init__.py:6: in + from .aave import AAVE_CLASSIFIER_SPECS +mev_inspect/classifiers/specs/aave.py:13: in + class AaveLiquidationClassifier(LiquidationClassifier): +mev_inspect/classifiers/specs/aave.py:55: in AaveLiquidationClassifier + ) -> Tuple[str, int]: +E NameError: name 'Tuple' is not defined +command terminated with exit code 4 +(base) gheise@mac mev-inspect-py % git add mev_inspect +(base) gheise@mac mev-inspect-py % ./mev test +Running tests +Skipping virtualenv creation, as specified in config file. +ImportError while loading conftest '/app/tests/conftest.py'. +tests/conftest.py:6: in + from mev_inspect.classifiers.trace import TraceClassifier +mev_inspect/classifiers/trace.py:15: in + from .specs import ALL_CLASSIFIER_SPECS +mev_inspect/classifiers/specs/__init__.py:9: in + from .compound import COMPOUND_CLASSIFIER_SPECS +E File "/app/mev_inspect/classifiers/specs/compound.py", line 5 +E LiquidationClassifier, +E ^ +E SyntaxError: invalid syntax +command terminated with exit code 4 +(base) gheise@mac mev-inspect-py % git add mev_inspect +(base) gheise@mac mev-inspect-py % git add mev_inspect +(base) gheise@mac mev-inspect-py % ./mev test +Running tests +Skipping virtualenv creation, as specified in config file. +ImportError while loading conftest '/app/tests/conftest.py'. +tests/conftest.py:6: in + from mev_inspect.classifiers.trace import TraceClassifier +mev_inspect/classifiers/trace.py:15: in + from .specs import ALL_CLASSIFIER_SPECS +mev_inspect/classifiers/specs/__init__.py:9: in + from .compound import COMPOUND_CLASSIFIER_SPECS +E File "/app/mev_inspect/classifiers/specs/compound.py", line 50 +E ) +E IndentationError: unexpected indent +command terminated with exit code 4 +(base) gheise@mac mev-inspect-py % git add mev_inspect +(base) gheise@mac mev-inspect-py % ./mev test +Running tests +Skipping virtualenv creation, as specified in config file. +ImportError while loading conftest '/app/tests/conftest.py'. +tests/conftest.py:6: in + from mev_inspect.classifiers.trace import TraceClassifier +mev_inspect/classifiers/trace.py:15: in + from .specs import ALL_CLASSIFIER_SPECS +mev_inspect/classifiers/specs/__init__.py:9: in + from .compound import COMPOUND_CLASSIFIER_SPECS +E File "/app/mev_inspect/classifiers/specs/compound.py", line 52 +E """Find the call to `seize` in the child traces (successful liquidation)""" +E ^ +E IndentationError: expected an indented block +command terminated with exit code 4 +(base) gheise@mac mev-inspect-py % poetry run pre-commit +The currently activated Python version 3.8.5 is not supported by the project (^3.9). +Trying to find and use a compatible version. +Using python3.9 (3.9.9) +black....................................................................Failed +- hook id: black +- exit code: 123 +- files were modified by this hook + +error: cannot format /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py: Cannot parse: 28:50: if not isinstance(trace, DecodedCallTrace) +error: cannot format /Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/compound.py: Cannot parse: 52:4: """Find the call to `seize` in the child traces (successful liquidation)""" +reformatted /Users/gheise/mev-inspect-py/mev_inspect/schemas/classifiers.py +reformatted /Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/aave.py +Oh no! 💥 💔 💥 +2 files reformatted, 1 file left unchanged, 2 files failed to reformat. + +isort....................................................................Failed +- hook id: isort +- files were modified by this hook + +/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/api.py:475: UserWarning: /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py unable to sort due to existing syntax errors + warn(f"{actual_file_path} unable to sort due to existing syntax errors") +/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/main.py:103: UserWarning: Unable to parse file ./mev_inspect/schemas/classifiers.py due to [Errno 2] No such file or directory: '/Users/gheise/mev-inspect-py/mev_inspect/schemas/classifiers.py.isorted' -> '/Users/gheise/mev-inspect-py/mev_inspect/schemas/classifiers.py' + warn(f"Unable to parse file {file_name} due to {error}") +/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/main.py:103: UserWarning: Unable to parse file ./mev_inspect/crud/prices.py due to [Errno 2] No such file or directory: '/Users/gheise/mev-inspect-py/mev_inspect/crud/prices.py.isorted' + warn(f"Unable to parse file {file_name} due to {error}") +/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/main.py:103: UserWarning: Unable to parse file ./mev_inspect/classifiers/specs/aave.py due to [Errno 2] No such file or directory: '/Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/aave.py.isorted' -> '/Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/aave.py' + warn(f"Unable to parse file {file_name} due to {error}") +/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/api.py:475: UserWarning: /Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/compound.py unable to sort due to existing syntax errors + warn(f"{actual_file_path} unable to sort due to existing syntax errors") +Skipped 2 files +/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/api.py:475: UserWarning: /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py unable to sort due to existing syntax errors + warn(f"{actual_file_path} unable to sort due to existing syntax errors") +Fixing /Users/gheise/mev-inspect-py/mev_inspect/schemas/classifiers.py +Fixing /Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/aave.py +/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/api.py:475: UserWarning: /Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/compound.py unable to sort due to existing syntax errors + warn(f"{actual_file_path} unable to sort due to existing syntax errors") +Skipped 2 files + +pylint...................................................................Failed +- hook id: pylint +- exit code: 2 + +************* Module mev_inspect.classifiers.specs.aave +mev_inspect/classifiers/specs/aave.py:25:53: E0602: Undefined variable 'self' (undefined-variable) +mev_inspect/classifiers/specs/aave.py:32:52: E0602: Undefined variable 'self' (undefined-variable) +mev_inspect/classifiers/specs/aave.py:62:49: E0602: Undefined variable 'get_transfer' (undefined-variable) +mev_inspect/classifiers/specs/aave.py:78:49: E0602: Undefined variable 'get_transfer' (undefined-variable) +************* Module mev_inspect.inspect_block +mev_inspect/inspect_block.py:36:0: E0611: No name 'liquidations' in module 'mev_inspect' (no-name-in-module) + +----------------------------------- +Your code has been rated at 8.32/10 + + +-------------------------------------------------------------------- +Your code has been rated at 10.00/10 (previous run: 10.00/10, +0.00) + +mypy.....................................................................Failed +- hook id: mypy +- exit code: 2 + +mev_inspect/classifiers/specs/compound.py:52: error: expected an indented block +Found 1 error in 1 file (errors prevented further checking) + +(base) gheise@mac mev-inspect-py % git add mev_inspect +(base) gheise@mac mev-inspect-py % poetry run pre-commit +The currently activated Python version 3.8.5 is not supported by the project (^3.9). +Trying to find and use a compatible version. +Using python3.9 (3.9.9) +black....................................................................Failed +- hook id: black +- exit code: 123 + +error: cannot format /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py: Cannot parse: 28:50: if not isinstance(trace, DecodedCallTrace) +error: cannot format /Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/compound.py: Cannot parse: 52:4: """Find the call to `seize` in the child traces (successful liquidation)""" +Oh no! 💥 💔 💥 +3 files left unchanged, 2 files failed to reformat. + +isort....................................................................Passed +pylint...................................................................Failed +- hook id: pylint +- exit code: 2 + +************* Module mev_inspect.classifiers.specs.aave +mev_inspect/classifiers/specs/aave.py:25:53: E0602: Undefined variable 'self' (undefined-variable) +mev_inspect/classifiers/specs/aave.py:32:52: E0602: Undefined variable 'self' (undefined-variable) +mev_inspect/classifiers/specs/aave.py:62:49: E0602: Undefined variable 'get_transfer' (undefined-variable) +mev_inspect/classifiers/specs/aave.py:78:49: E0602: Undefined variable 'get_transfer' (undefined-variable) +************* Module mev_inspect.inspect_block +mev_inspect/inspect_block.py:36:0: E0611: No name 'liquidations' in module 'mev_inspect' (no-name-in-module) + +------------------------------------------------------------------ +Your code has been rated at 8.32/10 (previous run: 8.32/10, +0.00) + + +-------------------------------------------------------------------- +Your code has been rated at 10.00/10 (previous run: 10.00/10, +0.00) + +mypy.....................................................................Failed +- hook id: mypy +- exit code: 2 + +mev_inspect/classifiers/specs/compound.py:52: error: expected an indented block +Found 1 error in 1 file (errors prevented further checking) + +(base) gheise@mac mev-inspect-py % git add mev_inspect +(base) gheise@mac mev-inspect-py % poetry run pre-commit +The currently activated Python version 3.8.5 is not supported by the project (^3.9). +Trying to find and use a compatible version. +Using python3.9 (3.9.9) +black....................................................................Failed +- hook id: black +- exit code: 123 + +error: cannot format /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py: Cannot parse: 62:60: if trace.transaction_hash == parent.transaction_hash +error: cannot format /Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/compound.py: Cannot parse: 77:38: seize_trace: DecodedCallTrace,, +Oh no! 💥 💔 💥 +3 files left unchanged, 2 files failed to reformat. + +isort....................................................................Passed +pylint...................................................................Failed +- hook id: pylint +- exit code: 2 + +************* Module mev_inspect.classifiers.specs.aave +mev_inspect/classifiers/specs/aave.py:25:53: E0602: Undefined variable 'self' (undefined-variable) +mev_inspect/classifiers/specs/aave.py:32:52: E0602: Undefined variable 'self' (undefined-variable) +mev_inspect/classifiers/specs/aave.py:62:49: E0602: Undefined variable 'get_transfer' (undefined-variable) +mev_inspect/classifiers/specs/aave.py:78:49: E0602: Undefined variable 'get_transfer' (undefined-variable) +************* Module mev_inspect.inspect_block +mev_inspect/inspect_block.py:36:0: E0611: No name 'liquidations' in module 'mev_inspect' (no-name-in-module) + +------------------------------------------------------------------ +Your code has been rated at 8.32/10 (previous run: 8.32/10, +0.00) + + +-------------------------------------------------------------------- +Your code has been rated at 10.00/10 (previous run: 10.00/10, +0.00) + +mypy.....................................................................Failed +- hook id: mypy +- exit code: 2 + +mev_inspect/classifiers/specs/compound.py:77: error: invalid syntax +Found 1 error in 1 file (errors prevented further checking) + +(base) gheise@mac mev-inspect-py % git add mev_inspect +(base) gheise@mac mev-inspect-py % poetry run pre-commit +The currently activated Python version 3.8.5 is not supported by the project (^3.9). +Trying to find and use a compatible version. +Using python3.9 (3.9.9) +black....................................................................Failed +- hook id: black +- exit code: 123 +- files were modified by this hook + +error: cannot format /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py: Cannot parse: 62:60: if trace.transaction_hash == parent.transaction_hash +reformatted /Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/compound.py +Oh no! 💥 💔 💥 +1 file reformatted, 3 files left unchanged, 1 file failed to reformat. + +isort....................................................................Failed +- hook id: isort +- files were modified by this hook + +/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/api.py:475: UserWarning: /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py unable to sort due to existing syntax errors + warn(f"{actual_file_path} unable to sort due to existing syntax errors") +/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/main.py:103: UserWarning: Unable to parse file ./mev_inspect/classifiers/specs/compound.py due to [Errno 2] No such file or directory: '/Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/compound.py.isorted' -> '/Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/compound.py' + warn(f"Unable to parse file {file_name} due to {error}") +Skipped 2 files +/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/api.py:475: UserWarning: /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py unable to sort due to existing syntax errors + warn(f"{actual_file_path} unable to sort due to existing syntax errors") +Fixing /Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/compound.py +Skipped 2 files + +pylint...................................................................Failed +- hook id: pylint +- exit code: 6 + +************* Module mev_inspect.classifiers.specs.compound +mev_inspect/classifiers/specs/compound.py:16:27: E0602: Undefined variable 'DecodedCallTrace' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:19:22: E0602: Undefined variable 'self' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:25:57: E0602: Undefined variable '_get_debt_data' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:32:56: E0602: Undefined variable '_get_received_data' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:56:39: E0602: Undefined variable 'Classification' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:61:21: E0602: Undefined variable 'DecodedCallTrace' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:62:27: E0602: Undefined variable 'DecodeCallTrace' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:70:37: E0602: Undefined variable 'Transfer' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:70:49: E0602: Undefined variable 'get_transfer' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:62:8: W0613: Unused argument 'liquidation_trace' (unused-argument) +mev_inspect/classifiers/specs/compound.py:78:21: E0602: Undefined variable 'DecodedCallTrace' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:79:27: E0602: Undefined variable 'DecodeCallTrace' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:87:37: E0602: Undefined variable 'Transfer' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:87:49: E0602: Undefined variable 'get_transfer' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:79:8: W0613: Unused argument 'liquidation_trace' (unused-argument) +************* Module mev_inspect.classifiers.specs.aave +mev_inspect/classifiers/specs/aave.py:25:53: E0602: Undefined variable 'self' (undefined-variable) +mev_inspect/classifiers/specs/aave.py:32:52: E0602: Undefined variable 'self' (undefined-variable) +mev_inspect/classifiers/specs/aave.py:62:49: E0602: Undefined variable 'get_transfer' (undefined-variable) +mev_inspect/classifiers/specs/aave.py:78:49: E0602: Undefined variable 'get_transfer' (undefined-variable) +************* Module mev_inspect.inspect_block +mev_inspect/inspect_block.py:36:0: E0611: No name 'liquidations' in module 'mev_inspect' (no-name-in-module) + +------------------------------------------------------------------ +Your code has been rated at 5.11/10 (previous run: 8.32/10, -3.22) + + +-------------------------------------------------------------------- +Your code has been rated at 10.00/10 (previous run: 10.00/10, +0.00) + +mypy.....................................................................Failed +- hook id: mypy +- exit code: 2 + +mev_inspect/liquidations.py:62: error: invalid syntax +Found 1 error in 1 file (errors prevented further checking) + +(base) gheise@mac mev-inspect-py % git add mev_inspect +(base) gheise@mac mev-inspect-py % poetry run pre-commit +The currently activated Python version 3.8.5 is not supported by the project (^3.9). +Trying to find and use a compatible version. +Using python3.9 (3.9.9) +black....................................................................Failed +- hook id: black +- exit code: 123 + +error: cannot format /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py: Cannot parse: 62:60: if trace.transaction_hash == parent.transaction_hash +Oh no! 💥 💔 💥 +4 files left unchanged, 1 file failed to reformat. + +isort....................................................................Passed +pylint...................................................................Failed +- hook id: pylint +- exit code: 6 + +************* Module mev_inspect.classifiers.specs.compound +mev_inspect/classifiers/specs/compound.py:16:27: E0602: Undefined variable 'DecodedCallTrace' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:19:22: E0602: Undefined variable 'self' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:25:57: E0602: Undefined variable '_get_debt_data' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:32:56: E0602: Undefined variable '_get_received_data' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:56:39: E0602: Undefined variable 'Classification' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:61:21: E0602: Undefined variable 'DecodedCallTrace' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:62:27: E0602: Undefined variable 'DecodeCallTrace' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:70:37: E0602: Undefined variable 'Transfer' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:70:49: E0602: Undefined variable 'get_transfer' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:62:8: W0613: Unused argument 'liquidation_trace' (unused-argument) +mev_inspect/classifiers/specs/compound.py:78:21: E0602: Undefined variable 'DecodedCallTrace' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:79:27: E0602: Undefined variable 'DecodeCallTrace' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:87:37: E0602: Undefined variable 'Transfer' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:87:49: E0602: Undefined variable 'get_transfer' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:79:8: W0613: Unused argument 'liquidation_trace' (unused-argument) +************* Module mev_inspect.classifiers.specs.aave +mev_inspect/classifiers/specs/aave.py:25:53: E0602: Undefined variable 'self' (undefined-variable) +mev_inspect/classifiers/specs/aave.py:32:52: E0602: Undefined variable 'self' (undefined-variable) +mev_inspect/classifiers/specs/aave.py:62:49: E0602: Undefined variable 'get_transfer' (undefined-variable) +mev_inspect/classifiers/specs/aave.py:78:49: E0602: Undefined variable 'get_transfer' (undefined-variable) +************* Module mev_inspect.inspect_block +mev_inspect/inspect_block.py:36:0: E0611: No name 'liquidations' in module 'mev_inspect' (no-name-in-module) + +------------------------------------------------------------------ +Your code has been rated at 5.11/10 (previous run: 5.11/10, +0.00) + + +-------------------------------------------------------------------- +Your code has been rated at 10.00/10 (previous run: 10.00/10, +0.00) + +mypy.....................................................................Failed +- hook id: mypy +- exit code: 2 + +mev_inspect/liquidations.py:62: error: invalid syntax +Found 1 error in 1 file (errors prevented further checking) + +(base) gheise@mac mev-inspect-py % git add mev_inspect +(base) gheise@mac mev-inspect-py % poetry run pre-commit +The currently activated Python version 3.8.5 is not supported by the project (^3.9). +Trying to find and use a compatible version. +Using python3.9 (3.9.9) +black....................................................................Failed +- hook id: black +- exit code: 123 + +error: cannot format /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py: Cannot parse: 62:60: if trace.transaction_hash == parent.transaction_hash +Oh no! 💥 💔 💥 +4 files left unchanged, 1 file failed to reformat. + +isort....................................................................Failed +- hook id: isort +- files were modified by this hook + +/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/api.py:475: UserWarning: /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py unable to sort due to existing syntax errors + warn(f"{actual_file_path} unable to sort due to existing syntax errors") +Fixing /Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/compound.py +/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/main.py:103: UserWarning: Unable to parse file ./alembic/versions/083978d6e455_create_miner_payments_table.py due to [Errno 2] No such file or directory: '/Users/gheise/mev-inspect-py/alembic/versions/083978d6e455_create_miner_payments_table.py.isorted' + warn(f"Unable to parse file {file_name} due to {error}") +Skipped 2 files +/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/api.py:475: UserWarning: /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py unable to sort due to existing syntax errors + warn(f"{actual_file_path} unable to sort due to existing syntax errors") +/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/main.py:103: UserWarning: Unable to parse file ./mev_inspect/classifiers/specs/compound.py due to [Errno 2] No such file or directory: '/Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/compound.py.isorted' -> '/Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/compound.py' + warn(f"Unable to parse file {file_name} due to {error}") +/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/main.py:103: UserWarning: Unable to parse file ./alembic/versions/9b8ae51c5d56_add_swap_arbitrage_join_table.py due to [Errno 2] No such file or directory: '/Users/gheise/mev-inspect-py/alembic/versions/9b8ae51c5d56_add_swap_arbitrage_join_table.py.isorted' + warn(f"Unable to parse file {file_name} due to {error}") +Skipped 2 files + +pylint...................................................................Failed +- hook id: pylint +- exit code: 6 + +************* Module mev_inspect.classifiers.specs.compound +mev_inspect/classifiers/specs/compound.py:3:0: E0611: No name 'DecodeCallTrace' in module 'mev_inspect.schemas.classifiers' (no-name-in-module) +mev_inspect/classifiers/specs/compound.py:17:27: E0602: Undefined variable 'DecodedCallTrace' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:20:22: E0602: Undefined variable 'self' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:26:57: E0602: Undefined variable '_get_debt_data' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:33:56: E0602: Undefined variable '_get_received_data' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:57:39: E0602: Undefined variable 'Classification' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:62:21: E0602: Undefined variable 'DecodedCallTrace' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:70:37: E0602: Undefined variable 'Transfer' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:70:49: E0602: Undefined variable 'get_transfer' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:78:21: E0602: Undefined variable 'DecodedCallTrace' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:86:37: E0602: Undefined variable 'Transfer' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:86:49: E0602: Undefined variable 'get_transfer' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:3:0: W0611: Unused DecodeCallTrace imported from mev_inspect.schemas.classifiers (unused-import) +************* Module mev_inspect.classifiers.specs.aave +mev_inspect/classifiers/specs/aave.py:25:53: E0602: Undefined variable 'self' (undefined-variable) +mev_inspect/classifiers/specs/aave.py:32:52: E0602: Undefined variable 'self' (undefined-variable) +mev_inspect/classifiers/specs/aave.py:62:49: E0602: Undefined variable 'get_transfer' (undefined-variable) +mev_inspect/classifiers/specs/aave.py:78:49: E0602: Undefined variable 'get_transfer' (undefined-variable) +************* Module mev_inspect.inspect_block +mev_inspect/inspect_block.py:36:0: E0611: No name 'liquidations' in module 'mev_inspect' (no-name-in-module) + +------------------------------------------------------------------ +Your code has been rated at 5.43/10 (previous run: 5.11/10, +0.32) + + +-------------------------------------------------------------------- +Your code has been rated at 10.00/10 (previous run: 10.00/10, +0.00) + +mypy.....................................................................Failed +- hook id: mypy +- exit code: 2 + +mev_inspect/liquidations.py:62: error: invalid syntax +Found 1 error in 1 file (errors prevented further checking) + +(base) gheise@mac mev-inspect-py % git add mev_inspect +(base) gheise@mac mev-inspect-py % poetry run pre-commit +The currently activated Python version 3.8.5 is not supported by the project (^3.9). +Trying to find and use a compatible version. +Using python3.9 (3.9.9) +black....................................................................Failed +- hook id: black +- exit code: 123 +- files were modified by this hook + +error: cannot format /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py: Cannot parse: 62:60: if trace.transaction_hash == parent.transaction_hash +reformatted /Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/compound.py +Oh no! 💥 💔 💥 +1 file reformatted, 3 files left unchanged, 1 file failed to reformat. + +isort....................................................................Passed +pylint...................................................................Failed +- hook id: pylint +- exit code: 6 + +************* Module mev_inspect.classifiers.specs.compound +mev_inspect/classifiers/specs/compound.py:3:0: E0611: No name 'DecodeCallTrace' in module 'mev_inspect.schemas.classifiers' (no-name-in-module) +mev_inspect/classifiers/specs/compound.py:17:33: E0602: Undefined variable 'DecodedCallTrace' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:26:57: E0602: Undefined variable '_get_debt_data' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:33:56: E0602: Undefined variable '_get_received_data' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:59:39: E0602: Undefined variable 'Classification' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:65:21: E0602: Undefined variable 'DecodedCallTrace' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:73:37: E0602: Undefined variable 'Transfer' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:73:49: E0602: Undefined variable 'get_transfer' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:65:8: W0613: Unused argument 'seize_trace' (unused-argument) +mev_inspect/classifiers/specs/compound.py:82:21: E0602: Undefined variable 'DecodedCallTrace' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:90:37: E0602: Undefined variable 'Transfer' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:90:49: E0602: Undefined variable 'get_transfer' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:82:8: W0613: Unused argument 'seize_trace' (unused-argument) +mev_inspect/classifiers/specs/compound.py:3:0: W0611: Unused DecodeCallTrace imported from mev_inspect.schemas.classifiers (unused-import) +************* Module mev_inspect.classifiers.specs.aave +mev_inspect/classifiers/specs/aave.py:25:53: E0602: Undefined variable 'self' (undefined-variable) +mev_inspect/classifiers/specs/aave.py:32:52: E0602: Undefined variable 'self' (undefined-variable) +mev_inspect/classifiers/specs/aave.py:62:49: E0602: Undefined variable 'get_transfer' (undefined-variable) +mev_inspect/classifiers/specs/aave.py:78:49: E0602: Undefined variable 'get_transfer' (undefined-variable) +************* Module mev_inspect.inspect_block +mev_inspect/inspect_block.py:36:0: E0611: No name 'liquidations' in module 'mev_inspect' (no-name-in-module) + +------------------------------------------------------------------ +Your code has been rated at 5.59/10 (previous run: 5.43/10, +0.16) + + +-------------------------------------------------------------------- +Your code has been rated at 10.00/10 (previous run: 10.00/10, +0.00) + +mypy.....................................................................Failed +- hook id: mypy +- exit code: 2 + +mev_inspect/liquidations.py:62: error: invalid syntax +Found 1 error in 1 file (errors prevented further checking) + +(base) gheise@mac mev-inspect-py % git add mev_inspect +(base) gheise@mac mev-inspect-py % poetry run pre-commit +The currently activated Python version 3.8.5 is not supported by the project (^3.9). +Trying to find and use a compatible version. +Using python3.9 (3.9.9) +black....................................................................Failed +- hook id: black +- exit code: 123 + +error: cannot format /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py: Cannot parse: 62:60: if trace.transaction_hash == parent.transaction_hash +Oh no! 💥 💔 💥 +4 files left unchanged, 1 file failed to reformat. + +isort....................................................................Passed +pylint...................................................................Failed +- hook id: pylint +- exit code: 6 + +************* Module mev_inspect.classifiers.specs.compound +mev_inspect/classifiers/specs/compound.py:26:57: E0602: Undefined variable '_get_debt_data' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:33:56: E0602: Undefined variable '_get_received_data' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:59:39: E0602: Undefined variable 'Classification' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:73:37: E0602: Undefined variable 'Transfer' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:73:49: E0602: Undefined variable 'get_transfer' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:65:8: W0613: Unused argument 'seize_trace' (unused-argument) +mev_inspect/classifiers/specs/compound.py:90:37: E0602: Undefined variable 'Transfer' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:90:49: E0602: Undefined variable 'get_transfer' (undefined-variable) +mev_inspect/classifiers/specs/compound.py:82:8: W0613: Unused argument 'seize_trace' (unused-argument) +************* Module mev_inspect.classifiers.specs.aave +mev_inspect/classifiers/specs/aave.py:25:53: E0602: Undefined variable 'self' (undefined-variable) +mev_inspect/classifiers/specs/aave.py:32:52: E0602: Undefined variable 'self' (undefined-variable) +mev_inspect/classifiers/specs/aave.py:62:49: E0602: Undefined variable 'get_transfer' (undefined-variable) +mev_inspect/classifiers/specs/aave.py:78:49: E0602: Undefined variable 'get_transfer' (undefined-variable) +************* Module mev_inspect.inspect_block +mev_inspect/inspect_block.py:36:0: E0611: No name 'liquidations' in module 'mev_inspect' (no-name-in-module) + +------------------------------------------------------------------ +Your code has been rated at 6.70/10 (previous run: 5.59/10, +1.12) + + +-------------------------------------------------------------------- +Your code has been rated at 10.00/10 (previous run: 10.00/10, +0.00) + +mypy.....................................................................Failed +- hook id: mypy +- exit code: 2 + +mev_inspect/liquidations.py:62: error: invalid syntax +Found 1 error in 1 file (errors prevented further checking) + +(base) gheise@mac mev-inspect-py % diff --git a/tests/liquidation_test.py b/tests/liquidation_test.py index 4b70e26..2250ce7 100644 --- a/tests/liquidation_test.py +++ b/tests/liquidation_test.py @@ -1,7 +1,7 @@ from typing import List -from mev_inspect.aave_liquidations import get_aave_liquidations from mev_inspect.classifiers.trace import TraceClassifier +from mev_inspect.liquidations import get_liquidations from mev_inspect.schemas.liquidations import Liquidation from mev_inspect.schemas.traces import Protocol from mev_inspect.transfers import ETH_TOKEN_ADDRESS @@ -31,9 +31,10 @@ def test_single_weth_liquidation(trace_classifier: TraceClassifier): block = load_test_block(block_number) classified_traces = trace_classifier.classify(block.traces) - result = get_aave_liquidations(classified_traces) + result = get_liquidations(classified_traces) - _assert_equal_list_of_liquidations(result, liquidations) + for liquidation in liquidations: + assert liquidation in result def test_single_liquidation(trace_classifier: TraceClassifier): @@ -59,9 +60,10 @@ def test_single_liquidation(trace_classifier: TraceClassifier): block = load_test_block(block_number) classified_traces = trace_classifier.classify(block.traces) - result = get_aave_liquidations(classified_traces) + result = get_liquidations(classified_traces) - _assert_equal_list_of_liquidations(result, liquidations) + for liquidation in liquidations: + assert liquidation in result def test_single_liquidation_with_atoken_payback(trace_classifier: TraceClassifier): @@ -87,9 +89,10 @@ def test_single_liquidation_with_atoken_payback(trace_classifier: TraceClassifie block = load_test_block(block_number) classified_traces = trace_classifier.classify(block.traces) - result = get_aave_liquidations(classified_traces) + result = get_liquidations(classified_traces) - _assert_equal_list_of_liquidations(result, liquidations) + for liquidation in liquidations: + assert liquidation in result def test_multiple_liquidations_in_block(trace_classifier: TraceClassifier): @@ -139,10 +142,11 @@ def test_multiple_liquidations_in_block(trace_classifier: TraceClassifier): block = load_test_block(block_number) classified_traces = trace_classifier.classify(block.traces) - result = get_aave_liquidations(classified_traces) + result = get_liquidations(classified_traces) liquidations = [liquidation1, liquidation2, liquidation3] - _assert_equal_list_of_liquidations(result, liquidations) + for liquidation in liquidations: + assert liquidation in result def test_liquidations_with_eth_transfer(trace_classifier: TraceClassifier): @@ -179,10 +183,11 @@ def test_liquidations_with_eth_transfer(trace_classifier: TraceClassifier): block = load_test_block(block_number) classified_traces = trace_classifier.classify(block.traces) - result = get_aave_liquidations(classified_traces) + result = get_liquidations(classified_traces) liquidations = [liquidation1, liquidation2] - _assert_equal_list_of_liquidations(result, liquidations) + for liquidation in liquidations: + assert liquidation in result def _assert_equal_list_of_liquidations( diff --git a/tests/test_compound.py b/tests/test_compound.py index 34fab5d..efc996b 100644 --- a/tests/test_compound.py +++ b/tests/test_compound.py @@ -1,5 +1,5 @@ from mev_inspect.classifiers.trace import TraceClassifier -from mev_inspect.compound_liquidations import get_compound_liquidations +from mev_inspect.liquidations import get_liquidations from mev_inspect.schemas.liquidations import Liquidation from mev_inspect.schemas.traces import Protocol from tests.utils import load_comp_markets, load_cream_markets, load_test_block @@ -30,8 +30,10 @@ def test_c_ether_liquidations(trace_classifier: TraceClassifier): ] block = load_test_block(block_number) classified_traces = trace_classifier.classify(block.traces) - result = get_compound_liquidations(classified_traces) - assert result == liquidations + result = get_liquidations(classified_traces) + + for liquidation in liquidations: + assert liquidation in result block_number = 13207907 transaction_hash = ( @@ -55,8 +57,10 @@ def test_c_ether_liquidations(trace_classifier: TraceClassifier): block = load_test_block(block_number) classified_traces = trace_classifier.classify(block.traces) - result = get_compound_liquidations(classified_traces) - assert result == liquidations + result = get_liquidations(classified_traces) + + for liquidation in liquidations: + assert liquidation in result block_number = 13298725 transaction_hash = ( @@ -79,8 +83,10 @@ def test_c_ether_liquidations(trace_classifier: TraceClassifier): ] block = load_test_block(block_number) classified_traces = trace_classifier.classify(block.traces) - result = get_compound_liquidations(classified_traces) - assert result == liquidations + result = get_liquidations(classified_traces) + + for liquidation in liquidations: + assert liquidation in result def test_c_token_liquidation(trace_classifier: TraceClassifier): @@ -105,8 +111,10 @@ def test_c_token_liquidation(trace_classifier: TraceClassifier): ] block = load_test_block(block_number) classified_traces = trace_classifier.classify(block.traces) - result = get_compound_liquidations(classified_traces) - assert result == liquidations + result = get_liquidations(classified_traces) + + for liquidation in liquidations: + assert liquidation in result def test_cream_token_liquidation(trace_classifier: TraceClassifier): @@ -131,5 +139,7 @@ def test_cream_token_liquidation(trace_classifier: TraceClassifier): ] block = load_test_block(block_number) classified_traces = trace_classifier.classify(block.traces) - result = get_compound_liquidations(classified_traces) - assert result == liquidations + result = get_liquidations(classified_traces) + + for liquidation in liquidations: + assert liquidation in result From 072c4df36cc04ee15789189530c0df87f5699086 Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Tue, 18 Jan 2022 12:31:15 -0500 Subject: [PATCH 03/20] Compound logic --- mev_inspect/classifiers/specs/compound.py | 87 ++++++++++++----------- 1 file changed, 46 insertions(+), 41 deletions(-) diff --git a/mev_inspect/classifiers/specs/compound.py b/mev_inspect/classifiers/specs/compound.py index bf7c4bc..106d4ec 100644 --- a/mev_inspect/classifiers/specs/compound.py +++ b/mev_inspect/classifiers/specs/compound.py @@ -21,40 +21,50 @@ class CompoundLiquidationClassifier(LiquidationClassifier): child_traces: List[ClassifiedTrace], ) -> Optional[Liquidation]: + liquidator = liquidation_trace.from_address + liquidated = liquidation_trace.inputs["borrower"] + debt_token_address = liquidation_trace.to_address + debt_purchase_amount = liquidation_trace.value + received_token_address = liquidation_trace.inputs["cTokenCollateral"] + received_amount = 0 + + + debt_transfer = _get_debt_transfer( + liquidator, child_transfers + ) + + received_transfer = _get_received_transfer( + liquidator, child_transfers + ) + seize_trace = _get_seize_call(child_traces) - if seize_trace is not None and seize_trace.inputs is not None: + if debt_transfer is not None: + debt_token_address = debt_transfer.token_address + debt_purchase_amount = debt_transfer.amount - liquidator = seize_trace.inputs["liquidator"] + if received_transfer is not None: + received_token_address = received_transfer.token_address + received_amount = received_transfer.amount - (debt_token_address, debt_purchase_amount) = _get_debt_data( - liquidator, child_transfers - ) + elif seize_trace is not None and seize_trace.inputs is not None: + received_amount = seize_trace.inputs['seizeTokens'] - if debt_purchase_amount == 0: - return None + return Liquidation( + liquidated_user=liquiated, + debt_token_address=debt_token_address, + liquidator_user=liquidator, + debt_purchase_amount=debt_purchase_amount, + protocol=liquidation_trace.protocol, + 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, + ) - (received_token_address, received_amount) = _get_received_data( - liquidator, child_transfers - ) - - if received_amount == 0: - return None - - return Liquidation( - liquidated_user=liquidation_trace.inputs["borrower"], - debt_token_address=debt_token_address, - liquidator_user=liquidator, - debt_purchase_amount=debt_purchase_amount, - protocol=liquidation_trace.protocol, - 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, - ) - return None + return None COMPOUND_V2_CETH_SPEC = ClassifierSpec( @@ -222,24 +232,19 @@ def _get_seize_call(traces: List[ClassifiedTrace]) -> Optional[ClassifiedTrace]: return trace return None - -def _get_received_data( +def _get_received_transfer( liquidator: str, child_transfers: List[Transfer] -) -> Tuple[str, int]: - """Look for and return payment for liquidation""" - +) -> Optional[Transfer]: + """Get transfer from compound to liquidator""" for transfer in child_transfers: if transfer.to_address == liquidator: - return transfer.token_address, transfer.amount - - return liquidator, 0 + return transfer + return None -def _get_debt_data(liquidator: str, child_transfers: List[Transfer]) -> Tuple[str, int]: +def _get_debt_transfer(liquidator: str, child_transfers: List[Transfer]) -> Optional[Transfer]: """Get transfer from liquidator to compound""" - for transfer in child_transfers: if transfer.from_address == liquidator: - return transfer.token_address, transfer.amount - - return liquidator, 0 + return transfer + return None From 406d22a26fc4f6c0695915ae6c188d9cd32a2736 Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Tue, 18 Jan 2022 12:59:44 -0500 Subject: [PATCH 04/20] Fixes --- mev_inspect/classifiers/specs/compound.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mev_inspect/classifiers/specs/compound.py b/mev_inspect/classifiers/specs/compound.py index 106d4ec..32cd076 100644 --- a/mev_inspect/classifiers/specs/compound.py +++ b/mev_inspect/classifiers/specs/compound.py @@ -1,4 +1,4 @@ -from typing import List, Optional, Tuple +from typing import List, Optional from mev_inspect.schemas.classifiers import ( Classification, @@ -51,7 +51,7 @@ class CompoundLiquidationClassifier(LiquidationClassifier): received_amount = seize_trace.inputs['seizeTokens'] return Liquidation( - liquidated_user=liquiated, + liquidated_user=liquidated, debt_token_address=debt_token_address, liquidator_user=liquidator, debt_purchase_amount=debt_purchase_amount, @@ -64,7 +64,7 @@ class CompoundLiquidationClassifier(LiquidationClassifier): error=liquidation_trace.error, ) - return None + return None COMPOUND_V2_CETH_SPEC = ClassifierSpec( From d1b4ebd02cdb5c1da48a0a5ea9d3039e66f72114 Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Tue, 18 Jan 2022 13:12:53 -0500 Subject: [PATCH 05/20] Address black --- mev_inspect/classifiers/specs/compound.py | 1 - 1 file changed, 1 deletion(-) diff --git a/mev_inspect/classifiers/specs/compound.py b/mev_inspect/classifiers/specs/compound.py index 32cd076..2a2a896 100644 --- a/mev_inspect/classifiers/specs/compound.py +++ b/mev_inspect/classifiers/specs/compound.py @@ -28,7 +28,6 @@ class CompoundLiquidationClassifier(LiquidationClassifier): received_token_address = liquidation_trace.inputs["cTokenCollateral"] received_amount = 0 - debt_transfer = _get_debt_transfer( liquidator, child_transfers ) From 1fd9780e9dbcfd4cde6801e4599c265b143e19a5 Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Tue, 18 Jan 2022 13:35:28 -0500 Subject: [PATCH 06/20] Change cUSDC to USDC token address --- tests/test_compound.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/tests/test_compound.py b/tests/test_compound.py index efc996b..b4c2e1f 100644 --- a/tests/test_compound.py +++ b/tests/test_compound.py @@ -114,7 +114,10 @@ def test_c_token_liquidation(trace_classifier: TraceClassifier): result = get_liquidations(classified_traces) for liquidation in liquidations: - assert liquidation in result + try: + assert liquidation in result + except: + import pdb; pdb.set_trace() def test_cream_token_liquidation(trace_classifier: TraceClassifier): @@ -127,7 +130,7 @@ def test_cream_token_liquidation(trace_classifier: TraceClassifier): Liquidation( liquidated_user="0x46bf9479dc569bc796b7050344845f6564d45fba", liquidator_user="0xa2863cad9c318669660eb4eca8b3154b90fb4357", - debt_token_address="0x697256caa3ccafd62bb6d3aa1c7c5671786a5fd9", + debt_token_address="0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", debt_purchase_amount=14857434973806369550, received_amount=1547215810826, received_token_address="0x44fbebd2f576670a6c33f6fc0b00aa8c5753b322", @@ -142,4 +145,7 @@ def test_cream_token_liquidation(trace_classifier: TraceClassifier): result = get_liquidations(classified_traces) for liquidation in liquidations: - assert liquidation in result + try: + assert liquidation in result + except: + import pdb; pdb.set_trace() From 98a38eee4769428c14cd3e981cdffcdd443741ed Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Tue, 18 Jan 2022 13:38:22 -0500 Subject: [PATCH 07/20] Change crUSDC to LINK --- tests/test_compound.py | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/tests/test_compound.py b/tests/test_compound.py index b4c2e1f..6d2fa8d 100644 --- a/tests/test_compound.py +++ b/tests/test_compound.py @@ -114,10 +114,8 @@ def test_c_token_liquidation(trace_classifier: TraceClassifier): result = get_liquidations(classified_traces) for liquidation in liquidations: - try: - assert liquidation in result - except: - import pdb; pdb.set_trace() + assert liquidation in result + def test_cream_token_liquidation(trace_classifier: TraceClassifier): @@ -130,7 +128,7 @@ def test_cream_token_liquidation(trace_classifier: TraceClassifier): Liquidation( liquidated_user="0x46bf9479dc569bc796b7050344845f6564d45fba", liquidator_user="0xa2863cad9c318669660eb4eca8b3154b90fb4357", - debt_token_address="0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + debt_token_address="0x514910771af9ca656af840dff83e8264ecf986ca", debt_purchase_amount=14857434973806369550, received_amount=1547215810826, received_token_address="0x44fbebd2f576670a6c33f6fc0b00aa8c5753b322", @@ -145,7 +143,4 @@ def test_cream_token_liquidation(trace_classifier: TraceClassifier): result = get_liquidations(classified_traces) for liquidation in liquidations: - try: - assert liquidation in result - except: - import pdb; pdb.set_trace() + assert liquidation in result From af22d4765d8b0b9c33b60c46f210ae5fc09e0162 Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Tue, 18 Jan 2022 13:40:26 -0500 Subject: [PATCH 08/20] Fix debt token in tests to underlyinh --- tests/test_compound.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/test_compound.py b/tests/test_compound.py index 6d2fa8d..933db08 100644 --- a/tests/test_compound.py +++ b/tests/test_compound.py @@ -99,7 +99,7 @@ def test_c_token_liquidation(trace_classifier: TraceClassifier): Liquidation( liquidated_user="0xacdd5528c1c92b57045041b5278efa06cdade4d8", liquidator_user="0xe0090ec6895c087a393f0e45f1f85098a6c33bef", - debt_token_address="0x39aa39c021dfbae8fac545936693ac917d5e7563", + debt_token_address="0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", debt_purchase_amount=1207055531, received_amount=21459623305, received_token_address="0x70e36f6bf80a52b3b46b3af8e106cc0ed743e8e4", @@ -114,8 +114,10 @@ def test_c_token_liquidation(trace_classifier: TraceClassifier): result = get_liquidations(classified_traces) for liquidation in liquidations: - assert liquidation in result - + try: + assert liquidation in result + except: + import pdb; pdb.set_trace() def test_cream_token_liquidation(trace_classifier: TraceClassifier): From 172ed46b0b630d7e70a5fc75520489a4d080c4c0 Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Tue, 18 Jan 2022 13:43:37 -0500 Subject: [PATCH 09/20] Remoeve debugger --- tests/test_compound.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/test_compound.py b/tests/test_compound.py index 933db08..8c25735 100644 --- a/tests/test_compound.py +++ b/tests/test_compound.py @@ -114,10 +114,7 @@ def test_c_token_liquidation(trace_classifier: TraceClassifier): result = get_liquidations(classified_traces) for liquidation in liquidations: - try: - assert liquidation in result - except: - import pdb; pdb.set_trace() + assert liquidation in result def test_cream_token_liquidation(trace_classifier: TraceClassifier): From f31e2525dab6e25f279435a68cc38d2c500cc39e Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Tue, 18 Jan 2022 14:27:59 -0500 Subject: [PATCH 10/20] Remove old inspectors and add none return for 0 received --- mev_inspect/aave_liquidations.py | 107 ---------------------- mev_inspect/classifiers/specs/compound.py | 18 ++-- mev_inspect/compound_liquidations.py | 80 ---------------- 3 files changed, 10 insertions(+), 195 deletions(-) delete mode 100644 mev_inspect/aave_liquidations.py delete mode 100644 mev_inspect/compound_liquidations.py diff --git a/mev_inspect/aave_liquidations.py b/mev_inspect/aave_liquidations.py deleted file mode 100644 index f72eca0..0000000 --- a/mev_inspect/aave_liquidations.py +++ /dev/null @@ -1,107 +0,0 @@ -from typing import List, Optional, Tuple - -from mev_inspect.schemas.liquidations import Liquidation -from mev_inspect.schemas.traces import ( - Classification, - ClassifiedTrace, - DecodedCallTrace, - Protocol, -) -from mev_inspect.schemas.transfers import Transfer -from mev_inspect.traces import get_child_traces, is_child_of_any_address -from mev_inspect.transfers import get_transfer - - -def get_aave_liquidations( - traces: List[ClassifiedTrace], -) -> List[Liquidation]: - - """Inspect list of classified traces and identify liquidation""" - liquidations: List[Liquidation] = [] - parent_liquidations: List[List[int]] = [] - - for trace in traces: - - if ( - trace.classification == Classification.liquidate - and isinstance(trace, DecodedCallTrace) - and not is_child_of_any_address(trace, parent_liquidations) - and trace.protocol == Protocol.aave - ): - - parent_liquidations.append(trace.trace_address) - liquidator = trace.from_address - - child_traces = get_child_traces( - trace.transaction_hash, trace.trace_address, traces - ) - (debt_token_address, debt_purchase_amount) = _get_debt_data( - trace, child_traces, liquidator - ) - - if debt_purchase_amount == 0: - continue - - (received_token_address, received_amount) = _get_received_data( - trace, child_traces, liquidator - ) - - if received_amount == 0: - continue - - liquidations.append( - Liquidation( - liquidated_user=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=trace.transaction_hash, - trace_address=trace.trace_address, - block_number=trace.block_number, - error=trace.error, - ) - ) - - return liquidations - - -def _get_received_data( - liquidation_trace: DecodedCallTrace, - child_traces: List[ClassifiedTrace], - liquidator: str, -) -> Tuple[str, int]: - - """Look for and return liquidator payback from liquidation""" - for child in child_traces: - - child_transfer: Optional[Transfer] = get_transfer(child) - - if child_transfer is not None and child_transfer.to_address == liquidator: - return child_transfer.token_address, child_transfer.amount - - return liquidation_trace.inputs["_collateral"], 0 - - -def _get_debt_data( - liquidation_trace: DecodedCallTrace, - child_traces: List[ClassifiedTrace], - liquidator: str, -) -> Tuple[str, int]: - """Get transfer from liquidator to AAVE""" - - for child in child_traces: - - child_transfer: Optional[Transfer] = get_transfer(child) - - if child_transfer is not None: - - if child_transfer.from_address == liquidator: - return child_transfer.token_address, child_transfer.amount - - return ( - liquidation_trace.inputs["_reserve"], - 0, - ) diff --git a/mev_inspect/classifiers/specs/compound.py b/mev_inspect/classifiers/specs/compound.py index 2a2a896..76271ac 100644 --- a/mev_inspect/classifiers/specs/compound.py +++ b/mev_inspect/classifiers/specs/compound.py @@ -28,13 +28,9 @@ class CompoundLiquidationClassifier(LiquidationClassifier): received_token_address = liquidation_trace.inputs["cTokenCollateral"] received_amount = 0 - debt_transfer = _get_debt_transfer( - liquidator, child_transfers - ) + debt_transfer = _get_debt_transfer(liquidator, child_transfers) - received_transfer = _get_received_transfer( - liquidator, child_transfers - ) + received_transfer = _get_received_transfer(liquidator, child_transfers) seize_trace = _get_seize_call(child_traces) @@ -47,7 +43,10 @@ class CompoundLiquidationClassifier(LiquidationClassifier): received_amount = received_transfer.amount elif seize_trace is not None and seize_trace.inputs is not None: - received_amount = seize_trace.inputs['seizeTokens'] + received_amount = seize_trace.inputs["seizeTokens"] + + if received_amount == 0: + return None return Liquidation( liquidated_user=liquidated, @@ -231,6 +230,7 @@ def _get_seize_call(traces: List[ClassifiedTrace]) -> Optional[ClassifiedTrace]: return trace return None + def _get_received_transfer( liquidator: str, child_transfers: List[Transfer] ) -> Optional[Transfer]: @@ -241,7 +241,9 @@ def _get_received_transfer( return None -def _get_debt_transfer(liquidator: str, child_transfers: List[Transfer]) -> Optional[Transfer]: +def _get_debt_transfer( + liquidator: str, child_transfers: List[Transfer] +) -> Optional[Transfer]: """Get transfer from liquidator to compound""" for transfer in child_transfers: if transfer.from_address == liquidator: diff --git a/mev_inspect/compound_liquidations.py b/mev_inspect/compound_liquidations.py deleted file mode 100644 index b7fe667..0000000 --- a/mev_inspect/compound_liquidations.py +++ /dev/null @@ -1,80 +0,0 @@ -from typing import List, Optional - -from mev_inspect.schemas.liquidations import Liquidation -from mev_inspect.schemas.traces import Classification, ClassifiedTrace, Protocol -from mev_inspect.traces import get_child_traces - -V2_COMPTROLLER_ADDRESS = "0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B" -V2_C_ETHER = "0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5" -CREAM_COMPTROLLER_ADDRESS = "0x3d5BC3c8d13dcB8bF317092d84783c2697AE9258" -CREAM_CR_ETHER = "0xD06527D5e56A3495252A528C4987003b712860eE" - - -def get_compound_liquidations( - traces: List[ClassifiedTrace], -) -> List[Liquidation]: - - """Inspect list of classified traces and identify liquidation""" - liquidations: List[Liquidation] = [] - - for trace in traces: - if ( - trace.classification == Classification.liquidate - and ( - trace.protocol == Protocol.compound_v2 - or trace.protocol == Protocol.cream - ) - and trace.inputs is not None - and trace.to_address is not None - ): - # First, we look for cEther liquidations (position paid back via tx.value) - child_traces = get_child_traces( - trace.transaction_hash, trace.trace_address, traces - ) - seize_trace = _get_seize_call(child_traces) - - if seize_trace is not None and seize_trace.inputs is not None: - c_token_collateral = trace.inputs["cTokenCollateral"] - if trace.abi_name == "CEther": - liquidations.append( - Liquidation( - liquidated_user=trace.inputs["borrower"], - debt_token_address=trace.to_address, - liquidator_user=seize_trace.inputs["liquidator"], - debt_purchase_amount=trace.value, - protocol=trace.protocol, - received_amount=seize_trace.inputs["seizeTokens"], - received_token_address=c_token_collateral, - transaction_hash=trace.transaction_hash, - trace_address=trace.trace_address, - block_number=trace.block_number, - error=trace.error, - ) - ) - elif ( - trace.abi_name == "CToken" - ): # cToken liquidations where liquidator pays back via token transfer - liquidations.append( - Liquidation( - liquidated_user=trace.inputs["borrower"], - debt_token_address=trace.to_address, - liquidator_user=seize_trace.inputs["liquidator"], - debt_purchase_amount=trace.inputs["repayAmount"], - protocol=trace.protocol, - received_amount=seize_trace.inputs["seizeTokens"], - received_token_address=c_token_collateral, - transaction_hash=trace.transaction_hash, - trace_address=trace.trace_address, - block_number=trace.block_number, - error=trace.error, - ) - ) - return liquidations - - -def _get_seize_call(traces: List[ClassifiedTrace]) -> Optional[ClassifiedTrace]: - """Find the call to `seize` in the child traces (successful liquidation)""" - for trace in traces: - if trace.classification == Classification.seize: - return trace - return None From 772a08d8d6439500318a342602398fb856f09e56 Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Tue, 18 Jan 2022 14:32:14 -0500 Subject: [PATCH 11/20] Remove terminal saved output --- tests/blocks/Terminal Saved Output | 676 ----------------------------- 1 file changed, 676 deletions(-) delete mode 100644 tests/blocks/Terminal Saved Output diff --git a/tests/blocks/Terminal Saved Output b/tests/blocks/Terminal Saved Output deleted file mode 100644 index e66d5a6..0000000 --- a/tests/blocks/Terminal Saved Output +++ /dev/null @@ -1,676 +0,0 @@ -(base) gheise@mac mev-inspect-py % git branch - 0x-bug - 0x-v2 - aave-liquidations-v3 - aave-zero-bug - add-liquidation-addresses - add-liquidation-timestamp - classifier-helpers - coingecko-api - compound-tokens - compound-v2 -* compound-v3 - double-arb-bug - geth - main - migrations-fix - swapmodel - token-decimals -(base) gheise@mac mev-inspect-py % git checkout main -M mev_inspect/classifiers/specs/compound.py -Switched to branch 'main' -Your branch is up to date with 'origin/main'. -(base) gheise@mac mev-inspect-py % git branch -D compound-v3 -Deleted branch compound-v3 (was 9604e01). -(base) gheise@mac mev-inspect-py % git checkout -b liquidation-classifiers -Switched to a new branch 'liquidation-classifiers' -(base) gheise@mac mev-inspect-py % git status -On branch liquidation-classifiers -Changes not staged for commit: - (use "git add ..." to update what will be committed) - (use "git restore ..." to discard changes in working directory) - modified: mev_inspect/classifiers/specs/aave.py - modified: mev_inspect/classifiers/specs/compound.py - modified: mev_inspect/inspect_block.py - modified: mev_inspect/liquidations.py - modified: mev_inspect/schemas/classifiers.py - -Untracked files: - (use "git add ..." to include in what will be committed) - .hypothesis/ - = - -no changes added to commit (use "git add" and/or "git commit -a") -(base) gheise@mac mev-inspect-py % git add mev_inspect -(base) gheise@mac mev-inspect-py % ./mev test -Running tests -Skipping virtualenv creation, as specified in config file. -ImportError while loading conftest '/app/tests/conftest.py'. -tests/conftest.py:6: in - from mev_inspect.classifiers.trace import TraceClassifier -mev_inspect/classifiers/trace.py:15: in - from .specs import ALL_CLASSIFIER_SPECS -mev_inspect/classifiers/specs/__init__.py:3: in - from mev_inspect.schemas.classifiers import Classifier, ClassifierSpec -mev_inspect/schemas/classifiers.py:45: in - class LiquidationClassifier(Classifier): -mev_inspect/schemas/classifiers.py:55: in LiquidationClassifier - ) -> Optional[Liquidation]: -E NameError: name 'Liquidation' is not defined -command terminated with exit code 4 -(base) gheise@mac mev-inspect-py % git add mev_inspect -(base) gheise@mac mev-inspect-py % ./mev test -Running tests -Skipping virtualenv creation, as specified in config file. -ImportError while loading conftest '/app/tests/conftest.py'. -tests/conftest.py:6: in - from mev_inspect.classifiers.trace import TraceClassifier -mev_inspect/classifiers/trace.py:15: in - from .specs import ALL_CLASSIFIER_SPECS -mev_inspect/classifiers/specs/__init__.py:6: in - from .aave import AAVE_CLASSIFIER_SPECS -E File "/app/mev_inspect/classifiers/specs/aave.py", line 17 -E """Inspect list of classified traces and identify liquidation""" -E ^ -E IndentationError: expected an indented block -command terminated with exit code 4 -(base) gheise@mac mev-inspect-py % git add mev_inspect -(base) gheise@mac mev-inspect-py % ./mev test -Running tests -Skipping virtualenv creation, as specified in config file. -ImportError while loading conftest '/app/tests/conftest.py'. -tests/conftest.py:6: in - from mev_inspect.classifiers.trace import TraceClassifier -mev_inspect/classifiers/trace.py:15: in - from .specs import ALL_CLASSIFIER_SPECS -mev_inspect/classifiers/specs/__init__.py:6: in - from .aave import AAVE_CLASSIFIER_SPECS -E File "/app/mev_inspect/classifiers/specs/aave.py", line 47 -E ) -E ^ -E SyntaxError: unmatched ')' -command terminated with exit code 4 -(base) gheise@mac mev-inspect-py % ./mev test -Running tests -Skipping virtualenv creation, as specified in config file. -ImportError while loading conftest '/app/tests/conftest.py'. -tests/conftest.py:6: in - from mev_inspect.classifiers.trace import TraceClassifier -mev_inspect/classifiers/trace.py:15: in - from .specs import ALL_CLASSIFIER_SPECS -mev_inspect/classifiers/specs/__init__.py:6: in - from .aave import AAVE_CLASSIFIER_SPECS -E File "/app/mev_inspect/classifiers/specs/aave.py", line 26 -E continue -E ^ -E SyntaxError: 'continue' not properly in loop -command terminated with exit code 4 -(base) gheise@mac mev-inspect-py % git add mev_inspect -(base) gheise@mac mev-inspect-py % ./mev test -Running tests -Skipping virtualenv creation, as specified in config file. -ImportError while loading conftest '/app/tests/conftest.py'. -tests/conftest.py:6: in - from mev_inspect.classifiers.trace import TraceClassifier -mev_inspect/classifiers/trace.py:15: in - from .specs import ALL_CLASSIFIER_SPECS -mev_inspect/classifiers/specs/__init__.py:6: in - from .aave import AAVE_CLASSIFIER_SPECS -mev_inspect/classifiers/specs/aave.py:10: in - class AaveLiquidationClassifier(LiquidationClassifier): -mev_inspect/classifiers/specs/aave.py:14: in AaveLiquidationClassifier - child_traces: List[Trace] -E NameError: name 'List' is not defined -command terminated with exit code 4 -(base) gheise@mac mev-inspect-py % git add mev_inspect -(base) gheise@mac mev-inspect-py % ./mev test -Running tests -Skipping virtualenv creation, as specified in config file. -ImportError while loading conftest '/app/tests/conftest.py'. -tests/conftest.py:6: in - from mev_inspect.classifiers.trace import TraceClassifier -mev_inspect/classifiers/trace.py:15: in - from .specs import ALL_CLASSIFIER_SPECS -mev_inspect/classifiers/specs/__init__.py:6: in - from .aave import AAVE_CLASSIFIER_SPECS -mev_inspect/classifiers/specs/aave.py:11: in - class AaveLiquidationClassifier(LiquidationClassifier): -mev_inspect/classifiers/specs/aave.py:15: in AaveLiquidationClassifier - child_traces: List[Trace] -E NameError: name 'Trace' is not defined -command terminated with exit code 4 -(base) gheise@mac mev-inspect-py % git add mev_inspect -(base) gheise@mac mev-inspect-py % ./mev test -Running tests -Skipping virtualenv creation, as specified in config file. -ImportError while loading conftest '/app/tests/conftest.py'. -tests/conftest.py:6: in - from mev_inspect.classifiers.trace import TraceClassifier -mev_inspect/classifiers/trace.py:15: in - from .specs import ALL_CLASSIFIER_SPECS -mev_inspect/classifiers/specs/__init__.py:6: in - from .aave import AAVE_CLASSIFIER_SPECS -mev_inspect/classifiers/specs/aave.py:12: in - class AaveLiquidationClassifier(LiquidationClassifier): -mev_inspect/classifiers/specs/aave.py:17: in AaveLiquidationClassifier - ) -> Optional[Liquidation]: -E NameError: name 'Liquidation' is not defined -command terminated with exit code 4 -(base) gheise@mac mev-inspect-py % git add mev_inspect -(base) gheise@mac mev-inspect-py % ./mev test -Running tests -Skipping virtualenv creation, as specified in config file. -ImportError while loading conftest '/app/tests/conftest.py'. -tests/conftest.py:6: in - from mev_inspect.classifiers.trace import TraceClassifier -mev_inspect/classifiers/trace.py:15: in - from .specs import ALL_CLASSIFIER_SPECS -mev_inspect/classifiers/specs/__init__.py:6: in - from .aave import AAVE_CLASSIFIER_SPECS -mev_inspect/classifiers/specs/aave.py:13: in - class AaveLiquidationClassifier(LiquidationClassifier): -mev_inspect/classifiers/specs/aave.py:55: in AaveLiquidationClassifier - ) -> Tuple[str, int]: -E NameError: name 'Tuple' is not defined -command terminated with exit code 4 -(base) gheise@mac mev-inspect-py % git add mev_inspect -(base) gheise@mac mev-inspect-py % ./mev test -Running tests -Skipping virtualenv creation, as specified in config file. -ImportError while loading conftest '/app/tests/conftest.py'. -tests/conftest.py:6: in - from mev_inspect.classifiers.trace import TraceClassifier -mev_inspect/classifiers/trace.py:15: in - from .specs import ALL_CLASSIFIER_SPECS -mev_inspect/classifiers/specs/__init__.py:9: in - from .compound import COMPOUND_CLASSIFIER_SPECS -E File "/app/mev_inspect/classifiers/specs/compound.py", line 5 -E LiquidationClassifier, -E ^ -E SyntaxError: invalid syntax -command terminated with exit code 4 -(base) gheise@mac mev-inspect-py % git add mev_inspect -(base) gheise@mac mev-inspect-py % git add mev_inspect -(base) gheise@mac mev-inspect-py % ./mev test -Running tests -Skipping virtualenv creation, as specified in config file. -ImportError while loading conftest '/app/tests/conftest.py'. -tests/conftest.py:6: in - from mev_inspect.classifiers.trace import TraceClassifier -mev_inspect/classifiers/trace.py:15: in - from .specs import ALL_CLASSIFIER_SPECS -mev_inspect/classifiers/specs/__init__.py:9: in - from .compound import COMPOUND_CLASSIFIER_SPECS -E File "/app/mev_inspect/classifiers/specs/compound.py", line 50 -E ) -E IndentationError: unexpected indent -command terminated with exit code 4 -(base) gheise@mac mev-inspect-py % git add mev_inspect -(base) gheise@mac mev-inspect-py % ./mev test -Running tests -Skipping virtualenv creation, as specified in config file. -ImportError while loading conftest '/app/tests/conftest.py'. -tests/conftest.py:6: in - from mev_inspect.classifiers.trace import TraceClassifier -mev_inspect/classifiers/trace.py:15: in - from .specs import ALL_CLASSIFIER_SPECS -mev_inspect/classifiers/specs/__init__.py:9: in - from .compound import COMPOUND_CLASSIFIER_SPECS -E File "/app/mev_inspect/classifiers/specs/compound.py", line 52 -E """Find the call to `seize` in the child traces (successful liquidation)""" -E ^ -E IndentationError: expected an indented block -command terminated with exit code 4 -(base) gheise@mac mev-inspect-py % poetry run pre-commit -The currently activated Python version 3.8.5 is not supported by the project (^3.9). -Trying to find and use a compatible version. -Using python3.9 (3.9.9) -black....................................................................Failed -- hook id: black -- exit code: 123 -- files were modified by this hook - -error: cannot format /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py: Cannot parse: 28:50: if not isinstance(trace, DecodedCallTrace) -error: cannot format /Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/compound.py: Cannot parse: 52:4: """Find the call to `seize` in the child traces (successful liquidation)""" -reformatted /Users/gheise/mev-inspect-py/mev_inspect/schemas/classifiers.py -reformatted /Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/aave.py -Oh no! 💥 💔 💥 -2 files reformatted, 1 file left unchanged, 2 files failed to reformat. - -isort....................................................................Failed -- hook id: isort -- files were modified by this hook - -/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/api.py:475: UserWarning: /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py unable to sort due to existing syntax errors - warn(f"{actual_file_path} unable to sort due to existing syntax errors") -/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/main.py:103: UserWarning: Unable to parse file ./mev_inspect/schemas/classifiers.py due to [Errno 2] No such file or directory: '/Users/gheise/mev-inspect-py/mev_inspect/schemas/classifiers.py.isorted' -> '/Users/gheise/mev-inspect-py/mev_inspect/schemas/classifiers.py' - warn(f"Unable to parse file {file_name} due to {error}") -/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/main.py:103: UserWarning: Unable to parse file ./mev_inspect/crud/prices.py due to [Errno 2] No such file or directory: '/Users/gheise/mev-inspect-py/mev_inspect/crud/prices.py.isorted' - warn(f"Unable to parse file {file_name} due to {error}") -/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/main.py:103: UserWarning: Unable to parse file ./mev_inspect/classifiers/specs/aave.py due to [Errno 2] No such file or directory: '/Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/aave.py.isorted' -> '/Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/aave.py' - warn(f"Unable to parse file {file_name} due to {error}") -/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/api.py:475: UserWarning: /Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/compound.py unable to sort due to existing syntax errors - warn(f"{actual_file_path} unable to sort due to existing syntax errors") -Skipped 2 files -/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/api.py:475: UserWarning: /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py unable to sort due to existing syntax errors - warn(f"{actual_file_path} unable to sort due to existing syntax errors") -Fixing /Users/gheise/mev-inspect-py/mev_inspect/schemas/classifiers.py -Fixing /Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/aave.py -/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/api.py:475: UserWarning: /Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/compound.py unable to sort due to existing syntax errors - warn(f"{actual_file_path} unable to sort due to existing syntax errors") -Skipped 2 files - -pylint...................................................................Failed -- hook id: pylint -- exit code: 2 - -************* Module mev_inspect.classifiers.specs.aave -mev_inspect/classifiers/specs/aave.py:25:53: E0602: Undefined variable 'self' (undefined-variable) -mev_inspect/classifiers/specs/aave.py:32:52: E0602: Undefined variable 'self' (undefined-variable) -mev_inspect/classifiers/specs/aave.py:62:49: E0602: Undefined variable 'get_transfer' (undefined-variable) -mev_inspect/classifiers/specs/aave.py:78:49: E0602: Undefined variable 'get_transfer' (undefined-variable) -************* Module mev_inspect.inspect_block -mev_inspect/inspect_block.py:36:0: E0611: No name 'liquidations' in module 'mev_inspect' (no-name-in-module) - ------------------------------------ -Your code has been rated at 8.32/10 - - --------------------------------------------------------------------- -Your code has been rated at 10.00/10 (previous run: 10.00/10, +0.00) - -mypy.....................................................................Failed -- hook id: mypy -- exit code: 2 - -mev_inspect/classifiers/specs/compound.py:52: error: expected an indented block -Found 1 error in 1 file (errors prevented further checking) - -(base) gheise@mac mev-inspect-py % git add mev_inspect -(base) gheise@mac mev-inspect-py % poetry run pre-commit -The currently activated Python version 3.8.5 is not supported by the project (^3.9). -Trying to find and use a compatible version. -Using python3.9 (3.9.9) -black....................................................................Failed -- hook id: black -- exit code: 123 - -error: cannot format /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py: Cannot parse: 28:50: if not isinstance(trace, DecodedCallTrace) -error: cannot format /Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/compound.py: Cannot parse: 52:4: """Find the call to `seize` in the child traces (successful liquidation)""" -Oh no! 💥 💔 💥 -3 files left unchanged, 2 files failed to reformat. - -isort....................................................................Passed -pylint...................................................................Failed -- hook id: pylint -- exit code: 2 - -************* Module mev_inspect.classifiers.specs.aave -mev_inspect/classifiers/specs/aave.py:25:53: E0602: Undefined variable 'self' (undefined-variable) -mev_inspect/classifiers/specs/aave.py:32:52: E0602: Undefined variable 'self' (undefined-variable) -mev_inspect/classifiers/specs/aave.py:62:49: E0602: Undefined variable 'get_transfer' (undefined-variable) -mev_inspect/classifiers/specs/aave.py:78:49: E0602: Undefined variable 'get_transfer' (undefined-variable) -************* Module mev_inspect.inspect_block -mev_inspect/inspect_block.py:36:0: E0611: No name 'liquidations' in module 'mev_inspect' (no-name-in-module) - ------------------------------------------------------------------- -Your code has been rated at 8.32/10 (previous run: 8.32/10, +0.00) - - --------------------------------------------------------------------- -Your code has been rated at 10.00/10 (previous run: 10.00/10, +0.00) - -mypy.....................................................................Failed -- hook id: mypy -- exit code: 2 - -mev_inspect/classifiers/specs/compound.py:52: error: expected an indented block -Found 1 error in 1 file (errors prevented further checking) - -(base) gheise@mac mev-inspect-py % git add mev_inspect -(base) gheise@mac mev-inspect-py % poetry run pre-commit -The currently activated Python version 3.8.5 is not supported by the project (^3.9). -Trying to find and use a compatible version. -Using python3.9 (3.9.9) -black....................................................................Failed -- hook id: black -- exit code: 123 - -error: cannot format /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py: Cannot parse: 62:60: if trace.transaction_hash == parent.transaction_hash -error: cannot format /Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/compound.py: Cannot parse: 77:38: seize_trace: DecodedCallTrace,, -Oh no! 💥 💔 💥 -3 files left unchanged, 2 files failed to reformat. - -isort....................................................................Passed -pylint...................................................................Failed -- hook id: pylint -- exit code: 2 - -************* Module mev_inspect.classifiers.specs.aave -mev_inspect/classifiers/specs/aave.py:25:53: E0602: Undefined variable 'self' (undefined-variable) -mev_inspect/classifiers/specs/aave.py:32:52: E0602: Undefined variable 'self' (undefined-variable) -mev_inspect/classifiers/specs/aave.py:62:49: E0602: Undefined variable 'get_transfer' (undefined-variable) -mev_inspect/classifiers/specs/aave.py:78:49: E0602: Undefined variable 'get_transfer' (undefined-variable) -************* Module mev_inspect.inspect_block -mev_inspect/inspect_block.py:36:0: E0611: No name 'liquidations' in module 'mev_inspect' (no-name-in-module) - ------------------------------------------------------------------- -Your code has been rated at 8.32/10 (previous run: 8.32/10, +0.00) - - --------------------------------------------------------------------- -Your code has been rated at 10.00/10 (previous run: 10.00/10, +0.00) - -mypy.....................................................................Failed -- hook id: mypy -- exit code: 2 - -mev_inspect/classifiers/specs/compound.py:77: error: invalid syntax -Found 1 error in 1 file (errors prevented further checking) - -(base) gheise@mac mev-inspect-py % git add mev_inspect -(base) gheise@mac mev-inspect-py % poetry run pre-commit -The currently activated Python version 3.8.5 is not supported by the project (^3.9). -Trying to find and use a compatible version. -Using python3.9 (3.9.9) -black....................................................................Failed -- hook id: black -- exit code: 123 -- files were modified by this hook - -error: cannot format /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py: Cannot parse: 62:60: if trace.transaction_hash == parent.transaction_hash -reformatted /Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/compound.py -Oh no! 💥 💔 💥 -1 file reformatted, 3 files left unchanged, 1 file failed to reformat. - -isort....................................................................Failed -- hook id: isort -- files were modified by this hook - -/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/api.py:475: UserWarning: /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py unable to sort due to existing syntax errors - warn(f"{actual_file_path} unable to sort due to existing syntax errors") -/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/main.py:103: UserWarning: Unable to parse file ./mev_inspect/classifiers/specs/compound.py due to [Errno 2] No such file or directory: '/Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/compound.py.isorted' -> '/Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/compound.py' - warn(f"Unable to parse file {file_name} due to {error}") -Skipped 2 files -/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/api.py:475: UserWarning: /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py unable to sort due to existing syntax errors - warn(f"{actual_file_path} unable to sort due to existing syntax errors") -Fixing /Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/compound.py -Skipped 2 files - -pylint...................................................................Failed -- hook id: pylint -- exit code: 6 - -************* Module mev_inspect.classifiers.specs.compound -mev_inspect/classifiers/specs/compound.py:16:27: E0602: Undefined variable 'DecodedCallTrace' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:19:22: E0602: Undefined variable 'self' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:25:57: E0602: Undefined variable '_get_debt_data' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:32:56: E0602: Undefined variable '_get_received_data' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:56:39: E0602: Undefined variable 'Classification' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:61:21: E0602: Undefined variable 'DecodedCallTrace' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:62:27: E0602: Undefined variable 'DecodeCallTrace' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:70:37: E0602: Undefined variable 'Transfer' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:70:49: E0602: Undefined variable 'get_transfer' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:62:8: W0613: Unused argument 'liquidation_trace' (unused-argument) -mev_inspect/classifiers/specs/compound.py:78:21: E0602: Undefined variable 'DecodedCallTrace' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:79:27: E0602: Undefined variable 'DecodeCallTrace' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:87:37: E0602: Undefined variable 'Transfer' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:87:49: E0602: Undefined variable 'get_transfer' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:79:8: W0613: Unused argument 'liquidation_trace' (unused-argument) -************* Module mev_inspect.classifiers.specs.aave -mev_inspect/classifiers/specs/aave.py:25:53: E0602: Undefined variable 'self' (undefined-variable) -mev_inspect/classifiers/specs/aave.py:32:52: E0602: Undefined variable 'self' (undefined-variable) -mev_inspect/classifiers/specs/aave.py:62:49: E0602: Undefined variable 'get_transfer' (undefined-variable) -mev_inspect/classifiers/specs/aave.py:78:49: E0602: Undefined variable 'get_transfer' (undefined-variable) -************* Module mev_inspect.inspect_block -mev_inspect/inspect_block.py:36:0: E0611: No name 'liquidations' in module 'mev_inspect' (no-name-in-module) - ------------------------------------------------------------------- -Your code has been rated at 5.11/10 (previous run: 8.32/10, -3.22) - - --------------------------------------------------------------------- -Your code has been rated at 10.00/10 (previous run: 10.00/10, +0.00) - -mypy.....................................................................Failed -- hook id: mypy -- exit code: 2 - -mev_inspect/liquidations.py:62: error: invalid syntax -Found 1 error in 1 file (errors prevented further checking) - -(base) gheise@mac mev-inspect-py % git add mev_inspect -(base) gheise@mac mev-inspect-py % poetry run pre-commit -The currently activated Python version 3.8.5 is not supported by the project (^3.9). -Trying to find and use a compatible version. -Using python3.9 (3.9.9) -black....................................................................Failed -- hook id: black -- exit code: 123 - -error: cannot format /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py: Cannot parse: 62:60: if trace.transaction_hash == parent.transaction_hash -Oh no! 💥 💔 💥 -4 files left unchanged, 1 file failed to reformat. - -isort....................................................................Passed -pylint...................................................................Failed -- hook id: pylint -- exit code: 6 - -************* Module mev_inspect.classifiers.specs.compound -mev_inspect/classifiers/specs/compound.py:16:27: E0602: Undefined variable 'DecodedCallTrace' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:19:22: E0602: Undefined variable 'self' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:25:57: E0602: Undefined variable '_get_debt_data' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:32:56: E0602: Undefined variable '_get_received_data' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:56:39: E0602: Undefined variable 'Classification' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:61:21: E0602: Undefined variable 'DecodedCallTrace' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:62:27: E0602: Undefined variable 'DecodeCallTrace' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:70:37: E0602: Undefined variable 'Transfer' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:70:49: E0602: Undefined variable 'get_transfer' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:62:8: W0613: Unused argument 'liquidation_trace' (unused-argument) -mev_inspect/classifiers/specs/compound.py:78:21: E0602: Undefined variable 'DecodedCallTrace' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:79:27: E0602: Undefined variable 'DecodeCallTrace' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:87:37: E0602: Undefined variable 'Transfer' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:87:49: E0602: Undefined variable 'get_transfer' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:79:8: W0613: Unused argument 'liquidation_trace' (unused-argument) -************* Module mev_inspect.classifiers.specs.aave -mev_inspect/classifiers/specs/aave.py:25:53: E0602: Undefined variable 'self' (undefined-variable) -mev_inspect/classifiers/specs/aave.py:32:52: E0602: Undefined variable 'self' (undefined-variable) -mev_inspect/classifiers/specs/aave.py:62:49: E0602: Undefined variable 'get_transfer' (undefined-variable) -mev_inspect/classifiers/specs/aave.py:78:49: E0602: Undefined variable 'get_transfer' (undefined-variable) -************* Module mev_inspect.inspect_block -mev_inspect/inspect_block.py:36:0: E0611: No name 'liquidations' in module 'mev_inspect' (no-name-in-module) - ------------------------------------------------------------------- -Your code has been rated at 5.11/10 (previous run: 5.11/10, +0.00) - - --------------------------------------------------------------------- -Your code has been rated at 10.00/10 (previous run: 10.00/10, +0.00) - -mypy.....................................................................Failed -- hook id: mypy -- exit code: 2 - -mev_inspect/liquidations.py:62: error: invalid syntax -Found 1 error in 1 file (errors prevented further checking) - -(base) gheise@mac mev-inspect-py % git add mev_inspect -(base) gheise@mac mev-inspect-py % poetry run pre-commit -The currently activated Python version 3.8.5 is not supported by the project (^3.9). -Trying to find and use a compatible version. -Using python3.9 (3.9.9) -black....................................................................Failed -- hook id: black -- exit code: 123 - -error: cannot format /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py: Cannot parse: 62:60: if trace.transaction_hash == parent.transaction_hash -Oh no! 💥 💔 💥 -4 files left unchanged, 1 file failed to reformat. - -isort....................................................................Failed -- hook id: isort -- files were modified by this hook - -/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/api.py:475: UserWarning: /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py unable to sort due to existing syntax errors - warn(f"{actual_file_path} unable to sort due to existing syntax errors") -Fixing /Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/compound.py -/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/main.py:103: UserWarning: Unable to parse file ./alembic/versions/083978d6e455_create_miner_payments_table.py due to [Errno 2] No such file or directory: '/Users/gheise/mev-inspect-py/alembic/versions/083978d6e455_create_miner_payments_table.py.isorted' - warn(f"Unable to parse file {file_name} due to {error}") -Skipped 2 files -/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/api.py:475: UserWarning: /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py unable to sort due to existing syntax errors - warn(f"{actual_file_path} unable to sort due to existing syntax errors") -/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/main.py:103: UserWarning: Unable to parse file ./mev_inspect/classifiers/specs/compound.py due to [Errno 2] No such file or directory: '/Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/compound.py.isorted' -> '/Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/compound.py' - warn(f"Unable to parse file {file_name} due to {error}") -/Users/gheise/Library/Caches/pypoetry/virtualenvs/mev-inspect-uEL1ukhj-py3.9/lib/python3.9/site-packages/isort/main.py:103: UserWarning: Unable to parse file ./alembic/versions/9b8ae51c5d56_add_swap_arbitrage_join_table.py due to [Errno 2] No such file or directory: '/Users/gheise/mev-inspect-py/alembic/versions/9b8ae51c5d56_add_swap_arbitrage_join_table.py.isorted' - warn(f"Unable to parse file {file_name} due to {error}") -Skipped 2 files - -pylint...................................................................Failed -- hook id: pylint -- exit code: 6 - -************* Module mev_inspect.classifiers.specs.compound -mev_inspect/classifiers/specs/compound.py:3:0: E0611: No name 'DecodeCallTrace' in module 'mev_inspect.schemas.classifiers' (no-name-in-module) -mev_inspect/classifiers/specs/compound.py:17:27: E0602: Undefined variable 'DecodedCallTrace' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:20:22: E0602: Undefined variable 'self' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:26:57: E0602: Undefined variable '_get_debt_data' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:33:56: E0602: Undefined variable '_get_received_data' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:57:39: E0602: Undefined variable 'Classification' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:62:21: E0602: Undefined variable 'DecodedCallTrace' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:70:37: E0602: Undefined variable 'Transfer' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:70:49: E0602: Undefined variable 'get_transfer' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:78:21: E0602: Undefined variable 'DecodedCallTrace' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:86:37: E0602: Undefined variable 'Transfer' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:86:49: E0602: Undefined variable 'get_transfer' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:3:0: W0611: Unused DecodeCallTrace imported from mev_inspect.schemas.classifiers (unused-import) -************* Module mev_inspect.classifiers.specs.aave -mev_inspect/classifiers/specs/aave.py:25:53: E0602: Undefined variable 'self' (undefined-variable) -mev_inspect/classifiers/specs/aave.py:32:52: E0602: Undefined variable 'self' (undefined-variable) -mev_inspect/classifiers/specs/aave.py:62:49: E0602: Undefined variable 'get_transfer' (undefined-variable) -mev_inspect/classifiers/specs/aave.py:78:49: E0602: Undefined variable 'get_transfer' (undefined-variable) -************* Module mev_inspect.inspect_block -mev_inspect/inspect_block.py:36:0: E0611: No name 'liquidations' in module 'mev_inspect' (no-name-in-module) - ------------------------------------------------------------------- -Your code has been rated at 5.43/10 (previous run: 5.11/10, +0.32) - - --------------------------------------------------------------------- -Your code has been rated at 10.00/10 (previous run: 10.00/10, +0.00) - -mypy.....................................................................Failed -- hook id: mypy -- exit code: 2 - -mev_inspect/liquidations.py:62: error: invalid syntax -Found 1 error in 1 file (errors prevented further checking) - -(base) gheise@mac mev-inspect-py % git add mev_inspect -(base) gheise@mac mev-inspect-py % poetry run pre-commit -The currently activated Python version 3.8.5 is not supported by the project (^3.9). -Trying to find and use a compatible version. -Using python3.9 (3.9.9) -black....................................................................Failed -- hook id: black -- exit code: 123 -- files were modified by this hook - -error: cannot format /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py: Cannot parse: 62:60: if trace.transaction_hash == parent.transaction_hash -reformatted /Users/gheise/mev-inspect-py/mev_inspect/classifiers/specs/compound.py -Oh no! 💥 💔 💥 -1 file reformatted, 3 files left unchanged, 1 file failed to reformat. - -isort....................................................................Passed -pylint...................................................................Failed -- hook id: pylint -- exit code: 6 - -************* Module mev_inspect.classifiers.specs.compound -mev_inspect/classifiers/specs/compound.py:3:0: E0611: No name 'DecodeCallTrace' in module 'mev_inspect.schemas.classifiers' (no-name-in-module) -mev_inspect/classifiers/specs/compound.py:17:33: E0602: Undefined variable 'DecodedCallTrace' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:26:57: E0602: Undefined variable '_get_debt_data' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:33:56: E0602: Undefined variable '_get_received_data' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:59:39: E0602: Undefined variable 'Classification' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:65:21: E0602: Undefined variable 'DecodedCallTrace' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:73:37: E0602: Undefined variable 'Transfer' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:73:49: E0602: Undefined variable 'get_transfer' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:65:8: W0613: Unused argument 'seize_trace' (unused-argument) -mev_inspect/classifiers/specs/compound.py:82:21: E0602: Undefined variable 'DecodedCallTrace' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:90:37: E0602: Undefined variable 'Transfer' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:90:49: E0602: Undefined variable 'get_transfer' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:82:8: W0613: Unused argument 'seize_trace' (unused-argument) -mev_inspect/classifiers/specs/compound.py:3:0: W0611: Unused DecodeCallTrace imported from mev_inspect.schemas.classifiers (unused-import) -************* Module mev_inspect.classifiers.specs.aave -mev_inspect/classifiers/specs/aave.py:25:53: E0602: Undefined variable 'self' (undefined-variable) -mev_inspect/classifiers/specs/aave.py:32:52: E0602: Undefined variable 'self' (undefined-variable) -mev_inspect/classifiers/specs/aave.py:62:49: E0602: Undefined variable 'get_transfer' (undefined-variable) -mev_inspect/classifiers/specs/aave.py:78:49: E0602: Undefined variable 'get_transfer' (undefined-variable) -************* Module mev_inspect.inspect_block -mev_inspect/inspect_block.py:36:0: E0611: No name 'liquidations' in module 'mev_inspect' (no-name-in-module) - ------------------------------------------------------------------- -Your code has been rated at 5.59/10 (previous run: 5.43/10, +0.16) - - --------------------------------------------------------------------- -Your code has been rated at 10.00/10 (previous run: 10.00/10, +0.00) - -mypy.....................................................................Failed -- hook id: mypy -- exit code: 2 - -mev_inspect/liquidations.py:62: error: invalid syntax -Found 1 error in 1 file (errors prevented further checking) - -(base) gheise@mac mev-inspect-py % git add mev_inspect -(base) gheise@mac mev-inspect-py % poetry run pre-commit -The currently activated Python version 3.8.5 is not supported by the project (^3.9). -Trying to find and use a compatible version. -Using python3.9 (3.9.9) -black....................................................................Failed -- hook id: black -- exit code: 123 - -error: cannot format /Users/gheise/mev-inspect-py/mev_inspect/liquidations.py: Cannot parse: 62:60: if trace.transaction_hash == parent.transaction_hash -Oh no! 💥 💔 💥 -4 files left unchanged, 1 file failed to reformat. - -isort....................................................................Passed -pylint...................................................................Failed -- hook id: pylint -- exit code: 6 - -************* Module mev_inspect.classifiers.specs.compound -mev_inspect/classifiers/specs/compound.py:26:57: E0602: Undefined variable '_get_debt_data' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:33:56: E0602: Undefined variable '_get_received_data' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:59:39: E0602: Undefined variable 'Classification' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:73:37: E0602: Undefined variable 'Transfer' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:73:49: E0602: Undefined variable 'get_transfer' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:65:8: W0613: Unused argument 'seize_trace' (unused-argument) -mev_inspect/classifiers/specs/compound.py:90:37: E0602: Undefined variable 'Transfer' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:90:49: E0602: Undefined variable 'get_transfer' (undefined-variable) -mev_inspect/classifiers/specs/compound.py:82:8: W0613: Unused argument 'seize_trace' (unused-argument) -************* Module mev_inspect.classifiers.specs.aave -mev_inspect/classifiers/specs/aave.py:25:53: E0602: Undefined variable 'self' (undefined-variable) -mev_inspect/classifiers/specs/aave.py:32:52: E0602: Undefined variable 'self' (undefined-variable) -mev_inspect/classifiers/specs/aave.py:62:49: E0602: Undefined variable 'get_transfer' (undefined-variable) -mev_inspect/classifiers/specs/aave.py:78:49: E0602: Undefined variable 'get_transfer' (undefined-variable) -************* Module mev_inspect.inspect_block -mev_inspect/inspect_block.py:36:0: E0611: No name 'liquidations' in module 'mev_inspect' (no-name-in-module) - ------------------------------------------------------------------- -Your code has been rated at 6.70/10 (previous run: 5.59/10, +1.12) - - --------------------------------------------------------------------- -Your code has been rated at 10.00/10 (previous run: 10.00/10, +0.00) - -mypy.....................................................................Failed -- hook id: mypy -- exit code: 2 - -mev_inspect/liquidations.py:62: error: invalid syntax -Found 1 error in 1 file (errors prevented further checking) - -(base) gheise@mac mev-inspect-py % From b599dff24d0d003dc5a29a6c84ec5c3ec1d4c2bb Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Tue, 18 Jan 2022 14:39:27 -0500 Subject: [PATCH 12/20] replace value with repay input and init received to None --- mev_inspect/classifiers/specs/compound.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mev_inspect/classifiers/specs/compound.py b/mev_inspect/classifiers/specs/compound.py index 76271ac..33e9e05 100644 --- a/mev_inspect/classifiers/specs/compound.py +++ b/mev_inspect/classifiers/specs/compound.py @@ -24,9 +24,9 @@ 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.value + debt_purchase_amount = liquidation_trace.inputs["repayAmount"] received_token_address = liquidation_trace.inputs["cTokenCollateral"] - received_amount = 0 + received_amount = None debt_transfer = _get_debt_transfer(liquidator, child_transfers) @@ -45,7 +45,7 @@ class CompoundLiquidationClassifier(LiquidationClassifier): elif seize_trace is not None and seize_trace.inputs is not None: received_amount = seize_trace.inputs["seizeTokens"] - if received_amount == 0: + if received_amount is None: return None return Liquidation( From de4a682061cdf638490a0c9cfbb64696616bdb19 Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Tue, 18 Jan 2022 15:16:35 -0500 Subject: [PATCH 13/20] 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 From 72a9d6744a70d154f56043b58fe3006f26e75970 Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Tue, 18 Jan 2022 15:22:57 -0500 Subject: [PATCH 14/20] Share transfer helpers --- mev_inspect/classifiers/helpers.py | 24 ++++++++++++++++++++++ mev_inspect/classifiers/specs/aave.py | 25 +---------------------- mev_inspect/classifiers/specs/compound.py | 21 +------------------ 3 files changed, 26 insertions(+), 44 deletions(-) diff --git a/mev_inspect/classifiers/helpers.py b/mev_inspect/classifiers/helpers.py index ced108f..94abbdb 100644 --- a/mev_inspect/classifiers/helpers.py +++ b/mev_inspect/classifiers/helpers.py @@ -178,3 +178,27 @@ def _filter_transfers( filtered_transfers.append(transfer) return filtered_transfers + + +def _get_received_transfer( + liquidator: str, child_transfers: List[Transfer] +) -> Optional[Transfer]: + """Get transfer from AAVE to liquidator""" + + for transfer in child_transfers: + if transfer.to_address == liquidator: + return transfer + + return None + + +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 + + return None diff --git a/mev_inspect/classifiers/specs/aave.py b/mev_inspect/classifiers/specs/aave.py index e82388d..af6c7ff 100644 --- a/mev_inspect/classifiers/specs/aave.py +++ b/mev_inspect/classifiers/specs/aave.py @@ -1,5 +1,6 @@ from typing import List, Optional +from mev_inspect.classifiers.helpers import _get_debt_transfer, _get_received_transfer from mev_inspect.schemas.classifiers import ( ClassifiedTrace, ClassifierSpec, @@ -90,27 +91,3 @@ ATOKENS_SPEC = ClassifierSpec( ) AAVE_CLASSIFIER_SPECS: List[ClassifierSpec] = [AAVE_SPEC, ATOKENS_SPEC] - - -def _get_received_transfer( - liquidator: str, child_transfers: List[Transfer] -) -> Optional[Transfer]: - """Get transfer from AAVE to liquidator""" - - for transfer in child_transfers: - if transfer.to_address == liquidator: - return transfer - - return None - - -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 - - return None diff --git a/mev_inspect/classifiers/specs/compound.py b/mev_inspect/classifiers/specs/compound.py index 05c4d73..b9c23c6 100644 --- a/mev_inspect/classifiers/specs/compound.py +++ b/mev_inspect/classifiers/specs/compound.py @@ -1,5 +1,6 @@ from typing import List, Optional +from mev_inspect.classifiers.helpers import _get_debt_transfer, _get_received_transfer from mev_inspect.schemas.classifiers import ( Classification, ClassifiedTrace, @@ -238,23 +239,3 @@ def _get_seize_call(traces: List[ClassifiedTrace]) -> Optional[ClassifiedTrace]: if trace.classification == Classification.seize: return trace return None - - -def _get_received_transfer( - liquidator: str, child_transfers: List[Transfer] -) -> Optional[Transfer]: - """Get transfer from compound to liquidator""" - for transfer in child_transfers: - if transfer.to_address == liquidator: - return transfer - return None - - -def _get_debt_transfer( - liquidator: str, child_transfers: List[Transfer] -) -> Optional[Transfer]: - """Get transfer from liquidator to compound""" - for transfer in child_transfers: - if transfer.from_address == liquidator: - return transfer - return None From c6379977bad797ff8644f19d99bbac8179edab7a Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Tue, 18 Jan 2022 15:24:46 -0500 Subject: [PATCH 15/20] Simplify debt amount --- mev_inspect/classifiers/specs/compound.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mev_inspect/classifiers/specs/compound.py b/mev_inspect/classifiers/specs/compound.py index b9c23c6..f6bc19b 100644 --- a/mev_inspect/classifiers/specs/compound.py +++ b/mev_inspect/classifiers/specs/compound.py @@ -32,11 +32,11 @@ class CompoundLiquidationClassifier(LiquidationClassifier): 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_purchase_amount = ( + liquidation_trace.value + if debt_token_address == CETH_TOKEN_ADDRESS + else liquidation_trace.inputs["repayAmount"] + ) debt_transfer = _get_debt_transfer(liquidator, child_transfers) From f1937be0e99206e80d2732368b8e8af513febad7 Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Tue, 18 Jan 2022 16:42:56 -0500 Subject: [PATCH 16/20] Fix cETH address circular import --- mev_inspect/classifiers/helpers.py | 2 ++ mev_inspect/classifiers/specs/compound.py | 7 +++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/mev_inspect/classifiers/helpers.py b/mev_inspect/classifiers/helpers.py index 94abbdb..2531b63 100644 --- a/mev_inspect/classifiers/helpers.py +++ b/mev_inspect/classifiers/helpers.py @@ -5,6 +5,8 @@ from mev_inspect.schemas.swaps import Swap from mev_inspect.schemas.traces import ClassifiedTrace, DecodedCallTrace from mev_inspect.schemas.transfers import ETH_TOKEN_ADDRESS, Transfer +CETH_TOKEN_ADDRESS = "0x4ddc2d193948926d02f9b1fe9e1daa0718270ed5" + def create_nft_trade_from_transfers( trace: DecodedCallTrace, diff --git a/mev_inspect/classifiers/specs/compound.py b/mev_inspect/classifiers/specs/compound.py index f6bc19b..af5b4ce 100644 --- a/mev_inspect/classifiers/specs/compound.py +++ b/mev_inspect/classifiers/specs/compound.py @@ -1,6 +1,10 @@ from typing import List, Optional -from mev_inspect.classifiers.helpers import _get_debt_transfer, _get_received_transfer +from mev_inspect.classifiers.helpers import ( + CETH_TOKEN_ADDRESS, + _get_debt_transfer, + _get_received_transfer, +) from mev_inspect.schemas.classifiers import ( Classification, ClassifiedTrace, @@ -10,7 +14,6 @@ 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 From 425f882637c907162d0e6a49ea50501eb90b74b7 Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Tue, 18 Jan 2022 16:46:49 -0500 Subject: [PATCH 17/20] Fix black issues --- mev_inspect/schemas/prices.py | 1 - 1 file changed, 1 deletion(-) diff --git a/mev_inspect/schemas/prices.py b/mev_inspect/schemas/prices.py index 4cce2c9..b04000f 100644 --- a/mev_inspect/schemas/prices.py +++ b/mev_inspect/schemas/prices.py @@ -53,7 +53,6 @@ COINGECKO_ID_BY_ADDRESS = { } - class Price(BaseModel): token_address: str usd_price: float From e1d054b82ef2b904842638ebb97bc96fbb0ccb1e Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Wed, 19 Jan 2022 10:48:40 -0500 Subject: [PATCH 18/20] Add cETH transfer in cETH liquidations --- mev_inspect/classifiers/specs/compound.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mev_inspect/classifiers/specs/compound.py b/mev_inspect/classifiers/specs/compound.py index af5b4ce..66de624 100644 --- a/mev_inspect/classifiers/specs/compound.py +++ b/mev_inspect/classifiers/specs/compound.py @@ -37,7 +37,7 @@ class CompoundLiquidationClassifier(LiquidationClassifier): debt_purchase_amount = ( liquidation_trace.value - if debt_token_address == CETH_TOKEN_ADDRESS + if debt_token_address == CETH_TOKEN_ADDRESS and liquidation_trace.value != 0 else liquidation_trace.inputs["repayAmount"] ) From 5eaf4748c711fbcfe899743ae849422c7e8f7b38 Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Wed, 19 Jan 2022 10:58:09 -0500 Subject: [PATCH 19/20] Fix helper names --- mev_inspect/classifiers/helpers.py | 4 ++-- mev_inspect/classifiers/specs/aave.py | 6 +++--- mev_inspect/classifiers/specs/compound.py | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/mev_inspect/classifiers/helpers.py b/mev_inspect/classifiers/helpers.py index 2531b63..b09bee3 100644 --- a/mev_inspect/classifiers/helpers.py +++ b/mev_inspect/classifiers/helpers.py @@ -182,7 +182,7 @@ def _filter_transfers( return filtered_transfers -def _get_received_transfer( +def get_received_transfer( liquidator: str, child_transfers: List[Transfer] ) -> Optional[Transfer]: """Get transfer from AAVE to liquidator""" @@ -194,7 +194,7 @@ def _get_received_transfer( return None -def _get_debt_transfer( +def get_debt_transfer( liquidator: str, child_transfers: List[Transfer] ) -> Optional[Transfer]: """Get transfer from liquidator to AAVE""" diff --git a/mev_inspect/classifiers/specs/aave.py b/mev_inspect/classifiers/specs/aave.py index af6c7ff..9e7c836 100644 --- a/mev_inspect/classifiers/specs/aave.py +++ b/mev_inspect/classifiers/specs/aave.py @@ -1,6 +1,6 @@ from typing import List, Optional -from mev_inspect.classifiers.helpers import _get_debt_transfer, _get_received_transfer +from mev_inspect.classifiers.helpers import get_debt_transfer, get_received_transfer from mev_inspect.schemas.classifiers import ( ClassifiedTrace, ClassifierSpec, @@ -30,9 +30,9 @@ class AaveLiquidationClassifier(LiquidationClassifier): debt_purchase_amount = None received_amount = None - debt_transfer = _get_debt_transfer(liquidator, child_transfers) + debt_transfer = get_debt_transfer(liquidator, child_transfers) - received_transfer = _get_received_transfer(liquidator, child_transfers) + received_transfer = get_received_transfer(liquidator, child_transfers) if debt_transfer is not None and received_transfer is not None: diff --git a/mev_inspect/classifiers/specs/compound.py b/mev_inspect/classifiers/specs/compound.py index 66de624..7716869 100644 --- a/mev_inspect/classifiers/specs/compound.py +++ b/mev_inspect/classifiers/specs/compound.py @@ -2,8 +2,8 @@ from typing import List, Optional from mev_inspect.classifiers.helpers import ( CETH_TOKEN_ADDRESS, - _get_debt_transfer, - _get_received_transfer, + get_debt_transfer, + get_received_transfer, ) from mev_inspect.schemas.classifiers import ( Classification, @@ -41,9 +41,9 @@ class CompoundLiquidationClassifier(LiquidationClassifier): else liquidation_trace.inputs["repayAmount"] ) - debt_transfer = _get_debt_transfer(liquidator, child_transfers) + debt_transfer = get_debt_transfer(liquidator, child_transfers) - received_transfer = _get_received_transfer(liquidator, child_transfers) + received_transfer = get_received_transfer(liquidator, child_transfers) seize_trace = _get_seize_call(child_traces) From 8ad5ea525d19b63b4e0c4556619812fb9be52613 Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Wed, 19 Jan 2022 11:18:04 -0500 Subject: [PATCH 20/20] Fix token address circular import --- mev_inspect/classifiers/helpers.py | 5 ++--- mev_inspect/classifiers/specs/__init__.py | 2 +- mev_inspect/classifiers/specs/compound.py | 7 ++----- mev_inspect/classifiers/specs/weth.py | 5 ++--- mev_inspect/schemas/prices.py | 9 ++++----- mev_inspect/schemas/transfers.py | 2 -- mev_inspect/transfers.py | 3 ++- tests/test_aave.py | 2 +- 8 files changed, 14 insertions(+), 21 deletions(-) diff --git a/mev_inspect/classifiers/helpers.py b/mev_inspect/classifiers/helpers.py index b09bee3..080eca3 100644 --- a/mev_inspect/classifiers/helpers.py +++ b/mev_inspect/classifiers/helpers.py @@ -1,11 +1,10 @@ from typing import List, Optional, Sequence from mev_inspect.schemas.nft_trades import NftTrade +from mev_inspect.schemas.prices import ETH_TOKEN_ADDRESS from mev_inspect.schemas.swaps import Swap from mev_inspect.schemas.traces import ClassifiedTrace, DecodedCallTrace -from mev_inspect.schemas.transfers import ETH_TOKEN_ADDRESS, Transfer - -CETH_TOKEN_ADDRESS = "0x4ddc2d193948926d02f9b1fe9e1daa0718270ed5" +from mev_inspect.schemas.transfers import Transfer def create_nft_trade_from_transfers( diff --git a/mev_inspect/classifiers/specs/__init__.py b/mev_inspect/classifiers/specs/__init__.py index 8473964..dd7f192 100644 --- a/mev_inspect/classifiers/specs/__init__.py +++ b/mev_inspect/classifiers/specs/__init__.py @@ -12,7 +12,7 @@ from .curve import CURVE_CLASSIFIER_SPECS from .erc20 import ERC20_CLASSIFIER_SPECS from .opensea import OPENSEA_CLASSIFIER_SPECS from .uniswap import UNISWAP_CLASSIFIER_SPECS -from .weth import WETH_ADDRESS, WETH_CLASSIFIER_SPECS +from .weth import WETH_CLASSIFIER_SPECS from .zero_ex import ZEROX_CLASSIFIER_SPECS ALL_CLASSIFIER_SPECS = ( diff --git a/mev_inspect/classifiers/specs/compound.py b/mev_inspect/classifiers/specs/compound.py index 7716869..bbe816b 100644 --- a/mev_inspect/classifiers/specs/compound.py +++ b/mev_inspect/classifiers/specs/compound.py @@ -1,10 +1,6 @@ from typing import List, Optional -from mev_inspect.classifiers.helpers import ( - CETH_TOKEN_ADDRESS, - get_debt_transfer, - get_received_transfer, -) +from mev_inspect.classifiers.helpers import get_debt_transfer, get_received_transfer from mev_inspect.schemas.classifiers import ( Classification, ClassifiedTrace, @@ -14,6 +10,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 diff --git a/mev_inspect/classifiers/specs/weth.py b/mev_inspect/classifiers/specs/weth.py index 1360f0c..0c7a205 100644 --- a/mev_inspect/classifiers/specs/weth.py +++ b/mev_inspect/classifiers/specs/weth.py @@ -3,6 +3,7 @@ from mev_inspect.schemas.classifiers import ( DecodedCallTrace, TransferClassifier, ) +from mev_inspect.schemas.prices import WETH_TOKEN_ADDRESS from mev_inspect.schemas.traces import Protocol from mev_inspect.schemas.transfers import Transfer @@ -21,12 +22,10 @@ class WethTransferClassifier(TransferClassifier): ) -WETH_ADDRESS = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" - WETH_SPEC = ClassifierSpec( abi_name="WETH9", protocol=Protocol.weth, - valid_contract_addresses=[WETH_ADDRESS], + valid_contract_addresses=[WETH_TOKEN_ADDRESS], classifiers={ "transferFrom(address,address,uint256)": WethTransferClassifier, "transfer(address,uint256)": WethTransferClassifier, diff --git a/mev_inspect/schemas/prices.py b/mev_inspect/schemas/prices.py index b04000f..17943b5 100644 --- a/mev_inspect/schemas/prices.py +++ b/mev_inspect/schemas/prices.py @@ -2,9 +2,8 @@ from datetime import datetime from pydantic import BaseModel, validator -from mev_inspect.classifiers.specs.weth import WETH_ADDRESS -from mev_inspect.schemas.transfers import ETH_TOKEN_ADDRESS - +ETH_TOKEN_ADDRESS = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee" +WETH_TOKEN_ADDRESS = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" WBTC_TOKEN_ADDRESS = "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599" LINK_TOKEN_ADDRESS = "0x514910771af9ca656af840dff83e8264ecf986ca" YEARN_TOKEN_ADDRESS = "0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e" @@ -20,7 +19,7 @@ CWBTC_TOKEN_ADDRESS = "0xc11b1268c1a384e55c48c2391d8d480264a3a7f4" TOKEN_ADDRESSES = [ ETH_TOKEN_ADDRESS, - WETH_ADDRESS, + WETH_TOKEN_ADDRESS, WBTC_TOKEN_ADDRESS, LINK_TOKEN_ADDRESS, YEARN_TOKEN_ADDRESS, @@ -36,7 +35,7 @@ TOKEN_ADDRESSES = [ ] COINGECKO_ID_BY_ADDRESS = { - WETH_ADDRESS: "weth", + WETH_TOKEN_ADDRESS: "weth", ETH_TOKEN_ADDRESS: "ethereum", WBTC_TOKEN_ADDRESS: "wrapped-bitcoin", LINK_TOKEN_ADDRESS: "chainlink", diff --git a/mev_inspect/schemas/transfers.py b/mev_inspect/schemas/transfers.py index d8e468d..b76ce1b 100644 --- a/mev_inspect/schemas/transfers.py +++ b/mev_inspect/schemas/transfers.py @@ -2,8 +2,6 @@ from typing import List from pydantic import BaseModel -ETH_TOKEN_ADDRESS = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee" - class Transfer(BaseModel): block_number: int diff --git a/mev_inspect/transfers.py b/mev_inspect/transfers.py index bac70ba..5f85ad4 100644 --- a/mev_inspect/transfers.py +++ b/mev_inspect/transfers.py @@ -2,8 +2,9 @@ from typing import Dict, List, Optional, Sequence from mev_inspect.classifiers.specs import get_classifier from mev_inspect.schemas.classifiers import TransferClassifier +from mev_inspect.schemas.prices import ETH_TOKEN_ADDRESS from mev_inspect.schemas.traces import ClassifiedTrace, DecodedCallTrace -from mev_inspect.schemas.transfers import ETH_TOKEN_ADDRESS, Transfer +from mev_inspect.schemas.transfers import Transfer from mev_inspect.traces import get_child_traces, is_child_trace_address diff --git a/tests/test_aave.py b/tests/test_aave.py index 2250ce7..2e5d899 100644 --- a/tests/test_aave.py +++ b/tests/test_aave.py @@ -3,8 +3,8 @@ from typing import List from mev_inspect.classifiers.trace import TraceClassifier from mev_inspect.liquidations import get_liquidations from mev_inspect.schemas.liquidations import Liquidation +from mev_inspect.schemas.prices import ETH_TOKEN_ADDRESS from mev_inspect.schemas.traces import Protocol -from mev_inspect.transfers import ETH_TOKEN_ADDRESS from tests.utils import load_test_block