diff --git a/ethers-core/src/types/filter.rs b/ethers-core/src/types/filter.rs index e3466c4a..077b6045 100644 --- a/ethers-core/src/types/filter.rs +++ b/ethers-core/src/types/filter.rs @@ -429,7 +429,7 @@ impl<'de> Deserialize<'de> for Filter { let mut to_block: Option> = None; let mut block_hash: Option> = None; let mut address: Option>> = None; - let mut topics: Option>> = None; + let mut topics: Option>>> = None; while let Some(key) = map.next_key::()? { match key.as_str() { @@ -492,7 +492,7 @@ impl<'de> Deserialize<'de> for Filter { let to_block = to_block.unwrap_or_default(); let block_hash = block_hash.unwrap_or_default(); let address = address.unwrap_or_default(); - let topics_vec = topics.unwrap_or_default(); + let topics_vec = topics.flatten().unwrap_or_default(); // maximum allowed filter len if topics_vec.len() > 4 { @@ -1172,4 +1172,29 @@ mod tests { } ); } + + #[test] + fn can_convert_to_ethers_filter_with_null_fields() { + let json = json!( + { + "fromBlock": "0x429d3b", + "toBlock": "0x429d3b", + "address": null, + "topics": null + } + ); + + let filter: Filter = serde_json::from_value(json).unwrap(); + assert_eq!( + filter, + Filter { + block_option: FilterBlockOption::Range { + from_block: Some(4365627u64.into()), + to_block: Some(4365627u64.into()), + }, + address: None, + topics: [None, None, None, None,], + } + ); + } }