From 7c818c1021abd343a71ccabbc461724b8f68ffe3 Mon Sep 17 00:00:00 2001 From: joshieDo <93316087+joshieDo@users.noreply.github.com> Date: Thu, 10 Oct 2024 00:28:35 +0900 Subject: [PATCH] chore(rpc): use `block_hash` as `BlockId` on `eth_callMany` (#11595) --- crates/rpc/rpc-eth-api/src/helpers/call.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/crates/rpc/rpc-eth-api/src/helpers/call.rs b/crates/rpc/rpc-eth-api/src/helpers/call.rs index 5bc7d73b22..0aa38a36e9 100644 --- a/crates/rpc/rpc-eth-api/src/helpers/call.rs +++ b/crates/rpc/rpc-eth-api/src/helpers/call.rs @@ -22,7 +22,7 @@ use reth_primitives::{ }, Header, TransactionSignedEcRecovered, }; -use reth_provider::{ChainSpecProvider, HeaderProvider, StateProvider}; +use reth_provider::{BlockIdReader, ChainSpecProvider, HeaderProvider, StateProvider}; use reth_revm::{database::StateProviderDatabase, db::CacheDB, DatabaseRef}; use reth_rpc_eth_types::{ cache::db::{StateCacheDbRefMutWrapper, StateProviderTraitObjWrapper}, @@ -247,9 +247,19 @@ pub trait EthCall: Call + LoadPendingBlock { state_context.unwrap_or_default(); let transaction_index = transaction_index.unwrap_or_default(); - let target_block = block_number.unwrap_or_default(); + let mut target_block = block_number.unwrap_or_default(); let is_block_target_pending = target_block.is_pending(); + // if it's not pending, we should always use block_hash over block_number to ensure that + // different provider calls query data related to the same block. + if !is_block_target_pending { + target_block = LoadBlock::provider(self) + .block_hash_for_id(target_block) + .map_err(|_| EthApiError::HeaderNotFound(target_block))? + .ok_or_else(|| EthApiError::HeaderNotFound(target_block))? + .into(); + } + let ((cfg, block_env, _), block) = futures::try_join!( self.evm_env_at(target_block), self.block_with_senders(target_block)