From 377137d9c8757286eaae03f40b4efeac5dc142a1 Mon Sep 17 00:00:00 2001 From: Robert Miller Date: Fri, 19 Nov 2021 17:18:29 -0600 Subject: [PATCH] feat: add support for punk snipes --- mev_inspect/inspect_block.py | 9 ++++---- mev_inspect/punks.py | 35 +++++++++++++++++++++++++------ mev_inspect/schemas/punk_snipe.py | 13 ++++++++++++ 3 files changed, 47 insertions(+), 10 deletions(-) create mode 100644 mev_inspect/schemas/punk_snipe.py diff --git a/mev_inspect/inspect_block.py b/mev_inspect/inspect_block.py index ca473bd..41810c8 100644 --- a/mev_inspect/inspect_block.py +++ b/mev_inspect/inspect_block.py @@ -27,7 +27,8 @@ from mev_inspect.crud.liquidations import ( write_liquidations, ) from mev_inspect.miner_payments import get_miner_payments -from mev_inspect.punks import get_punk_bid_acceptances, get_punk_bids +from mev_inspect.punks import get_punk_bid_acceptances, get_punk_bids, get_punk_snipes +from mev_inspect.schemas import punk_snipe from mev_inspect.swaps import get_swaps from mev_inspect.transfers import get_transfers from mev_inspect.liquidations import get_liquidations @@ -93,10 +94,10 @@ async def inspect_block( write_liquidations(inspect_db_session, liquidations) punk_bids = get_punk_bids(classified_traces) - logger.info(f"Block: {block_number} -- Found {len(punk_bids)} punk bids") - punk_bid_acceptances = get_punk_bid_acceptances(classified_traces) - logger.info(f"Block: {block_number} -- Found {len(punk_bid_acceptances)} punk bids") + + punk_snipes = get_punk_snipes(punk_bids, punk_bid_acceptances) + logger.info(f"Block: {block_number} -- Found {len(punk_snipes)} punk snipes") miner_payments = get_miner_payments( block.miner, block.base_fee_per_gas, classified_traces, block.receipts diff --git a/mev_inspect/punks.py b/mev_inspect/punks.py index 4f45197..bce838f 100644 --- a/mev_inspect/punks.py +++ b/mev_inspect/punks.py @@ -1,6 +1,4 @@ from typing import List -from mev_inspect.schemas import punk_accept_bid - from mev_inspect.schemas.traces import ( ClassifiedTrace, Classification, @@ -8,9 +6,34 @@ from mev_inspect.schemas.traces import ( ) from mev_inspect.schemas.punk_bid import PunkBid from mev_inspect.schemas.punk_accept_bid import PunkBidAcceptance +from mev_inspect.schemas.punk_snipe import PunkSnipe from mev_inspect.traces import get_traces_by_transaction_hash +def get_punk_snipes( + punk_bids: List[PunkBid], punk_bid_acceptances: List[PunkBidAcceptance] +) -> List[PunkSnipe]: + punk_snipe_list = [] + + for punk_bid in punk_bids: + for punk_bid_acceptance in punk_bid_acceptances: + if punk_bid.punk_index == punk_bid_acceptance.punk_index: + if punk_bid.amount > punk_bid_acceptance.min_price: + punk_snipe = PunkSnipe( + block_number=punk_bid.block_number, + transaction_hash=punk_bid.transaction_hash, + trace_address=punk_bid.trace_address, + from_address=punk_bid.from_address, + punk_index=punk_bid.punk_index, + min_acceptance_price=punk_bid_acceptance.min_price, + acceptance_price=punk_bid.amount, + ) + + punk_snipe_list.append(punk_snipe) + + return punk_snipe_list + + def get_punk_bid_acceptances(traces: List[ClassifiedTrace]) -> List[PunkBidAcceptance]: punk_bid_acceptances = [] @@ -39,8 +62,8 @@ def _get_punk_bid_acceptances_for_transaction( transaction_hash=trace.transaction_hash, trace_address=trace.trace_address, from_address=trace.from_address, - punk_index=trace.inputs["punk_index"], - min_price=trace.inputs["min_price"], + punk_index=trace.inputs["punkIndex"], + min_price=trace.inputs["minPrice"], ) punk_bid_acceptances.append(punk_accept_bid) @@ -72,8 +95,8 @@ def _get_punk_bids_for_transaction(traces: List[ClassifiedTrace]) -> List[PunkBi block_number=trace.block_number, trace_address=trace.trace_address, from_address=trace.from_address, - punk_index=trace.inputs["punk_index"], - value=trace.value, + punk_index=trace.inputs["punkIndex"], + amount=trace.value, ) punk_bids.append(punk_bid) diff --git a/mev_inspect/schemas/punk_snipe.py b/mev_inspect/schemas/punk_snipe.py new file mode 100644 index 0000000..6890802 --- /dev/null +++ b/mev_inspect/schemas/punk_snipe.py @@ -0,0 +1,13 @@ +from typing import List + +from pydantic import BaseModel + + +class PunkSnipe(BaseModel): + block_number: int + transaction_hash: str + trace_address: List[int] + from_address: str + punk_index: int + min_acceptance_price: int + acceptance_price: int