Merge pull request #237 from flashbots/add-listener-mev-summary
Populate mev_summary on inspect
This commit is contained in:
		@@ -79,6 +79,7 @@ async def inspect_next_block(
 | 
			
		||||
            trace_db_session=trace_db_session,
 | 
			
		||||
            block=block_number,
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        update_latest_block(inspect_db_session, block_number)
 | 
			
		||||
 | 
			
		||||
        if healthcheck_url:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										119
									
								
								mev_inspect/crud/summary.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								mev_inspect/crud/summary.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,119 @@
 | 
			
		||||
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_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()
 | 
			
		||||
@@ -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")
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user