quicknode-cascade 0.2.3

Stream blockchain data at scale. Plugin-based framework powered by QuickNode Cascade — start with Solana, more chains coming.
Documentation
//! Backfill Solana slots and print block + transaction summaries.
//!
//!   cargo run --release --example solana_backfill

use quicknode_cascade::{CascadeRunner, solana};

struct BlockLogger;

impl solana::Plugin for BlockLogger {
    fn name(&self) -> &'static str {
        "block-logger"
    }

    fn on_block<'a>(&'a self, block: &'a solana::BlockData) -> solana::PluginFuture<'a> {
        Box::pin(async move {
            println!(
                "slot={} txs={} time={:?}",
                block.slot, block.transaction_count, block.block_time
            );
            Ok(())
        })
    }

    fn on_transaction<'a>(&'a self, tx: &'a solana::TransactionData) -> solana::PluginFuture<'a> {
        Box::pin(async move {
            if !tx.is_vote {
                println!(
                    "  tx={} fee={} success={}",
                    tx.signature, tx.fee, tx.success
                );
            }
            Ok(())
        })
    }
}

fn main() {
    tracing_subscriber::fmt()
        .with_env_filter(
            tracing_subscriber::EnvFilter::try_from_default_env()
                .unwrap_or_else(|_| tracing_subscriber::EnvFilter::new("info")),
        )
        .with_writer(std::io::stderr)
        .init();

    let cursor = "/tmp/cascade_solana_backfill.cursor";
    std::fs::remove_file(cursor).ok();

    CascadeRunner::solana_mainnet()
        .backfill(300_000_000, 300_000_005)
        .concurrency(5)
        .cursor_file(cursor)
        .with_plugin(Box::new(BlockLogger))
        .run()
        .expect("backfill complete");
}