diff --git a/alembic/versions/a5a44a7c854d_create_total_profit_by_block_table.py b/alembic/versions/a5a44a7c854d_create_total_profit_by_block_table.py index c88b154..08675d1 100644 --- a/alembic/versions/a5a44a7c854d_create_total_profit_by_block_table.py +++ b/alembic/versions/a5a44a7c854d_create_total_profit_by_block_table.py @@ -18,7 +18,10 @@ depends_on = None def upgrade(): op.create_table( "total_profit_by_block", - sa.Column("block_number", sa.Numeric, primary_key=True), + sa.Column( + "id", sa.Integer, nullable=False, autoincrement=True, primary_key=True + ), + sa.Column("block_number", sa.Numeric, nullable=False), sa.Column("transaction_hash", sa.String(66), nullable=False), sa.Column("token_debt", sa.String(66), nullable=True), sa.Column("amount_debt", sa.Numeric, nullable=False), diff --git a/mev_inspect/crud/total_profits.py b/mev_inspect/crud/total_profits.py index 0d418b8..3ac07c1 100644 --- a/mev_inspect/crud/total_profits.py +++ b/mev_inspect/crud/total_profits.py @@ -1,6 +1,7 @@ +import json from typing import List -from mev_inspect.db import write_as_csv +from mev_inspect.models.total_profits import TotalProfitsModel from mev_inspect.schemas.total_profits import TotalProfits @@ -8,15 +9,10 @@ def write_total_profits_for_blocks( inspect_db_session, total_profits_for_blocks: List[TotalProfits], ) -> None: - items_generator = ( - ( - total_profits_for_unique_block.block_number, - total_profits_for_unique_block.transaction_hash, - total_profits_for_unique_block.token_debt, - total_profits_for_unique_block.amount_debt, - total_profits_for_unique_block.token_received, - total_profits_for_unique_block.amount_received, - ) - for total_profits_for_unique_block in total_profits_for_blocks - ) - write_as_csv(inspect_db_session, "total_profit_by_block", items_generator) + models = [ + TotalProfitsModel(**json.loads(swap.json())) + for swap in total_profits_for_blocks + ] + + inspect_db_session.bulk_save_objects(models) + inspect_db_session.commit() diff --git a/mev_inspect/inspect_block.py b/mev_inspect/inspect_block.py index 875be1c..d1a0f39 100644 --- a/mev_inspect/inspect_block.py +++ b/mev_inspect/inspect_block.py @@ -1,11 +1,13 @@ import logging -from typing import Any, Dict +from typing import Any, Dict, List from sqlalchemy import orm from web3 import Web3 from mev_inspect.arbitrages import get_arbitrages from mev_inspect.block import get_classified_traces_from_events +from mev_inspect.crud.total_profits import write_total_profits_for_blocks +from mev_inspect.schemas.total_profits import TotalProfits logger = logging.getLogger(__name__) @@ -35,7 +37,7 @@ async def inspect_many_blocks( arbitrages_payload = [] liquidations_payload = [] - profits = [] + profits: List[TotalProfits] = [] async for swaps, liquidations in get_classified_traces_from_events( w3, after_block_number, before_block_number ): @@ -52,14 +54,16 @@ async def inspect_many_blocks( arbitrages_payload.append(arb_payload) count += 1 profits.append( - [ - arb.block_number, - arb.transaction_hash, - "", - 0, - str(arb.profit_token_address).replace(TRAILING_ZEROS, ""), - arb.profit_amount, - ] + TotalProfits( + block_number=arb.block_number, + transaction_hash=arb.transaction_hash, + token_debt="", + amount_debt=0, + token_received=str(arb.profit_token_address).replace( + TRAILING_ZEROS, "" + ), + amount_received=arb.profit_amount, + ) ) if len(liquidations) > 0: @@ -75,20 +79,25 @@ async def inspect_many_blocks( liquidations_payload.append(liq_payload) count += 1 profits.append( - [ - liq.block_number, - liq.transaction_hash, - str(liq.debt_token_address).replace(TRAILING_ZEROS, ""), - liq.debt_purchase_amount, - str(liq.received_amount).replace(TRAILING_ZEROS, ""), - liq.received_amount, - ] + TotalProfits( + block_number=liq.block_number, + transaction_hash=liq.transaction_hash, + token_debt=str(liq.debt_token_address).replace( + TRAILING_ZEROS, "" + ), + amount_debt=liq.debt_purchase_amount, + token_received=str(liq.received_amount).replace( + TRAILING_ZEROS, "" + ), + amount_received=liq.received_amount, + ) ) if count > 0: print("writing profits of {0} mev transactions".format(count)) - # @TODO: Write profits to DB - print(inspect_db_session.info) + write_total_profits_for_blocks( + inspect_db_session=inspect_db_session, total_profits_for_blocks=profits + ) arbitrages_payload = [] liquidations_payload = [] count = 0 diff --git a/mev_inspect/models/total_profits.py b/mev_inspect/models/total_profits.py new file mode 100644 index 0000000..cb1adb8 --- /dev/null +++ b/mev_inspect/models/total_profits.py @@ -0,0 +1,15 @@ +from sqlalchemy import Column, Integer, Numeric, String + +from .base import Base + + +class TotalProfitsModel(Base): + __tablename__ = "total_profit_by_block" + + id = Column("id", Integer, nullable=False, autoincrement=True, primary_key=True) + block_number = Column("block_number", Numeric, nullable=False) + transaction_hash = Column("transaction_hash", String(66), nullable=False) + token_debt = Column("token_debt", String(66), nullable=True) + amount_debt = Column("amount_debt", Numeric, nullable=False) + token_received = Column("token_received", String(66), nullable=False) + amount_received = Column("amount_received", Numeric, nullable=False)