diff --git a/mev_inspect/block.py b/mev_inspect/block.py index f662d0b..ab61919 100644 --- a/mev_inspect/block.py +++ b/mev_inspect/block.py @@ -67,6 +67,7 @@ async def _fetch_block(w3, base_provider, block_number: int, retries: int = 0) - return Block( block_number=block_number, + block_timestamp=block_json["timestamp"], miner=block_json["miner"], base_fee_per_gas=base_fee_per_gas, traces=traces, @@ -78,11 +79,17 @@ def _find_block( trace_db_session: orm.Session, block_number: int, ) -> Optional[Block]: + block_timestamp = _find_block_timestamp(trace_db_session, block_number) traces = _find_traces(trace_db_session, block_number) receipts = _find_receipts(trace_db_session, block_number) base_fee_per_gas = _find_base_fee(trace_db_session, block_number) - if traces is None or receipts is None or base_fee_per_gas is None: + if ( + block_timestamp is None + or traces is None + or receipts is None + or base_fee_per_gas is None + ): return None miner_address = _get_miner_address_from_traces(traces) @@ -92,6 +99,7 @@ def _find_block( return Block( block_number=block_number, + block_timestamp=block_timestamp, miner=miner_address, base_fee_per_gas=base_fee_per_gas, traces=traces, @@ -99,6 +107,22 @@ def _find_block( ) +def _find_block_timestamp( + trace_db_session: orm.Session, + block_number: int, +) -> Optional[int]: + result = trace_db_session.execute( + "SELECT block_timestamp FROM block_timestamps WHERE block_number = :block_number", + params={"block_number": block_number}, + ).one_or_none() + + if result is None: + return None + else: + (block_timestamp,) = result + return block_timestamp + + def _find_traces( trace_db_session: orm.Session, block_number: int, diff --git a/mev_inspect/crud/blocks.py b/mev_inspect/crud/blocks.py new file mode 100644 index 0000000..3639ba8 --- /dev/null +++ b/mev_inspect/crud/blocks.py @@ -0,0 +1,26 @@ +from mev_inspect.schemas.blocks import Block + + +def delete_block( + db_session, + block_number: int, +) -> None: + db_session.execute( + "DELETE FROM blocks WHERE block_number = :block_number", + params={"block_number": block_number}, + ) + db_session.commit() + + +def write_block( + db_session, + block: Block, +) -> None: + db_session.execute( + "INSERT INTO blocks (block_number, block_timestamp) VALUES (:block_number, :block_timestamp)", + params={ + "block_number": block.block_number, + "block_timestamp": block.block_timestamp, + }, + ) + db_session.commit() diff --git a/mev_inspect/inspect_block.py b/mev_inspect/inspect_block.py index c517923..de955fb 100644 --- a/mev_inspect/inspect_block.py +++ b/mev_inspect/inspect_block.py @@ -11,6 +11,10 @@ from mev_inspect.crud.arbitrages import ( delete_arbitrages_for_block, write_arbitrages, ) +from mev_inspect.crud.blocks import ( + delete_block, + write_block, +) from mev_inspect.crud.traces import ( delete_classified_traces_for_block, write_classified_traces, @@ -53,6 +57,9 @@ async def inspect_block( logger.info(f"Block: {block_number} -- Total traces: {len(block.traces)}") + delete_block(inspect_db_session, block_number) + write_block(inspect_db_session, block) + total_transactions = len( set(t.transaction_hash for t in block.traces if t.transaction_hash is not None) ) diff --git a/mev_inspect/schemas/blocks.py b/mev_inspect/schemas/blocks.py index 2f8f2e6..c3dd3d7 100644 --- a/mev_inspect/schemas/blocks.py +++ b/mev_inspect/schemas/blocks.py @@ -38,6 +38,7 @@ class CallAction(Web3Model): class Block(Web3Model): block_number: int + block_timestamp: int miner: str base_fee_per_gas: int traces: List[Trace] diff --git a/tests/utils.py b/tests/utils.py index 9269fab..f4c2234 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -14,7 +14,7 @@ def load_test_block(block_number: int) -> Block: with open(block_path, "r") as block_file: block_json = json.load(block_file) - return Block(**block_json) + return Block(**block_json, block_timestamp=0) def load_comp_markets() -> Dict[str, str]: