From b113b6c82ede1db89c6de5e5be8a29c420735574 Mon Sep 17 00:00:00 2001 From: Luke Van Seters Date: Tue, 18 Jan 2022 18:04:52 -0500 Subject: [PATCH 1/2] Add mev_summary population to the listener --- listener.py | 3 + mev_inspect/crud/summary.py | 123 ++++++++++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 mev_inspect/crud/summary.py diff --git a/listener.py b/listener.py index 4323bf4..4874c7c 100644 --- a/listener.py +++ b/listener.py @@ -10,6 +10,7 @@ from mev_inspect.crud.latest_block_update import ( find_latest_block_update, update_latest_block, ) +from mev_inspect.crud.summary import update_summary_for_block from mev_inspect.db import get_inspect_session, get_trace_session from mev_inspect.inspector import MEVInspector from mev_inspect.provider import get_base_provider @@ -79,6 +80,8 @@ async def inspect_next_block( trace_db_session=trace_db_session, block=block_number, ) + + update_summary_for_block(inspect_db_session, block_number) update_latest_block(inspect_db_session, block_number) if healthcheck_url: diff --git a/mev_inspect/crud/summary.py b/mev_inspect/crud/summary.py new file mode 100644 index 0000000..ce267c4 --- /dev/null +++ b/mev_inspect/crud/summary.py @@ -0,0 +1,123 @@ +INSERT_ARBITRAGE_SUMMARY_QUERY = """ +INSERT INTO mev_summary ( + SELECT + NULL, + a.block_number, + b.block_timestamp, + NULL AS protocol, + a.transaction_hash, + 'arbitrage' AS type, + ( + ( + SELECT usd_price + FROM prices + WHERE + token_address = a.profit_token_address + AND timestamp <= b.block_timestamp + ORDER BY timestamp DESC + LIMIT 1 + ) * a.profit_amount / POWER(10, profit_token.decimals) + ) AS gross_profit_usd, + ( + ( + ((mp.gas_used * mp.gas_price) + mp.coinbase_transfer) / + POWER(10, 18) + ) * + ( + SELECT usd_price + FROM prices p + WHERE + p.timestamp <= b.block_timestamp + AND p.token_address = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' + ORDER BY p.timestamp DESC + LIMIT 1 + ) + ) AS miner_payment_usd, + mp.gas_used, + mp.gas_price, + mp.coinbase_transfer, + mp.gas_price_with_coinbase_transfer, + mp.miner_address, + mp.base_fee_per_gas, + ct.error as error + FROM arbitrages a + JOIN blocks b ON b.block_number = a.block_number + JOIN tokens profit_token ON profit_token.token_address = a.profit_token_address + JOIN classified_traces ct ON + ct.block_number = a.block_number AND + ct.transaction_hash = a.transaction_hash + JOIN miner_payments mp ON + mp.block_number = a.block_number AND + mp.transaction_hash = a.transaction_hash + WHERE + b.block_number >= :after_block_number + AND b.block_number < :before_block_number + AND ct.trace_address = '{}' + AND NOT EXISTS ( + SELECT 1 + FROM sandwiches front_sandwich + WHERE + front_sandwich.block_number = a.block_number AND + front_sandwich.frontrun_swap_transaction_hash = a.transaction_hash + ) + AND NOT EXISTS ( + SELECT 1 + FROM sandwiches back_sandwich + WHERE + back_sandwich.block_number = a.block_number AND + back_sandwich.backrun_swap_transaction_hash = a.transaction_hash + ) +) +""" + + +def update_summary_for_block(db_session, block_number: int) -> None: + update_summary_for_block_range(db_session, block_number, block_number + 1) + + +def update_summary_for_block_range( + db_session, + after_block_number: int, + before_block_number: int, +) -> None: + _delete_summary_for_block_range(db_session, after_block_number, before_block_number) + _insert_into_summary_for_block_range( + db_session, after_block_number, before_block_number + ) + + +def _delete_summary_for_block_range( + db_session, + after_block_number: int, + before_block_number: int, +) -> None: + db_session.execute( + """ + DELETE FROM mev_summary + WHERE + block_number >= :after_block_number AND + block_number < :before_block_number + """, + params={ + "after_block_number": after_block_number, + "before_block_number": before_block_number, + }, + ) + + db_session.commit() + + +def _insert_into_summary_for_block_range( + db_session, + after_block_number: int, + before_block_number: int, +) -> None: + db_session.execute( + INSERT_ARBITRAGE_SUMMARY_QUERY, + params={ + "after_block_number": after_block_number, + "before_block_number": before_block_number, + }, + ) + + db_session.commit() From 94825d3547ee053fd8e22a25427d17f589c7524e Mon Sep 17 00:00:00 2001 From: Luke Van Seters Date: Wed, 19 Jan 2022 16:48:12 -0500 Subject: [PATCH 2/2] Update mev_summary for all inspections --- listener.py | 2 -- mev_inspect/crud/summary.py | 4 ---- mev_inspect/inspect_block.py | 8 ++++++++ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/listener.py b/listener.py index 4874c7c..9da3a45 100644 --- a/listener.py +++ b/listener.py @@ -10,7 +10,6 @@ from mev_inspect.crud.latest_block_update import ( find_latest_block_update, update_latest_block, ) -from mev_inspect.crud.summary import update_summary_for_block from mev_inspect.db import get_inspect_session, get_trace_session from mev_inspect.inspector import MEVInspector from mev_inspect.provider import get_base_provider @@ -81,7 +80,6 @@ async def inspect_next_block( block=block_number, ) - update_summary_for_block(inspect_db_session, block_number) update_latest_block(inspect_db_session, block_number) if healthcheck_url: diff --git a/mev_inspect/crud/summary.py b/mev_inspect/crud/summary.py index ce267c4..81f5614 100644 --- a/mev_inspect/crud/summary.py +++ b/mev_inspect/crud/summary.py @@ -71,10 +71,6 @@ INSERT INTO mev_summary ( """ -def update_summary_for_block(db_session, block_number: int) -> None: - update_summary_for_block_range(db_session, block_number, block_number + 1) - - def update_summary_for_block_range( db_session, after_block_number: int, diff --git a/mev_inspect/inspect_block.py b/mev_inspect/inspect_block.py index f97de75..db24347 100644 --- a/mev_inspect/inspect_block.py +++ b/mev_inspect/inspect_block.py @@ -27,6 +27,7 @@ from mev_inspect.crud.punks import ( write_punk_snipes, ) from mev_inspect.crud.sandwiches import delete_sandwiches_for_blocks, write_sandwiches +from mev_inspect.crud.summary import update_summary_for_block_range from mev_inspect.crud.swaps import delete_swaps_for_blocks, write_swaps from mev_inspect.crud.traces import ( delete_classified_traces_for_blocks, @@ -225,4 +226,11 @@ async def inspect_many_blocks( inspect_db_session, after_block_number, before_block_number ) write_miner_payments(inspect_db_session, all_miner_payments) + + update_summary_for_block_range( + inspect_db_session, + after_block_number, + before_block_number, + ) + logger.info("Done writing")