From 6013f131888d3abfef7a70d772a6e55b5d8e81c3 Mon Sep 17 00:00:00 2001 From: Wodann Date: Fri, 5 Apr 2024 12:23:47 +0000 Subject: [PATCH 1/2] fix: remove hardfork restriction on eth_getLogs --- .changeset/friendly-steaks-travel.md | 5 +++++ crates/edr_provider/src/requests/eth/filter.rs | 9 +-------- 2 files changed, 6 insertions(+), 8 deletions(-) create mode 100644 .changeset/friendly-steaks-travel.md diff --git a/.changeset/friendly-steaks-travel.md b/.changeset/friendly-steaks-travel.md new file mode 100644 index 0000000000..5fb2de6d16 --- /dev/null +++ b/.changeset/friendly-steaks-travel.md @@ -0,0 +1,5 @@ +--- +"@nomicfoundation/edr": patch +--- + +Fixed eth_getLogs RPC request for pre-Merge hardforks diff --git a/crates/edr_provider/src/requests/eth/filter.rs b/crates/edr_provider/src/requests/eth/filter.rs index c746e25a94..bca2eea0ff 100644 --- a/crates/edr_provider/src/requests/eth/filter.rs +++ b/crates/edr_provider/src/requests/eth/filter.rs @@ -6,7 +6,7 @@ use edr_eth::{ filter::{FilteredEvents, LogFilterOptions, LogOutput, OneOrMore, SubscriptionType}, BlockSpec, BlockTag, Eip1898BlockSpec, }, - SpecId, U256, + U256, }; use edr_evm::HashSet; @@ -41,13 +41,6 @@ pub fn handle_get_logs_request( validate_post_merge_block_tags(data.spec_id(), to_block)?; } - if data.spec_id() < SpecId::MERGE { - return Err(ProviderError::InvalidInput( - "eth_getLogs is disabled. It only works with the Berlin hardfork or a later one." - .into(), - )); - } - let filter = validate_filter_criteria::(data, filter_options)?; data.logs(filter) .map(|logs| logs.iter().map(LogOutput::from).collect()) From 2fc5a189350422a083471e4d69dc611cc5555fa4 Mon Sep 17 00:00:00 2001 From: Wodann Date: Fri, 5 Apr 2024 13:47:55 +0000 Subject: [PATCH 2/2] test: add test for #361 --- crates/edr_eth/src/remote/filter.rs | 2 +- crates/edr_provider/tests/issue_361.rs | 55 ++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 crates/edr_provider/tests/issue_361.rs diff --git a/crates/edr_eth/src/remote/filter.rs b/crates/edr_eth/src/remote/filter.rs index 1c7b3d69dd..eac6ad5886 100644 --- a/crates/edr_eth/src/remote/filter.rs +++ b/crates/edr_eth/src/remote/filter.rs @@ -16,7 +16,7 @@ pub enum OneOrMore { } /// for specifying the inputs to `eth_newFilter` and `eth_getLogs` -#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)] +#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)] #[serde(rename_all = "camelCase")] pub struct LogFilterOptions { /// beginning of a range of blocks diff --git a/crates/edr_provider/tests/issue_361.rs b/crates/edr_provider/tests/issue_361.rs new file mode 100644 index 0000000000..8ce4378d7f --- /dev/null +++ b/crates/edr_provider/tests/issue_361.rs @@ -0,0 +1,55 @@ +use edr_eth::{ + remote::{filter::LogFilterOptions, BlockSpec}, + transaction::EthTransactionRequest, + AccountInfo, Address, SpecId, +}; +use edr_evm::KECCAK_EMPTY; +use edr_provider::{ + test_utils::{create_test_config_with_fork, one_ether}, + MethodInvocation, NoopLogger, Provider, ProviderRequest, +}; +use tokio::runtime; + +#[tokio::test(flavor = "multi_thread")] +async fn issue_361() -> anyhow::Result<()> { + let logger = Box::new(NoopLogger); + let subscriber = Box::new(|_event| {}); + + let mut config = create_test_config_with_fork(None); + config.hardfork = SpecId::MUIR_GLACIER; + + let impersonated_account = Address::random(); + config.genesis_accounts.insert( + impersonated_account, + AccountInfo { + balance: one_ether(), + nonce: 0, + code: None, + code_hash: KECCAK_EMPTY, + }, + ); + + let provider = Provider::new(runtime::Handle::current(), logger, subscriber, config)?; + + provider.handle_request(ProviderRequest::Single( + MethodInvocation::ImpersonateAccount(impersonated_account.into()), + ))?; + + provider.handle_request(ProviderRequest::Single(MethodInvocation::SendTransaction( + EthTransactionRequest { + from: impersonated_account, + to: Some(Address::random()), + ..EthTransactionRequest::default() + }, + )))?; + + provider.handle_request(ProviderRequest::Single(MethodInvocation::GetLogs( + LogFilterOptions { + from_block: Some(BlockSpec::Number(0)), + to_block: Some(BlockSpec::latest()), + ..LogFilterOptions::default() + }, + )))?; + + Ok(()) +}