From 2cc7ac4a20001481216e5dbd52efd349cd74ab4c Mon Sep 17 00:00:00 2001 From: Robert Miller Date: Thu, 25 Nov 2021 21:05:42 -0500 Subject: [PATCH 1/7] feat: initial files for punk database --- mev_inspect/crud/punks.py | 30 ++++++++++++++++++++++++++++++ mev_inspect/inspect_block.py | 4 ++++ mev_inspect/models/punk_snipes.py | 15 +++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 mev_inspect/crud/punks.py create mode 100644 mev_inspect/models/punk_snipes.py 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) From 947e5921c70737676152533f8e5cb7f0b4668c52 Mon Sep 17 00:00:00 2001 From: Robert Miller Date: Fri, 26 Nov 2021 15:10:37 -0500 Subject: [PATCH 2/7] feat: add alembic for punk snipes --- .../070819d86587_create_punk_snipe.py | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 alembic/versions/070819d86587_create_punk_snipe.py diff --git a/alembic/versions/070819d86587_create_punk_snipe.py b/alembic/versions/070819d86587_create_punk_snipe.py new file mode 100644 index 0000000..cdb812c --- /dev/null +++ b/alembic/versions/070819d86587_create_punk_snipe.py @@ -0,0 +1,35 @@ +"""empty message + +Revision ID: 070819d86587 +Revises: d498bdb0a641 +Create Date: 2021-11-26 18:25:13.402822 + +""" +import sqlalchemy as sa +from alembic import op + + +# revision identifiers, used by Alembic. +revision = "d498bdb0a641" +down_revision = "205ce02374b3" +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + "punk_snipes", + 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_acceptance_price", sa.Numeric, nullable=False), + sa.Column("acceptance_price", sa.Numeric, nullable=False), + sa.PrimaryKeyConstraint("transaction_hash", "trace_address"), + ) + + +def downgrade(): + op.drop_table("liquidations") From 7bfe77a18fc16fd1c08e76c8879e44ad1777450a Mon Sep 17 00:00:00 2001 From: Robert Miller Date: Fri, 26 Nov 2021 15:22:45 -0500 Subject: [PATCH 3/7] bug: fix punk_snipe alembic file --- alembic/versions/070819d86587_create_punk_snipe.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alembic/versions/070819d86587_create_punk_snipe.py b/alembic/versions/070819d86587_create_punk_snipe.py index cdb812c..fb50166 100644 --- a/alembic/versions/070819d86587_create_punk_snipe.py +++ b/alembic/versions/070819d86587_create_punk_snipe.py @@ -32,4 +32,4 @@ def upgrade(): def downgrade(): - op.drop_table("liquidations") + op.drop_table("punk_snipes") From 71c549b6f3d3727e43fb96012141414bb10e6dcd Mon Sep 17 00:00:00 2001 From: Robert Miller Date: Fri, 26 Nov 2021 15:33:07 -0500 Subject: [PATCH 4/7] feat: add punk_bids database --- .../versions/7cf0eeb41da0_add_punk_bids.py | 34 +++++++++++++++++++ mev_inspect/crud/punks.py | 30 +++++++++++++++- mev_inspect/inspect_block.py | 10 +++++- mev_inspect/models/punks.py | 26 ++++++++++++++ 4 files changed, 98 insertions(+), 2 deletions(-) create mode 100644 alembic/versions/7cf0eeb41da0_add_punk_bids.py create mode 100644 mev_inspect/models/punks.py 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) From c619c208781f0738c7828d750c0bc9277b619a42 Mon Sep 17 00:00:00 2001 From: Robert Miller Date: Fri, 26 Nov 2021 21:29:53 -0500 Subject: [PATCH 5/7] bug: add a missing parentheses --- mev_inspect/inspect_block.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mev_inspect/inspect_block.py b/mev_inspect/inspect_block.py index c56e024..361f28a 100644 --- a/mev_inspect/inspect_block.py +++ b/mev_inspect/inspect_block.py @@ -17,7 +17,7 @@ from mev_inspect.crud.punks import ( write_punk_snipes, delete_punk_bids_for_block, write_punk_bids, - +) from mev_inspect.crud.blocks import ( delete_block, write_block, From c1ba63ef8154783757687946acc8c3ba3cb1084a Mon Sep 17 00:00:00 2001 From: Robert Miller Date: Fri, 26 Nov 2021 21:34:16 -0500 Subject: [PATCH 6/7] style: formatting --- mev_inspect/inspect_block.py | 1 - 1 file changed, 1 deletion(-) diff --git a/mev_inspect/inspect_block.py b/mev_inspect/inspect_block.py index 361f28a..0014c03 100644 --- a/mev_inspect/inspect_block.py +++ b/mev_inspect/inspect_block.py @@ -21,7 +21,6 @@ from mev_inspect.crud.punks import ( from mev_inspect.crud.blocks import ( delete_block, write_block, - ) from mev_inspect.crud.traces import ( delete_classified_traces_for_block, From 622cf9319ed6b7105c233c4a409a615a24131fad Mon Sep 17 00:00:00 2001 From: Robert Miller Date: Sat, 4 Dec 2021 20:31:46 -0500 Subject: [PATCH 7/7] style: formatting --- alembic/versions/7cf0eeb41da0_add_punk_bids.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alembic/versions/7cf0eeb41da0_add_punk_bids.py b/alembic/versions/7cf0eeb41da0_add_punk_bids.py index fabf2f6..0e93350 100644 --- a/alembic/versions/7cf0eeb41da0_add_punk_bids.py +++ b/alembic/versions/7cf0eeb41da0_add_punk_bids.py @@ -26,7 +26,7 @@ def upgrade(): 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"), + sa.PrimaryKeyConstraint("block_number", "transaction_hash", "trace_address"), )