mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-26 19:17:58 +00:00
6a295e7c28
* substrate-test-runtime migrated to pure-frame based * test block builder: helpers added * simple renaming * basic_authorship test adjusted * block_building storage_proof test adjusted * babe: tests: should_panic expected added * babe: tests adjusted ConsensusLog::NextEpochData is now added by pallet_babe as pallet_babe::SameAuthoritiesForever trigger is used in runtime config. * beefy: tests adjusted test-substrate-runtime is now using frame::executive to finalize the block. during finalization the digests stored during block execution are checked against header digests: https://github.com/paritytech/substrate/blob/91bb2d29ca905599098a5b35eaf24867c4fbd60a/frame/executive/src/lib.rs#L585-L591 It makes impossible to directly manipulate header's digets, w/o depositing logs into system pallet storage `Digest<T: Config>`. Instead of this dedicated extrinsic allowing to store logs items (MmrRoot / AuthoritiesChange) is used. * grandpa: tests adjusted test-substrate-runtime is now using frame::executive to finalize the block. during finalization the digest logs stored during block execution are checked against header digest logs: https://github.com/paritytech/substrate/blob/91bb2d29ca905599098a5b35eaf24867c4fbd60a/frame/executive/src/lib.rs#L585-L591 It makes impossible to directly manipulate header's digets, w/o depositing logs into system pallet storage `Digest<T: Config>`. Instead of this dedicated extrinsic allowing to store logs items (ScheduledChange / ForcedChange and DigestItem::Other) is used. * network:bitswap: test adjusted The size of unchecked extrinsic was increased. The pattern used in test will be placed at the end of scale-encoded buffer. * runtime apis versions adjusted * storage keys used in runtime adjusted * wasm vs native tests removed * rpc tests: adjusted Transfer transaction processing was slightly improved, test was adjusted. * tests: sizes adjusted Runtime extrinsic size was increased. Size of data read during block execution was also increased due to usage of new pallets in runtime. Sizes were adjusted in tests. * cargo.lock update cargo update -p substrate-test-runtime -p substrate-test-runtime-client * warnings fixed * builders cleanup: includes / std * extrinsic validation cleanup * txpool: benches performance fixed * fmt * spelling * Apply suggestions from code review Co-authored-by: Davide Galassi <davxy@datawok.net> * Apply code review suggestions * Apply code review suggestions * get rid of 1063 const * renaming: UncheckedExtrinsic -> Extrinsic * test-utils-runtime: further step to pure-frame * basic-authorship: tests OK * CheckSubstrateCall added + tests fixes * test::Transfer call removed * priority / propagate / no sudo+root-testing * fixing warnings + format * cleanup: build2/nonce + format * final tests fixes all tests are passing * logs/comments removal * should_not_accept_old_signatures test removed * make txpool benches work again * Cargo.lock reset * format * sudo hack removed * txpool benches fix+cleanup * .gitignore reverted * rebase fixing + unsigned cleanup * Cargo.toml/Cargo.lock cleanup * force-debug feature removed * mmr tests fixed * make cargo-clippy happy * network sync test uses unsigned extrinsic * cleanup * ".git/.scripts/commands/fmt/fmt.sh" * push_storage_change signed call remove * GenesisConfig cleanup * fix * fix * GenesisConfig simplified * storage_keys_works: reworked * storage_keys_works: expected keys in vec * storage keys list moved to substrate-test-runtime * substrate-test: some sanity tests + GenesisConfigBuilder rework * Apply suggestions from code review Co-authored-by: Bastian Köcher <git@kchr.de> * Apply suggestions from code review * Review suggestions * fix * fix * beefy: generate_blocks_and_sync block_num sync with actaul value * Apply suggestions from code review Co-authored-by: Davide Galassi <davxy@datawok.net> * Update test-utils/runtime/src/genesismap.rs Co-authored-by: Davide Galassi <davxy@datawok.net> * cargo update -p sc-rpc -p sc-transaction-pool * Review suggestions * fix * doc added * slot_duration adjusted for Babe::slot_duration * small doc fixes * array_bytes::hex used instead of hex * tiny -> medium name fix * Apply suggestions from code review Co-authored-by: Sebastian Kunert <skunert49@gmail.com> * TransferData::try_from_unchecked_extrinsic -> try_from * Update Cargo.lock --------- Co-authored-by: parity-processbot <> Co-authored-by: Davide Galassi <davxy@datawok.net> Co-authored-by: Bastian Köcher <git@kchr.de> Co-authored-by: Sebastian Kunert <skunert49@gmail.com>
208 lines
6.7 KiB
Rust
208 lines
6.7 KiB
Rust
// This file is part of Substrate.
|
|
|
|
// Copyright (C) Parity Technologies (UK) Ltd.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
//! Provides utils for building the `Extrinsic` instances used with `substrate-test-runtime`.
|
|
|
|
use crate::{
|
|
substrate_test_pallet::pallet::Call as PalletCall, AccountId, Balance, BalancesCall,
|
|
CheckSubstrateCall, Extrinsic, Index, Pair, RuntimeCall, SignedPayload, TransferData,
|
|
};
|
|
use codec::Encode;
|
|
use frame_system::{CheckNonce, CheckWeight};
|
|
use sp_core::crypto::Pair as TraitPair;
|
|
use sp_keyring::AccountKeyring;
|
|
use sp_runtime::{transaction_validity::TransactionPriority, Perbill};
|
|
use sp_std::prelude::*;
|
|
|
|
/// Transfer used in test substrate pallet. Extrinsic is created and signed using this data.
|
|
#[derive(Clone)]
|
|
pub struct Transfer {
|
|
/// Transfer sender and signer of created extrinsic
|
|
pub from: Pair,
|
|
/// The recipient of the transfer
|
|
pub to: AccountId,
|
|
/// Amount of transfer
|
|
pub amount: Balance,
|
|
/// Sender's account nonce at which transfer is valid
|
|
pub nonce: u64,
|
|
}
|
|
|
|
impl Transfer {
|
|
/// Convert into a signed unchecked extrinsic.
|
|
pub fn into_unchecked_extrinsic(self) -> Extrinsic {
|
|
ExtrinsicBuilder::new_transfer(self).build()
|
|
}
|
|
}
|
|
|
|
impl Default for TransferData {
|
|
fn default() -> Self {
|
|
Self {
|
|
from: AccountKeyring::Alice.into(),
|
|
to: AccountKeyring::Bob.into(),
|
|
amount: 0,
|
|
nonce: 0,
|
|
}
|
|
}
|
|
}
|
|
|
|
/// If feasible converts given `Extrinsic` to `TransferData`
|
|
impl TryFrom<&Extrinsic> for TransferData {
|
|
type Error = ();
|
|
fn try_from(uxt: &Extrinsic) -> Result<Self, Self::Error> {
|
|
match uxt {
|
|
Extrinsic {
|
|
function: RuntimeCall::Balances(BalancesCall::transfer_allow_death { dest, value }),
|
|
signature: Some((from, _, (CheckNonce(nonce), ..))),
|
|
} => Ok(TransferData { from: *from, to: *dest, amount: *value, nonce: *nonce }),
|
|
Extrinsic {
|
|
function: RuntimeCall::SubstrateTest(PalletCall::bench_call { transfer }),
|
|
signature: None,
|
|
} => Ok(transfer.clone()),
|
|
_ => Err(()),
|
|
}
|
|
}
|
|
}
|
|
|
|
/// Generates `Extrinsic`
|
|
pub struct ExtrinsicBuilder {
|
|
function: RuntimeCall,
|
|
signer: Option<Pair>,
|
|
nonce: Option<Index>,
|
|
}
|
|
|
|
impl ExtrinsicBuilder {
|
|
/// Create builder for given `RuntimeCall`. By default `Extrinsic` will be signed by `Alice`.
|
|
pub fn new(function: impl Into<RuntimeCall>) -> Self {
|
|
Self { function: function.into(), signer: Some(AccountKeyring::Alice.pair()), nonce: None }
|
|
}
|
|
|
|
/// Create builder for given `RuntimeCall`. `Extrinsic` will be unsigned.
|
|
pub fn new_unsigned(function: impl Into<RuntimeCall>) -> Self {
|
|
Self { function: function.into(), signer: None, nonce: None }
|
|
}
|
|
|
|
/// Create builder for `pallet_call::bench_transfer` from given `TransferData`.
|
|
pub fn new_bench_call(transfer: TransferData) -> Self {
|
|
Self::new_unsigned(PalletCall::bench_call { transfer })
|
|
}
|
|
|
|
/// Create builder for given `Transfer`. Transfer `nonce` will be used as `Extrinsic` nonce.
|
|
/// Transfer `from` will be used as Extrinsic signer.
|
|
pub fn new_transfer(transfer: Transfer) -> Self {
|
|
Self {
|
|
nonce: Some(transfer.nonce),
|
|
signer: Some(transfer.from.clone()),
|
|
..Self::new(BalancesCall::transfer_allow_death {
|
|
dest: transfer.to,
|
|
value: transfer.amount,
|
|
})
|
|
}
|
|
}
|
|
|
|
/// Create builder for `PalletCall::include_data` call using given parameters
|
|
pub fn new_include_data(data: Vec<u8>) -> Self {
|
|
Self::new(PalletCall::include_data { data })
|
|
}
|
|
|
|
/// Create builder for `PalletCall::storage_change` call using given parameters. Will
|
|
/// create unsigned Extrinsic.
|
|
pub fn new_storage_change(key: Vec<u8>, value: Option<Vec<u8>>) -> Self {
|
|
Self::new_unsigned(PalletCall::storage_change { key, value })
|
|
}
|
|
|
|
/// Create builder for `PalletCall::offchain_index_set` call using given parameters
|
|
pub fn new_offchain_index_set(key: Vec<u8>, value: Vec<u8>) -> Self {
|
|
Self::new(PalletCall::offchain_index_set { key, value })
|
|
}
|
|
|
|
/// Create builder for `PalletCall::offchain_index_clear` call using given parameters
|
|
pub fn new_offchain_index_clear(key: Vec<u8>) -> Self {
|
|
Self::new(PalletCall::offchain_index_clear { key })
|
|
}
|
|
|
|
/// Create builder for `PalletCall::indexed_call` call using given parameters
|
|
pub fn new_indexed_call(data: Vec<u8>) -> Self {
|
|
Self::new(PalletCall::indexed_call { data })
|
|
}
|
|
|
|
/// Create builder for `PalletCall::new_deposit_log_digest_item` call using given `log`
|
|
pub fn new_deposit_log_digest_item(log: sp_runtime::generic::DigestItem) -> Self {
|
|
Self::new_unsigned(PalletCall::deposit_log_digest_item { log })
|
|
}
|
|
|
|
/// Create builder for `PalletCall::Call::new_deposit_log_digest_item`
|
|
pub fn new_fill_block(ratio: Perbill) -> Self {
|
|
Self::new(PalletCall::fill_block { ratio })
|
|
}
|
|
|
|
/// Create builder for `PalletCall::call_do_not_propagate` call using given parameters
|
|
pub fn new_call_do_not_propagate() -> Self {
|
|
Self::new(PalletCall::call_do_not_propagate {})
|
|
}
|
|
|
|
/// Create builder for `PalletCall::call_with_priority` call using given parameters
|
|
pub fn new_call_with_priority(priority: TransactionPriority) -> Self {
|
|
Self::new(PalletCall::call_with_priority { priority })
|
|
}
|
|
|
|
/// Create builder for `PalletCall::read` call using given parameters
|
|
pub fn new_read(count: u32) -> Self {
|
|
Self::new_unsigned(PalletCall::read { count })
|
|
}
|
|
|
|
/// Create builder for `PalletCall::read` call using given parameters
|
|
pub fn new_read_and_panic(count: u32) -> Self {
|
|
Self::new_unsigned(PalletCall::read_and_panic { count })
|
|
}
|
|
|
|
/// Unsigned `Extrinsic` will be created
|
|
pub fn unsigned(mut self) -> Self {
|
|
self.signer = None;
|
|
self
|
|
}
|
|
|
|
/// Given `nonce` will be set in `Extrinsic`
|
|
pub fn nonce(mut self, nonce: Index) -> Self {
|
|
self.nonce = Some(nonce);
|
|
self
|
|
}
|
|
|
|
/// Extrinsic will be signed by `signer`
|
|
pub fn signer(mut self, signer: Pair) -> Self {
|
|
self.signer = Some(signer);
|
|
self
|
|
}
|
|
|
|
/// Build `Extrinsic` using embedded parameters
|
|
pub fn build(self) -> Extrinsic {
|
|
if let Some(signer) = self.signer {
|
|
let extra = (
|
|
CheckNonce::from(self.nonce.unwrap_or(0)),
|
|
CheckWeight::new(),
|
|
CheckSubstrateCall {},
|
|
);
|
|
let raw_payload =
|
|
SignedPayload::from_raw(self.function.clone(), extra.clone(), ((), (), ()));
|
|
let signature = raw_payload.using_encoded(|e| signer.sign(e));
|
|
|
|
Extrinsic::new_signed(self.function, signer.public(), signature, extra)
|
|
} else {
|
|
Extrinsic::new_unsigned(self.function)
|
|
}
|
|
}
|
|
}
|