Files
nym/common/nyxd-scraper-shared/examples/watcher.rs
Jędrzej Stuczyński 49c710e651 feat: nyxd watcher (#6561)
* removed explicit storage_tx within MsgModule, TxModule and BlockModule impls

* created a NyxdWatcher that does not persist processed block info

* removed unused imports
2026-03-13 13:15:36 +00:00

65 lines
1.8 KiB
Rust

// Copyright 2026 - Nym Technologies SA <contact@nymtech.net>
// SPDX-License-Identifier: Apache-2.0
use nyxd_scraper_shared::error::ScraperError;
use nyxd_scraper_shared::storage::FullBlockInformation;
use nyxd_scraper_shared::watcher::{NyxdWatcher, WatcherConfig};
use nyxd_scraper_shared::{BlockModule, ParsedTransactionResponse, TxModule};
struct FancyBlockModule;
struct FancyTxModule;
#[async_trait::async_trait]
impl BlockModule for FancyBlockModule {
async fn handle_block(&mut self, block: &FullBlockInformation) -> Result<(), ScraperError> {
println!("🚀 got new block for height {}", block.block.header.height);
// should be false
println!("results scraped: {}", block.results.is_some());
// should be false
println!("validators scraped: {}", block.validators.is_some());
// should be true
println!("transactions scraped: {}", block.transactions.is_some());
println!();
Ok(())
}
}
#[async_trait::async_trait]
impl TxModule for FancyTxModule {
async fn handle_tx(&mut self, tx: &ParsedTransactionResponse) -> Result<(), ScraperError> {
println!(
"✨ got new tx for height {}: {} ({} msgs)",
tx.block.header.height,
tx.hash,
tx.parsed_messages.len()
);
Ok(())
}
}
#[tokio::main]
async fn main() -> eyre::Result<()> {
let cfg = WatcherConfig {
websocket_url: "wss://rpc.nymtech.net/websocket".parse()?,
rpc_url: "https://rpc.nymtech.net".parse()?,
};
let watcher = NyxdWatcher::builder(cfg)
.with_block_module(FancyBlockModule)
.with_tx_module(FancyTxModule)
.build_and_start()
.await?;
// run for 30s before shutting down
tokio::time::sleep(std::time::Duration::from_secs(30)).await;
watcher.stop().await;
Ok(())
}