From 5b31d07c2cb8fd7a86e79bda1e2c9715b97f5e3d Mon Sep 17 00:00:00 2001 From: Quertyy <98064975+Quertyy@users.noreply.github.com> Date: Wed, 23 Jul 2025 15:48:08 +0200 Subject: [PATCH] chore(rpc): adjust log tx index when system tx exists in block --- src/hl_node_compliance.rs | 58 +++++++++++++++++++++++++++++---------- 1 file changed, 44 insertions(+), 14 deletions(-) diff --git a/src/hl_node_compliance.rs b/src/hl_node_compliance.rs index 272831996..f2cc3469c 100644 --- a/src/hl_node_compliance.rs +++ b/src/hl_node_compliance.rs @@ -30,7 +30,7 @@ use reth_rpc_eth_api::{ use serde::Serialize; use std::{collections::HashSet, sync::Arc}; use tokio_stream::{Stream, StreamExt}; -use tracing::{info, trace}; +use tracing::trace; pub trait EthWrapper: EthApiServer< @@ -138,21 +138,51 @@ impl EthFilterApiServer> let mut logs = self.filter.logs(filter).await?; let block_numbers: HashSet<_> = logs.iter().map(|log| log.block_number.unwrap()).collect(); - info!("block_numbers: {:?}", block_numbers); - let system_tx_hashes: HashSet<_> = block_numbers - .into_iter() - .flat_map(|block_number| { - let block = self.provider.block_by_number(block_number).unwrap().unwrap(); - let transactions = block.body.transactions().collect::>(); - transactions - .iter() - .filter(|tx| tx.is_system_transaction()) - .map(|tx| *tx.tx_hash()) - .collect::>() - }) - .collect(); + // Build maps for efficient lookups + let mut system_tx_hashes = HashSet::new(); + let mut block_system_tx_indices: std::collections::HashMap> = + std::collections::HashMap::new(); + + for block_number in block_numbers { + let block = self.provider.block_by_number(block_number).unwrap().unwrap(); + let transactions = block.body.transactions().collect::>(); + + let mut system_indices = Vec::new(); + for (index, tx) in transactions.iter().enumerate() { + if tx.is_system_transaction() { + system_tx_hashes.insert(*tx.tx_hash()); + system_indices.push(index as u64); + } + } + + if !system_indices.is_empty() { + // Sort indices for efficient binary search later + system_indices.sort_unstable(); + block_system_tx_indices.insert(block_number, system_indices); + } + } + + // Filter out logs from system transactions logs.retain(|log| !system_tx_hashes.contains(&log.transaction_hash.unwrap())); + + // Adjust transaction_index for remaining logs + for log in &mut logs { + if let (Some(block_number), Some(tx_index)) = + (log.block_number, &mut log.transaction_index) + { + if let Some(system_indices) = block_system_tx_indices.get(&block_number) { + // Count how many system transactions are before this transaction + let system_tx_count_before = system_indices + .iter() + .take_while(|&&system_idx| system_idx < *tx_index) + .count() as u64; + + *tx_index = tx_index.saturating_sub(system_tx_count_before); + } + } + } + Ok(logs) } }