Subscribing to New Blocks
To subscribe to new blocks, create a Provider instance and call the subscribe_blocks method:
async fn main() -> Result<(), Box<dyn std::error::Error>> { let provider = Provider::<Http>::try_from("http://localhost:8545")?; let mut stream = provider.subscribe_blocks().await?; // Your code to handle new blocks goes here. Ok(()) }
You can now listen to new blocks as they are mined:
#![allow(unused)] fn main() { while let Some(block) = stream.next().await { match block { Ok(block) => { println!("New block: {:?}", block); } Err(e) => { eprintln!("Error: {:?}", e); } } } }
Here is another example of subscribing to new blocks:
use ethers::providers::{Middleware, Provider, StreamExt, Ws}; use eyre::Result; #[tokio::main] async fn main() -> Result<()> { let provider = Provider::<Ws>::connect("wss://mainnet.infura.io/ws/v3/c60b0bb42f8a4c6481ecd229eddaca27") .await?; let mut stream = provider.subscribe_blocks().await?.take(1); while let Some(block) = stream.next().await { println!( "Ts: {:?}, block number: {} -> {:?}", block.timestamp, block.number.unwrap(), block.hash.unwrap() ); } Ok(()) }