diff --git a/alembic/versions/7cf0eeb41da0_add_punk_bids.py b/alembic/versions/7cf0eeb41da0_add_punk_bids.py new file mode 100644 index 0000000..fabf2f6 --- /dev/null +++ b/alembic/versions/7cf0eeb41da0_add_punk_bids.py @@ -0,0 +1,34 @@ +"""empty message + +Revision ID: 7cf0eeb41da0 +Revises: d498bdb0a641 +Create Date: 2021-11-26 20:27:28.936516 + +""" +import sqlalchemy as sa +from alembic import op + + +# revision identifiers, used by Alembic. +revision = "7cf0eeb41da0" +down_revision = "d498bdb0a641" +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + "punk_bids", + 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("price", sa.Numeric, nullable=False), + sa.PrimaryKeyConstraint("transaction_hash", "trace_address"), + ) + + +def downgrade(): + op.drop_table("punk_bids") diff --git a/mev_inspect/crud/punks.py b/mev_inspect/crud/punks.py index 5727f42..7126287 100644 --- a/mev_inspect/crud/punks.py +++ b/mev_inspect/crud/punks.py @@ -1,9 +1,37 @@ import json from typing import List -from mev_inspect.models.punk_snipes import PunkSnipeModel +from mev_inspect.models.punks import ( + PunkSnipeModel, + PunkBidModel, +) from mev_inspect.schemas.punk_snipe import PunkSnipe +from mev_inspect.schemas.punk_bid import PunkBid + + +def delete_punk_bids_for_block( + db_session, + block_number: int, +) -> None: + ( + db_session.query(PunkBidModel) + .filter(PunkBidModel.block_number == block_number) + .delete() + ) + + db_session.commit() + + +def write_punk_bids( + db_session, + punk_bids: List[PunkBid], +) -> None: + models = [PunkBidModel(**json.loads(punk_bid.json())) for punk_bid in punk_bids] + + db_session.bulk_save_objects(models) + db_session.commit() + def delete_punk_snipes_for_block( db_session, diff --git a/mev_inspect/inspect_block.py b/mev_inspect/inspect_block.py index 8b6b45f..47a286c 100644 --- a/mev_inspect/inspect_block.py +++ b/mev_inspect/inspect_block.py @@ -11,7 +11,12 @@ 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.punks import ( + delete_punk_snipes_for_block, + write_punk_snipes, + delete_punk_bids_for_block, + write_punk_bids, +) from mev_inspect.crud.traces import ( delete_classified_traces_for_block, write_classified_traces, @@ -94,6 +99,9 @@ async def inspect_block( write_liquidations(inspect_db_session, liquidations) punk_bids = get_punk_bids(classified_traces) + delete_punk_bids_for_block(inspect_db_session, block_number) + write_punk_bids(inspect_db_session, punk_bids) + punk_bid_acceptances = get_punk_bid_acceptances(classified_traces) punk_snipes = get_punk_snipes(punk_bids, punk_bid_acceptances) diff --git a/mev_inspect/models/punks.py b/mev_inspect/models/punks.py new file mode 100644 index 0000000..06dfa32 --- /dev/null +++ b/mev_inspect/models/punks.py @@ -0,0 +1,26 @@ +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) + + +class PunkBidModel(Base): + __tablename__ = "punk_bids" + + 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) + price = Column(Numeric, nullable=False)