Add metadata types to our legacy type registry too

This commit is contained in:
James Wilson
2025-12-03 10:41:16 +00:00
parent 03fd050b3c
commit 0a617eb2a9
5 changed files with 32 additions and 22 deletions
Generated
+2 -2
View File
@@ -1953,9 +1953,9 @@ dependencies = [
[[package]] [[package]]
name = "frame-decode" name = "frame-decode"
version = "0.16.0" version = "0.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9cb2b069fdf47c62526c6c7a64c5edba9c3c41b4bb11dac8e4fbf8e2857859a0" checksum = "e63257bb5f8d7a707d626aa1b4e464c3b9720edd168b73cee98f48f0dd6386e4"
dependencies = [ dependencies = [
"frame-metadata 23.0.0", "frame-metadata 23.0.0",
"parity-scale-codec", "parity-scale-codec",
+1 -1
View File
@@ -82,7 +82,7 @@ darling = "0.20.10"
derive-where = "1.2.7" derive-where = "1.2.7"
either = { version = "1.13.0", default-features = false } either = { version = "1.13.0", default-features = false }
finito = { version = "0.1.0", default-features = false } finito = { version = "0.1.0", default-features = false }
frame-decode = { version = "0.16.0", default-features = false } frame-decode = { version = "0.16.1", default-features = false }
frame-metadata = { version = "23.0.0", default-features = false } frame-metadata = { version = "23.0.0", default-features = false }
futures = { version = "0.3.31", default-features = false, features = ["std"] } futures = { version = "0.3.31", default-features = false, features = ["std"] }
getrandom = { version = "0.2", default-features = false } getrandom = { version = "0.2", default-features = false }
+20 -11
View File
@@ -10,6 +10,7 @@ use blocks::Blocks;
use codec::{Compact, Decode, Encode}; use codec::{Compact, Decode, Encode};
use core::marker::PhantomData; use core::marker::PhantomData;
use frame_metadata::{RuntimeMetadata, RuntimeMetadataPrefixed}; use frame_metadata::{RuntimeMetadata, RuntimeMetadataPrefixed};
use frame_decode::helpers::ToTypeRegistry;
use scale_info_legacy::TypeRegistrySet; use scale_info_legacy::TypeRegistrySet;
use std::sync::Arc; use std::sync::Arc;
use subxt_metadata::Metadata; use subxt_metadata::Metadata;
@@ -321,7 +322,7 @@ impl<T: Config> OnlineClient<T> {
}); });
} }
RuntimeMetadata::V8(m) => { RuntimeMetadata::V8(m) => {
let types = get_legacy_types(self, spec_version)?; let types = get_legacy_types(self, &m, spec_version)?;
Metadata::from_v8(&m, &types).map_err(|e| { Metadata::from_v8(&m, &types).map_err(|e| {
OnlineClientAtBlockError::CannotConvertLegacyMetadata { OnlineClientAtBlockError::CannotConvertLegacyMetadata {
block_hash: block_hash.into(), block_hash: block_hash.into(),
@@ -331,7 +332,7 @@ impl<T: Config> OnlineClient<T> {
})? })?
} }
RuntimeMetadata::V9(m) => { RuntimeMetadata::V9(m) => {
let types = get_legacy_types(self, spec_version)?; let types = get_legacy_types(self, &m, spec_version)?;
Metadata::from_v9(&m, &types).map_err(|e| { Metadata::from_v9(&m, &types).map_err(|e| {
OnlineClientAtBlockError::CannotConvertLegacyMetadata { OnlineClientAtBlockError::CannotConvertLegacyMetadata {
block_hash: block_hash.into(), block_hash: block_hash.into(),
@@ -341,7 +342,7 @@ impl<T: Config> OnlineClient<T> {
})? })?
} }
RuntimeMetadata::V10(m) => { RuntimeMetadata::V10(m) => {
let types = get_legacy_types(self, spec_version)?; let types = get_legacy_types(self, &m, spec_version)?;
Metadata::from_v10(&m, &types).map_err(|e| { Metadata::from_v10(&m, &types).map_err(|e| {
OnlineClientAtBlockError::CannotConvertLegacyMetadata { OnlineClientAtBlockError::CannotConvertLegacyMetadata {
block_hash: block_hash.into(), block_hash: block_hash.into(),
@@ -351,7 +352,7 @@ impl<T: Config> OnlineClient<T> {
})? })?
} }
RuntimeMetadata::V11(m) => { RuntimeMetadata::V11(m) => {
let types = get_legacy_types(self, spec_version)?; let types = get_legacy_types(self, &m, spec_version)?;
Metadata::from_v11(&m, &types).map_err(|e| { Metadata::from_v11(&m, &types).map_err(|e| {
OnlineClientAtBlockError::CannotConvertLegacyMetadata { OnlineClientAtBlockError::CannotConvertLegacyMetadata {
block_hash: block_hash.into(), block_hash: block_hash.into(),
@@ -361,7 +362,7 @@ impl<T: Config> OnlineClient<T> {
})? })?
} }
RuntimeMetadata::V12(m) => { RuntimeMetadata::V12(m) => {
let types = get_legacy_types(self, spec_version)?; let types = get_legacy_types(self, &m, spec_version)?;
Metadata::from_v12(&m, &types).map_err(|e| { Metadata::from_v12(&m, &types).map_err(|e| {
OnlineClientAtBlockError::CannotConvertLegacyMetadata { OnlineClientAtBlockError::CannotConvertLegacyMetadata {
block_hash: block_hash.into(), block_hash: block_hash.into(),
@@ -371,7 +372,7 @@ impl<T: Config> OnlineClient<T> {
})? })?
} }
RuntimeMetadata::V13(m) => { RuntimeMetadata::V13(m) => {
let types = get_legacy_types(self, spec_version)?; let types = get_legacy_types(self, &m, spec_version)?;
Metadata::from_v13(&m, &types).map_err(|e| { Metadata::from_v13(&m, &types).map_err(|e| {
OnlineClientAtBlockError::CannotConvertLegacyMetadata { OnlineClientAtBlockError::CannotConvertLegacyMetadata {
block_hash: block_hash.into(), block_hash: block_hash.into(),
@@ -485,15 +486,23 @@ impl<T: Config> OfflineClientAtBlockT<T> for OnlineClientAtBlock<T> {
} }
} }
fn get_legacy_types<T: Config>( fn get_legacy_types<'a, T: Config, Md: ToTypeRegistry>(
client: &OnlineClient<T>, client: &'a OnlineClient<T>,
metadata: &Md,
spec_version: u32, spec_version: u32,
) -> Result<TypeRegistrySet<'_>, OnlineClientAtBlockError> { ) -> Result<TypeRegistrySet<'a>, OnlineClientAtBlockError> {
client let mut types = client
.inner .inner
.config .config
.legacy_types_for_spec_version(spec_version) .legacy_types_for_spec_version(spec_version)
.ok_or(OnlineClientAtBlockError::MissingLegacyTypes) .ok_or(OnlineClientAtBlockError::MissingLegacyTypes)?;
// Extend the types with information from the metadata (ie event/error/call enums):
let additional_types = frame_decode::helpers::type_registry_from_metadata(metadata)
.map_err(|e| OnlineClientAtBlockError::CannotInjectMetadataTypes { parse_error: e })?;
types.prepend(additional_types);
Ok(types)
} }
async fn get_metadata<T: Config>( async fn get_metadata<T: Config>(
+8 -7
View File
@@ -362,13 +362,14 @@ pub enum OnlineClientAtBlockError {
metadata_version: u32, metadata_version: u32,
/// Reason the conversion failed. /// Reason the conversion failed.
reason: subxt_metadata::TryFromError, reason: subxt_metadata::TryFromError,
}, // #[error( },
// "Cannot construct OnlineClientAtBlock: cannot inject types from metadata: failure to parse a type found in the metadata: {parse_error}" #[error(
// )] "Cannot construct OnlineClientAtBlock: cannot inject types from metadata: failure to parse a type found in the metadata: {parse_error}"
// CannotInjectMetadataTypes { )]
// /// Error parsing a type found in the metadata. CannotInjectMetadataTypes {
// parse_error: scale_info_legacy::lookup_name::ParseError, /// Error parsing a type found in the metadata.
// }, parse_error: scale_info_legacy::lookup_name::ParseError,
},
} }
impl OnlineClientAtBlockError { impl OnlineClientAtBlockError {
+1 -1
View File
@@ -129,7 +129,7 @@ impl<'atblock, T: Config, C: OfflineClientAtBlockT<T>> Transactions<'atblock, T,
metadata: self.client.metadata(), metadata: self.client.metadata(),
}; };
let tx = match self.default_transaction_version(&metadata)? { let tx = match self.default_transaction_version()? {
TransactionVersion::V4 => { TransactionVersion::V4 => {
PartialTransactionInner::V4(self.create_v4_signed(call, &client_state, params)?) PartialTransactionInner::V4(self.create_v4_signed(call, &client_state, params)?)
} }