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");
}