diff --git a/Cargo.lock b/Cargo.lock index fa27c09f1c12b..468f3472d0bd0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6652,9 +6652,9 @@ dependencies = [ [[package]] name = "frame-metadata" -version = "22.0.0" +version = "23.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2753bc34b8cf637f58a4f7c3fcd54e8e588503bc9bba449bd8f5a1ab202b0172" +checksum = "d8c26fcb0454397c522c05fdad5380c4e622f8a875638af33bff5a320d1fc965" dependencies = [ "cfg-if", "parity-scale-codec", @@ -6669,7 +6669,7 @@ dependencies = [ "array-bytes 6.2.2", "const-hex", "docify", - "frame-metadata 22.0.0", + "frame-metadata 23.0.0", "frame-support", "frame-system", "log", @@ -6735,7 +6735,7 @@ dependencies = [ "bitflags 1.3.2", "docify", "environmental", - "frame-metadata 22.0.0", + "frame-metadata 23.0.0", "frame-support-procedural", "frame-system", "impl-trait-for-tuples", @@ -6824,7 +6824,7 @@ version = "3.0.0" dependencies = [ "frame-benchmarking", "frame-executive", - "frame-metadata 22.0.0", + "frame-metadata 23.0.0", "frame-support", "frame-support-test-pallet", "frame-system", @@ -9925,7 +9925,7 @@ checksum = "b3e3e3f549d27d2dc054372f320ddf68045a833fab490563ff70d4cf1b9d91ea" dependencies = [ "array-bytes 9.1.2", "blake3", - "frame-metadata 22.0.0", + "frame-metadata 23.0.0", "parity-scale-codec", "scale-decode 0.16.0", "scale-info", @@ -12034,7 +12034,7 @@ dependencies = [ name = "pallet-example-view-functions" version = "1.0.0" dependencies = [ - "frame-metadata 22.0.0", + "frame-metadata 23.0.0", "frame-support", "frame-system", "log", @@ -23000,7 +23000,7 @@ dependencies = [ name = "sp-metadata-ir" version = "0.6.0" dependencies = [ - "frame-metadata 22.0.0", + "frame-metadata 23.0.0", "parity-scale-codec", "scale-info", ] @@ -24669,7 +24669,7 @@ dependencies = [ "cargo_metadata", "console", "filetime", - "frame-metadata 22.0.0", + "frame-metadata 23.0.0", "jobserver", "merkleized-metadata", "parity-scale-codec", diff --git a/Cargo.toml b/Cargo.toml index 4f0e13418f3d2..2ca11d2b891be 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -802,7 +802,7 @@ frame-benchmarking-pallet-pov = { default-features = false, path = "substrate/fr frame-election-provider-solution-type = { path = "substrate/frame/election-provider-support/solution-type", default-features = false } frame-election-provider-support = { path = "substrate/frame/election-provider-support", default-features = false } frame-executive = { path = "substrate/frame/executive", default-features = false } -frame-metadata = { version = "22.0.0", default-features = false } +frame-metadata = { version = "23.0.0", default-features = false } frame-metadata-hash-extension = { path = "substrate/frame/metadata-hash-extension", default-features = false } frame-support = { path = "substrate/frame/support", default-features = false } frame-support-procedural = { path = "substrate/frame/support/procedural", default-features = false } diff --git a/prdoc/pr_8512.prdoc b/prdoc/pr_8512.prdoc new file mode 100644 index 0000000000000..87d2b65859c6d --- /dev/null +++ b/prdoc/pr_8512.prdoc @@ -0,0 +1,30 @@ +# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 +# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json + +title: Stabilize V16 metadata + +doc: + - audience: Node Dev + description: | + Metadata V16 is stabilized. V16 metadata exposes information about Pallet View Functions and V5 transactions, + and can be obtained, where applicable, by using the Runtime APIs `Metadata_metadata_at_version(16)`. + +crates: + # Update to support frame-metadata 23. Changes pub interfaces: + - name: sp-metadata-ir + bump: major + # Limit to fetching at latest v15 metadata: + - name: sc-runtime-utilities + bump: patch + # Use newer frame-metadata; should be no observable change (CI wants minor): + - name: substrate-wasm-builder + bump: minor + # frame-metadata bumped in this and exposed but via hidden docs. No code changes needed (CI wants minor): + - name: frame-support + bump: minor + # Uses newer frame-support / metadata-ir but no code change needed (CI wants minor): + - name: pallet-example-view-functions + bump: minor + # Avoid fetching V16 metadata: + - name: frame-benchmarking-cli + bump: minor \ No newline at end of file diff --git a/substrate/client/runtime-utilities/src/lib.rs b/substrate/client/runtime-utilities/src/lib.rs index 1ae3e2f1105a3..bc62c2fcdb078 100644 --- a/substrate/client/runtime-utilities/src/lib.rs +++ b/substrate/client/runtime-utilities/src/lib.rs @@ -48,7 +48,9 @@ pub fn fetch_latest_metadata_from_code_blob( let supported_versions = Vec::::decode(&mut supported_versions.as_slice())?; let latest_stable = supported_versions .into_iter() - .filter(|v| *v != u32::MAX) + // TODO: Subxt doesn't support V16 metadata until v0.42.0, so don't try + // to fetch it here until we update to that version. + .filter(|v| *v != u32::MAX && *v < 16) .max() .ok_or(Error::StableMetadataVersionNotFound)?; diff --git a/substrate/primitives/metadata-ir/Cargo.toml b/substrate/primitives/metadata-ir/Cargo.toml index 046441104b88b..d7786347dd028 100644 --- a/substrate/primitives/metadata-ir/Cargo.toml +++ b/substrate/primitives/metadata-ir/Cargo.toml @@ -17,7 +17,7 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] codec = { workspace = true } -frame-metadata = { features = ["current", "unstable"], workspace = true } +frame-metadata = { features = ["current"], workspace = true } scale-info = { features = ["derive"], workspace = true } [features] diff --git a/substrate/primitives/metadata-ir/src/lib.rs b/substrate/primitives/metadata-ir/src/lib.rs index dc01f7eaadb33..3ad2dd6203f38 100644 --- a/substrate/primitives/metadata-ir/src/lib.rs +++ b/substrate/primitives/metadata-ir/src/lib.rs @@ -30,9 +30,9 @@ mod types; use frame_metadata::RuntimeMetadataPrefixed; pub use types::*; -mod unstable; mod v14; mod v15; +mod v16; /// Metadata V14. const V14: u32 = 14; @@ -41,7 +41,7 @@ const V14: u32 = 14; const V15: u32 = 15; /// Unstable metadata V16. -const UNSTABLE_V16: u32 = u32::MAX; +const V16: u32 = 16; /// Transform the IR to the specified version. /// @@ -54,11 +54,11 @@ pub fn into_version(metadata: MetadataIR, version: u32) -> Option Some(into_v14(metadata)), - // Version V15 - latest stable. - V15 => Some(into_latest(metadata)), + // Version V15 + V15 => Some(into_v15(metadata)), - // Unstable metadata under `u32::MAX`. - UNSTABLE_V16 => Some(into_unstable(metadata)), + // Version V16 - latest-stable. + V16 => Some(into_v16(metadata)), _ => None, } @@ -66,7 +66,7 @@ pub fn into_version(metadata: MetadataIR, version: u32) -> Option alloc::vec::Vec { - alloc::vec![V14, V15, UNSTABLE_V16] + alloc::vec![V14, V15, V16] } /// Transform the IR to the latest stable metadata version. @@ -81,8 +81,14 @@ pub fn into_v14(metadata: MetadataIR) -> RuntimeMetadataPrefixed { latest.into() } -/// Transform the IR to unstable metadata version 16. -pub fn into_unstable(metadata: MetadataIR) -> RuntimeMetadataPrefixed { +/// Transform the IR to metadata version 15. +pub fn into_v15(metadata: MetadataIR) -> RuntimeMetadataPrefixed { + let latest: frame_metadata::v15::RuntimeMetadataV15 = metadata.into(); + latest.into() +} + +/// Transform the IR to metadata version 16. +pub fn into_v16(metadata: MetadataIR) -> RuntimeMetadataPrefixed { let latest: frame_metadata::v16::RuntimeMetadataV16 = metadata.into(); latest.into() } @@ -144,4 +150,14 @@ mod test { assert!(matches!(metadata.1, RuntimeMetadata::V15(_))); } + + #[test] + fn into_version_16() { + let ir = ir_metadata(); + let metadata = into_version(ir, V16).expect("Should return prefixed metadata"); + + assert_eq!(metadata.0, META_RESERVED); + + assert!(matches!(metadata.1, RuntimeMetadata::V16(_))); + } } diff --git a/substrate/primitives/metadata-ir/src/unstable.rs b/substrate/primitives/metadata-ir/src/v16.rs similarity index 93% rename from substrate/primitives/metadata-ir/src/unstable.rs rename to substrate/primitives/metadata-ir/src/v16.rs index a7eee6da62304..1b9306aea3279 100644 --- a/substrate/primitives/metadata-ir/src/unstable.rs +++ b/substrate/primitives/metadata-ir/src/v16.rs @@ -44,7 +44,7 @@ impl From for RuntimeMetadataV16 { fn from(ir: MetadataIR) -> Self { RuntimeMetadataV16::new( ir.pallets.into_iter().map(Into::into).collect(), - ir.extrinsic.into(), + ir.extrinsic.into_v16_with_call_ty(ir.outer_enums.call_enum_ty), ir.apis.into_iter().map(Into::into).collect(), ir.outer_enums.into(), // Substrate does not collect yet the custom metadata fields. @@ -179,18 +179,19 @@ impl From for TransactionExtensionMetadata { } } -impl From for ExtrinsicMetadata { - fn from(ir: ExtrinsicMetadataIR) -> Self { +impl ExtrinsicMetadataIR { + fn into_v16_with_call_ty(self, call_ty: scale_info::MetaType) -> ExtrinsicMetadata { // Assume version 0 for all extensions. - let indexes = (0..ir.extensions.len()).map(|index| Compact(index as u32)).collect(); + let indexes = (0..self.extensions.len()).map(|index| Compact(index as u32)).collect(); let transaction_extensions_by_version = [(0, indexes)].iter().cloned().collect(); ExtrinsicMetadata { - versions: ir.versions, - address_ty: ir.address_ty, - signature_ty: ir.signature_ty, + versions: self.versions, + address_ty: self.address_ty, + call_ty, + signature_ty: self.signature_ty, transaction_extensions_by_version, - transaction_extensions: ir.extensions.into_iter().map(Into::into).collect(), + transaction_extensions: self.extensions.into_iter().map(Into::into).collect(), } } } diff --git a/substrate/utils/frame/benchmarking-cli/src/overhead/remark_builder.rs b/substrate/utils/frame/benchmarking-cli/src/overhead/remark_builder.rs index 3a2d8776d1e1d..65f0fcc32a690 100644 --- a/substrate/utils/frame/benchmarking-cli/src/overhead/remark_builder.rs +++ b/substrate/utils/frame/benchmarking-cli/src/overhead/remark_builder.rs @@ -60,7 +60,9 @@ impl> DynamicRemarkBuilder { let latest = supported_metadata_versions .into_iter() - .filter(|v| *v != u32::MAX) + // TODO: Subxt doesn't support V16 metadata until v0.42.0, so don't try + // to fetch it here until we update to that version. + .filter(|v| *v != u32::MAX && *v < 16) .max() .ok_or("No stable metadata versions supported".to_string())?;