Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hide nonce implementation details in metadata #6562

Merged
merged 12 commits into from
Nov 26, 2024
14 changes: 14 additions & 0 deletions prdoc/pr_6562.prdoc
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# 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: Hide nonce implementation details in metadata

doc:
- audience: Runtime Dev
description: |
Use custom implementation of TypeInfo for TypeWithDefault to show inner value's type info.
This should bring back nonce to u64 in metadata.

crates:
- name: sp-runtime
bump: minor
22 changes: 20 additions & 2 deletions substrate/primitives/runtime/src/type_with_default.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ use num_traits::{
CheckedAdd, CheckedDiv, CheckedMul, CheckedNeg, CheckedRem, CheckedShl, CheckedShr, CheckedSub,
Num, NumCast, PrimInt, Saturating, ToPrimitive,
};
use scale_info::TypeInfo;
use scale_info::{StaticTypeInfo, TypeInfo};
use sp_core::Get;

#[cfg(feature = "serde")]
Expand All @@ -40,7 +40,7 @@ use serde::{Deserialize, Serialize};
/// A type that wraps another type and provides a default value.
///
/// Passes through arithmetical and many other operations to the inner value.
#[derive(Encode, Decode, TypeInfo, Debug, MaxEncodedLen)]
#[derive(Encode, Decode, Debug, MaxEncodedLen)]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should update the doc of the type to specify this nuance.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added in 06212c9

#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct TypeWithDefault<T, D: Get<T>>(T, PhantomData<D>);

Expand All @@ -50,6 +50,17 @@ impl<T, D: Get<T>> TypeWithDefault<T, D> {
}
}

/// Hides implementation details from the outside (for metadata type information).
///
/// The type info showed in metadata is the one of the inner value's type.
re-gius marked this conversation as resolved.
Show resolved Hide resolved
impl<T: StaticTypeInfo, D: Get<T> + 'static> TypeInfo for TypeWithDefault<T, D> {
type Identity = Self;

fn type_info() -> scale_info::Type {
T::type_info()
}
}

impl<T: Clone, D: Get<T>> Clone for TypeWithDefault<T, D> {
fn clone(&self) -> Self {
Self(self.0.clone(), PhantomData)
Expand Down Expand Up @@ -511,6 +522,7 @@ impl<T: HasCompact, D: Get<T>> CompactAs for TypeWithDefault<T, D> {
#[cfg(test)]
mod tests {
use super::TypeWithDefault;
use scale_info::TypeInfo;
use sp_arithmetic::traits::{AtLeast16Bit, AtLeast32Bit, AtLeast8Bit};
use sp_core::Get;

Expand Down Expand Up @@ -565,5 +577,11 @@ mod tests {
}
type U128WithDefault = TypeWithDefault<u128, Getu128>;
impl WrapAtLeast32Bit for U128WithDefault {}

assert_eq!(U8WithDefault::type_info(), <u8 as TypeInfo>::type_info());
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To be clear, this was not passing before this PR, right

Copy link
Contributor Author

@re-gius re-gius Nov 25, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Exactly, I just double-checked: it does not pass with the derived TypeInfo

assert_eq!(U16WithDefault::type_info(), <u16 as TypeInfo>::type_info());
assert_eq!(U32WithDefault::type_info(), <u32 as TypeInfo>::type_info());
assert_eq!(U64WithDefault::type_info(), <u64 as TypeInfo>::type_info());
assert_eq!(U128WithDefault::type_info(), <u128 as TypeInfo>::type_info());
}
}
Loading