From 790b44393271c398ab0367757f2f7784923ec05e Mon Sep 17 00:00:00 2001 From: Waylon Jepsen <57912727+0xJepsen@users.noreply.github.com> Date: Tue, 13 Jun 2023 06:12:37 -0600 Subject: [PATCH] Update transactions.rs (#3094) Co-authored-by: Matthias Seitz --- crates/rpc/rpc/src/eth/api/transactions.rs | 48 +++++++++++++++------- 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/crates/rpc/rpc/src/eth/api/transactions.rs b/crates/rpc/rpc/src/eth/api/transactions.rs index d0b9bbe0c5..2612b48287 100644 --- a/crates/rpc/rpc/src/eth/api/transactions.rs +++ b/crates/rpc/rpc/src/eth/api/transactions.rs @@ -197,22 +197,42 @@ where f(state) } - async fn evm_env_at(&self, mut at: BlockId) -> EthResult<(CfgEnv, BlockEnv, BlockId)> { + async fn evm_env_at(&self, at: BlockId) -> EthResult<(CfgEnv, BlockEnv, BlockId)> { if at.is_pending() { - if let Some(pending) = self.client().pending_header()? { - let mut cfg = CfgEnv::default(); - let mut block_env = BlockEnv::default(); - self.client().fill_block_env_with_header(&mut block_env, &pending.header)?; - self.client().fill_cfg_env_with_header(&mut cfg, &pending.header)?; - return Ok((cfg, block_env, pending.hash.into())) - } - // No pending block, use latest - at = BlockId::Number(BlockNumberOrTag::Latest); + let header = if let Some(pending) = self.client().pending_header()? { + pending + } else { + // no pending block from the CL yet, so we use the latest block and modify the env + // values that we can + let mut latest = self + .client() + .latest_header()? + .ok_or_else(|| EthApiError::UnknownBlockNumber)?; + + // child block + latest.number += 1; + // assumed child block is in the next slot + latest.timestamp += 12; + // base fee of the child block + latest.base_fee_per_gas = latest.next_block_base_fee(); + + latest + }; + + let mut cfg = CfgEnv::default(); + let mut block_env = BlockEnv::default(); + self.client().fill_block_env_with_header(&mut block_env, &header)?; + self.client().fill_cfg_env_with_header(&mut cfg, &header)?; + return Ok((cfg, block_env, header.hash.into())) + } else { + // Use cached values if there is no pending block + let block_hash = self + .client() + .block_hash_for_id(at)? + .ok_or_else(|| EthApiError::UnknownBlockNumber)?; + let (cfg, env) = self.cache().get_evm_env(block_hash).await?; + Ok((cfg, env, block_hash.into())) } - let block_hash = - self.client().block_hash_for_id(at)?.ok_or_else(|| EthApiError::UnknownBlockNumber)?; - let (cfg, env) = self.cache().get_evm_env(block_hash).await?; - Ok((cfg, env, block_hash.into())) } async fn evm_env_for_raw_block(&self, header: &Header) -> EthResult<(CfgEnv, BlockEnv)> {