ethl 0.1.19

Tools for capturing, processing, archiving, and replaying Ethereum events
Documentation
use alloy::providers::{Provider, ProviderBuilder};
use alloy::rpc::types::Filter;
use alloy::transports::mock::Asserter;
use anyhow::Result;
use ethl::rpc::backfill::backfill;
use ethl::rpc::config::ProviderSettings;
use futures_util::pin_mut;
use futures_util::stream::StreamExt;
use std::collections::HashSet;

#[tokio::test]
async fn test_backfill() -> Result<()> {
    let logs: serde_json::Value = serde_json::from_str(include_str!(
        "fixtures/transfer_getlogs_34762687_34762688.json"
    ))?;

    let asserter = Asserter::new();
    asserter.push_success(&logs);

    let provider = ProviderBuilder::new()
        .disable_recommended_fillers()
        .connect_mocked_client(asserter)
        .erased();
    let settings = ProviderSettings::from_mock(provider);

    let filter = Filter::new().from_block(34762687).to_block(34762688);
    let log_stream = backfill(&settings, &filter).await;
    pin_mut!(log_stream);
    let mut blocks: HashSet<u64> = HashSet::default();
    let mut all = vec![];
    while let Some(result) = log_stream.next().await {
        let (from, to, logs) = result?;
        for log in &logs {
            all.push(((log.block_number.unwrap() as u128) << 16) + log.log_index.unwrap() as u128);
        }
        blocks.insert(from);
        blocks.insert(to);
    }
    assert_eq!(blocks.len(), 2);
    assert!(blocks.contains(&34762687));
    assert!(blocks.contains(&34762688));
    let mut sorted = all.clone();
    sorted.sort();
    assert_eq!(all, sorted);
    Ok(())
}