From e280aaf19a3515e07c4309055cf26f2ff064cb7d Mon Sep 17 00:00:00 2001 From: Dan Cline <6798349+Rjected@users.noreply.github.com> Date: Fri, 9 Aug 2024 14:27:48 -0400 Subject: [PATCH] fix: make EvmEnvProvider methods aware of in-memory state (#10240) --- .../src/providers/blockchain_provider.rs | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/crates/storage/provider/src/providers/blockchain_provider.rs b/crates/storage/provider/src/providers/blockchain_provider.rs index 1a868e568..d45918b03 100644 --- a/crates/storage/provider/src/providers/blockchain_provider.rs +++ b/crates/storage/provider/src/providers/blockchain_provider.rs @@ -849,7 +849,9 @@ where where EvmConfig: ConfigureEvmEnv, { - self.database.provider()?.fill_env_at(cfg, block_env, at, evm_config) + let hash = self.convert_number(at)?.ok_or(ProviderError::HeaderNotFound(at))?; + let header = self.header(&hash)?.ok_or(ProviderError::HeaderNotFound(at))?; + self.fill_env_with_header(cfg, block_env, &header, evm_config) } fn fill_env_with_header( @@ -862,7 +864,17 @@ where where EvmConfig: ConfigureEvmEnv, { - self.database.provider()?.fill_env_with_header(cfg, block_env, header, evm_config) + let total_difficulty = self + .header_td_by_number(header.number)? + .ok_or_else(|| ProviderError::HeaderNotFound(header.number.into()))?; + evm_config.fill_cfg_and_block_env( + cfg, + block_env, + &self.database.chain_spec(), + header, + total_difficulty, + ); + Ok(()) } fn fill_cfg_env_at( @@ -874,7 +886,9 @@ where where EvmConfig: ConfigureEvmEnv, { - self.database.provider()?.fill_cfg_env_at(cfg, at, evm_config) + let hash = self.convert_number(at)?.ok_or(ProviderError::HeaderNotFound(at))?; + let header = self.header(&hash)?.ok_or(ProviderError::HeaderNotFound(at))?; + self.fill_cfg_env_with_header(cfg, &header, evm_config) } fn fill_cfg_env_with_header( @@ -886,7 +900,11 @@ where where EvmConfig: ConfigureEvmEnv, { - self.database.provider()?.fill_cfg_env_with_header(cfg, header, evm_config) + let total_difficulty = self + .header_td_by_number(header.number)? + .ok_or_else(|| ProviderError::HeaderNotFound(header.number.into()))?; + evm_config.fill_cfg_env(cfg, &self.database.chain_spec(), header, total_difficulty); + Ok(()) } }