From 07aa6e3089dce658da4d9b00c38d8bd7cc382684 Mon Sep 17 00:00:00 2001 From: Robert Miller Date: Fri, 26 Nov 2021 15:42:36 -0500 Subject: [PATCH] feat: add punk_bid_acceptances database --- .../52d75a7e0533_add_punk_bid_acceptances.py | 34 +++++++++++++++++++ mev_inspect/crud/punks.py | 29 +++++++++++++++- mev_inspect/inspect_block.py | 4 +++ mev_inspect/models/punks.py | 11 ++++++ 4 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 alembic/versions/52d75a7e0533_add_punk_bid_acceptances.py diff --git a/alembic/versions/52d75a7e0533_add_punk_bid_acceptances.py b/alembic/versions/52d75a7e0533_add_punk_bid_acceptances.py new file mode 100644 index 0000000..6858101 --- /dev/null +++ b/alembic/versions/52d75a7e0533_add_punk_bid_acceptances.py @@ -0,0 +1,34 @@ +"""empty message + +Revision ID: 52d75a7e0533 +Revises: 7cf0eeb41da0 +Create Date: 2021-11-26 20:35:58.954138 + +""" +import sqlalchemy as sa +from alembic import op + + +# revision identifiers, used by Alembic. +revision = "52d75a7e0533" +down_revision = "7cf0eeb41da0" +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + "punk_bid_acceptances", + sa.Column("created_at", sa.TIMESTAMP, server_default=sa.func.now()), + sa.Column("block_number", sa.Numeric, nullable=False), + sa.Column("transaction_hash", sa.String(66), nullable=False), + sa.Column("trace_address", sa.String(256), nullable=False), + sa.Column("from_address", sa.String(256), nullable=False), + sa.Column("punk_index", sa.Numeric, nullable=False), + sa.Column("min_price", sa.Numeric, nullable=False), + sa.PrimaryKeyConstraint("transaction_hash", "trace_address"), + ) + + +def downgrade(): + op.drop_table("punk_bid_acceptances") diff --git a/mev_inspect/crud/punks.py b/mev_inspect/crud/punks.py index 7126287..7f4c819 100644 --- a/mev_inspect/crud/punks.py +++ b/mev_inspect/crud/punks.py @@ -4,10 +4,37 @@ from typing import List from mev_inspect.models.punks import ( PunkSnipeModel, PunkBidModel, + PunkBidAcceptanceModel, ) from mev_inspect.schemas.punk_snipe import PunkSnipe - from mev_inspect.schemas.punk_bid import PunkBid +from mev_inspect.schemas.punk_accept_bid import PunkBidAcceptance + + +def delete_punk_bid_acceptances_for_block( + db_session, + block_number: int, +) -> None: + ( + db_session.query(PunkBidAcceptanceModel) + .filter(PunkBidAcceptanceModel.block_number == block_number) + .delete() + ) + + db_session.commit() + + +def write_punk_bid_acceptances( + db_session, + punk_bid_acceptances: List[PunkBidAcceptance], +) -> None: + models = [ + PunkBidAcceptanceModel(**json.loads(punk_bid_acceptance.json())) + for punk_bid_acceptance in punk_bid_acceptances + ] + + db_session.bulk_save_objects(models) + db_session.commit() def delete_punk_bids_for_block( diff --git a/mev_inspect/inspect_block.py b/mev_inspect/inspect_block.py index 47a286c..73bec98 100644 --- a/mev_inspect/inspect_block.py +++ b/mev_inspect/inspect_block.py @@ -16,6 +16,8 @@ from mev_inspect.crud.punks import ( write_punk_snipes, delete_punk_bids_for_block, write_punk_bids, + delete_punk_bid_acceptances_for_block, + write_punk_bid_acceptances, ) from mev_inspect.crud.traces import ( delete_classified_traces_for_block, @@ -103,6 +105,8 @@ async def inspect_block( write_punk_bids(inspect_db_session, punk_bids) punk_bid_acceptances = get_punk_bid_acceptances(classified_traces) + delete_punk_bid_acceptances_for_block(inspect_db_session, block_number) + write_punk_bid_acceptances(inspect_db_session, punk_bid_acceptances) punk_snipes = get_punk_snipes(punk_bids, punk_bid_acceptances) logger.info(f"Block: {block_number} -- Found {len(punk_snipes)} punk snipes") diff --git a/mev_inspect/models/punks.py b/mev_inspect/models/punks.py index 06dfa32..4f1560f 100644 --- a/mev_inspect/models/punks.py +++ b/mev_inspect/models/punks.py @@ -24,3 +24,14 @@ class PunkBidModel(Base): from_address = Column(String, nullable=False) punk_index = Column(Integer, nullable=False) price = Column(Numeric, nullable=False) + + +class PunkBidAcceptanceModel(Base): + __tablename__ = "punk_bid_acceptances" + + 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_price = Column(Numeric, nullable=False)