diff --git a/alembic/versions/9d8c69b3dccb_add_arbitrages_and_swap_join_table.py b/alembic/versions/9d8c69b3dccb_add_arbitrages_and_swap_join_table.py new file mode 100644 index 0000000..69d42a1 --- /dev/null +++ b/alembic/versions/9d8c69b3dccb_add_arbitrages_and_swap_join_table.py @@ -0,0 +1,35 @@ +"""Add arbitrages and swap join table + +Revision ID: 9d8c69b3dccb +Revises: 2116e2f36a19 +Create Date: 2021-08-05 21:46:35.209199 + +""" +import sqlalchemy as sa +from alembic import op + + +# revision identifiers, used by Alembic. +revision = "9d8c69b3dccb" +down_revision = "2116e2f36a19" +branch_labels = None +depends_on = None + + +def upgrade(): + op.create_table( + "arbitrages", + sa.Column("id", sa.String(256), primary_key=True), + sa.Column("created_at", sa.TIMESTAMP, server_default=sa.func.now()), + sa.Column("account_address", sa.String(256), nullable=False), + sa.Column("profit_token_address", sa.String(256), nullable=False), + sa.Column("block_number", sa.Numeric, nullable=False), + sa.Column("transaction_hash", sa.String(256), nullable=False), + sa.Column("start_amount", sa.Numeric, nullable=False), + sa.Column("end_amount", sa.Numeric, nullable=False), + sa.Column("profit_amount", sa.Numeric, nullable=False), + ) + + +def downgrade(): + op.drop_table("arbitrages") diff --git a/mev_inspect/arbitrage.py b/mev_inspect/arbitrages.py similarity index 93% rename from mev_inspect/arbitrage.py rename to mev_inspect/arbitrages.py index f2fe761..08c13f4 100644 --- a/mev_inspect/arbitrage.py +++ b/mev_inspect/arbitrages.py @@ -1,7 +1,7 @@ from itertools import groupby from typing import List, Optional -from mev_inspect.schemas.arbitrage import Arbitrage +from mev_inspect.schemas.arbitrages import Arbitrage from mev_inspect.schemas.swaps import Swap @@ -70,6 +70,8 @@ def _get_arbitrage_starting_with_swap( return Arbitrage( swaps=swap_path, + block_number=start_swap.block_number, + transaction_hash=start_swap.transaction_hash, account_address=start_swap.from_address, profit_token_address=start_swap.token_in_address, start_amount=start_amount, diff --git a/mev_inspect/crud/arbitrages.py b/mev_inspect/crud/arbitrages.py new file mode 100644 index 0000000..25b6f50 --- /dev/null +++ b/mev_inspect/crud/arbitrages.py @@ -0,0 +1,40 @@ +from typing import List +from uuid import uuid4 + +from mev_inspect.models.arbitrages import ArbitrageModel +from mev_inspect.schemas.arbitrages import Arbitrage + + +def delete_arbitrages_for_block( + db_session, + block_number: int, +) -> None: + ( + db_session.query(ArbitrageModel) + .filter(ArbitrageModel.block_number == block_number) + .delete() + ) + + db_session.commit() + + +def write_arbitrages( + db_session, + arbitrages: List[Arbitrage], +) -> None: + arbitrage_models = [ + ArbitrageModel( + id=str(uuid4()), + block_number=arbitrage.block_number, + transaction_hash=arbitrage.transaction_hash, + account_address=arbitrage.account_address, + profit_token_address=arbitrage.profit_token_address, + start_amount=arbitrage.start_amount, + end_amount=arbitrage.end_amount, + profit_amount=arbitrage.profit_amount, + ) + for arbitrage in arbitrages + ] + + db_session.bulk_save_objects(arbitrage_models) + db_session.commit() diff --git a/mev_inspect/models/arbitrages.py b/mev_inspect/models/arbitrages.py new file mode 100644 index 0000000..a4dafb6 --- /dev/null +++ b/mev_inspect/models/arbitrages.py @@ -0,0 +1,16 @@ +from sqlalchemy import Column, Numeric, String + +from .base import Base + + +class ArbitrageModel(Base): + __tablename__ = "arbitrages" + + id = Column(String, primary_key=True) + block_number = Column(Numeric, nullable=False) + transaction_hash = Column(String, nullable=False) + account_address = Column(String, nullable=False) + profit_token_address = Column(String, nullable=False) + start_amount = Column(Numeric, nullable=False) + end_amount = Column(Numeric, nullable=False) + profit_amount = Column(Numeric, nullable=False) diff --git a/mev_inspect/schemas/arbitrage.py b/mev_inspect/schemas/arbitrages.py similarity index 84% rename from mev_inspect/schemas/arbitrage.py rename to mev_inspect/schemas/arbitrages.py index 484ed9d..0c39917 100644 --- a/mev_inspect/schemas/arbitrage.py +++ b/mev_inspect/schemas/arbitrages.py @@ -7,6 +7,8 @@ from .swaps import Swap class Arbitrage(BaseModel): swaps: List[Swap] + block_number: int + transaction_hash: str account_address: str profit_token_address: str start_amount: int diff --git a/scripts/inspect_block.py b/scripts/inspect_block.py index 0929c59..c7305ff 100644 --- a/scripts/inspect_block.py +++ b/scripts/inspect_block.py @@ -4,6 +4,10 @@ import click from web3 import Web3 from mev_inspect import block +from mev_inspect.crud.arbitrages import ( + delete_arbitrages_for_block, + write_arbitrages, +) from mev_inspect.crud.classified_traces import ( delete_classified_traces_for_block, write_classified_traces, @@ -12,7 +16,7 @@ from mev_inspect.crud.swaps import delete_swaps_for_block, write_swaps from mev_inspect.db import get_session from mev_inspect.classifier_specs import CLASSIFIER_SPECS from mev_inspect.trace_classifier import TraceClassifier -from mev_inspect.arbitrage import get_arbitrages +from mev_inspect.arbitrages import get_arbitrages from mev_inspect.swaps import get_swaps @@ -48,11 +52,14 @@ def inspect_block(block_number: int, rpc: str): delete_swaps_for_block(db_session, block_number) write_swaps(db_session, swaps) - db_session.close() - arbitrages = get_arbitrages(swaps) print(f"Found {len(arbitrages)} arbitrages") + delete_arbitrages_for_block(db_session, block_number) + write_arbitrages(db_session, arbitrages) + + db_session.close() + stats = get_stats(classified_traces) print(json.dumps(stats, indent=4))