Simplify creating and signing extrinsics (#490)

* WIP extrinsic api updates

* First pass done; now to get things compiling again

* document and tweak new structs/traits

* cargo check --all-targets now compiles without issue

* Polkadot and Substrate take different extra params; support both

* Fix transaction format (missing byte from AccountId -> Address) and fmt

* Tweak Signer trait

* Tweak comments and such in extrinsic params

* check all examples against newer polkadot, add new one with params, import path tweaks

* clippy fix, and save an allocation when signing

* Remove unnecessary Default clauses

* Tidy up and fix comments. Panic if payload size >4GB

* fix typo
This commit is contained in:
James Wilson
2022-03-30 18:53:54 +02:00
committed by GitHub
parent 82f304005b
commit 3d669f97c6
32 changed files with 2064 additions and 1114 deletions
File diff suppressed because it is too large Load Diff
+1 -2
View File
@@ -24,7 +24,6 @@ use crate::{
};
use futures::StreamExt;
use sp_keyring::AccountKeyring;
use subxt::Signer;
// Check that we can subscribe to non-finalized block events.
#[async_std::test]
@@ -118,7 +117,7 @@ async fn balance_transfer_subscription() -> Result<(), subxt::BasicError> {
.tx()
.balances()
.transfer(bob.clone().into(), 10_000)
.sign_and_submit_then_watch(&alice)
.sign_and_submit_then_watch_default(&alice)
.await?;
// Wait for the next balance transfer event in our subscription stream
+7 -10
View File
@@ -34,10 +34,7 @@ use sp_runtime::{
AccountId32,
MultiAddress,
};
use subxt::{
Error,
Signer,
};
use subxt::Error;
#[async_std::test]
async fn tx_basic_transfer() -> Result<(), subxt::Error<DispatchError>> {
@@ -62,7 +59,7 @@ async fn tx_basic_transfer() -> Result<(), subxt::Error<DispatchError>> {
.tx()
.balances()
.transfer(bob_address, 10_000)
.sign_and_submit_then_watch(&alice)
.sign_and_submit_then_watch_default(&alice)
.await?
.wait_for_finalized_success()
.await?;
@@ -118,7 +115,7 @@ async fn multiple_transfers_work_nonce_incremented(
.tx()
.balances()
.transfer(bob_address.clone(), 10_000)
.sign_and_submit_then_watch(&alice)
.sign_and_submit_then_watch_default(&alice)
.await?
.wait_for_in_block() // Don't need to wait for finalization; this is quicker.
.await?
@@ -163,7 +160,7 @@ async fn storage_balance_lock() -> Result<(), subxt::Error<DispatchError>> {
100_000_000_000_000,
runtime_types::pallet_staking::RewardDestination::Stash,
)
.sign_and_submit_then_watch(&bob)
.sign_and_submit_then_watch_default(&bob)
.await?
.wait_for_finalized_success()
.await?
@@ -203,7 +200,7 @@ async fn transfer_error() {
.tx()
.balances()
.transfer(hans_address, 100_000_000_000_000_000)
.sign_and_submit_then_watch(&alice)
.sign_and_submit_then_watch_default(&alice)
.await
.unwrap()
.wait_for_finalized_success()
@@ -215,7 +212,7 @@ async fn transfer_error() {
.tx()
.balances()
.transfer(alice_addr, 100_000_000_000_000_000)
.sign_and_submit_then_watch(&hans)
.sign_and_submit_then_watch_default(&hans)
.await
.unwrap()
.wait_for_finalized_success()
@@ -242,7 +239,7 @@ async fn transfer_implicit_subscription() {
.tx()
.balances()
.transfer(bob_addr, 10_000)
.sign_and_submit_then_watch(&alice)
.sign_and_submit_then_watch_default(&alice)
.await
.unwrap()
.wait_for_finalized_success()
+6 -6
View File
@@ -28,7 +28,7 @@ use crate::{
DispatchError,
},
test_context,
NodeRuntimeSignedExtra,
NodeRuntimeParams,
TestContext,
};
use sp_core::sr25519::Pair;
@@ -44,7 +44,7 @@ use subxt::{
struct ContractsTestContext {
cxt: TestContext,
signer: PairSigner<DefaultConfig, NodeRuntimeSignedExtra, Pair>,
signer: PairSigner<DefaultConfig, Pair>,
}
type Hash = <DefaultConfig as Config>::Hash;
@@ -62,7 +62,7 @@ impl ContractsTestContext {
self.cxt.client()
}
fn contracts_tx(&self) -> TransactionApi<DefaultConfig, NodeRuntimeSignedExtra> {
fn contracts_tx(&self) -> TransactionApi<DefaultConfig, NodeRuntimeParams> {
self.cxt.api.tx().contracts()
}
@@ -91,7 +91,7 @@ impl ContractsTestContext {
vec![], // data
vec![], // salt
)
.sign_and_submit_then_watch(&self.signer)
.sign_and_submit_then_watch_default(&self.signer)
.await?
.wait_for_finalized_success()
.await?;
@@ -131,7 +131,7 @@ impl ContractsTestContext {
data,
salt,
)
.sign_and_submit_then_watch(&self.signer)
.sign_and_submit_then_watch_default(&self.signer)
.await?
.wait_for_finalized_success()
.await?;
@@ -162,7 +162,7 @@ impl ContractsTestContext {
None, // storage_deposit_limit
input_data,
)
.sign_and_submit_then_watch(&self.signer)
.sign_and_submit_then_watch_default(&self.signer)
.await?;
log::info!("Call result: {:?}", result);
+10 -13
View File
@@ -32,10 +32,7 @@ use sp_core::{
Pair,
};
use sp_keyring::AccountKeyring;
use subxt::{
Error,
Signer,
};
use subxt::Error;
/// Helper function to generate a crypto pair from seed
fn get_from_seed(seed: &str) -> sr25519::Pair {
@@ -58,7 +55,7 @@ async fn validate_with_controller_account() {
.tx()
.staking()
.validate(default_validator_prefs())
.sign_and_submit_then_watch(&alice)
.sign_and_submit_then_watch_default(&alice)
.await
.unwrap()
.wait_for_finalized_success()
@@ -75,7 +72,7 @@ async fn validate_not_possible_for_stash_account() -> Result<(), Error<DispatchE
.tx()
.staking()
.validate(default_validator_prefs())
.sign_and_submit_then_watch(&alice_stash)
.sign_and_submit_then_watch_default(&alice_stash)
.await?
.wait_for_finalized_success()
.await;
@@ -96,7 +93,7 @@ async fn nominate_with_controller_account() {
.tx()
.staking()
.nominate(vec![bob.account_id().clone().into()])
.sign_and_submit_then_watch(&alice)
.sign_and_submit_then_watch_default(&alice)
.await
.unwrap()
.wait_for_finalized_success()
@@ -115,7 +112,7 @@ async fn nominate_not_possible_for_stash_account() -> Result<(), Error<DispatchE
.tx()
.staking()
.nominate(vec![bob.account_id().clone().into()])
.sign_and_submit_then_watch(&alice_stash)
.sign_and_submit_then_watch_default(&alice_stash)
.await?
.wait_for_finalized_success()
.await;
@@ -139,7 +136,7 @@ async fn chill_works_for_controller_only() -> Result<(), Error<DispatchError>> {
.tx()
.staking()
.nominate(vec![bob_stash.account_id().clone().into()])
.sign_and_submit_then_watch(&alice)
.sign_and_submit_then_watch_default(&alice)
.await?
.wait_for_finalized_success()
.await?;
@@ -158,7 +155,7 @@ async fn chill_works_for_controller_only() -> Result<(), Error<DispatchError>> {
.tx()
.staking()
.chill()
.sign_and_submit_then_watch(&alice_stash)
.sign_and_submit_then_watch_default(&alice_stash)
.await?
.wait_for_finalized_success()
.await;
@@ -173,7 +170,7 @@ async fn chill_works_for_controller_only() -> Result<(), Error<DispatchError>> {
.tx()
.staking()
.chill()
.sign_and_submit_then_watch(&alice)
.sign_and_submit_then_watch_default(&alice)
.await?
.wait_for_finalized_success()
.await?
@@ -197,7 +194,7 @@ async fn tx_bond() -> Result<(), Error<DispatchError>> {
100_000_000_000_000,
RewardDestination::Stash,
)
.sign_and_submit_then_watch(&alice)
.sign_and_submit_then_watch_default(&alice)
.await?
.wait_for_finalized_success()
.await;
@@ -213,7 +210,7 @@ async fn tx_bond() -> Result<(), Error<DispatchError>> {
100_000_000_000_000,
RewardDestination::Stash,
)
.sign_and_submit_then_watch(&alice)
.sign_and_submit_then_watch_default(&alice)
.await?
.wait_for_finalized_success()
.await;
+2 -2
View File
@@ -44,7 +44,7 @@ async fn test_sudo() -> Result<(), subxt::Error<DispatchError>> {
.tx()
.sudo()
.sudo(call)
.sign_and_submit_then_watch(&alice)
.sign_and_submit_then_watch_default(&alice)
.await?
.wait_for_finalized_success()
.await?
@@ -70,7 +70,7 @@ async fn test_sudo_unchecked_weight() -> Result<(), subxt::Error<DispatchError>>
.tx()
.sudo()
.sudo_unchecked_weight(call, 0)
.sign_and_submit_then_watch(&alice)
.sign_and_submit_then_watch_default(&alice)
.await?
.wait_for_finalized_success()
.await?
+1 -2
View File
@@ -24,7 +24,6 @@ use crate::{
};
use assert_matches::assert_matches;
use sp_keyring::AccountKeyring;
use subxt::Signer;
#[async_std::test]
async fn storage_account() -> Result<(), subxt::Error<DispatchError>> {
@@ -52,7 +51,7 @@ async fn tx_remark_with_event() -> Result<(), subxt::Error<DispatchError>> {
.tx()
.system()
.remark_with_event(b"remarkable".to_vec())
.sign_and_submit_then_watch(&alice)
.sign_and_submit_then_watch_default(&alice)
.await?
.wait_for_finalized_success()
.await?
+3 -3
View File
@@ -49,7 +49,7 @@ async fn storage_map_lookup() -> Result<(), subxt::Error<DispatchError>> {
.tx()
.system()
.remark(vec![1, 2, 3, 4, 5])
.sign_and_submit_then_watch(&signer)
.sign_and_submit_then_watch_default(&signer)
.await?
.wait_for_finalized_success()
.await?;
@@ -114,7 +114,7 @@ async fn storage_n_map_storage_lookup() -> Result<(), subxt::Error<DispatchError
.tx()
.assets()
.create(99, alice.clone().into(), 1)
.sign_and_submit_then_watch(&signer)
.sign_and_submit_then_watch_default(&signer)
.await?
.wait_for_finalized_success()
.await?;
@@ -122,7 +122,7 @@ async fn storage_n_map_storage_lookup() -> Result<(), subxt::Error<DispatchError
.tx()
.assets()
.approve_transfer(99, bob.clone().into(), 123)
.sign_and_submit_then_watch(&signer)
.sign_and_submit_then_watch_default(&signer)
.await?
.wait_for_finalized_success()
.await?;
+4 -8
View File
@@ -22,18 +22,16 @@ pub(crate) use crate::{
use sp_core::sr25519::Pair;
use sp_keyring::AccountKeyring;
use subxt::{
extrinsic::ChargeAssetTxPayment,
Client,
DefaultConfig,
DefaultExtraWithTxPayment,
PairSigner,
SubstrateExtrinsicParams,
};
/// substrate node should be installed on the $PATH
const SUBSTRATE_NODE_PATH: &str = "substrate";
pub type NodeRuntimeSignedExtra =
DefaultExtraWithTxPayment<DefaultConfig, ChargeAssetTxPayment<DefaultConfig>>;
pub type NodeRuntimeParams = SubstrateExtrinsicParams<DefaultConfig>;
pub async fn test_node_process_with(
key: AccountKeyring,
@@ -60,7 +58,7 @@ pub async fn test_node_process() -> TestNodeProcess<DefaultConfig> {
pub struct TestContext {
pub node_proc: TestNodeProcess<DefaultConfig>,
pub api: node_runtime::RuntimeApi<DefaultConfig, NodeRuntimeSignedExtra>,
pub api: node_runtime::RuntimeApi<DefaultConfig, NodeRuntimeParams>,
}
impl TestContext {
@@ -76,8 +74,6 @@ pub async fn test_context() -> TestContext {
TestContext { node_proc, api }
}
pub fn pair_signer(
pair: Pair,
) -> PairSigner<DefaultConfig, NodeRuntimeSignedExtra, Pair> {
pub fn pair_signer(pair: Pair) -> PairSigner<DefaultConfig, Pair> {
PairSigner::new(pair)
}