diff --git a/mev_inspect/schemas/transfers.py b/mev_inspect/schemas/transfers.py new file mode 100644 index 0000000..af14e73 --- /dev/null +++ b/mev_inspect/schemas/transfers.py @@ -0,0 +1,57 @@ +from typing import List, TypeVar + +from pydantic import BaseModel + +from .classified_traces import Classification, ClassifiedTrace, Protocol + + +class Transfer(BaseModel): + transaction_hash: str + trace_address: List[int] + from_address: str + to_address: str + amount: int + + +# To preserve the specific Transfer type +TransferGeneric = TypeVar("TransferGeneric", bound="Transfer") + + +class EthTransfer(Transfer): + @classmethod + def from_trace(cls, trace: ClassifiedTrace) -> "EthTransfer": + return cls( + transaction_hash=trace.transaction_hash, + trace_address=trace.trace_address, + amount=trace.value, + to_address=trace.to_address, + from_address=trace.from_address, + ) + + +class ERC20Transfer(Transfer): + token_address: str + + @classmethod + def from_trace(cls, trace: ClassifiedTrace) -> "ERC20Transfer": + if trace.classification != Classification.transfer or trace.inputs is None: + raise ValueError("Invalid transfer") + + if trace.protocol == Protocol.weth: + return cls( + transaction_hash=trace.transaction_hash, + trace_address=trace.trace_address, + amount=trace.inputs["wad"], + to_address=trace.inputs["dst"], + from_address=trace.from_address, + token_address=trace.to_address, + ) + else: + return cls( + transaction_hash=trace.transaction_hash, + trace_address=trace.trace_address, + amount=trace.inputs["amount"], + to_address=trace.inputs["recipient"], + from_address=trace.inputs.get("sender", trace.from_address), + token_address=trace.to_address, + ) diff --git a/mev_inspect/swaps.py b/mev_inspect/swaps.py index 6de342d..68fb77d 100644 --- a/mev_inspect/swaps.py +++ b/mev_inspect/swaps.py @@ -3,16 +3,12 @@ from typing import List, Optional from mev_inspect.schemas.classified_traces import ( ClassifiedTrace, Classification, - Swap, - Transfer, ) -<<<<<<< HEAD + from mev_inspect.schemas.swaps import Swap from mev_inspect.schemas.transfers import ERC20Transfer from mev_inspect.traces import get_traces_by_transaction_hash -======= ->>>>>>> Swamps, transfers, tests imp from mev_inspect.transfers import ( get_child_transfers, filter_transfers, diff --git a/mev_inspect/transfers.py b/mev_inspect/transfers.py index 361d1ce..2e53807 100644 --- a/mev_inspect/transfers.py +++ b/mev_inspect/transfers.py @@ -1,15 +1,12 @@ from typing import Dict, List, Optional, Sequence -<<<<<<< HEAD -from mev_inspect.schemas.classified_traces import Classification, ClassifiedTrace from mev_inspect.schemas.transfers import ERC20Transfer, EthTransfer, TransferGeneric -======= + from mev_inspect.schemas.classified_traces import ( Classification, ClassifiedTrace, - Transfer, ) ->>>>>>> Swamps, transfers, tests imp + from mev_inspect.traces import is_child_trace_address, get_child_traces diff --git a/tests/test_transfers.py b/tests/test_transfers.py index 4883422..ad97ff5 100644 --- a/tests/test_transfers.py +++ b/tests/test_transfers.py @@ -1,8 +1,4 @@ -<<<<<<< HEAD from mev_inspect.schemas.transfers import ERC20Transfer -======= -from mev_inspect.schemas.classified_traces import Transfer ->>>>>>> Swamps, transfers, tests imp from mev_inspect.transfers import remove_child_transfers_of_transfers