mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-13 07:01:05 +00:00
8329990a33
* WIP integrating new frame-decode and working out new storage APIS * WIP: first pass adding new storage things to subxt-core * Second pass over Address type and start impl in Subxt * WIP new storage APIs * WIP New storage APIs roughly completed, lots of errors still * Remove PlainorMap enum; plain and map values now use same struct to simplify usage * Begin 'fixing' errors * WIP splitting errors and tidying payload/address traits * Get subxt-core compiling * Small fixes in subxt-core and remove metadata mod * subxt-core: cargo check --all-targets passes * Fix test * WIP starting to update subxt from subxt-core changes * WIP splitting up subxt errors into smaller variants * WIP errors: add DispatchError errors * Port new Storage APIs to subxt-core * cargo check -p subxt passes * Quick-fix errors in subxt-cli (explore subcommand) * fmt * Finish fixing codegen up and start fixing examples * get Subxt examples compiling and bytes_at for constants * Add some arcs to limit lifetimes in subxt/subxt-core storage APIs * A little Arcing to allow more method chaining in Storage APIs, aligning with Subxt * Update codegen test * cargo check --all-targets passing * cargo check --features 'unstable-light-client' passing * clippy * Remove unused dep in subxt * use published frame-decode * fix wasm-example * Add new tx extension to fix daily tests * Remove unused subxt_core::dynamic::DecodedValue type * Update book to match changes * Update docs to fix more broken bits * Add missing docs * fmt * allow larger result errs for now * Add missing alloc imports in subxt-core * Fix doc tests and fix bug getting constant info * Fix V14 -> Metadata transform for storage & constants * Fix parachain example * Fix FFI example * BlockLength decodes t ostruct, not u128 * use fetch/iter shorthands rather than entry in most storage tests * Fix some integration tests * Fix Runtime codegen tests * Expose the dynamic custom_value selecter and use in a UI test * Update codegen metadata * Tidy CLI storage query and support (str,str) as a storage address * Add (str,str) as valid constant address too * Show string tuple in constants example * Via the magic of traits, avoid needing any clones of queries/addresses and accept references to them * clippy
84 lines
3.1 KiB
Rust
84 lines
3.1 KiB
Rust
#![allow(missing_docs)]
|
|
use subxt_historic::{Error, OnlineClient, PolkadotConfig};
|
|
|
|
#[tokio::main]
|
|
async fn main() -> Result<(), Error> {
|
|
// Configuration for the Polkadot relay chain.
|
|
let config = PolkadotConfig::new();
|
|
|
|
// Create an online client for the Polkadot relay chain, pointed at a Polkadot archive node.
|
|
let client = OnlineClient::from_url(config, "wss://rpc.polkadot.io").await?;
|
|
|
|
// Iterate through some randomly selected old blocks to show how to fetch and decode extrinsics.
|
|
for block_number in 123456.. {
|
|
println!("=== Block {block_number} ===");
|
|
|
|
// Point the client at a specific block number. By default this will download and cache
|
|
// metadata for the required spec version (so it's cheaper to instantiate again), if it
|
|
// hasn't already, and borrow the relevant legacy types from the client.
|
|
let client_at_block = client.at(block_number).await?;
|
|
|
|
// Fetch the extrinsics at that block.
|
|
let extrinsics = client_at_block.extrinsics().fetch().await?;
|
|
|
|
// Now, we have various operations to work with them. Here we print out various details
|
|
// about each extrinsic.
|
|
for extrinsic in extrinsics.iter() {
|
|
println!(
|
|
"{}.{}",
|
|
extrinsic.call().pallet_name(),
|
|
extrinsic.call().name()
|
|
);
|
|
|
|
if let Some(signature) = extrinsic.signature_bytes() {
|
|
println!(" Signature: 0x{}", hex::encode(signature));
|
|
}
|
|
|
|
println!(" Call Data:");
|
|
|
|
// We can decode each of the fields (in this example we decode everything into a
|
|
// scale_value::Value type, which can represent any SCALE encoded data, but if you
|
|
// have an idea of the type then you can try to decode into that type instead):
|
|
for field in extrinsic.call().fields().iter() {
|
|
println!(
|
|
" {}: {}",
|
|
field.name(),
|
|
field.decode_as::<scale_value::Value>().unwrap()
|
|
);
|
|
}
|
|
|
|
// Or, all of them at once:
|
|
println!(
|
|
" All: {}",
|
|
extrinsic
|
|
.call()
|
|
.fields()
|
|
.decode_as::<scale_value::Composite<_>>()
|
|
.unwrap()
|
|
);
|
|
|
|
// We can also look at things like the transaction extensions:
|
|
if let Some(extensions) = extrinsic.transaction_extensions() {
|
|
println!(" Transaction Extensions:");
|
|
|
|
// We can decode each of them:
|
|
for extension in extensions.iter() {
|
|
println!(
|
|
" {}: {}",
|
|
extension.name(),
|
|
extension.decode_as::<scale_value::Value>().unwrap()
|
|
);
|
|
}
|
|
|
|
// Or all of them at once:
|
|
println!(
|
|
" All: {}",
|
|
extensions.decode_as::<scale_value::Composite<_>>().unwrap()
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
Ok(())
|
|
}
|