fix: get_logs_paginated fetches past latest block (#1818)
This commit is contained in:
parent
ba9aa7838b
commit
eb40392399
|
@ -93,6 +93,7 @@
|
||||||
- [#1632](https://github.com/gakonst/ethers-rs/pull/1632) Re-export `H32` from `ethabi`.
|
- [#1632](https://github.com/gakonst/ethers-rs/pull/1632) Re-export `H32` from `ethabi`.
|
||||||
- [#1634](https://github.com/gakonst/ethers-rs/pull/1634) Derive missing `Clone`, `Copy` and `Debug` impls in ethers-etherscan.
|
- [#1634](https://github.com/gakonst/ethers-rs/pull/1634) Derive missing `Clone`, `Copy` and `Debug` impls in ethers-etherscan.
|
||||||
- Bytes debug format now displays hex literals [#1658](https://github.com/gakonst/ethers-rs/pull/1658)
|
- Bytes debug format now displays hex literals [#1658](https://github.com/gakonst/ethers-rs/pull/1658)
|
||||||
|
- Fix `get_logs_paginated` trying to fetch beyond the latest block
|
||||||
|
|
||||||
## ethers-contract-abigen
|
## ethers-contract-abigen
|
||||||
|
|
||||||
|
|
|
@ -93,7 +93,7 @@ where
|
||||||
// this is okay because we will only enter this state when the filter is
|
// this is okay because we will only enter this state when the filter is
|
||||||
// paginatable i.e. from block is set
|
// paginatable i.e. from block is set
|
||||||
let from_block = self.filter.get_from_block().unwrap();
|
let from_block = self.filter.get_from_block().unwrap();
|
||||||
let to_block = from_block + self.page_size;
|
let to_block = std::cmp::min(from_block + self.page_size, last_block);
|
||||||
self.from_block = Some(to_block + 1);
|
self.from_block = Some(to_block + 1);
|
||||||
|
|
||||||
let filter = self.filter.clone().from_block(from_block).to_block(to_block);
|
let filter = self.filter.clone().from_block(from_block).to_block(to_block);
|
||||||
|
@ -122,7 +122,7 @@ where
|
||||||
// load new logs if there are still more pages to go through
|
// load new logs if there are still more pages to go through
|
||||||
// can safely assume this will always be set in this state
|
// can safely assume this will always be set in this state
|
||||||
let from_block = self.from_block.unwrap();
|
let from_block = self.from_block.unwrap();
|
||||||
let to_block = from_block + self.page_size;
|
let to_block = std::cmp::min(from_block + self.page_size, self.last_block.unwrap());
|
||||||
|
|
||||||
// no more pages to load, and everything is consumed
|
// no more pages to load, and everything is consumed
|
||||||
// can safely assume this will always be set in this state
|
// can safely assume this will always be set in this state
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
#![cfg(not(target_arch = "wasm32"))]
|
||||||
|
use ethers_core::{
|
||||||
|
types::{Filter, BlockNumber},
|
||||||
|
utils::Anvil,
|
||||||
|
};
|
||||||
|
use ethers_providers::{Http, Middleware, Provider, StreamExt};
|
||||||
|
use std::convert::TryFrom;
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
async fn get_logs_paginated() {
|
||||||
|
let geth = Anvil::new().block_time(20u64).spawn();
|
||||||
|
let provider = Provider::<Http>::try_from(geth.endpoint()).unwrap();
|
||||||
|
|
||||||
|
let filter = Filter::new().from_block(BlockNumber::Latest);
|
||||||
|
// try to get beyond the number of blocks available
|
||||||
|
let mut stream = provider.get_logs_paginated(&filter, 10);
|
||||||
|
let res = stream.next().await;
|
||||||
|
assert!(res.is_some());
|
||||||
|
let log = res.unwrap();
|
||||||
|
assert!(log.is_ok());
|
||||||
|
}
|
Loading…
Reference in New Issue