diff --git a/mev_inspect/crud/punks.py b/mev_inspect/crud/punks.py new file mode 100644 index 0000000..5727f42 --- /dev/null +++ b/mev_inspect/crud/punks.py @@ -0,0 +1,30 @@ +import json +from typing import List + +from mev_inspect.models.punk_snipes import PunkSnipeModel +from mev_inspect.schemas.punk_snipe import PunkSnipe + + +def delete_punk_snipes_for_block( + db_session, + block_number: int, +) -> None: + ( + db_session.query(PunkSnipeModel) + .filter(PunkSnipeModel.block_number == block_number) + .delete() + ) + + db_session.commit() + + +def write_punk_snipes( + db_session, + punk_snipes: List[PunkSnipe], +) -> None: + models = [ + PunkSnipeModel(**json.loads(punk_snipe.json())) for punk_snipe in punk_snipes + ] + + db_session.bulk_save_objects(models) + db_session.commit() diff --git a/mev_inspect/inspect_block.py b/mev_inspect/inspect_block.py index d55eecc..8b6b45f 100644 --- a/mev_inspect/inspect_block.py +++ b/mev_inspect/inspect_block.py @@ -11,6 +11,7 @@ from mev_inspect.crud.arbitrages import ( delete_arbitrages_for_block, write_arbitrages, ) +from mev_inspect.crud.punks import delete_punk_snipes_for_block, write_punk_snipes from mev_inspect.crud.traces import ( delete_classified_traces_for_block, write_classified_traces, @@ -98,6 +99,9 @@ async def inspect_block( punk_snipes = get_punk_snipes(punk_bids, punk_bid_acceptances) logger.info(f"Block: {block_number} -- Found {len(punk_snipes)} punk snipes") + delete_punk_snipes_for_block(inspect_db_session, block_number) + write_punk_snipes(inspect_db_session, punk_snipes) + miner_payments = get_miner_payments( block.miner, block.base_fee_per_gas, classified_traces, block.receipts ) diff --git a/mev_inspect/models/punk_snipes.py b/mev_inspect/models/punk_snipes.py new file mode 100644 index 0000000..71cabac --- /dev/null +++ b/mev_inspect/models/punk_snipes.py @@ -0,0 +1,15 @@ +from sqlalchemy import Column, Numeric, String, ARRAY, Integer + +from .base import Base + + +class PunkSnipeModel(Base): + __tablename__ = "punk_snipes" + + block_number = Column(Numeric, nullable=False) + transaction_hash = Column(String, primary_key=True) + trace_address = Column(ARRAY(Integer), primary_key=True) + from_address = Column(String, nullable=False) + punk_index = Column(Integer, nullable=False) + min_acceptance_price = Column(Numeric, nullable=False) + acceptance_price = Column(Numeric, nullable=False)