From a730fe1b3d47549a8ce8ff2e161b3db77812fd1a Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Mon, 30 Jan 2023 16:34:34 +0000 Subject: [PATCH 01/75] impl_runtime_apis: Generate getters for `metadata_at` functions Signed-off-by: Alexandru Vasile --- .../api/proc-macro/src/impl_runtime_apis.rs | 43 +++++++++++++++++++ primitives/api/src/lib.rs | 2 +- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/primitives/api/proc-macro/src/impl_runtime_apis.rs b/primitives/api/proc-macro/src/impl_runtime_apis.rs index c3f4e36655d22..3df1f75aad56e 100644 --- a/primitives/api/proc-macro/src/impl_runtime_apis.rs +++ b/primitives/api/proc-macro/src/impl_runtime_apis.rs @@ -401,6 +401,46 @@ fn generate_api_impl_for_runtime(impls: &[ItemImpl]) -> Result { Ok(quote!( #( #impls_prepared )* )) } +/// Generates the metadata for the runtime. +fn generate_runtime_metadata(impls: &[ItemImpl]) -> Result { + if impls.is_empty() { + return Ok(quote!("")) + } + + let crate_ = generate_crate_access(HIDDEN_INCLUDES_ID); + + let first_impl_ = + impls.get(0).expect("Trait impls should always contain at least one item; qed"); + // Check that all traits are implemented for the same Runtime. + let _same_runtime = impls.iter().all(|impl_| { + if impl_.self_ty == first_impl_.self_ty { + return true + } + + panic!( + "Trait impls expected for runtime `{:?}`, received `{:?}`", + first_impl_.self_ty, impl_.self_ty + ); + }); + + let runtime = first_impl_.self_ty.clone(); + Ok(quote!( + impl #runtime { + fn metadata_at_version(version: u32) -> Option { + match version { + // The V14 version is already implemented by `construct_runtime!` macro. + 14 => Some(OpaqueMetadata::new(#runtime::metadata().into())), + _ => None, + } + } + + fn metadata_versions() -> #crate_::vec::Vec { + #crate_::vec![ 14 ] + } + } + )) +} + /// Auxiliary data structure that is used to convert `impl Api for Runtime` to /// `impl Api for RuntimeApi`. /// This requires us to replace the runtime `Block` with the node `Block`, @@ -634,6 +674,7 @@ fn impl_runtime_apis_impl_inner(api_impls: &[ItemImpl]) -> Result { let runtime_api_versions = generate_runtime_api_versions(api_impls)?; let wasm_interface = generate_wasm_interface(api_impls)?; let api_impls_for_runtime_api = generate_api_impl_for_runtime_api(api_impls)?; + let runtime_metadata = generate_runtime_metadata(api_impls)?; Ok(quote!( #hidden_includes @@ -644,6 +685,8 @@ fn impl_runtime_apis_impl_inner(api_impls: &[ItemImpl]) -> Result { #api_impls_for_runtime_api + #runtime_metadata + #runtime_api_versions pub mod api { diff --git a/primitives/api/src/lib.rs b/primitives/api/src/lib.rs index 4ff4becb80f48..549972502a392 100644 --- a/primitives/api/src/lib.rs +++ b/primitives/api/src/lib.rs @@ -101,7 +101,7 @@ pub use sp_state_machine::{ StorageProof, TrieBackend, TrieBackendBuilder, }; #[doc(hidden)] -pub use sp_std::{mem, slice}; +pub use sp_std::{mem, slice, vec}; #[doc(hidden)] pub use sp_version::{create_apis_vec, ApiId, ApisVec, RuntimeVersion}; #[cfg(feature = "std")] From bc1fed49943905fd39efb2278e9b77577572bd29 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Mon, 30 Jan 2023 16:45:58 +0000 Subject: [PATCH 02/75] runtime: Implement new `Metadata` runtime trait Signed-off-by: Alexandru Vasile --- bin/node-template/runtime/src/lib.rs | 8 ++++++++ bin/node/runtime/src/lib.rs | 8 ++++++++ primitives/api/src/lib.rs | 8 ++++++++ test-utils/runtime/src/lib.rs | 23 +++++++++++++++++++++++ 4 files changed, 47 insertions(+) diff --git a/bin/node-template/runtime/src/lib.rs b/bin/node-template/runtime/src/lib.rs index baba5d9b05e59..f6d64705fb3fb 100644 --- a/bin/node-template/runtime/src/lib.rs +++ b/bin/node-template/runtime/src/lib.rs @@ -367,6 +367,14 @@ impl_runtime_apis! { fn metadata() -> OpaqueMetadata { OpaqueMetadata::new(Runtime::metadata().into()) } + + fn metadata_at_version(version: u32) -> Option { + Runtime::metadata_at_version(version) + } + + fn metadata_versions() -> sp_std::vec::Vec { + Runtime::metadata_versions().into() + } } impl sp_block_builder::BlockBuilder for Runtime { diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 30165cdb6f6c7..10e991aa505a7 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -1899,6 +1899,14 @@ impl_runtime_apis! { fn metadata() -> OpaqueMetadata { OpaqueMetadata::new(Runtime::metadata().into()) } + + fn metadata_at_version(version: u32) -> Option { + Runtime::metadata_at_version(version) + } + + fn metadata_versions() -> sp_std::vec::Vec { + Runtime::metadata_versions().into() + } } impl sp_block_builder::BlockBuilder for Runtime { diff --git a/primitives/api/src/lib.rs b/primitives/api/src/lib.rs index 549972502a392..1e46ab201cab0 100644 --- a/primitives/api/src/lib.rs +++ b/primitives/api/src/lib.rs @@ -734,5 +734,13 @@ decl_runtime_apis! { pub trait Metadata { /// Returns the metadata of a runtime. fn metadata() -> OpaqueMetadata; + + /// Returns the metadata at a given version. + fn metadata_at_version(version: u32) -> Option; + + /// Returns the supported versions of metadata. + /// + /// This can be used to call `metadata_at_version`. + fn metadata_versions() -> sp_std::vec::Vec; } } diff --git a/test-utils/runtime/src/lib.rs b/test-utils/runtime/src/lib.rs index 8b64528e243bd..1140072662ad8 100644 --- a/test-utils/runtime/src/lib.rs +++ b/test-utils/runtime/src/lib.rs @@ -437,6 +437,13 @@ cfg_if! { #[derive(Clone, Eq, PartialEq, TypeInfo)] pub struct Runtime; +// `metadata` method is implemented by `construct_runtime!` macro. +impl Runtime { + #[allow(dead_code)] + fn metadata() -> Vec { + Default::default() + } +} impl GetNodeBlockType for Runtime { type NodeBlock = Block; @@ -740,6 +747,14 @@ cfg_if! { fn metadata() -> OpaqueMetadata { unimplemented!() } + + fn metadata_at_version(_version: u32) -> Option { + unimplemented!() + } + + fn metadata_versions() -> sp_std::vec::Vec { + unimplemented!() + } } impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { @@ -1014,6 +1029,14 @@ cfg_if! { fn metadata() -> OpaqueMetadata { unimplemented!() } + + fn metadata_at_version(_version: u32) -> Option { + unimplemented!() + } + + fn metadata_versions() -> sp_std::vec::Vec { + unimplemented!() + } } impl sp_transaction_pool::runtime_api::TaggedTransactionQueue for Runtime { From 46681ddef42e56eeb0326c9da708f4cc8a3c2354 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Tue, 31 Jan 2023 13:30:22 +0000 Subject: [PATCH 03/75] runtime: Move `metadata_at` functions to construct_runtime macro Signed-off-by: Alexandru Vasile --- frame/bags-list/src/mock.rs | 2 +- frame/nomination-pools/src/mock.rs | 2 +- .../src/construct_runtime/expand/metadata.rs | 12 ++++++ frame/support/src/lib.rs | 2 +- frame/support/test/compile_pass/src/lib.rs | 2 +- .../api/proc-macro/src/impl_runtime_apis.rs | 43 ------------------- primitives/api/src/lib.rs | 2 +- 7 files changed, 17 insertions(+), 48 deletions(-) diff --git a/frame/bags-list/src/mock.rs b/frame/bags-list/src/mock.rs index 8cc96a988e72a..df8f40b6a347a 100644 --- a/frame/bags-list/src/mock.rs +++ b/frame/bags-list/src/mock.rs @@ -20,7 +20,7 @@ use super::*; use crate::{self as bags_list}; use frame_election_provider_support::VoteWeight; -use frame_support::parameter_types; +use frame_support::{parameter_types, OpaqueMetadata}; use std::collections::HashMap; pub type AccountId = u32; diff --git a/frame/nomination-pools/src/mock.rs b/frame/nomination-pools/src/mock.rs index 99d521df3241b..b63165a4d9f56 100644 --- a/frame/nomination-pools/src/mock.rs +++ b/frame/nomination-pools/src/mock.rs @@ -1,6 +1,6 @@ use super::*; use crate::{self as pools}; -use frame_support::{assert_ok, parameter_types, PalletId}; +use frame_support::{assert_ok, parameter_types, OpaqueMetadata, PalletId}; use frame_system::RawOrigin; use sp_runtime::FixedU128; use sp_staking::Stake; diff --git a/frame/support/procedural/src/construct_runtime/expand/metadata.rs b/frame/support/procedural/src/construct_runtime/expand/metadata.rs index ec90a0d30f98b..44df7765c4bf9 100644 --- a/frame/support/procedural/src/construct_runtime/expand/metadata.rs +++ b/frame/support/procedural/src/construct_runtime/expand/metadata.rs @@ -96,6 +96,18 @@ pub fn expand_runtime_metadata( #scrate::scale_info::meta_type::<#runtime>() ).into() } + + pub fn metadata_at_version(version: u32) -> Option { + match version { + // The V14 version is already implemented by `construct_runtime!` macro. + 14 => Some(OpaqueMetadata::new(#runtime::metadata().into())), + _ => None, + } + } + + pub fn metadata_versions() -> #scrate::sp_std::vec::Vec { + #scrate::sp_std::vec![ 14 ] + } } } } diff --git a/frame/support/src/lib.rs b/frame/support/src/lib.rs index 77ca89dc6f800..5b5642ae22e24 100644 --- a/frame/support/src/lib.rs +++ b/frame/support/src/lib.rs @@ -50,7 +50,7 @@ pub use paste; pub use scale_info; #[cfg(feature = "std")] pub use serde; -pub use sp_core::Void; +pub use sp_core::{OpaqueMetadata, Void}; #[doc(hidden)] pub use sp_core_hashing_proc_macro; #[doc(hidden)] diff --git a/frame/support/test/compile_pass/src/lib.rs b/frame/support/test/compile_pass/src/lib.rs index b46f6c48a6d99..c73111cdacdd6 100644 --- a/frame/support/test/compile_pass/src/lib.rs +++ b/frame/support/test/compile_pass/src/lib.rs @@ -26,7 +26,7 @@ use frame_support::{ construct_runtime, parameter_types, traits::{ConstU16, ConstU32, ConstU64}, }; -use sp_core::{sr25519, H256}; +use sp_core::{sr25519, OpaqueMetadata, H256}; use sp_runtime::{ create_runtime_str, generic, traits::{BlakeTwo256, IdentityLookup, Verify}, diff --git a/primitives/api/proc-macro/src/impl_runtime_apis.rs b/primitives/api/proc-macro/src/impl_runtime_apis.rs index 3df1f75aad56e..c3f4e36655d22 100644 --- a/primitives/api/proc-macro/src/impl_runtime_apis.rs +++ b/primitives/api/proc-macro/src/impl_runtime_apis.rs @@ -401,46 +401,6 @@ fn generate_api_impl_for_runtime(impls: &[ItemImpl]) -> Result { Ok(quote!( #( #impls_prepared )* )) } -/// Generates the metadata for the runtime. -fn generate_runtime_metadata(impls: &[ItemImpl]) -> Result { - if impls.is_empty() { - return Ok(quote!("")) - } - - let crate_ = generate_crate_access(HIDDEN_INCLUDES_ID); - - let first_impl_ = - impls.get(0).expect("Trait impls should always contain at least one item; qed"); - // Check that all traits are implemented for the same Runtime. - let _same_runtime = impls.iter().all(|impl_| { - if impl_.self_ty == first_impl_.self_ty { - return true - } - - panic!( - "Trait impls expected for runtime `{:?}`, received `{:?}`", - first_impl_.self_ty, impl_.self_ty - ); - }); - - let runtime = first_impl_.self_ty.clone(); - Ok(quote!( - impl #runtime { - fn metadata_at_version(version: u32) -> Option { - match version { - // The V14 version is already implemented by `construct_runtime!` macro. - 14 => Some(OpaqueMetadata::new(#runtime::metadata().into())), - _ => None, - } - } - - fn metadata_versions() -> #crate_::vec::Vec { - #crate_::vec![ 14 ] - } - } - )) -} - /// Auxiliary data structure that is used to convert `impl Api for Runtime` to /// `impl Api for RuntimeApi`. /// This requires us to replace the runtime `Block` with the node `Block`, @@ -674,7 +634,6 @@ fn impl_runtime_apis_impl_inner(api_impls: &[ItemImpl]) -> Result { let runtime_api_versions = generate_runtime_api_versions(api_impls)?; let wasm_interface = generate_wasm_interface(api_impls)?; let api_impls_for_runtime_api = generate_api_impl_for_runtime_api(api_impls)?; - let runtime_metadata = generate_runtime_metadata(api_impls)?; Ok(quote!( #hidden_includes @@ -685,8 +644,6 @@ fn impl_runtime_apis_impl_inner(api_impls: &[ItemImpl]) -> Result { #api_impls_for_runtime_api - #runtime_metadata - #runtime_api_versions pub mod api { diff --git a/primitives/api/src/lib.rs b/primitives/api/src/lib.rs index 1e46ab201cab0..a7282f6f3e98b 100644 --- a/primitives/api/src/lib.rs +++ b/primitives/api/src/lib.rs @@ -101,7 +101,7 @@ pub use sp_state_machine::{ StorageProof, TrieBackend, TrieBackendBuilder, }; #[doc(hidden)] -pub use sp_std::{mem, slice, vec}; +pub use sp_std::{mem, slice}; #[doc(hidden)] pub use sp_version::{create_apis_vec, ApiId, ApisVec, RuntimeVersion}; #[cfg(feature = "std")] From d03dd7df5a9731daf41a708452852544bf4e358a Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Tue, 31 Jan 2023 15:57:17 +0000 Subject: [PATCH 04/75] contruct_runtime: Use `OpaqueMetadata` from hidden imports Signed-off-by: Alexandru Vasile --- frame/bags-list/src/mock.rs | 2 +- frame/nomination-pools/src/mock.rs | 2 +- .../procedural/src/construct_runtime/expand/metadata.rs | 4 ++-- frame/support/test/compile_pass/src/lib.rs | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frame/bags-list/src/mock.rs b/frame/bags-list/src/mock.rs index df8f40b6a347a..8cc96a988e72a 100644 --- a/frame/bags-list/src/mock.rs +++ b/frame/bags-list/src/mock.rs @@ -20,7 +20,7 @@ use super::*; use crate::{self as bags_list}; use frame_election_provider_support::VoteWeight; -use frame_support::{parameter_types, OpaqueMetadata}; +use frame_support::parameter_types; use std::collections::HashMap; pub type AccountId = u32; diff --git a/frame/nomination-pools/src/mock.rs b/frame/nomination-pools/src/mock.rs index b63165a4d9f56..99d521df3241b 100644 --- a/frame/nomination-pools/src/mock.rs +++ b/frame/nomination-pools/src/mock.rs @@ -1,6 +1,6 @@ use super::*; use crate::{self as pools}; -use frame_support::{assert_ok, parameter_types, OpaqueMetadata, PalletId}; +use frame_support::{assert_ok, parameter_types, PalletId}; use frame_system::RawOrigin; use sp_runtime::FixedU128; use sp_staking::Stake; diff --git a/frame/support/procedural/src/construct_runtime/expand/metadata.rs b/frame/support/procedural/src/construct_runtime/expand/metadata.rs index 44df7765c4bf9..37c27cb8b5722 100644 --- a/frame/support/procedural/src/construct_runtime/expand/metadata.rs +++ b/frame/support/procedural/src/construct_runtime/expand/metadata.rs @@ -97,10 +97,10 @@ pub fn expand_runtime_metadata( ).into() } - pub fn metadata_at_version(version: u32) -> Option { + pub fn metadata_at_version(version: u32) -> Option<#scrate::OpaqueMetadata> { match version { // The V14 version is already implemented by `construct_runtime!` macro. - 14 => Some(OpaqueMetadata::new(#runtime::metadata().into())), + 14 => Some(#scrate::OpaqueMetadata::new(#runtime::metadata().into())), _ => None, } } diff --git a/frame/support/test/compile_pass/src/lib.rs b/frame/support/test/compile_pass/src/lib.rs index c73111cdacdd6..b46f6c48a6d99 100644 --- a/frame/support/test/compile_pass/src/lib.rs +++ b/frame/support/test/compile_pass/src/lib.rs @@ -26,7 +26,7 @@ use frame_support::{ construct_runtime, parameter_types, traits::{ConstU16, ConstU32, ConstU64}, }; -use sp_core::{sr25519, OpaqueMetadata, H256}; +use sp_core::{sr25519, H256}; use sp_runtime::{ create_runtime_str, generic, traits::{BlakeTwo256, IdentityLookup, Verify}, From 441b7adbd6b5093428ef8745afb4b5817be4a6a9 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Tue, 31 Jan 2023 16:03:42 +0000 Subject: [PATCH 05/75] Adjust testing Signed-off-by: Alexandru Vasile --- bin/node-template/runtime/src/lib.rs | 2 +- bin/node/runtime/src/lib.rs | 2 +- test-utils/runtime/src/lib.rs | 8 -------- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/bin/node-template/runtime/src/lib.rs b/bin/node-template/runtime/src/lib.rs index f6d64705fb3fb..bae4d12cb1704 100644 --- a/bin/node-template/runtime/src/lib.rs +++ b/bin/node-template/runtime/src/lib.rs @@ -373,7 +373,7 @@ impl_runtime_apis! { } fn metadata_versions() -> sp_std::vec::Vec { - Runtime::metadata_versions().into() + Runtime::metadata_versions() } } diff --git a/bin/node/runtime/src/lib.rs b/bin/node/runtime/src/lib.rs index 10e991aa505a7..61ac67c3ea853 100644 --- a/bin/node/runtime/src/lib.rs +++ b/bin/node/runtime/src/lib.rs @@ -1905,7 +1905,7 @@ impl_runtime_apis! { } fn metadata_versions() -> sp_std::vec::Vec { - Runtime::metadata_versions().into() + Runtime::metadata_versions() } } diff --git a/test-utils/runtime/src/lib.rs b/test-utils/runtime/src/lib.rs index 1140072662ad8..0c422845bcac5 100644 --- a/test-utils/runtime/src/lib.rs +++ b/test-utils/runtime/src/lib.rs @@ -437,14 +437,6 @@ cfg_if! { #[derive(Clone, Eq, PartialEq, TypeInfo)] pub struct Runtime; -// `metadata` method is implemented by `construct_runtime!` macro. -impl Runtime { - #[allow(dead_code)] - fn metadata() -> Vec { - Default::default() - } -} - impl GetNodeBlockType for Runtime { type NodeBlock = Block; } From 555ccfb97aaad8d63139cc5df2cc0972db11a8d9 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Tue, 31 Jan 2023 17:22:26 +0000 Subject: [PATCH 06/75] frame/tests: Add tests for the new API Signed-off-by: Alexandru Vasile --- frame/support/test/tests/pallet.rs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/frame/support/test/tests/pallet.rs b/frame/support/test/tests/pallet.rs index c0376d5aa450f..f050b23514eb1 100644 --- a/frame/support/test/tests/pallet.rs +++ b/frame/support/test/tests/pallet.rs @@ -1590,6 +1590,30 @@ fn metadata() { pretty_assertions::assert_eq!(actual_metadata.pallets, expected_metadata.pallets); } +#[test] +fn metadata_at_version() { + use frame_support::metadata::*; + use sp_core::Decode; + + let actual_metadata = Runtime::metadata(); + + let at_metadata = match Runtime::metadata_at_version(14) { + Some(opaque) => { + let bytes = &*opaque; + let metadata: RuntimeMetadataPrefixed = Decode::decode(&mut &bytes[..]).unwrap(); + metadata + }, + _ => panic!("metadata has been bumped, test needs to be updated"), + }; + + assert_eq!(actual_metadata, at_metadata); +} + +#[test] +fn metadata_versions() { + assert_eq!(vec![14], Runtime::metadata_versions()); +} + #[test] fn test_pallet_info_access() { assert_eq!(::name(), "System"); From d19bbcd45e109ca353bed744b750fde2261e02ba Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 2 Feb 2023 17:37:40 +0200 Subject: [PATCH 07/75] primitives/proc-macro: Helper to extract documentation literals Signed-off-by: Alexandru Vasile --- primitives/api/proc-macro/Cargo.toml | 3 ++ primitives/api/proc-macro/src/utils.rs | 48 ++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/primitives/api/proc-macro/Cargo.toml b/primitives/api/proc-macro/Cargo.toml index 8acc15d6a0591..1b0f2c09c950f 100644 --- a/primitives/api/proc-macro/Cargo.toml +++ b/primitives/api/proc-macro/Cargo.toml @@ -22,6 +22,9 @@ proc-macro2 = "1.0.37" blake2 = { version = "0.10.4", default-features = false } proc-macro-crate = "1.1.3" +[dev-dependencies] +assert_matches = "1.3.0" + # Required for the doc tests [features] default = [ "std" ] diff --git a/primitives/api/proc-macro/src/utils.rs b/primitives/api/proc-macro/src/utils.rs index 2ccd050cfb151..027f20f5d864d 100644 --- a/primitives/api/proc-macro/src/utils.rs +++ b/primitives/api/proc-macro/src/utils.rs @@ -274,3 +274,51 @@ pub fn parse_runtime_api_version(version: &Attribute) -> Result { pub fn versioned_trait_name(trait_ident: &Ident, version: u64) -> Ident { format_ident!("{}V{}", trait_ident, version) } + +/// Extract the documentation from the provided attributes. +pub fn get_doc_literals(attrs: &[syn::Attribute]) -> Vec { + attrs + .iter() + .filter_map(|attr| { + let Ok(syn::Meta::NameValue(meta)) = attr.parse_meta() else { + return None + }; + + if meta.path.get_ident().map_or(false, |ident| ident == "doc") { + Some(meta.lit) + } else { + None + } + }) + .collect() +} + +#[cfg(test)] +mod tests { + use assert_matches::assert_matches; + + use super::*; + + #[test] + fn check_get_doc_literals() { + const FIRST: &'static str = "hello"; + const SECOND: &'static str = "WORLD"; + + let doc: Attribute = parse_quote!(#[doc = #FIRST]); + println!("DOC: {}", quote!(#doc)); + let doc_world: Attribute = parse_quote!(#[doc = #SECOND]); + + let attrs = vec![ + doc.clone(), + parse_quote!(#[derive(Debug)]), + parse_quote!(#[test]), + parse_quote!(#[allow(non_camel_case_types)]), + doc_world.clone(), + ]; + + let docs = get_doc_literals(&attrs); + assert_eq!(docs.len(), 2); + assert_matches!(&docs[0], syn::Lit::Str(val) if val.value() == FIRST); + assert_matches!(&docs[1], syn::Lit::Str(val) if val.value() == SECOND); + } +} From d6d286889b14b463cc5ba02176658ed979227f3d Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 2 Feb 2023 17:41:33 +0200 Subject: [PATCH 08/75] primitives/proc-macro: Helper to filter all `cfg` attributes Signed-off-by: Alexandru Vasile --- primitives/api/proc-macro/src/utils.rs | 27 ++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/primitives/api/proc-macro/src/utils.rs b/primitives/api/proc-macro/src/utils.rs index 027f20f5d864d..57ef88f244f4d 100644 --- a/primitives/api/proc-macro/src/utils.rs +++ b/primitives/api/proc-macro/src/utils.rs @@ -270,7 +270,7 @@ pub fn parse_runtime_api_version(version: &Attribute) -> Result { version.base10_parse() } -// Each versioned trait is named 'ApiNameVN' where N is the specific version. E.g. ParachainHostV2 +/// Each versioned trait is named 'ApiNameVN' where N is the specific version. E.g. ParachainHostV2 pub fn versioned_trait_name(trait_ident: &Ident, version: u64) -> Ident { format_ident!("{}V{}", trait_ident, version) } @@ -293,6 +293,11 @@ pub fn get_doc_literals(attrs: &[syn::Attribute]) -> Vec { .collect() } +/// Filters all attributes except the cfg ones. +pub fn filter_cfg_attributes(attrs: &[syn::Attribute]) -> Vec { + attrs.iter().filter(|a| a.path.is_ident("cfg")).cloned().collect() +} + #[cfg(test)] mod tests { use assert_matches::assert_matches; @@ -305,7 +310,6 @@ mod tests { const SECOND: &'static str = "WORLD"; let doc: Attribute = parse_quote!(#[doc = #FIRST]); - println!("DOC: {}", quote!(#doc)); let doc_world: Attribute = parse_quote!(#[doc = #SECOND]); let attrs = vec![ @@ -321,4 +325,23 @@ mod tests { assert_matches!(&docs[0], syn::Lit::Str(val) if val.value() == FIRST); assert_matches!(&docs[1], syn::Lit::Str(val) if val.value() == SECOND); } + + #[test] + fn check_filter_cfg_attributes() { + let cfg_std: Attribute = parse_quote!(#[cfg(feature = "std")]); + let cfg_benchmarks: Attribute = parse_quote!(#[cfg(feature = "runtime-benchmarks")]); + + let attrs = vec![ + cfg_std.clone(), + parse_quote!(#[derive(Debug)]), + parse_quote!(#[test]), + cfg_benchmarks.clone(), + parse_quote!(#[allow(non_camel_case_types)]), + ]; + + let filtered = filter_cfg_attributes(&attrs); + assert_eq!(filtered.len(), 2); + assert_eq!(cfg_std, filtered[0]); + assert_eq!(cfg_benchmarks, filtered[1]); + } } From 10a2cc5128007cdf1be2b7e8c1a9b66f54dc4bde Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 2 Feb 2023 18:03:06 +0200 Subject: [PATCH 09/75] primitives/proc-macro: Generate documentation getters for metadata Signed-off-by: Alexandru Vasile --- Cargo.lock | 2 + primitives/api/proc-macro/Cargo.toml | 1 + .../api/proc-macro/src/decl_runtime_apis.rs | 18 +++-- primitives/api/proc-macro/src/lib.rs | 1 + .../api/proc-macro/src/runtime_metadata.rs | 78 +++++++++++++++++++ primitives/api/proc-macro/src/utils.rs | 8 ++ 6 files changed, 103 insertions(+), 5 deletions(-) create mode 100644 primitives/api/proc-macro/src/runtime_metadata.rs diff --git a/Cargo.lock b/Cargo.lock index dda127fdded77..eb0aafcba9ede 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9613,6 +9613,8 @@ dependencies = [ name = "sp-api-proc-macro" version = "4.0.0-dev" dependencies = [ + "Inflector", + "assert_matches", "blake2", "proc-macro-crate", "proc-macro2", diff --git a/primitives/api/proc-macro/Cargo.toml b/primitives/api/proc-macro/Cargo.toml index 1b0f2c09c950f..f5bbdde0aa566 100644 --- a/primitives/api/proc-macro/Cargo.toml +++ b/primitives/api/proc-macro/Cargo.toml @@ -21,6 +21,7 @@ syn = { version = "1.0.98", features = ["full", "fold", "extra-traits", "visit"] proc-macro2 = "1.0.37" blake2 = { version = "0.10.4", default-features = false } proc-macro-crate = "1.1.3" +Inflector = "0.11.4" [dev-dependencies] assert_matches = "1.3.0" diff --git a/primitives/api/proc-macro/src/decl_runtime_apis.rs b/primitives/api/proc-macro/src/decl_runtime_apis.rs index 8d46047dbda5a..031f3c33318c0 100644 --- a/primitives/api/proc-macro/src/decl_runtime_apis.rs +++ b/primitives/api/proc-macro/src/decl_runtime_apis.rs @@ -15,11 +15,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::utils::{ - extract_parameter_names_types_and_borrows, fold_fn_decl_for_client_side, generate_crate_access, - generate_hidden_includes, generate_runtime_mod_name_for_trait, parse_runtime_api_version, - prefix_function_with_trait, replace_wild_card_parameter_names, return_type_extract_type, - versioned_trait_name, AllowSelfRefInParameters, +use crate::{ + runtime_metadata::generate_decl_docs, + utils::{ + extract_parameter_names_types_and_borrows, fold_fn_decl_for_client_side, + generate_crate_access, generate_hidden_includes, generate_runtime_mod_name_for_trait, + parse_runtime_api_version, prefix_function_with_trait, replace_wild_card_parameter_names, + return_type_extract_type, versioned_trait_name, AllowSelfRefInParameters, + }, }; use crate::common::{ @@ -215,7 +218,10 @@ fn parse_renamed_attribute(renamed: &Attribute) -> Result<(String, u32)> { fn generate_runtime_decls(decls: &[ItemTrait]) -> Result { let mut result = Vec::new(); + let crate_ = generate_crate_access(HIDDEN_INCLUDES_ID); for decl in decls { + let runtime_docs = generate_decl_docs(&decl, &crate_); + let mut decl = decl.clone(); let decl_span = decl.span(); extend_generics_with_block(&mut decl.generics); @@ -304,6 +310,8 @@ fn generate_runtime_decls(decls: &[ItemTrait]) -> Result { pub use #versioned_ident as #main_api_ident; + #runtime_docs + pub #api_version pub #id diff --git a/primitives/api/proc-macro/src/lib.rs b/primitives/api/proc-macro/src/lib.rs index 31636b8e2d545..a4f6e68027e1b 100644 --- a/primitives/api/proc-macro/src/lib.rs +++ b/primitives/api/proc-macro/src/lib.rs @@ -25,6 +25,7 @@ mod common; mod decl_runtime_apis; mod impl_runtime_apis; mod mock_impl_runtime_apis; +mod runtime_metadata; mod utils; #[proc_macro] diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs new file mode 100644 index 0000000000000..b3959ab01579c --- /dev/null +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -0,0 +1,78 @@ +// This file is part of Substrate. + +// Copyright (C) 2018-2022 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. + +use proc_macro2::TokenStream; +use quote::quote; +use syn::ItemTrait; + +use crate::{ + common::CHANGED_IN_ATTRIBUTE, + utils::{filter_cfg_attributes, generate_decl_docs_getter, get_doc_literals}, +}; + +/// Generate documentation getters for `decl_runtime_api` macro. +/// +/// The documentation is exposed for the runtime API metadata. +/// +/// This method exposes the following functions for the latest trait version: +/// - `[TRAIT_NAME]_decl_runtime_docs`: Extract trait documentation +/// - `[METHOD_NAME]_decl_runtime_docs`: One function for each method to extract its documentation +pub fn generate_decl_docs(decl: &ItemTrait, crate_: &TokenStream) -> TokenStream { + let mut methods = Vec::new(); + + for item in &decl.items { + // Collect metadata for methods only. + let syn::TraitItem::Method(method) = item else { + continue + }; + + let signature = &method.sig; + let method_name = generate_decl_docs_getter(&signature.ident); + + let is_changed_in = method + .attrs + .iter() + .find(|attr| attr.path.is_ident(CHANGED_IN_ATTRIBUTE)) + .is_some(); + // Report docs for the latest methods only. + if is_changed_in { + continue + } + + let attrs = filter_cfg_attributes(&method.attrs); + let docs = get_doc_literals(&method.attrs); + methods.push(quote!( + #( #attrs )* + pub fn #method_name() -> #crate_::vec::Vec<&'static str> { + #crate_::vec![ #( #docs, )* ] + } + )); + } + + let trait_name = generate_decl_docs_getter(&decl.ident); + let docs = get_doc_literals(&decl.attrs); + let attrs = filter_cfg_attributes(&decl.attrs); + + quote!( + #( #attrs )* + pub fn #trait_name() -> #crate_::vec::Vec<&'static str> { + #crate_::vec![ #( #docs, )* ] + } + + #( #methods )* + ) +} diff --git a/primitives/api/proc-macro/src/utils.rs b/primitives/api/proc-macro/src/utils.rs index 57ef88f244f4d..0224dc1093930 100644 --- a/primitives/api/proc-macro/src/utils.rs +++ b/primitives/api/proc-macro/src/utils.rs @@ -22,6 +22,8 @@ use syn::{ ImplItem, ItemImpl, Pat, Path, PathArguments, Result, ReturnType, Signature, Type, TypePath, }; +use inflector::Inflector; + use quote::{format_ident, quote}; use std::env; @@ -298,6 +300,12 @@ pub fn filter_cfg_attributes(attrs: &[syn::Attribute]) -> Vec { attrs.iter().filter(|a| a.path.is_ident("cfg")).cloned().collect() } +/// Generate the documentation getter function name for the given ident. +pub fn generate_decl_docs_getter(ident: &Ident) -> String { + let ident_snake_name = Ident::new(&ident.to_string().to_snake_case(), ident.span()); + format!("{}_decl_runtime_docs", ident_snake_name) +} + #[cfg(test)] mod tests { use assert_matches::assert_matches; From a345ecefbb162e5e29a54f3d205d0302f1af9fbc Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 2 Feb 2023 18:26:20 +0200 Subject: [PATCH 10/75] primitives/proc-macro: Avoid trait collision with snake case methods Signed-off-by: Alexandru Vasile --- primitives/api/proc-macro/src/decl_runtime_apis.rs | 1 - primitives/api/proc-macro/src/runtime_metadata.rs | 4 ++-- primitives/api/proc-macro/src/utils.rs | 12 +++++++++--- primitives/api/src/lib.rs | 2 +- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/primitives/api/proc-macro/src/decl_runtime_apis.rs b/primitives/api/proc-macro/src/decl_runtime_apis.rs index 031f3c33318c0..a01f8954ec47b 100644 --- a/primitives/api/proc-macro/src/decl_runtime_apis.rs +++ b/primitives/api/proc-macro/src/decl_runtime_apis.rs @@ -221,7 +221,6 @@ fn generate_runtime_decls(decls: &[ItemTrait]) -> Result { let crate_ = generate_crate_access(HIDDEN_INCLUDES_ID); for decl in decls { let runtime_docs = generate_decl_docs(&decl, &crate_); - let mut decl = decl.clone(); let decl_span = decl.span(); extend_generics_with_block(&mut decl.generics); diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index b3959ab01579c..ba5c44f9583dd 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -41,7 +41,7 @@ pub fn generate_decl_docs(decl: &ItemTrait, crate_: &TokenStream) -> TokenStream }; let signature = &method.sig; - let method_name = generate_decl_docs_getter(&signature.ident); + let method_name = generate_decl_docs_getter(&signature.ident, false); let is_changed_in = method .attrs @@ -63,7 +63,7 @@ pub fn generate_decl_docs(decl: &ItemTrait, crate_: &TokenStream) -> TokenStream )); } - let trait_name = generate_decl_docs_getter(&decl.ident); + let trait_name = generate_decl_docs_getter(&decl.ident, true); let docs = get_doc_literals(&decl.attrs); let attrs = filter_cfg_attributes(&decl.attrs); diff --git a/primitives/api/proc-macro/src/utils.rs b/primitives/api/proc-macro/src/utils.rs index 0224dc1093930..48d94170d28ff 100644 --- a/primitives/api/proc-macro/src/utils.rs +++ b/primitives/api/proc-macro/src/utils.rs @@ -301,9 +301,15 @@ pub fn filter_cfg_attributes(attrs: &[syn::Attribute]) -> Vec { } /// Generate the documentation getter function name for the given ident. -pub fn generate_decl_docs_getter(ident: &Ident) -> String { - let ident_snake_name = Ident::new(&ident.to_string().to_snake_case(), ident.span()); - format!("{}_decl_runtime_docs", ident_snake_name) +pub fn generate_decl_docs_getter(ident: &Ident, is_trait: bool) -> Ident { + if is_trait { + // Avoid collisions for `trait Metadata { fn metadata() }` by + // prefixing traits with `trait_`. + let ident_snake_name = Ident::new(&ident.to_string().to_snake_case(), ident.span()); + return format_ident!("trait_{}_decl_runtime_docs", ident_snake_name) + } + + format_ident!("{}_decl_runtime_docs", ident) } #[cfg(test)] diff --git a/primitives/api/src/lib.rs b/primitives/api/src/lib.rs index a7282f6f3e98b..1e46ab201cab0 100644 --- a/primitives/api/src/lib.rs +++ b/primitives/api/src/lib.rs @@ -101,7 +101,7 @@ pub use sp_state_machine::{ StorageProof, TrieBackend, TrieBackendBuilder, }; #[doc(hidden)] -pub use sp_std::{mem, slice}; +pub use sp_std::{mem, slice, vec}; #[doc(hidden)] pub use sp_version::{create_apis_vec, ApiId, ApisVec, RuntimeVersion}; #[cfg(feature = "std")] From 397eaa081493f602ff580ac80ee56e2cbe760aab Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 2 Feb 2023 18:36:18 +0200 Subject: [PATCH 11/75] proc-macro/tests: Check doc getters Signed-off-by: Alexandru Vasile --- primitives/api/test/tests/decl_and_impl.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/primitives/api/test/tests/decl_and_impl.rs b/primitives/api/test/tests/decl_and_impl.rs index 42628830cc7fa..1946ec0371559 100644 --- a/primitives/api/test/tests/decl_and_impl.rs +++ b/primitives/api/test/tests/decl_and_impl.rs @@ -40,9 +40,14 @@ decl_runtime_apis! { fn wild_card(_: u32); } + /// ApiWithCustomVersion trait documentation + /// + /// Documentation on multiline. #[api_version(2)] pub trait ApiWithCustomVersion { + /// same_name version 2. fn same_name(); + /// same_name version 1. #[changed_in(2)] fn same_name() -> String; } @@ -166,6 +171,23 @@ fn test_client_side_function_signature() { ) -> Result = RuntimeApiImpl::::same_name_before_version_2; } +#[test] +fn check_runtime_api_docs() { + // No documentation available for the `Api` trait. + assert!(runtime_decl_for_Api::trait_api_decl_runtime_docs().is_empty()); + + assert_eq!( + vec![" ApiWithCustomVersion trait documentation", "", " Documentation on multiline."], + runtime_decl_for_ApiWithCustomVersion::trait_api_with_custom_version_decl_runtime_docs() + ); + + // Docs are collected only for the last version of methods. + assert_eq!( + vec![" same_name version 2."], + runtime_decl_for_ApiWithCustomVersion::same_name_decl_runtime_docs() + ); +} + #[test] fn check_runtime_api_info() { assert_eq!(&>::ID, &runtime_decl_for_Api::ID); From 04b0c38b95e5465f42b4c1831a28095a17145387 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 2 Feb 2023 18:47:10 +0200 Subject: [PATCH 12/75] primitives/proc-macro: Generate metadata for runtime methods Signed-off-by: Alexandru Vasile --- .../api/proc-macro/src/runtime_metadata.rs | 51 ++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index ba5c44f9583dd..4af6a66a72983 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -17,7 +17,7 @@ use proc_macro2::TokenStream; use quote::quote; -use syn::ItemTrait; +use syn::{ImplItemMethod, ItemTrait, Path, Result}; use crate::{ common::CHANGED_IN_ATTRIBUTE, @@ -76,3 +76,52 @@ pub fn generate_decl_docs(decl: &ItemTrait, crate_: &TokenStream) -> TokenStream #( #methods )* ) } + +/// Generate the runtime metadata for a given method. +fn generate_method_metadata( + method: &ImplItemMethod, + crate_: &TokenStream, + hidden_mod: &Path, +) -> Result { + let signature = &method.sig; + let mut inputs = Vec::new(); + + for input in &signature.inputs { + let syn::FnArg::Typed(typed) = input else { + // Exclude `self` from metadata collection. + continue + }; + + let pat = &typed.pat; + let name = format!("{}", quote!(#pat)); + let ty = &typed.ty; + + inputs.push(quote!( + #crate_::metadata::v15::ParamMetadata { + name: #name, + ty: #crate_::scale_info::meta_type::<#ty>(), + } + )); + } + + let output = match &signature.output { + syn::ReturnType::Default => quote!(#crate_::scale_info::meta_type::<()>()), + syn::ReturnType::Type(_, ty) => quote!(#crate_::scale_info::meta_type::<#ty>()), + }; + + // String method name including quotes for constructing `v15::MethodMetadata`. + let method_name = format!("{}", signature.ident); + // Function getter for the documentation. + let doc_getter = generate_decl_docs_getter(&signature.ident, false); + let attrs = filter_cfg_attributes(&method.attrs); + + Ok(quote!( + #( #attrs )* + #crate_::metadata::v15::MethodMetadata { + name: #method_name, + inputs: #crate_::vec![ #( #inputs, )* ], + output: #output, + docs: #hidden_mod::#doc_getter(), + } + )) +} From a87dd221162798670445b312f63671092f19f7db Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 2 Feb 2023 18:50:46 +0200 Subject: [PATCH 13/75] primitives/api: Export scale-info and frame-metadata Signed-off-by: Alexandru Vasile --- primitives/api/Cargo.toml | 4 ++++ primitives/api/src/lib.rs | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/primitives/api/Cargo.toml b/primitives/api/Cargo.toml index 75197bcaea900..ee9b56a6aba94 100644 --- a/primitives/api/Cargo.toml +++ b/primitives/api/Cargo.toml @@ -23,6 +23,8 @@ sp-state-machine = { version = "0.13.0", default-features = false, optional = tr sp-trie = { version = "7.0.0", default-features = false, optional = true, path = "../trie" } hash-db = { version = "0.15.2", optional = true } thiserror = { version = "1.0.30", optional = true } +scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } +frame-metadata = { version = "15.0.0", default-features = false, features = ["v14"] } log = { version = "0.4.17", default-features = false } @@ -42,6 +44,8 @@ std = [ "hash-db", "thiserror", "log/std", + "scale-info/std", + "frame-metadata/std", ] # Special feature to disable logging completly. # diff --git a/primitives/api/src/lib.rs b/primitives/api/src/lib.rs index 1e46ab201cab0..5f36a12265ce7 100644 --- a/primitives/api/src/lib.rs +++ b/primitives/api/src/lib.rs @@ -73,9 +73,13 @@ extern crate self as sp_api; #[doc(hidden)] pub use codec::{self, Decode, DecodeLimit, Encode}; #[doc(hidden)] +pub use frame_metadata as metadata; +#[doc(hidden)] #[cfg(feature = "std")] pub use hash_db::Hasher; #[doc(hidden)] +pub use scale_info; +#[doc(hidden)] #[cfg(not(feature = "std"))] pub use sp_core::to_substrate_wasm_fn_return_value; use sp_core::OpaqueMetadata; From 874cf6e718430e9db8a3d7c86fe171172f461f17 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 2 Feb 2023 18:56:26 +0200 Subject: [PATCH 14/75] primitives/proc-macro: Generate metadata for runtime traits Signed-off-by: Alexandru Vasile --- Cargo.lock | 2 + .../api/proc-macro/src/impl_runtime_apis.rs | 16 ++-- .../api/proc-macro/src/runtime_metadata.rs | 86 ++++++++++++++++++- 3 files changed, 96 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index eb0aafcba9ede..55ccb8ee2db59 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9595,9 +9595,11 @@ dependencies = [ name = "sp-api" version = "4.0.0-dev" dependencies = [ + "frame-metadata", "hash-db", "log", "parity-scale-codec", + "scale-info", "sp-api-proc-macro", "sp-core", "sp-runtime", diff --git a/primitives/api/proc-macro/src/impl_runtime_apis.rs b/primitives/api/proc-macro/src/impl_runtime_apis.rs index c3f4e36655d22..3335f1252c834 100644 --- a/primitives/api/proc-macro/src/impl_runtime_apis.rs +++ b/primitives/api/proc-macro/src/impl_runtime_apis.rs @@ -15,11 +15,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -use crate::utils::{ - extract_all_signature_types, extract_block_type_from_trait_path, extract_impl_trait, - extract_parameter_names_types_and_borrows, generate_crate_access, generate_hidden_includes, - generate_runtime_mod_name_for_trait, parse_runtime_api_version, prefix_function_with_trait, - versioned_trait_name, AllowSelfRefInParameters, RequireQualifiedTraitPath, +use crate::{ + runtime_metadata::generate_runtime_metadata, + utils::{ + extract_all_signature_types, extract_block_type_from_trait_path, extract_impl_trait, + extract_parameter_names_types_and_borrows, generate_crate_access, generate_hidden_includes, + generate_runtime_mod_name_for_trait, parse_runtime_api_version, prefix_function_with_trait, + versioned_trait_name, AllowSelfRefInParameters, RequireQualifiedTraitPath, + }, }; use crate::common::API_VERSION_ATTRIBUTE; @@ -634,6 +637,7 @@ fn impl_runtime_apis_impl_inner(api_impls: &[ItemImpl]) -> Result { let runtime_api_versions = generate_runtime_api_versions(api_impls)?; let wasm_interface = generate_wasm_interface(api_impls)?; let api_impls_for_runtime_api = generate_api_impl_for_runtime_api(api_impls)?; + let runtime_metadata = generate_runtime_metadata(api_impls)?; Ok(quote!( #hidden_includes @@ -646,6 +650,8 @@ fn impl_runtime_apis_impl_inner(api_impls: &[ItemImpl]) -> Result { #runtime_api_versions + #runtime_metadata + pub mod api { use super::*; diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index 4af6a66a72983..ca297eeb4201f 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -17,11 +17,15 @@ use proc_macro2::TokenStream; use quote::quote; -use syn::{ImplItemMethod, ItemTrait, Path, Result}; +use syn::{parse_quote, ImplItemMethod, ItemImpl, ItemTrait, Path, Result}; use crate::{ - common::CHANGED_IN_ATTRIBUTE, - utils::{filter_cfg_attributes, generate_decl_docs_getter, get_doc_literals}, + common::{CHANGED_IN_ATTRIBUTE, HIDDEN_INCLUDES_ID}, + utils::{ + extract_impl_trait, filter_cfg_attributes, generate_crate_access, + generate_decl_docs_getter, generate_runtime_mod_name_for_trait, get_doc_literals, + RequireQualifiedTraitPath, + }, }; /// Generate documentation getters for `decl_runtime_api` macro. @@ -125,3 +129,79 @@ fn generate_method_metadata( } )) } + +/// Generate the runtime metadata for a given trait. +fn generate_trait_metadata(impl_: &ItemImpl, crate_: &TokenStream) -> Result { + let mut trait_ = extract_impl_trait(&impl_, RequireQualifiedTraitPath::Yes)?.clone(); + + // Implementation traits are always references with a path `impl client::Core ...` + // The trait name is the last segment of this path. + let trait_name_ident = &trait_ + .segments + .last() + .as_ref() + .expect("Trait path should always contain at least one item; qed") + .ident; + + let trait_doc_getter = generate_decl_docs_getter(trait_name_ident, true); + let trait_name = format!("{}", trait_name_ident); + + // Generate `runtime_decl_for_[TRAIT_NAME]` module that contains the documentation getters. + let runtime_decl_mod = generate_runtime_mod_name_for_trait(trait_name_ident); + + // Get absolute path to the `runtime_decl_for_` module by replacing the last segment. + if let Some(segment) = trait_.segments.last_mut() { + *segment = parse_quote!(#runtime_decl_mod); + } + + let attrs = filter_cfg_attributes(&impl_.attrs); + + let mut methods = Vec::new(); + for item in &impl_.items { + // Collect metadata for methods only. + let syn::ImplItem::Method(method) = item else { + continue; + }; + + let metadata = generate_method_metadata(&method, crate_, &trait_)?; + methods.push(metadata); + } + + Ok(quote!( + #( #attrs )* + #crate_::metadata::v15::TraitMetadata { + name: #trait_name, + methods: #crate_::vec![ #( #methods, )* ], + docs: #trait_::#trait_doc_getter(), + } + )) +} + +/// Generate the runtime metadata for the given traits. +pub fn generate_runtime_metadata(impls: &[ItemImpl]) -> Result { + if impls.is_empty() { + return Ok(quote!()) + } + + // Get the name of the runtime for which the traits are implemented. + let runtime_name = &impls + .get(0) + .expect("Traits should contain at least one implementation; qed") + .self_ty; + + let mut metadata = Vec::new(); + + let crate_ = generate_crate_access(HIDDEN_INCLUDES_ID); + + for impl_ in impls { + metadata.push(generate_trait_metadata(impl_, &crate_)?); + } + + Ok(quote!( + impl #runtime_name { + pub fn runtime_metadata() -> #crate_::vec::Vec<#crate_::metadata::v15::TraitMetadata> { + #crate_::vec![ #( #metadata, )* ] + } + } + )) +} From dad09800609d8c6682d4831274120137319436ac Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 2 Feb 2023 19:16:33 +0200 Subject: [PATCH 15/75] frame/runtime: Expose metadata v15 internally Signed-off-by: Alexandru Vasile --- .../src/construct_runtime/expand/metadata.rs | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/frame/support/procedural/src/construct_runtime/expand/metadata.rs b/frame/support/procedural/src/construct_runtime/expand/metadata.rs index 37c27cb8b5722..f8bba0304416c 100644 --- a/frame/support/procedural/src/construct_runtime/expand/metadata.rs +++ b/frame/support/procedural/src/construct_runtime/expand/metadata.rs @@ -101,6 +101,7 @@ pub fn expand_runtime_metadata( match version { // The V14 version is already implemented by `construct_runtime!` macro. 14 => Some(#scrate::OpaqueMetadata::new(#runtime::metadata().into())), + 15 => Some(#scrate::OpaqueMetadata::new(#runtime::metadata_v15().into())), _ => None, } } @@ -108,6 +109,30 @@ pub fn expand_runtime_metadata( pub fn metadata_versions() -> #scrate::sp_std::vec::Vec { #scrate::sp_std::vec![ 14 ] } + + fn metadata_v15() -> #scrate::metadata::RuntimeMetadataPrefixed { + #scrate::metadata::v15::RuntimeMetadataLastVersion::new( + #scrate::sp_std::vec![ #(#pallets),* ], + #scrate::metadata::ExtrinsicMetadata { + ty: #scrate::scale_info::meta_type::<#extrinsic>(), + version: <#extrinsic as #scrate::sp_runtime::traits::ExtrinsicMetadata>::VERSION, + signed_extensions: < + < + #extrinsic as #scrate::sp_runtime::traits::ExtrinsicMetadata + >::SignedExtensions as #scrate::sp_runtime::traits::SignedExtension + >::metadata() + .into_iter() + .map(|meta| #scrate::metadata::SignedExtensionMetadata { + identifier: meta.identifier, + ty: meta.ty, + additional_signed: meta.additional_signed, + }) + .collect(), + }, + #scrate::scale_info::meta_type::<#runtime>(), + #runtime::runtime_metadata(), + ).into() + } } } } From df770ecc13f236c8b516efff6766ec5efa5a7a75 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 2 Feb 2023 19:25:18 +0200 Subject: [PATCH 16/75] test: Use metadata v15 from `lexnv/md_v15_test` branch Signed-off-by: Alexandru Vasile --- Cargo.lock | 3 +-- frame/bags-list/src/mock.rs | 6 ++++++ frame/nomination-pools/src/mock.rs | 5 +++++ frame/support/Cargo.toml | 2 +- frame/support/test/compile_pass/src/lib.rs | 6 ++++++ primitives/api/Cargo.toml | 2 +- 6 files changed, 20 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 55ccb8ee2db59..1dcc15b730410 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2312,8 +2312,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "15.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df6bb8542ef006ef0de09a5c4420787d79823c0ed7924225822362fd2bf2ff2d" +source = "git+https://github.com/paritytech/frame-metadata/?branch=lexnv/md_v15_test#35b8304e004f9a759aa2663e24c5f56e2a50c301" dependencies = [ "cfg-if", "parity-scale-codec", diff --git a/frame/bags-list/src/mock.rs b/frame/bags-list/src/mock.rs index 8cc96a988e72a..3fff854609dda 100644 --- a/frame/bags-list/src/mock.rs +++ b/frame/bags-list/src/mock.rs @@ -98,6 +98,12 @@ frame_support::construct_runtime!( } ); +impl Runtime { + fn runtime_metadata() -> ! { + unimplemented!() + } +} + /// Default AccountIds and their weights. pub(crate) const GENESIS_IDS: [(AccountId, VoteWeight); 4] = [(1, 10), (2, 1_000), (3, 1_000), (4, 1_000)]; diff --git a/frame/nomination-pools/src/mock.rs b/frame/nomination-pools/src/mock.rs index 99d521df3241b..5135c81c260fa 100644 --- a/frame/nomination-pools/src/mock.rs +++ b/frame/nomination-pools/src/mock.rs @@ -247,6 +247,11 @@ frame_support::construct_runtime!( } ); +impl Runtime { + fn runtime_metadata() -> ! { + unimplemented!() + } +} pub struct ExtBuilder { members: Vec<(AccountId, Balance)>, max_members: Option, diff --git a/frame/support/Cargo.toml b/frame/support/Cargo.toml index 4f62ae42ef78f..e524000feaf3e 100644 --- a/frame/support/Cargo.toml +++ b/frame/support/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] serde = { version = "1.0.136", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.2.2", default-features = false, features = ["derive", "max-encoded-len"] } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } -frame-metadata = { version = "15.0.0", default-features = false, features = ["v14"] } +frame-metadata = { version = "15.0.0", git = "https://github.com/paritytech/frame-metadata/", branch = "lexnv/md_v15_test", default-features = false, features = ["v14", "v15-unstable"] } sp-api = { version = "4.0.0-dev", default-features = false, path = "../../primitives/api" } sp-std = { version = "5.0.0", default-features = false, path = "../../primitives/std" } sp-io = { version = "7.0.0", default-features = false, path = "../../primitives/io" } diff --git a/frame/support/test/compile_pass/src/lib.rs b/frame/support/test/compile_pass/src/lib.rs index b46f6c48a6d99..d58b93860dad4 100644 --- a/frame/support/test/compile_pass/src/lib.rs +++ b/frame/support/test/compile_pass/src/lib.rs @@ -93,3 +93,9 @@ construct_runtime!( System: frame_system, } ); + +impl Runtime { + fn runtime_metadata() -> ! { + unimplemented!() + } +} diff --git a/primitives/api/Cargo.toml b/primitives/api/Cargo.toml index ee9b56a6aba94..96e847fc695f6 100644 --- a/primitives/api/Cargo.toml +++ b/primitives/api/Cargo.toml @@ -24,7 +24,7 @@ sp-trie = { version = "7.0.0", default-features = false, optional = true, path = hash-db = { version = "0.15.2", optional = true } thiserror = { version = "1.0.30", optional = true } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } -frame-metadata = { version = "15.0.0", default-features = false, features = ["v14"] } +frame-metadata = { version = "15.0.0", git = "https://github.com/paritytech/frame-metadata/", branch = "lexnv/md_v15_test", default-features = false, features = ["v14", "v15-unstable"] } log = { version = "0.4.17", default-features = false } From c33d3ca662f998ea172e034a4efb1cc2680ca1d2 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 2 Feb 2023 19:34:47 +0200 Subject: [PATCH 17/75] primitives/proc-macro: Generate crate access one module up Signed-off-by: Alexandru Vasile --- primitives/api/proc-macro/src/impl_runtime_apis.rs | 3 ++- primitives/api/proc-macro/src/runtime_metadata.rs | 4 +--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/primitives/api/proc-macro/src/impl_runtime_apis.rs b/primitives/api/proc-macro/src/impl_runtime_apis.rs index 3335f1252c834..1785d27f85281 100644 --- a/primitives/api/proc-macro/src/impl_runtime_apis.rs +++ b/primitives/api/proc-macro/src/impl_runtime_apis.rs @@ -637,7 +637,8 @@ fn impl_runtime_apis_impl_inner(api_impls: &[ItemImpl]) -> Result { let runtime_api_versions = generate_runtime_api_versions(api_impls)?; let wasm_interface = generate_wasm_interface(api_impls)?; let api_impls_for_runtime_api = generate_api_impl_for_runtime_api(api_impls)?; - let runtime_metadata = generate_runtime_metadata(api_impls)?; + let crate_ = generate_crate_access(HIDDEN_INCLUDES_ID); + let runtime_metadata = generate_runtime_metadata(api_impls, &crate_)?; Ok(quote!( #hidden_includes diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index ca297eeb4201f..f23f392921220 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -178,7 +178,7 @@ fn generate_trait_metadata(impl_: &ItemImpl, crate_: &TokenStream) -> Result Result { +pub fn generate_runtime_metadata(impls: &[ItemImpl], crate_: &TokenStream) -> Result { if impls.is_empty() { return Ok(quote!()) } @@ -191,8 +191,6 @@ pub fn generate_runtime_metadata(impls: &[ItemImpl]) -> Result { let mut metadata = Vec::new(); - let crate_ = generate_crate_access(HIDDEN_INCLUDES_ID); - for impl_ in impls { metadata.push(generate_trait_metadata(impl_, &crate_)?); } From e4782de008148d1f9b2758e9a919314c0a62ed9a Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Fri, 3 Feb 2023 14:42:27 +0200 Subject: [PATCH 18/75] frame: Implement `runtime_metadata` for mocks and tests Signed-off-by: Alexandru Vasile --- frame/authority-discovery/src/lib.rs | 6 ++++++ frame/bags-list/src/mock.rs | 4 ++-- frame/beefy-mmr/src/mock.rs | 6 ++++++ frame/beefy/src/mock.rs | 6 ++++++ frame/benchmarking/src/tests.rs | 6 ++++++ frame/benchmarking/src/tests_instance.rs | 6 ++++++ frame/contracts/src/tests.rs | 6 ++++++ frame/elections-phragmen/src/lib.rs | 5 +++++ frame/examples/offchain-worker/src/tests.rs | 6 ++++++ frame/fast-unstake/src/mock.rs | 6 ++++++ frame/im-online/src/mock.rs | 6 ++++++ frame/lottery/src/mock.rs | 6 ++++++ frame/nomination-pools/src/mock.rs | 5 +++-- frame/scheduler/src/mock.rs | 6 ++++++ frame/staking/src/mock.rs | 6 ++++++ frame/support/test/compile_pass/src/lib.rs | 4 ++-- frame/support/test/tests/construct_runtime.rs | 6 ++++++ frame/support/test/tests/instance.rs | 6 ++++++ frame/support/test/tests/issue2219.rs | 6 ++++++ frame/support/test/tests/pallet_compatibility.rs | 6 ++++++ frame/support/test/tests/pallet_compatibility_instance.rs | 6 ++++++ frame/support/test/tests/pallet_instance.rs | 6 ++++++ frame/support/test/tests/pallet_with_name_trait_is_valid.rs | 6 ++++++ 23 files changed, 126 insertions(+), 6 deletions(-) diff --git a/frame/authority-discovery/src/lib.rs b/frame/authority-discovery/src/lib.rs index 39e01dba43b2b..49151b0b3eca0 100644 --- a/frame/authority-discovery/src/lib.rs +++ b/frame/authority-discovery/src/lib.rs @@ -196,6 +196,12 @@ mod tests { } ); + impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } + } + parameter_types! { pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(33); } diff --git a/frame/bags-list/src/mock.rs b/frame/bags-list/src/mock.rs index 3fff854609dda..7e14bbab71daf 100644 --- a/frame/bags-list/src/mock.rs +++ b/frame/bags-list/src/mock.rs @@ -99,8 +99,8 @@ frame_support::construct_runtime!( ); impl Runtime { - fn runtime_metadata() -> ! { - unimplemented!() + fn runtime_metadata() -> Vec { + Default::default() } } diff --git a/frame/beefy-mmr/src/mock.rs b/frame/beefy-mmr/src/mock.rs index 2de71cd5b320a..89851241c05f0 100644 --- a/frame/beefy-mmr/src/mock.rs +++ b/frame/beefy-mmr/src/mock.rs @@ -62,6 +62,12 @@ construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/beefy/src/mock.rs b/frame/beefy/src/mock.rs index ad3a672333dd5..8658f36971813 100644 --- a/frame/beefy/src/mock.rs +++ b/frame/beefy/src/mock.rs @@ -57,6 +57,12 @@ construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/benchmarking/src/tests.rs b/frame/benchmarking/src/tests.rs index 1499f9c182fce..289662896abcb 100644 --- a/frame/benchmarking/src/tests.rs +++ b/frame/benchmarking/src/tests.rs @@ -88,6 +88,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/benchmarking/src/tests_instance.rs b/frame/benchmarking/src/tests_instance.rs index ecc0a78a199b9..0f2a94392c8ed 100644 --- a/frame/benchmarking/src/tests_instance.rs +++ b/frame/benchmarking/src/tests_instance.rs @@ -92,6 +92,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/contracts/src/tests.rs b/frame/contracts/src/tests.rs index ce84da743d112..2d47e97d77ae8 100644 --- a/frame/contracts/src/tests.rs +++ b/frame/contracts/src/tests.rs @@ -73,6 +73,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + #[macro_use] pub mod test_utils { use super::{Balances, Hash, SysConfig, Test}; diff --git a/frame/elections-phragmen/src/lib.rs b/frame/elections-phragmen/src/lib.rs index 1a020adb28632..3fd70d7b99439 100644 --- a/frame/elections-phragmen/src/lib.rs +++ b/frame/elections-phragmen/src/lib.rs @@ -1316,6 +1316,11 @@ mod tests { } ); + impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } + } pub struct ExtBuilder { balance_factor: u64, genesis_members: Vec<(u64, u64)>, diff --git a/frame/examples/offchain-worker/src/tests.rs b/frame/examples/offchain-worker/src/tests.rs index 2050d76a241ff..2367ee822c8a0 100644 --- a/frame/examples/offchain-worker/src/tests.rs +++ b/frame/examples/offchain-worker/src/tests.rs @@ -51,6 +51,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/fast-unstake/src/mock.rs b/frame/fast-unstake/src/mock.rs index 38cf41fdebe8b..65d800c55bfd4 100644 --- a/frame/fast-unstake/src/mock.rs +++ b/frame/fast-unstake/src/mock.rs @@ -206,6 +206,12 @@ frame_support::construct_runtime!( } ); +impl Runtime { + fn runtime_metadata() -> Vec { + Default::default() + } +} + parameter_types! { static FastUnstakeEvents: u32 = 0; } diff --git a/frame/im-online/src/mock.rs b/frame/im-online/src/mock.rs index 783e68dfede9f..660f7cb619bfc 100644 --- a/frame/im-online/src/mock.rs +++ b/frame/im-online/src/mock.rs @@ -55,6 +55,12 @@ frame_support::construct_runtime!( } ); +impl Runtime { + fn runtime_metadata() -> Vec { + Default::default() + } +} + parameter_types! { pub static Validators: Option> = Some(vec![ 1, diff --git a/frame/lottery/src/mock.rs b/frame/lottery/src/mock.rs index 1977da5959d39..e254cbccf376c 100644 --- a/frame/lottery/src/mock.rs +++ b/frame/lottery/src/mock.rs @@ -48,6 +48,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + parameter_types! { pub const AvailableBlockRatio: Perbill = Perbill::one(); } diff --git a/frame/nomination-pools/src/mock.rs b/frame/nomination-pools/src/mock.rs index 5135c81c260fa..47a7c90badef8 100644 --- a/frame/nomination-pools/src/mock.rs +++ b/frame/nomination-pools/src/mock.rs @@ -248,10 +248,11 @@ frame_support::construct_runtime!( ); impl Runtime { - fn runtime_metadata() -> ! { - unimplemented!() + fn runtime_metadata() -> Vec { + Default::default() } } + pub struct ExtBuilder { members: Vec<(AccountId, Balance)>, max_members: Option, diff --git a/frame/scheduler/src/mock.rs b/frame/scheduler/src/mock.rs index 0aaac56667dcb..f161004e290b1 100644 --- a/frame/scheduler/src/mock.rs +++ b/frame/scheduler/src/mock.rs @@ -110,6 +110,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + // Scheduler must dispatch with root and no filter, this tests base filter is indeed not used. pub struct BaseFilter; impl Contains for BaseFilter { diff --git a/frame/staking/src/mock.rs b/frame/staking/src/mock.rs index 30db036d00056..9617f2a73de06 100644 --- a/frame/staking/src/mock.rs +++ b/frame/staking/src/mock.rs @@ -102,6 +102,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + /// Author of block is always 11 pub struct Author11; impl FindAuthor for Author11 { diff --git a/frame/support/test/compile_pass/src/lib.rs b/frame/support/test/compile_pass/src/lib.rs index d58b93860dad4..97c6dc58baef5 100644 --- a/frame/support/test/compile_pass/src/lib.rs +++ b/frame/support/test/compile_pass/src/lib.rs @@ -95,7 +95,7 @@ construct_runtime!( ); impl Runtime { - fn runtime_metadata() -> ! { - unimplemented!() + fn runtime_metadata() -> Vec { + Default::default() } } diff --git a/frame/support/test/tests/construct_runtime.rs b/frame/support/test/tests/construct_runtime.rs index 18e4af1ac3739..20ca0f90a8765 100644 --- a/frame/support/test/tests/construct_runtime.rs +++ b/frame/support/test/tests/construct_runtime.rs @@ -275,6 +275,12 @@ frame_support::construct_runtime!( } ); +impl Runtime { + fn runtime_metadata() -> Vec { + Default::default() + } +} + pub type Header = generic::Header; pub type Block = generic::Block; pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; diff --git a/frame/support/test/tests/instance.rs b/frame/support/test/tests/instance.rs index 043959b67ee6e..5bfb77996275a 100644 --- a/frame/support/test/tests/instance.rs +++ b/frame/support/test/tests/instance.rs @@ -313,6 +313,12 @@ frame_support::construct_runtime!( } ); +impl Runtime { + fn runtime_metadata() -> Vec { + Default::default() + } +} + pub type Header = generic::Header; pub type Block = generic::Block; pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; diff --git a/frame/support/test/tests/issue2219.rs b/frame/support/test/tests/issue2219.rs index 5d24d54165c1f..f80bb322cc848 100644 --- a/frame/support/test/tests/issue2219.rs +++ b/frame/support/test/tests/issue2219.rs @@ -182,6 +182,12 @@ frame_support::construct_runtime!( } ); +impl Runtime { + fn runtime_metadata() -> Vec { + Default::default() + } +} + #[test] fn create_genesis_config() { let config = GenesisConfig { diff --git a/frame/support/test/tests/pallet_compatibility.rs b/frame/support/test/tests/pallet_compatibility.rs index 300fb9a40cf4e..6d32a9eb93a35 100644 --- a/frame/support/test/tests/pallet_compatibility.rs +++ b/frame/support/test/tests/pallet_compatibility.rs @@ -279,6 +279,12 @@ frame_support::construct_runtime!( } ); +impl Runtime { + fn runtime_metadata() -> Vec { + Default::default() + } +} + #[cfg(test)] mod test { use super::{pallet, pallet_old, Runtime}; diff --git a/frame/support/test/tests/pallet_compatibility_instance.rs b/frame/support/test/tests/pallet_compatibility_instance.rs index 79370d911b943..b31153b24dcba 100644 --- a/frame/support/test/tests/pallet_compatibility_instance.rs +++ b/frame/support/test/tests/pallet_compatibility_instance.rs @@ -283,6 +283,12 @@ frame_support::construct_runtime!( } ); +impl Runtime { + fn runtime_metadata() -> Vec { + Default::default() + } +} + #[cfg(test)] mod test { use super::{pallet, pallet_old, Runtime}; diff --git a/frame/support/test/tests/pallet_instance.rs b/frame/support/test/tests/pallet_instance.rs index 7fec0aa9d0e07..d71a35a42466f 100644 --- a/frame/support/test/tests/pallet_instance.rs +++ b/frame/support/test/tests/pallet_instance.rs @@ -348,6 +348,12 @@ frame_support::construct_runtime!( } ); +impl Runtime { + fn runtime_metadata() -> Vec { + Default::default() + } +} + use frame_support::weights::Weight; #[test] diff --git a/frame/support/test/tests/pallet_with_name_trait_is_valid.rs b/frame/support/test/tests/pallet_with_name_trait_is_valid.rs index 0066420566fe8..ff3f83072a4d7 100644 --- a/frame/support/test/tests/pallet_with_name_trait_is_valid.rs +++ b/frame/support/test/tests/pallet_with_name_trait_is_valid.rs @@ -124,6 +124,12 @@ mod tests { } ); + impl Runtime { + fn runtime_metadata() -> Vec { + Default::default() + } + } + impl frame_system::Config for Runtime { type BaseCallFilter = frame_support::traits::Everything; type RuntimeOrigin = RuntimeOrigin; From 3e9f5d45cfb2fb7d3e089dad16432c4ceafb62c4 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Fri, 3 Feb 2023 14:43:46 +0200 Subject: [PATCH 19/75] primitives/proc-macro: Fix warnings Signed-off-by: Alexandru Vasile --- primitives/api/proc-macro/src/runtime_metadata.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index f23f392921220..227168d89de12 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -20,11 +20,10 @@ use quote::quote; use syn::{parse_quote, ImplItemMethod, ItemImpl, ItemTrait, Path, Result}; use crate::{ - common::{CHANGED_IN_ATTRIBUTE, HIDDEN_INCLUDES_ID}, + common::CHANGED_IN_ATTRIBUTE, utils::{ - extract_impl_trait, filter_cfg_attributes, generate_crate_access, - generate_decl_docs_getter, generate_runtime_mod_name_for_trait, get_doc_literals, - RequireQualifiedTraitPath, + extract_impl_trait, filter_cfg_attributes, generate_decl_docs_getter, + generate_runtime_mod_name_for_trait, get_doc_literals, RequireQualifiedTraitPath, }, }; From 417fb8d4c47e5bb155eef22664421828e43b86a2 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Fri, 3 Feb 2023 16:29:05 +0200 Subject: [PATCH 20/75] primitives/proc-macro: Add no-docs flag Signed-off-by: Alexandru Vasile --- primitives/api/Cargo.toml | 2 ++ .../api/proc-macro/src/runtime_metadata.rs | 26 +++++++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/primitives/api/Cargo.toml b/primitives/api/Cargo.toml index 96e847fc695f6..fa33843f74078 100644 --- a/primitives/api/Cargo.toml +++ b/primitives/api/Cargo.toml @@ -55,3 +55,5 @@ std = [ # # This sets the max logging level to `off` for `log`. disable-logging = ["log/max_level_off"] +# Do not report the documentation in the metadata. +no-metadata-docs = [] \ No newline at end of file diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index 227168d89de12..94d3ee7127f6a 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -32,9 +32,13 @@ use crate::{ /// The documentation is exposed for the runtime API metadata. /// /// This method exposes the following functions for the latest trait version: -/// - `[TRAIT_NAME]_decl_runtime_docs`: Extract trait documentation +/// - `trait_[TRAIT_NAME]_decl_runtime_docs`: Extract trait documentation /// - `[METHOD_NAME]_decl_runtime_docs`: One function for each method to extract its documentation pub fn generate_decl_docs(decl: &ItemTrait, crate_: &TokenStream) -> TokenStream { + if cfg!(feature = "no-metadata-docs") { + return quote!() + } + let mut methods = Vec::new(); for item in &decl.items { @@ -114,8 +118,14 @@ fn generate_method_metadata( // String method name including quotes for constructing `v15::MethodMetadata`. let method_name = format!("{}", signature.ident); - // Function getter for the documentation. - let doc_getter = generate_decl_docs_getter(&signature.ident, false); + let docs = if cfg!(feature = "no-metadata-docs") { + quote!(crate_::vec![]) + } else { + // Function getter for the documentation. + let doc_getter = generate_decl_docs_getter(&signature.ident, false); + quote!(#hidden_mod::#doc_getter()) + }; + let attrs = filter_cfg_attributes(&method.attrs); Ok(quote!( @@ -124,7 +134,7 @@ fn generate_method_metadata( name: #method_name, inputs: #crate_::vec![ #( #inputs, )* ], output: #output, - docs: #hidden_mod::#doc_getter(), + docs: #docs, } )) } @@ -153,6 +163,12 @@ fn generate_trait_metadata(impl_: &ItemImpl, crate_: &TokenStream) -> Result Result Date: Fri, 3 Feb 2023 16:29:24 +0200 Subject: [PATCH 21/75] frame: Adjust more tests Signed-off-by: Alexandru Vasile --- bin/node-template/pallets/template/src/mock.rs | 6 ++++++ frame/alliance/src/mock.rs | 6 ++++++ frame/assets/src/mock.rs | 6 ++++++ frame/atomic-swap/src/tests.rs | 6 ++++++ frame/aura/src/mock.rs | 6 ++++++ frame/authorship/src/lib.rs | 6 ++++++ frame/babe/src/mock.rs | 6 ++++++ frame/balances/src/tests_composite.rs | 6 ++++++ frame/balances/src/tests_local.rs | 6 ++++++ frame/balances/src/tests_reentrancy.rs | 6 ++++++ frame/benchmarking/pov/src/tests.rs | 5 +++++ frame/bounties/src/tests.rs | 6 ++++++ frame/child-bounties/src/tests.rs | 6 ++++++ frame/collective/src/tests.rs | 6 ++++++ frame/conviction-voting/src/tests.rs | 6 ++++++ frame/democracy/src/tests.rs | 8 +++++++- frame/election-provider-multi-phase/src/mock.rs | 6 ++++++ frame/election-provider-support/src/onchain.rs | 6 ++++++ frame/examples/basic/src/tests.rs | 6 ++++++ frame/executive/src/lib.rs | 6 ++++++ frame/grandpa/src/mock.rs | 6 ++++++ frame/identity/src/tests.rs | 6 ++++++ frame/indices/src/mock.rs | 6 ++++++ frame/membership/src/lib.rs | 6 ++++++ frame/merkle-mountain-range/src/mock.rs | 6 ++++++ frame/message-queue/src/integration_test.rs | 6 ++++++ frame/message-queue/src/mock.rs | 7 +++++++ frame/multisig/src/tests.rs | 6 ++++++ frame/nfts/src/mock.rs | 6 ++++++ frame/nicks/src/lib.rs | 6 ++++++ frame/nis/src/mock.rs | 6 ++++++ frame/node-authorization/src/mock.rs | 6 ++++++ frame/nomination-pools/test-staking/src/mock.rs | 6 ++++++ frame/offences/src/mock.rs | 6 ++++++ frame/preimage/src/mock.rs | 6 ++++++ frame/proxy/src/tests.rs | 6 ++++++ frame/randomness-collective-flip/src/lib.rs | 6 ++++++ frame/ranked-collective/src/tests.rs | 6 ++++++ frame/recovery/src/mock.rs | 6 ++++++ frame/referenda/src/mock.rs | 6 ++++++ frame/remark/src/mock.rs | 6 ++++++ frame/root-offences/src/mock.rs | 6 ++++++ frame/scored-pool/src/mock.rs | 6 ++++++ frame/session/src/mock.rs | 6 ++++++ frame/society/src/mock.rs | 6 ++++++ frame/state-trie-migration/src/lib.rs | 6 ++++++ frame/sudo/src/mock.rs | 6 ++++++ frame/support/test/tests/origin.rs | 6 ++++++ frame/support/test/tests/pallet.rs | 6 ++++++ frame/support/test/tests/storage_layers.rs | 6 ++++++ frame/system/benchmarking/src/mock.rs | 5 +++++ frame/system/src/mock.rs | 6 ++++++ frame/timestamp/src/mock.rs | 6 ++++++ frame/tips/src/tests.rs | 6 ++++++ frame/transaction-payment/asset-tx-payment/src/mock.rs | 6 ++++++ frame/transaction-payment/src/mock.rs | 6 ++++++ frame/transaction-storage/src/mock.rs | 6 ++++++ frame/treasury/src/tests.rs | 6 ++++++ frame/uniques/src/mock.rs | 6 ++++++ frame/utility/src/tests.rs | 6 ++++++ frame/vesting/src/mock.rs | 6 ++++++ frame/whitelist/src/mock.rs | 6 ++++++ 62 files changed, 372 insertions(+), 1 deletion(-) diff --git a/bin/node-template/pallets/template/src/mock.rs b/bin/node-template/pallets/template/src/mock.rs index 91a1bf6ed5fc8..afa79b8298974 100644 --- a/bin/node-template/pallets/template/src/mock.rs +++ b/bin/node-template/pallets/template/src/mock.rs @@ -21,6 +21,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/alliance/src/mock.rs b/frame/alliance/src/mock.rs index e708d29d529fe..772858153cb04 100644 --- a/frame/alliance/src/mock.rs +++ b/frame/alliance/src/mock.rs @@ -246,6 +246,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + pub fn new_test_ext() -> sp_io::TestExternalities { let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); diff --git a/frame/assets/src/mock.rs b/frame/assets/src/mock.rs index 93a87ee6714c6..82af1585837fb 100644 --- a/frame/assets/src/mock.rs +++ b/frame/assets/src/mock.rs @@ -47,6 +47,12 @@ construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + type AccountId = u64; type AssetId = u32; diff --git a/frame/atomic-swap/src/tests.rs b/frame/atomic-swap/src/tests.rs index 081a449ec9a2e..67513e2a973c1 100644 --- a/frame/atomic-swap/src/tests.rs +++ b/frame/atomic-swap/src/tests.rs @@ -25,6 +25,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/aura/src/mock.rs b/frame/aura/src/mock.rs index 7a07fe99ae25d..d67842483d512 100644 --- a/frame/aura/src/mock.rs +++ b/frame/aura/src/mock.rs @@ -46,6 +46,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/authorship/src/lib.rs b/frame/authorship/src/lib.rs index b5568a6acf77c..4b629233676a1 100644 --- a/frame/authorship/src/lib.rs +++ b/frame/authorship/src/lib.rs @@ -123,6 +123,12 @@ mod tests { } ); + impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } + } + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/babe/src/mock.rs b/frame/babe/src/mock.rs index b09dc29f6d60a..b358625225283 100644 --- a/frame/babe/src/mock.rs +++ b/frame/babe/src/mock.rs @@ -64,6 +64,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/balances/src/tests_composite.rs b/frame/balances/src/tests_composite.rs index f8a8fdd1851d4..a7a976327e9e7 100644 --- a/frame/balances/src/tests_composite.rs +++ b/frame/balances/src/tests_composite.rs @@ -45,6 +45,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + parameter_types! { pub BlockWeights: frame_system::limits::BlockWeights = frame_system::limits::BlockWeights::simple_max( diff --git a/frame/balances/src/tests_local.rs b/frame/balances/src/tests_local.rs index 152a5da37410f..8f9d9e2ab2dd4 100644 --- a/frame/balances/src/tests_local.rs +++ b/frame/balances/src/tests_local.rs @@ -46,6 +46,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + parameter_types! { pub BlockWeights: frame_system::limits::BlockWeights = frame_system::limits::BlockWeights::simple_max( diff --git a/frame/balances/src/tests_reentrancy.rs b/frame/balances/src/tests_reentrancy.rs index 90363140000e8..3192ee3162423 100644 --- a/frame/balances/src/tests_reentrancy.rs +++ b/frame/balances/src/tests_reentrancy.rs @@ -49,6 +49,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + parameter_types! { pub BlockWeights: frame_system::limits::BlockWeights = frame_system::limits::BlockWeights::simple_max( diff --git a/frame/benchmarking/pov/src/tests.rs b/frame/benchmarking/pov/src/tests.rs index 1100fdc46f813..1a8346ec5e0b4 100644 --- a/frame/benchmarking/pov/src/tests.rs +++ b/frame/benchmarking/pov/src/tests.rs @@ -178,6 +178,11 @@ mod mock { } ); + impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } + } impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/bounties/src/tests.rs b/frame/bounties/src/tests.rs index bc59e3a70fd82..254697cc9b54f 100644 --- a/frame/bounties/src/tests.rs +++ b/frame/bounties/src/tests.rs @@ -57,6 +57,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + parameter_types! { pub const AvailableBlockRatio: Perbill = Perbill::one(); } diff --git a/frame/child-bounties/src/tests.rs b/frame/child-bounties/src/tests.rs index f3415c69df611..b599248a2e4da 100644 --- a/frame/child-bounties/src/tests.rs +++ b/frame/child-bounties/src/tests.rs @@ -58,6 +58,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + parameter_types! { pub const MaximumBlockWeight: Weight = Weight::from_ref_time(1024); pub const MaximumBlockLength: u32 = 2 * 1024; diff --git a/frame/collective/src/tests.rs b/frame/collective/src/tests.rs index 5c90de9f91bf7..77bb9fe5c4b85 100644 --- a/frame/collective/src/tests.rs +++ b/frame/collective/src/tests.rs @@ -49,6 +49,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + mod mock_democracy { pub use pallet::*; #[frame_support::pallet] diff --git a/frame/conviction-voting/src/tests.rs b/frame/conviction-voting/src/tests.rs index 9caa451e0dae8..8013a0810329d 100644 --- a/frame/conviction-voting/src/tests.rs +++ b/frame/conviction-voting/src/tests.rs @@ -47,6 +47,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + // Test that a fitlered call can be dispatched. pub struct BaseFilter; impl Contains for BaseFilter { diff --git a/frame/democracy/src/tests.rs b/frame/democracy/src/tests.rs index 41b279035028e..43608de514f0a 100644 --- a/frame/democracy/src/tests.rs +++ b/frame/democracy/src/tests.rs @@ -67,7 +67,13 @@ frame_support::construct_runtime!( } ); -// Test that a fitlered call can be dispatched. +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + +// Test that a filtered call can be dispatched. pub struct BaseFilter; impl Contains for BaseFilter { fn contains(call: &RuntimeCall) -> bool { diff --git a/frame/election-provider-multi-phase/src/mock.rs b/frame/election-provider-multi-phase/src/mock.rs index 347a4f19185f9..65879d20a6388 100644 --- a/frame/election-provider-multi-phase/src/mock.rs +++ b/frame/election-provider-multi-phase/src/mock.rs @@ -65,6 +65,12 @@ frame_support::construct_runtime!( } ); +impl Runtime { + fn runtime_metadata() -> Vec { + Default::default() + } +} + pub(crate) type Balance = u64; pub(crate) type AccountId = u64; pub(crate) type BlockNumber = u64; diff --git a/frame/election-provider-support/src/onchain.rs b/frame/election-provider-support/src/onchain.rs index 483c402fe249c..4de133c9ad25c 100644 --- a/frame/election-provider-support/src/onchain.rs +++ b/frame/election-provider-support/src/onchain.rs @@ -206,6 +206,12 @@ mod tests { } ); + impl Runtime { + fn runtime_metadata() -> Vec { + Default::default() + } + } + impl frame_system::Config for Runtime { type SS58Prefix = (); type BaseCallFilter = frame_support::traits::Everything; diff --git a/frame/examples/basic/src/tests.rs b/frame/examples/basic/src/tests.rs index 891c7c78628a1..0e04e2697a57e 100644 --- a/frame/examples/basic/src/tests.rs +++ b/frame/examples/basic/src/tests.rs @@ -50,6 +50,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/executive/src/lib.rs b/frame/executive/src/lib.rs index b454d1e276cc8..11caf8a8ca9e8 100644 --- a/frame/executive/src/lib.rs +++ b/frame/executive/src/lib.rs @@ -850,6 +850,12 @@ mod tests { } ); + impl Runtime { + fn runtime_metadata() -> Vec { + Default::default() + } + } + parameter_types! { pub BlockWeights: frame_system::limits::BlockWeights = frame_system::limits::BlockWeights::builder() diff --git a/frame/grandpa/src/mock.rs b/frame/grandpa/src/mock.rs index 7d54966a498a6..31dad57b4b4ae 100644 --- a/frame/grandpa/src/mock.rs +++ b/frame/grandpa/src/mock.rs @@ -63,6 +63,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl_opaque_keys! { pub struct TestSessionKeys { pub grandpa_authority: super::Pallet, diff --git a/frame/identity/src/tests.rs b/frame/identity/src/tests.rs index baca70e2795fc..790f7811af173 100644 --- a/frame/identity/src/tests.rs +++ b/frame/identity/src/tests.rs @@ -48,6 +48,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/indices/src/mock.rs b/frame/indices/src/mock.rs index 6b5373bb43b5a..4cff4afa20708 100644 --- a/frame/indices/src/mock.rs +++ b/frame/indices/src/mock.rs @@ -39,6 +39,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/membership/src/lib.rs b/frame/membership/src/lib.rs index 8b39a08ce6699..7cfbcb4333586 100644 --- a/frame/membership/src/lib.rs +++ b/frame/membership/src/lib.rs @@ -555,6 +555,12 @@ mod tests { } ); + impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } + } + parameter_types! { pub static Members: Vec = vec![]; pub static Prime: Option = None; diff --git a/frame/merkle-mountain-range/src/mock.rs b/frame/merkle-mountain-range/src/mock.rs index 3fd44275857c1..1f57a3113ad25 100644 --- a/frame/merkle-mountain-range/src/mock.rs +++ b/frame/merkle-mountain-range/src/mock.rs @@ -44,6 +44,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type RuntimeOrigin = RuntimeOrigin; diff --git a/frame/message-queue/src/integration_test.rs b/frame/message-queue/src/integration_test.rs index c9e3b2e870fd8..3720451da027d 100644 --- a/frame/message-queue/src/integration_test.rs +++ b/frame/message-queue/src/integration_test.rs @@ -54,6 +54,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/message-queue/src/mock.rs b/frame/message-queue/src/mock.rs index 37e504ac50033..b0af0a927195a 100644 --- a/frame/message-queue/src/mock.rs +++ b/frame/message-queue/src/mock.rs @@ -47,6 +47,13 @@ frame_support::construct_runtime!( MessageQueue: pallet_message_queue::{Pallet, Call, Storage, Event}, } ); + +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/multisig/src/tests.rs b/frame/multisig/src/tests.rs index 13493587caa2b..f449363f492e3 100644 --- a/frame/multisig/src/tests.rs +++ b/frame/multisig/src/tests.rs @@ -47,6 +47,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = TestBaseCallFilter; type BlockWeights = (); diff --git a/frame/nfts/src/mock.rs b/frame/nfts/src/mock.rs index f814b209d5f78..269af89b9598f 100644 --- a/frame/nfts/src/mock.rs +++ b/frame/nfts/src/mock.rs @@ -45,6 +45,12 @@ construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/nicks/src/lib.rs b/frame/nicks/src/lib.rs index 3d8307c434107..b7735195b944e 100644 --- a/frame/nicks/src/lib.rs +++ b/frame/nicks/src/lib.rs @@ -275,6 +275,12 @@ mod tests { } ); + impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } + } + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/nis/src/mock.rs b/frame/nis/src/mock.rs index 585ed2d8b278f..9c8ea5503a247 100644 --- a/frame/nis/src/mock.rs +++ b/frame/nis/src/mock.rs @@ -49,6 +49,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/node-authorization/src/mock.rs b/frame/node-authorization/src/mock.rs index fcf7ff0189332..a122bc6fcd0bc 100644 --- a/frame/node-authorization/src/mock.rs +++ b/frame/node-authorization/src/mock.rs @@ -47,6 +47,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type DbWeight = (); diff --git a/frame/nomination-pools/test-staking/src/mock.rs b/frame/nomination-pools/test-staking/src/mock.rs index c67aec0134b07..0f1f5064b691d 100644 --- a/frame/nomination-pools/test-staking/src/mock.rs +++ b/frame/nomination-pools/test-staking/src/mock.rs @@ -200,6 +200,12 @@ frame_support::construct_runtime!( } ); +impl Runtime { + fn runtime_metadata() -> Vec { + Default::default() + } +} + pub fn new_test_ext() -> sp_io::TestExternalities { sp_tracing::try_init_simple(); let mut storage = frame_system::GenesisConfig::default().build_storage::().unwrap(); diff --git a/frame/offences/src/mock.rs b/frame/offences/src/mock.rs index 63d2b0de34780..0df275c1618ef 100644 --- a/frame/offences/src/mock.rs +++ b/frame/offences/src/mock.rs @@ -80,6 +80,12 @@ frame_support::construct_runtime!( } ); +impl Runtime { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Runtime { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/preimage/src/mock.rs b/frame/preimage/src/mock.rs index d81f5a9c3232c..b0d1f665bf475 100644 --- a/frame/preimage/src/mock.rs +++ b/frame/preimage/src/mock.rs @@ -47,6 +47,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = Everything; type BlockWeights = (); diff --git a/frame/proxy/src/tests.rs b/frame/proxy/src/tests.rs index 0e7db3512f15b..8a0cffb73576b 100644 --- a/frame/proxy/src/tests.rs +++ b/frame/proxy/src/tests.rs @@ -51,6 +51,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = BaseFilter; type BlockWeights = (); diff --git a/frame/randomness-collective-flip/src/lib.rs b/frame/randomness-collective-flip/src/lib.rs index d92b053655dc9..1d10521702c59 100644 --- a/frame/randomness-collective-flip/src/lib.rs +++ b/frame/randomness-collective-flip/src/lib.rs @@ -185,6 +185,12 @@ mod tests { } ); + impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } + } + parameter_types! { pub BlockLength: limits::BlockLength = limits::BlockLength ::max(2 * 1024); diff --git a/frame/ranked-collective/src/tests.rs b/frame/ranked-collective/src/tests.rs index c11d4877d3577..3c26d42c8283e 100644 --- a/frame/ranked-collective/src/tests.rs +++ b/frame/ranked-collective/src/tests.rs @@ -48,6 +48,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = Everything; type BlockWeights = (); diff --git a/frame/recovery/src/mock.rs b/frame/recovery/src/mock.rs index 05ca8e6a30a0e..e814935fd1faf 100644 --- a/frame/recovery/src/mock.rs +++ b/frame/recovery/src/mock.rs @@ -45,6 +45,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/referenda/src/mock.rs b/frame/referenda/src/mock.rs index 82ae508d52b6f..5751537ee4fb5 100644 --- a/frame/referenda/src/mock.rs +++ b/frame/referenda/src/mock.rs @@ -53,6 +53,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + // Test that a fitlered call can be dispatched. pub struct BaseFilter; impl Contains for BaseFilter { diff --git a/frame/remark/src/mock.rs b/frame/remark/src/mock.rs index 22467796cf37b..07e99451ab27c 100644 --- a/frame/remark/src/mock.rs +++ b/frame/remark/src/mock.rs @@ -41,6 +41,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/root-offences/src/mock.rs b/frame/root-offences/src/mock.rs index 273fbf614169d..61f15cbf48f8b 100644 --- a/frame/root-offences/src/mock.rs +++ b/frame/root-offences/src/mock.rs @@ -58,6 +58,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + /// Another session handler struct to test on_disabled. pub struct OtherSessionHandler; impl OneSessionHandler for OtherSessionHandler { diff --git a/frame/scored-pool/src/mock.rs b/frame/scored-pool/src/mock.rs index 951871dd83c5c..17996d92a7333 100644 --- a/frame/scored-pool/src/mock.rs +++ b/frame/scored-pool/src/mock.rs @@ -46,6 +46,12 @@ construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + parameter_types! { pub const CandidateDeposit: u64 = 25; } diff --git a/frame/session/src/mock.rs b/frame/session/src/mock.rs index 1138bd9543989..dd26d2bc71efa 100644 --- a/frame/session/src/mock.rs +++ b/frame/session/src/mock.rs @@ -103,6 +103,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + parameter_types! { pub static Validators: Vec = vec![1, 2, 3]; pub static NextValidators: Vec = vec![1, 2, 3]; diff --git a/frame/society/src/mock.rs b/frame/society/src/mock.rs index 24544bf9e82dd..b4b2a3fe3be0d 100644 --- a/frame/society/src/mock.rs +++ b/frame/society/src/mock.rs @@ -47,6 +47,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + parameter_types! { pub const SocietyPalletId: PalletId = PalletId(*b"py/socie"); } diff --git a/frame/state-trie-migration/src/lib.rs b/frame/state-trie-migration/src/lib.rs index 23f73bb56b173..8457f5afaf947 100644 --- a/frame/state-trie-migration/src/lib.rs +++ b/frame/state-trie-migration/src/lib.rs @@ -1082,6 +1082,12 @@ mod mock { } ); + impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } + } + parameter_types! { pub const SS58Prefix: u8 = 42; } diff --git a/frame/sudo/src/mock.rs b/frame/sudo/src/mock.rs index f8a03836f8f0f..897ffe00a9200 100644 --- a/frame/sudo/src/mock.rs +++ b/frame/sudo/src/mock.rs @@ -106,6 +106,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + pub struct BlockEverything; impl Contains for BlockEverything { fn contains(_: &RuntimeCall) -> bool { diff --git a/frame/support/test/tests/origin.rs b/frame/support/test/tests/origin.rs index f794cd8be1ce0..31cb35ebcb1b5 100644 --- a/frame/support/test/tests/origin.rs +++ b/frame/support/test/tests/origin.rs @@ -167,6 +167,12 @@ frame_support::construct_runtime!( } ); +impl RuntimeOriginTest { + fn runtime_metadata() -> Vec { + Default::default() + } +} + pub type Signature = sr25519::Signature; pub type BlockNumber = u64; pub type Header = generic::Header; diff --git a/frame/support/test/tests/pallet.rs b/frame/support/test/tests/pallet.rs index f050b23514eb1..27b817dba8733 100644 --- a/frame/support/test/tests/pallet.rs +++ b/frame/support/test/tests/pallet.rs @@ -668,6 +668,12 @@ frame_support::construct_runtime!( } ); +impl Runtime { + fn runtime_metadata() -> Vec { + Default::default() + } +} + // Test that the part `RuntimeCall` is excluded from Example2 and included in Example4. fn _ensure_call_is_correctly_excluded_and_included(call: RuntimeCall) { match call { diff --git a/frame/support/test/tests/storage_layers.rs b/frame/support/test/tests/storage_layers.rs index cff81c0bea2ed..a1c274a78f08f 100644 --- a/frame/support/test/tests/storage_layers.rs +++ b/frame/support/test/tests/storage_layers.rs @@ -125,6 +125,12 @@ frame_support::construct_runtime!( } ); +impl Runtime { + fn runtime_metadata() -> Vec { + Default::default() + } +} + #[test] fn storage_layer_basic_commit() { TestExternalities::default().execute_with(|| { diff --git a/frame/system/benchmarking/src/mock.rs b/frame/system/benchmarking/src/mock.rs index a7f28ca30fe87..e633e4d75e097 100644 --- a/frame/system/benchmarking/src/mock.rs +++ b/frame/system/benchmarking/src/mock.rs @@ -37,6 +37,11 @@ frame_support::construct_runtime!( System: frame_system::{Pallet, Call, Config, Storage, Event}, } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; diff --git a/frame/system/src/mock.rs b/frame/system/src/mock.rs index fb230f66a94f7..f44a0c8e5ecfd 100644 --- a/frame/system/src/mock.rs +++ b/frame/system/src/mock.rs @@ -40,6 +40,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); const MAX_BLOCK_WEIGHT: Weight = Weight::from_ref_time(1024).set_proof_size(u64::MAX); diff --git a/frame/timestamp/src/mock.rs b/frame/timestamp/src/mock.rs index e1ba5cd11e615..4485e7ec531ca 100644 --- a/frame/timestamp/src/mock.rs +++ b/frame/timestamp/src/mock.rs @@ -46,6 +46,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/tips/src/tests.rs b/frame/tips/src/tests.rs index cb0b4458c7fba..6b3f1bd48bd92 100644 --- a/frame/tips/src/tests.rs +++ b/frame/tips/src/tests.rs @@ -57,6 +57,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + parameter_types! { pub const AvailableBlockRatio: Perbill = Perbill::one(); } diff --git a/frame/transaction-payment/asset-tx-payment/src/mock.rs b/frame/transaction-payment/asset-tx-payment/src/mock.rs index 60fb2e6c5e03e..b828c2661c816 100644 --- a/frame/transaction-payment/asset-tx-payment/src/mock.rs +++ b/frame/transaction-payment/asset-tx-payment/src/mock.rs @@ -54,6 +54,12 @@ frame_support::construct_runtime!( } ); +impl Runtime { + fn runtime_metadata() -> Vec { + Default::default() + } +} + parameter_types! { pub(crate) static ExtrinsicBaseWeight: Weight = Weight::zero(); } diff --git a/frame/transaction-payment/src/mock.rs b/frame/transaction-payment/src/mock.rs index e214458b3766e..d8bb57d176301 100644 --- a/frame/transaction-payment/src/mock.rs +++ b/frame/transaction-payment/src/mock.rs @@ -48,6 +48,12 @@ frame_support::construct_runtime!( } ); +impl Runtime { + fn runtime_metadata() -> Vec { + Default::default() + } +} + pub(crate) const CALL: &::RuntimeCall = &RuntimeCall::Balances(BalancesCall::transfer { dest: 2, value: 69 }); diff --git a/frame/transaction-storage/src/mock.rs b/frame/transaction-storage/src/mock.rs index 8764b16c31d8d..942db64f416db 100644 --- a/frame/transaction-storage/src/mock.rs +++ b/frame/transaction-storage/src/mock.rs @@ -47,6 +47,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/treasury/src/tests.rs b/frame/treasury/src/tests.rs index e6a1ea0f543fe..4456b66a37fe2 100644 --- a/frame/treasury/src/tests.rs +++ b/frame/treasury/src/tests.rs @@ -51,6 +51,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/uniques/src/mock.rs b/frame/uniques/src/mock.rs index d6ed5cc5cc23e..810062745ff02 100644 --- a/frame/uniques/src/mock.rs +++ b/frame/uniques/src/mock.rs @@ -45,6 +45,12 @@ construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/utility/src/tests.rs b/frame/utility/src/tests.rs index f9d6a16c1a0d4..26959f47a2ac5 100644 --- a/frame/utility/src/tests.rs +++ b/frame/utility/src/tests.rs @@ -145,6 +145,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + parameter_types! { pub BlockWeights: frame_system::limits::BlockWeights = frame_system::limits::BlockWeights::simple_max(Weight::MAX); diff --git a/frame/vesting/src/mock.rs b/frame/vesting/src/mock.rs index da9490bea66c0..af9b21dda4504 100644 --- a/frame/vesting/src/mock.rs +++ b/frame/vesting/src/mock.rs @@ -43,6 +43,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; type AccountId = u64; diff --git a/frame/whitelist/src/mock.rs b/frame/whitelist/src/mock.rs index e08c2875aec51..0104b3e960fa3 100644 --- a/frame/whitelist/src/mock.rs +++ b/frame/whitelist/src/mock.rs @@ -49,6 +49,12 @@ construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = Nothing; type BlockWeights = (); From 3bf46aa20f1e71cd67b51b6bab2bf61759410104 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Fri, 3 Feb 2023 17:21:28 +0200 Subject: [PATCH 22/75] frame/tests: Check runtime metadata correctness Signed-off-by: Alexandru Vasile --- Cargo.lock | 1 + frame/support/test/Cargo.toml | 2 + frame/support/test/tests/runtime_metadata.rs | 210 +++++++++++++++++++ 3 files changed, 213 insertions(+) create mode 100644 frame/support/test/tests/runtime_metadata.rs diff --git a/Cargo.lock b/Cargo.lock index 1dcc15b730410..da48849888979 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2420,6 +2420,7 @@ dependencies = [ "rustversion", "scale-info", "serde", + "sp-api", "sp-arithmetic", "sp-core", "sp-io", diff --git a/frame/support/test/Cargo.toml b/frame/support/test/Cargo.toml index 90ef243eed6c6..ad4589c734fde 100644 --- a/frame/support/test/Cargo.toml +++ b/frame/support/test/Cargo.toml @@ -15,6 +15,7 @@ targets = ["x86_64-unknown-linux-gnu"] serde = { version = "1.0.136", default-features = false, features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.2.2", default-features = false, features = ["derive"] } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } +sp-api = { version = "4.0.0-dev", default-features = false, path = "../../../primitives/api" } sp-arithmetic = { version = "6.0.0", default-features = false, path = "../../../primitives/arithmetic" } sp-io = { version = "7.0.0", path = "../../../primitives/io", default-features = false } sp-state-machine = { version = "0.13.0", optional = true, path = "../../../primitives/state-machine" } @@ -47,6 +48,7 @@ std = [ "sp-state-machine", "sp-arithmetic/std", "sp-version/std", + "sp-api/std", ] try-runtime = ["frame-support/try-runtime"] # WARNING: diff --git a/frame/support/test/tests/runtime_metadata.rs b/frame/support/test/tests/runtime_metadata.rs new file mode 100644 index 0000000000000..d477a39de2e76 --- /dev/null +++ b/frame/support/test/tests/runtime_metadata.rs @@ -0,0 +1,210 @@ +// This file is part of Substrate. + +// Copyright (C) 2020-2022 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. + +use frame_support::{metadata::*, traits::ConstU32}; +use scale_info::{form::MetaForm, meta_type}; +use sp_runtime::traits::Block as BlockT; + +pub type BlockNumber = u64; +pub type Index = u64; +pub type Header = sp_runtime::generic::Header; +pub type Block = sp_runtime::generic::Block; +pub type UncheckedExtrinsic = sp_runtime::generic::UncheckedExtrinsic; + +impl frame_system::Config for Runtime { + type BlockWeights = (); + type BlockLength = (); + type DbWeight = (); + type BaseCallFilter = frame_support::traits::Everything; + type RuntimeOrigin = RuntimeOrigin; + type Index = u64; + type BlockNumber = u32; + type RuntimeCall = RuntimeCall; + type Hash = sp_runtime::testing::H256; + type Hashing = sp_runtime::traits::BlakeTwo256; + type AccountId = u64; + type Lookup = sp_runtime::traits::IdentityLookup; + type Header = Header; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = ConstU32<250>; + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = (); + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = ConstU32<16>; +} + +frame_support::construct_runtime!( + pub enum Runtime where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic + { + System: frame_system, + } +); + +sp_api::decl_runtime_apis! { + /// ApiWithCustomVersion trait documentation + /// + /// Documentation on multiline. + pub trait Api { + fn test(data: u64); + /// something_with_block. + fn something_with_block(block: Block) -> Block; + fn function_with_two_args(data: u64, block: Block); + fn same_name(); + fn wild_card(_: u32); + } +} + +sp_api::impl_runtime_apis! { + impl self::Api for Runtime { + fn test(_data: u64) { + unimplemented!() + } + + fn something_with_block(_: Block) -> Block { + unimplemented!() + } + + fn function_with_two_args(_: u64, _: Block) { + unimplemented!() + } + + fn same_name() {} + + fn wild_card(_: u32) {} + } + + impl sp_api::Core for Runtime { + fn version() -> sp_version::RuntimeVersion { + unimplemented!() + } + fn execute_block(_: Block) { + unimplemented!() + } + fn initialize_block(_: &::Header) { + unimplemented!() + } + } +} + +#[test] +fn runtime_metadata() { + fn maybe_docs(doc: Vec<&'static str>) -> Vec<&'static str> { + if cfg!(feature = "no-metadata-docs") { + vec![] + } else { + doc + } + } + + let expected_runtime_metadata = vec![ + v15::TraitMetadata { + name: "Api", + methods: vec![ + v15::MethodMetadata { + name: "test", + inputs: vec![v15::ParamMetadata:: { + name: "_data", + ty: meta_type::(), + }], + output: meta_type::<()>(), + docs: vec![], + }, + v15::MethodMetadata { + name: "something_with_block", + inputs: vec![v15::ParamMetadata:: { + name: "_", + ty: meta_type::(), + }], + output: meta_type::(), + docs: maybe_docs(vec![" something_with_block."]), + }, + v15::MethodMetadata { + name: "function_with_two_args", + inputs: vec![ + v15::ParamMetadata:: { name: "_", ty: meta_type::() }, + v15::ParamMetadata:: { name: "_", ty: meta_type::() }, + ], + output: meta_type::<()>(), + docs: vec![], + }, + v15::MethodMetadata { + name: "same_name", + inputs: vec![], + output: meta_type::<()>(), + docs: vec![], + }, + v15::MethodMetadata { + name: "wild_card", + inputs: vec![v15::ParamMetadata:: { + name: "_", + ty: meta_type::(), + }], + output: meta_type::<()>(), + docs: vec![], + }, + ], + docs: maybe_docs(vec![ + " ApiWithCustomVersion trait documentation", + "", + " Documentation on multiline.", + ]), + }, + v15::TraitMetadata { + name: "Core", + methods: vec![ + v15::MethodMetadata { + name: "version", + inputs: vec![], + output: meta_type::(), + docs: maybe_docs(vec![" Returns the version of the runtime."]), + }, + v15::MethodMetadata { + name: "execute_block", + inputs: vec![v15::ParamMetadata:: { + name: "_", + ty: meta_type::(), + }], + output: meta_type::<()>(), + docs: maybe_docs(vec![" Execute the given block."]), + }, + v15::MethodMetadata { + name: "initialize_block", + inputs: vec![v15::ParamMetadata:: { + name: "_", + ty: meta_type::<&::Header>(), + }], + output: meta_type::<()>(), + docs: maybe_docs(vec![" Initialize a block with the given header."]), + }, + ], + docs: maybe_docs(vec![ + " The `Core` runtime api that every Substrate runtime needs to implement.", + ]), + }, + ]; + + let runtime_metadata = Runtime::runtime_metadata(); + assert_eq!(runtime_metadata, expected_runtime_metadata); +} From ae85bbeca3ea1a4dc0ab12958fa903f8c07ba53e Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Fri, 3 Feb 2023 17:28:55 +0200 Subject: [PATCH 23/75] frame/benchmarking: Adjust benchmarks Signed-off-by: Alexandru Vasile --- frame/benchmarking/pov/src/benchmarking.rs | 6 ++++++ frame/benchmarking/src/baseline.rs | 6 ++++++ frame/system/benches/bench.rs | 6 ++++++ 3 files changed, 18 insertions(+) diff --git a/frame/benchmarking/pov/src/benchmarking.rs b/frame/benchmarking/pov/src/benchmarking.rs index 608077e2df806..9760501bdc6b5 100644 --- a/frame/benchmarking/pov/src/benchmarking.rs +++ b/frame/benchmarking/pov/src/benchmarking.rs @@ -334,6 +334,12 @@ mod mock { } ); + impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } + } + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/benchmarking/src/baseline.rs b/frame/benchmarking/src/baseline.rs index 0d511cbff4b86..9ee7078235c51 100644 --- a/frame/benchmarking/src/baseline.rs +++ b/frame/benchmarking/src/baseline.rs @@ -130,6 +130,12 @@ pub mod mock { } ); + impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } + } + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/system/benches/bench.rs b/frame/system/benches/bench.rs index f2acc319d3f5d..61c0be7793c2b 100644 --- a/frame/system/benches/bench.rs +++ b/frame/system/benches/bench.rs @@ -58,6 +58,12 @@ frame_support::construct_runtime!( } ); +impl Runtime { + fn runtime_metadata() -> Vec { + Default::default() + } +} + frame_support::parameter_types! { pub BlockLength: frame_system::limits::BlockLength = frame_system::limits::BlockLength::max_with_normal_ratio( From d37aa2205e80cceaa04e7f2971bb542d4ce8a6db Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Fri, 3 Feb 2023 16:39:20 +0000 Subject: [PATCH 24/75] frame/benchmarks: Adjust more benchmarks Signed-off-by: Alexandru Vasile --- frame/nomination-pools/benchmarking/src/mock.rs | 6 ++++++ frame/offences/benchmarking/src/mock.rs | 6 ++++++ frame/session/benchmarking/src/mock.rs | 6 ++++++ 3 files changed, 18 insertions(+) diff --git a/frame/nomination-pools/benchmarking/src/mock.rs b/frame/nomination-pools/benchmarking/src/mock.rs index 06a66838594c7..35315f4104f55 100644 --- a/frame/nomination-pools/benchmarking/src/mock.rs +++ b/frame/nomination-pools/benchmarking/src/mock.rs @@ -187,6 +187,12 @@ frame_support::construct_runtime!( } ); +impl Runtime { + fn runtime_metadata() -> Vec { + Default::default() + } +} + pub fn new_test_ext() -> sp_io::TestExternalities { let mut storage = frame_system::GenesisConfig::default().build_storage::().unwrap(); let _ = pallet_nomination_pools::GenesisConfig:: { diff --git a/frame/offences/benchmarking/src/mock.rs b/frame/offences/benchmarking/src/mock.rs index 592e821a81d8c..a6250ffa3b9af 100644 --- a/frame/offences/benchmarking/src/mock.rs +++ b/frame/offences/benchmarking/src/mock.rs @@ -231,6 +231,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + pub fn new_test_ext() -> sp_io::TestExternalities { let t = frame_system::GenesisConfig::default().build_storage::().unwrap(); sp_io::TestExternalities::new(t) diff --git a/frame/session/benchmarking/src/mock.rs b/frame/session/benchmarking/src/mock.rs index 0699640bc092a..3caf66864ed33 100644 --- a/frame/session/benchmarking/src/mock.rs +++ b/frame/session/benchmarking/src/mock.rs @@ -47,6 +47,12 @@ frame_support::construct_runtime!( } ); +impl Test { + fn runtime_metadata() -> Vec { + Default::default() + } +} + impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); From 0d09ae6d64fab3a629df859afe1265fcf3ab681c Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Fri, 3 Feb 2023 16:42:52 +0000 Subject: [PATCH 25/75] primitives/api: Fix clippy Signed-off-by: Alexandru Vasile --- primitives/api/proc-macro/src/runtime_metadata.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index 94d3ee7127f6a..46cdc04d570ce 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -50,11 +50,8 @@ pub fn generate_decl_docs(decl: &ItemTrait, crate_: &TokenStream) -> TokenStream let signature = &method.sig; let method_name = generate_decl_docs_getter(&signature.ident, false); - let is_changed_in = method - .attrs - .iter() - .find(|attr| attr.path.is_ident(CHANGED_IN_ATTRIBUTE)) - .is_some(); + let is_changed_in = + method.attrs.iter().any(|attr| attr.path.is_ident(CHANGED_IN_ATTRIBUTE)); // Report docs for the latest methods only. if is_changed_in { continue From e8969d6dcdd4860efee0d810ef86596293cf457e Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Tue, 7 Feb 2023 15:28:01 +0200 Subject: [PATCH 26/75] primitives/proc-macro: Generate runtime metadata on the `decl_runtime_apis` Signed-off-by: Alexandru Vasile --- .../api/proc-macro/src/decl_runtime_apis.rs | 6 +- .../api/proc-macro/src/impl_runtime_apis.rs | 4 +- .../api/proc-macro/src/runtime_metadata.rs | 294 ++++++++++-------- 3 files changed, 168 insertions(+), 136 deletions(-) diff --git a/primitives/api/proc-macro/src/decl_runtime_apis.rs b/primitives/api/proc-macro/src/decl_runtime_apis.rs index a01f8954ec47b..91b1d06da98f6 100644 --- a/primitives/api/proc-macro/src/decl_runtime_apis.rs +++ b/primitives/api/proc-macro/src/decl_runtime_apis.rs @@ -16,7 +16,7 @@ // limitations under the License. use crate::{ - runtime_metadata::generate_decl_docs, + runtime_metadata::generate_decl_runtime_metadata, utils::{ extract_parameter_names_types_and_borrows, fold_fn_decl_for_client_side, generate_crate_access, generate_hidden_includes, generate_runtime_mod_name_for_trait, @@ -220,10 +220,10 @@ fn generate_runtime_decls(decls: &[ItemTrait]) -> Result { let crate_ = generate_crate_access(HIDDEN_INCLUDES_ID); for decl in decls { - let runtime_docs = generate_decl_docs(&decl, &crate_); let mut decl = decl.clone(); let decl_span = decl.span(); extend_generics_with_block(&mut decl.generics); + let metadata = generate_decl_runtime_metadata(&decl, &crate_); let mod_name = generate_runtime_mod_name_for_trait(&decl.ident); let found_attributes = remove_supported_attributes(&mut decl.attrs); let api_version = @@ -309,7 +309,7 @@ fn generate_runtime_decls(decls: &[ItemTrait]) -> Result { pub use #versioned_ident as #main_api_ident; - #runtime_docs + #metadata pub #api_version diff --git a/primitives/api/proc-macro/src/impl_runtime_apis.rs b/primitives/api/proc-macro/src/impl_runtime_apis.rs index 1785d27f85281..9f88ab376934c 100644 --- a/primitives/api/proc-macro/src/impl_runtime_apis.rs +++ b/primitives/api/proc-macro/src/impl_runtime_apis.rs @@ -16,7 +16,7 @@ // limitations under the License. use crate::{ - runtime_metadata::generate_runtime_metadata, + runtime_metadata::generate_impl_runtime_metadata, utils::{ extract_all_signature_types, extract_block_type_from_trait_path, extract_impl_trait, extract_parameter_names_types_and_borrows, generate_crate_access, generate_hidden_includes, @@ -638,7 +638,7 @@ fn impl_runtime_apis_impl_inner(api_impls: &[ItemImpl]) -> Result { let wasm_interface = generate_wasm_interface(api_impls)?; let api_impls_for_runtime_api = generate_api_impl_for_runtime_api(api_impls)?; let crate_ = generate_crate_access(HIDDEN_INCLUDES_ID); - let runtime_metadata = generate_runtime_metadata(api_impls, &crate_)?; + let runtime_metadata = generate_impl_runtime_metadata(api_impls, &crate_)?; Ok(quote!( #hidden_includes diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index 46cdc04d570ce..f39515ec4b3ec 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -17,180 +17,176 @@ use proc_macro2::TokenStream; use quote::quote; -use syn::{parse_quote, ImplItemMethod, ItemImpl, ItemTrait, Path, Result}; +use syn::{parse_quote, ItemImpl, ItemTrait, Result}; use crate::{ common::CHANGED_IN_ATTRIBUTE, utils::{ - extract_impl_trait, filter_cfg_attributes, generate_decl_docs_getter, - generate_runtime_mod_name_for_trait, get_doc_literals, RequireQualifiedTraitPath, + extract_impl_trait, filter_cfg_attributes, generate_runtime_mod_name_for_trait, + get_doc_literals, RequireQualifiedTraitPath, }, }; -/// Generate documentation getters for `decl_runtime_api` macro. +/// Collect extra where bounds on the parameter type. /// -/// The documentation is exposed for the runtime API metadata. +/// `decl_runtime_apis` macro extends the generics of each trait by adding +/// the generic `Block: BlockT`. /// -/// This method exposes the following functions for the latest trait version: -/// - `trait_[TRAIT_NAME]_decl_runtime_docs`: Extract trait documentation -/// - `[METHOD_NAME]_decl_runtime_docs`: One function for each method to extract its documentation -pub fn generate_decl_docs(decl: &ItemTrait, crate_: &TokenStream) -> TokenStream { +/// If the generic `Block` is present on the parameter type, +/// then returns the type without any lifetimes or mutability. +/// Otherwise, returns `None`. +fn collect_where_bounds(ty: &syn::Type) -> Option { + let ty_string = format!("{}", quote!(#ty)); + if !ty_string.contains("Block") { + return None + } + + // Remove the lifetime and mutability of the type T to + // place bounds around it. + let ty_elem = match &ty { + syn::Type::Reference(reference) => &reference.elem, + syn::Type::Ptr(ptr) => &ptr.elem, + syn::Type::Slice(slice) => &slice.elem, + syn::Type::Array(arr) => &arr.elem, + _ => ty, + }; + + return Some(ty_elem.clone()) +} + +/// Extract the documentation from the provided attributes. +/// +/// It takes into account the `no-metadata-docs` feature. +fn collect_docs(attrs: &[syn::Attribute], crate_: &TokenStream) -> TokenStream { if cfg!(feature = "no-metadata-docs") { - return quote!() + quote!(#crate_::vec![]) + } else { + let docs = get_doc_literals(&attrs); + quote!(#crate_::vec![ #( #docs, )* ]) } +} +/// Generate the runtime metadata of the provided trait. +/// +/// The metadata is exposed as a generic function on the hidden module +/// of the trait generated by the `decl_runtime_apis`. +pub fn generate_decl_runtime_metadata(decl: &ItemTrait, crate_: &TokenStream) -> TokenStream { let mut methods = Vec::new(); + // Ensure that any function parameter that relies on the `BlockT` bounds + // also has `TypeInfo + 'static` bounds (required by `scale_info::meta_type`). + // + // For example, if a runtime API defines a method that has an input: + // `fn func(input: ::Header)` + // then the runtime metadata will imply `::Header: TypeInfo + 'static`. + // + // This restricts the bounds at the metadata level, without needing to modify the `BlockT` + // itself, since the concrete implementations are already satisfying `TypeInfo`. + let mut where_clause = Vec::new(); for item in &decl.items { // Collect metadata for methods only. let syn::TraitItem::Method(method) = item else { continue }; - let signature = &method.sig; - let method_name = generate_decl_docs_getter(&signature.ident, false); - + // Collect metadata only for the latest methods. let is_changed_in = method.attrs.iter().any(|attr| attr.path.is_ident(CHANGED_IN_ATTRIBUTE)); - // Report docs for the latest methods only. if is_changed_in { continue } - let attrs = filter_cfg_attributes(&method.attrs); - let docs = get_doc_literals(&method.attrs); - methods.push(quote!( - #( #attrs )* - pub fn #method_name() -> #crate_::vec::Vec<&'static str> { - #crate_::vec![ #( #docs, )* ] - } - )); - } - - let trait_name = generate_decl_docs_getter(&decl.ident, true); - let docs = get_doc_literals(&decl.attrs); - let attrs = filter_cfg_attributes(&decl.attrs); - - quote!( - #( #attrs )* - pub fn #trait_name() -> #crate_::vec::Vec<&'static str> { - #crate_::vec![ #( #docs, )* ] - } - - #( #methods )* - ) -} - -/// Generate the runtime metadata for a given method. -fn generate_method_metadata( - method: &ImplItemMethod, - crate_: &TokenStream, - hidden_mod: &Path, -) -> Result { - let signature = &method.sig; - let mut inputs = Vec::new(); - - for input in &signature.inputs { - let syn::FnArg::Typed(typed) = input else { - // Exclude `self` from metadata collection. - continue - }; - - let pat = &typed.pat; - let name = format!("{}", quote!(#pat)); - let ty = &typed.ty; - - inputs.push(quote!( + let mut inputs = Vec::new(); + let signature = &method.sig; + for input in &signature.inputs { + // Exclude `self` from metadata collection. + let syn::FnArg::Typed(typed) = input else { + continue + }; + + let pat = &typed.pat; + let name = format!("{}", quote!(#pat)); + let ty = &typed.ty; + collect_where_bounds(ty).map(|ty_elem| where_clause.push(ty_elem)); + + inputs.push(quote!( #crate_::metadata::v15::ParamMetadata { - name: #name, - ty: #crate_::scale_info::meta_type::<#ty>(), + name: #name, + ty: #crate_::scale_info::meta_type::<#ty>(), } - )); - } + )); + } - let output = match &signature.output { - syn::ReturnType::Default => quote!(#crate_::scale_info::meta_type::<()>()), - syn::ReturnType::Type(_, ty) => quote!(#crate_::scale_info::meta_type::<#ty>()), - }; + let output = match &signature.output { + syn::ReturnType::Default => quote!(#crate_::scale_info::meta_type::<()>()), + syn::ReturnType::Type(_, ty) => { + collect_where_bounds(ty).map(|ty_elem| where_clause.push(ty_elem)); + quote!(#crate_::scale_info::meta_type::<#ty>()) + }, + }; - // String method name including quotes for constructing `v15::MethodMetadata`. - let method_name = format!("{}", signature.ident); - let docs = if cfg!(feature = "no-metadata-docs") { - quote!(crate_::vec![]) - } else { - // Function getter for the documentation. - let doc_getter = generate_decl_docs_getter(&signature.ident, false); - quote!(#hidden_mod::#doc_getter()) - }; - - let attrs = filter_cfg_attributes(&method.attrs); + // String method name including quotes for constructing `v15::MethodMetadata`. + let method_name = format!("{}", signature.ident); + let docs = collect_docs(&method.attrs, &crate_); - Ok(quote!( + // Include the method metadata only if its `cfg` features are enabled. + let attrs = filter_cfg_attributes(&method.attrs); + methods.push(quote!( #( #attrs )* #crate_::metadata::v15::MethodMetadata { - name: #method_name, - inputs: #crate_::vec![ #( #inputs, )* ], - output: #output, - docs: #docs, + name: #method_name, + inputs: #crate_::vec![ #( #inputs, )* ], + output: #output, + docs: #docs, } - )) -} - -/// Generate the runtime metadata for a given trait. -fn generate_trait_metadata(impl_: &ItemImpl, crate_: &TokenStream) -> Result { - let mut trait_ = extract_impl_trait(&impl_, RequireQualifiedTraitPath::Yes)?.clone(); - - // Implementation traits are always references with a path `impl client::Core ...` - // The trait name is the last segment of this path. - let trait_name_ident = &trait_ - .segments - .last() - .as_ref() - .expect("Trait path should always contain at least one item; qed") - .ident; + )); + } - let trait_doc_getter = generate_decl_docs_getter(trait_name_ident, true); + let trait_name_ident = &decl.ident; let trait_name = format!("{}", trait_name_ident); + let docs = collect_docs(&decl.attrs, &crate_); + let attrs = filter_cfg_attributes(&decl.attrs); + // The trait generics where already extended with `Block: BlockT`. + let mut generics = decl.generics.clone(); + for generic_param in generics.params.iter_mut() { + let syn::GenericParam::Type(ty) = generic_param else { + continue + }; - // Generate `runtime_decl_for_[TRAIT_NAME]` module that contains the documentation getters. - let runtime_decl_mod = generate_runtime_mod_name_for_trait(trait_name_ident); - - // Get absolute path to the `runtime_decl_for_` module by replacing the last segment. - if let Some(segment) = trait_.segments.last_mut() { - *segment = parse_quote!(#runtime_decl_mod); + // `scale_info::meta_type` requires `T: ?Sized + TypeInfo + 'static` bounds. + ty.bounds.push(parse_quote!(#crate_::scale_info::TypeInfo)); + ty.bounds.push(parse_quote!('static)); } - let docs = if cfg!(feature = "no-metadata-docs") { - quote!(crate_::vec![]) - } else { - quote!(#trait_::#trait_doc_getter()) - }; - - let attrs = filter_cfg_attributes(&impl_.attrs); + let where_clause: Vec<_> = where_clause + .iter() + .map(|ty| quote!(#ty: #crate_::scale_info::TypeInfo + 'static)) + .collect(); - let mut methods = Vec::new(); - for item in &impl_.items { - // Collect metadata for methods only. - let syn::ImplItem::Method(method) = item else { - continue; - }; - - let metadata = generate_method_metadata(&method, crate_, &trait_)?; - methods.push(metadata); - } - - Ok(quote!( - #( #attrs )* + quote!( + #( #attrs )* + #[inline(always)] + pub fn runtime_metadata #generics () -> #crate_::metadata::v15::TraitMetadata + where #( #where_clause, )* + { #crate_::metadata::v15::TraitMetadata { - name: #trait_name, - methods: #crate_::vec![ #( #methods, )* ], - docs: #docs, + name: #trait_name, + methods: #crate_::vec![ #( #methods, )* ], + docs: #docs, } - )) + } + ) } -/// Generate the runtime metadata for the given traits. -pub fn generate_runtime_metadata(impls: &[ItemImpl], crate_: &TokenStream) -> Result { +/// Implement the `runtime_metadata` function on the runtime that +/// generates the metadata for the given traits. +/// +/// The metadata of each trait is extracted from the generic function +/// exposed by `generate_decl_runtime_metadata`. +pub fn generate_impl_runtime_metadata( + impls: &[ItemImpl], + crate_: &TokenStream, +) -> Result { if impls.is_empty() { return Ok(quote!()) } @@ -204,11 +200,47 @@ pub fn generate_runtime_metadata(impls: &[ItemImpl], crate_: &TokenStream) -> Re let mut metadata = Vec::new(); for impl_ in impls { - metadata.push(generate_trait_metadata(impl_, &crate_)?); + let mut trait_ = extract_impl_trait(&impl_, RequireQualifiedTraitPath::Yes)?.clone(); + + // Implementation traits are always references with a path `impl client::Core ...` + // The trait name is the last segment of this path. + let trait_name_ident = &trait_ + .segments + .last() + .as_ref() + .expect("Trait path should always contain at least one item; qed") + .ident; + + // Extract the generics from the trait to pass to the `runtime_metadata` + // function on the hidden module. + let generics = trait_ + .segments + .iter() + .find_map(|segment| { + if let syn::PathArguments::AngleBracketed(generics) = &segment.arguments { + Some(generics.clone()) + } else { + None + } + }) + .expect("Trait path should always contain at least one generic parameter; qed"); + + let mod_name = generate_runtime_mod_name_for_trait(&trait_name_ident); + // Get absolute path to the `runtime_decl_for_` module by replacing the last segment. + if let Some(segment) = trait_.segments.last_mut() { + *segment = parse_quote!(#mod_name); + } + + let attrs = filter_cfg_attributes(&impl_.attrs); + metadata.push(quote!( + #( #attrs )* + #trait_::runtime_metadata::#generics() + )); } Ok(quote!( impl #runtime_name { + #[inline(always)] pub fn runtime_metadata() -> #crate_::vec::Vec<#crate_::metadata::v15::TraitMetadata> { #crate_::vec![ #( #metadata, )* ] } From 6239543de9163e42a6615ad36fc99cad3a20dcb1 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Mon, 6 Feb 2023 20:34:39 +0200 Subject: [PATCH 27/75] frame: Abuse Deref to resolve `runtime_metadata` Signed-off-by: Alexandru Vasile --- .../procedural/src/construct_runtime/expand/metadata.rs | 4 +++- frame/support/procedural/src/construct_runtime/mod.rs | 8 ++++++++ primitives/api/proc-macro/src/runtime_metadata.rs | 5 +++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/frame/support/procedural/src/construct_runtime/expand/metadata.rs b/frame/support/procedural/src/construct_runtime/expand/metadata.rs index f8bba0304416c..beb731f82af06 100644 --- a/frame/support/procedural/src/construct_runtime/expand/metadata.rs +++ b/frame/support/procedural/src/construct_runtime/expand/metadata.rs @@ -111,6 +111,8 @@ pub fn expand_runtime_metadata( } fn metadata_v15() -> #scrate::metadata::RuntimeMetadataPrefixed { + let rt = #runtime; + #scrate::metadata::v15::RuntimeMetadataLastVersion::new( #scrate::sp_std::vec![ #(#pallets),* ], #scrate::metadata::ExtrinsicMetadata { @@ -130,7 +132,7 @@ pub fn expand_runtime_metadata( .collect(), }, #scrate::scale_info::meta_type::<#runtime>(), - #runtime::runtime_metadata(), + (&rt).runtime_metadata(), ).into() } } diff --git a/frame/support/procedural/src/construct_runtime/mod.rs b/frame/support/procedural/src/construct_runtime/mod.rs index 9e22037a6782e..10eccc70ec965 100644 --- a/frame/support/procedural/src/construct_runtime/mod.rs +++ b/frame/support/procedural/src/construct_runtime/mod.rs @@ -289,6 +289,14 @@ fn construct_runtime_final_expansion( type RuntimeBlock = #block; } + trait InternalConstructRuntime { + #[inline(always)] + fn runtime_metadata(&self) -> #scrate::sp_std::vec::Vec<#scrate::metadata::v15::TraitMetadata> { + Default::default() + } + } + impl InternalConstructRuntime for &#name {} + #outer_event #outer_origin diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index f39515ec4b3ec..09b6b36a0fdbe 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -239,11 +239,12 @@ pub fn generate_impl_runtime_metadata( } Ok(quote!( - impl #runtime_name { + trait InternalImplRuntimeApis { #[inline(always)] - pub fn runtime_metadata() -> #crate_::vec::Vec<#crate_::metadata::v15::TraitMetadata> { + fn runtime_metadata(&self) -> #crate_::vec::Vec<#crate_::metadata::v15::TraitMetadata> { #crate_::vec![ #( #metadata, )* ] } } + impl InternalImplRuntimeApis for #runtime_name {} )) } From 6822962841a6d9f0c84768bbf588da85d90db658 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Mon, 6 Feb 2023 20:46:54 +0200 Subject: [PATCH 28/75] Revert "frame: Implement `runtime_metadata` for mocks and tests" This reverts commit e4782de008148d1f9b2758e9a919314c0a62ed9a. Revert "frame: Adjust more tests" This reverts commit de1352c8c9af14f8f45218d500885567ea0cc84f. Revert "frame/benchmarking: Adjust benchmarks" This reverts commit ae85bbeca3ea1a4dc0ab12958fa903f8c07ba53e. Signed-off-by: Alexandru Vasile Revert "frame/benchmarks: Adjust more benchmarks" This reverts commit d37aa2205e80cceaa04e7f2971bb542d4ce8a6db. --- bin/node-template/pallets/template/src/mock.rs | 6 ------ frame/alliance/src/mock.rs | 6 ------ frame/assets/src/mock.rs | 6 ------ frame/atomic-swap/src/tests.rs | 6 ------ frame/aura/src/mock.rs | 6 ------ frame/authority-discovery/src/lib.rs | 6 ------ frame/authorship/src/lib.rs | 6 ------ frame/babe/src/mock.rs | 6 ------ frame/bags-list/src/mock.rs | 6 ------ frame/balances/src/tests_composite.rs | 6 ------ frame/balances/src/tests_local.rs | 6 ------ frame/balances/src/tests_reentrancy.rs | 6 ------ frame/beefy-mmr/src/mock.rs | 6 ------ frame/beefy/src/mock.rs | 6 ------ frame/benchmarking/pov/src/benchmarking.rs | 6 ------ frame/benchmarking/pov/src/tests.rs | 5 ----- frame/benchmarking/src/baseline.rs | 6 ------ frame/benchmarking/src/tests.rs | 6 ------ frame/benchmarking/src/tests_instance.rs | 6 ------ frame/bounties/src/tests.rs | 6 ------ frame/child-bounties/src/tests.rs | 6 ------ frame/collective/src/tests.rs | 6 ------ frame/contracts/src/tests.rs | 6 ------ frame/conviction-voting/src/tests.rs | 6 ------ frame/democracy/src/tests.rs | 8 +------- frame/election-provider-multi-phase/src/mock.rs | 6 ------ frame/election-provider-support/src/onchain.rs | 6 ------ frame/elections-phragmen/src/lib.rs | 5 ----- frame/examples/basic/src/tests.rs | 6 ------ frame/examples/offchain-worker/src/tests.rs | 6 ------ frame/executive/src/lib.rs | 6 ------ frame/fast-unstake/src/mock.rs | 6 ------ frame/grandpa/src/mock.rs | 6 ------ frame/identity/src/tests.rs | 6 ------ frame/im-online/src/mock.rs | 6 ------ frame/indices/src/mock.rs | 6 ------ frame/lottery/src/mock.rs | 6 ------ frame/membership/src/lib.rs | 6 ------ frame/merkle-mountain-range/src/mock.rs | 6 ------ frame/message-queue/src/integration_test.rs | 6 ------ frame/message-queue/src/mock.rs | 7 ------- frame/multisig/src/tests.rs | 6 ------ frame/nfts/src/mock.rs | 6 ------ frame/nicks/src/lib.rs | 6 ------ frame/nis/src/mock.rs | 6 ------ frame/node-authorization/src/mock.rs | 6 ------ frame/nomination-pools/benchmarking/src/mock.rs | 6 ------ frame/nomination-pools/src/mock.rs | 6 ------ frame/nomination-pools/test-staking/src/mock.rs | 6 ------ frame/offences/benchmarking/src/mock.rs | 6 ------ frame/offences/src/mock.rs | 6 ------ frame/preimage/src/mock.rs | 6 ------ frame/proxy/src/tests.rs | 6 ------ frame/randomness-collective-flip/src/lib.rs | 6 ------ frame/ranked-collective/src/tests.rs | 6 ------ frame/recovery/src/mock.rs | 6 ------ frame/referenda/src/mock.rs | 6 ------ frame/remark/src/mock.rs | 6 ------ frame/root-offences/src/mock.rs | 6 ------ frame/scheduler/src/mock.rs | 6 ------ frame/scored-pool/src/mock.rs | 6 ------ frame/session/benchmarking/src/mock.rs | 6 ------ frame/session/src/mock.rs | 6 ------ frame/society/src/mock.rs | 6 ------ frame/staking/src/mock.rs | 6 ------ frame/state-trie-migration/src/lib.rs | 6 ------ frame/sudo/src/mock.rs | 6 ------ frame/support/test/compile_pass/src/lib.rs | 6 ------ frame/support/test/tests/construct_runtime.rs | 6 ------ frame/support/test/tests/instance.rs | 6 ------ frame/support/test/tests/issue2219.rs | 6 ------ frame/support/test/tests/origin.rs | 6 ------ frame/support/test/tests/pallet.rs | 6 ------ frame/support/test/tests/pallet_compatibility.rs | 6 ------ frame/support/test/tests/pallet_compatibility_instance.rs | 6 ------ frame/support/test/tests/pallet_instance.rs | 6 ------ .../support/test/tests/pallet_with_name_trait_is_valid.rs | 6 ------ frame/support/test/tests/storage_layers.rs | 6 ------ frame/system/benches/bench.rs | 6 ------ frame/system/benchmarking/src/mock.rs | 5 ----- frame/system/src/mock.rs | 6 ------ frame/timestamp/src/mock.rs | 6 ------ frame/tips/src/tests.rs | 6 ------ frame/transaction-payment/asset-tx-payment/src/mock.rs | 6 ------ frame/transaction-payment/src/mock.rs | 6 ------ frame/transaction-storage/src/mock.rs | 6 ------ frame/treasury/src/tests.rs | 6 ------ frame/uniques/src/mock.rs | 6 ------ frame/utility/src/tests.rs | 6 ------ frame/vesting/src/mock.rs | 6 ------ frame/whitelist/src/mock.rs | 6 ------ 91 files changed, 1 insertion(+), 545 deletions(-) diff --git a/bin/node-template/pallets/template/src/mock.rs b/bin/node-template/pallets/template/src/mock.rs index afa79b8298974..91a1bf6ed5fc8 100644 --- a/bin/node-template/pallets/template/src/mock.rs +++ b/bin/node-template/pallets/template/src/mock.rs @@ -21,12 +21,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/alliance/src/mock.rs b/frame/alliance/src/mock.rs index 772858153cb04..e708d29d529fe 100644 --- a/frame/alliance/src/mock.rs +++ b/frame/alliance/src/mock.rs @@ -246,12 +246,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - pub fn new_test_ext() -> sp_io::TestExternalities { let mut t = frame_system::GenesisConfig::default().build_storage::().unwrap(); diff --git a/frame/assets/src/mock.rs b/frame/assets/src/mock.rs index 82af1585837fb..93a87ee6714c6 100644 --- a/frame/assets/src/mock.rs +++ b/frame/assets/src/mock.rs @@ -47,12 +47,6 @@ construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - type AccountId = u64; type AssetId = u32; diff --git a/frame/atomic-swap/src/tests.rs b/frame/atomic-swap/src/tests.rs index 67513e2a973c1..081a449ec9a2e 100644 --- a/frame/atomic-swap/src/tests.rs +++ b/frame/atomic-swap/src/tests.rs @@ -25,12 +25,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/aura/src/mock.rs b/frame/aura/src/mock.rs index d67842483d512..7a07fe99ae25d 100644 --- a/frame/aura/src/mock.rs +++ b/frame/aura/src/mock.rs @@ -46,12 +46,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/authority-discovery/src/lib.rs b/frame/authority-discovery/src/lib.rs index 49151b0b3eca0..39e01dba43b2b 100644 --- a/frame/authority-discovery/src/lib.rs +++ b/frame/authority-discovery/src/lib.rs @@ -196,12 +196,6 @@ mod tests { } ); - impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } - } - parameter_types! { pub const DisabledValidatorsThreshold: Perbill = Perbill::from_percent(33); } diff --git a/frame/authorship/src/lib.rs b/frame/authorship/src/lib.rs index 4b629233676a1..b5568a6acf77c 100644 --- a/frame/authorship/src/lib.rs +++ b/frame/authorship/src/lib.rs @@ -123,12 +123,6 @@ mod tests { } ); - impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } - } - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/babe/src/mock.rs b/frame/babe/src/mock.rs index b358625225283..b09dc29f6d60a 100644 --- a/frame/babe/src/mock.rs +++ b/frame/babe/src/mock.rs @@ -64,12 +64,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/bags-list/src/mock.rs b/frame/bags-list/src/mock.rs index 7e14bbab71daf..8cc96a988e72a 100644 --- a/frame/bags-list/src/mock.rs +++ b/frame/bags-list/src/mock.rs @@ -98,12 +98,6 @@ frame_support::construct_runtime!( } ); -impl Runtime { - fn runtime_metadata() -> Vec { - Default::default() - } -} - /// Default AccountIds and their weights. pub(crate) const GENESIS_IDS: [(AccountId, VoteWeight); 4] = [(1, 10), (2, 1_000), (3, 1_000), (4, 1_000)]; diff --git a/frame/balances/src/tests_composite.rs b/frame/balances/src/tests_composite.rs index a7a976327e9e7..f8a8fdd1851d4 100644 --- a/frame/balances/src/tests_composite.rs +++ b/frame/balances/src/tests_composite.rs @@ -45,12 +45,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - parameter_types! { pub BlockWeights: frame_system::limits::BlockWeights = frame_system::limits::BlockWeights::simple_max( diff --git a/frame/balances/src/tests_local.rs b/frame/balances/src/tests_local.rs index 8f9d9e2ab2dd4..152a5da37410f 100644 --- a/frame/balances/src/tests_local.rs +++ b/frame/balances/src/tests_local.rs @@ -46,12 +46,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - parameter_types! { pub BlockWeights: frame_system::limits::BlockWeights = frame_system::limits::BlockWeights::simple_max( diff --git a/frame/balances/src/tests_reentrancy.rs b/frame/balances/src/tests_reentrancy.rs index 3192ee3162423..90363140000e8 100644 --- a/frame/balances/src/tests_reentrancy.rs +++ b/frame/balances/src/tests_reentrancy.rs @@ -49,12 +49,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - parameter_types! { pub BlockWeights: frame_system::limits::BlockWeights = frame_system::limits::BlockWeights::simple_max( diff --git a/frame/beefy-mmr/src/mock.rs b/frame/beefy-mmr/src/mock.rs index 89851241c05f0..2de71cd5b320a 100644 --- a/frame/beefy-mmr/src/mock.rs +++ b/frame/beefy-mmr/src/mock.rs @@ -62,12 +62,6 @@ construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/beefy/src/mock.rs b/frame/beefy/src/mock.rs index 8658f36971813..ad3a672333dd5 100644 --- a/frame/beefy/src/mock.rs +++ b/frame/beefy/src/mock.rs @@ -57,12 +57,6 @@ construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/benchmarking/pov/src/benchmarking.rs b/frame/benchmarking/pov/src/benchmarking.rs index 9760501bdc6b5..608077e2df806 100644 --- a/frame/benchmarking/pov/src/benchmarking.rs +++ b/frame/benchmarking/pov/src/benchmarking.rs @@ -334,12 +334,6 @@ mod mock { } ); - impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } - } - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/benchmarking/pov/src/tests.rs b/frame/benchmarking/pov/src/tests.rs index 1a8346ec5e0b4..1100fdc46f813 100644 --- a/frame/benchmarking/pov/src/tests.rs +++ b/frame/benchmarking/pov/src/tests.rs @@ -178,11 +178,6 @@ mod mock { } ); - impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } - } impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/benchmarking/src/baseline.rs b/frame/benchmarking/src/baseline.rs index 9ee7078235c51..0d511cbff4b86 100644 --- a/frame/benchmarking/src/baseline.rs +++ b/frame/benchmarking/src/baseline.rs @@ -130,12 +130,6 @@ pub mod mock { } ); - impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } - } - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/benchmarking/src/tests.rs b/frame/benchmarking/src/tests.rs index 289662896abcb..1499f9c182fce 100644 --- a/frame/benchmarking/src/tests.rs +++ b/frame/benchmarking/src/tests.rs @@ -88,12 +88,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/benchmarking/src/tests_instance.rs b/frame/benchmarking/src/tests_instance.rs index 0f2a94392c8ed..ecc0a78a199b9 100644 --- a/frame/benchmarking/src/tests_instance.rs +++ b/frame/benchmarking/src/tests_instance.rs @@ -92,12 +92,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/bounties/src/tests.rs b/frame/bounties/src/tests.rs index 254697cc9b54f..bc59e3a70fd82 100644 --- a/frame/bounties/src/tests.rs +++ b/frame/bounties/src/tests.rs @@ -57,12 +57,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - parameter_types! { pub const AvailableBlockRatio: Perbill = Perbill::one(); } diff --git a/frame/child-bounties/src/tests.rs b/frame/child-bounties/src/tests.rs index b599248a2e4da..f3415c69df611 100644 --- a/frame/child-bounties/src/tests.rs +++ b/frame/child-bounties/src/tests.rs @@ -58,12 +58,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - parameter_types! { pub const MaximumBlockWeight: Weight = Weight::from_ref_time(1024); pub const MaximumBlockLength: u32 = 2 * 1024; diff --git a/frame/collective/src/tests.rs b/frame/collective/src/tests.rs index 77bb9fe5c4b85..5c90de9f91bf7 100644 --- a/frame/collective/src/tests.rs +++ b/frame/collective/src/tests.rs @@ -49,12 +49,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - mod mock_democracy { pub use pallet::*; #[frame_support::pallet] diff --git a/frame/contracts/src/tests.rs b/frame/contracts/src/tests.rs index 2d47e97d77ae8..ce84da743d112 100644 --- a/frame/contracts/src/tests.rs +++ b/frame/contracts/src/tests.rs @@ -73,12 +73,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - #[macro_use] pub mod test_utils { use super::{Balances, Hash, SysConfig, Test}; diff --git a/frame/conviction-voting/src/tests.rs b/frame/conviction-voting/src/tests.rs index 8013a0810329d..9caa451e0dae8 100644 --- a/frame/conviction-voting/src/tests.rs +++ b/frame/conviction-voting/src/tests.rs @@ -47,12 +47,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - // Test that a fitlered call can be dispatched. pub struct BaseFilter; impl Contains for BaseFilter { diff --git a/frame/democracy/src/tests.rs b/frame/democracy/src/tests.rs index 43608de514f0a..41b279035028e 100644 --- a/frame/democracy/src/tests.rs +++ b/frame/democracy/src/tests.rs @@ -67,13 +67,7 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - -// Test that a filtered call can be dispatched. +// Test that a fitlered call can be dispatched. pub struct BaseFilter; impl Contains for BaseFilter { fn contains(call: &RuntimeCall) -> bool { diff --git a/frame/election-provider-multi-phase/src/mock.rs b/frame/election-provider-multi-phase/src/mock.rs index 65879d20a6388..347a4f19185f9 100644 --- a/frame/election-provider-multi-phase/src/mock.rs +++ b/frame/election-provider-multi-phase/src/mock.rs @@ -65,12 +65,6 @@ frame_support::construct_runtime!( } ); -impl Runtime { - fn runtime_metadata() -> Vec { - Default::default() - } -} - pub(crate) type Balance = u64; pub(crate) type AccountId = u64; pub(crate) type BlockNumber = u64; diff --git a/frame/election-provider-support/src/onchain.rs b/frame/election-provider-support/src/onchain.rs index 4de133c9ad25c..483c402fe249c 100644 --- a/frame/election-provider-support/src/onchain.rs +++ b/frame/election-provider-support/src/onchain.rs @@ -206,12 +206,6 @@ mod tests { } ); - impl Runtime { - fn runtime_metadata() -> Vec { - Default::default() - } - } - impl frame_system::Config for Runtime { type SS58Prefix = (); type BaseCallFilter = frame_support::traits::Everything; diff --git a/frame/elections-phragmen/src/lib.rs b/frame/elections-phragmen/src/lib.rs index 3fd70d7b99439..1a020adb28632 100644 --- a/frame/elections-phragmen/src/lib.rs +++ b/frame/elections-phragmen/src/lib.rs @@ -1316,11 +1316,6 @@ mod tests { } ); - impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } - } pub struct ExtBuilder { balance_factor: u64, genesis_members: Vec<(u64, u64)>, diff --git a/frame/examples/basic/src/tests.rs b/frame/examples/basic/src/tests.rs index 0e04e2697a57e..891c7c78628a1 100644 --- a/frame/examples/basic/src/tests.rs +++ b/frame/examples/basic/src/tests.rs @@ -50,12 +50,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/examples/offchain-worker/src/tests.rs b/frame/examples/offchain-worker/src/tests.rs index 2367ee822c8a0..2050d76a241ff 100644 --- a/frame/examples/offchain-worker/src/tests.rs +++ b/frame/examples/offchain-worker/src/tests.rs @@ -51,12 +51,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/executive/src/lib.rs b/frame/executive/src/lib.rs index 11caf8a8ca9e8..b454d1e276cc8 100644 --- a/frame/executive/src/lib.rs +++ b/frame/executive/src/lib.rs @@ -850,12 +850,6 @@ mod tests { } ); - impl Runtime { - fn runtime_metadata() -> Vec { - Default::default() - } - } - parameter_types! { pub BlockWeights: frame_system::limits::BlockWeights = frame_system::limits::BlockWeights::builder() diff --git a/frame/fast-unstake/src/mock.rs b/frame/fast-unstake/src/mock.rs index 65d800c55bfd4..38cf41fdebe8b 100644 --- a/frame/fast-unstake/src/mock.rs +++ b/frame/fast-unstake/src/mock.rs @@ -206,12 +206,6 @@ frame_support::construct_runtime!( } ); -impl Runtime { - fn runtime_metadata() -> Vec { - Default::default() - } -} - parameter_types! { static FastUnstakeEvents: u32 = 0; } diff --git a/frame/grandpa/src/mock.rs b/frame/grandpa/src/mock.rs index 31dad57b4b4ae..7d54966a498a6 100644 --- a/frame/grandpa/src/mock.rs +++ b/frame/grandpa/src/mock.rs @@ -63,12 +63,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl_opaque_keys! { pub struct TestSessionKeys { pub grandpa_authority: super::Pallet, diff --git a/frame/identity/src/tests.rs b/frame/identity/src/tests.rs index 790f7811af173..baca70e2795fc 100644 --- a/frame/identity/src/tests.rs +++ b/frame/identity/src/tests.rs @@ -48,12 +48,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/im-online/src/mock.rs b/frame/im-online/src/mock.rs index 660f7cb619bfc..783e68dfede9f 100644 --- a/frame/im-online/src/mock.rs +++ b/frame/im-online/src/mock.rs @@ -55,12 +55,6 @@ frame_support::construct_runtime!( } ); -impl Runtime { - fn runtime_metadata() -> Vec { - Default::default() - } -} - parameter_types! { pub static Validators: Option> = Some(vec![ 1, diff --git a/frame/indices/src/mock.rs b/frame/indices/src/mock.rs index 4cff4afa20708..6b5373bb43b5a 100644 --- a/frame/indices/src/mock.rs +++ b/frame/indices/src/mock.rs @@ -39,12 +39,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/lottery/src/mock.rs b/frame/lottery/src/mock.rs index e254cbccf376c..1977da5959d39 100644 --- a/frame/lottery/src/mock.rs +++ b/frame/lottery/src/mock.rs @@ -48,12 +48,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - parameter_types! { pub const AvailableBlockRatio: Perbill = Perbill::one(); } diff --git a/frame/membership/src/lib.rs b/frame/membership/src/lib.rs index 7cfbcb4333586..8b39a08ce6699 100644 --- a/frame/membership/src/lib.rs +++ b/frame/membership/src/lib.rs @@ -555,12 +555,6 @@ mod tests { } ); - impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } - } - parameter_types! { pub static Members: Vec = vec![]; pub static Prime: Option = None; diff --git a/frame/merkle-mountain-range/src/mock.rs b/frame/merkle-mountain-range/src/mock.rs index 1f57a3113ad25..3fd44275857c1 100644 --- a/frame/merkle-mountain-range/src/mock.rs +++ b/frame/merkle-mountain-range/src/mock.rs @@ -44,12 +44,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type RuntimeOrigin = RuntimeOrigin; diff --git a/frame/message-queue/src/integration_test.rs b/frame/message-queue/src/integration_test.rs index 3720451da027d..c9e3b2e870fd8 100644 --- a/frame/message-queue/src/integration_test.rs +++ b/frame/message-queue/src/integration_test.rs @@ -54,12 +54,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/message-queue/src/mock.rs b/frame/message-queue/src/mock.rs index b0af0a927195a..37e504ac50033 100644 --- a/frame/message-queue/src/mock.rs +++ b/frame/message-queue/src/mock.rs @@ -47,13 +47,6 @@ frame_support::construct_runtime!( MessageQueue: pallet_message_queue::{Pallet, Call, Storage, Event}, } ); - -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/multisig/src/tests.rs b/frame/multisig/src/tests.rs index f449363f492e3..13493587caa2b 100644 --- a/frame/multisig/src/tests.rs +++ b/frame/multisig/src/tests.rs @@ -47,12 +47,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = TestBaseCallFilter; type BlockWeights = (); diff --git a/frame/nfts/src/mock.rs b/frame/nfts/src/mock.rs index 269af89b9598f..f814b209d5f78 100644 --- a/frame/nfts/src/mock.rs +++ b/frame/nfts/src/mock.rs @@ -45,12 +45,6 @@ construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/nicks/src/lib.rs b/frame/nicks/src/lib.rs index b7735195b944e..3d8307c434107 100644 --- a/frame/nicks/src/lib.rs +++ b/frame/nicks/src/lib.rs @@ -275,12 +275,6 @@ mod tests { } ); - impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } - } - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/nis/src/mock.rs b/frame/nis/src/mock.rs index 9c8ea5503a247..585ed2d8b278f 100644 --- a/frame/nis/src/mock.rs +++ b/frame/nis/src/mock.rs @@ -49,12 +49,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/node-authorization/src/mock.rs b/frame/node-authorization/src/mock.rs index a122bc6fcd0bc..fcf7ff0189332 100644 --- a/frame/node-authorization/src/mock.rs +++ b/frame/node-authorization/src/mock.rs @@ -47,12 +47,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type DbWeight = (); diff --git a/frame/nomination-pools/benchmarking/src/mock.rs b/frame/nomination-pools/benchmarking/src/mock.rs index 35315f4104f55..06a66838594c7 100644 --- a/frame/nomination-pools/benchmarking/src/mock.rs +++ b/frame/nomination-pools/benchmarking/src/mock.rs @@ -187,12 +187,6 @@ frame_support::construct_runtime!( } ); -impl Runtime { - fn runtime_metadata() -> Vec { - Default::default() - } -} - pub fn new_test_ext() -> sp_io::TestExternalities { let mut storage = frame_system::GenesisConfig::default().build_storage::().unwrap(); let _ = pallet_nomination_pools::GenesisConfig:: { diff --git a/frame/nomination-pools/src/mock.rs b/frame/nomination-pools/src/mock.rs index 47a7c90badef8..99d521df3241b 100644 --- a/frame/nomination-pools/src/mock.rs +++ b/frame/nomination-pools/src/mock.rs @@ -247,12 +247,6 @@ frame_support::construct_runtime!( } ); -impl Runtime { - fn runtime_metadata() -> Vec { - Default::default() - } -} - pub struct ExtBuilder { members: Vec<(AccountId, Balance)>, max_members: Option, diff --git a/frame/nomination-pools/test-staking/src/mock.rs b/frame/nomination-pools/test-staking/src/mock.rs index 0f1f5064b691d..c67aec0134b07 100644 --- a/frame/nomination-pools/test-staking/src/mock.rs +++ b/frame/nomination-pools/test-staking/src/mock.rs @@ -200,12 +200,6 @@ frame_support::construct_runtime!( } ); -impl Runtime { - fn runtime_metadata() -> Vec { - Default::default() - } -} - pub fn new_test_ext() -> sp_io::TestExternalities { sp_tracing::try_init_simple(); let mut storage = frame_system::GenesisConfig::default().build_storage::().unwrap(); diff --git a/frame/offences/benchmarking/src/mock.rs b/frame/offences/benchmarking/src/mock.rs index a6250ffa3b9af..592e821a81d8c 100644 --- a/frame/offences/benchmarking/src/mock.rs +++ b/frame/offences/benchmarking/src/mock.rs @@ -231,12 +231,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - pub fn new_test_ext() -> sp_io::TestExternalities { let t = frame_system::GenesisConfig::default().build_storage::().unwrap(); sp_io::TestExternalities::new(t) diff --git a/frame/offences/src/mock.rs b/frame/offences/src/mock.rs index 0df275c1618ef..63d2b0de34780 100644 --- a/frame/offences/src/mock.rs +++ b/frame/offences/src/mock.rs @@ -80,12 +80,6 @@ frame_support::construct_runtime!( } ); -impl Runtime { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Runtime { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/preimage/src/mock.rs b/frame/preimage/src/mock.rs index b0d1f665bf475..d81f5a9c3232c 100644 --- a/frame/preimage/src/mock.rs +++ b/frame/preimage/src/mock.rs @@ -47,12 +47,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = Everything; type BlockWeights = (); diff --git a/frame/proxy/src/tests.rs b/frame/proxy/src/tests.rs index 8a0cffb73576b..0e7db3512f15b 100644 --- a/frame/proxy/src/tests.rs +++ b/frame/proxy/src/tests.rs @@ -51,12 +51,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = BaseFilter; type BlockWeights = (); diff --git a/frame/randomness-collective-flip/src/lib.rs b/frame/randomness-collective-flip/src/lib.rs index 1d10521702c59..d92b053655dc9 100644 --- a/frame/randomness-collective-flip/src/lib.rs +++ b/frame/randomness-collective-flip/src/lib.rs @@ -185,12 +185,6 @@ mod tests { } ); - impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } - } - parameter_types! { pub BlockLength: limits::BlockLength = limits::BlockLength ::max(2 * 1024); diff --git a/frame/ranked-collective/src/tests.rs b/frame/ranked-collective/src/tests.rs index 3c26d42c8283e..c11d4877d3577 100644 --- a/frame/ranked-collective/src/tests.rs +++ b/frame/ranked-collective/src/tests.rs @@ -48,12 +48,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = Everything; type BlockWeights = (); diff --git a/frame/recovery/src/mock.rs b/frame/recovery/src/mock.rs index e814935fd1faf..05ca8e6a30a0e 100644 --- a/frame/recovery/src/mock.rs +++ b/frame/recovery/src/mock.rs @@ -45,12 +45,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/referenda/src/mock.rs b/frame/referenda/src/mock.rs index 5751537ee4fb5..82ae508d52b6f 100644 --- a/frame/referenda/src/mock.rs +++ b/frame/referenda/src/mock.rs @@ -53,12 +53,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - // Test that a fitlered call can be dispatched. pub struct BaseFilter; impl Contains for BaseFilter { diff --git a/frame/remark/src/mock.rs b/frame/remark/src/mock.rs index 07e99451ab27c..22467796cf37b 100644 --- a/frame/remark/src/mock.rs +++ b/frame/remark/src/mock.rs @@ -41,12 +41,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/root-offences/src/mock.rs b/frame/root-offences/src/mock.rs index 61f15cbf48f8b..273fbf614169d 100644 --- a/frame/root-offences/src/mock.rs +++ b/frame/root-offences/src/mock.rs @@ -58,12 +58,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - /// Another session handler struct to test on_disabled. pub struct OtherSessionHandler; impl OneSessionHandler for OtherSessionHandler { diff --git a/frame/scheduler/src/mock.rs b/frame/scheduler/src/mock.rs index f161004e290b1..0aaac56667dcb 100644 --- a/frame/scheduler/src/mock.rs +++ b/frame/scheduler/src/mock.rs @@ -110,12 +110,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - // Scheduler must dispatch with root and no filter, this tests base filter is indeed not used. pub struct BaseFilter; impl Contains for BaseFilter { diff --git a/frame/scored-pool/src/mock.rs b/frame/scored-pool/src/mock.rs index 17996d92a7333..951871dd83c5c 100644 --- a/frame/scored-pool/src/mock.rs +++ b/frame/scored-pool/src/mock.rs @@ -46,12 +46,6 @@ construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - parameter_types! { pub const CandidateDeposit: u64 = 25; } diff --git a/frame/session/benchmarking/src/mock.rs b/frame/session/benchmarking/src/mock.rs index 3caf66864ed33..0699640bc092a 100644 --- a/frame/session/benchmarking/src/mock.rs +++ b/frame/session/benchmarking/src/mock.rs @@ -47,12 +47,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/session/src/mock.rs b/frame/session/src/mock.rs index dd26d2bc71efa..1138bd9543989 100644 --- a/frame/session/src/mock.rs +++ b/frame/session/src/mock.rs @@ -103,12 +103,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - parameter_types! { pub static Validators: Vec = vec![1, 2, 3]; pub static NextValidators: Vec = vec![1, 2, 3]; diff --git a/frame/society/src/mock.rs b/frame/society/src/mock.rs index b4b2a3fe3be0d..24544bf9e82dd 100644 --- a/frame/society/src/mock.rs +++ b/frame/society/src/mock.rs @@ -47,12 +47,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - parameter_types! { pub const SocietyPalletId: PalletId = PalletId(*b"py/socie"); } diff --git a/frame/staking/src/mock.rs b/frame/staking/src/mock.rs index 9617f2a73de06..30db036d00056 100644 --- a/frame/staking/src/mock.rs +++ b/frame/staking/src/mock.rs @@ -102,12 +102,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - /// Author of block is always 11 pub struct Author11; impl FindAuthor for Author11 { diff --git a/frame/state-trie-migration/src/lib.rs b/frame/state-trie-migration/src/lib.rs index 8457f5afaf947..23f73bb56b173 100644 --- a/frame/state-trie-migration/src/lib.rs +++ b/frame/state-trie-migration/src/lib.rs @@ -1082,12 +1082,6 @@ mod mock { } ); - impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } - } - parameter_types! { pub const SS58Prefix: u8 = 42; } diff --git a/frame/sudo/src/mock.rs b/frame/sudo/src/mock.rs index 897ffe00a9200..f8a03836f8f0f 100644 --- a/frame/sudo/src/mock.rs +++ b/frame/sudo/src/mock.rs @@ -106,12 +106,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - pub struct BlockEverything; impl Contains for BlockEverything { fn contains(_: &RuntimeCall) -> bool { diff --git a/frame/support/test/compile_pass/src/lib.rs b/frame/support/test/compile_pass/src/lib.rs index 97c6dc58baef5..b46f6c48a6d99 100644 --- a/frame/support/test/compile_pass/src/lib.rs +++ b/frame/support/test/compile_pass/src/lib.rs @@ -93,9 +93,3 @@ construct_runtime!( System: frame_system, } ); - -impl Runtime { - fn runtime_metadata() -> Vec { - Default::default() - } -} diff --git a/frame/support/test/tests/construct_runtime.rs b/frame/support/test/tests/construct_runtime.rs index 20ca0f90a8765..18e4af1ac3739 100644 --- a/frame/support/test/tests/construct_runtime.rs +++ b/frame/support/test/tests/construct_runtime.rs @@ -275,12 +275,6 @@ frame_support::construct_runtime!( } ); -impl Runtime { - fn runtime_metadata() -> Vec { - Default::default() - } -} - pub type Header = generic::Header; pub type Block = generic::Block; pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; diff --git a/frame/support/test/tests/instance.rs b/frame/support/test/tests/instance.rs index 5bfb77996275a..043959b67ee6e 100644 --- a/frame/support/test/tests/instance.rs +++ b/frame/support/test/tests/instance.rs @@ -313,12 +313,6 @@ frame_support::construct_runtime!( } ); -impl Runtime { - fn runtime_metadata() -> Vec { - Default::default() - } -} - pub type Header = generic::Header; pub type Block = generic::Block; pub type UncheckedExtrinsic = generic::UncheckedExtrinsic; diff --git a/frame/support/test/tests/issue2219.rs b/frame/support/test/tests/issue2219.rs index f80bb322cc848..5d24d54165c1f 100644 --- a/frame/support/test/tests/issue2219.rs +++ b/frame/support/test/tests/issue2219.rs @@ -182,12 +182,6 @@ frame_support::construct_runtime!( } ); -impl Runtime { - fn runtime_metadata() -> Vec { - Default::default() - } -} - #[test] fn create_genesis_config() { let config = GenesisConfig { diff --git a/frame/support/test/tests/origin.rs b/frame/support/test/tests/origin.rs index 31cb35ebcb1b5..f794cd8be1ce0 100644 --- a/frame/support/test/tests/origin.rs +++ b/frame/support/test/tests/origin.rs @@ -167,12 +167,6 @@ frame_support::construct_runtime!( } ); -impl RuntimeOriginTest { - fn runtime_metadata() -> Vec { - Default::default() - } -} - pub type Signature = sr25519::Signature; pub type BlockNumber = u64; pub type Header = generic::Header; diff --git a/frame/support/test/tests/pallet.rs b/frame/support/test/tests/pallet.rs index 27b817dba8733..f050b23514eb1 100644 --- a/frame/support/test/tests/pallet.rs +++ b/frame/support/test/tests/pallet.rs @@ -668,12 +668,6 @@ frame_support::construct_runtime!( } ); -impl Runtime { - fn runtime_metadata() -> Vec { - Default::default() - } -} - // Test that the part `RuntimeCall` is excluded from Example2 and included in Example4. fn _ensure_call_is_correctly_excluded_and_included(call: RuntimeCall) { match call { diff --git a/frame/support/test/tests/pallet_compatibility.rs b/frame/support/test/tests/pallet_compatibility.rs index 6d32a9eb93a35..300fb9a40cf4e 100644 --- a/frame/support/test/tests/pallet_compatibility.rs +++ b/frame/support/test/tests/pallet_compatibility.rs @@ -279,12 +279,6 @@ frame_support::construct_runtime!( } ); -impl Runtime { - fn runtime_metadata() -> Vec { - Default::default() - } -} - #[cfg(test)] mod test { use super::{pallet, pallet_old, Runtime}; diff --git a/frame/support/test/tests/pallet_compatibility_instance.rs b/frame/support/test/tests/pallet_compatibility_instance.rs index b31153b24dcba..79370d911b943 100644 --- a/frame/support/test/tests/pallet_compatibility_instance.rs +++ b/frame/support/test/tests/pallet_compatibility_instance.rs @@ -283,12 +283,6 @@ frame_support::construct_runtime!( } ); -impl Runtime { - fn runtime_metadata() -> Vec { - Default::default() - } -} - #[cfg(test)] mod test { use super::{pallet, pallet_old, Runtime}; diff --git a/frame/support/test/tests/pallet_instance.rs b/frame/support/test/tests/pallet_instance.rs index d71a35a42466f..7fec0aa9d0e07 100644 --- a/frame/support/test/tests/pallet_instance.rs +++ b/frame/support/test/tests/pallet_instance.rs @@ -348,12 +348,6 @@ frame_support::construct_runtime!( } ); -impl Runtime { - fn runtime_metadata() -> Vec { - Default::default() - } -} - use frame_support::weights::Weight; #[test] diff --git a/frame/support/test/tests/pallet_with_name_trait_is_valid.rs b/frame/support/test/tests/pallet_with_name_trait_is_valid.rs index ff3f83072a4d7..0066420566fe8 100644 --- a/frame/support/test/tests/pallet_with_name_trait_is_valid.rs +++ b/frame/support/test/tests/pallet_with_name_trait_is_valid.rs @@ -124,12 +124,6 @@ mod tests { } ); - impl Runtime { - fn runtime_metadata() -> Vec { - Default::default() - } - } - impl frame_system::Config for Runtime { type BaseCallFilter = frame_support::traits::Everything; type RuntimeOrigin = RuntimeOrigin; diff --git a/frame/support/test/tests/storage_layers.rs b/frame/support/test/tests/storage_layers.rs index a1c274a78f08f..cff81c0bea2ed 100644 --- a/frame/support/test/tests/storage_layers.rs +++ b/frame/support/test/tests/storage_layers.rs @@ -125,12 +125,6 @@ frame_support::construct_runtime!( } ); -impl Runtime { - fn runtime_metadata() -> Vec { - Default::default() - } -} - #[test] fn storage_layer_basic_commit() { TestExternalities::default().execute_with(|| { diff --git a/frame/system/benches/bench.rs b/frame/system/benches/bench.rs index 61c0be7793c2b..f2acc319d3f5d 100644 --- a/frame/system/benches/bench.rs +++ b/frame/system/benches/bench.rs @@ -58,12 +58,6 @@ frame_support::construct_runtime!( } ); -impl Runtime { - fn runtime_metadata() -> Vec { - Default::default() - } -} - frame_support::parameter_types! { pub BlockLength: frame_system::limits::BlockLength = frame_system::limits::BlockLength::max_with_normal_ratio( diff --git a/frame/system/benchmarking/src/mock.rs b/frame/system/benchmarking/src/mock.rs index e633e4d75e097..a7f28ca30fe87 100644 --- a/frame/system/benchmarking/src/mock.rs +++ b/frame/system/benchmarking/src/mock.rs @@ -37,11 +37,6 @@ frame_support::construct_runtime!( System: frame_system::{Pallet, Call, Config, Storage, Event}, } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; diff --git a/frame/system/src/mock.rs b/frame/system/src/mock.rs index f44a0c8e5ecfd..fb230f66a94f7 100644 --- a/frame/system/src/mock.rs +++ b/frame/system/src/mock.rs @@ -40,12 +40,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); const MAX_BLOCK_WEIGHT: Weight = Weight::from_ref_time(1024).set_proof_size(u64::MAX); diff --git a/frame/timestamp/src/mock.rs b/frame/timestamp/src/mock.rs index 4485e7ec531ca..e1ba5cd11e615 100644 --- a/frame/timestamp/src/mock.rs +++ b/frame/timestamp/src/mock.rs @@ -46,12 +46,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/tips/src/tests.rs b/frame/tips/src/tests.rs index 6b3f1bd48bd92..cb0b4458c7fba 100644 --- a/frame/tips/src/tests.rs +++ b/frame/tips/src/tests.rs @@ -57,12 +57,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - parameter_types! { pub const AvailableBlockRatio: Perbill = Perbill::one(); } diff --git a/frame/transaction-payment/asset-tx-payment/src/mock.rs b/frame/transaction-payment/asset-tx-payment/src/mock.rs index b828c2661c816..60fb2e6c5e03e 100644 --- a/frame/transaction-payment/asset-tx-payment/src/mock.rs +++ b/frame/transaction-payment/asset-tx-payment/src/mock.rs @@ -54,12 +54,6 @@ frame_support::construct_runtime!( } ); -impl Runtime { - fn runtime_metadata() -> Vec { - Default::default() - } -} - parameter_types! { pub(crate) static ExtrinsicBaseWeight: Weight = Weight::zero(); } diff --git a/frame/transaction-payment/src/mock.rs b/frame/transaction-payment/src/mock.rs index d8bb57d176301..e214458b3766e 100644 --- a/frame/transaction-payment/src/mock.rs +++ b/frame/transaction-payment/src/mock.rs @@ -48,12 +48,6 @@ frame_support::construct_runtime!( } ); -impl Runtime { - fn runtime_metadata() -> Vec { - Default::default() - } -} - pub(crate) const CALL: &::RuntimeCall = &RuntimeCall::Balances(BalancesCall::transfer { dest: 2, value: 69 }); diff --git a/frame/transaction-storage/src/mock.rs b/frame/transaction-storage/src/mock.rs index 942db64f416db..8764b16c31d8d 100644 --- a/frame/transaction-storage/src/mock.rs +++ b/frame/transaction-storage/src/mock.rs @@ -47,12 +47,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/treasury/src/tests.rs b/frame/treasury/src/tests.rs index 4456b66a37fe2..e6a1ea0f543fe 100644 --- a/frame/treasury/src/tests.rs +++ b/frame/treasury/src/tests.rs @@ -51,12 +51,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/uniques/src/mock.rs b/frame/uniques/src/mock.rs index 810062745ff02..d6ed5cc5cc23e 100644 --- a/frame/uniques/src/mock.rs +++ b/frame/uniques/src/mock.rs @@ -45,12 +45,6 @@ construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = frame_support::traits::Everything; type BlockWeights = (); diff --git a/frame/utility/src/tests.rs b/frame/utility/src/tests.rs index 26959f47a2ac5..f9d6a16c1a0d4 100644 --- a/frame/utility/src/tests.rs +++ b/frame/utility/src/tests.rs @@ -145,12 +145,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - parameter_types! { pub BlockWeights: frame_system::limits::BlockWeights = frame_system::limits::BlockWeights::simple_max(Weight::MAX); diff --git a/frame/vesting/src/mock.rs b/frame/vesting/src/mock.rs index af9b21dda4504..da9490bea66c0 100644 --- a/frame/vesting/src/mock.rs +++ b/frame/vesting/src/mock.rs @@ -43,12 +43,6 @@ frame_support::construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type AccountData = pallet_balances::AccountData; type AccountId = u64; diff --git a/frame/whitelist/src/mock.rs b/frame/whitelist/src/mock.rs index 0104b3e960fa3..e08c2875aec51 100644 --- a/frame/whitelist/src/mock.rs +++ b/frame/whitelist/src/mock.rs @@ -49,12 +49,6 @@ construct_runtime!( } ); -impl Test { - fn runtime_metadata() -> Vec { - Default::default() - } -} - impl frame_system::Config for Test { type BaseCallFilter = Nothing; type BlockWeights = (); From b1c3dd972c2bbdb9c6398fc8c097f9a97a7e35bf Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Tue, 7 Feb 2023 16:17:06 +0200 Subject: [PATCH 29/75] primitives/proc-macro: Remove unused imports and function Signed-off-by: Alexandru Vasile --- Cargo.lock | 1 - primitives/api/proc-macro/Cargo.toml | 1 - primitives/api/proc-macro/src/utils.rs | 14 -------------- 3 files changed, 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index da48849888979..a557db905f3c5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9615,7 +9615,6 @@ dependencies = [ name = "sp-api-proc-macro" version = "4.0.0-dev" dependencies = [ - "Inflector", "assert_matches", "blake2", "proc-macro-crate", diff --git a/primitives/api/proc-macro/Cargo.toml b/primitives/api/proc-macro/Cargo.toml index f5bbdde0aa566..1b0f2c09c950f 100644 --- a/primitives/api/proc-macro/Cargo.toml +++ b/primitives/api/proc-macro/Cargo.toml @@ -21,7 +21,6 @@ syn = { version = "1.0.98", features = ["full", "fold", "extra-traits", "visit"] proc-macro2 = "1.0.37" blake2 = { version = "0.10.4", default-features = false } proc-macro-crate = "1.1.3" -Inflector = "0.11.4" [dev-dependencies] assert_matches = "1.3.0" diff --git a/primitives/api/proc-macro/src/utils.rs b/primitives/api/proc-macro/src/utils.rs index 48d94170d28ff..57ef88f244f4d 100644 --- a/primitives/api/proc-macro/src/utils.rs +++ b/primitives/api/proc-macro/src/utils.rs @@ -22,8 +22,6 @@ use syn::{ ImplItem, ItemImpl, Pat, Path, PathArguments, Result, ReturnType, Signature, Type, TypePath, }; -use inflector::Inflector; - use quote::{format_ident, quote}; use std::env; @@ -300,18 +298,6 @@ pub fn filter_cfg_attributes(attrs: &[syn::Attribute]) -> Vec { attrs.iter().filter(|a| a.path.is_ident("cfg")).cloned().collect() } -/// Generate the documentation getter function name for the given ident. -pub fn generate_decl_docs_getter(ident: &Ident, is_trait: bool) -> Ident { - if is_trait { - // Avoid collisions for `trait Metadata { fn metadata() }` by - // prefixing traits with `trait_`. - let ident_snake_name = Ident::new(&ident.to_string().to_snake_case(), ident.span()); - return format_ident!("trait_{}_decl_runtime_docs", ident_snake_name) - } - - format_ident!("{}_decl_runtime_docs", ident) -} - #[cfg(test)] mod tests { use assert_matches::assert_matches; From 5ddfc5527f21b6139a9d599816f40261a6d8040e Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Tue, 7 Feb 2023 17:00:51 +0200 Subject: [PATCH 30/75] frame/support: Adjust runtime metadata test Signed-off-by: Alexandru Vasile --- frame/support/test/tests/runtime_metadata.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/frame/support/test/tests/runtime_metadata.rs b/frame/support/test/tests/runtime_metadata.rs index d477a39de2e76..64b921c102217 100644 --- a/frame/support/test/tests/runtime_metadata.rs +++ b/frame/support/test/tests/runtime_metadata.rs @@ -125,7 +125,7 @@ fn runtime_metadata() { v15::MethodMetadata { name: "test", inputs: vec![v15::ParamMetadata:: { - name: "_data", + name: "data", ty: meta_type::(), }], output: meta_type::<()>(), @@ -134,7 +134,7 @@ fn runtime_metadata() { v15::MethodMetadata { name: "something_with_block", inputs: vec![v15::ParamMetadata:: { - name: "_", + name: "block", ty: meta_type::(), }], output: meta_type::(), @@ -143,8 +143,8 @@ fn runtime_metadata() { v15::MethodMetadata { name: "function_with_two_args", inputs: vec![ - v15::ParamMetadata:: { name: "_", ty: meta_type::() }, - v15::ParamMetadata:: { name: "_", ty: meta_type::() }, + v15::ParamMetadata:: { name: "data", ty: meta_type::() }, + v15::ParamMetadata:: { name: "block", ty: meta_type::() }, ], output: meta_type::<()>(), docs: vec![], @@ -183,7 +183,7 @@ fn runtime_metadata() { v15::MethodMetadata { name: "execute_block", inputs: vec![v15::ParamMetadata:: { - name: "_", + name: "block", ty: meta_type::(), }], output: meta_type::<()>(), @@ -192,7 +192,7 @@ fn runtime_metadata() { v15::MethodMetadata { name: "initialize_block", inputs: vec![v15::ParamMetadata:: { - name: "_", + name: "header", ty: meta_type::<&::Header>(), }], output: meta_type::<()>(), @@ -205,6 +205,7 @@ fn runtime_metadata() { }, ]; - let runtime_metadata = Runtime::runtime_metadata(); + let rt = Runtime; + let runtime_metadata = (&rt).runtime_metadata(); assert_eq!(runtime_metadata, expected_runtime_metadata); } From 6511a2fd923026fd506582b307bd30d07e442b2c Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Tue, 7 Feb 2023 17:05:19 +0200 Subject: [PATCH 31/75] primitives/tests: Remove doc getter test Signed-off-by: Alexandru Vasile --- primitives/api/Cargo.toml | 2 +- primitives/api/test/tests/decl_and_impl.rs | 22 ---------------------- 2 files changed, 1 insertion(+), 23 deletions(-) diff --git a/primitives/api/Cargo.toml b/primitives/api/Cargo.toml index fa33843f74078..143356a8c4ab3 100644 --- a/primitives/api/Cargo.toml +++ b/primitives/api/Cargo.toml @@ -56,4 +56,4 @@ std = [ # This sets the max logging level to `off` for `log`. disable-logging = ["log/max_level_off"] # Do not report the documentation in the metadata. -no-metadata-docs = [] \ No newline at end of file +no-metadata-docs = [] diff --git a/primitives/api/test/tests/decl_and_impl.rs b/primitives/api/test/tests/decl_and_impl.rs index 1946ec0371559..42628830cc7fa 100644 --- a/primitives/api/test/tests/decl_and_impl.rs +++ b/primitives/api/test/tests/decl_and_impl.rs @@ -40,14 +40,9 @@ decl_runtime_apis! { fn wild_card(_: u32); } - /// ApiWithCustomVersion trait documentation - /// - /// Documentation on multiline. #[api_version(2)] pub trait ApiWithCustomVersion { - /// same_name version 2. fn same_name(); - /// same_name version 1. #[changed_in(2)] fn same_name() -> String; } @@ -171,23 +166,6 @@ fn test_client_side_function_signature() { ) -> Result = RuntimeApiImpl::::same_name_before_version_2; } -#[test] -fn check_runtime_api_docs() { - // No documentation available for the `Api` trait. - assert!(runtime_decl_for_Api::trait_api_decl_runtime_docs().is_empty()); - - assert_eq!( - vec![" ApiWithCustomVersion trait documentation", "", " Documentation on multiline."], - runtime_decl_for_ApiWithCustomVersion::trait_api_with_custom_version_decl_runtime_docs() - ); - - // Docs are collected only for the last version of methods. - assert_eq!( - vec![" same_name version 2."], - runtime_decl_for_ApiWithCustomVersion::same_name_decl_runtime_docs() - ); -} - #[test] fn check_runtime_api_info() { assert_eq!(&>::ID, &runtime_decl_for_Api::ID); From aeb125f9b3f865dbc40a9bbb872e690f28c2f512 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Tue, 7 Feb 2023 17:07:40 +0200 Subject: [PATCH 32/75] frame/support: Enable `no-metadata-docs` feature from `sp-api` Signed-off-by: Alexandru Vasile --- frame/support/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frame/support/Cargo.toml b/frame/support/Cargo.toml index e524000feaf3e..94ee05b56edd7 100644 --- a/frame/support/Cargo.toml +++ b/frame/support/Cargo.toml @@ -72,7 +72,7 @@ runtime-benchmarks = [] try-runtime = [] # By default some types have documentation, `no-metadata-docs` allows to reduce the documentation # in the metadata. -no-metadata-docs = ["frame-support-procedural/no-metadata-docs"] +no-metadata-docs = ["frame-support-procedural/no-metadata-docs", "sp-api/no-metadata-docs"] # By default some types have documentation, `full-metadata-docs` allows to add documentation to # more types in the metadata. full-metadata-docs = ["scale-info/docs"] From cb05db63446a279b902742e7f1c4c9bd6eff8cad Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Tue, 7 Feb 2023 17:37:48 +0200 Subject: [PATCH 33/75] primitives/tests: Add `TypeInfo` for test::extrinsic Signed-off-by: Alexandru Vasile --- Cargo.lock | 1 + primitives/test-primitives/Cargo.toml | 2 ++ primitives/test-primitives/src/lib.rs | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index a557db905f3c5..a439984a1d999 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10282,6 +10282,7 @@ name = "sp-test-primitives" version = "2.0.0" dependencies = [ "parity-scale-codec", + "scale-info", "serde", "sp-application-crypto", "sp-core", diff --git a/primitives/test-primitives/Cargo.toml b/primitives/test-primitives/Cargo.toml index deb120104b717..f6d57ce70fc05 100644 --- a/primitives/test-primitives/Cargo.toml +++ b/primitives/test-primitives/Cargo.toml @@ -13,6 +13,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.2.2", default-features = false, features = ["derive"] } +scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } serde = { version = "1.0.136", features = ["derive"], optional = true } sp-application-crypto = { version = "7.0.0", default-features = false, path = "../application-crypto" } sp-core = { version = "7.0.0", default-features = false, path = "../core" } @@ -28,4 +29,5 @@ std = [ "sp-application-crypto/std", "sp-core/std", "sp-runtime/std", + "scale-info/std", ] diff --git a/primitives/test-primitives/src/lib.rs b/primitives/test-primitives/src/lib.rs index 9779fe2393c35..0b85c47c1d4ee 100644 --- a/primitives/test-primitives/src/lib.rs +++ b/primitives/test-primitives/src/lib.rs @@ -28,7 +28,7 @@ pub use sp_core::{hash::H256, RuntimeDebug}; use sp_runtime::traits::{BlakeTwo256, Extrinsic as ExtrinsicT, Verify}; /// Extrinsic for test-runtime. -#[derive(Clone, PartialEq, Eq, Encode, Decode, RuntimeDebug)] +#[derive(Clone, PartialEq, Eq, Encode, Decode, RuntimeDebug, scale_info::TypeInfo)] pub enum Extrinsic { IncludeData(Vec), StorageChange(Vec, Option>), From 4c8287dc98b16d5db0986c1e0adda537b443183f Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 16 Mar 2023 14:35:13 +0200 Subject: [PATCH 34/75] primitives/api: Expose scale-info and frame-metadata Signed-off-by: Alexandru Vasile --- primitives/api/src/lib.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/primitives/api/src/lib.rs b/primitives/api/src/lib.rs index ff101c3add947..a4bcad1d4d83e 100644 --- a/primitives/api/src/lib.rs +++ b/primitives/api/src/lib.rs @@ -73,9 +73,13 @@ extern crate self as sp_api; #[doc(hidden)] pub use codec::{self, Decode, DecodeLimit, Encode}; #[doc(hidden)] +pub use frame_metadata as metadata; +#[doc(hidden)] #[cfg(feature = "std")] pub use hash_db::Hasher; #[doc(hidden)] +pub use scale_info; +#[doc(hidden)] #[cfg(not(feature = "std"))] pub use sp_core::to_substrate_wasm_fn_return_value; use sp_core::OpaqueMetadata; @@ -101,7 +105,7 @@ pub use sp_state_machine::{ StorageProof, TrieBackend, TrieBackendBuilder, }; #[doc(hidden)] -pub use sp_std::{mem, slice}; +pub use sp_std::{mem, slice, vec}; #[doc(hidden)] pub use sp_version::{create_apis_vec, ApiId, ApisVec, RuntimeVersion}; #[cfg(feature = "std")] From e894ab0dc8ae4f98b56a50f6499dfe1da87dfed2 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 16 Mar 2023 15:12:22 +0200 Subject: [PATCH 35/75] Update frame-metadata to include v15 Signed-off-by: Alexandru Vasile --- Cargo.lock | 2 +- frame/support/Cargo.toml | 2 +- primitives/api/Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 919a2073433be..86cfa83936ae2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2323,7 +2323,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "15.0.0" -source = "git+https://github.com/paritytech/frame-metadata/?branch=lexnv/md_v15_test#35b8304e004f9a759aa2663e24c5f56e2a50c301" +source = "git+https://github.com/paritytech/frame-metadata/?branch=lexnv/md_v15#3f176938c7a6c569d7608aa02efa0def93476675" dependencies = [ "cfg-if", "parity-scale-codec", diff --git a/frame/support/Cargo.toml b/frame/support/Cargo.toml index 6b7a2c99d0456..e562b80ece565 100644 --- a/frame/support/Cargo.toml +++ b/frame/support/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] serde = { version = "1.0.136", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.2.2", default-features = false, features = ["derive", "max-encoded-len"] } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } -frame-metadata = { version = "15.0.0", git = "https://github.com/paritytech/frame-metadata/", branch = "lexnv/md_v15_test", default-features = false, features = ["v14", "v15-unstable"] } +frame-metadata = { version = "15.0.0", git = "https://github.com/paritytech/frame-metadata/", branch = "lexnv/md_v15", default-features = false, features = ["v14", "v15-unstable"] } sp-api = { version = "4.0.0-dev", default-features = false, path = "../../primitives/api" } sp-std = { version = "5.0.0", default-features = false, path = "../../primitives/std" } sp-io = { version = "7.0.0", default-features = false, path = "../../primitives/io" } diff --git a/primitives/api/Cargo.toml b/primitives/api/Cargo.toml index a63df8fc7279b..1a1ef768868e4 100644 --- a/primitives/api/Cargo.toml +++ b/primitives/api/Cargo.toml @@ -24,7 +24,7 @@ sp-trie = { version = "7.0.0", default-features = false, optional = true, path = hash-db = { version = "0.16.0", optional = true } thiserror = { version = "1.0.30", optional = true } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } -frame-metadata = { version = "15.0.0", git = "https://github.com/paritytech/frame-metadata/", branch = "lexnv/md_v15_test", default-features = false, features = ["v14", "v15-unstable"] } +frame-metadata = { version = "15.0.0", git = "https://github.com/paritytech/frame-metadata/", branch = "lexnv/md_v15", default-features = false, features = ["v14", "v15-unstable"] } log = { version = "0.4.17", default-features = false } From a6bfa9a224d457ad12b0b28c02c6f902d8f101b9 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 16 Mar 2023 15:38:24 +0200 Subject: [PATCH 36/75] Fix merge conflicts Signed-off-by: Alexandru Vasile --- .../src/construct_runtime/expand/metadata.rs | 39 ------------------- .../procedural/src/construct_runtime/mod.rs | 2 +- .../api/proc-macro/src/runtime_metadata.rs | 12 +++--- primitives/consensus/beefy/src/lib.rs | 2 +- 4 files changed, 8 insertions(+), 47 deletions(-) diff --git a/frame/support/procedural/src/construct_runtime/expand/metadata.rs b/frame/support/procedural/src/construct_runtime/expand/metadata.rs index 214ceeb062ea2..ba6a621af7523 100644 --- a/frame/support/procedural/src/construct_runtime/expand/metadata.rs +++ b/frame/support/procedural/src/construct_runtime/expand/metadata.rs @@ -112,45 +112,6 @@ pub fn expand_runtime_metadata( pub fn metadata_versions() -> #scrate::sp_std::vec::Vec { #scrate::metadata_ir::supported_versions() } - - pub fn metadata_at_version(version: u32) -> Option<#scrate::OpaqueMetadata> { - match version { - // The V14 version is already implemented by `construct_runtime!` macro. - 14 => Some(#scrate::OpaqueMetadata::new(#runtime::metadata().into())), - 15 => Some(#scrate::OpaqueMetadata::new(#runtime::metadata_v15().into())), - _ => None, - } - } - - pub fn metadata_versions() -> #scrate::sp_std::vec::Vec { - #scrate::sp_std::vec![ 14 ] - } - - fn metadata_v15() -> #scrate::metadata::RuntimeMetadataPrefixed { - let rt = #runtime; - - #scrate::metadata::v15::RuntimeMetadataLastVersion::new( - #scrate::sp_std::vec![ #(#pallets),* ], - #scrate::metadata::ExtrinsicMetadata { - ty: #scrate::scale_info::meta_type::<#extrinsic>(), - version: <#extrinsic as #scrate::sp_runtime::traits::ExtrinsicMetadata>::VERSION, - signed_extensions: < - < - #extrinsic as #scrate::sp_runtime::traits::ExtrinsicMetadata - >::SignedExtensions as #scrate::sp_runtime::traits::SignedExtension - >::metadata() - .into_iter() - .map(|meta| #scrate::metadata::SignedExtensionMetadata { - identifier: meta.identifier, - ty: meta.ty, - additional_signed: meta.additional_signed, - }) - .collect(), - }, - #scrate::scale_info::meta_type::<#runtime>(), - (&rt).runtime_metadata(), - ).into() - } } } } diff --git a/frame/support/procedural/src/construct_runtime/mod.rs b/frame/support/procedural/src/construct_runtime/mod.rs index 621a35184e9bd..8abcb95eff847 100644 --- a/frame/support/procedural/src/construct_runtime/mod.rs +++ b/frame/support/procedural/src/construct_runtime/mod.rs @@ -291,7 +291,7 @@ fn construct_runtime_final_expansion( trait InternalConstructRuntime { #[inline(always)] - fn runtime_metadata(&self) -> #scrate::sp_std::vec::Vec<#scrate::metadata::v15::TraitMetadata> { + fn runtime_metadata(&self) -> #scrate::sp_std::vec::Vec<#scrate::metadata::v15::RuntimeApiMetadata> { Default::default() } } diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index 09b6b36a0fdbe..8fb41f4e8cbb2 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -110,7 +110,7 @@ pub fn generate_decl_runtime_metadata(decl: &ItemTrait, crate_: &TokenStream) -> collect_where_bounds(ty).map(|ty_elem| where_clause.push(ty_elem)); inputs.push(quote!( - #crate_::metadata::v15::ParamMetadata { + #crate_::metadata::v15::RuntimeApiMethodParamMetadata { name: #name, ty: #crate_::scale_info::meta_type::<#ty>(), } @@ -125,7 +125,7 @@ pub fn generate_decl_runtime_metadata(decl: &ItemTrait, crate_: &TokenStream) -> }, }; - // String method name including quotes for constructing `v15::MethodMetadata`. + // String method name including quotes for constructing `v15::RuntimeApiMethodMetadata`. let method_name = format!("{}", signature.ident); let docs = collect_docs(&method.attrs, &crate_); @@ -133,7 +133,7 @@ pub fn generate_decl_runtime_metadata(decl: &ItemTrait, crate_: &TokenStream) -> let attrs = filter_cfg_attributes(&method.attrs); methods.push(quote!( #( #attrs )* - #crate_::metadata::v15::MethodMetadata { + #crate_::metadata::v15::RuntimeApiMethodMetadata { name: #method_name, inputs: #crate_::vec![ #( #inputs, )* ], output: #output, @@ -166,10 +166,10 @@ pub fn generate_decl_runtime_metadata(decl: &ItemTrait, crate_: &TokenStream) -> quote!( #( #attrs )* #[inline(always)] - pub fn runtime_metadata #generics () -> #crate_::metadata::v15::TraitMetadata + pub fn runtime_metadata #generics () -> #crate_::metadata::v15::RuntimeApiMetadata where #( #where_clause, )* { - #crate_::metadata::v15::TraitMetadata { + #crate_::metadata::v15::RuntimeApiMetadata { name: #trait_name, methods: #crate_::vec![ #( #methods, )* ], docs: #docs, @@ -241,7 +241,7 @@ pub fn generate_impl_runtime_metadata( Ok(quote!( trait InternalImplRuntimeApis { #[inline(always)] - fn runtime_metadata(&self) -> #crate_::vec::Vec<#crate_::metadata::v15::TraitMetadata> { + fn runtime_metadata(&self) -> #crate_::vec::Vec<#crate_::metadata::v15::RuntimeApiMetadata> { #crate_::vec![ #( #metadata, )* ] } } diff --git a/primitives/consensus/beefy/src/lib.rs b/primitives/consensus/beefy/src/lib.rs index cc5d1e8cb9a3b..268e1925b4449 100644 --- a/primitives/consensus/beefy/src/lib.rs +++ b/primitives/consensus/beefy/src/lib.rs @@ -284,7 +284,7 @@ impl OnNewValidatorSet for () { /// the runtime API boundary this type is unknown and as such we keep this /// opaque representation, implementors of the runtime API will have to make /// sure that all usages of `OpaqueKeyOwnershipProof` refer to the same type. -#[derive(Decode, Encode, PartialEq)] +#[derive(Decode, Encode, PartialEq, TypeInfo)] pub struct OpaqueKeyOwnershipProof(Vec); impl OpaqueKeyOwnershipProof { /// Create a new `OpaqueKeyOwnershipProof` using the given encoded From bd9be6ddbcdd790e2751361be406ee8deb59e962 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 16 Mar 2023 15:56:20 +0200 Subject: [PATCH 37/75] frame/metadata_ir: Add IR for runtime API metadata Signed-off-by: Alexandru Vasile --- .../src/construct_runtime/expand/metadata.rs | 3 +- frame/support/src/metadata_ir/mod.rs | 1 + frame/support/src/metadata_ir/types.rs | 71 +++++++++++++++++++ 3 files changed, 74 insertions(+), 1 deletion(-) diff --git a/frame/support/procedural/src/construct_runtime/expand/metadata.rs b/frame/support/procedural/src/construct_runtime/expand/metadata.rs index ba6a621af7523..5bb4a1c765e41 100644 --- a/frame/support/procedural/src/construct_runtime/expand/metadata.rs +++ b/frame/support/procedural/src/construct_runtime/expand/metadata.rs @@ -95,7 +95,8 @@ pub fn expand_runtime_metadata( }) .collect(), }, - ty: #scrate::scale_info::meta_type::<#runtime>() + ty: #scrate::scale_info::meta_type::<#runtime>(), + runtime: #scrate::sp_std::vec![], } } diff --git a/frame/support/src/metadata_ir/mod.rs b/frame/support/src/metadata_ir/mod.rs index bab205d63c118..17d1be6809a2d 100644 --- a/frame/support/src/metadata_ir/mod.rs +++ b/frame/support/src/metadata_ir/mod.rs @@ -67,6 +67,7 @@ mod test { signed_extensions: vec![], }, ty: meta_type::<()>(), + runtime: vec![], } } diff --git a/frame/support/src/metadata_ir/types.rs b/frame/support/src/metadata_ir/types.rs index 087fd3dcad249..c84c1254f79bc 100644 --- a/frame/support/src/metadata_ir/types.rs +++ b/frame/support/src/metadata_ir/types.rs @@ -37,6 +37,77 @@ pub struct MetadataIR { pub extrinsic: ExtrinsicMetadataIR, /// The type of the `Runtime`. pub ty: T::Type, + /// Metadata of the Runtime API. + pub runtime: Vec>, +} + +/// Metadata of a runtime trait. +#[derive(Clone, PartialEq, Eq, Encode, Debug)] +pub struct RuntimeApiMetadataIR { + /// Trait name. + pub name: T::String, + /// Trait methods. + pub methods: Vec>, + /// Trait documentation. + pub docs: Vec, +} + +impl IntoPortable for RuntimeApiMetadataIR { + type Output = RuntimeApiMetadataIR; + + fn into_portable(self, registry: &mut Registry) -> Self::Output { + RuntimeApiMetadataIR { + name: self.name.into_portable(registry), + methods: registry.map_into_portable(self.methods), + docs: registry.map_into_portable(self.docs), + } + } +} + +/// Metadata of a runtime method. +#[derive(Clone, PartialEq, Eq, Encode, Debug)] +pub struct RuntimeApiMethodMetadataIR { + /// Method name. + pub name: T::String, + /// Method parameters. + pub inputs: Vec>, + /// Method output. + pub output: T::Type, + /// Method documentation. + pub docs: Vec, +} + +impl IntoPortable for RuntimeApiMethodMetadataIR { + type Output = RuntimeApiMethodMetadataIR; + + fn into_portable(self, registry: &mut Registry) -> Self::Output { + RuntimeApiMethodMetadataIR { + name: self.name.into_portable(registry), + inputs: registry.map_into_portable(self.inputs), + output: registry.register_type(&self.output), + docs: registry.map_into_portable(self.docs), + } + } +} + +/// Metadata of a runtime method parameter. +#[derive(Clone, PartialEq, Eq, Encode, Debug)] +pub struct RuntimeApiMethodParamMetadataIR { + /// Parameter name. + pub name: T::String, + /// Parameter type. + pub ty: T::Type, +} + +impl IntoPortable for RuntimeApiMethodParamMetadataIR { + type Output = RuntimeApiMethodParamMetadataIR; + + fn into_portable(self, registry: &mut Registry) -> Self::Output { + RuntimeApiMethodParamMetadataIR { + name: self.name.into_portable(registry), + ty: registry.register_type(&self.ty), + } + } } /// The intermediate representation for a pallet metadata. From a7a54605ec8d3ccb47e0c47881bbe9683fbbb787 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 16 Mar 2023 16:59:52 +0200 Subject: [PATCH 38/75] frame/metadata_ir: Convert IR to V15 Signed-off-by: Alexandru Vasile --- frame/support/src/metadata_ir/mod.rs | 20 ++- frame/support/src/metadata_ir/types.rs | 2 +- frame/support/src/metadata_ir/v15.rs | 188 +++++++++++++++++++++++++ 3 files changed, 208 insertions(+), 2 deletions(-) create mode 100644 frame/support/src/metadata_ir/v15.rs diff --git a/frame/support/src/metadata_ir/mod.rs b/frame/support/src/metadata_ir/mod.rs index 17d1be6809a2d..59ab21f8de682 100644 --- a/frame/support/src/metadata_ir/mod.rs +++ b/frame/support/src/metadata_ir/mod.rs @@ -22,9 +22,12 @@ use frame_metadata::{RuntimeMetadataPrefixed, RuntimeMetadataV14}; pub use types::*; mod v14; +mod v15; /// Metadata V14. const V14: u32 = 14; +/// Metadata V15. +const V15: u32 = u32::MAX; /// Transform the IR to the specified version. /// @@ -36,13 +39,18 @@ pub fn into_version(metadata: MetadataIR, version: u32) -> Option { + let v15: frame_metadata::v15::RuntimeMetadataV15 = metadata.into(); + Some(v15.into()) + }, _ => None, } } /// Returns the supported metadata versions. pub fn supported_versions() -> sp_std::vec::Vec { - sp_std::vec![V14,] + sp_std::vec![V14, V15] } /// Transform the IR to the latest stable metadata version. @@ -80,4 +88,14 @@ mod test { assert!(matches!(metadata.1, RuntimeMetadata::V14(_))); } + + #[test] + fn into_version_15() { + let ir = ir_metadata(); + let metadata = into_version(ir, V15).expect("Should return prefixed metadata"); + + assert_eq!(metadata.0, META_RESERVED); + + assert!(matches!(metadata.1, RuntimeMetadata::V15(_))); + } } diff --git a/frame/support/src/metadata_ir/types.rs b/frame/support/src/metadata_ir/types.rs index c84c1254f79bc..57858d6a0194f 100644 --- a/frame/support/src/metadata_ir/types.rs +++ b/frame/support/src/metadata_ir/types.rs @@ -38,7 +38,7 @@ pub struct MetadataIR { /// The type of the `Runtime`. pub ty: T::Type, /// Metadata of the Runtime API. - pub runtime: Vec>, + pub runtime: Vec>, } /// Metadata of a runtime trait. diff --git a/frame/support/src/metadata_ir/v15.rs b/frame/support/src/metadata_ir/v15.rs new file mode 100644 index 0000000000000..6023daa457120 --- /dev/null +++ b/frame/support/src/metadata_ir/v15.rs @@ -0,0 +1,188 @@ +// 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. + +//! Convert the IR to V15 metadata. + +use super::types::{ + ExtrinsicMetadataIR, MetadataIR, PalletCallMetadataIR, PalletConstantMetadataIR, + PalletErrorMetadataIR, PalletEventMetadataIR, PalletMetadataIR, PalletStorageMetadataIR, + RuntimeApiMetadataIR, RuntimeApiMethodMetadataIR, RuntimeApiMethodParamMetadataIR, + SignedExtensionMetadataIR, StorageEntryMetadataIR, StorageEntryModifierIR, StorageEntryTypeIR, + StorageHasherIR, +}; + +use frame_metadata::v15::{ + ExtrinsicMetadata, PalletCallMetadata, PalletConstantMetadata, PalletErrorMetadata, + PalletEventMetadata, PalletMetadata, PalletStorageMetadata, RuntimeApiMetadata, + RuntimeApiMethodMetadata, RuntimeApiMethodParamMetadata, RuntimeMetadataV15, + SignedExtensionMetadata, StorageEntryMetadata, StorageEntryModifier, StorageEntryType, + StorageHasher, +}; + +impl From for RuntimeMetadataV15 { + fn from(ir: MetadataIR) -> Self { + RuntimeMetadataV15::new( + ir.pallets.into_iter().map(Into::into).collect(), + ir.extrinsic.into(), + ir.ty, + ir.runtime.into_iter().map(Into::into).collect(), + ) + } +} + +impl From for RuntimeApiMetadata { + fn from(ir: RuntimeApiMetadataIR) -> Self { + RuntimeApiMetadata { + name: ir.name, + methods: ir.methods.into_iter().map(Into::into).collect(), + docs: ir.docs, + } + } +} + +impl From for RuntimeApiMethodMetadata { + fn from(ir: RuntimeApiMethodMetadataIR) -> Self { + RuntimeApiMethodMetadata { + name: ir.name, + inputs: ir.inputs.into_iter().map(Into::into).collect(), + output: ir.output, + docs: ir.docs, + } + } +} + +impl From for RuntimeApiMethodParamMetadata { + fn from(ir: RuntimeApiMethodParamMetadataIR) -> Self { + RuntimeApiMethodParamMetadata { name: ir.name, ty: ir.ty } + } +} + +impl From for PalletMetadata { + fn from(ir: PalletMetadataIR) -> Self { + PalletMetadata { + name: ir.name, + storage: ir.storage.map(Into::into), + calls: ir.calls.map(Into::into), + event: ir.event.map(Into::into), + constants: ir.constants.into_iter().map(Into::into).collect(), + error: ir.error.map(Into::into), + index: ir.index, + docs: ir.docs, + } + } +} + +impl From for StorageEntryModifier { + fn from(ir: StorageEntryModifierIR) -> Self { + match ir { + StorageEntryModifierIR::Optional => StorageEntryModifier::Optional, + StorageEntryModifierIR::Default => StorageEntryModifier::Default, + } + } +} + +impl From for StorageHasher { + fn from(ir: StorageHasherIR) -> Self { + match ir { + StorageHasherIR::Blake2_128 => StorageHasher::Blake2_128, + StorageHasherIR::Blake2_256 => StorageHasher::Blake2_256, + StorageHasherIR::Blake2_128Concat => StorageHasher::Blake2_128Concat, + StorageHasherIR::Twox128 => StorageHasher::Twox128, + StorageHasherIR::Twox256 => StorageHasher::Twox256, + StorageHasherIR::Twox64Concat => StorageHasher::Twox64Concat, + StorageHasherIR::Identity => StorageHasher::Identity, + } + } +} + +impl From for StorageEntryType { + fn from(ir: StorageEntryTypeIR) -> Self { + match ir { + StorageEntryTypeIR::Plain(ty) => StorageEntryType::Plain(ty), + StorageEntryTypeIR::Map { hashers, key, value } => StorageEntryType::Map { + hashers: hashers.into_iter().map(Into::into).collect(), + key, + value, + }, + } + } +} + +impl From for StorageEntryMetadata { + fn from(ir: StorageEntryMetadataIR) -> Self { + StorageEntryMetadata { + name: ir.name, + modifier: ir.modifier.into(), + ty: ir.ty.into(), + default: ir.default, + docs: ir.docs, + } + } +} + +impl From for PalletStorageMetadata { + fn from(ir: PalletStorageMetadataIR) -> Self { + PalletStorageMetadata { + prefix: ir.prefix, + entries: ir.entries.into_iter().map(Into::into).collect(), + } + } +} + +impl From for PalletCallMetadata { + fn from(ir: PalletCallMetadataIR) -> Self { + PalletCallMetadata { ty: ir.ty } + } +} + +impl From for PalletEventMetadata { + fn from(ir: PalletEventMetadataIR) -> Self { + PalletEventMetadata { ty: ir.ty } + } +} + +impl From for PalletConstantMetadata { + fn from(ir: PalletConstantMetadataIR) -> Self { + PalletConstantMetadata { name: ir.name, ty: ir.ty, value: ir.value, docs: ir.docs } + } +} + +impl From for PalletErrorMetadata { + fn from(ir: PalletErrorMetadataIR) -> Self { + PalletErrorMetadata { ty: ir.ty } + } +} + +impl From for SignedExtensionMetadata { + fn from(ir: SignedExtensionMetadataIR) -> Self { + SignedExtensionMetadata { + identifier: ir.identifier, + ty: ir.ty, + additional_signed: ir.additional_signed, + } + } +} + +impl From for ExtrinsicMetadata { + fn from(ir: ExtrinsicMetadataIR) -> Self { + ExtrinsicMetadata { + ty: ir.ty, + version: ir.version, + signed_extensions: ir.signed_extensions.into_iter().map(Into::into).collect(), + } + } +} From c99200b9facaa0c27c315695a379274d58bdfe26 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 16 Mar 2023 17:12:44 +0200 Subject: [PATCH 39/75] primitives/api: Collect IR metadata for runtime API Signed-off-by: Alexandru Vasile --- .../src/construct_runtime/expand/metadata.rs | 4 +++- .../procedural/src/construct_runtime/mod.rs | 2 +- .../api/proc-macro/src/runtime_metadata.rs | 16 ++++++++-------- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/frame/support/procedural/src/construct_runtime/expand/metadata.rs b/frame/support/procedural/src/construct_runtime/expand/metadata.rs index 5bb4a1c765e41..61bea04cef53e 100644 --- a/frame/support/procedural/src/construct_runtime/expand/metadata.rs +++ b/frame/support/procedural/src/construct_runtime/expand/metadata.rs @@ -77,6 +77,8 @@ pub fn expand_runtime_metadata( quote! { impl #runtime { fn metadata_ir() -> #scrate::metadata_ir::MetadataIR { + let rt = #runtime; + #scrate::metadata_ir::MetadataIR { pallets: #scrate::sp_std::vec![ #(#pallets),* ], extrinsic: #scrate::metadata_ir::ExtrinsicMetadataIR { @@ -96,7 +98,7 @@ pub fn expand_runtime_metadata( .collect(), }, ty: #scrate::scale_info::meta_type::<#runtime>(), - runtime: #scrate::sp_std::vec![], + runtime: (&rt).runtime_metadata(), } } diff --git a/frame/support/procedural/src/construct_runtime/mod.rs b/frame/support/procedural/src/construct_runtime/mod.rs index 8abcb95eff847..59072d044e9b8 100644 --- a/frame/support/procedural/src/construct_runtime/mod.rs +++ b/frame/support/procedural/src/construct_runtime/mod.rs @@ -291,7 +291,7 @@ fn construct_runtime_final_expansion( trait InternalConstructRuntime { #[inline(always)] - fn runtime_metadata(&self) -> #scrate::sp_std::vec::Vec<#scrate::metadata::v15::RuntimeApiMetadata> { + fn runtime_metadata(&self) -> #scrate::sp_std::vec::Vec<#scrate::metadata_ir::RuntimeApiMetadataIR> { Default::default() } } diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index 8fb41f4e8cbb2..a6b6c7da13983 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -86,8 +86,8 @@ pub fn generate_decl_runtime_metadata(decl: &ItemTrait, crate_: &TokenStream) -> for item in &decl.items { // Collect metadata for methods only. let syn::TraitItem::Method(method) = item else { - continue - }; + continue + }; // Collect metadata only for the latest methods. let is_changed_in = @@ -101,7 +101,7 @@ pub fn generate_decl_runtime_metadata(decl: &ItemTrait, crate_: &TokenStream) -> for input in &signature.inputs { // Exclude `self` from metadata collection. let syn::FnArg::Typed(typed) = input else { - continue + continue }; let pat = &typed.pat; @@ -110,7 +110,7 @@ pub fn generate_decl_runtime_metadata(decl: &ItemTrait, crate_: &TokenStream) -> collect_where_bounds(ty).map(|ty_elem| where_clause.push(ty_elem)); inputs.push(quote!( - #crate_::metadata::v15::RuntimeApiMethodParamMetadata { + #crate_::metadata_ir::RuntimeApiMethodParamMetadataIR { name: #name, ty: #crate_::scale_info::meta_type::<#ty>(), } @@ -133,7 +133,7 @@ pub fn generate_decl_runtime_metadata(decl: &ItemTrait, crate_: &TokenStream) -> let attrs = filter_cfg_attributes(&method.attrs); methods.push(quote!( #( #attrs )* - #crate_::metadata::v15::RuntimeApiMethodMetadata { + #crate_::metadata_ir::RuntimeApiMethodMetadataIR { name: #method_name, inputs: #crate_::vec![ #( #inputs, )* ], output: #output, @@ -166,10 +166,10 @@ pub fn generate_decl_runtime_metadata(decl: &ItemTrait, crate_: &TokenStream) -> quote!( #( #attrs )* #[inline(always)] - pub fn runtime_metadata #generics () -> #crate_::metadata::v15::RuntimeApiMetadata + pub fn runtime_metadata #generics () -> #crate_::metadata_ir::RuntimeApiMetadataIR where #( #where_clause, )* { - #crate_::metadata::v15::RuntimeApiMetadata { + #crate_::metadata_ir::RuntimeApiMetadataIR { name: #trait_name, methods: #crate_::vec![ #( #methods, )* ], docs: #docs, @@ -241,7 +241,7 @@ pub fn generate_impl_runtime_metadata( Ok(quote!( trait InternalImplRuntimeApis { #[inline(always)] - fn runtime_metadata(&self) -> #crate_::vec::Vec<#crate_::metadata::v15::RuntimeApiMetadata> { + fn runtime_metadata(&self) -> #crate_::vec::Vec<#crate_::metadata_ir::RuntimeApiMetadataIR> { #crate_::vec![ #( #metadata, )* ] } } From bc801f9eaa89df666aa33f7983de3e568aa1a30d Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 16 Mar 2023 17:17:01 +0200 Subject: [PATCH 40/75] primitives/api: Move `metadata_ir` from frame/support Signed-off-by: Alexandru Vasile --- frame/support/src/lib.rs | 2 +- primitives/api/src/lib.rs | 1 + {frame/support => primitives/api}/src/metadata_ir/mod.rs | 0 {frame/support => primitives/api}/src/metadata_ir/types.rs | 0 {frame/support => primitives/api}/src/metadata_ir/v14.rs | 0 {frame/support => primitives/api}/src/metadata_ir/v15.rs | 0 6 files changed, 2 insertions(+), 1 deletion(-) rename {frame/support => primitives/api}/src/metadata_ir/mod.rs (100%) rename {frame/support => primitives/api}/src/metadata_ir/types.rs (100%) rename {frame/support => primitives/api}/src/metadata_ir/v14.rs (100%) rename {frame/support => primitives/api}/src/metadata_ir/v15.rs (100%) diff --git a/frame/support/src/lib.rs b/frame/support/src/lib.rs index b845828455793..66e88a0615246 100644 --- a/frame/support/src/lib.rs +++ b/frame/support/src/lib.rs @@ -50,6 +50,7 @@ pub use paste; pub use scale_info; #[cfg(feature = "std")] pub use serde; +pub use sp_api::metadata_ir; pub use sp_core::{OpaqueMetadata, Void}; #[doc(hidden)] pub use sp_core_hashing_proc_macro; @@ -80,7 +81,6 @@ pub mod error; pub mod crypto; pub mod dispatch_context; pub mod instances; -pub mod metadata_ir; pub mod migrations; pub mod traits; pub mod weights; diff --git a/primitives/api/src/lib.rs b/primitives/api/src/lib.rs index a4bcad1d4d83e..81e03b7590226 100644 --- a/primitives/api/src/lib.rs +++ b/primitives/api/src/lib.rs @@ -110,6 +110,7 @@ pub use sp_std::{mem, slice, vec}; pub use sp_version::{create_apis_vec, ApiId, ApisVec, RuntimeVersion}; #[cfg(feature = "std")] use std::cell::RefCell; +pub mod metadata_ir; /// Maximum nesting level for extrinsics. pub const MAX_EXTRINSIC_DEPTH: u32 = 256; diff --git a/frame/support/src/metadata_ir/mod.rs b/primitives/api/src/metadata_ir/mod.rs similarity index 100% rename from frame/support/src/metadata_ir/mod.rs rename to primitives/api/src/metadata_ir/mod.rs diff --git a/frame/support/src/metadata_ir/types.rs b/primitives/api/src/metadata_ir/types.rs similarity index 100% rename from frame/support/src/metadata_ir/types.rs rename to primitives/api/src/metadata_ir/types.rs diff --git a/frame/support/src/metadata_ir/v14.rs b/primitives/api/src/metadata_ir/v14.rs similarity index 100% rename from frame/support/src/metadata_ir/v14.rs rename to primitives/api/src/metadata_ir/v14.rs diff --git a/frame/support/src/metadata_ir/v15.rs b/primitives/api/src/metadata_ir/v15.rs similarity index 100% rename from frame/support/src/metadata_ir/v15.rs rename to primitives/api/src/metadata_ir/v15.rs From a0695037fce056fd67d0b76fb5c60a137e79f6ef Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 16 Mar 2023 17:34:42 +0200 Subject: [PATCH 41/75] frame/tests: Adjust testing Signed-off-by: Alexandru Vasile --- frame/support/test/tests/runtime_metadata.rs | 47 ++++++++++++-------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/frame/support/test/tests/runtime_metadata.rs b/frame/support/test/tests/runtime_metadata.rs index 64b921c102217..f073f14107125 100644 --- a/frame/support/test/tests/runtime_metadata.rs +++ b/frame/support/test/tests/runtime_metadata.rs @@ -15,7 +15,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -use frame_support::{metadata::*, traits::ConstU32}; +use frame_support::{ + metadata_ir::{ + RuntimeApiMetadataIR, RuntimeApiMethodMetadataIR, RuntimeApiMethodParamMetadataIR, + }, + traits::ConstU32, +}; use scale_info::{form::MetaForm, meta_type}; use sp_runtime::traits::Block as BlockT; @@ -119,45 +124,51 @@ fn runtime_metadata() { } let expected_runtime_metadata = vec![ - v15::TraitMetadata { + RuntimeApiMetadataIR { name: "Api", methods: vec![ - v15::MethodMetadata { + RuntimeApiMethodMetadataIR { name: "test", - inputs: vec![v15::ParamMetadata:: { + inputs: vec![RuntimeApiMethodParamMetadataIR:: { name: "data", ty: meta_type::(), }], output: meta_type::<()>(), docs: vec![], }, - v15::MethodMetadata { + RuntimeApiMethodMetadataIR { name: "something_with_block", - inputs: vec![v15::ParamMetadata:: { + inputs: vec![RuntimeApiMethodParamMetadataIR:: { name: "block", ty: meta_type::(), }], output: meta_type::(), docs: maybe_docs(vec![" something_with_block."]), }, - v15::MethodMetadata { + RuntimeApiMethodMetadataIR { name: "function_with_two_args", inputs: vec![ - v15::ParamMetadata:: { name: "data", ty: meta_type::() }, - v15::ParamMetadata:: { name: "block", ty: meta_type::() }, + RuntimeApiMethodParamMetadataIR:: { + name: "data", + ty: meta_type::(), + }, + RuntimeApiMethodParamMetadataIR:: { + name: "block", + ty: meta_type::(), + }, ], output: meta_type::<()>(), docs: vec![], }, - v15::MethodMetadata { + RuntimeApiMethodMetadataIR { name: "same_name", inputs: vec![], output: meta_type::<()>(), docs: vec![], }, - v15::MethodMetadata { + RuntimeApiMethodMetadataIR { name: "wild_card", - inputs: vec![v15::ParamMetadata:: { + inputs: vec![RuntimeApiMethodParamMetadataIR:: { name: "_", ty: meta_type::(), }], @@ -171,27 +182,27 @@ fn runtime_metadata() { " Documentation on multiline.", ]), }, - v15::TraitMetadata { + RuntimeApiMetadataIR { name: "Core", methods: vec![ - v15::MethodMetadata { + RuntimeApiMethodMetadataIR { name: "version", inputs: vec![], output: meta_type::(), docs: maybe_docs(vec![" Returns the version of the runtime."]), }, - v15::MethodMetadata { + RuntimeApiMethodMetadataIR { name: "execute_block", - inputs: vec![v15::ParamMetadata:: { + inputs: vec![RuntimeApiMethodParamMetadataIR:: { name: "block", ty: meta_type::(), }], output: meta_type::<()>(), docs: maybe_docs(vec![" Execute the given block."]), }, - v15::MethodMetadata { + RuntimeApiMethodMetadataIR { name: "initialize_block", - inputs: vec![v15::ParamMetadata:: { + inputs: vec![RuntimeApiMethodParamMetadataIR:: { name: "header", ty: meta_type::<&::Header>(), }], From 436a3e2dd0cca893363f5af8b3cd42d173bb3f9d Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 16 Mar 2023 18:56:23 +0200 Subject: [PATCH 42/75] frame/tests: Adjust `metadata_versions` test Signed-off-by: Alexandru Vasile --- frame/support/test/tests/pallet.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frame/support/test/tests/pallet.rs b/frame/support/test/tests/pallet.rs index b9e531fb42105..191a0e3c71763 100644 --- a/frame/support/test/tests/pallet.rs +++ b/frame/support/test/tests/pallet.rs @@ -1616,7 +1616,7 @@ fn metadata_at_version() { #[test] fn metadata_versions() { - assert_eq!(vec![LATEST_METADATA_VERSION], Runtime::metadata_versions()); + assert_eq!(vec![LATEST_METADATA_VERSION, u32::MAX], Runtime::metadata_versions()); } #[test] From 24dfc28ebacc11e48a6695aed4791cd3cc9e0eb6 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Tue, 21 Mar 2023 15:23:03 +0200 Subject: [PATCH 43/75] primitives/runtime_metadata: Exclude default type parameters from methods Signed-off-by: Alexandru Vasile --- primitives/api/proc-macro/src/runtime_metadata.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index a6b6c7da13983..d10fc76cd03ca 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -156,6 +156,9 @@ pub fn generate_decl_runtime_metadata(decl: &ItemTrait, crate_: &TokenStream) -> // `scale_info::meta_type` requires `T: ?Sized + TypeInfo + 'static` bounds. ty.bounds.push(parse_quote!(#crate_::scale_info::TypeInfo)); ty.bounds.push(parse_quote!('static)); + // Default type parameters are not allowed in functions. + ty.eq_token = None; + ty.default = None; } let where_clause: Vec<_> = where_clause From 37872896e9bbf86e0076e80245c46aaa07961c85 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Date: Wed, 29 Mar 2023 17:51:55 +0300 Subject: [PATCH 44/75] Update primitives/api/proc-macro/src/runtime_metadata.rs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bastian Köcher --- primitives/api/proc-macro/src/runtime_metadata.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index d10fc76cd03ca..da7f1dacda702 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -51,7 +51,7 @@ fn collect_where_bounds(ty: &syn::Type) -> Option { _ => ty, }; - return Some(ty_elem.clone()) + Some(ty_elem.clone()) } /// Extract the documentation from the provided attributes. From b64cfe5b5893a316bf41f3acf4a9e44888d3fa58 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Date: Wed, 29 Mar 2023 17:52:08 +0300 Subject: [PATCH 45/75] Update primitives/api/src/metadata_ir/types.rs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bastian Köcher --- primitives/api/src/metadata_ir/types.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/primitives/api/src/metadata_ir/types.rs b/primitives/api/src/metadata_ir/types.rs index 57858d6a0194f..93ee54891d89f 100644 --- a/primitives/api/src/metadata_ir/types.rs +++ b/primitives/api/src/metadata_ir/types.rs @@ -38,7 +38,7 @@ pub struct MetadataIR { /// The type of the `Runtime`. pub ty: T::Type, /// Metadata of the Runtime API. - pub runtime: Vec>, + pub apis: Vec>, } /// Metadata of a runtime trait. From 36519ca22e463e67ca7d2008a44b4d652635bf6e Mon Sep 17 00:00:00 2001 From: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Date: Wed, 29 Mar 2023 17:52:16 +0300 Subject: [PATCH 46/75] Update primitives/api/src/metadata_ir/mod.rs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bastian Köcher --- primitives/api/src/metadata_ir/mod.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/primitives/api/src/metadata_ir/mod.rs b/primitives/api/src/metadata_ir/mod.rs index 59ab21f8de682..e0d4f7503d383 100644 --- a/primitives/api/src/metadata_ir/mod.rs +++ b/primitives/api/src/metadata_ir/mod.rs @@ -27,6 +27,8 @@ mod v15; /// Metadata V14. const V14: u32 = 14; /// Metadata V15. +/// +/// Not yet stable, thus we set it to `u32::MAX`. const V15: u32 = u32::MAX; /// Transform the IR to the specified version. From c6c5336558b96d6c7821339a54ed5779875b85fe Mon Sep 17 00:00:00 2001 From: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Date: Wed, 29 Mar 2023 17:52:32 +0300 Subject: [PATCH 47/75] Update primitives/api/proc-macro/src/utils.rs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bastian Köcher --- primitives/api/proc-macro/src/utils.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/primitives/api/proc-macro/src/utils.rs b/primitives/api/proc-macro/src/utils.rs index 6a542a406ba9f..b3ea56de1c31e 100644 --- a/primitives/api/proc-macro/src/utils.rs +++ b/primitives/api/proc-macro/src/utils.rs @@ -267,11 +267,7 @@ pub fn get_doc_literals(attrs: &[syn::Attribute]) -> Vec { return None }; - if meta.path.get_ident().map_or(false, |ident| ident == "doc") { - Some(meta.lit) - } else { - None - } + meta.path.get_ident().filter(|ident| ident == "doc").map(|_| meta.lit) }) .collect() } From e48afb1d52d90ddcf0378a8ee522596bf34aee71 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Date: Wed, 29 Mar 2023 17:53:02 +0300 Subject: [PATCH 48/75] Update primitives/api/proc-macro/src/runtime_metadata.rs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bastian Köcher --- primitives/api/proc-macro/src/runtime_metadata.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index da7f1dacda702..1b2d175315a9a 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -242,6 +242,7 @@ pub fn generate_impl_runtime_metadata( } Ok(quote!( + #[doc(hidden)] trait InternalImplRuntimeApis { #[inline(always)] fn runtime_metadata(&self) -> #crate_::vec::Vec<#crate_::metadata_ir::RuntimeApiMetadataIR> { From 4f5ae6d4af64a9efc171deb1ec4b78d983ab619c Mon Sep 17 00:00:00 2001 From: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Date: Wed, 29 Mar 2023 17:53:15 +0300 Subject: [PATCH 49/75] Update primitives/api/proc-macro/src/runtime_metadata.rs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bastian Köcher --- primitives/api/proc-macro/src/runtime_metadata.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index 1b2d175315a9a..0b272e8326493 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -249,6 +249,7 @@ pub fn generate_impl_runtime_metadata( #crate_::vec![ #( #metadata, )* ] } } + #[doc(hidden)] impl InternalImplRuntimeApis for #runtime_name {} )) } From 8b1b3cf5a14fdc3ef713fc6064cae19e009cd979 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Date: Wed, 29 Mar 2023 17:53:40 +0300 Subject: [PATCH 50/75] Update primitives/api/proc-macro/src/runtime_metadata.rs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bastian Köcher --- primitives/api/proc-macro/src/runtime_metadata.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index 0b272e8326493..e2ebe0d61ec85 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -105,7 +105,7 @@ pub fn generate_decl_runtime_metadata(decl: &ItemTrait, crate_: &TokenStream) -> }; let pat = &typed.pat; - let name = format!("{}", quote!(#pat)); + let name = quote!(#pat).to_string(); let ty = &typed.ty; collect_where_bounds(ty).map(|ty_elem| where_clause.push(ty_elem)); From 6ee1a09ac44c6216b6176f1cd57928e48a1cf51d Mon Sep 17 00:00:00 2001 From: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Date: Wed, 29 Mar 2023 17:53:54 +0300 Subject: [PATCH 51/75] Update primitives/api/proc-macro/src/runtime_metadata.rs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bastian Köcher --- primitives/api/proc-macro/src/runtime_metadata.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index e2ebe0d61ec85..7e81e3a514d41 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -126,7 +126,7 @@ pub fn generate_decl_runtime_metadata(decl: &ItemTrait, crate_: &TokenStream) -> }; // String method name including quotes for constructing `v15::RuntimeApiMethodMetadata`. - let method_name = format!("{}", signature.ident); + let method_name = signature.ident.to_string(); let docs = collect_docs(&method.attrs, &crate_); // Include the method metadata only if its `cfg` features are enabled. From f0d857a464de28704c62828e90cbfc587770326a Mon Sep 17 00:00:00 2001 From: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Date: Wed, 29 Mar 2023 17:54:11 +0300 Subject: [PATCH 52/75] Update primitives/api/proc-macro/src/runtime_metadata.rs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bastian Köcher --- primitives/api/proc-macro/src/runtime_metadata.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index 7e81e3a514d41..de8bb0ff237e8 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -143,7 +143,7 @@ pub fn generate_decl_runtime_metadata(decl: &ItemTrait, crate_: &TokenStream) -> } let trait_name_ident = &decl.ident; - let trait_name = format!("{}", trait_name_ident); + let trait_name = trait_name_ident.to_string(); let docs = collect_docs(&decl.attrs, &crate_); let attrs = filter_cfg_attributes(&decl.attrs); // The trait generics where already extended with `Block: BlockT`. From 24f8c640f876e2caddb3bb05bbcc09bba1264661 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Date: Wed, 29 Mar 2023 17:54:35 +0300 Subject: [PATCH 53/75] Update primitives/api/proc-macro/src/runtime_metadata.rs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bastian Köcher --- primitives/api/proc-macro/src/runtime_metadata.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index de8bb0ff237e8..de50faca7eaf6 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -161,10 +161,9 @@ pub fn generate_decl_runtime_metadata(decl: &ItemTrait, crate_: &TokenStream) -> ty.default = None; } - let where_clause: Vec<_> = where_clause + let where_clause = where_clause .iter() - .map(|ty| quote!(#ty: #crate_::scale_info::TypeInfo + 'static)) - .collect(); + .map(|ty| quote!(#ty: #crate_::scale_info::TypeInfo + 'static)); quote!( #( #attrs )* From fa2a51781e91131f22a4a635aa287fa453046e2e Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Wed, 29 Mar 2023 20:21:27 +0300 Subject: [PATCH 54/75] primitives: Fix build Signed-off-by: Alexandru Vasile --- primitives/api/proc-macro/src/utils.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/primitives/api/proc-macro/src/utils.rs b/primitives/api/proc-macro/src/utils.rs index b3ea56de1c31e..cffaf317fbb10 100644 --- a/primitives/api/proc-macro/src/utils.rs +++ b/primitives/api/proc-macro/src/utils.rs @@ -264,10 +264,10 @@ pub fn get_doc_literals(attrs: &[syn::Attribute]) -> Vec { .iter() .filter_map(|attr| { let Ok(syn::Meta::NameValue(meta)) = attr.parse_meta() else { - return None - }; + return None + }; - meta.path.get_ident().filter(|ident| ident == "doc").map(|_| meta.lit) + meta.path.get_ident().filter(|ident| *ident == "doc").map(|_| meta.lit) }) .collect() } From e6888b906557eb103547407e60cc7ce773ee220f Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Wed, 29 Mar 2023 20:35:37 +0300 Subject: [PATCH 55/75] primitives/metadata-ir: Move IR to dedicated crate Signed-off-by: Alexandru Vasile --- Cargo.lock | 10 ++++++++++ Cargo.toml | 1 + primitives/metadata-ir/Cargo.toml | 19 +++++++++++++++++++ .../mod.rs => metadata-ir/src/lib.rs} | 2 +- .../metadata_ir => metadata-ir/src}/types.rs | 0 .../metadata_ir => metadata-ir/src}/v14.rs | 0 .../metadata_ir => metadata-ir/src}/v15.rs | 2 +- 7 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 primitives/metadata-ir/Cargo.toml rename primitives/{api/src/metadata_ir/mod.rs => metadata-ir/src/lib.rs} (99%) rename primitives/{api/src/metadata_ir => metadata-ir/src}/types.rs (100%) rename primitives/{api/src/metadata_ir => metadata-ir/src}/v14.rs (100%) rename primitives/{api/src/metadata_ir => metadata-ir/src}/v15.rs (99%) diff --git a/Cargo.lock b/Cargo.lock index 850170b673ed6..f2e5e11f78cdc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10362,6 +10362,16 @@ dependencies = [ "zstd", ] +[[package]] +name = "sp-metadata-ir" +version = "0.1.0" +dependencies = [ + "frame-metadata", + "parity-scale-codec", + "scale-info", + "sp-std", +] + [[package]] name = "sp-mmr-primitives" version = "4.0.0-dev" diff --git a/Cargo.toml b/Cargo.toml index de562ad79e47e..cae8976cca4a9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -202,6 +202,7 @@ members = [ "primitives/keystore", "primitives/maybe-compressed-blob", "primitives/merkle-mountain-range", + "primitives/metadata-ir", "primitives/npos-elections", "primitives/npos-elections/fuzzer", "primitives/offchain", diff --git a/primitives/metadata-ir/Cargo.toml b/primitives/metadata-ir/Cargo.toml new file mode 100644 index 0000000000000..463f00eebb70c --- /dev/null +++ b/primitives/metadata-ir/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "sp-metadata-ir" +version = "0.1.0" +authors = ["Parity Technologies "] +edition = "2021" +license = "Apache-2.0" +homepage = "https://substrate.io" +repository = "https://github.com/paritytech/substrate/" +description = "Intermediate representation of the runtime metadata." +documentation = "https://docs.rs/sp-metadata-ir" + +[package.metadata.docs.rs] +targets = ["x86_64-unknown-linux-gnu"] + +[dependencies] +codec = { package = "parity-scale-codec", version = "3.2.2", default-features = false } +frame-metadata = { version = "15.0.0", git = "https://github.com/paritytech/frame-metadata/", branch = "lexnv/md_v15", default-features = false, features = ["v14", "v15-unstable"] } +scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } +sp-std = { version = "5.0.0", default-features = false, path = "../std" } diff --git a/primitives/api/src/metadata_ir/mod.rs b/primitives/metadata-ir/src/lib.rs similarity index 99% rename from primitives/api/src/metadata_ir/mod.rs rename to primitives/metadata-ir/src/lib.rs index e0d4f7503d383..46f7beb22b6cc 100644 --- a/primitives/api/src/metadata_ir/mod.rs +++ b/primitives/metadata-ir/src/lib.rs @@ -77,7 +77,7 @@ mod test { signed_extensions: vec![], }, ty: meta_type::<()>(), - runtime: vec![], + apis: vec![], } } diff --git a/primitives/api/src/metadata_ir/types.rs b/primitives/metadata-ir/src/types.rs similarity index 100% rename from primitives/api/src/metadata_ir/types.rs rename to primitives/metadata-ir/src/types.rs diff --git a/primitives/api/src/metadata_ir/v14.rs b/primitives/metadata-ir/src/v14.rs similarity index 100% rename from primitives/api/src/metadata_ir/v14.rs rename to primitives/metadata-ir/src/v14.rs diff --git a/primitives/api/src/metadata_ir/v15.rs b/primitives/metadata-ir/src/v15.rs similarity index 99% rename from primitives/api/src/metadata_ir/v15.rs rename to primitives/metadata-ir/src/v15.rs index 6023daa457120..86441228d008e 100644 --- a/primitives/api/src/metadata_ir/v15.rs +++ b/primitives/metadata-ir/src/v15.rs @@ -39,7 +39,7 @@ impl From for RuntimeMetadataV15 { ir.pallets.into_iter().map(Into::into).collect(), ir.extrinsic.into(), ir.ty, - ir.runtime.into_iter().map(Into::into).collect(), + ir.apis.into_iter().map(Into::into).collect(), ) } } From 4c924353975e0291c1f0ad86bad7140e49f61e47 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Wed, 29 Mar 2023 20:51:55 +0300 Subject: [PATCH 56/75] primitives: Reexport metadata-ir and frame-metadata Signed-off-by: Alexandru Vasile --- Cargo.lock | 2 +- primitives/api/Cargo.toml | 5 ++--- primitives/api/src/lib.rs | 5 ++--- primitives/metadata-ir/Cargo.toml | 9 +++++++++ primitives/metadata-ir/src/lib.rs | 5 ++++- 5 files changed, 18 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f2e5e11f78cdc..6335fadbd98dd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9925,13 +9925,13 @@ dependencies = [ name = "sp-api" version = "4.0.0-dev" dependencies = [ - "frame-metadata", "hash-db", "log", "parity-scale-codec", "scale-info", "sp-api-proc-macro", "sp-core", + "sp-metadata-ir", "sp-runtime", "sp-state-machine", "sp-std", diff --git a/primitives/api/Cargo.toml b/primitives/api/Cargo.toml index 1a1ef768868e4..55e3993466a6d 100644 --- a/primitives/api/Cargo.toml +++ b/primitives/api/Cargo.toml @@ -24,8 +24,7 @@ sp-trie = { version = "7.0.0", default-features = false, optional = true, path = hash-db = { version = "0.16.0", optional = true } thiserror = { version = "1.0.30", optional = true } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } -frame-metadata = { version = "15.0.0", git = "https://github.com/paritytech/frame-metadata/", branch = "lexnv/md_v15", default-features = false, features = ["v14", "v15-unstable"] } - +sp-metadata-ir = { version = "0.1.0", default-features = false, path = "../metadata-ir" } log = { version = "0.4.17", default-features = false } [dev-dependencies] @@ -45,7 +44,7 @@ std = [ "thiserror", "log/std", "scale-info/std", - "frame-metadata/std", + "sp-metadata-ir/std", ] # Special feature to disable logging completly. # diff --git a/primitives/api/src/lib.rs b/primitives/api/src/lib.rs index 81e03b7590226..02770280f7b90 100644 --- a/primitives/api/src/lib.rs +++ b/primitives/api/src/lib.rs @@ -73,8 +73,6 @@ extern crate self as sp_api; #[doc(hidden)] pub use codec::{self, Decode, DecodeLimit, Encode}; #[doc(hidden)] -pub use frame_metadata as metadata; -#[doc(hidden)] #[cfg(feature = "std")] pub use hash_db::Hasher; #[doc(hidden)] @@ -86,6 +84,8 @@ use sp_core::OpaqueMetadata; #[doc(hidden)] pub use sp_core::{offchain, ExecutionContext}; #[doc(hidden)] +pub use sp_metadata_ir::{self as metadata_ir, frame_metadata as metadata}; +#[doc(hidden)] #[cfg(feature = "std")] pub use sp_runtime::StateVersion; #[doc(hidden)] @@ -110,7 +110,6 @@ pub use sp_std::{mem, slice, vec}; pub use sp_version::{create_apis_vec, ApiId, ApisVec, RuntimeVersion}; #[cfg(feature = "std")] use std::cell::RefCell; -pub mod metadata_ir; /// Maximum nesting level for extrinsics. pub const MAX_EXTRINSIC_DEPTH: u32 = 256; diff --git a/primitives/metadata-ir/Cargo.toml b/primitives/metadata-ir/Cargo.toml index 463f00eebb70c..d786edddaa54d 100644 --- a/primitives/metadata-ir/Cargo.toml +++ b/primitives/metadata-ir/Cargo.toml @@ -17,3 +17,12 @@ codec = { package = "parity-scale-codec", version = "3.2.2", default-features = frame-metadata = { version = "15.0.0", git = "https://github.com/paritytech/frame-metadata/", branch = "lexnv/md_v15", default-features = false, features = ["v14", "v15-unstable"] } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } sp-std = { version = "5.0.0", default-features = false, path = "../std" } + +[features] +default = ["std"] +std = [ + "codec/std", + "frame-metadata/std", + "scale-info/std", + "sp-std/std", +] diff --git a/primitives/metadata-ir/src/lib.rs b/primitives/metadata-ir/src/lib.rs index 46f7beb22b6cc..8ebaf603d2f47 100644 --- a/primitives/metadata-ir/src/lib.rs +++ b/primitives/metadata-ir/src/lib.rs @@ -17,6 +17,10 @@ //! Intermediate representation of the runtime metadata. +// Re-export. +#[doc(hidden)] +pub use frame_metadata; + mod types; use frame_metadata::{RuntimeMetadataPrefixed, RuntimeMetadataV14}; pub use types::*; @@ -64,7 +68,6 @@ pub fn into_latest(metadata: MetadataIR) -> RuntimeMetadataPrefixed { #[cfg(test)] mod test { use super::*; - use crate::metadata_ir::ExtrinsicMetadataIR; use frame_metadata::{v14::META_RESERVED, RuntimeMetadata}; use scale_info::meta_type; From e496815919e226e4ac812e1a8b27956174e8becf Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Wed, 29 Mar 2023 20:58:52 +0300 Subject: [PATCH 57/75] frame: Use apis field instead of runtime Signed-off-by: Alexandru Vasile --- .../support/procedural/src/construct_runtime/expand/metadata.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frame/support/procedural/src/construct_runtime/expand/metadata.rs b/frame/support/procedural/src/construct_runtime/expand/metadata.rs index 61bea04cef53e..0bd59537b0171 100644 --- a/frame/support/procedural/src/construct_runtime/expand/metadata.rs +++ b/frame/support/procedural/src/construct_runtime/expand/metadata.rs @@ -98,7 +98,7 @@ pub fn expand_runtime_metadata( .collect(), }, ty: #scrate::scale_info::meta_type::<#runtime>(), - runtime: (&rt).runtime_metadata(), + apis: (&rt).runtime_metadata(), } } From ca77baabcf29f2d4f8ef313e8d4aa0f7f71817a0 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Wed, 29 Mar 2023 21:20:55 +0300 Subject: [PATCH 58/75] Better documentation for the `Deref` abstraction Signed-off-by: Alexandru Vasile --- .../src/construct_runtime/expand/metadata.rs | 16 ++++++++++++++++ .../procedural/src/construct_runtime/mod.rs | 17 +++++++++++++++++ .../api/proc-macro/src/runtime_metadata.rs | 17 +++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/frame/support/procedural/src/construct_runtime/expand/metadata.rs b/frame/support/procedural/src/construct_runtime/expand/metadata.rs index 0bd59537b0171..81fc93ba3c9ef 100644 --- a/frame/support/procedural/src/construct_runtime/expand/metadata.rs +++ b/frame/support/procedural/src/construct_runtime/expand/metadata.rs @@ -77,6 +77,22 @@ pub fn expand_runtime_metadata( quote! { impl #runtime { fn metadata_ir() -> #scrate::metadata_ir::MetadataIR { + // Each runtime must expose the `runtime_metadata()` to fetch the runtime API metadata. + // The function is implemented by calling `impl_runtime_apis!`. + // + // However, the `construct_runtime!` may be called without calling `impl_runtime_apis!`. + // Rely on the `Deref` trait to differentiate between a runtime that implements + // APIs (by macro impl_runtime_apis!) and a runtime that is simply created (by macro construct_runtime!). + // + // Both `InternalConstructRuntime` and `InternalImplRuntimeApis` expose a `runtime_metadata()` function. + // `InternalConstructRuntime` is implemented by the `construct_runtime!` for Runtime references (`& Runtime`), + // while `InternalImplRuntimeApis` is implemented by the `impl_runtime_apis!` for Runtime (`Runtime`). + // + // Therefore, the `Deref` trait will resolve the `runtime_metadata` from `impl_runtime_apis!` + // when both macros are called; and will resolve an empty `runtime_metadata` when only the `construct_runtime!` + // is called. + // + // `Deref` needs a reference for resolving the function call. let rt = #runtime; #scrate::metadata_ir::MetadataIR { diff --git a/frame/support/procedural/src/construct_runtime/mod.rs b/frame/support/procedural/src/construct_runtime/mod.rs index 59072d044e9b8..513eda9a34bab 100644 --- a/frame/support/procedural/src/construct_runtime/mod.rs +++ b/frame/support/procedural/src/construct_runtime/mod.rs @@ -289,12 +289,29 @@ fn construct_runtime_final_expansion( type RuntimeBlock = #block; } + // Each runtime must expose the `runtime_metadata()` to fetch the runtime API metadata. + // The function is implemented by calling `impl_runtime_apis!`. + // + // However, the `construct_runtime!` may be called without calling `impl_runtime_apis!`. + // Rely on the `Deref` trait to differentiate between a runtime that implements + // APIs (by macro impl_runtime_apis!) and a runtime that is simply created (by macro construct_runtime!). + // + // Both `InternalConstructRuntime` and `InternalImplRuntimeApis` expose a `runtime_metadata()` function. + // `InternalConstructRuntime` is implemented by the `construct_runtime!` for Runtime references (`& Runtime`), + // while `InternalImplRuntimeApis` is implemented by the `impl_runtime_apis!` for Runtime (`Runtime`). + // + // Therefore, the `Deref` trait will resolve the `runtime_metadata` from `impl_runtime_apis!` + // when both macros are called; and will resolve an empty `runtime_metadata` when only the `construct_runtime!` + // is called. + + #[doc(hidden)] trait InternalConstructRuntime { #[inline(always)] fn runtime_metadata(&self) -> #scrate::sp_std::vec::Vec<#scrate::metadata_ir::RuntimeApiMetadataIR> { Default::default() } } + #[doc(hidden)] impl InternalConstructRuntime for &#name {} #outer_event diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index de50faca7eaf6..29bae3db6a227 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -240,6 +240,23 @@ pub fn generate_impl_runtime_metadata( )); } + // Each runtime must expose the `runtime_metadata()` to fetch the runtime API metadata. + // The function is implemented by calling `impl_runtime_apis!`. + // + // However, the `construct_runtime!` may be called without calling `impl_runtime_apis!`. + // Rely on the `Deref` trait to differentiate between a runtime that implements + // APIs (by macro impl_runtime_apis!) and a runtime that is simply created (by macro + // construct_runtime!). + // + // Both `InternalConstructRuntime` and `InternalImplRuntimeApis` expose a `runtime_metadata()` + // function. `InternalConstructRuntime` is implemented by the `construct_runtime!` for Runtime + // references (`& Runtime`), while `InternalImplRuntimeApis` is implemented by the + // `impl_runtime_apis!` for Runtime (`Runtime`). + // + // Therefore, the `Deref` trait will resolve the `runtime_metadata` from `impl_runtime_apis!` + // when both macros are called; and will resolve an empty `runtime_metadata` when only the + // `construct_runtime!` is called. + Ok(quote!( #[doc(hidden)] trait InternalImplRuntimeApis { From cf78a7190ad9cba3c3bb2e78dc3d0dc382b2fea9 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 30 Mar 2023 13:45:05 +0300 Subject: [PATCH 59/75] ui-tests: Check empty `impl_runtime_apis` Signed-off-by: Alexandru Vasile --- .../test/tests/impl_runtime_apis_ui.rs | 35 +++++++++++++++++++ .../empty_runtime_apis.rs | 13 +++++++ 2 files changed, 48 insertions(+) create mode 100644 frame/support/test/tests/impl_runtime_apis_ui.rs create mode 100644 frame/support/test/tests/impl_runtime_apis_ui/empty_runtime_apis.rs diff --git a/frame/support/test/tests/impl_runtime_apis_ui.rs b/frame/support/test/tests/impl_runtime_apis_ui.rs new file mode 100644 index 0000000000000..f15ccb977e86a --- /dev/null +++ b/frame/support/test/tests/impl_runtime_apis_ui.rs @@ -0,0 +1,35 @@ +// 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. + +#[rustversion::attr(not(stable), ignore)] +#[cfg(not(feature = "disable-ui-tests"))] +#[test] +fn impl_runtime_apis_ui() { + // Only run the ui tests when `RUN_UI_TESTS` is set. + if std::env::var("RUN_UI_TESTS").is_err() { + return + } + + // As trybuild is using `cargo check`, we don't need the real WASM binaries. + std::env::set_var("SKIP_WASM_BUILD", "1"); + + // Deny all warnings since we emit warnings as part of a Pallet's UI. + std::env::set_var("RUSTFLAGS", "--deny warnings"); + + let t = trybuild::TestCases::new(); + t.compile_fail("tests/impl_runtime_apis_ui/*.rs"); +} diff --git a/frame/support/test/tests/impl_runtime_apis_ui/empty_runtime_apis.rs b/frame/support/test/tests/impl_runtime_apis_ui/empty_runtime_apis.rs new file mode 100644 index 0000000000000..1ab63a85347aa --- /dev/null +++ b/frame/support/test/tests/impl_runtime_apis_ui/empty_runtime_apis.rs @@ -0,0 +1,13 @@ +use frame_support::impl_runtime_apis; + +// Do not use `construct_runtime!`. +struct Runtime; + +// Empty `impl_runtime_apis!` cannot deduce the Runtime name +// and should not implement the `runtime_metadata()` method. +impl_runtime_apis! {} + +// Expect the test to compile because this has the effect of +// not calling `construct_runtime!` nor `impl_runtime_apis!` +// for the Runtime. +fn main() {} From 5178e38cf21cfb481156eefd628d62989201d59a Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 30 Mar 2023 13:46:19 +0300 Subject: [PATCH 60/75] primitives: Remove unneeded bounds on generic params Signed-off-by: Alexandru Vasile --- primitives/api/proc-macro/src/runtime_metadata.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index 29bae3db6a227..ac28c094f297b 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -152,10 +152,6 @@ pub fn generate_decl_runtime_metadata(decl: &ItemTrait, crate_: &TokenStream) -> let syn::GenericParam::Type(ty) = generic_param else { continue }; - - // `scale_info::meta_type` requires `T: ?Sized + TypeInfo + 'static` bounds. - ty.bounds.push(parse_quote!(#crate_::scale_info::TypeInfo)); - ty.bounds.push(parse_quote!('static)); // Default type parameters are not allowed in functions. ty.eq_token = None; ty.default = None; From be551937b9f97e7803742f8bc4856c900ab1846b Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 30 Mar 2023 13:52:20 +0300 Subject: [PATCH 61/75] primitives: Rename `collect_where_bounds` to `get_argument_type_param` Signed-off-by: Alexandru Vasile --- .../api/proc-macro/src/runtime_metadata.rs | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index ac28c094f297b..fdeedf4ba4736 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -27,15 +27,12 @@ use crate::{ }, }; -/// Collect extra where bounds on the parameter type. +/// Get the type parameter argument without lifetime or mutability +/// of a runtime metadata function. /// -/// `decl_runtime_apis` macro extends the generics of each trait by adding -/// the generic `Block: BlockT`. -/// -/// If the generic `Block` is present on the parameter type, -/// then returns the type without any lifetimes or mutability. -/// Otherwise, returns `None`. -fn collect_where_bounds(ty: &syn::Type) -> Option { +/// Because `decl_runtime_apis` macro extends the generics of each trait by adding +/// the generic `Block: BlockT`, this expects the `Block` to be present. +fn get_argument_type_param(ty: &syn::Type) -> Option { let ty_string = format!("{}", quote!(#ty)); if !ty_string.contains("Block") { return None @@ -107,7 +104,7 @@ pub fn generate_decl_runtime_metadata(decl: &ItemTrait, crate_: &TokenStream) -> let pat = &typed.pat; let name = quote!(#pat).to_string(); let ty = &typed.ty; - collect_where_bounds(ty).map(|ty_elem| where_clause.push(ty_elem)); + get_argument_type_param(ty).map(|ty_elem| where_clause.push(ty_elem)); inputs.push(quote!( #crate_::metadata_ir::RuntimeApiMethodParamMetadataIR { @@ -120,7 +117,7 @@ pub fn generate_decl_runtime_metadata(decl: &ItemTrait, crate_: &TokenStream) -> let output = match &signature.output { syn::ReturnType::Default => quote!(#crate_::scale_info::meta_type::<()>()), syn::ReturnType::Type(_, ty) => { - collect_where_bounds(ty).map(|ty_elem| where_clause.push(ty_elem)); + get_argument_type_param(ty).map(|ty_elem| where_clause.push(ty_elem)); quote!(#crate_::scale_info::meta_type::<#ty>()) }, }; From 9e1fc7768061b661f70519c200b3a2764f0d85bd Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 30 Mar 2023 13:55:01 +0300 Subject: [PATCH 62/75] primitives: Generate crate access per fn call Signed-off-by: Alexandru Vasile --- primitives/api/proc-macro/src/decl_runtime_apis.rs | 3 +-- primitives/api/proc-macro/src/impl_runtime_apis.rs | 3 +-- primitives/api/proc-macro/src/runtime_metadata.rs | 14 +++++++------- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/primitives/api/proc-macro/src/decl_runtime_apis.rs b/primitives/api/proc-macro/src/decl_runtime_apis.rs index ee0b2d37d0679..43e1e7969c5d1 100644 --- a/primitives/api/proc-macro/src/decl_runtime_apis.rs +++ b/primitives/api/proc-macro/src/decl_runtime_apis.rs @@ -217,12 +217,11 @@ fn parse_renamed_attribute(renamed: &Attribute) -> Result<(String, u32)> { fn generate_runtime_decls(decls: &[ItemTrait]) -> Result { let mut result = Vec::new(); - let crate_ = generate_crate_access(); for decl in decls { let mut decl = decl.clone(); let decl_span = decl.span(); extend_generics_with_block(&mut decl.generics); - let metadata = generate_decl_runtime_metadata(&decl, &crate_); + let metadata = generate_decl_runtime_metadata(&decl); let mod_name = generate_runtime_mod_name_for_trait(&decl.ident); let found_attributes = remove_supported_attributes(&mut decl.attrs); let api_version = diff --git a/primitives/api/proc-macro/src/impl_runtime_apis.rs b/primitives/api/proc-macro/src/impl_runtime_apis.rs index e93b6441f00e1..76eea3c3259c5 100644 --- a/primitives/api/proc-macro/src/impl_runtime_apis.rs +++ b/primitives/api/proc-macro/src/impl_runtime_apis.rs @@ -650,8 +650,7 @@ fn impl_runtime_apis_impl_inner(api_impls: &[ItemImpl]) -> Result { let runtime_api_versions = generate_runtime_api_versions(api_impls)?; let wasm_interface = generate_wasm_interface(api_impls)?; let api_impls_for_runtime_api = generate_api_impl_for_runtime_api(api_impls)?; - let crate_ = generate_crate_access(); - let runtime_metadata = generate_impl_runtime_metadata(api_impls, &crate_)?; + let runtime_metadata = generate_impl_runtime_metadata(api_impls)?; let impl_ = quote!( #base_runtime_api diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index fdeedf4ba4736..316a44ee91cba 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -22,8 +22,8 @@ use syn::{parse_quote, ItemImpl, ItemTrait, Result}; use crate::{ common::CHANGED_IN_ATTRIBUTE, utils::{ - extract_impl_trait, filter_cfg_attributes, generate_runtime_mod_name_for_trait, - get_doc_literals, RequireQualifiedTraitPath, + extract_impl_trait, filter_cfg_attributes, generate_crate_access, + generate_runtime_mod_name_for_trait, get_doc_literals, RequireQualifiedTraitPath, }, }; @@ -67,7 +67,8 @@ fn collect_docs(attrs: &[syn::Attribute], crate_: &TokenStream) -> TokenStream { /// /// The metadata is exposed as a generic function on the hidden module /// of the trait generated by the `decl_runtime_apis`. -pub fn generate_decl_runtime_metadata(decl: &ItemTrait, crate_: &TokenStream) -> TokenStream { +pub fn generate_decl_runtime_metadata(decl: &ItemTrait) -> TokenStream { + let crate_ = generate_crate_access(); let mut methods = Vec::new(); // Ensure that any function parameter that relies on the `BlockT` bounds @@ -178,14 +179,13 @@ pub fn generate_decl_runtime_metadata(decl: &ItemTrait, crate_: &TokenStream) -> /// /// The metadata of each trait is extracted from the generic function /// exposed by `generate_decl_runtime_metadata`. -pub fn generate_impl_runtime_metadata( - impls: &[ItemImpl], - crate_: &TokenStream, -) -> Result { +pub fn generate_impl_runtime_metadata(impls: &[ItemImpl]) -> Result { if impls.is_empty() { return Ok(quote!()) } + let crate_ = generate_crate_access(); + // Get the name of the runtime for which the traits are implemented. let runtime_name = &impls .get(0) From e281bc97573f01d6a2feab7606cf1951a06e05a1 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 30 Mar 2023 14:10:34 +0300 Subject: [PATCH 63/75] Revert "primitives: Remove unneeded bounds on generic params" This reverts commit 5178e38cf21cfb481156eefd628d62989201d59a. --- primitives/api/proc-macro/src/runtime_metadata.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index 316a44ee91cba..58eb9066e8d93 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -150,6 +150,10 @@ pub fn generate_decl_runtime_metadata(decl: &ItemTrait) -> TokenStream { let syn::GenericParam::Type(ty) = generic_param else { continue }; + + // `scale_info::meta_type` requires `T: ?Sized + TypeInfo + 'static` bounds. + ty.bounds.push(parse_quote!(#crate_::scale_info::TypeInfo)); + ty.bounds.push(parse_quote!('static)); // Default type parameters are not allowed in functions. ty.eq_token = None; ty.default = None; From c850d2be3e4cb25a609af1aa6d52e0b2bcbe6ebf Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 30 Mar 2023 14:12:09 +0300 Subject: [PATCH 64/75] metadata-ir: Add no-std Signed-off-by: Alexandru Vasile --- primitives/metadata-ir/src/lib.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/primitives/metadata-ir/src/lib.rs b/primitives/metadata-ir/src/lib.rs index 8ebaf603d2f47..9136ff49f216a 100644 --- a/primitives/metadata-ir/src/lib.rs +++ b/primitives/metadata-ir/src/lib.rs @@ -17,6 +17,9 @@ //! Intermediate representation of the runtime metadata. +#![cfg_attr(not(feature = "std"), no_std)] +#![warn(missing_docs)] + // Re-export. #[doc(hidden)] pub use frame_metadata; From df4d33d2c6ae53ef6ca2a15e5a9320b3abe6083c Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 30 Mar 2023 15:24:50 +0300 Subject: [PATCH 65/75] primitives: Adjust where bounds Signed-off-by: Alexandru Vasile --- .../api/proc-macro/src/runtime_metadata.rs | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index 58eb9066e8d93..fbbcc376f72dc 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -30,14 +30,19 @@ use crate::{ /// Get the type parameter argument without lifetime or mutability /// of a runtime metadata function. /// -/// Because `decl_runtime_apis` macro extends the generics of each trait by adding -/// the generic `Block: BlockT`, this expects the `Block` to be present. -fn get_argument_type_param(ty: &syn::Type) -> Option { - let ty_string = format!("{}", quote!(#ty)); - if !ty_string.contains("Block") { - return None - } - +/// In the following example, both the `AccountId` and `Index` generic +/// type parameters must implement `scale_info::TypeInfo` because they +/// are added into the metadata using `scale_info::meta_type`. +/// +/// ```ignore +/// trait ExampleAccountNonceApi { +/// fn account_nonce<'a>(account: &'a AccountId) -> Index; +/// } +/// ``` +/// +/// Instead of returning `&'a AccountId` for the first parameter, this function +/// returns `AccountId` to place bounds around it. +fn get_type_param(ty: &syn::Type) -> syn::Type { // Remove the lifetime and mutability of the type T to // place bounds around it. let ty_elem = match &ty { @@ -48,7 +53,7 @@ fn get_argument_type_param(ty: &syn::Type) -> Option { _ => ty, }; - Some(ty_elem.clone()) + ty_elem.clone() } /// Extract the documentation from the provided attributes. @@ -105,7 +110,8 @@ pub fn generate_decl_runtime_metadata(decl: &ItemTrait) -> TokenStream { let pat = &typed.pat; let name = quote!(#pat).to_string(); let ty = &typed.ty; - get_argument_type_param(ty).map(|ty_elem| where_clause.push(ty_elem)); + + where_clause.push(get_type_param(ty)); inputs.push(quote!( #crate_::metadata_ir::RuntimeApiMethodParamMetadataIR { @@ -118,7 +124,7 @@ pub fn generate_decl_runtime_metadata(decl: &ItemTrait) -> TokenStream { let output = match &signature.output { syn::ReturnType::Default => quote!(#crate_::scale_info::meta_type::<()>()), syn::ReturnType::Type(_, ty) => { - get_argument_type_param(ty).map(|ty_elem| where_clause.push(ty_elem)); + where_clause.push(get_type_param(ty)); quote!(#crate_::scale_info::meta_type::<#ty>()) }, }; @@ -151,9 +157,6 @@ pub fn generate_decl_runtime_metadata(decl: &ItemTrait) -> TokenStream { continue }; - // `scale_info::meta_type` requires `T: ?Sized + TypeInfo + 'static` bounds. - ty.bounds.push(parse_quote!(#crate_::scale_info::TypeInfo)); - ty.bounds.push(parse_quote!('static)); // Default type parameters are not allowed in functions. ty.eq_token = None; ty.default = None; From beada2c3833ebb67e7f2f4d33c317efcc9e734a6 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 30 Mar 2023 15:43:38 +0300 Subject: [PATCH 66/75] Change `frame-metadata` branch to "origin/main" Signed-off-by: Alexandru Vasile --- frame/support/Cargo.toml | 2 +- primitives/metadata-ir/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frame/support/Cargo.toml b/frame/support/Cargo.toml index 575de97c8deab..b623bc2465afe 100644 --- a/frame/support/Cargo.toml +++ b/frame/support/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] serde = { version = "1.0.136", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.2.2", default-features = false, features = ["derive", "max-encoded-len"] } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } -frame-metadata = { version = "15.0.0", git = "https://github.com/paritytech/frame-metadata/", branch = "lexnv/md_v15", default-features = false, features = ["v14", "v15-unstable"] } +frame-metadata = { version = "15.0.0", git = "https://github.com/paritytech/frame-metadata/", branch = "origin/main", default-features = false, features = ["v14", "v15-unstable"] } sp-api = { version = "4.0.0-dev", default-features = false, path = "../../primitives/api" } sp-std = { version = "5.0.0", default-features = false, path = "../../primitives/std" } sp-io = { version = "7.0.0", default-features = false, path = "../../primitives/io" } diff --git a/primitives/metadata-ir/Cargo.toml b/primitives/metadata-ir/Cargo.toml index d786edddaa54d..5e83d9dd86575 100644 --- a/primitives/metadata-ir/Cargo.toml +++ b/primitives/metadata-ir/Cargo.toml @@ -14,7 +14,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.2.2", default-features = false } -frame-metadata = { version = "15.0.0", git = "https://github.com/paritytech/frame-metadata/", branch = "lexnv/md_v15", default-features = false, features = ["v14", "v15-unstable"] } +frame-metadata = { version = "15.0.0", git = "https://github.com/paritytech/frame-metadata/", branch = "origin/main", default-features = false, features = ["v14", "v15-unstable"] } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } sp-std = { version = "5.0.0", default-features = false, path = "../std" } From bae34a7400aa1366c56b6b2fe39fb09bbb7f8386 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 30 Mar 2023 15:47:21 +0300 Subject: [PATCH 67/75] Update to `main` from origin Signed-off-by: Alexandru Vasile --- Cargo.lock | 2 +- frame/support/Cargo.toml | 2 +- primitives/metadata-ir/Cargo.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5b025ee3e3ef6..6b09993536db4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2396,7 +2396,7 @@ dependencies = [ [[package]] name = "frame-metadata" version = "15.0.0" -source = "git+https://github.com/paritytech/frame-metadata/?branch=lexnv/md_v15#3f176938c7a6c569d7608aa02efa0def93476675" +source = "git+https://github.com/paritytech/frame-metadata/?branch=main#a09bd491757db2c7a62b880d04d7c943e2a36ff9" dependencies = [ "cfg-if", "parity-scale-codec", diff --git a/frame/support/Cargo.toml b/frame/support/Cargo.toml index b623bc2465afe..bcbeacdf9bfb8 100644 --- a/frame/support/Cargo.toml +++ b/frame/support/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] serde = { version = "1.0.136", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.2.2", default-features = false, features = ["derive", "max-encoded-len"] } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } -frame-metadata = { version = "15.0.0", git = "https://github.com/paritytech/frame-metadata/", branch = "origin/main", default-features = false, features = ["v14", "v15-unstable"] } +frame-metadata = { version = "15.0.0", git = "https://github.com/paritytech/frame-metadata/", branch = "main", default-features = false, features = ["v14", "v15-unstable"] } sp-api = { version = "4.0.0-dev", default-features = false, path = "../../primitives/api" } sp-std = { version = "5.0.0", default-features = false, path = "../../primitives/std" } sp-io = { version = "7.0.0", default-features = false, path = "../../primitives/io" } diff --git a/primitives/metadata-ir/Cargo.toml b/primitives/metadata-ir/Cargo.toml index 5e83d9dd86575..3a4de2e7eb80c 100644 --- a/primitives/metadata-ir/Cargo.toml +++ b/primitives/metadata-ir/Cargo.toml @@ -14,7 +14,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.2.2", default-features = false } -frame-metadata = { version = "15.0.0", git = "https://github.com/paritytech/frame-metadata/", branch = "origin/main", default-features = false, features = ["v14", "v15-unstable"] } +frame-metadata = { version = "15.0.0", git = "https://github.com/paritytech/frame-metadata/", branch = "main", default-features = false, features = ["v14", "v15-unstable"] } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } sp-std = { version = "5.0.0", default-features = false, path = "../std" } From 0d9aad12b79b1fd62a6e746c3417da160e5910df Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 30 Mar 2023 16:55:03 +0300 Subject: [PATCH 68/75] Update frame-metadata to crates.io v15.1 Signed-off-by: Alexandru Vasile --- Cargo.lock | 5 +++-- frame/support/Cargo.toml | 2 +- primitives/metadata-ir/Cargo.toml | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6b09993536db4..20be9e63963f9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2395,8 +2395,9 @@ dependencies = [ [[package]] name = "frame-metadata" -version = "15.0.0" -source = "git+https://github.com/paritytech/frame-metadata/?branch=main#a09bd491757db2c7a62b880d04d7c943e2a36ff9" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "878babb0b136e731cc77ec2fd883ff02745ff21e6fb662729953d44923df009c" dependencies = [ "cfg-if", "parity-scale-codec", diff --git a/frame/support/Cargo.toml b/frame/support/Cargo.toml index bcbeacdf9bfb8..7792fdf015ba5 100644 --- a/frame/support/Cargo.toml +++ b/frame/support/Cargo.toml @@ -16,7 +16,7 @@ targets = ["x86_64-unknown-linux-gnu"] serde = { version = "1.0.136", optional = true, features = ["derive"] } codec = { package = "parity-scale-codec", version = "3.2.2", default-features = false, features = ["derive", "max-encoded-len"] } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } -frame-metadata = { version = "15.0.0", git = "https://github.com/paritytech/frame-metadata/", branch = "main", default-features = false, features = ["v14", "v15-unstable"] } +frame-metadata = { version = "15.1.0", default-features = false, features = ["v14", "v15-unstable"] } sp-api = { version = "4.0.0-dev", default-features = false, path = "../../primitives/api" } sp-std = { version = "5.0.0", default-features = false, path = "../../primitives/std" } sp-io = { version = "7.0.0", default-features = false, path = "../../primitives/io" } diff --git a/primitives/metadata-ir/Cargo.toml b/primitives/metadata-ir/Cargo.toml index 3a4de2e7eb80c..27fada9c6f34e 100644 --- a/primitives/metadata-ir/Cargo.toml +++ b/primitives/metadata-ir/Cargo.toml @@ -14,7 +14,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { package = "parity-scale-codec", version = "3.2.2", default-features = false } -frame-metadata = { version = "15.0.0", git = "https://github.com/paritytech/frame-metadata/", branch = "main", default-features = false, features = ["v14", "v15-unstable"] } +frame-metadata = { version = "15.1.0", default-features = false, features = ["v14", "v15-unstable"] } scale-info = { version = "2.1.1", default-features = false, features = ["derive"] } sp-std = { version = "5.0.0", default-features = false, path = "../std" } From 2d76e6d2edbbe5eb07bfa1429ca510755f41ea80 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 30 Mar 2023 16:58:06 +0300 Subject: [PATCH 69/75] Revert "ui-tests: Check empty `impl_runtime_apis`" This reverts commit cf78a7190ad9cba3c3bb2e78dc3d0dc382b2fea9. --- .../test/tests/impl_runtime_apis_ui.rs | 35 ------------------- .../empty_runtime_apis.rs | 13 ------- 2 files changed, 48 deletions(-) delete mode 100644 frame/support/test/tests/impl_runtime_apis_ui.rs delete mode 100644 frame/support/test/tests/impl_runtime_apis_ui/empty_runtime_apis.rs diff --git a/frame/support/test/tests/impl_runtime_apis_ui.rs b/frame/support/test/tests/impl_runtime_apis_ui.rs deleted file mode 100644 index f15ccb977e86a..0000000000000 --- a/frame/support/test/tests/impl_runtime_apis_ui.rs +++ /dev/null @@ -1,35 +0,0 @@ -// 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. - -#[rustversion::attr(not(stable), ignore)] -#[cfg(not(feature = "disable-ui-tests"))] -#[test] -fn impl_runtime_apis_ui() { - // Only run the ui tests when `RUN_UI_TESTS` is set. - if std::env::var("RUN_UI_TESTS").is_err() { - return - } - - // As trybuild is using `cargo check`, we don't need the real WASM binaries. - std::env::set_var("SKIP_WASM_BUILD", "1"); - - // Deny all warnings since we emit warnings as part of a Pallet's UI. - std::env::set_var("RUSTFLAGS", "--deny warnings"); - - let t = trybuild::TestCases::new(); - t.compile_fail("tests/impl_runtime_apis_ui/*.rs"); -} diff --git a/frame/support/test/tests/impl_runtime_apis_ui/empty_runtime_apis.rs b/frame/support/test/tests/impl_runtime_apis_ui/empty_runtime_apis.rs deleted file mode 100644 index 1ab63a85347aa..0000000000000 --- a/frame/support/test/tests/impl_runtime_apis_ui/empty_runtime_apis.rs +++ /dev/null @@ -1,13 +0,0 @@ -use frame_support::impl_runtime_apis; - -// Do not use `construct_runtime!`. -struct Runtime; - -// Empty `impl_runtime_apis!` cannot deduce the Runtime name -// and should not implement the `runtime_metadata()` method. -impl_runtime_apis! {} - -// Expect the test to compile because this has the effect of -// not calling `construct_runtime!` nor `impl_runtime_apis!` -// for the Runtime. -fn main() {} From 3bafb294cbe9745569bf5e5a1a2e6b4a4c1aadc5 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 30 Mar 2023 16:58:14 +0300 Subject: [PATCH 70/75] Move ui test to primitives/ui Signed-off-by: Alexandru Vasile --- .../ui/positive_cases/empty_impl_runtime_apis.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 primitives/api/test/tests/ui/positive_cases/empty_impl_runtime_apis.rs diff --git a/primitives/api/test/tests/ui/positive_cases/empty_impl_runtime_apis.rs b/primitives/api/test/tests/ui/positive_cases/empty_impl_runtime_apis.rs new file mode 100644 index 0000000000000..39d2bc1a96478 --- /dev/null +++ b/primitives/api/test/tests/ui/positive_cases/empty_impl_runtime_apis.rs @@ -0,0 +1,11 @@ +// Do not use `construct_runtime!`. +struct Runtime; + +// Empty `impl_runtime_apis!` cannot deduce the Runtime name +// and should not implement the `runtime_metadata()` method. +sp_api::impl_runtime_apis! {} + +// Expect the test to compile because this has the effect of +// not calling `construct_runtime!` nor `impl_runtime_apis!` +// for the Runtime. +fn main() {} From 27d804440381b70347ee79d2ad19c15fc993e3d4 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Date: Thu, 30 Mar 2023 17:49:14 +0300 Subject: [PATCH 71/75] Update frame/support/test/tests/runtime_metadata.rs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bastian Köcher --- frame/support/test/tests/runtime_metadata.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frame/support/test/tests/runtime_metadata.rs b/frame/support/test/tests/runtime_metadata.rs index f073f14107125..8c04c785a35af 100644 --- a/frame/support/test/tests/runtime_metadata.rs +++ b/frame/support/test/tests/runtime_metadata.rs @@ -1,6 +1,6 @@ // This file is part of Substrate. -// Copyright (C) 2020-2022 Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // SPDX-License-Identifier: Apache-2.0 // Licensed under the Apache License, Version 2.0 (the "License"); From f5518308e3a7b0c452f5cc6646e9b9793d1e2f19 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile <60601340+lexnv@users.noreply.github.com> Date: Thu, 30 Mar 2023 17:49:21 +0300 Subject: [PATCH 72/75] Update primitives/api/proc-macro/src/runtime_metadata.rs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bastian Köcher --- primitives/api/proc-macro/src/runtime_metadata.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index fbbcc376f72dc..f67ae1e060903 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -1,6 +1,6 @@ // This file is part of Substrate. -// Copyright (C) 2018-2022 Parity Technologies (UK) Ltd. +// Copyright (C) Parity Technologies (UK) Ltd. // SPDX-License-Identifier: Apache-2.0 // Licensed under the Apache License, Version 2.0 (the "License"); From b558af5c066f46d6cbd3332d8213572f05df52d8 Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 30 Mar 2023 17:50:20 +0300 Subject: [PATCH 73/75] Test already covered by `empty_impl_runtime_apis_call.stderr` This reverts commit 3bafb294cbe9745569bf5e5a1a2e6b4a4c1aadc5. --- .../ui/positive_cases/empty_impl_runtime_apis.rs | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 primitives/api/test/tests/ui/positive_cases/empty_impl_runtime_apis.rs diff --git a/primitives/api/test/tests/ui/positive_cases/empty_impl_runtime_apis.rs b/primitives/api/test/tests/ui/positive_cases/empty_impl_runtime_apis.rs deleted file mode 100644 index 39d2bc1a96478..0000000000000 --- a/primitives/api/test/tests/ui/positive_cases/empty_impl_runtime_apis.rs +++ /dev/null @@ -1,11 +0,0 @@ -// Do not use `construct_runtime!`. -struct Runtime; - -// Empty `impl_runtime_apis!` cannot deduce the Runtime name -// and should not implement the `runtime_metadata()` method. -sp_api::impl_runtime_apis! {} - -// Expect the test to compile because this has the effect of -// not calling `construct_runtime!` nor `impl_runtime_apis!` -// for the Runtime. -fn main() {} From 6f7675bcc0be5e682f55a29db0e4f9935908aabd Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Thu, 30 Mar 2023 20:51:10 +0300 Subject: [PATCH 74/75] Retriger CI Signed-off-by: Alexandru Vasile --- primitives/metadata-ir/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/primitives/metadata-ir/src/lib.rs b/primitives/metadata-ir/src/lib.rs index 9136ff49f216a..3ddc2911d4c93 100644 --- a/primitives/metadata-ir/src/lib.rs +++ b/primitives/metadata-ir/src/lib.rs @@ -33,6 +33,7 @@ mod v15; /// Metadata V14. const V14: u32 = 14; + /// Metadata V15. /// /// Not yet stable, thus we set it to `u32::MAX`. From 8d582bfc0fd2932330e5a4408208a35736a20b7d Mon Sep 17 00:00:00 2001 From: Alexandru Vasile Date: Tue, 11 Apr 2023 13:29:23 +0300 Subject: [PATCH 75/75] Import `TokenStream` as `TokenStream2` Signed-off-by: Alexandru Vasile --- primitives/api/proc-macro/src/runtime_metadata.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/primitives/api/proc-macro/src/runtime_metadata.rs b/primitives/api/proc-macro/src/runtime_metadata.rs index f67ae1e060903..02b03baeaeee3 100644 --- a/primitives/api/proc-macro/src/runtime_metadata.rs +++ b/primitives/api/proc-macro/src/runtime_metadata.rs @@ -15,7 +15,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -use proc_macro2::TokenStream; +use proc_macro2::TokenStream as TokenStream2; use quote::quote; use syn::{parse_quote, ItemImpl, ItemTrait, Result}; @@ -59,7 +59,7 @@ fn get_type_param(ty: &syn::Type) -> syn::Type { /// Extract the documentation from the provided attributes. /// /// It takes into account the `no-metadata-docs` feature. -fn collect_docs(attrs: &[syn::Attribute], crate_: &TokenStream) -> TokenStream { +fn collect_docs(attrs: &[syn::Attribute], crate_: &TokenStream2) -> TokenStream2 { if cfg!(feature = "no-metadata-docs") { quote!(#crate_::vec![]) } else { @@ -72,7 +72,7 @@ fn collect_docs(attrs: &[syn::Attribute], crate_: &TokenStream) -> TokenStream { /// /// The metadata is exposed as a generic function on the hidden module /// of the trait generated by the `decl_runtime_apis`. -pub fn generate_decl_runtime_metadata(decl: &ItemTrait) -> TokenStream { +pub fn generate_decl_runtime_metadata(decl: &ItemTrait) -> TokenStream2 { let crate_ = generate_crate_access(); let mut methods = Vec::new(); @@ -186,7 +186,7 @@ pub fn generate_decl_runtime_metadata(decl: &ItemTrait) -> TokenStream { /// /// The metadata of each trait is extracted from the generic function /// exposed by `generate_decl_runtime_metadata`. -pub fn generate_impl_runtime_metadata(impls: &[ItemImpl]) -> Result { +pub fn generate_impl_runtime_metadata(impls: &[ItemImpl]) -> Result { if impls.is_empty() { return Ok(quote!()) }