diff --git a/Cargo.toml b/Cargo.toml index 2b4d992..a42e39d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "blockstats" -version = "0.2.0" +version = "0.3.0" edition = "2021" rust-version = "1.56.1" authors = ["Parity Technologies "] @@ -14,7 +14,7 @@ include = ["src/**/*", "LICENSE", "README.md"] [dependencies] codec = { package = "parity-scale-codec", version = "3" } futures = "0.3" -subxt = "0.28" +subxt = { version = "0.33", features = ["substrate-compat"] } [dev-dependencies] clap = { version = "4", features = ["derive"] } diff --git a/src/lib.rs b/src/lib.rs index 53344d5..97176be 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,8 +5,10 @@ use core::ops::Add; use futures::{TryStream, TryStreamExt}; -use std::{boxed::Box, fmt, sync::Arc}; +use std::{boxed::Box, fmt}; use subxt::{ + backend::{legacy::LegacyRpcMethods, rpc::RpcClient}, + error::MetadataError, ext::{scale_decode, sp_core::H256}, storage::{address::StaticStorageMapKey, address::Yes, Address}, Error, OnlineClient, PolkadotConfig as DefaultConfig, @@ -75,28 +77,31 @@ impl fmt::Display for BlockStats { pub async fn subscribe_stats( url: &str, ) -> Result + Unpin, Error> { - let client = OnlineClient::::from_url(url).await?; - subscribe_stats_with_client(client).await + let rpc_client = RpcClient::from_url(url).await?; + subscribe_stats_with_client(rpc_client).await } /// Connect to the specified node and listen for new blocks using OnlineClient. pub async fn subscribe_stats_with_client( - client: OnlineClient, + rpc_client: RpcClient, ) -> Result + Unpin, Error> { - let client = Arc::new(client); - + let client = OnlineClient::::from_rpc_client(rpc_client.clone()).await?; let blocks = client.blocks().subscribe_best().await?; let max_block_weights: BlockWeights = { let metadata = client.metadata(); - let pallet = metadata.pallet("System")?; - let constant = pallet.constant("BlockWeights")?; - codec::Decode::decode(&mut &constant.value[..])? + let pallet = metadata.pallet_by_name_err("System")?; + let constant_name = "BlockWeights"; + let constant = pallet + .constant_by_name(constant_name) + .ok_or_else(|| MetadataError::ConstantNameNotFound(constant_name.to_owned()))?; + codec::Decode::decode(&mut &constant.value()[..])? }; Ok(Box::pin(blocks.map_err(Into::into).and_then( move |block| { let client = client.clone(); + let rpc_methods = LegacyRpcMethods::::new(rpc_client.clone()); let block_weight_address = Address::, Yes, Yes, ()>::new_static( @@ -107,9 +112,8 @@ pub async fn subscribe_stats_with_client( ) .unvalidated(); async move { - let stats = client - .rpc() - .block_stats(block.hash()) + let stats = rpc_methods + .dev_get_block_stats(block.hash()) .await? .ok_or_else(|| Error::Other("Block not available.".to_string()))?; let weight = client