diff --git a/mev_inspect/block.py b/mev_inspect/block.py index cee2e3c..d1dbee7 100644 --- a/mev_inspect/block.py +++ b/mev_inspect/block.py @@ -3,6 +3,7 @@ from typing import List from web3 import Web3 +from mev_inspect.fees import fetch_base_fee_per_gas from mev_inspect.schemas import Block, Trace, TraceType from mev_inspect.schemas.receipts import Receipt @@ -41,10 +42,12 @@ def fetch_block(w3, base_provider, block_number: int) -> Block: Receipt(**receipt) for receipt in receipts_json["result"] ] traces = [Trace(**trace_json) for trace_json in traces_json] + base_fee_per_gas = fetch_base_fee_per_gas(w3, block_number) return Block( block_number=block_number, miner=block_json["miner"], + base_fee_per_gas=base_fee_per_gas, traces=traces, receipts=receipts, ) diff --git a/mev_inspect/fees.py b/mev_inspect/fees.py new file mode 100644 index 0000000..19b7c4b --- /dev/null +++ b/mev_inspect/fees.py @@ -0,0 +1,9 @@ +from web3 import Web3 + + +def fetch_base_fee_per_gas(w3: Web3, block_number: int) -> int: + base_fees = w3.eth.fee_history(1, block_number)["baseFeePerGas"] + if len(base_fees) == 0: + raise RuntimeError("Unexpected error - no fees returned") + + return base_fees[0] diff --git a/mev_inspect/miner_payments.py b/mev_inspect/miner_payments.py index 48420fe..f25cbb7 100644 --- a/mev_inspect/miner_payments.py +++ b/mev_inspect/miner_payments.py @@ -11,7 +11,10 @@ from mev_inspect.transfers import ( def get_miner_payments( - miner_address: str, traces: List[ClassifiedTrace], receipts: List[Receipt] + miner_address: str, + base_fee_per_gas: int, + traces: List[ClassifiedTrace], + receipts: List[Receipt], ) -> List[MinerPayment]: miner_payments = [] @@ -38,6 +41,7 @@ def get_miner_payments( transaction_index=receipt.transaction_index, gas_price=receipt.effective_gas_price, gas_price_with_coinbase_transfer=gas_price_with_coinbase_transfer, + base_fee_per_gas=base_fee_per_gas, gas_used=receipt.gas_used, coinbase_transfer=coinbase_transfer, ) diff --git a/mev_inspect/schemas/blocks.py b/mev_inspect/schemas/blocks.py index a685963..0c24abf 100644 --- a/mev_inspect/schemas/blocks.py +++ b/mev_inspect/schemas/blocks.py @@ -60,6 +60,7 @@ class Trace(CamelModel): class Block(Web3Model): block_number: int miner: str + base_fee_per_gas: int traces: List[Trace] receipts: List[Receipt] diff --git a/mev_inspect/schemas/miner_payments.py b/mev_inspect/schemas/miner_payments.py index 50b5906..6f208b3 100644 --- a/mev_inspect/schemas/miner_payments.py +++ b/mev_inspect/schemas/miner_payments.py @@ -7,6 +7,7 @@ class MinerPayment(BaseModel): transaction_index: int miner_address: str coinbase_transfer: int + base_fee_per_gas: int gas_price: int gas_price_with_coinbase_transfer: int gas_used: int diff --git a/mev_inspect/schemas/receipts.py b/mev_inspect/schemas/receipts.py index 85db968..a5772b0 100644 --- a/mev_inspect/schemas/receipts.py +++ b/mev_inspect/schemas/receipts.py @@ -1,3 +1,5 @@ +from typing import Optional + from pydantic import validator from mev_inspect.utils import hex_to_int @@ -12,7 +14,7 @@ class Receipt(CamelModel): gas_used: int effective_gas_price: int cumulative_gas_used: int - to: str + to: Optional[str] @validator( "block_number", diff --git a/scripts/inspect_block.py b/scripts/inspect_block.py index 5b09e63..1712947 100644 --- a/scripts/inspect_block.py +++ b/scripts/inspect_block.py @@ -3,7 +3,7 @@ import json import click from web3 import Web3 -from mev_inspect import block +from mev_inspect.block import create_from_block_number from mev_inspect.crud.arbitrages import ( delete_arbitrages_for_block, write_arbitrages, @@ -83,23 +83,17 @@ def _inspect_block( should_write_arbitrages: bool = True, should_print_miner_payments: bool = True, ): - block_data = block.create_from_block_number( - base_provider, w3, block_number, should_cache - ) + block = create_from_block_number(base_provider, w3, block_number, should_cache) - click.echo(f"Total traces: {len(block_data.traces)}") + click.echo(f"Total traces: {len(block.traces)}") total_transactions = len( - set( - t.transaction_hash - for t in block_data.traces - if t.transaction_hash is not None - ) + set(t.transaction_hash for t in block.traces if t.transaction_hash is not None) ) click.echo(f"Total transactions: {total_transactions}") trace_clasifier = TraceClassifier(ALL_CLASSIFIER_SPECS) - classified_traces = trace_clasifier.classify(block_data.traces) + classified_traces = trace_clasifier.classify(block.traces) click.echo(f"Returned {len(classified_traces)} classified traces") db_session = get_session() @@ -127,7 +121,7 @@ def _inspect_block( click.echo(json.dumps(stats, indent=4)) miner_payments = get_miner_payments( - block_data.miner, classified_traces, block_data.receipts + block.miner, block.base_fee_per_gas, classified_traces, block.receipts ) if should_print_miner_payments: