Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion bridges/bin/runtime-common/src/extensions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ where
#[macro_export]
macro_rules! generate_bridge_reject_obsolete_headers_and_messages {
($call:ty, $account_id:ty, $($filter_call:ty),*) => {
#[derive(Clone, codec::Decode, Default, codec::Encode, Eq, PartialEq, sp_runtime::RuntimeDebug, scale_info::TypeInfo)]
#[derive(Clone, codec::Decode, codec::DecodeWithMemTracking, Default, codec::Encode, Eq, PartialEq, sp_runtime::RuntimeDebug, scale_info::TypeInfo)]
pub struct BridgeRejectObsoleteHeadersAndMessages;
impl sp_runtime::traits::TransactionExtension<$call> for BridgeRejectObsoleteHeadersAndMessages {
const IDENTIFIER: &'static str = "BridgeRejectObsoleteHeadersAndMessages";
Expand Down
4 changes: 2 additions & 2 deletions bridges/chains/chain-polkadot-bulletin/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ use bp_runtime::{
},
Chain, ChainId, TransactionEra,
};
use codec::{Decode, Encode};
use codec::{Decode, DecodeWithMemTracking, Encode};
use frame_support::{
dispatch::DispatchClass,
parameter_types,
Expand Down Expand Up @@ -91,7 +91,7 @@ pub type TransactionExtensionSchema = GenericTransactionExtension<(
)>;

/// Transaction extension, used by Polkadot Bulletin.
#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)]
#[derive(Encode, Decode, DecodeWithMemTracking, Debug, PartialEq, Eq, Clone, TypeInfo)]
pub struct TransactionExtension(TransactionExtensionSchema);

impl<C> sp_runtime::traits::TransactionExtension<C> for TransactionExtension
Expand Down
3 changes: 2 additions & 1 deletion bridges/modules/relayers/src/extension/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ use bp_relayers::{
RewardsAccountOwner, RewardsAccountParams,
};
use bp_runtime::{Chain, RangeInclusiveExt, StaticStrProvider};
use codec::{Decode, Encode};
use codec::{Decode, DecodeWithMemTracking, Encode};
use core::{fmt::Debug, marker::PhantomData};
use frame_support::{
dispatch::{DispatchInfo, PostDispatchInfo},
Expand Down Expand Up @@ -117,6 +117,7 @@ pub enum RelayerAccountAction<AccountId, RewardBalance, LaneId> {
DefaultNoBound,
CloneNoBound,
Decode,
DecodeWithMemTracking,
Encode,
EqNoBound,
PartialEqNoBound,
Expand Down
10 changes: 5 additions & 5 deletions bridges/primitives/runtime/src/extensions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

//! Primitives that may be used for creating signed extensions for indirect runtimes.

use codec::{Compact, Decode, Encode};
use codec::{Compact, Decode, DecodeWithMemTracking, Encode};
use impl_trait_for_tuples::impl_for_tuples;
use scale_info::{StaticTypeInfo, TypeInfo};
use sp_runtime::{
Expand All @@ -29,7 +29,7 @@ use sp_std::{fmt::Debug, marker::PhantomData};
/// Trait that describes some properties of a `TransactionExtension` that are needed in order to
/// send a transaction to the chain.
pub trait TransactionExtensionSchema:
Encode + Decode + Debug + Eq + Clone + StaticTypeInfo
Encode + Decode + DecodeWithMemTracking + Debug + Eq + Clone + StaticTypeInfo
{
/// A type of the data encoded as part of the transaction.
type Payload: Encode + Decode + Debug + Eq + Clone + StaticTypeInfo;
Expand All @@ -44,7 +44,7 @@ impl TransactionExtensionSchema for () {
}

/// An implementation of `TransactionExtensionSchema` using generic params.
#[derive(Encode, Decode, Clone, Debug, PartialEq, Eq, TypeInfo)]
#[derive(Encode, Decode, DecodeWithMemTracking, Clone, Debug, PartialEq, Eq, TypeInfo)]
pub struct GenericTransactionExtensionSchema<P, S>(PhantomData<(P, S)>);

impl<P, S> TransactionExtensionSchema for GenericTransactionExtensionSchema<P, S>
Expand Down Expand Up @@ -104,7 +104,7 @@ impl TransactionExtensionSchema for Tuple {

/// A simplified version of signed extensions meant for producing signed transactions
/// and signed payloads in the client code.
#[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)]
#[derive(Encode, Decode, DecodeWithMemTracking, Debug, PartialEq, Eq, Clone, TypeInfo)]
pub struct GenericTransactionExtension<S: TransactionExtensionSchema> {
/// A payload that is included in the transaction.
pub payload: S::Payload,
Expand All @@ -127,7 +127,7 @@ impl<S, C> TransactionExtension<C> for GenericTransactionExtension<S>
where
C: Dispatchable,
S: TransactionExtensionSchema,
S::Payload: Send + Sync,
S::Payload: DecodeWithMemTracking + Send + Sync,
S::Implicit: Send + Sync,
{
const IDENTIFIER: &'static str = "Not needed.";
Expand Down
4 changes: 2 additions & 2 deletions cumulus/pallets/weight-reclaim/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
extern crate alloc;
#[cfg(not(feature = "std"))]
use alloc::vec::Vec;
use codec::{Decode, Encode};
use codec::{Decode, DecodeWithMemTracking, Encode};
use cumulus_primitives_storage_weight_reclaim::get_proof_size;
use derive_where::derive_where;
use frame_support::{
Expand Down Expand Up @@ -83,7 +83,7 @@ pub mod pallet {
/// calculates the unused weight using the post information and reclaim the unused weight.
/// So this extension can be used as a drop-in replacement for `WeightReclaim` extension for
/// parachains.
#[derive(Encode, Decode, TypeInfo)]
#[derive(Encode, Decode, DecodeWithMemTracking, TypeInfo)]
#[derive_where(Clone, Eq, PartialEq, Default; S)]
#[scale_info(skip_type_params(T))]
pub struct StorageWeightReclaim<T, S>(pub S, core::marker::PhantomData<T>);
Expand Down
4 changes: 3 additions & 1 deletion cumulus/pallets/weight-reclaim/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,9 @@ thread_local! {
}

/// An extension which has some proof_size weight and some proof_size refund.
#[derive(Encode, Decode, Debug, Clone, PartialEq, Eq, scale_info::TypeInfo)]
#[derive(
Encode, Decode, DecodeWithMemTracking, Debug, Clone, PartialEq, Eq, scale_info::TypeInfo,
)]
pub struct MockExtensionWithRefund;

impl TransactionExtension<RuntimeCall> for MockExtensionWithRefund {
Expand Down
4 changes: 2 additions & 2 deletions cumulus/primitives/storage-weight-reclaim/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

#![cfg_attr(not(feature = "std"), no_std)]

use codec::{Decode, Encode};
use codec::{Decode, DecodeWithMemTracking, Encode};
use core::marker::PhantomData;
use cumulus_primitives_core::Weight;
use cumulus_primitives_proof_size_hostfunction::{
Expand Down Expand Up @@ -116,7 +116,7 @@ mod allow_deprecated {
to itself and ignores the post dispatch logic for extensions subsequent to itself, it also
doesn't provide weight information. \
Use `StorageWeightReclaim` in the `cumulus-pallet-weight-reclaim` crate")]
#[derive(Encode, Decode, Clone, Eq, PartialEq, Default, TypeInfo)]
#[derive(Encode, Decode, DecodeWithMemTracking, Clone, Eq, PartialEq, Default, TypeInfo)]
#[scale_info(skip_type_params(T))]
pub struct StorageWeightReclaim<T: Config + Send + Sync>(pub(super) PhantomData<T>);
}
Expand Down
6 changes: 3 additions & 3 deletions docs/sdk/src/reference_docs/transaction_extensions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@

#[docify::export]
pub mod transaction_extensions_example {
use codec::{Decode, Encode};
use codec::{Decode, DecodeWithMemTracking, Encode};
use scale_info::TypeInfo;
use sp_runtime::{
impl_tx_ext_default,
Expand All @@ -72,7 +72,7 @@ pub mod transaction_extensions_example {

// This doesn't actually check anything, but simply allows
// some arbitrary `u32` to be added to the extrinsic payload
#[derive(Debug, Encode, Decode, Clone, Eq, PartialEq, TypeInfo)]
#[derive(Debug, Encode, Decode, DecodeWithMemTracking, Clone, Eq, PartialEq, TypeInfo)]
pub struct AddToPayload(pub u32);

impl<Call: Dispatchable> TransactionExtension<Call> for AddToPayload {
Expand All @@ -87,7 +87,7 @@ pub mod transaction_extensions_example {
// This is the opposite; nothing will be added to the extrinsic payload,
// but the Implicit type (`1234u32`) will be added to the
// payload to be signed.
#[derive(Debug, Encode, Decode, Clone, Eq, PartialEq, TypeInfo)]
#[derive(Debug, Encode, Decode, DecodeWithMemTracking, Clone, Eq, PartialEq, TypeInfo)]
pub struct AddToSignaturePayload;

impl<Call: Dispatchable> TransactionExtension<Call> for AddToSignaturePayload {
Expand Down
2 changes: 1 addition & 1 deletion polkadot/runtime/common/src/claims/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -619,7 +619,7 @@ impl<T: Config> Pallet<T> {

/// Validate `attest` calls prior to execution. Needed to avoid a DoS attack since they are
/// otherwise free to place on chain.
#[derive(Encode, Decode, Clone, Eq, PartialEq, TypeInfo)]
#[derive(Encode, Decode, DecodeWithMemTracking, Clone, Eq, PartialEq, TypeInfo)]
#[scale_info(skip_type_params(T))]
pub struct PrevalidateAttests<T>(core::marker::PhantomData<fn(T)>);

Expand Down
2 changes: 1 addition & 1 deletion prdoc/pr_7634.prdoc
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@ crates:
- name: frame-support-procedural
bump: major
- name: bridge-hub-westend-runtime
bump: none
bump: patch
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why this change?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When working on the prdoc for this PR I realized that I also derived DecodeWithMemTracking in some structures from bridge-hub-westend-runtime in pr #7634. So I guess it should also be patch.

51 changes: 51 additions & 0 deletions prdoc/pr_7655.prdoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0
# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json

title: derive `DecodeWithMemTracking` for `Block`

doc:
- audience: Runtime Dev
description: |
This PR adds `DecodeWithMemTracking` as a trait bound for `Header`, `Block` and `TransactionExtension` and
derives it for all the types that implement these traits in `polkadot-sdk`.
All the external types that implement these traits will need to implement `DecodeWithMemTracking` as well.

crates:
- name: sp-runtime
bump: major
- name: bp-runtime
bump: major
- name: bridge-runtime-common
bump: patch
- name: frame-support
bump: patch
- name: frame-system
bump: patch
- name: pallet-verify-signature
bump: patch
- name: pallet-transaction-payment
bump: patch
- name: pallet-sudo
bump: patch
- name: polkadot-runtime-common
bump: patch
- name: cumulus-pallet-weight-reclaim
bump: patch
- name: cumulus-primitives-storage-weight-reclaim
bump: patch
- name: frame-benchmarking-cli
bump: patch
- name: frame-metadata-hash-extension
bump: patch
- name: pallet-asset-tx-payment
bump: patch
- name: pallet-bridge-relayers
bump: patch
- name: pallet-asset-conversion-tx-payment
bump: patch
- name: pallet-revive
bump: patch
- name: pallet-skip-feeless-payment
bump: patch
- name: bp-polkadot-bulletin
bump: patch
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@

use core::{fmt, marker::PhantomData};

use codec::{Decode, Encode};
use codec::{Decode, DecodeWithMemTracking, Encode};
use frame_support::{pallet_prelude::TransactionSource, traits::OriginTrait, Parameter};
use scale_info::TypeInfo;
use sp_runtime::{
Expand All @@ -38,7 +38,7 @@ use sp_runtime::{
use crate::pallet_coownership::{Config, Origin};

/// Helper struct to organize the data needed for signature verification of both parties involved.
#[derive(Clone, Eq, PartialEq, Encode, Decode, TypeInfo)]
#[derive(Clone, Eq, PartialEq, Encode, Decode, DecodeWithMemTracking, TypeInfo)]
pub struct AuthCredentials<Signer, Signature> {
first: (Signer, Signature),
second: (Signer, Signature),
Expand All @@ -49,7 +49,7 @@ pub struct AuthCredentials<Signer, Signature> {
/// data that follows this extension in the `TransactionExtension` pipeline, their implications and
/// the call. Essentially re-sign the transaction from this point onwards in the pipeline by using
/// the `inherited_implication`, as shown below.
#[derive(Clone, Eq, PartialEq, Encode, Decode, TypeInfo)]
#[derive(Clone, Eq, PartialEq, Encode, Decode, DecodeWithMemTracking, TypeInfo)]
#[scale_info(skip_type_params(T))]
pub struct AuthorizeCoownership<T, Signer, Signature> {
inner: Option<AuthCredentials<Signer, Signature>>,
Expand Down Expand Up @@ -84,8 +84,13 @@ impl<T: Config, Signer, Signature> fmt::Debug for AuthorizeCoownership<T, Signer
impl<T: Config + Send + Sync, Signer, Signature> TransactionExtension<T::RuntimeCall>
for AuthorizeCoownership<T, Signer, Signature>
where
Signer: IdentifyAccount<AccountId = T::AccountId> + Parameter + Send + Sync + 'static,
Signature: Verify<Signer = Signer> + Parameter + Send + Sync + 'static,
Signer: IdentifyAccount<AccountId = T::AccountId>
+ Parameter
+ DecodeWithMemTracking
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you look at the doc of parameter you get:

/// A type that can be used as a parameter in a dispatchable function.
///
/// When using decl_module all arguments for call functions must implement this trait.

I think Parameter itself should bound DecodeWithMemTracking.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree that it would be ideal to have DecodeWithMemTracking implemented for each structure that can be used as a parameter in a dispatchable function. But if we do this, we will have to implement DecodeWithMemTracking for a lot more structures and it will lead to even more work for each runtime when it upgrades to this version of polkadot-sdk. Also it isn't needed. We only want to use DecodeWithMemLimit for Block and Extrinsic for the moment. So personally I would avoid doing this.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't understand, requiring DecodeWithMemTracking to extrinsic implies requiring parameter of dispatchables to bound DecodeWithMemTracking

Do you mean people are using the trait Parameter for other types?
Or do you mean that we don't need to enforce it at the pallet level and only constraint at the runtime definition that call implements DecodeWithMemTracking.

Because Parameter should be the bound for types used in extrinsics as part of call parameters.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done. Sorry, at that point I hadn't checked exactly. I just tried to do Parameter: DecodeWithMemTracking and saw there were a lot of conflicts. So I thought that people were using DecodeWithMemTracking for other types since we already enforce it for RuntimeCall. But looks like the conflicts were coming from types used in tests. Also had to propagate DecodeWithMemTracking to some more traits.

+ Send
+ Sync
+ 'static,
Signature: Verify<Signer = Signer> + Parameter + DecodeWithMemTracking + Send + Sync + 'static,
{
const IDENTIFIER: &'static str = "AuthorizeCoownership";
type Implicit = ();
Expand Down
4 changes: 2 additions & 2 deletions substrate/frame/examples/basic/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
extern crate alloc;

use alloc::vec::Vec;
use codec::{Decode, Encode};
use codec::{Decode, DecodeWithMemTracking, Encode};
use core::marker::PhantomData;
use frame_support::{
dispatch::{ClassifyDispatch, DispatchClass, DispatchResult, Pays, PaysFee, WeighData},
Expand Down Expand Up @@ -487,7 +487,7 @@ impl<T: Config> Pallet<T> {
///
/// Additionally, it drops any transaction with an encoded length higher than 200 bytes. No
/// particular reason why, just to demonstrate the power of transaction extensions.
#[derive(Encode, Decode, Clone, Eq, PartialEq, TypeInfo)]
#[derive(Encode, Decode, DecodeWithMemTracking, Clone, Eq, PartialEq, TypeInfo)]
#[scale_info(skip_type_params(T))]
pub struct WatchDummy<T: Config + Send + Sync>(PhantomData<T>);

Expand Down
6 changes: 3 additions & 3 deletions substrate/frame/metadata-hash-extension/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ extern crate alloc;
/// For our tests
extern crate self as frame_metadata_hash_extension;

use codec::{Decode, Encode};
use codec::{Decode, DecodeWithMemTracking, Encode};
use frame_support::{pallet_prelude::Weight, DebugNoBound};
use frame_system::Config;
use scale_info::TypeInfo;
Expand All @@ -52,7 +52,7 @@ use sp_runtime::{
mod tests;

/// The mode of [`CheckMetadataHash`].
#[derive(Decode, Encode, PartialEq, Debug, TypeInfo, Clone, Copy, Eq)]
#[derive(Decode, Encode, DecodeWithMemTracking, PartialEq, Debug, TypeInfo, Clone, Copy, Eq)]
enum Mode {
Disabled,
Enabled,
Expand Down Expand Up @@ -113,7 +113,7 @@ impl MetadataHash {
/// environment variable is for example set by the `substrate-wasm-builder` when the feature for
/// generating the metadata hash is enabled. If the environment variable is not set and `mode = 1`
/// is passed, the transaction is rejected with [`UnknownTransaction::CannotLookup`].
#[derive(Encode, Decode, Clone, Eq, PartialEq, TypeInfo, DebugNoBound)]
#[derive(Encode, Decode, DecodeWithMemTracking, Clone, Eq, PartialEq, TypeInfo, DebugNoBound)]
#[scale_info(skip_type_params(T))]
pub struct CheckMetadataHash<T> {
_phantom: core::marker::PhantomData<T>,
Expand Down
4 changes: 2 additions & 2 deletions substrate/frame/revive/src/evm/runtime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ use crate::{
LOG_TARGET,
};
use alloc::vec::Vec;
use codec::{Decode, Encode};
use codec::{Decode, DecodeWithMemTracking, Encode};
use frame_support::{
dispatch::{DispatchInfo, GetDispatchInfo},
traits::{ExtrinsicCall, InherentBuilder, SignedTransactionBuilder},
Expand Down Expand Up @@ -59,7 +59,7 @@ pub(crate) const GAS_PRICE: u64 = 1_000u64;

/// Wraps [`generic::UncheckedExtrinsic`] to support checking unsigned
/// [`crate::Call::eth_transact`] extrinsic.
#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug)]
#[derive(Encode, Decode, DecodeWithMemTracking, Clone, PartialEq, Eq, RuntimeDebug)]
pub struct UncheckedExtrinsic<Address, Signature, E: EthExtra>(
pub generic::UncheckedExtrinsic<Address, CallOf<E::Config>, Signature, E::Extension>,
);
Expand Down
4 changes: 2 additions & 2 deletions substrate/frame/sudo/src/extension.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
// limitations under the License.

use crate::{Config, Key};
use codec::{Decode, Encode};
use codec::{Decode, DecodeWithMemTracking, Encode};
use core::{fmt, marker::PhantomData};
use frame_support::{dispatch::DispatchInfo, ensure, pallet_prelude::TransactionSource};
use scale_info::TypeInfo;
Expand All @@ -37,7 +37,7 @@ use sp_runtime::{
/// fail on applying them as they are not allowed/disabled/whatever. This would be some huge dos
/// vector to any kind of chain. This extension solves the dos vector by preventing any kind of
/// transaction entering the pool as long as it is not signed by the sudo account.
#[derive(Clone, Eq, PartialEq, Encode, Decode, TypeInfo)]
#[derive(Clone, Eq, PartialEq, Encode, Decode, DecodeWithMemTracking, TypeInfo)]
#[scale_info(skip_type_params(T))]
pub struct CheckOnlySudoAccount<T: Config + Send + Sync>(PhantomData<T>);

Expand Down
8 changes: 4 additions & 4 deletions substrate/frame/support/src/dispatch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1215,7 +1215,7 @@ mod per_dispatch_class_tests {

#[cfg(test)]
mod test_extensions {
use codec::{Decode, Encode};
use codec::{Decode, DecodeWithMemTracking, Encode};
use scale_info::TypeInfo;
use sp_runtime::{
impl_tx_ext_default,
Expand All @@ -1230,7 +1230,7 @@ mod test_extensions {
use super::{DispatchResult, PostDispatchInfo};

/// Test extension that refunds half its cost if the preset inner flag is set.
#[derive(Clone, Eq, PartialEq, Debug, Encode, Decode, TypeInfo)]
#[derive(Clone, Eq, PartialEq, Debug, Encode, Decode, DecodeWithMemTracking, TypeInfo)]
pub struct HalfCostIf(pub bool);

impl<RuntimeCall: Dispatchable> TransactionExtension<RuntimeCall> for HalfCostIf {
Expand Down Expand Up @@ -1272,7 +1272,7 @@ mod test_extensions {

/// Test extension that refunds its cost if the actual post dispatch weight up until this point
/// in the extension pipeline is less than the preset inner `ref_time` amount.
#[derive(Clone, Eq, PartialEq, Debug, Encode, Decode, TypeInfo)]
#[derive(Clone, Eq, PartialEq, Debug, Encode, Decode, DecodeWithMemTracking, TypeInfo)]
pub struct FreeIfUnder(pub u64);

impl<RuntimeCall: Dispatchable> TransactionExtension<RuntimeCall> for FreeIfUnder
Expand Down Expand Up @@ -1318,7 +1318,7 @@ mod test_extensions {

/// Test extension that sets its actual post dispatch `ref_time` weight to the preset inner
/// amount.
#[derive(Clone, Eq, PartialEq, Debug, Encode, Decode, TypeInfo)]
#[derive(Clone, Eq, PartialEq, Debug, Encode, Decode, DecodeWithMemTracking, TypeInfo)]
pub struct ActualWeightIs(pub u64);

impl<RuntimeCall: Dispatchable> TransactionExtension<RuntimeCall> for ActualWeightIs {
Expand Down
Loading
Loading