1#[cfg(feature = "decode")]
17use codec::Decode;
18#[cfg(feature = "serde_full")]
19use serde::Serialize;
20
21use super::{RuntimeMetadataPrefixed, META_RESERVED};
22use codec::Encode;
23use scale_info::{
24 form::{Form, MetaForm, PortableForm},
25 prelude::{collections::BTreeMap, vec::Vec},
26 IntoPortable, MetaType, PortableRegistry, Registry,
27};
28
29pub use super::v14::{
30 PalletCallMetadata, PalletConstantMetadata, PalletErrorMetadata, PalletEventMetadata,
31 PalletStorageMetadata, StorageEntryMetadata, StorageEntryModifier, StorageEntryType,
32 StorageHasher,
33};
34
35pub type RuntimeMetadataLastVersion = RuntimeMetadataV15;
37
38impl From<RuntimeMetadataLastVersion> for super::RuntimeMetadataPrefixed {
39 fn from(metadata: RuntimeMetadataLastVersion) -> RuntimeMetadataPrefixed {
40 RuntimeMetadataPrefixed(META_RESERVED, super::RuntimeMetadata::V15(metadata))
41 }
42}
43
44#[derive(Clone, PartialEq, Eq, Encode, Debug)]
46#[cfg_attr(feature = "decode", derive(Decode))]
47#[cfg_attr(feature = "serde_full", derive(Serialize))]
48pub struct RuntimeMetadataV15 {
49 pub types: PortableRegistry,
51 pub pallets: Vec<PalletMetadata<PortableForm>>,
53 pub extrinsic: ExtrinsicMetadata<PortableForm>,
55 pub ty: <PortableForm as Form>::Type,
57 pub apis: Vec<RuntimeApiMetadata<PortableForm>>,
59 pub outer_enums: OuterEnums<PortableForm>,
61 pub custom: CustomMetadata<PortableForm>,
63}
64
65impl RuntimeMetadataV15 {
66 pub fn new(
68 pallets: Vec<PalletMetadata>,
69 extrinsic: ExtrinsicMetadata,
70 runtime_type: MetaType,
71 apis: Vec<RuntimeApiMetadata>,
72 outer_enums: OuterEnums,
73 custom: CustomMetadata,
74 ) -> Self {
75 let mut registry = Registry::new();
76 let pallets = registry.map_into_portable(pallets);
77 let extrinsic = extrinsic.into_portable(&mut registry);
78 let ty = registry.register_type(&runtime_type);
79 let apis = registry.map_into_portable(apis);
80 let outer_enums = outer_enums.into_portable(&mut registry);
81 let custom = custom.into_portable(&mut registry);
82
83 Self {
84 types: registry.into(),
85 pallets,
86 extrinsic,
87 ty,
88 apis,
89 outer_enums,
90 custom,
91 }
92 }
93}
94
95#[derive(Clone, PartialEq, Eq, Encode, Debug)]
97#[cfg_attr(feature = "decode", derive(Decode))]
98#[cfg_attr(feature = "serde_full", derive(Serialize))]
99#[cfg_attr(
100 feature = "serde_full",
101 serde(bound(serialize = "T::Type: Serialize, T::String: Serialize"))
102)]
103pub struct RuntimeApiMetadata<T: Form = MetaForm> {
104 pub name: T::String,
106 pub methods: Vec<RuntimeApiMethodMetadata<T>>,
108 pub docs: Vec<T::String>,
110}
111
112impl IntoPortable for RuntimeApiMetadata {
113 type Output = RuntimeApiMetadata<PortableForm>;
114
115 fn into_portable(self, registry: &mut Registry) -> Self::Output {
116 RuntimeApiMetadata {
117 name: self.name.into_portable(registry),
118 methods: registry.map_into_portable(self.methods),
119 docs: registry.map_into_portable(self.docs),
120 }
121 }
122}
123
124#[derive(Clone, PartialEq, Eq, Encode, Debug)]
126#[cfg_attr(feature = "decode", derive(Decode))]
127#[cfg_attr(feature = "serde_full", derive(Serialize))]
128#[cfg_attr(
129 feature = "serde_full",
130 serde(bound(serialize = "T::Type: Serialize, T::String: Serialize"))
131)]
132pub struct RuntimeApiMethodMetadata<T: Form = MetaForm> {
133 pub name: T::String,
135 pub inputs: Vec<RuntimeApiMethodParamMetadata<T>>,
137 pub output: T::Type,
139 pub docs: Vec<T::String>,
141}
142
143impl IntoPortable for RuntimeApiMethodMetadata {
144 type Output = RuntimeApiMethodMetadata<PortableForm>;
145
146 fn into_portable(self, registry: &mut Registry) -> Self::Output {
147 RuntimeApiMethodMetadata {
148 name: self.name.into_portable(registry),
149 inputs: registry.map_into_portable(self.inputs),
150 output: registry.register_type(&self.output),
151 docs: registry.map_into_portable(self.docs),
152 }
153 }
154}
155
156#[derive(Clone, PartialEq, Eq, Encode, Debug)]
158#[cfg_attr(feature = "decode", derive(Decode))]
159#[cfg_attr(feature = "serde_full", derive(Serialize))]
160#[cfg_attr(
161 feature = "serde_full",
162 serde(bound(serialize = "T::Type: Serialize, T::String: Serialize"))
163)]
164pub struct RuntimeApiMethodParamMetadata<T: Form = MetaForm> {
165 pub name: T::String,
167 pub ty: T::Type,
169}
170
171impl IntoPortable for RuntimeApiMethodParamMetadata {
172 type Output = RuntimeApiMethodParamMetadata<PortableForm>;
173
174 fn into_portable(self, registry: &mut Registry) -> Self::Output {
175 RuntimeApiMethodParamMetadata {
176 name: self.name.into_portable(registry),
177 ty: registry.register_type(&self.ty),
178 }
179 }
180}
181
182#[derive(Clone, PartialEq, Eq, Encode, Debug)]
184#[cfg_attr(feature = "decode", derive(Decode))]
185#[cfg_attr(feature = "serde_full", derive(Serialize))]
186#[cfg_attr(
187 feature = "serde_full",
188 serde(bound(serialize = "T::Type: Serialize, T::String: Serialize"))
189)]
190pub struct ExtrinsicMetadata<T: Form = MetaForm> {
191 pub version: u8,
193 pub address_ty: T::Type,
195 pub call_ty: T::Type,
197 pub signature_ty: T::Type,
199 pub extra_ty: T::Type,
201 pub signed_extensions: Vec<SignedExtensionMetadata<T>>,
203}
204
205impl IntoPortable for ExtrinsicMetadata {
206 type Output = ExtrinsicMetadata<PortableForm>;
207
208 fn into_portable(self, registry: &mut Registry) -> Self::Output {
209 ExtrinsicMetadata {
210 version: self.version,
211 address_ty: registry.register_type(&self.address_ty),
212 call_ty: registry.register_type(&self.call_ty),
213 signature_ty: registry.register_type(&self.signature_ty),
214 extra_ty: registry.register_type(&self.extra_ty),
215 signed_extensions: registry.map_into_portable(self.signed_extensions),
216 }
217 }
218}
219
220#[derive(Clone, PartialEq, Eq, Encode, Debug)]
222#[cfg_attr(feature = "decode", derive(Decode))]
223#[cfg_attr(feature = "serde_full", derive(Serialize))]
224#[cfg_attr(
225 feature = "serde_full",
226 serde(bound(serialize = "T::Type: Serialize, T::String: Serialize"))
227)]
228pub struct SignedExtensionMetadata<T: Form = MetaForm> {
229 pub identifier: T::String,
231 pub ty: T::Type,
233 pub additional_signed: T::Type,
235}
236
237impl IntoPortable for SignedExtensionMetadata {
238 type Output = SignedExtensionMetadata<PortableForm>;
239
240 fn into_portable(self, registry: &mut Registry) -> Self::Output {
241 SignedExtensionMetadata {
242 identifier: self.identifier.into_portable(registry),
243 ty: registry.register_type(&self.ty),
244 additional_signed: registry.register_type(&self.additional_signed),
245 }
246 }
247}
248
249#[derive(Clone, PartialEq, Eq, Encode, Debug)]
251#[cfg_attr(feature = "decode", derive(Decode))]
252#[cfg_attr(feature = "serde_full", derive(Serialize))]
253#[cfg_attr(
254 feature = "serde_full",
255 serde(bound(serialize = "T::Type: Serialize, T::String: Serialize"))
256)]
257pub struct PalletMetadata<T: Form = MetaForm> {
258 pub name: T::String,
260 pub storage: Option<PalletStorageMetadata<T>>,
262 pub calls: Option<PalletCallMetadata<T>>,
264 pub event: Option<PalletEventMetadata<T>>,
266 pub constants: Vec<PalletConstantMetadata<T>>,
268 pub error: Option<PalletErrorMetadata<T>>,
270 pub index: u8,
273 pub docs: Vec<T::String>,
275}
276
277impl IntoPortable for PalletMetadata {
278 type Output = PalletMetadata<PortableForm>;
279
280 fn into_portable(self, registry: &mut Registry) -> Self::Output {
281 PalletMetadata {
282 name: self.name.into_portable(registry),
283 storage: self.storage.map(|storage| storage.into_portable(registry)),
284 calls: self.calls.map(|calls| calls.into_portable(registry)),
285 event: self.event.map(|event| event.into_portable(registry)),
286 constants: registry.map_into_portable(self.constants),
287 error: self.error.map(|error| error.into_portable(registry)),
288 index: self.index,
289 docs: registry.map_into_portable(self.docs),
290 }
291 }
292}
293
294#[derive(Clone, PartialEq, Eq, Encode, Debug)]
298#[cfg_attr(feature = "decode", derive(Decode))]
299#[cfg_attr(feature = "serde_full", derive(Serialize))]
300#[cfg_attr(
301 feature = "serde_full",
302 serde(bound(serialize = "T::Type: Serialize, T::String: Serialize"))
303)]
304pub struct CustomMetadata<T: Form = MetaForm> {
305 pub map: BTreeMap<T::String, CustomValueMetadata<T>>,
307}
308
309impl IntoPortable for CustomMetadata {
310 type Output = CustomMetadata<PortableForm>;
311
312 fn into_portable(self, registry: &mut Registry) -> Self::Output {
313 let map = self
314 .map
315 .into_iter()
316 .map(|(key, value)| (key.into_portable(registry), value.into_portable(registry)))
317 .collect();
318
319 CustomMetadata { map }
320 }
321}
322
323#[derive(Clone, PartialEq, Eq, Encode, Debug)]
325#[cfg_attr(feature = "decode", derive(Decode))]
326#[cfg_attr(feature = "serde_full", derive(Serialize))]
327#[cfg_attr(
328 feature = "serde_full",
329 serde(bound(serialize = "T::Type: Serialize, T::String: Serialize"))
330)]
331pub struct CustomValueMetadata<T: Form = MetaForm> {
332 pub ty: T::Type,
334 pub value: Vec<u8>,
336}
337
338impl IntoPortable for CustomValueMetadata {
339 type Output = CustomValueMetadata<PortableForm>;
340
341 fn into_portable(self, registry: &mut Registry) -> Self::Output {
342 CustomValueMetadata {
343 ty: registry.register_type(&self.ty),
344 value: self.value,
345 }
346 }
347}
348
349#[derive(Clone, PartialEq, Eq, Encode, Debug)]
351#[cfg_attr(feature = "decode", derive(Decode))]
352#[cfg_attr(feature = "serde_full", derive(Serialize))]
353#[cfg_attr(
354 feature = "serde_full",
355 serde(bound(serialize = "T::Type: Serialize, T::String: Serialize"))
356)]
357pub struct OuterEnums<T: Form = MetaForm> {
358 pub call_enum_ty: T::Type,
360 pub event_enum_ty: T::Type,
362 pub error_enum_ty: T::Type,
378}
379
380impl IntoPortable for OuterEnums {
381 type Output = OuterEnums<PortableForm>;
382
383 fn into_portable(self, registry: &mut Registry) -> Self::Output {
384 OuterEnums {
385 call_enum_ty: registry.register_type(&self.call_enum_ty),
386 event_enum_ty: registry.register_type(&self.event_enum_ty),
387 error_enum_ty: registry.register_type(&self.error_enum_ty),
388 }
389 }
390}