From 7f129a0220b43057eba9d1677acec69b99b1146f Mon Sep 17 00:00:00 2001 From: Luke Van Seters Date: Mon, 13 Sep 2021 18:44:04 -0400 Subject: [PATCH] Move inspect block logic into mev_inspect module from script --- mev_inspect/inspect_block.py | 73 ++++++++++++++++++++++++++++++++++++ scripts/inspect_commands.py | 71 +++++++++++++++++++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 mev_inspect/inspect_block.py create mode 100644 scripts/inspect_commands.py diff --git a/mev_inspect/inspect_block.py b/mev_inspect/inspect_block.py new file mode 100644 index 0000000..3b19345 --- /dev/null +++ b/mev_inspect/inspect_block.py @@ -0,0 +1,73 @@ +from web3 import Web3 + +from mev_inspect.arbitrages import get_arbitrages +from mev_inspect.block import create_from_block_number +from mev_inspect.classifiers.trace import TraceClassifier +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, +) +from mev_inspect.crud.miner_payments import ( + delete_miner_payments_for_block, + write_miner_payments, +) +from mev_inspect.crud.swaps import delete_swaps_for_block, write_swaps +from mev_inspect.db import get_session +from mev_inspect.miner_payments import get_miner_payments +from mev_inspect.swaps import get_swaps + + +def inspect_block( + base_provider, + w3: Web3, + block_number: int, + should_cache: bool, + should_write_classified_traces: bool = True, + should_write_swaps: bool = True, + should_write_arbitrages: bool = True, + should_write_miner_payments: bool = True, +): + block = create_from_block_number(base_provider, w3, block_number, should_cache) + + print(f"Total traces: {len(block.traces)}") + + total_transactions = len( + set(t.transaction_hash for t in block.traces if t.transaction_hash is not None) + ) + print(f"Total transactions: {total_transactions}") + + trace_clasifier = TraceClassifier() + classified_traces = trace_clasifier.classify(block.traces) + print(f"Returned {len(classified_traces)} classified traces") + + db_session = get_session() + + if should_write_classified_traces: + delete_classified_traces_for_block(db_session, block_number) + write_classified_traces(db_session, classified_traces) + + swaps = get_swaps(classified_traces) + print(f"Found {len(swaps)} swaps") + + if should_write_swaps: + delete_swaps_for_block(db_session, block_number) + write_swaps(db_session, swaps) + + arbitrages = get_arbitrages(swaps) + print(f"Found {len(arbitrages)} arbitrages") + + if should_write_arbitrages: + delete_arbitrages_for_block(db_session, block_number) + write_arbitrages(db_session, arbitrages) + + miner_payments = get_miner_payments( + block.miner, block.base_fee_per_gas, classified_traces, block.receipts + ) + + if should_write_miner_payments: + delete_miner_payments_for_block(db_session, block_number) + write_miner_payments(db_session, miner_payments) diff --git a/scripts/inspect_commands.py b/scripts/inspect_commands.py new file mode 100644 index 0000000..312dedc --- /dev/null +++ b/scripts/inspect_commands.py @@ -0,0 +1,71 @@ +import click +from web3 import Web3 + +from mev_inspect.inspect_block import inspect_block +from mev_inspect.retry import http_retry_with_backoff_request_middleware + + +@click.group() +def cli(): + pass + + +@cli.command() +@click.argument("block_number", type=int) +@click.argument("rpc") +@click.option("--cache/--no-cache", default=True) +def inspect_block_command(block_number: int, rpc: str, cache: bool): + base_provider = _get_base_provider(rpc) + w3 = Web3(base_provider) + + if not cache: + click.echo("Skipping cache") + + inspect_block(base_provider, w3, block_number, should_cache=cache) + + +@cli.command() +@click.argument("after_block", type=int) +@click.argument("before_block", type=int) +@click.argument("rpc") +@click.option("--cache/--no-cache", default=True) +def inspect_many_blocks_command( + after_block: int, before_block: int, rpc: str, cache: bool +): + base_provider = _get_base_provider(rpc) + w3 = Web3(base_provider) + + if not cache: + click.echo("Skipping cache") + + for i, block_number in enumerate(range(after_block, before_block)): + block_message = ( + f"Running for {block_number} ({i+1}/{before_block - after_block})" + ) + dashes = "-" * len(block_message) + click.echo(dashes) + click.echo(block_message) + click.echo(dashes) + + inspect_block( + base_provider, + w3, + block_number, + should_write_classified_traces=False, + should_cache=cache, + ) + + +def _get_base_provider(rpc: str) -> Web3.HTTPProvider: + base_provider = Web3.HTTPProvider(rpc) + base_provider.middlewares.remove("http_retry_request") + base_provider.middlewares.add( + http_retry_with_backoff_request_middleware, + "http_retry_with_backoff", + ) + + return base_provider + + +if __name__ == "__main__": + cli()