mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-22 13:48:04 +00:00
b6b9ac65c7
* TransactionExtensions basic support for V5 VerifySignature and renames * WIP: subxt-core v5 transaction support * Subxt to support V5 extrinsics * WIP tests failing with wsm trap error * Actually encode mortality to fix tx encode issue * fmt * rename to sign_with_account_and_signature * Add explicit methods for v4 and v5 ext construction * clippy * fix wasm example and no mut self where not needed * fix doc example * another doc fix * Add tests for tx encoding and fix v5 encode issue * add copyright and todo * refactor APIs to have clear v4/v5 split in core and slightly nicer split in subxt proper * rename Partial/SubmittableExtrinsic to *Transaction * Remove SignerT::address since it's not needed * doc fixes * fmt * doc fixes * Fix comment number * Clarify panic behaviour of inject_signature * fmt
65 lines
2.2 KiB
Rust
65 lines
2.2 KiB
Rust
#![allow(missing_docs)]
|
|
use subxt::{
|
|
utils::{AccountId32, MultiAddress},
|
|
OnlineClient, PolkadotConfig,
|
|
};
|
|
|
|
use codec::Decode;
|
|
|
|
#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata_small.scale")]
|
|
pub mod polkadot {}
|
|
|
|
use polkadot::balances::calls::types::TransferKeepAlive;
|
|
|
|
#[tokio::main]
|
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
// Create a client that subscribes to blocks of the Polkadot network.
|
|
let api = OnlineClient::<PolkadotConfig>::from_url("wss://rpc.polkadot.io:443").await?;
|
|
|
|
// Subscribe to all finalized blocks:
|
|
let mut blocks_sub = api.blocks().subscribe_finalized().await?;
|
|
|
|
// For each block, print details about the `TransferKeepAlive` transactions we are interested in.
|
|
while let Some(block) = blocks_sub.next().await {
|
|
let block = block?;
|
|
let block_number = block.header().number;
|
|
let block_hash = block.hash();
|
|
println!("Block #{block_number} ({block_hash}):");
|
|
|
|
let extrinsics = block.extrinsics().await?;
|
|
for transfer in extrinsics.find::<TransferKeepAlive>() {
|
|
let transfer = transfer?;
|
|
|
|
let Some(extensions) = transfer.details.transaction_extensions() else {
|
|
panic!("TransferKeepAlive should be signed")
|
|
};
|
|
|
|
let addr_bytes = transfer
|
|
.details
|
|
.address_bytes()
|
|
.expect("TransferKeepAlive should be signed");
|
|
let sender = MultiAddress::<AccountId32, ()>::decode(&mut &addr_bytes[..])
|
|
.expect("Decoding should work");
|
|
let sender = display_address(&sender);
|
|
let receiver = display_address(&transfer.value.dest);
|
|
let value = transfer.value.value;
|
|
let tip = extensions.tip().expect("Should have tip");
|
|
let nonce = extensions.nonce().expect("Should have nonce");
|
|
|
|
println!(
|
|
" Transfer of {value} DOT:\n {sender} (Tip: {tip}, Nonce: {nonce}) ---> {receiver}",
|
|
);
|
|
}
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
|
|
fn display_address(addr: &MultiAddress<AccountId32, ()>) -> String {
|
|
if let MultiAddress::Id(id32) = addr {
|
|
format!("{id32}")
|
|
} else {
|
|
"MultiAddress::...".into()
|
|
}
|
|
}
|