diff --git a/examples/fetch_remote.rs b/examples/fetch_remote.rs new file mode 100644 index 0000000000..061e22fb8b --- /dev/null +++ b/examples/fetch_remote.rs @@ -0,0 +1,42 @@ +// Copyright 2020 Parity Technologies (UK) Ltd. +// This file is part of substrate-subxt. +// +// subxt is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// subxt is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with substrate-subxt. If not, see . + +use substrate_subxt::{ + Error, + KusamaRuntime, + system::System, +}; + +fn main() { + async_std::task::block_on(async move { + env_logger::init(); + + let block_hash = fetch_block_hash(1).await; + match block_hash { + Ok(Some(hash)) => println!("Block hash for block number 1: {}", hash), + Ok(None) => println!("Block number 1 not found."), + Err(_) => eprintln!("Failed to fetch block hash"), + } + }); +} + +async fn fetch_block_hash(block_number: u32) -> Result::Hash>, Error> { + substrate_subxt::ClientBuilder::::new() + .set_url("wss://kusama-rpc.polkadot.io") + .build().await? + .block_hash(Some(block_number.into())) + .await +} diff --git a/src/lib.rs b/src/lib.rs index 91e2def0e8..2a7b7fd2f0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -83,7 +83,7 @@ pub use self::{ error::Error, events::RawEvent, frame::*, - rpc::ExtrinsicSuccess, + rpc::{BlockNumber, ExtrinsicSuccess}, runtimes::*, }; use self::{ @@ -106,7 +106,6 @@ use self::{ }, metadata::Metadata, rpc::{ - BlockNumber, ChainBlock, Rpc, }, @@ -616,7 +615,7 @@ mod tests { #[test] #[ignore] // requires locally running substrate node fn test_create_raw_payload() { - + let result: Result<_, Error> = async_std::task::block_on(async move { let signer_pair = Ed25519Keyring::Alice.pair(); let signer_account_id = Ed25519Keyring::Alice.to_account_id(); @@ -624,7 +623,7 @@ mod tests { let client = test_client().await; - // create raw payload with AccoundId and sign it + // create raw payload with AccoundId and sign it let raw_payload = client.create_raw_payload(signer_account_id, balances::transfer::(dest.clone().into(), 10_000)).await?; let raw_signature = signer_pair.sign(raw_payload.encode().split_off(2).as_slice()); let raw_multisig = MultiSignature::from(raw_signature); @@ -637,7 +636,7 @@ mod tests { assert_eq!(raw_multisig, xt_multi_sig); Ok(()) - + }); assert!(result.is_ok()) diff --git a/src/rpc.rs b/src/rpc.rs index d4d91853a0..f1e1893b5c 100644 --- a/src/rpc.rs +++ b/src/rpc.rs @@ -38,6 +38,7 @@ use jsonrpsee::{ use num_traits::bounds::Bounded; use frame_metadata::RuntimeMetadataPrefixed; +use serde::Serialize; use sp_core::{ storage::{ StorageChangeSet, @@ -82,7 +83,30 @@ use crate::{ pub type ChainBlock = SignedBlock::Header, ::Extrinsic>>; -pub type BlockNumber = NumberOrHex<::BlockNumber>; + +/// Wrapper for NumberOrHex to allow custom From impls +#[derive(Serialize)] +#[serde(bound = "::BlockNumber: Serialize")] +pub struct BlockNumber (NumberOrHex<::BlockNumber>); + +impl From::BlockNumber>> for BlockNumber +where + T: System +{ + fn from(x: NumberOrHex<::BlockNumber>) -> Self { + BlockNumber(x) + } +} + +impl From for BlockNumber +where + T: System, + ::BlockNumber: From, +{ + fn from(x: u32) -> Self { + NumberOrHex::Number(x.into()).into() + } +} /// Client for substrate rpc interfaces #[derive(Clone)]