From 29cd82cd0b64358cb3a191ee47995a11a9632f01 Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Mon, 15 Nov 2021 11:00:39 -0500 Subject: [PATCH 01/17] Parse swap logic inside uniswap classifier --- mev | 2 +- mev_inspect/classifiers/specs/uniswap.py | 129 +++++++++++++++++++++-- 2 files changed, 122 insertions(+), 9 deletions(-) diff --git a/mev b/mev index 7d7f79f..f9feafe 100755 --- a/mev +++ b/mev @@ -1,4 +1,4 @@ -#!/bin/sh +#!/usr/bin/env bash set -e diff --git a/mev_inspect/classifiers/specs/uniswap.py b/mev_inspect/classifiers/specs/uniswap.py index 97c90a6..8939436 100644 --- a/mev_inspect/classifiers/specs/uniswap.py +++ b/mev_inspect/classifiers/specs/uniswap.py @@ -1,3 +1,5 @@ +from typing import Optional, List + from mev_inspect.schemas.traces import ( DecodedCallTrace, Protocol, @@ -6,7 +8,12 @@ from mev_inspect.schemas.classifiers import ( ClassifierSpec, SwapClassifier, ) - +from mev_inspect.schemas.swaps import Swap +from mev_inspect.schemas.transfers import Transfer +from mev_inspect.transfers import ( + build_eth_transfer, + filter_transfers, +) UNISWAP_V2_PAIR_ABI_NAME = "UniswapV2Pair" UNISWAP_V3_POOL_ABI_NAME = "UniswapV3Pool" @@ -14,20 +21,126 @@ UNISWAP_V3_POOL_ABI_NAME = "UniswapV3Pool" class UniswapV3SwapClassifier(SwapClassifier): @staticmethod - def get_swap_recipient(trace: DecodedCallTrace) -> str: + def parse_swap( + trace: DecodedCallTrace, + prior_transfers: List[Transfer], + child_transfers: List[Transfer], + ) -> Optional[Swap]: + pool_address = trace.to_address + if trace.inputs is not None and "recipient" in trace.inputs: - return trace.inputs["recipient"] + recipient_address = trace.inputs["recipient"] else: - return trace.from_address + recipient_address = trace.from_address + + if recipient_address is None: + return None + + transfers_to_pool = [] + + if trace.value is not None and trace.value > 0: + transfers_to_pool = [build_eth_transfer(trace)] + + if len(transfers_to_pool) == 0: + transfers_to_pool = filter_transfers( + prior_transfers, to_address=pool_address + ) + + if len(transfers_to_pool) == 0: + transfers_to_pool = filter_transfers( + child_transfers, to_address=pool_address + ) + + if len(transfers_to_pool) == 0: + return None + + transfers_from_pool_to_recipient = filter_transfers( + child_transfers, to_address=recipient_address, from_address=pool_address + ) + + if len(transfers_from_pool_to_recipient) != 1: + return None + + transfer_in = transfers_to_pool[-1] + transfer_out = transfers_from_pool_to_recipient[0] + + return Swap( + abi_name=trace.abi_name, + transaction_hash=trace.transaction_hash, + block_number=trace.block_number, + trace_address=trace.trace_address, + pool_address=pool_address, + protocol=trace.protocol, + from_address=transfer_in.from_address, + to_address=transfer_out.to_address, + token_in_address=transfer_in.token_address, + token_in_amount=transfer_in.amount, + token_out_address=transfer_out.token_address, + token_out_amount=transfer_out.amount, + error=trace.error, + ) class UniswapV2SwapClassifier(SwapClassifier): @staticmethod - def get_swap_recipient(trace: DecodedCallTrace) -> str: + def parse_swap( + trace: DecodedCallTrace, + prior_transfers: List[Transfer], + child_transfers: List[Transfer], + ) -> Optional[Swap]: + pool_address = trace.to_address + if trace.inputs is not None and "to" in trace.inputs: - return trace.inputs["to"] + recipient_address = trace.inputs["to"] else: - return trace.from_address + recipient_address = trace.from_address + + if recipient_address is None: + return None + + transfers_to_pool = [] + + if trace.value is not None and trace.value > 0: + transfers_to_pool = [build_eth_transfer(trace)] + + if len(transfers_to_pool) == 0: + transfers_to_pool = filter_transfers( + prior_transfers, to_address=pool_address + ) + + if len(transfers_to_pool) == 0: + transfers_to_pool = filter_transfers( + child_transfers, to_address=pool_address + ) + + if len(transfers_to_pool) == 0: + return None + + transfers_from_pool_to_recipient = filter_transfers( + child_transfers, to_address=recipient_address, from_address=pool_address + ) + + if len(transfers_from_pool_to_recipient) != 1: + return None + + transfer_in = transfers_to_pool[-1] + transfer_out = transfers_from_pool_to_recipient[0] + + return Swap( + abi_name=trace.abi_name, + transaction_hash=trace.transaction_hash, + block_number=trace.block_number, + trace_address=trace.trace_address, + pool_address=pool_address, + protocol=trace.protocol, + from_address=transfer_in.from_address, + to_address=transfer_out.to_address, + token_in_address=transfer_in.token_address, + token_in_amount=transfer_in.amount, + token_out_address=transfer_out.token_address, + token_out_amount=transfer_out.amount, + error=trace.error, + ) UNISWAP_V3_CONTRACT_SPECS = [ @@ -127,7 +240,7 @@ UNISWAPPY_V2_PAIR_SPEC = ClassifierSpec( }, ) -UNISWAP_CLASSIFIER_SPECS = [ +UNISWAP_CLASSIFIER_SPECS: List = [ *UNISWAP_V3_CONTRACT_SPECS, *UNISWAPPY_V2_CONTRACT_SPECS, *UNISWAP_V3_GENERAL_SPECS, From f43df8ffa4508601b96761c61027cf766800593b Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Mon, 15 Nov 2021 13:28:34 -0500 Subject: [PATCH 02/17] Fix circular imports --- mev_inspect/classifiers/specs/uniswap.py | 57 ++++++++++++++++++------ mev_inspect/classifiers/specs/zero_ex.py | 1 - mev_inspect/schemas/classifiers.py | 10 +++++ mev_inspect/swaps.py | 52 +-------------------- 4 files changed, 54 insertions(+), 66 deletions(-) diff --git a/mev_inspect/classifiers/specs/uniswap.py b/mev_inspect/classifiers/specs/uniswap.py index 8939436..a8726a8 100644 --- a/mev_inspect/classifiers/specs/uniswap.py +++ b/mev_inspect/classifiers/specs/uniswap.py @@ -1,6 +1,7 @@ -from typing import Optional, List +from typing import Optional, List, Sequence from mev_inspect.schemas.traces import ( + ClassifiedTrace, DecodedCallTrace, Protocol, ) @@ -8,12 +9,9 @@ from mev_inspect.schemas.classifiers import ( ClassifierSpec, SwapClassifier, ) + from mev_inspect.schemas.swaps import Swap -from mev_inspect.schemas.transfers import Transfer -from mev_inspect.transfers import ( - build_eth_transfer, - filter_transfers, -) +from mev_inspect.schemas.transfers import Transfer, ETH_TOKEN_ADDRESS UNISWAP_V2_PAIR_ABI_NAME = "UniswapV2Pair" UNISWAP_V3_POOL_ABI_NAME = "UniswapV3Pool" @@ -39,22 +37,22 @@ class UniswapV3SwapClassifier(SwapClassifier): transfers_to_pool = [] if trace.value is not None and trace.value > 0: - transfers_to_pool = [build_eth_transfer(trace)] + transfers_to_pool = [_build_eth_transfer(trace)] if len(transfers_to_pool) == 0: - transfers_to_pool = filter_transfers( + transfers_to_pool = _filter_transfers( prior_transfers, to_address=pool_address ) if len(transfers_to_pool) == 0: - transfers_to_pool = filter_transfers( + transfers_to_pool = _filter_transfers( child_transfers, to_address=pool_address ) if len(transfers_to_pool) == 0: return None - transfers_from_pool_to_recipient = filter_transfers( + transfers_from_pool_to_recipient = _filter_transfers( child_transfers, to_address=recipient_address, from_address=pool_address ) @@ -101,22 +99,22 @@ class UniswapV2SwapClassifier(SwapClassifier): transfers_to_pool = [] if trace.value is not None and trace.value > 0: - transfers_to_pool = [build_eth_transfer(trace)] + transfers_to_pool = [_build_eth_transfer(trace)] if len(transfers_to_pool) == 0: - transfers_to_pool = filter_transfers( + transfers_to_pool = _filter_transfers( prior_transfers, to_address=pool_address ) if len(transfers_to_pool) == 0: - transfers_to_pool = filter_transfers( + transfers_to_pool = _filter_transfers( child_transfers, to_address=pool_address ) if len(transfers_to_pool) == 0: return None - transfers_from_pool_to_recipient = filter_transfers( + transfers_from_pool_to_recipient = _filter_transfers( child_transfers, to_address=recipient_address, from_address=pool_address ) @@ -143,6 +141,37 @@ class UniswapV2SwapClassifier(SwapClassifier): ) +def _build_eth_transfer(trace: ClassifiedTrace) -> Transfer: + return Transfer( + block_number=trace.block_number, + transaction_hash=trace.transaction_hash, + trace_address=trace.trace_address, + amount=trace.value, + to_address=trace.to_address, + from_address=trace.from_address, + token_address=ETH_TOKEN_ADDRESS, + ) + + +def _filter_transfers( + transfers: Sequence[Transfer], + to_address: Optional[str] = None, + from_address: Optional[str] = None, +) -> List[Transfer]: + filtered_transfers = [] + + for transfer in transfers: + if to_address is not None and transfer.to_address != to_address: + continue + + if from_address is not None and transfer.from_address != from_address: + continue + + filtered_transfers.append(transfer) + + return filtered_transfers + + UNISWAP_V3_CONTRACT_SPECS = [ ClassifierSpec( abi_name="UniswapV3Factory", diff --git a/mev_inspect/classifiers/specs/zero_ex.py b/mev_inspect/classifiers/specs/zero_ex.py index b983bbc..4157b36 100644 --- a/mev_inspect/classifiers/specs/zero_ex.py +++ b/mev_inspect/classifiers/specs/zero_ex.py @@ -5,7 +5,6 @@ from mev_inspect.schemas.classifiers import ( ClassifierSpec, ) - ZEROX_CONTRACT_SPECS = [ ClassifierSpec( abi_name="exchangeProxy", diff --git a/mev_inspect/schemas/classifiers.py b/mev_inspect/schemas/classifiers.py index ab50271..b257b59 100644 --- a/mev_inspect/schemas/classifiers.py +++ b/mev_inspect/schemas/classifiers.py @@ -5,6 +5,7 @@ from pydantic import BaseModel from .traces import Classification, DecodedCallTrace, Protocol from .transfers import Transfer +from .swaps import Swap class Classifier(ABC): @@ -35,6 +36,15 @@ class SwapClassifier(Classifier): def get_swap_recipient(trace: DecodedCallTrace) -> str: raise NotImplementedError() + @staticmethod + @abstractmethod + def parse_swap( + trace: DecodedCallTrace, + prior_transfers: List[Transfer], + child_transfers: List[Transfer], + ) -> Optional[Swap]: + raise NotImplementedError() + class LiquidationClassifier(Classifier): @staticmethod diff --git a/mev_inspect/swaps.py b/mev_inspect/swaps.py index 2929702..b710044 100644 --- a/mev_inspect/swaps.py +++ b/mev_inspect/swaps.py @@ -11,10 +11,8 @@ from mev_inspect.schemas.swaps import Swap from mev_inspect.schemas.transfers import Transfer from mev_inspect.traces import get_traces_by_transaction_hash from mev_inspect.transfers import ( - build_eth_transfer, get_child_transfers, get_transfer, - filter_transfers, remove_child_transfers_of_transfers, ) @@ -67,56 +65,8 @@ def _parse_swap( prior_transfers: List[Transfer], child_transfers: List[Transfer], ) -> Optional[Swap]: - pool_address = trace.to_address - recipient_address = _get_recipient_address(trace) - if recipient_address is None: - return None - - transfers_to_pool = [] - - if trace.value is not None and trace.value > 0: - transfers_to_pool = [build_eth_transfer(trace)] - - if len(transfers_to_pool) == 0: - transfers_to_pool = filter_transfers(prior_transfers, to_address=pool_address) - - if len(transfers_to_pool) == 0: - transfers_to_pool = filter_transfers(child_transfers, to_address=pool_address) - - if len(transfers_to_pool) == 0: - return None - - transfers_from_pool_to_recipient = filter_transfers( - child_transfers, to_address=recipient_address, from_address=pool_address - ) - - if len(transfers_from_pool_to_recipient) != 1: - return None - - transfer_in = transfers_to_pool[-1] - transfer_out = transfers_from_pool_to_recipient[0] - - return Swap( - abi_name=trace.abi_name, - transaction_hash=trace.transaction_hash, - block_number=trace.block_number, - trace_address=trace.trace_address, - pool_address=pool_address, - protocol=trace.protocol, - from_address=transfer_in.from_address, - to_address=transfer_out.to_address, - token_in_address=transfer_in.token_address, - token_in_amount=transfer_in.amount, - token_out_address=transfer_out.token_address, - token_out_amount=transfer_out.amount, - error=trace.error, - ) - - -def _get_recipient_address(trace: DecodedCallTrace) -> Optional[str]: classifier = get_classifier(trace) if classifier is not None and issubclass(classifier, SwapClassifier): - return classifier.get_swap_recipient(trace) - + return classifier.parse_swap(trace, prior_transfers, child_transfers) return None From 94c5691f016f5e4ba57c96734580075f101d2b31 Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Wed, 17 Nov 2021 07:37:25 -0500 Subject: [PATCH 03/17] Move swap logic into classifiers --- mev_inspect/classifiers/specs/balancer.py | 15 ++- mev_inspect/classifiers/specs/curve.py | 16 ++- mev_inspect/classifiers/specs/uniswap.py | 148 ++-------------------- mev_inspect/classifiers/utils.py | 93 ++++++++++++++ 4 files changed, 126 insertions(+), 146 deletions(-) create mode 100644 mev_inspect/classifiers/utils.py diff --git a/mev_inspect/classifiers/specs/balancer.py b/mev_inspect/classifiers/specs/balancer.py index 2bf0292..b2e57ce 100644 --- a/mev_inspect/classifiers/specs/balancer.py +++ b/mev_inspect/classifiers/specs/balancer.py @@ -1,3 +1,6 @@ +from typing import Optional, List +from mev_inspect.schemas.transfers import Transfer +from mev_inspect.schemas.swaps import Swap from mev_inspect.schemas.traces import ( DecodedCallTrace, Protocol, @@ -6,15 +9,21 @@ from mev_inspect.schemas.classifiers import ( ClassifierSpec, SwapClassifier, ) - +from mev_inspect.classifiers.utils import create_swap_from_transfers BALANCER_V1_POOL_ABI_NAME = "BPool" class BalancerSwapClassifier(SwapClassifier): @staticmethod - def get_swap_recipient(trace: DecodedCallTrace) -> str: - return trace.from_address + def parse_swap( + trace: DecodedCallTrace, + prior_transfers: List[Transfer], + child_transfers: List[Transfer], + ) -> Optional[Swap]: + + swap = create_swap_from_transfers(trace, prior_transfers, child_transfers) + return swap BALANCER_V1_SPECS = [ diff --git a/mev_inspect/classifiers/specs/curve.py b/mev_inspect/classifiers/specs/curve.py index 97ddb85..d1ed717 100644 --- a/mev_inspect/classifiers/specs/curve.py +++ b/mev_inspect/classifiers/specs/curve.py @@ -1,18 +1,28 @@ +from typing import Optional, List +from mev_inspect.schemas.transfers import Transfer +from mev_inspect.schemas.swaps import Swap from mev_inspect.schemas.traces import ( Protocol, + DecodedCallTrace, ) from mev_inspect.schemas.classifiers import ( ClassifierSpec, - DecodedCallTrace, SwapClassifier, ) +from mev_inspect.classifiers.utils import create_swap_from_transfers class CurveSwapClassifier(SwapClassifier): @staticmethod - def get_swap_recipient(trace: DecodedCallTrace) -> str: - return trace.from_address + def parse_swap( + trace: DecodedCallTrace, + prior_transfers: List[Transfer], + child_transfers: List[Transfer], + ) -> Optional[Swap]: + + swap = create_swap_from_transfers(trace, prior_transfers, child_transfers) + return swap CURVE_BASE_POOLS = [ diff --git a/mev_inspect/classifiers/specs/uniswap.py b/mev_inspect/classifiers/specs/uniswap.py index a8726a8..3c35b9e 100644 --- a/mev_inspect/classifiers/specs/uniswap.py +++ b/mev_inspect/classifiers/specs/uniswap.py @@ -1,7 +1,7 @@ -from typing import Optional, List, Sequence - +from typing import Optional, List +from mev_inspect.schemas.transfers import Transfer +from mev_inspect.schemas.swaps import Swap from mev_inspect.schemas.traces import ( - ClassifiedTrace, DecodedCallTrace, Protocol, ) @@ -9,9 +9,8 @@ from mev_inspect.schemas.classifiers import ( ClassifierSpec, SwapClassifier, ) +from mev_inspect.classifiers.utils import create_swap_from_transfers -from mev_inspect.schemas.swaps import Swap -from mev_inspect.schemas.transfers import Transfer, ETH_TOKEN_ADDRESS UNISWAP_V2_PAIR_ABI_NAME = "UniswapV2Pair" UNISWAP_V3_POOL_ABI_NAME = "UniswapV3Pool" @@ -24,59 +23,9 @@ class UniswapV3SwapClassifier(SwapClassifier): prior_transfers: List[Transfer], child_transfers: List[Transfer], ) -> Optional[Swap]: - pool_address = trace.to_address - if trace.inputs is not None and "recipient" in trace.inputs: - recipient_address = trace.inputs["recipient"] - else: - recipient_address = trace.from_address - - if recipient_address is None: - return None - - transfers_to_pool = [] - - if trace.value is not None and trace.value > 0: - transfers_to_pool = [_build_eth_transfer(trace)] - - if len(transfers_to_pool) == 0: - transfers_to_pool = _filter_transfers( - prior_transfers, to_address=pool_address - ) - - if len(transfers_to_pool) == 0: - transfers_to_pool = _filter_transfers( - child_transfers, to_address=pool_address - ) - - if len(transfers_to_pool) == 0: - return None - - transfers_from_pool_to_recipient = _filter_transfers( - child_transfers, to_address=recipient_address, from_address=pool_address - ) - - if len(transfers_from_pool_to_recipient) != 1: - return None - - transfer_in = transfers_to_pool[-1] - transfer_out = transfers_from_pool_to_recipient[0] - - return Swap( - abi_name=trace.abi_name, - transaction_hash=trace.transaction_hash, - block_number=trace.block_number, - trace_address=trace.trace_address, - pool_address=pool_address, - protocol=trace.protocol, - from_address=transfer_in.from_address, - to_address=transfer_out.to_address, - token_in_address=transfer_in.token_address, - token_in_amount=transfer_in.amount, - token_out_address=transfer_out.token_address, - token_out_amount=transfer_out.amount, - error=trace.error, - ) + swap = create_swap_from_transfers(trace, prior_transfers, child_transfers) + return swap class UniswapV2SwapClassifier(SwapClassifier): @@ -86,90 +35,9 @@ class UniswapV2SwapClassifier(SwapClassifier): prior_transfers: List[Transfer], child_transfers: List[Transfer], ) -> Optional[Swap]: - pool_address = trace.to_address - if trace.inputs is not None and "to" in trace.inputs: - recipient_address = trace.inputs["to"] - else: - recipient_address = trace.from_address - - if recipient_address is None: - return None - - transfers_to_pool = [] - - if trace.value is not None and trace.value > 0: - transfers_to_pool = [_build_eth_transfer(trace)] - - if len(transfers_to_pool) == 0: - transfers_to_pool = _filter_transfers( - prior_transfers, to_address=pool_address - ) - - if len(transfers_to_pool) == 0: - transfers_to_pool = _filter_transfers( - child_transfers, to_address=pool_address - ) - - if len(transfers_to_pool) == 0: - return None - - transfers_from_pool_to_recipient = _filter_transfers( - child_transfers, to_address=recipient_address, from_address=pool_address - ) - - if len(transfers_from_pool_to_recipient) != 1: - return None - - transfer_in = transfers_to_pool[-1] - transfer_out = transfers_from_pool_to_recipient[0] - - return Swap( - abi_name=trace.abi_name, - transaction_hash=trace.transaction_hash, - block_number=trace.block_number, - trace_address=trace.trace_address, - pool_address=pool_address, - protocol=trace.protocol, - from_address=transfer_in.from_address, - to_address=transfer_out.to_address, - token_in_address=transfer_in.token_address, - token_in_amount=transfer_in.amount, - token_out_address=transfer_out.token_address, - token_out_amount=transfer_out.amount, - error=trace.error, - ) - - -def _build_eth_transfer(trace: ClassifiedTrace) -> Transfer: - return Transfer( - block_number=trace.block_number, - transaction_hash=trace.transaction_hash, - trace_address=trace.trace_address, - amount=trace.value, - to_address=trace.to_address, - from_address=trace.from_address, - token_address=ETH_TOKEN_ADDRESS, - ) - - -def _filter_transfers( - transfers: Sequence[Transfer], - to_address: Optional[str] = None, - from_address: Optional[str] = None, -) -> List[Transfer]: - filtered_transfers = [] - - for transfer in transfers: - if to_address is not None and transfer.to_address != to_address: - continue - - if from_address is not None and transfer.from_address != from_address: - continue - - filtered_transfers.append(transfer) - - return filtered_transfers + swap = create_swap_from_transfers(trace, prior_transfers, child_transfers) + return swap UNISWAP_V3_CONTRACT_SPECS = [ diff --git a/mev_inspect/classifiers/utils.py b/mev_inspect/classifiers/utils.py new file mode 100644 index 0000000..ff4f101 --- /dev/null +++ b/mev_inspect/classifiers/utils.py @@ -0,0 +1,93 @@ +from typing import Optional, List, Sequence + +from mev_inspect.schemas.swaps import Swap +from mev_inspect.schemas.transfers import Transfer, ETH_TOKEN_ADDRESS + +from mev_inspect.schemas.traces import DecodedCallTrace, ClassifiedTrace + + +def create_swap_from_transfers( + trace: DecodedCallTrace, + prior_transfers: List[Transfer], + child_transfers: List[Transfer], +) -> Optional[Swap]: + pool_address = trace.to_address + + if trace.inputs is not None and "to" in trace.inputs: + recipient_address = trace.inputs["to"] + else: + recipient_address = trace.from_address + + if recipient_address is None: + return None + + transfers_to_pool = [] + + if trace.value is not None and trace.value > 0: + transfers_to_pool = [_build_eth_transfer(trace)] + + if len(transfers_to_pool) == 0: + transfers_to_pool = _filter_transfers(prior_transfers, to_address=pool_address) + + if len(transfers_to_pool) == 0: + transfers_to_pool = _filter_transfers(child_transfers, to_address=pool_address) + + if len(transfers_to_pool) == 0: + return None + + transfers_from_pool_to_recipient = _filter_transfers( + child_transfers, to_address=recipient_address, from_address=pool_address + ) + + if len(transfers_from_pool_to_recipient) != 1: + return None + + transfer_in = transfers_to_pool[-1] + transfer_out = transfers_from_pool_to_recipient[0] + + return Swap( + abi_name=trace.abi_name, + transaction_hash=trace.transaction_hash, + block_number=trace.block_number, + trace_address=trace.trace_address, + pool_address=pool_address, + protocol=trace.protocol, + from_address=transfer_in.from_address, + to_address=transfer_out.to_address, + token_in_address=transfer_in.token_address, + token_in_amount=transfer_in.amount, + token_out_address=transfer_out.token_address, + token_out_amount=transfer_out.amount, + error=trace.error, + ) + + +def _build_eth_transfer(trace: ClassifiedTrace) -> Transfer: + return Transfer( + block_number=trace.block_number, + transaction_hash=trace.transaction_hash, + trace_address=trace.trace_address, + amount=trace.value, + to_address=trace.to_address, + from_address=trace.from_address, + token_address=ETH_TOKEN_ADDRESS, + ) + + +def _filter_transfers( + transfers: Sequence[Transfer], + to_address: Optional[str] = None, + from_address: Optional[str] = None, +) -> List[Transfer]: + filtered_transfers = [] + + for transfer in transfers: + if to_address is not None and transfer.to_address != to_address: + continue + + if from_address is not None and transfer.from_address != from_address: + continue + + filtered_transfers.append(transfer) + + return filtered_transfers From ff9337eb4bb2825779c7e5f709cf746ee6a8c5c2 Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Wed, 17 Nov 2021 10:19:10 -0500 Subject: [PATCH 04/17] Fix UniV3 Classifier --- mev_inspect/classifiers/specs/balancer.py | 6 +++++- mev_inspect/classifiers/specs/curve.py | 6 +++++- mev_inspect/classifiers/specs/uniswap.py | 18 ++++++++++++++++-- mev_inspect/classifiers/utils.py | 6 +----- 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/mev_inspect/classifiers/specs/balancer.py b/mev_inspect/classifiers/specs/balancer.py index b2e57ce..78ffe43 100644 --- a/mev_inspect/classifiers/specs/balancer.py +++ b/mev_inspect/classifiers/specs/balancer.py @@ -22,7 +22,11 @@ class BalancerSwapClassifier(SwapClassifier): child_transfers: List[Transfer], ) -> Optional[Swap]: - swap = create_swap_from_transfers(trace, prior_transfers, child_transfers) + recipient_address = trace.from_address + + swap = create_swap_from_transfers( + trace, recipient_address, prior_transfers, child_transfers + ) return swap diff --git a/mev_inspect/classifiers/specs/curve.py b/mev_inspect/classifiers/specs/curve.py index d1ed717..688f069 100644 --- a/mev_inspect/classifiers/specs/curve.py +++ b/mev_inspect/classifiers/specs/curve.py @@ -21,7 +21,11 @@ class CurveSwapClassifier(SwapClassifier): child_transfers: List[Transfer], ) -> Optional[Swap]: - swap = create_swap_from_transfers(trace, prior_transfers, child_transfers) + recipient_address = trace.from_address + + swap = create_swap_from_transfers( + trace, recipient_address, prior_transfers, child_transfers + ) return swap diff --git a/mev_inspect/classifiers/specs/uniswap.py b/mev_inspect/classifiers/specs/uniswap.py index 3c35b9e..ed094d8 100644 --- a/mev_inspect/classifiers/specs/uniswap.py +++ b/mev_inspect/classifiers/specs/uniswap.py @@ -24,7 +24,14 @@ class UniswapV3SwapClassifier(SwapClassifier): child_transfers: List[Transfer], ) -> Optional[Swap]: - swap = create_swap_from_transfers(trace, prior_transfers, child_transfers) + if trace.inputs is not None and "recipient" in trace.inputs: + recipient_address = trace.inputs["recipient"] + else: + recipient_address = trace.from_address + + swap = create_swap_from_transfers( + trace, recipient_address, prior_transfers, child_transfers + ) return swap @@ -36,7 +43,14 @@ class UniswapV2SwapClassifier(SwapClassifier): child_transfers: List[Transfer], ) -> Optional[Swap]: - swap = create_swap_from_transfers(trace, prior_transfers, child_transfers) + if trace.inputs is not None and "to" in trace.inputs: + recipient_address = trace.inputs["to"] + else: + recipient_address = trace.from_address + + swap = create_swap_from_transfers( + trace, recipient_address, prior_transfers, child_transfers + ) return swap diff --git a/mev_inspect/classifiers/utils.py b/mev_inspect/classifiers/utils.py index ff4f101..8d99be7 100644 --- a/mev_inspect/classifiers/utils.py +++ b/mev_inspect/classifiers/utils.py @@ -8,16 +8,12 @@ from mev_inspect.schemas.traces import DecodedCallTrace, ClassifiedTrace def create_swap_from_transfers( trace: DecodedCallTrace, + recipient_address: str, prior_transfers: List[Transfer], child_transfers: List[Transfer], ) -> Optional[Swap]: pool_address = trace.to_address - if trace.inputs is not None and "to" in trace.inputs: - recipient_address = trace.inputs["to"] - else: - recipient_address = trace.from_address - if recipient_address is None: return None From 6e25031623bba64f4f4ba07153b09168fd217623 Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Thu, 18 Nov 2021 11:38:09 -0500 Subject: [PATCH 05/17] Rename utils.py to swaps.py --- mev_inspect/classifiers/specs/balancer.py | 2 +- mev_inspect/classifiers/specs/curve.py | 2 +- mev_inspect/classifiers/specs/uniswap.py | 2 +- mev_inspect/classifiers/{utils.py => swaps.py} | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename mev_inspect/classifiers/{utils.py => swaps.py} (100%) diff --git a/mev_inspect/classifiers/specs/balancer.py b/mev_inspect/classifiers/specs/balancer.py index 78ffe43..2614002 100644 --- a/mev_inspect/classifiers/specs/balancer.py +++ b/mev_inspect/classifiers/specs/balancer.py @@ -9,7 +9,7 @@ from mev_inspect.schemas.classifiers import ( ClassifierSpec, SwapClassifier, ) -from mev_inspect.classifiers.utils import create_swap_from_transfers +from mev_inspect.classifiers.swaps import create_swap_from_transfers BALANCER_V1_POOL_ABI_NAME = "BPool" diff --git a/mev_inspect/classifiers/specs/curve.py b/mev_inspect/classifiers/specs/curve.py index 688f069..08244ea 100644 --- a/mev_inspect/classifiers/specs/curve.py +++ b/mev_inspect/classifiers/specs/curve.py @@ -10,7 +10,7 @@ from mev_inspect.schemas.classifiers import ( ClassifierSpec, SwapClassifier, ) -from mev_inspect.classifiers.utils import create_swap_from_transfers +from mev_inspect.classifiers.swaps import create_swap_from_transfers class CurveSwapClassifier(SwapClassifier): diff --git a/mev_inspect/classifiers/specs/uniswap.py b/mev_inspect/classifiers/specs/uniswap.py index ed094d8..1b3bb5a 100644 --- a/mev_inspect/classifiers/specs/uniswap.py +++ b/mev_inspect/classifiers/specs/uniswap.py @@ -9,7 +9,7 @@ from mev_inspect.schemas.classifiers import ( ClassifierSpec, SwapClassifier, ) -from mev_inspect.classifiers.utils import create_swap_from_transfers +from mev_inspect.classifiers.swaps import create_swap_from_transfers UNISWAP_V2_PAIR_ABI_NAME = "UniswapV2Pair" diff --git a/mev_inspect/classifiers/utils.py b/mev_inspect/classifiers/swaps.py similarity index 100% rename from mev_inspect/classifiers/utils.py rename to mev_inspect/classifiers/swaps.py From 1e1241cbf5aeb0e196397e665efd8e1563b5f55b Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Thu, 18 Nov 2021 12:22:13 -0500 Subject: [PATCH 06/17] Remove Uni none checks and bash change --- mev | 3 +-- mev_inspect/classifiers/specs/uniswap.py | 4 ++-- mev_inspect/classifiers/swaps.py | 3 --- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/mev b/mev index f9feafe..e3b3178 100755 --- a/mev +++ b/mev @@ -1,5 +1,4 @@ -#!/usr/bin/env bash - +#!/bin/sh set -e DB_NAME=mev_inspect diff --git a/mev_inspect/classifiers/specs/uniswap.py b/mev_inspect/classifiers/specs/uniswap.py index 1b3bb5a..d597f80 100644 --- a/mev_inspect/classifiers/specs/uniswap.py +++ b/mev_inspect/classifiers/specs/uniswap.py @@ -24,7 +24,7 @@ class UniswapV3SwapClassifier(SwapClassifier): child_transfers: List[Transfer], ) -> Optional[Swap]: - if trace.inputs is not None and "recipient" in trace.inputs: + if "recipient" in trace.inputs: recipient_address = trace.inputs["recipient"] else: recipient_address = trace.from_address @@ -43,7 +43,7 @@ class UniswapV2SwapClassifier(SwapClassifier): child_transfers: List[Transfer], ) -> Optional[Swap]: - if trace.inputs is not None and "to" in trace.inputs: + if "to" in trace.inputs: recipient_address = trace.inputs["to"] else: recipient_address = trace.from_address diff --git a/mev_inspect/classifiers/swaps.py b/mev_inspect/classifiers/swaps.py index 8d99be7..601eca7 100644 --- a/mev_inspect/classifiers/swaps.py +++ b/mev_inspect/classifiers/swaps.py @@ -14,9 +14,6 @@ def create_swap_from_transfers( ) -> Optional[Swap]: pool_address = trace.to_address - if recipient_address is None: - return None - transfers_to_pool = [] if trace.value is not None and trace.value > 0: From c5621e0676d335eef427d98edd3c1a8b6f031aed Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Thu, 18 Nov 2021 12:23:09 -0500 Subject: [PATCH 07/17] space --- mev | 1 + 1 file changed, 1 insertion(+) diff --git a/mev b/mev index e3b3178..7d7f79f 100755 --- a/mev +++ b/mev @@ -1,4 +1,5 @@ #!/bin/sh + set -e DB_NAME=mev_inspect From ca0014533a19a35164a4db7f6a34bde49393241b Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Thu, 18 Nov 2021 12:52:48 -0500 Subject: [PATCH 08/17] Add getter method for Uni recipient address --- mev_inspect/classifiers/specs/uniswap.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/mev_inspect/classifiers/specs/uniswap.py b/mev_inspect/classifiers/specs/uniswap.py index d597f80..017668b 100644 --- a/mev_inspect/classifiers/specs/uniswap.py +++ b/mev_inspect/classifiers/specs/uniswap.py @@ -24,10 +24,7 @@ class UniswapV3SwapClassifier(SwapClassifier): child_transfers: List[Transfer], ) -> Optional[Swap]: - if "recipient" in trace.inputs: - recipient_address = trace.inputs["recipient"] - else: - recipient_address = trace.from_address + recipient_address = trace.inputs.get("recipient", trace.from_address) swap = create_swap_from_transfers( trace, recipient_address, prior_transfers, child_transfers @@ -43,10 +40,7 @@ class UniswapV2SwapClassifier(SwapClassifier): child_transfers: List[Transfer], ) -> Optional[Swap]: - if "to" in trace.inputs: - recipient_address = trace.inputs["to"] - else: - recipient_address = trace.from_address + recipient_address = trace.inputs.get("to", trace.from_address) swap = create_swap_from_transfers( trace, recipient_address, prior_transfers, child_transfers From 386eccaeb75b16d77edc7fb0a2e80e400279bf4c Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Thu, 18 Nov 2021 12:58:45 -0500 Subject: [PATCH 09/17] Remove abstract method --- mev_inspect/schemas/classifiers.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/mev_inspect/schemas/classifiers.py b/mev_inspect/schemas/classifiers.py index b257b59..928ef1e 100644 --- a/mev_inspect/schemas/classifiers.py +++ b/mev_inspect/schemas/classifiers.py @@ -31,11 +31,6 @@ class SwapClassifier(Classifier): def get_classification() -> Classification: return Classification.swap - @staticmethod - @abstractmethod - def get_swap_recipient(trace: DecodedCallTrace) -> str: - raise NotImplementedError() - @staticmethod @abstractmethod def parse_swap( From a9859a0b12e5d3c21ec00fc7cfa9c34440239854 Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Fri, 19 Nov 2021 10:58:35 -0500 Subject: [PATCH 10/17] Add database migration --- ...rename_pool_address_to_contract_address.py | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 alembic/versions/0cef835f7b36_rename_pool_address_to_contract_address.py diff --git a/alembic/versions/0cef835f7b36_rename_pool_address_to_contract_address.py b/alembic/versions/0cef835f7b36_rename_pool_address_to_contract_address.py new file mode 100644 index 0000000..c519828 --- /dev/null +++ b/alembic/versions/0cef835f7b36_rename_pool_address_to_contract_address.py @@ -0,0 +1,27 @@ +"""Rename pool_address to contract_address + +Revision ID: 0cef835f7b36 +Revises: 5427d62a2cc0 +Create Date: 2021-11-19 15:36:15.152622 + +""" +from alembic import op + + +# revision identifiers, used by Alembic. +revision = "0cef835f7b36" +down_revision = "5427d62a2cc0" +branch_labels = None +depends_on = None + + +def upgrade(): + op.alter_column( + "swaps", "pool_address", nullable=False, new_column_name="contract_address" + ) + + +def downgrade(): + op.alter_column( + "swaps", "contract_address", nullable=False, new_column_name="pool_address" + ) From 8c699ed7cc98e8fcb072d5b099b234bd0bb1cced Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Fri, 19 Nov 2021 10:59:08 -0500 Subject: [PATCH 11/17] Alter schema --- mev_inspect/classifiers/swaps.py | 2 +- mev_inspect/schemas/swaps.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mev_inspect/classifiers/swaps.py b/mev_inspect/classifiers/swaps.py index 601eca7..58d6440 100644 --- a/mev_inspect/classifiers/swaps.py +++ b/mev_inspect/classifiers/swaps.py @@ -43,7 +43,7 @@ def create_swap_from_transfers( transaction_hash=trace.transaction_hash, block_number=trace.block_number, trace_address=trace.trace_address, - pool_address=pool_address, + contract_address=pool_address, protocol=trace.protocol, from_address=transfer_in.from_address, to_address=transfer_out.to_address, diff --git a/mev_inspect/schemas/swaps.py b/mev_inspect/schemas/swaps.py index b702cf6..477898a 100644 --- a/mev_inspect/schemas/swaps.py +++ b/mev_inspect/schemas/swaps.py @@ -10,7 +10,7 @@ class Swap(BaseModel): transaction_hash: str block_number: int trace_address: List[int] - pool_address: str + contract_address: str from_address: str to_address: str token_in_address: str From 45c9980a7994ef2b16c2066fbde137a3bbde9332 Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Fri, 19 Nov 2021 11:00:14 -0500 Subject: [PATCH 12/17] Add contract_address to tests --- tests/helpers.py | 4 ++-- tests/test_arbitrages.py | 14 +++++++------- tests/test_swaps.py | 12 ++++++------ 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/tests/helpers.py b/tests/helpers.py index d28e990..bae7b30 100644 --- a/tests/helpers.py +++ b/tests/helpers.py @@ -44,7 +44,7 @@ def make_swap_trace( transaction_hash: str, trace_address: List[int], from_address: str, - pool_address: str, + contract_address: str, abi_name: str, function_signature: str, protocol: Optional[Protocol], @@ -60,7 +60,7 @@ def make_swap_trace( subtraces=0, classification=Classification.swap, from_address=from_address, - to_address=pool_address, + to_address=contract_address, function_name="swap", function_signature=function_signature, inputs={recipient_input_key: recipient_address}, diff --git a/tests/test_arbitrages.py b/tests/test_arbitrages.py index 5ac6d52..fb07e9d 100644 --- a/tests/test_arbitrages.py +++ b/tests/test_arbitrages.py @@ -32,7 +32,7 @@ def test_two_pool_arbitrage(get_transaction_hashes, get_addresses): transaction_hash=transaction_hash, block_number=block_number, trace_address=[0], - pool_address=first_pool_address, + contract_address=first_pool_address, from_address=account_address, to_address=second_pool_address, token_in_address=first_token_address, @@ -45,7 +45,7 @@ def test_two_pool_arbitrage(get_transaction_hashes, get_addresses): transaction_hash=transaction_hash, block_number=block_number, trace_address=[1], - pool_address=second_pool_address, + contract_address=second_pool_address, from_address=first_pool_address, to_address=account_address, token_in_address=second_token_address, @@ -60,7 +60,7 @@ def test_two_pool_arbitrage(get_transaction_hashes, get_addresses): transaction_hash=transaction_hash, block_number=block_number, trace_address=[2, 0], - pool_address=unrelated_pool_address, + contract_address=unrelated_pool_address, from_address=account_address, to_address=account_address, token_in_address=second_token_address, @@ -113,7 +113,7 @@ def test_three_pool_arbitrage(get_transaction_hashes, get_addresses): transaction_hash=transaction_hash, block_number=block_number, trace_address=[0], - pool_address=first_pool_address, + contract_address=first_pool_address, from_address=account_address, to_address=second_pool_address, token_in_address=first_token_address, @@ -126,7 +126,7 @@ def test_three_pool_arbitrage(get_transaction_hashes, get_addresses): transaction_hash=transaction_hash, block_number=block_number, trace_address=[1], - pool_address=second_pool_address, + contract_address=second_pool_address, from_address=first_pool_address, to_address=third_pool_address, token_in_address=second_token_address, @@ -139,7 +139,7 @@ def test_three_pool_arbitrage(get_transaction_hashes, get_addresses): transaction_hash=transaction_hash, block_number=block_number, trace_address=[2], - pool_address=third_pool_address, + contract_address=third_pool_address, from_address=second_pool_address, to_address=account_address, token_in_address=third_token_address, @@ -220,7 +220,7 @@ def create_generic_swap( transaction_hash="0xfake", block_number=0, trace_address=trace_address, - pool_address="0xfake", + contract_address="0xfake", from_address="0xfake", to_address="0xfake", token_in_address=tok_a, diff --git a/tests/test_swaps.py b/tests/test_swaps.py index a4fdefa..68e9071 100644 --- a/tests/test_swaps.py +++ b/tests/test_swaps.py @@ -63,7 +63,7 @@ def test_swaps( first_transaction_hash, trace_address=[1], from_address=alice_address, - pool_address=first_pool_address, + contract_address=first_pool_address, abi_name=UNISWAP_V2_PAIR_ABI_NAME, protocol=None, function_signature="swap(uint256,uint256,address,bytes)", @@ -84,7 +84,7 @@ def test_swaps( second_transaction_hash, trace_address=[], from_address=bob_address, - pool_address=second_pool_address, + contract_address=second_pool_address, abi_name=UNISWAP_V3_POOL_ABI_NAME, protocol=None, function_signature="swap(address,bool,int256,uint160,bytes)", @@ -132,7 +132,7 @@ def test_swaps( third_transaction_hash, trace_address=[6], from_address=bob_address, - pool_address=third_pool_address, + contract_address=third_pool_address, abi_name=BALANCER_V1_POOL_ABI_NAME, protocol=Protocol.balancer_v1, function_signature="swapExactAmountIn(address,uint256,address,uint256,uint256)", @@ -160,7 +160,7 @@ def test_swaps( assert uni_v2_swap.block_number == block_number assert uni_v2_swap.trace_address == [1] assert uni_v2_swap.protocol is None - assert uni_v2_swap.pool_address == first_pool_address + assert uni_v2_swap.contract_address == first_pool_address assert uni_v2_swap.from_address == alice_address assert uni_v2_swap.to_address == bob_address assert uni_v2_swap.token_in_address == first_token_in_address @@ -173,7 +173,7 @@ def test_swaps( assert uni_v3_swap.block_number == block_number assert uni_v3_swap.trace_address == [] assert uni_v3_swap.protocol is None - assert uni_v3_swap.pool_address == second_pool_address + assert uni_v3_swap.contract_address == second_pool_address assert uni_v3_swap.from_address == bob_address assert uni_v3_swap.to_address == carl_address assert uni_v3_swap.token_in_address == second_token_in_address @@ -186,7 +186,7 @@ def test_swaps( assert bal_v1_swap.block_number == block_number assert bal_v1_swap.trace_address == [6] assert bal_v1_swap.protocol == Protocol.balancer_v1 - assert bal_v1_swap.pool_address == third_pool_address + assert bal_v1_swap.contract_address == third_pool_address assert bal_v1_swap.from_address == bob_address assert bal_v1_swap.to_address == bob_address assert bal_v1_swap.token_in_address == third_token_in_address From 12a82e918b773d7c654a24b04ea398b20dbf949d Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Fri, 19 Nov 2021 11:03:06 -0500 Subject: [PATCH 13/17] Add contract_address in arbs --- mev_inspect/arbitrages.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mev_inspect/arbitrages.py b/mev_inspect/arbitrages.py index 40529d7..c13c8fe 100644 --- a/mev_inspect/arbitrages.py +++ b/mev_inspect/arbitrages.py @@ -86,7 +86,7 @@ def _get_all_start_end_swaps(swaps: List[Swap]) -> List[Tuple[Swap, Swap]]: - not swap[start].from_address in all_pool_addresses - not swap[end].to_address in all_pool_addresses """ - pool_addrs = [swap.pool_address for swap in swaps] + pool_addrs = [swap.contract_address for swap in swaps] valid_start_ends: List[Tuple[Swap, Swap]] = [] for potential_start_swap in swaps: for potential_end_swap in swaps: @@ -116,8 +116,8 @@ def _get_all_routes( routes: List[List[Swap]] = [] for potential_next_swap in other_swaps: if start_swap.token_out_address == potential_next_swap.token_in_address and ( - start_swap.pool_address == potential_next_swap.from_address - or start_swap.to_address == potential_next_swap.pool_address + start_swap.contract_address == potential_next_swap.from_address + or start_swap.to_address == potential_next_swap.contract_address or start_swap.to_address == potential_next_swap.from_address ): remaining_swaps = [ From d2e1c588c42c1c1180bca3272c8c844fc71e14f6 Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Fri, 19 Nov 2021 19:21:46 -0500 Subject: [PATCH 14/17] Change shell directory --- mev | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mev b/mev index 7d7f79f..f9feafe 100755 --- a/mev +++ b/mev @@ -1,4 +1,4 @@ -#!/bin/sh +#!/usr/bin/env bash set -e From dc02564862335e91a00def15c3ee6a0888cfb6d3 Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Mon, 22 Nov 2021 10:55:00 -0500 Subject: [PATCH 15/17] Add contract_address --- mev_inspect/models/swaps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mev_inspect/models/swaps.py b/mev_inspect/models/swaps.py index 6695fd0..132c014 100644 --- a/mev_inspect/models/swaps.py +++ b/mev_inspect/models/swaps.py @@ -11,7 +11,7 @@ class SwapModel(Base): block_number = Column(Numeric, nullable=False) trace_address = Column(ARRAY(Integer), nullable=False) protocol = Column(String, nullable=True) - pool_address = Column(String, nullable=False) + contract_address = Column(String, nullable=False) from_address = Column(String, nullable=False) to_address = Column(String, nullable=False) token_in_address = Column(String, nullable=False) From 784922fa07cc9f23b3dfbd348eca4fc069b4e180 Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Mon, 22 Nov 2021 12:07:30 -0500 Subject: [PATCH 16/17] Rename to helpers, add func --- mev_inspect/classifiers/{swaps.py => helpers.py} | 11 +++++++++++ mev_inspect/classifiers/specs/balancer.py | 2 +- mev_inspect/classifiers/specs/curve.py | 2 +- mev_inspect/classifiers/specs/uniswap.py | 2 +- 4 files changed, 14 insertions(+), 3 deletions(-) rename mev_inspect/classifiers/{swaps.py => helpers.py} (90%) diff --git a/mev_inspect/classifiers/swaps.py b/mev_inspect/classifiers/helpers.py similarity index 90% rename from mev_inspect/classifiers/swaps.py rename to mev_inspect/classifiers/helpers.py index 58d6440..b1f9d2d 100644 --- a/mev_inspect/classifiers/swaps.py +++ b/mev_inspect/classifiers/helpers.py @@ -84,3 +84,14 @@ def _filter_transfers( filtered_transfers.append(transfer) return filtered_transfers + + +def get_amount_transferred_to_address( + address: str, transfers: List[Transfer] +) -> Optional[int]: + + for transfer in transfers: + if transfer.to_address == address: + return transfer.amount + + raise ValueError(f"Transfer to {address} not found.") diff --git a/mev_inspect/classifiers/specs/balancer.py b/mev_inspect/classifiers/specs/balancer.py index 2614002..89ae1f1 100644 --- a/mev_inspect/classifiers/specs/balancer.py +++ b/mev_inspect/classifiers/specs/balancer.py @@ -9,7 +9,7 @@ from mev_inspect.schemas.classifiers import ( ClassifierSpec, SwapClassifier, ) -from mev_inspect.classifiers.swaps import create_swap_from_transfers +from mev_inspect.classifiers.helpers import create_swap_from_transfers BALANCER_V1_POOL_ABI_NAME = "BPool" diff --git a/mev_inspect/classifiers/specs/curve.py b/mev_inspect/classifiers/specs/curve.py index 08244ea..2762725 100644 --- a/mev_inspect/classifiers/specs/curve.py +++ b/mev_inspect/classifiers/specs/curve.py @@ -10,7 +10,7 @@ from mev_inspect.schemas.classifiers import ( ClassifierSpec, SwapClassifier, ) -from mev_inspect.classifiers.swaps import create_swap_from_transfers +from mev_inspect.classifiers.helpers import create_swap_from_transfers class CurveSwapClassifier(SwapClassifier): diff --git a/mev_inspect/classifiers/specs/uniswap.py b/mev_inspect/classifiers/specs/uniswap.py index 017668b..ce8b634 100644 --- a/mev_inspect/classifiers/specs/uniswap.py +++ b/mev_inspect/classifiers/specs/uniswap.py @@ -9,7 +9,7 @@ from mev_inspect.schemas.classifiers import ( ClassifierSpec, SwapClassifier, ) -from mev_inspect.classifiers.swaps import create_swap_from_transfers +from mev_inspect.classifiers.helpers import create_swap_from_transfers UNISWAP_V2_PAIR_ABI_NAME = "UniswapV2Pair" From 89c2ed3a84768b8a2a039f3110be89167a79414f Mon Sep 17 00:00:00 2001 From: Gui Heise Date: Mon, 22 Nov 2021 12:16:39 -0500 Subject: [PATCH 17/17] Remove func --- mev_inspect/classifiers/helpers.py | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/mev_inspect/classifiers/helpers.py b/mev_inspect/classifiers/helpers.py index b1f9d2d..58d6440 100644 --- a/mev_inspect/classifiers/helpers.py +++ b/mev_inspect/classifiers/helpers.py @@ -84,14 +84,3 @@ def _filter_transfers( filtered_transfers.append(transfer) return filtered_transfers - - -def get_amount_transferred_to_address( - address: str, transfers: List[Transfer] -) -> Optional[int]: - - for transfer in transfers: - if transfer.to_address == address: - return transfer.amount - - raise ValueError(f"Transfer to {address} not found.")