diff --git a/bridges/bin/runtime-common/src/extensions.rs b/bridges/bin/runtime-common/src/extensions.rs index 2f57310d54b1..516b873a3f4e 100644 --- a/bridges/bin/runtime-common/src/extensions.rs +++ b/bridges/bin/runtime-common/src/extensions.rs @@ -274,11 +274,9 @@ 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)] pub struct BridgeRejectObsoleteHeadersAndMessages; - impl sp_runtime::traits::TransactionExtensionBase for BridgeRejectObsoleteHeadersAndMessages { + impl sp_runtime::traits::TransactionExtension<$call> for BridgeRejectObsoleteHeadersAndMessages { const IDENTIFIER: &'static str = "BridgeRejectObsoleteHeadersAndMessages"; type Implicit = (); - } - impl sp_runtime::traits::TransactionExtension<$call> for BridgeRejectObsoleteHeadersAndMessages { type Pre = Option<( $account_id, ( $( diff --git a/bridges/chains/chain-polkadot-bulletin/src/lib.rs b/bridges/chains/chain-polkadot-bulletin/src/lib.rs index ed4cb5851dd5..aa6c0ea6894b 100644 --- a/bridges/chains/chain-polkadot-bulletin/src/lib.rs +++ b/bridges/chains/chain-polkadot-bulletin/src/lib.rs @@ -39,7 +39,7 @@ use frame_system::limits; use scale_info::TypeInfo; use sp_runtime::{ impl_tx_ext_default, - traits::{Dispatchable, TransactionExtensionBase}, + traits::{Dispatchable}, transaction_validity::TransactionValidityError, Perbill, StateVersion, }; @@ -96,19 +96,16 @@ pub type TransactionExtensionSchema = GenericTransactionExtension<( #[derive(Encode, Decode, Debug, PartialEq, Eq, Clone, TypeInfo)] pub struct TransactionExtension(TransactionExtensionSchema); -impl TransactionExtensionBase for TransactionExtension { - const IDENTIFIER: &'static str = "Not needed."; - type Implicit = ::Implicit; - - fn implicit(&self) -> Result { - ::implicit(&self.0) - } -} - impl sp_runtime::traits::TransactionExtension for TransactionExtension where C: Dispatchable, { + const IDENTIFIER: &'static str = "Not needed."; + type Implicit = >::Implicit; + + fn implicit(&self) -> Result { + >::implicit(&self.0) + } type Pre = (); type Val = (); diff --git a/bridges/modules/relayers/src/extension/mod.rs b/bridges/modules/relayers/src/extension/mod.rs index ad732680dfdd..1a5149047330 100644 --- a/bridges/modules/relayers/src/extension/mod.rs +++ b/bridges/modules/relayers/src/extension/mod.rs @@ -45,7 +45,7 @@ use scale_info::TypeInfo; use sp_runtime::{ traits::{ AsSystemOriginSigner, DispatchInfoOf, Dispatchable, PostDispatchInfoOf, - TransactionExtension, TransactionExtensionBase, ValidateResult, Zero, + TransactionExtension, ValidateResult, Zero, }, transaction_validity::{InvalidTransaction, TransactionValidityError, ValidTransactionBuilder}, DispatchResult, RuntimeDebug, @@ -125,6 +125,7 @@ where + TransactionPaymentConfig, C: ExtensionConfig, R::RuntimeCall: Dispatchable, + ::RuntimeOrigin: AsSystemOriginSigner + Clone, ::OnChargeTransaction: OnChargeTransaction, { @@ -265,21 +266,6 @@ where } } -impl TransactionExtensionBase for BridgeRelayersTransactionExtension -where - Self: 'static + Send + Sync, - R: RelayersConfig - + BridgeMessagesConfig - + TransactionPaymentConfig, - C: ExtensionConfig, - R::RuntimeCall: Dispatchable, - ::OnChargeTransaction: - OnChargeTransaction, -{ - const IDENTIFIER: &'static str = C::IdProvider::STR; - type Implicit = (); -} - impl TransactionExtension for BridgeRelayersTransactionExtension where Self: 'static + Send + Sync, @@ -292,6 +278,8 @@ where ::OnChargeTransaction: OnChargeTransaction, { + const IDENTIFIER: &'static str = C::IdProvider::STR; + type Implicit = (); type Pre = Option>; type Val = Option>; diff --git a/bridges/primitives/runtime/src/extensions.rs b/bridges/primitives/runtime/src/extensions.rs index 5e039fad88e8..f3ab47d04113 100644 --- a/bridges/primitives/runtime/src/extensions.rs +++ b/bridges/primitives/runtime/src/extensions.rs @@ -21,7 +21,7 @@ use impl_trait_for_tuples::impl_for_tuples; use scale_info::{StaticTypeInfo, TypeInfo}; use sp_runtime::{ impl_tx_ext_default, - traits::{Dispatchable, TransactionExtension, TransactionExtensionBase}, + traits::{Dispatchable, TransactionExtension}, transaction_validity::TransactionValidityError, }; use sp_std::{fmt::Debug, marker::PhantomData}; @@ -123,8 +123,9 @@ impl GenericTransactionExtension { } } -impl TransactionExtensionBase for GenericTransactionExtension +impl TransactionExtension for GenericTransactionExtension where + C: Dispatchable, S: TransactionExtensionSchema, S::Payload: Send + Sync, S::Implicit: Send + Sync, @@ -142,14 +143,6 @@ where frame_support::unsigned::UnknownTransaction::Custom(0xFF), )) } -} -impl TransactionExtension for GenericTransactionExtension -where - C: Dispatchable, - S: TransactionExtensionSchema, - S::Payload: Send + Sync, - S::Implicit: Send + Sync, -{ type Pre = (); type Val = (); diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index 83a80d6b3b50..26f0c0e99cab 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -1475,7 +1475,7 @@ mod tests { use codec::Encode; use sp_runtime::{ generic::Era, - traits::{TransactionExtensionBase, Zero}, + traits::{TransactionExtension, Zero}, }; #[test] @@ -1515,8 +1515,8 @@ mod tests { ); assert_eq!(payload.encode().split_last().unwrap().1, bhr_indirect_payload.encode()); assert_eq!( - payload.implicit().unwrap().encode().split_last().unwrap().1, - bhr_indirect_payload.implicit().unwrap().encode() + TxExtension::implicit(&payload).unwrap().encode().split_last().unwrap().1, + sp_runtime::traits::TransactionExtension::::implicit(&bhr_indirect_payload).unwrap().encode() ) } }); diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs index c1b7fd0aa9d9..84aa34c522fb 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/lib.rs @@ -1321,7 +1321,7 @@ mod tests { use codec::Encode; use sp_runtime::{ generic::Era, - traits::{TransactionExtensionBase, Zero}, + traits::{TransactionExtension, Zero}, }; #[test] @@ -1359,8 +1359,8 @@ mod tests { ); assert_eq!(payload.encode().split_last().unwrap().1, bh_indirect_payload.encode()); assert_eq!( - payload.implicit().unwrap().encode().split_last().unwrap().1, - bh_indirect_payload.implicit().unwrap().encode() + TxExtension::implicit(&payload).unwrap().encode().split_last().unwrap().1, + sp_runtime::traits::TransactionExtension::::implicit(&bh_indirect_payload).unwrap().encode() ) } }); diff --git a/cumulus/parachains/runtimes/starters/shell/src/lib.rs b/cumulus/parachains/runtimes/starters/shell/src/lib.rs index 309b09fe3004..40c024ae7f1a 100644 --- a/cumulus/parachains/runtimes/starters/shell/src/lib.rs +++ b/cumulus/parachains/runtimes/starters/shell/src/lib.rs @@ -45,7 +45,7 @@ use sp_runtime::{ create_runtime_str, generic, impl_opaque_keys, traits::{ AccountIdLookup, BlakeTwo256, Block as BlockT, DispatchInfoOf, OriginOf, - TransactionExtension, TransactionExtensionBase, ValidateResult, + TransactionExtension, ValidateResult, }, transaction_validity::{ InvalidTransaction, TransactionSource, TransactionValidity, TransactionValidityError, @@ -279,12 +279,9 @@ construct_runtime! { #[derive(Eq, PartialEq, Clone, Default, sp_core::RuntimeDebug, Encode, Decode, TypeInfo)] pub struct DisallowSigned; -impl TransactionExtensionBase for DisallowSigned { +impl TransactionExtension for DisallowSigned { const IDENTIFIER: &'static str = "DisallowSigned"; type Implicit = (); -} - -impl TransactionExtension for DisallowSigned { type Val = (); type Pre = (); fn validate( diff --git a/cumulus/primitives/storage-weight-reclaim/src/lib.rs b/cumulus/primitives/storage-weight-reclaim/src/lib.rs index 222c6dcb0b06..eb1364895c73 100644 --- a/cumulus/primitives/storage-weight-reclaim/src/lib.rs +++ b/cumulus/primitives/storage-weight-reclaim/src/lib.rs @@ -33,7 +33,6 @@ use sp_runtime::{ impl_tx_ext_default, traits::{ DispatchInfoOf, Dispatchable, PostDispatchInfoOf, TransactionExtension, - TransactionExtensionBase, }, transaction_validity::TransactionValidityError, DispatchResult, @@ -126,15 +125,12 @@ impl core::fmt::Debug for StorageWeightReclaim { } } -impl TransactionExtensionBase for StorageWeightReclaim { - const IDENTIFIER: &'static str = "StorageWeightReclaim"; - type Implicit = (); -} - impl TransactionExtension for StorageWeightReclaim where T::RuntimeCall: Dispatchable, { + const IDENTIFIER: &'static str = "StorageWeightReclaim"; + type Implicit = (); type Val = (); type Pre = Option; diff --git a/docs/sdk/src/reference_docs/extrinsic_encoding.rs b/docs/sdk/src/reference_docs/extrinsic_encoding.rs index 546f0e021612..1d4b0405b324 100644 --- a/docs/sdk/src/reference_docs/extrinsic_encoding.rs +++ b/docs/sdk/src/reference_docs/extrinsic_encoding.rs @@ -202,7 +202,7 @@ //! //! The bytes representing `call_data` and `transaction_extensions_extra` can be obtained as //! descibed above. `transaction_extensions_implicit` is constructed by SCALE encoding the -//! ["implicit" data][sp_runtime::traits::TransactionExtensionBase::Implicit] for each transaction +//! ["implicit" data][sp_runtime::traits::TransactionExtension::Implicit] for each transaction //! extension that the chain is using, in order. //! //! Once we've concatenated those together, we hash the result using a Blake2 256bit hasher. diff --git a/docs/sdk/src/reference_docs/transaction_extensions.rs b/docs/sdk/src/reference_docs/transaction_extensions.rs index 119366a9b60a..84d4f533101e 100644 --- a/docs/sdk/src/reference_docs/transaction_extensions.rs +++ b/docs/sdk/src/reference_docs/transaction_extensions.rs @@ -64,7 +64,7 @@ pub mod transaction_extensions_example { use scale_info::TypeInfo; use sp_runtime::{ impl_tx_ext_default, - traits::{Dispatchable, TransactionExtension, TransactionExtensionBase}, + traits::{Dispatchable, TransactionExtension}, transaction_validity::TransactionValidityError, }; @@ -73,12 +73,9 @@ pub mod transaction_extensions_example { #[derive(Debug, Encode, Decode, Clone, Eq, PartialEq, TypeInfo)] pub struct AddToPayload(pub u32); - impl TransactionExtensionBase for AddToPayload { + impl TransactionExtension for AddToPayload { const IDENTIFIER: &'static str = "AddToPayload"; type Implicit = (); - } - - impl TransactionExtension for AddToPayload { type Pre = (); type Val = (); @@ -91,16 +88,13 @@ pub mod transaction_extensions_example { #[derive(Debug, Encode, Decode, Clone, Eq, PartialEq, TypeInfo)] pub struct AddToSignaturePayload; - impl TransactionExtensionBase for AddToSignaturePayload { + impl TransactionExtension for AddToSignaturePayload { const IDENTIFIER: &'static str = "AddToSignaturePayload"; type Implicit = u32; fn implicit(&self) -> Result { Ok(1234) } - } - - impl TransactionExtension for AddToSignaturePayload { type Pre = (); type Val = (); diff --git a/polkadot/runtime/common/src/claims.rs b/polkadot/runtime/common/src/claims.rs index 825a025ca292..1ec4a7c845ce 100644 --- a/polkadot/runtime/common/src/claims.rs +++ b/polkadot/runtime/common/src/claims.rs @@ -36,7 +36,7 @@ use sp_runtime::{ impl_tx_ext_default, traits::{ AsAuthorizedOrigin, AsSystemOriginSigner, CheckedSub, DispatchInfoOf, Dispatchable, - TransactionExtension, TransactionExtensionBase, Zero, + TransactionExtension, Zero, }, transaction_validity::{ InvalidTransaction, TransactionValidity, TransactionValidityError, ValidTransaction, @@ -625,20 +625,14 @@ where } } -impl TransactionExtensionBase for PrevalidateAttests -where - ::RuntimeCall: IsSubType>, -{ - const IDENTIFIER: &'static str = "PrevalidateAttests"; - type Implicit = (); -} - impl TransactionExtension for PrevalidateAttests where ::RuntimeCall: IsSubType>, <::RuntimeCall as Dispatchable>::RuntimeOrigin: AsSystemOriginSigner + AsAuthorizedOrigin + Clone, { + const IDENTIFIER: &'static str = "PrevalidateAttests"; + type Implicit = (); type Pre = (); type Val = (); diff --git a/polkadot/runtime/rococo/src/lib.rs b/polkadot/runtime/rococo/src/lib.rs index d9c6a6059030..64da28b8a316 100644 --- a/polkadot/runtime/rococo/src/lib.rs +++ b/polkadot/runtime/rococo/src/lib.rs @@ -626,8 +626,6 @@ impl frame_system::offchain::CreateSignedTransaction for R where RuntimeCall: From, { - type SignaturePayload = UncheckedSignaturePayload; - fn create_signed_transaction< C: frame_system::offchain::AppCrypto, >( diff --git a/polkadot/runtime/test-runtime/src/lib.rs b/polkadot/runtime/test-runtime/src/lib.rs index 6724e89b62c2..24bc9e700122 100644 --- a/polkadot/runtime/test-runtime/src/lib.rs +++ b/polkadot/runtime/test-runtime/src/lib.rs @@ -417,8 +417,6 @@ impl frame_system::offchain::CreateSignedTransaction for R where RuntimeCall: From, { - type SignaturePayload = UncheckedSignaturePayload; - fn create_signed_transaction< C: frame_system::offchain::AppCrypto, >( diff --git a/polkadot/runtime/westend/src/lib.rs b/polkadot/runtime/westend/src/lib.rs index d94f3721a493..8cd7fceaa89b 100644 --- a/polkadot/runtime/westend/src/lib.rs +++ b/polkadot/runtime/westend/src/lib.rs @@ -894,8 +894,6 @@ impl frame_system::offchain::CreateSignedTransaction for R where RuntimeCall: From, { - type SignaturePayload = UncheckedSignaturePayload; - fn create_signed_transaction< C: frame_system::offchain::AppCrypto, >( diff --git a/substrate/bin/node/runtime/src/lib.rs b/substrate/bin/node/runtime/src/lib.rs index fd504cf9753a..3ce1f5bd15b9 100644 --- a/substrate/bin/node/runtime/src/lib.rs +++ b/substrate/bin/node/runtime/src/lib.rs @@ -1456,8 +1456,6 @@ impl frame_system::offchain::CreateSignedTransaction for R where RuntimeCall: From, { - type SignaturePayload = UncheckedSignaturePayload; - fn create_signed_transaction< C: frame_system::offchain::AppCrypto, >( diff --git a/substrate/frame/examples/authorization-tx-extension/src/extensions.rs b/substrate/frame/examples/authorization-tx-extension/src/extensions.rs index 035d6e540f71..d3315e8b7911 100644 --- a/substrate/frame/examples/authorization-tx-extension/src/extensions.rs +++ b/substrate/frame/examples/authorization-tx-extension/src/extensions.rs @@ -23,7 +23,7 @@ use scale_info::TypeInfo; use sp_runtime::{ impl_tx_ext_default, traits::{ - DispatchInfoOf, IdentifyAccount, OriginOf, TransactionExtension, TransactionExtensionBase, + DispatchInfoOf, IdentifyAccount, OriginOf, TransactionExtension, ValidateResult, Verify, }, transaction_validity::{InvalidTransaction, ValidTransaction}, @@ -75,25 +75,6 @@ impl fmt::Debug for AuthorizeCoownership TransactionExtensionBase - for AuthorizeCoownership -where - Signer: Clone + Eq + PartialEq + Encode + Decode + TypeInfo + Send + Sync + 'static, - Signature: Verify - + Clone - + Eq - + PartialEq - + Encode - + Decode - + TypeInfo - + Send - + Sync - + 'static, -{ - const IDENTIFIER: &'static str = "AuthorizeCoownership"; - type Implicit = (); -} - impl TransactionExtension for AuthorizeCoownership where @@ -118,6 +99,8 @@ where + Sync + 'static, { + const IDENTIFIER: &'static str = "AuthorizeCoownership"; + type Implicit = (); type Val = (); type Pre = (); diff --git a/substrate/frame/examples/authorization-tx-extension/src/tests.rs b/substrate/frame/examples/authorization-tx-extension/src/tests.rs index 91d0f61e95db..f77fc1ec5ed1 100644 --- a/substrate/frame/examples/authorization-tx-extension/src/tests.rs +++ b/substrate/frame/examples/authorization-tx-extension/src/tests.rs @@ -26,7 +26,7 @@ use frame_support::{ }; use sp_keyring::AccountKeyring; use sp_runtime::{ - traits::{Applyable, Checkable, IdentityLookup, TransactionExtensionBase}, + traits::{Applyable, Checkable, IdentityLookup, TransactionExtension}, MultiSignature, MultiSigner, }; diff --git a/substrate/frame/examples/basic/src/lib.rs b/substrate/frame/examples/basic/src/lib.rs index db08da7833e7..32a1a5369c5b 100644 --- a/substrate/frame/examples/basic/src/lib.rs +++ b/substrate/frame/examples/basic/src/lib.rs @@ -71,7 +71,7 @@ use sp_runtime::{ impl_tx_ext_default, traits::{ Bounded, DispatchInfoOf, OriginOf, SaturatedConversion, Saturating, TransactionExtension, - TransactionExtensionBase, ValidateResult, + ValidateResult, }, transaction_validity::{InvalidTransaction, ValidTransaction}, }; @@ -489,15 +489,13 @@ impl core::fmt::Debug for WatchDummy { } } -impl TransactionExtensionBase for WatchDummy { - const IDENTIFIER: &'static str = "WatchDummy"; - type Implicit = (); -} impl TransactionExtension<::RuntimeCall> for WatchDummy where ::RuntimeCall: IsSubType>, { + const IDENTIFIER: &'static str = "WatchDummy"; + type Implicit = (); type Pre = (); type Val = (); diff --git a/substrate/frame/examples/offchain-worker/src/tests.rs b/substrate/frame/examples/offchain-worker/src/tests.rs index 1f7e8bf9fa3b..bc369ece1846 100644 --- a/substrate/frame/examples/offchain-worker/src/tests.rs +++ b/substrate/frame/examples/offchain-worker/src/tests.rs @@ -103,8 +103,6 @@ impl frame_system::offchain::CreateSignedTransaction for T where RuntimeCall: From, { - type SignaturePayload = (u64, (), ()); - fn create_signed_transaction< C: frame_system::offchain::AppCrypto, >( diff --git a/substrate/frame/metadata-hash-extension/src/lib.rs b/substrate/frame/metadata-hash-extension/src/lib.rs index 8a1c26abddea..9c86b169db45 100644 --- a/substrate/frame/metadata-hash-extension/src/lib.rs +++ b/substrate/frame/metadata-hash-extension/src/lib.rs @@ -44,7 +44,7 @@ use frame_system::Config; use scale_info::TypeInfo; use sp_runtime::{ impl_tx_ext_default, - traits::{TransactionExtension, TransactionExtensionBase}, + traits::{TransactionExtension}, transaction_validity::{TransactionValidityError, UnknownTransaction}, }; @@ -132,7 +132,7 @@ impl CheckMetadataHash { } } -impl TransactionExtensionBase for CheckMetadataHash { +impl TransactionExtension for CheckMetadataHash { const IDENTIFIER: &'static str = "CheckMetadataHash"; type Implicit = Option<[u8; 32]>; fn implicit(&self) -> Result { @@ -152,8 +152,6 @@ impl TransactionExtensionBase for CheckMetadataHash Ok(signed) } -} -impl TransactionExtension for CheckMetadataHash { type Val = (); type Pre = (); diff --git a/substrate/frame/metadata-hash-extension/src/tests.rs b/substrate/frame/metadata-hash-extension/src/tests.rs index 8dfb8d85b14d..11a3345ee15c 100644 --- a/substrate/frame/metadata-hash-extension/src/tests.rs +++ b/substrate/frame/metadata-hash-extension/src/tests.rs @@ -25,7 +25,7 @@ use frame_support::{ use merkleized_metadata::{generate_metadata_digest, ExtraInfo}; use sp_api::{Metadata, ProvideRuntimeApi}; use sp_runtime::{ - traits::{ExtrinsicLike, TransactionExtensionBase}, + traits::{ExtrinsicLike, TransactionExtension}, transaction_validity::{TransactionSource, UnknownTransaction}, }; use sp_transaction_pool::runtime_api::TaggedTransactionQueue; diff --git a/substrate/frame/sudo/src/extension.rs b/substrate/frame/sudo/src/extension.rs index 11e3e47faaff..d9a840d9e314 100644 --- a/substrate/frame/sudo/src/extension.rs +++ b/substrate/frame/sudo/src/extension.rs @@ -24,7 +24,7 @@ use sp_runtime::{ impl_tx_ext_default, traits::{ AsSystemOriginSigner, DispatchInfoOf, Dispatchable, TransactionExtension, - TransactionExtensionBase, + }, transaction_validity::{ InvalidTransaction, TransactionPriority, TransactionValidityError, UnknownTransaction, @@ -69,10 +69,6 @@ impl CheckOnlySudoAccount { } } -impl TransactionExtensionBase for CheckOnlySudoAccount { - const IDENTIFIER: &'static str = "CheckOnlySudoAccount"; - type Implicit = (); -} impl TransactionExtension<::RuntimeCall> for CheckOnlySudoAccount where @@ -80,6 +76,8 @@ where <::RuntimeCall as Dispatchable>::RuntimeOrigin: AsSystemOriginSigner + Clone, { + const IDENTIFIER: &'static str = "CheckOnlySudoAccount"; + type Implicit = (); type Pre = (); type Val = (); diff --git a/substrate/frame/support/procedural/src/construct_runtime/expand/metadata.rs b/substrate/frame/support/procedural/src/construct_runtime/expand/metadata.rs index f7fd35ff82da..5f11874799bb 100644 --- a/substrate/frame/support/procedural/src/construct_runtime/expand/metadata.rs +++ b/substrate/frame/support/procedural/src/construct_runtime/expand/metadata.rs @@ -123,13 +123,13 @@ pub fn expand_runtime_metadata( extensions: < < #extrinsic as #scrate::sp_runtime::traits::ExtrinsicMetadata - >::SignedExtensions as #scrate::sp_runtime::traits::TransactionExtensionBase + >::SignedExtensions as #scrate::sp_runtime::traits::TransactionExtension::<<#runtime as #system_path::Config>::RuntimeCall> // TODO TODO: double check >::metadata() .into_iter() .map(|meta| #scrate::__private::metadata_ir::TransactionExtensionMetadataIR { identifier: meta.identifier, ty: meta.ty, - implicit: meta.additional_signed, + implicit: meta.implicit, }) .collect(), }, diff --git a/substrate/frame/support/src/dispatch.rs b/substrate/frame/support/src/dispatch.rs index 2568ccb90cbd..5c16ccc7af58 100644 --- a/substrate/frame/support/src/dispatch.rs +++ b/substrate/frame/support/src/dispatch.rs @@ -28,7 +28,6 @@ use sp_runtime::{ generic::{CheckedExtrinsic, UncheckedExtrinsic}, traits::{ Dispatchable, ExtensionPostDispatchWeightHandler, RefundWeight, TransactionExtension, - TransactionExtensionBase, }, DispatchError, RuntimeDebug, }; @@ -385,7 +384,6 @@ impl where Call: GetDispatchInfo + Dispatchable, - Extension: TransactionExtensionBase, { fn get_dispatch_info(&self) -> DispatchInfo { let mut info = self.function.get_dispatch_info(); @@ -399,7 +397,6 @@ impl> GetDi for CheckedExtrinsic where Call: GetDispatchInfo, - Extension: TransactionExtensionBase, { fn get_dispatch_info(&self) -> DispatchInfo { let mut info = self.function.get_dispatch_info(); @@ -1205,7 +1202,6 @@ mod test_extensions { impl_tx_ext_default, traits::{ DispatchInfoOf, Dispatchable, OriginOf, PostDispatchInfoOf, TransactionExtension, - TransactionExtensionBase, }, transaction_validity::TransactionValidityError, }; @@ -1217,11 +1213,9 @@ mod test_extensions { #[derive(Clone, Eq, PartialEq, Debug, Encode, Decode, TypeInfo)] pub struct HalfCostIf(pub bool); - impl TransactionExtensionBase for HalfCostIf { + impl TransactionExtension for HalfCostIf { const IDENTIFIER: &'static str = "HalfCostIf"; type Implicit = (); - } - impl TransactionExtension for HalfCostIf { type Val = (); type Pre = bool; @@ -1261,14 +1255,12 @@ mod test_extensions { #[derive(Clone, Eq, PartialEq, Debug, Encode, Decode, TypeInfo)] pub struct FreeIfUnder(pub u64); - impl TransactionExtensionBase for FreeIfUnder { - const IDENTIFIER: &'static str = "FreeIfUnder"; - type Implicit = (); - } impl TransactionExtension for FreeIfUnder where RuntimeCall: Dispatchable, { + const IDENTIFIER: &'static str = "FreeIfUnder"; + type Implicit = (); type Val = (); type Pre = u64; @@ -1309,11 +1301,9 @@ mod test_extensions { #[derive(Clone, Eq, PartialEq, Debug, Encode, Decode, TypeInfo)] pub struct ActualWeightIs(pub u64); - impl TransactionExtensionBase for ActualWeightIs { + impl TransactionExtension for ActualWeightIs { const IDENTIFIER: &'static str = "ActualWeightIs"; type Implicit = (); - } - impl TransactionExtension for ActualWeightIs { type Val = (); type Pre = u64; diff --git a/substrate/frame/support/src/transaction_extensions.rs b/substrate/frame/support/src/transaction_extensions.rs index 56a3560b636a..f149609b54a8 100644 --- a/substrate/frame/support/src/transaction_extensions.rs +++ b/substrate/frame/support/src/transaction_extensions.rs @@ -24,8 +24,8 @@ use sp_io::hashing::blake2_256; use sp_runtime::{ impl_tx_ext_default, traits::{ - transaction_extension::TransactionExtensionBase, DispatchInfoOf, Dispatchable, - IdentifyAccount, TransactionExtension, Verify, + transaction_extension::TransactionExtension, DispatchInfoOf, Dispatchable, + IdentifyAccount, Verify, }, transaction_validity::{InvalidTransaction, TransactionValidityError, ValidTransaction}, }; @@ -57,16 +57,6 @@ where } } -impl TransactionExtensionBase for VerifyMultiSignature -where - V: Codec + Debug + Sync + Send + Clone + Eq + PartialEq + StaticTypeInfo, - ::AccountId: - Codec + Debug + Sync + Send + Clone + Eq + PartialEq + StaticTypeInfo, -{ - const IDENTIFIER: &'static str = "VerifyMultiSignature"; - type Implicit = (); -} - impl TransactionExtension for VerifyMultiSignature where V: Codec + Debug + Sync + Send + Clone + Eq + PartialEq + StaticTypeInfo, @@ -74,6 +64,8 @@ where Codec + Debug + Sync + Send + Clone + Eq + PartialEq + StaticTypeInfo, ::RuntimeOrigin: From::AccountId>>, { + const IDENTIFIER: &'static str = "VerifyMultiSignature"; + type Implicit = (); type Val = (); type Pre = (); impl_tx_ext_default!(Call; prepare); diff --git a/substrate/frame/support/test/tests/pallet.rs b/substrate/frame/support/test/tests/pallet.rs index a00dff1d6475..d9579e32b0dc 100644 --- a/substrate/frame/support/test/tests/pallet.rs +++ b/substrate/frame/support/test/tests/pallet.rs @@ -29,8 +29,8 @@ use frame_support::{ storage::{unhashed, unhashed::contains_prefixed_key}, traits::{ ConstU32, GetCallIndex, GetCallName, GetStorageVersion, OnFinalize, OnGenesis, - OnInitialize, OnRuntimeUpgrade, PalletError, PalletInfoAccess, StorageVersion, - UnfilteredDispatchable, + OnInitialize, OnRuntimeUpgrade, PalletError, PalletInfoAccess, SignedTransactionBuilder, + StorageVersion, UnfilteredDispatchable, }, weights::{RuntimeDbWeight, Weight}, OrdNoBound, PartialOrdNoBound, @@ -42,7 +42,7 @@ use sp_io::{ TestExternalities, }; use sp_runtime::{ - traits::{Dispatchable, SignaturePayload as SignaturePayloadT}, + traits::{Block as BlockT, Dispatchable}, DispatchError, ModuleError, }; @@ -783,8 +783,6 @@ impl CreateSignedTransaction for Runtime where RuntimeCall: From, { - type SignaturePayload = UncheckedSignaturePayload; - fn create_signed_transaction< C: frame_system::offchain::AppCrypto, >( @@ -1880,12 +1878,16 @@ fn metadata() { ty: meta_type::<()>(), additional_signed: meta_type::<()>(), }], - address_ty: meta_type::<<>::SignaturePayload as SignaturePayloadT>::SignatureAddress>(), + address_ty: meta_type::< + <<::Block as BlockT>::Extrinsic as SignedTransactionBuilder>::Address + >(), call_ty: meta_type::<>::RuntimeCall>(), signature_ty: meta_type::< - <>::SignaturePayload as SignaturePayloadT>::Signature + <<::Block as BlockT>::Extrinsic as SignedTransactionBuilder>::Signature + >(), + extra_ty: meta_type::< + <<::Block as BlockT>::Extrinsic as SignedTransactionBuilder>::Extension >(), - extra_ty: meta_type::<<>::SignaturePayload as SignaturePayloadT>::SignatureExtra>(), }; let outer_enums = OuterEnums { @@ -1965,7 +1967,10 @@ fn metadata_ir_pallet_runtime_docs() { fn extrinsic_metadata_ir_types() { let ir = Runtime::metadata_ir().extrinsic; - assert_eq!(meta_type::<<>::SignaturePayload as SignaturePayloadT>::SignatureAddress>(), ir.address_ty); + assert_eq!( + meta_type::<<<::Block as BlockT>::Extrinsic as SignedTransactionBuilder>::Address>(), + ir.address_ty + ); assert_eq!(meta_type::(), ir.address_ty); assert_eq!( @@ -1975,14 +1980,15 @@ fn extrinsic_metadata_ir_types() { assert_eq!(meta_type::(), ir.call_ty); assert_eq!( - meta_type::< - <>::SignaturePayload as SignaturePayloadT>::Signature - >(), + meta_type::<<<::Block as BlockT>::Extrinsic as SignedTransactionBuilder>::Signature>(), ir.signature_ty ); assert_eq!(meta_type::(), ir.signature_ty); - assert_eq!(meta_type::<<>::SignaturePayload as SignaturePayloadT>::SignatureExtra>(), ir.extra_ty); + assert_eq!( + meta_type::<<<::Block as BlockT>::Extrinsic as SignedTransactionBuilder>::Extension>(), + ir.extra_ty + ); assert_eq!(meta_type::>(), ir.extra_ty); } diff --git a/substrate/frame/system/src/extensions/check_genesis.rs b/substrate/frame/system/src/extensions/check_genesis.rs index b5df883bb771..86afcc8a91c4 100644 --- a/substrate/frame/system/src/extensions/check_genesis.rs +++ b/substrate/frame/system/src/extensions/check_genesis.rs @@ -20,7 +20,7 @@ use codec::{Decode, Encode}; use scale_info::TypeInfo; use sp_runtime::{ impl_tx_ext_default, - traits::{TransactionExtension, TransactionExtensionBase, Zero}, + traits::{TransactionExtension, Zero}, transaction_validity::TransactionValidityError, }; @@ -53,14 +53,12 @@ impl CheckGenesis { } } -impl TransactionExtensionBase for CheckGenesis { +impl TransactionExtension for CheckGenesis { const IDENTIFIER: &'static str = "CheckGenesis"; type Implicit = T::Hash; fn implicit(&self) -> Result { Ok(>::block_hash(BlockNumberFor::::zero())) } -} -impl TransactionExtension for CheckGenesis { type Val = (); type Pre = (); fn weight(&self, _: &T::RuntimeCall) -> sp_weights::Weight { diff --git a/substrate/frame/system/src/extensions/check_mortality.rs b/substrate/frame/system/src/extensions/check_mortality.rs index cd880ff47a84..ae7c5ed05b63 100644 --- a/substrate/frame/system/src/extensions/check_mortality.rs +++ b/substrate/frame/system/src/extensions/check_mortality.rs @@ -22,7 +22,7 @@ use sp_runtime::{ generic::Era, impl_tx_ext_default, traits::{ - DispatchInfoOf, SaturatedConversion, TransactionExtension, TransactionExtensionBase, + DispatchInfoOf, SaturatedConversion, TransactionExtension, ValidateResult, }, transaction_validity::{InvalidTransaction, TransactionValidityError, ValidTransaction}, @@ -59,7 +59,7 @@ impl core::fmt::Debug for CheckMortality { } } -impl TransactionExtensionBase for CheckMortality { +impl TransactionExtension for CheckMortality { const IDENTIFIER: &'static str = "CheckMortality"; type Implicit = T::Hash; @@ -72,8 +72,6 @@ impl TransactionExtensionBase for CheckMortality { Ok(>::block_hash(n)) } } -} -impl TransactionExtension for CheckMortality { type Pre = (); type Val = (); diff --git a/substrate/frame/system/src/extensions/check_non_zero_sender.rs b/substrate/frame/system/src/extensions/check_non_zero_sender.rs index 037df36cf755..f64aa69cdcf6 100644 --- a/substrate/frame/system/src/extensions/check_non_zero_sender.rs +++ b/substrate/frame/system/src/extensions/check_non_zero_sender.rs @@ -23,7 +23,7 @@ use scale_info::TypeInfo; use sp_runtime::{ impl_tx_ext_default, traits::{ - transaction_extension::TransactionExtensionBase, DispatchInfoOf, TransactionExtension, + DispatchInfoOf, TransactionExtension, }, transaction_validity::InvalidTransaction, }; @@ -52,11 +52,9 @@ impl CheckNonZeroSender { } } -impl TransactionExtensionBase for CheckNonZeroSender { +impl TransactionExtension for CheckNonZeroSender { const IDENTIFIER: &'static str = "CheckNonZeroSender"; type Implicit = (); -} -impl TransactionExtension for CheckNonZeroSender { type Val = (); type Pre = (); diff --git a/substrate/frame/system/src/extensions/check_nonce.rs b/substrate/frame/system/src/extensions/check_nonce.rs index 5faee4816085..628e23d01a7f 100644 --- a/substrate/frame/system/src/extensions/check_nonce.rs +++ b/substrate/frame/system/src/extensions/check_nonce.rs @@ -23,7 +23,7 @@ use scale_info::TypeInfo; use sp_runtime::{ traits::{ AsSystemOriginSigner, DispatchInfoOf, Dispatchable, One, TransactionExtension, - TransactionExtensionBase, ValidateResult, Zero, + ValidateResult, Zero, }, transaction_validity::{ InvalidTransaction, TransactionLongevity, TransactionValidityError, ValidTransaction, @@ -66,15 +66,13 @@ impl core::fmt::Debug for CheckNonce { } } -impl TransactionExtensionBase for CheckNonce { - const IDENTIFIER: &'static str = "CheckNonce"; - type Implicit = (); -} impl TransactionExtension for CheckNonce where T::RuntimeCall: Dispatchable, ::RuntimeOrigin: AsSystemOriginSigner + Clone, { + const IDENTIFIER: &'static str = "CheckNonce"; + type Implicit = (); type Val = Option<(T::AccountId, T::Nonce)>; type Pre = (); diff --git a/substrate/frame/system/src/extensions/check_spec_version.rs b/substrate/frame/system/src/extensions/check_spec_version.rs index 9161aad0ef05..dcf3c23337ac 100644 --- a/substrate/frame/system/src/extensions/check_spec_version.rs +++ b/substrate/frame/system/src/extensions/check_spec_version.rs @@ -20,7 +20,7 @@ use codec::{Decode, Encode}; use scale_info::TypeInfo; use sp_runtime::{ impl_tx_ext_default, - traits::{transaction_extension::TransactionExtensionBase, TransactionExtension}, + traits::{TransactionExtension}, transaction_validity::TransactionValidityError, }; @@ -53,16 +53,14 @@ impl CheckSpecVersion { } } -impl TransactionExtensionBase for CheckSpecVersion { +impl TransactionExtension<::RuntimeCall> + for CheckSpecVersion +{ const IDENTIFIER: &'static str = "CheckSpecVersion"; type Implicit = u32; fn implicit(&self) -> Result { Ok(>::runtime_version().spec_version) } -} -impl TransactionExtension<::RuntimeCall> - for CheckSpecVersion -{ type Val = (); type Pre = (); fn weight(&self, _: &::RuntimeCall) -> sp_weights::Weight { diff --git a/substrate/frame/system/src/extensions/check_tx_version.rs b/substrate/frame/system/src/extensions/check_tx_version.rs index 5eb8ba2cb761..3052ea54a61a 100644 --- a/substrate/frame/system/src/extensions/check_tx_version.rs +++ b/substrate/frame/system/src/extensions/check_tx_version.rs @@ -20,7 +20,7 @@ use codec::{Decode, Encode}; use scale_info::TypeInfo; use sp_runtime::{ impl_tx_ext_default, - traits::{transaction_extension::TransactionExtensionBase, TransactionExtension}, + traits::{TransactionExtension}, transaction_validity::TransactionValidityError, }; @@ -53,16 +53,14 @@ impl CheckTxVersion { } } -impl TransactionExtensionBase for CheckTxVersion { +impl TransactionExtension<::RuntimeCall> + for CheckTxVersion +{ const IDENTIFIER: &'static str = "CheckTxVersion"; type Implicit = u32; fn implicit(&self) -> Result { Ok(>::runtime_version().transaction_version) } -} -impl TransactionExtension<::RuntimeCall> - for CheckTxVersion -{ type Val = (); type Pre = (); fn weight(&self, _: &::RuntimeCall) -> sp_weights::Weight { diff --git a/substrate/frame/system/src/extensions/check_weight.rs b/substrate/frame/system/src/extensions/check_weight.rs index 60d884555adf..9c930996858c 100644 --- a/substrate/frame/system/src/extensions/check_weight.rs +++ b/substrate/frame/system/src/extensions/check_weight.rs @@ -25,7 +25,7 @@ use scale_info::TypeInfo; use sp_runtime::{ traits::{ DispatchInfoOf, Dispatchable, PostDispatchInfoOf, TransactionExtension, - TransactionExtensionBase, ValidateResult, + ValidateResult, }, transaction_validity::{InvalidTransaction, TransactionValidityError, ValidTransaction}, DispatchResult, @@ -208,14 +208,12 @@ where Ok(all_weight) } -impl TransactionExtensionBase for CheckWeight { - const IDENTIFIER: &'static str = "CheckWeight"; - type Implicit = (); -} impl TransactionExtension for CheckWeight where T::RuntimeCall: Dispatchable, { + const IDENTIFIER: &'static str = "CheckWeight"; + type Implicit = (); type Pre = (); type Val = u32; /* next block length */ diff --git a/substrate/frame/system/src/offchain.rs b/substrate/frame/system/src/offchain.rs index ea7ae8b40f1b..1067ead12830 100644 --- a/substrate/frame/system/src/offchain.rs +++ b/substrate/frame/system/src/offchain.rs @@ -61,7 +61,7 @@ use codec::Encode; use scale_info::TypeInfo; use sp_runtime::{ app_crypto::RuntimeAppPublic, - traits::{ExtrinsicLike, IdentifyAccount, One, SignaturePayload}, + traits::{ExtrinsicLike, IdentifyAccount, One}, RuntimeDebug, }; @@ -474,9 +474,6 @@ pub trait CreateTransaction: CreateTransactionBase { pub trait CreateSignedTransaction: CreateTransactionBase + SigningTypes { - /// TODO: revisit this, currently here for metadata purposes. - type SignaturePayload: SignaturePayload; - /// Attempt to create signed extrinsic data that encodes call from given account. /// /// Runtime implementation is free to construct the payload to sign and the signature diff --git a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/lib.rs b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/lib.rs index 1926fe8b418d..e621b3565347 100644 --- a/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/lib.rs +++ b/substrate/frame/transaction-payment/asset-conversion-tx-payment/src/lib.rs @@ -55,7 +55,7 @@ use scale_info::TypeInfo; use sp_runtime::{ traits::{ AsSystemOriginSigner, DispatchInfoOf, Dispatchable, PostDispatchInfoOf, RefundWeight, - TransactionExtension, TransactionExtensionBase, ValidateResult, Zero, + TransactionExtension, ValidateResult, Zero, }, transaction_validity::{InvalidTransaction, TransactionValidityError, ValidTransaction}, }; @@ -250,16 +250,6 @@ impl core::fmt::Debug for ChargeAssetTxPayment { } } -impl TransactionExtensionBase for ChargeAssetTxPayment -where - T::RuntimeCall: Dispatchable, - BalanceOf: Send + Sync + From, - T::AssetId: Send + Sync, -{ - const IDENTIFIER: &'static str = "ChargeAssetTxPayment"; - type Implicit = (); -} - impl TransactionExtension for ChargeAssetTxPayment where T::RuntimeCall: Dispatchable, @@ -267,6 +257,8 @@ where T::AssetId: Send + Sync, ::RuntimeOrigin: AsSystemOriginSigner + Clone, { + const IDENTIFIER: &'static str = "ChargeAssetTxPayment"; + type Implicit = (); type Val = ( // tip BalanceOf, diff --git a/substrate/frame/transaction-payment/asset-tx-payment/src/lib.rs b/substrate/frame/transaction-payment/asset-tx-payment/src/lib.rs index c5fc78504a2a..c1aba3b4fb13 100644 --- a/substrate/frame/transaction-payment/asset-tx-payment/src/lib.rs +++ b/substrate/frame/transaction-payment/asset-tx-payment/src/lib.rs @@ -53,7 +53,7 @@ use scale_info::TypeInfo; use sp_runtime::{ traits::{ AsSystemOriginSigner, DispatchInfoOf, Dispatchable, PostDispatchInfoOf, RefundWeight, - TransactionExtension, TransactionExtensionBase, Zero, + TransactionExtension, Zero, }, transaction_validity::{InvalidTransaction, TransactionValidityError, ValidTransaction}, }; @@ -262,17 +262,6 @@ impl core::fmt::Debug for ChargeAssetTxPayment { } } -impl TransactionExtensionBase for ChargeAssetTxPayment -where - AssetBalanceOf: Send + Sync, - BalanceOf: Send + Sync + From + IsType>, - ChargeAssetIdOf: Send + Sync, - Credit: IsType>, -{ - const IDENTIFIER: &'static str = "ChargeAssetTxPayment"; - type Implicit = (); -} - impl TransactionExtension for ChargeAssetTxPayment where T::RuntimeCall: Dispatchable, @@ -282,6 +271,8 @@ where Credit: IsType>, ::RuntimeOrigin: AsSystemOriginSigner + Clone, { + const IDENTIFIER: &'static str = "ChargeAssetTxPayment"; + type Implicit = (); type Val = ( // tip BalanceOf, diff --git a/substrate/frame/transaction-payment/skip-feeless-payment/src/lib.rs b/substrate/frame/transaction-payment/skip-feeless-payment/src/lib.rs index 099d8a0c12b0..b5317acf9c48 100644 --- a/substrate/frame/transaction-payment/skip-feeless-payment/src/lib.rs +++ b/substrate/frame/transaction-payment/skip-feeless-payment/src/lib.rs @@ -46,7 +46,7 @@ use scale_info::{StaticTypeInfo, TypeInfo}; use sp_runtime::{ traits::{ DispatchInfoOf, OriginOf, PostDispatchInfoOf, TransactionExtension, - TransactionExtensionBase, ValidateResult, + ValidateResult, }, transaction_validity::TransactionValidityError, }; @@ -116,8 +116,10 @@ pub enum Intermediate { } use Intermediate::*; -impl TransactionExtensionBase - for SkipCheckIfFeeless +impl> + TransactionExtension for SkipCheckIfFeeless +where + T::RuntimeCall: CheckIfFeeless>, { // From the outside this extension should be "invisible", because it just extends the wrapped // extension with an extra check in `pre_dispatch` and `post_dispatch`. Thus, we should forward @@ -129,13 +131,6 @@ impl TransactionExtensionB fn implicit(&self) -> Result { self.0.implicit() } -} - -impl> - TransactionExtension for SkipCheckIfFeeless -where - T::RuntimeCall: CheckIfFeeless>, -{ type Val = Intermediate as OriginTrait>::PalletsOrigin>; type Pre = Intermediate as OriginTrait>::PalletsOrigin>; diff --git a/substrate/frame/transaction-payment/skip-feeless-payment/src/mock.rs b/substrate/frame/transaction-payment/skip-feeless-payment/src/mock.rs index 4fbc4dd9ad3d..12d2564a608e 100644 --- a/substrate/frame/transaction-payment/skip-feeless-payment/src/mock.rs +++ b/substrate/frame/transaction-payment/skip-feeless-payment/src/mock.rs @@ -42,11 +42,9 @@ parameter_types! { #[derive(Clone, Eq, PartialEq, Debug, Encode, Decode, TypeInfo)] pub struct DummyExtension; -impl TransactionExtensionBase for DummyExtension { +impl TransactionExtension for DummyExtension { const IDENTIFIER: &'static str = "DummyExtension"; type Implicit = (); -} -impl TransactionExtension for DummyExtension { type Val = (); type Pre = (); diff --git a/substrate/frame/transaction-payment/src/benchmarking.rs b/substrate/frame/transaction-payment/src/benchmarking.rs index 0b68175e82cd..3b6ef304ed03 100644 --- a/substrate/frame/transaction-payment/src/benchmarking.rs +++ b/substrate/frame/transaction-payment/src/benchmarking.rs @@ -38,7 +38,6 @@ fn assert_last_event(generic_event: ::RuntimeEvent) { T: Config, T::RuntimeOrigin: AsAuthorizedOrigin, T::RuntimeCall: Dispatchable, - BalanceOf: Send + Sync + From, )] mod benchmarks { use super::*; @@ -48,7 +47,7 @@ mod benchmarks { let caller: T::AccountId = account("caller", 0, 0); >::endow_account( &caller, - >::minimum_balance() * 1000.into(), + >::minimum_balance() * 1000u32.into(), ); let tip = >::minimum_balance(); let ext: ChargeTransactionPayment = ChargeTransactionPayment::from(tip); diff --git a/substrate/frame/transaction-payment/src/lib.rs b/substrate/frame/transaction-payment/src/lib.rs index ab1f8a7afa9a..b1989962e0b8 100644 --- a/substrate/frame/transaction-payment/src/lib.rs +++ b/substrate/frame/transaction-payment/src/lib.rs @@ -62,7 +62,7 @@ pub use payment::*; use sp_runtime::{ traits::{ Convert, DispatchInfoOf, Dispatchable, One, PostDispatchInfoOf, SaturatedConversion, - Saturating, TransactionExtension, TransactionExtensionBase, Zero, + Saturating, TransactionExtension, Zero, }, transaction_validity::{ InvalidTransaction, TransactionPriority, TransactionValidityError, ValidTransaction, @@ -850,16 +850,12 @@ impl core::fmt::Debug for ChargeTransactionPayment { } } -impl TransactionExtensionBase for ChargeTransactionPayment { - const IDENTIFIER: &'static str = "ChargeTransactionPayment"; - type Implicit = (); -} - impl TransactionExtension for ChargeTransactionPayment where - BalanceOf: Send + Sync + From, T::RuntimeCall: Dispatchable, { + const IDENTIFIER: &'static str = "ChargeTransactionPayment"; + type Implicit = (); type Val = ( // tip BalanceOf, diff --git a/substrate/primitives/runtime/src/generic/unchecked_extrinsic.rs b/substrate/primitives/runtime/src/generic/unchecked_extrinsic.rs index 7beb2cc51b58..4ffb8d77d3b9 100644 --- a/substrate/primitives/runtime/src/generic/unchecked_extrinsic.rs +++ b/substrate/primitives/runtime/src/generic/unchecked_extrinsic.rs @@ -20,9 +20,8 @@ use crate::{ generic::{CheckedExtrinsic, ExtrinsicFormat}, traits::{ - self, transaction_extension::TransactionExtensionBase, Checkable, Dispatchable, + self, transaction_extension::TransactionExtension, Checkable, Dispatchable, ExtrinsicLike, ExtrinsicMetadata, IdentifyAccount, MaybeDisplay, Member, SignaturePayload, - TransactionExtension, }, transaction_validity::{InvalidTransaction, TransactionValidityError}, OpaqueExtrinsic, @@ -568,7 +567,7 @@ impl<'a, Address: Decode, Signature: Decode, Call: Decode, Extension: Decode> se /// Note that the payload that we sign to produce unchecked extrinsic signature /// is going to be different than the `SignaturePayload` - so the thing the extrinsic /// actually contains. -pub struct SignedPayload( +pub struct SignedPayload>( (Call, Extension, Extension::Implicit), ExtrinsicVersion, ); @@ -576,7 +575,7 @@ pub struct SignedPayload SignedPayload where Call: Encode + Dispatchable, - Extension: TransactionExtensionBase, + Extension: TransactionExtension, { /// Create new `SignedPayload`. /// @@ -610,7 +609,7 @@ where impl Encode for SignedPayload where Call: Encode + Dispatchable, - Extension: TransactionExtensionBase, + Extension: TransactionExtension, { /// Get an encoded version of this `blake2_256`-hashed payload. fn using_encoded R>(&self, f: F) -> R { @@ -631,7 +630,7 @@ where impl EncodeLike for SignedPayload where Call: Encode + Dispatchable, - Extension: TransactionExtensionBase, + Extension: TransactionExtension, { } @@ -819,11 +818,9 @@ mod tests { // NOTE: this is demonstration. One can simply use `()` for testing. #[derive(Debug, Encode, Decode, Clone, Eq, PartialEq, Ord, PartialOrd, TypeInfo)] struct DummyExtension; - impl TransactionExtensionBase for DummyExtension { + impl TransactionExtension for DummyExtension { const IDENTIFIER: &'static str = "DummyExtension"; type Implicit = (); - } - impl TransactionExtension for DummyExtension { type Val = (); type Pre = (); impl_tx_ext_default!(TestCall; validate prepare); diff --git a/substrate/primitives/runtime/src/traits/mod.rs b/substrate/primitives/runtime/src/traits/mod.rs index 89f6160883ef..b985a48fe0eb 100644 --- a/substrate/primitives/runtime/src/traits/mod.rs +++ b/substrate/primitives/runtime/src/traits/mod.rs @@ -54,7 +54,7 @@ use std::str::FromStr; pub mod transaction_extension; pub use transaction_extension::{ - DispatchTransaction, TransactionExtension, TransactionExtensionBase, + DispatchTransaction, TransactionExtension, TransactionExtensionMetadata, ValidateResult, }; @@ -1706,7 +1706,7 @@ pub trait SignedExtension: sp_std::vec![TransactionExtensionMetadata { identifier: Self::IDENTIFIER, ty: scale_info::meta_type::(), - additional_signed: scale_info::meta_type::() + implicit: scale_info::meta_type::() }] } diff --git a/substrate/primitives/runtime/src/traits/transaction_extension/as_transaction_extension.rs b/substrate/primitives/runtime/src/traits/transaction_extension/as_transaction_extension.rs index 67aa8c900e82..02d7a967f8aa 100644 --- a/substrate/primitives/runtime/src/traits/transaction_extension/as_transaction_extension.rs +++ b/substrate/primitives/runtime/src/traits/transaction_extension/as_transaction_extension.rs @@ -47,7 +47,10 @@ impl From for AsTransactionExtension { } } -impl TransactionExtensionBase for AsTransactionExtension { +impl TransactionExtension for AsTransactionExtension +where + ::RuntimeOrigin: AsSystemOriginSigner + Clone, +{ const IDENTIFIER: &'static str = SE::IDENTIFIER; type Implicit = SE::AdditionalSigned; @@ -57,12 +60,6 @@ impl TransactionExtensionBase for AsTransactionExtension Vec { SE::metadata() } -} - -impl TransactionExtension for AsTransactionExtension -where - ::RuntimeOrigin: AsSystemOriginSigner + Clone, -{ type Val = (); type Pre = SE::Pre; diff --git a/substrate/primitives/runtime/src/traits/transaction_extension/mod.rs b/substrate/primitives/runtime/src/traits/transaction_extension/mod.rs index 9f83e18d731a..24a547fa6552 100644 --- a/substrate/primitives/runtime/src/traits/transaction_extension/mod.rs +++ b/substrate/primitives/runtime/src/traits/transaction_extension/mod.rs @@ -45,49 +45,6 @@ pub use dispatch_transaction::DispatchTransaction; pub type ValidateResult = Result<(ValidTransaction, Val, OriginOf), TransactionValidityError>; -/// Base for [TransactionExtension]s; this contains the associated types and does not require any -/// generic parameterization. -pub trait TransactionExtensionBase: - Codec + Debug + Sync + Send + Clone + Eq + PartialEq + StaticTypeInfo -{ - /// Unique identifier of this signed extension. - /// - /// This will be exposed in the metadata to identify the signed extension used in an extrinsic. - const IDENTIFIER: &'static str; - - /// Any additional data which was known at the time of transaction construction and can be - /// useful in authenticating the transaction. This is determined dynamically in part from the - /// on-chain environment using the `implicit` function and not directly contained in the - /// transaction itself and therefore is considered "implicit". - type Implicit: Codec + StaticTypeInfo; - - /// Determine any additional data which was known at the time of transaction construction and - /// can be useful in authenticating the transaction. The expected usage of this is to include in - /// any data which is signed and verified as part of transaction validation. Also perform any - /// pre-signature-verification checks and return an error if needed. - fn implicit(&self) -> Result { - use crate::transaction_validity::InvalidTransaction::IndeterminateImplicit; - Ok(Self::Implicit::decode(&mut &[][..]).map_err(|_| IndeterminateImplicit)?) - } - - /// Returns the metadata for this extension. - /// - /// As a [`TransactionExtension`] can be a tuple of [`TransactionExtension`]s we need to return - /// a `Vec` that holds the metadata of each one. Each individual `TransactionExtension` must - /// return *exactly* one [`TransactionExtensionMetadata`]. - /// - /// This method provides a default implementation that returns a vec containing a single - /// [`TransactionExtensionMetadata`]. - fn metadata() -> Vec { - sp_std::vec![TransactionExtensionMetadata { - identifier: Self::IDENTIFIER, - ty: scale_info::meta_type::(), - // TODO: Metadata-v16: Rename to "implicit" - additional_signed: scale_info::meta_type::() - }] - } -} - /// Means by which a transaction may be extended. This type embodies both the data and the logic /// that should be additionally associated with the transaction. It should be plain old data. /// @@ -125,7 +82,7 @@ pub trait TransactionExtensionBase: /// /// ## Default implementations /// -/// Of the 6 functions in this trait along with `TransactionExtensionBase`, 2 of them must return a +/// Of the 6 functions in this trait along with `TransactionExtension`, 2 of them must return a /// value of an associated type on success, with only `implicit` having a default implementation. /// This means that default implementations cannot be provided for `validate` and `prepare`. /// However, a macro is provided [impl_tx_ext_default](crate::impl_tx_ext_default) which is capable @@ -156,7 +113,7 @@ pub trait TransactionExtensionBase: /// the input to the next extension in the pipeline. /// /// This ordered composition happens with all datatypes ([Val](TransactionExtension::Val), -/// [Pre](TransactionExtension::Pre) and [Implicit](TransactionExtensionBase::Implicit)) as well as +/// [Pre](TransactionExtension::Pre) and [Implicit](TransactionExtension::Implicit)) as well as /// all functions. There are important consequences stemming from how the composition affects the /// meaning of the `origin` and `implication` parameters as well as the results. Whereas the /// [prepare](TransactionExtension::prepare) and @@ -182,7 +139,7 @@ pub trait TransactionExtensionBase: /// returned. It is expressed to the [validate](TransactionExtension::validate) function only as the /// `implication` argument which implements the [Encode] trait. A transaction extension may define /// its own implications through its own fields and the -/// [implicit](TransactionExtensionBase::implicit) function. This is only utilized by extensions +/// [implicit](TransactionExtension::implicit) function. This is only utilized by extensions /// which preceed it in a pipeline or, if the transaction is an old-school signed transaction, the /// underlying transaction verification logic. /// @@ -198,7 +155,44 @@ pub trait TransactionExtensionBase: /// transaction payment and refunds should be at the end of the pipeline in order to capture the /// correct amount of weight used during the call. This is because one canot know the actual weight /// of an extension after post dispatch without running the post dispatch ahead of time. -pub trait TransactionExtension: TransactionExtensionBase { +pub trait TransactionExtension: Codec + Debug + Sync + Send + Clone + Eq + PartialEq + StaticTypeInfo +{ + /// Unique identifier of this signed extension. + /// + /// This will be exposed in the metadata to identify the signed extension used in an extrinsic. + const IDENTIFIER: &'static str; + + /// Any additional data which was known at the time of transaction construction and can be + /// useful in authenticating the transaction. This is determined dynamically in part from the + /// on-chain environment using the `implicit` function and not directly contained in the + /// transaction itself and therefore is considered "implicit". + type Implicit: Codec + StaticTypeInfo; + + /// Determine any additional data which was known at the time of transaction construction and + /// can be useful in authenticating the transaction. The expected usage of this is to include in + /// any data which is signed and verified as part of transaction validation. Also perform any + /// pre-signature-verification checks and return an error if needed. + fn implicit(&self) -> Result { + use crate::transaction_validity::InvalidTransaction::IndeterminateImplicit; + Ok(Self::Implicit::decode(&mut &[][..]).map_err(|_| IndeterminateImplicit)?) + } + + /// Returns the metadata for this extension. + /// + /// As a [`TransactionExtension`] can be a tuple of [`TransactionExtension`]s we need to return + /// a `Vec` that holds the metadata of each one. Each individual `TransactionExtension` must + /// return *exactly* one [`TransactionExtensionMetadata`]. + /// + /// This method provides a default implementation that returns a vec containing a single + /// [`TransactionExtensionMetadata`]. + fn metadata() -> Vec { + sp_std::vec![TransactionExtensionMetadata { + identifier: Self::IDENTIFIER, + ty: scale_info::meta_type::(), + implicit: scale_info::meta_type::() + }] + } + /// The type that encodes information that can be passed from validate to prepare. type Val; @@ -463,13 +457,11 @@ pub struct TransactionExtensionMetadata { /// The type of the [`TransactionExtension`]. pub ty: MetaType, /// The type of the [`TransactionExtension`] additional signed data for the payload. - // TODO: Rename "implicit" - pub additional_signed: MetaType, + pub implicit: MetaType, } #[impl_for_tuples(1, 12)] -impl TransactionExtensionBase for Tuple { - for_tuples!( where #( Tuple: TransactionExtensionBase )* ); +impl TransactionExtension for Tuple { const IDENTIFIER: &'static str = "Use `metadata()`!"; for_tuples!( type Implicit = ( #( Tuple::Implicit ),* ); ); fn implicit(&self) -> Result { @@ -480,11 +472,7 @@ impl TransactionExtensionBase for Tuple { for_tuples!( #( ids.extend(Tuple::metadata()); )* ); ids } -} -#[impl_for_tuples(1, 12)] -impl TransactionExtension for Tuple { - for_tuples!( where #( Tuple: TransactionExtension )* ); for_tuples!( type Val = ( #( Tuple::Val ),* ); ); for_tuples!( type Pre = ( #( Tuple::Pre ),* ); ); @@ -575,15 +563,12 @@ impl TransactionExtension for Tuple { } } -impl TransactionExtensionBase for () { +impl TransactionExtension for () { const IDENTIFIER: &'static str = "UnitTransactionExtension"; type Implicit = (); fn implicit(&self) -> sp_std::result::Result { Ok(()) } -} - -impl TransactionExtension for () { type Val = (); type Pre = (); fn weight(&self, _call: &Call) -> Weight { diff --git a/substrate/test-utils/runtime/src/extrinsic.rs b/substrate/test-utils/runtime/src/extrinsic.rs index 0c1bc2e72b7a..3129172fcbd3 100644 --- a/substrate/test-utils/runtime/src/extrinsic.rs +++ b/substrate/test-utils/runtime/src/extrinsic.rs @@ -27,7 +27,7 @@ use frame_system::{CheckNonce, CheckWeight}; use sp_core::crypto::Pair as TraitPair; use sp_keyring::AccountKeyring; use sp_runtime::{ - generic::Preamble, traits::TransactionExtensionBase, transaction_validity::TransactionPriority, + generic::Preamble, traits::TransactionExtension, transaction_validity::TransactionPriority, Perbill, }; diff --git a/substrate/test-utils/runtime/src/lib.rs b/substrate/test-utils/runtime/src/lib.rs index 4d1701bc27de..465b2f6fcae6 100644 --- a/substrate/test-utils/runtime/src/lib.rs +++ b/substrate/test-utils/runtime/src/lib.rs @@ -277,11 +277,9 @@ impl sp_runtime::traits::Dispatchable for CheckSubstrateCall { } } -impl sp_runtime::traits::TransactionExtensionBase for CheckSubstrateCall { +impl sp_runtime::traits::TransactionExtension for CheckSubstrateCall { const IDENTIFIER: &'static str = "CheckSubstrateCall"; type Implicit = (); -} -impl sp_runtime::traits::TransactionExtension for CheckSubstrateCall { type Pre = (); type Val = (); impl_tx_ext_default!(RuntimeCall; prepare);