From f4c241970e894236ff859538afc5b84bf68b6385 Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Thu, 11 May 2023 00:02:49 +0200 Subject: [PATCH] test: add open ended filter test (#2620) --- crates/primitives/src/filter.rs | 12 ++++++++++++ crates/rpc/rpc/src/eth/logs_utils.rs | 26 ++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/crates/primitives/src/filter.rs b/crates/primitives/src/filter.rs index 899efcc2ed..a545be0c2a 100644 --- a/crates/primitives/src/filter.rs +++ b/crates/primitives/src/filter.rs @@ -24,6 +24,7 @@ pub enum FilterBlockOption { } impl FilterBlockOption { + /// Returns the `fromBlock` value, if any pub fn get_to_block(&self) -> Option<&BlockNumberOrTag> { match self { FilterBlockOption::Range { to_block, .. } => to_block.as_ref(), @@ -31,12 +32,23 @@ impl FilterBlockOption { } } + /// Returns the `toBlock` value, if any pub fn get_from_block(&self) -> Option<&BlockNumberOrTag> { match self { FilterBlockOption::Range { from_block, .. } => from_block.as_ref(), FilterBlockOption::AtBlockHash(_) => None, } } + + /// Returns the range (`fromBlock`, `toBlock`) if this is a range filter. + pub fn as_range(&self) -> (Option<&BlockNumberOrTag>, Option<&BlockNumberOrTag>) { + match self { + FilterBlockOption::Range { from_block, to_block } => { + (from_block.as_ref(), to_block.as_ref()) + } + FilterBlockOption::AtBlockHash(_) => (None, None), + } + } } impl From for FilterBlockOption { diff --git a/crates/rpc/rpc/src/eth/logs_utils.rs b/crates/rpc/rpc/src/eth/logs_utils.rs index 671d5428d0..fcc28bb5dc 100644 --- a/crates/rpc/rpc/src/eth/logs_utils.rs +++ b/crates/rpc/rpc/src/eth/logs_utils.rs @@ -97,6 +97,7 @@ pub(crate) fn get_filter_block_range( #[cfg(test)] mod tests { use super::*; + use reth_primitives::{filter::Filter, BlockNumberOrTag}; #[test] fn test_log_range_from_and_to() { @@ -140,4 +141,29 @@ mod tests { // no range given -> head assert_eq!(range, (info.best_number, info.best_number)); } + + #[test] + fn parse_log_from_only() { + let s = r#"{"fromBlock":"0xf47a42","address":["0x7de93682b9b5d80d45cd371f7a14f74d49b0914c","0x0f00392fcb466c0e4e4310d81b941e07b4d5a079","0xebf67ab8cff336d3f609127e8bbf8bd6dd93cd81"],"topics":["0x0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f"]}"#; + let filter: Filter = serde_json::from_str(s).unwrap(); + + assert_eq!(filter.get_from_block(), Some(16022082)); + assert!(filter.get_to_block().is_none()); + + let best_number = 17229427; + let info = ChainInfo { best_number, ..Default::default() }; + + let (from_block, to_block) = filter.block_option.as_range(); + + let start_block = info.best_number; + + let (from_block_number, to_block_number) = get_filter_block_range( + from_block.and_then(BlockNumberOrTag::as_number), + to_block.and_then(BlockNumberOrTag::as_number), + start_block, + info, + ); + assert_eq!(from_block_number, 16022082); + assert_eq!(to_block_number, best_number); + } }