From b8b2772932eb0270b00dc3b55af7423fa1b68e0a Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Fri, 28 Apr 2023 23:21:08 +0200 Subject: [PATCH] fix: restrict start block correctly (#2460) --- crates/primitives/src/chain/info.rs | 2 +- crates/rpc/rpc/src/eth/logs_utils.rs | 50 +++++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/crates/primitives/src/chain/info.rs b/crates/primitives/src/chain/info.rs index 1d84ce3246..557e981d6a 100644 --- a/crates/primitives/src/chain/info.rs +++ b/crates/primitives/src/chain/info.rs @@ -1,7 +1,7 @@ use crate::{BlockNumber, BlockNumberOrTag, H256}; /// Current status of the blockchain's head. -#[derive(Default, Debug, Eq, PartialEq)] +#[derive(Default, Clone, Debug, Eq, PartialEq)] pub struct ChainInfo { /// The block hash of the highest fully synced block. pub best_hash: H256, diff --git a/crates/rpc/rpc/src/eth/logs_utils.rs b/crates/rpc/rpc/src/eth/logs_utils.rs index 66bffa766a..5f7646ded9 100644 --- a/crates/rpc/rpc/src/eth/logs_utils.rs +++ b/crates/rpc/rpc/src/eth/logs_utils.rs @@ -83,7 +83,7 @@ pub(crate) fn get_filter_block_range( // from block is maximum of block from last poll or `from_block` of filter if let Some(filter_from_block) = from_block.and_then(|num| info.convert_block_number(num)) { - from_block_number = start_block.max(filter_from_block) + from_block_number = start_block.min(filter_from_block) } // to block is max the best number @@ -95,3 +95,51 @@ pub(crate) fn get_filter_block_range( } (from_block_number, to_block_number) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_log_range_from_and_to() { + let from: BlockNumberOrTag = 14000000u64.into(); + let to: BlockNumberOrTag = 14000100u64.into(); + let info = ChainInfo { best_number: 15000000, ..Default::default() }; + let range = get_filter_block_range(Some(from), Some(to), info.best_number, info); + assert_eq!(range, (from.as_number().unwrap(), to.as_number().unwrap())); + } + + #[test] + fn test_log_range_higher() { + let from: BlockNumberOrTag = 15000001u64.into(); + let to: BlockNumberOrTag = 15000002u64.into(); + let info = ChainInfo { best_number: 15000000, ..Default::default() }; + let range = get_filter_block_range(Some(from), Some(to), info.best_number, info.clone()); + assert_eq!(range, (info.best_number, info.best_number)); + } + + #[test] + fn test_log_range_from() { + let from: BlockNumberOrTag = 14000000u64.into(); + let info = ChainInfo { best_number: 15000000, ..Default::default() }; + let range = get_filter_block_range(Some(from), None, info.best_number, info.clone()); + assert_eq!(range, (from.as_number().unwrap(), info.best_number)); + } + + #[test] + fn test_log_range_to() { + let to: BlockNumberOrTag = 14000000u64.into(); + let info = ChainInfo { best_number: 15000000, ..Default::default() }; + let range = get_filter_block_range(None, Some(to), info.best_number, info.clone()); + assert_eq!(range, (info.best_number, to.as_number().unwrap())); + } + + #[test] + fn test_log_range_empty() { + let info = ChainInfo { best_number: 15000000, ..Default::default() }; + let range = get_filter_block_range(None, None, info.best_number, info.clone()); + + // no range given -> head + assert_eq!(range, (info.best_number, info.best_number)); + } +}