forked from paritytech/substrate
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Make working with nested queries a touch easier (paritytech#714)
* First pass adding functions to get blocks and extrinsics * cargo fmt and cache block events * prefix block hash with 0x * pin streams for better ergonomics and add an example of subscribing to blocks * remove unused var * standardise on _all, _best and _finalized for different block header subs * WIP center subscribing around blocks * Remove the event filtering/subscribing stuff * clippy * we need tokio, silly clippy * add extrinsic_index() call * Update subxt/src/blocks/block_types.rs Co-authored-by: Andrew Jones <[email protected]> * Add dynbamic nested query example and make dynamic::tx a little easier to work with * calL_value -> inner_tx * rename example to dynamic_multisig to align with paritytech#713 naming * align dynamic and static multisig examples * Fix comment typo Co-authored-by: Niklas Adolfsson <[email protected]> Co-authored-by: Andrew Jones <[email protected]> Co-authored-by: Niklas Adolfsson <[email protected]>
- Loading branch information
1 parent
14e8e6f
commit 92ace06
Showing
6 changed files
with
2,243 additions
and
1,862 deletions.
There are no files selected for viewing
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
// Copyright 2019-2022 Parity Technologies (UK) Ltd. | ||
// This file is dual-licensed as Apache-2.0 or GPL-3.0. | ||
// see LICENSE for license details. | ||
|
||
//! To run this example, a local polkadot node should be running. Example verified against polkadot v0.9.31-3711c6f9b2a. | ||
//! | ||
//! E.g. | ||
//! ```bash | ||
//! curl "https://github.com/paritytech/polkadot/releases/download/v0.9.31/polkadot" --output /usr/local/bin/polkadot --location | ||
//! polkadot --dev --tmp | ||
//! ``` | ||
|
||
use sp_keyring::AccountKeyring; | ||
use subxt::{ | ||
dynamic::Value, | ||
tx::PairSigner, | ||
OnlineClient, | ||
PolkadotConfig, | ||
}; | ||
|
||
#[tokio::main] | ||
async fn main() -> Result<(), Box<dyn std::error::Error>> { | ||
tracing_subscriber::fmt::init(); | ||
|
||
// My account. | ||
let signer_account = AccountKeyring::Alice; | ||
let signer_account_id = signer_account.to_account_id(); | ||
let signer = PairSigner::new(signer_account.pair()); | ||
|
||
// Transfer balance to this destination: | ||
let dest = AccountKeyring::Bob.to_account_id(); | ||
|
||
// Create a client to use: | ||
let api = OnlineClient::<PolkadotConfig>::new().await?; | ||
|
||
// Create the inner balance transfer call. | ||
let inner_tx = subxt::dynamic::tx( | ||
"Balances", | ||
"transfer", | ||
vec![ | ||
Value::unnamed_variant("Id", [Value::from_bytes(&dest)]), | ||
Value::u128(123_456_789_012_345), | ||
], | ||
); | ||
|
||
// Now, build an outer call which this inner call will be a part of. | ||
// This sets up the multisig arrangement. | ||
// | ||
// Note: Since this is a dynamic call, we can either use named or unnamed | ||
// arguments (if unnamed, the order matters). | ||
let tx = subxt::dynamic::tx( | ||
"Multisig", | ||
"as_multi", | ||
vec![ | ||
("threshold", Value::u128(1)), | ||
( | ||
"other_signatories", | ||
Value::unnamed_composite([Value::from_bytes(&signer_account_id)]), | ||
), | ||
("maybe_timepoint", Value::unnamed_variant("None", [])), | ||
("call", inner_tx.into_value()), | ||
( | ||
"max_weight", | ||
Value::named_composite([ | ||
("ref_time", Value::u128(10000000000)), | ||
("proof_size", Value::u128(1)), | ||
]), | ||
), | ||
], | ||
); | ||
|
||
// Submit it: | ||
let encoded = hex::encode(&api.tx().call_data(&tx)?); | ||
println!("Call data: {encoded}"); | ||
let tx_hash = api.tx().sign_and_submit_default(&tx, &signer).await?; | ||
println!("Submitted tx with hash {tx_hash}"); | ||
|
||
Ok(()) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
// Copyright 2019-2022 Parity Technologies (UK) Ltd. | ||
// This file is dual-licensed as Apache-2.0 or GPL-3.0. | ||
// see LICENSE for license details. | ||
|
||
//! To run this example, a local polkadot node should be running. Example verified against polkadot v0.9.31-3711c6f9b2a. | ||
//! | ||
//! E.g. | ||
//! ```bash | ||
//! curl "https://github.com/paritytech/polkadot/releases/download/v0.9.31/polkadot" --output /usr/local/bin/polkadot --location | ||
//! polkadot --dev --tmp | ||
//! ``` | ||
|
||
use sp_keyring::AccountKeyring; | ||
use subxt::{ | ||
tx::PairSigner, | ||
OnlineClient, | ||
PolkadotConfig, | ||
}; | ||
|
||
#[subxt::subxt(runtime_metadata_path = "../artifacts/polkadot_metadata.scale")] | ||
pub mod polkadot {} | ||
|
||
#[tokio::main] | ||
async fn main() -> Result<(), Box<dyn std::error::Error>> { | ||
tracing_subscriber::fmt::init(); | ||
|
||
// My account. | ||
let signer_account = AccountKeyring::Alice; | ||
let signer_account_id = signer_account.to_account_id(); | ||
let signer = PairSigner::new(signer_account.pair()); | ||
|
||
// Transfer balance to this destination: | ||
let dest = AccountKeyring::Bob.to_account_id(); | ||
|
||
// Create a client to use: | ||
let api = OnlineClient::<PolkadotConfig>::new().await?; | ||
|
||
// Create the inner balance transfer call. | ||
// | ||
// Note: This call, being manually constructed, will have a specific pallet and call index | ||
// which is determined by the generated code. If you're trying to submit this to a node which | ||
// has the pallets/calls at different indexes, it will fail. See `dynamic_multisig.rs` for a | ||
// workaround in this case which will work regardless of pallet and call indexes. | ||
let inner_tx = polkadot::runtime_types::polkadot_runtime::RuntimeCall::Balances( | ||
polkadot::runtime_types::pallet_balances::pallet::Call::transfer { | ||
dest: dest.into(), | ||
value: 123_456_789_012_345, | ||
}, | ||
); | ||
|
||
// Now, build an outer call which this inner call will be a part of. | ||
// This sets up the multisig arrangement. | ||
let tx = polkadot::tx().multisig().as_multi( | ||
// threshold | ||
1, | ||
// other signatories | ||
vec![signer_account_id], | ||
// maybe timepoint | ||
None, | ||
// call | ||
inner_tx, | ||
// max weight | ||
polkadot::runtime_types::sp_weights::weight_v2::Weight { | ||
ref_time: 10000000000, | ||
proof_size: 1, | ||
}, | ||
); | ||
|
||
// Submit the extrinsic with default params: | ||
let encoded = hex::encode(&api.tx().call_data(&tx)?); | ||
println!("Call data: {encoded}"); | ||
let tx_hash = api.tx().sign_and_submit_default(&tx, &signer).await?; | ||
println!("Submitted tx with hash {tx_hash}"); | ||
|
||
Ok(()) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.