diff --git a/frame/support/src/storage/bounded_vec.rs b/frame/support/src/storage/bounded_vec.rs index 9fcfe4035294f..644444960e5f4 100644 --- a/frame/support/src/storage/bounded_vec.rs +++ b/frame/support/src/storage/bounded_vec.rs @@ -22,7 +22,7 @@ use sp_std::prelude::*; use sp_std::{convert::TryFrom, marker::PhantomData}; use codec::{FullCodec, Encode, EncodeLike, Decode}; use crate::{ - traits::Get, + traits::{Get, BoundedEncodedLen}, storage::{generator, StorageDecodeLength, StorageValue, StorageMap, StorageDoubleMap}, }; @@ -319,6 +319,21 @@ impl< } } +impl BoundedEncodedLen for BoundedVec +where + T: BoundedVecValue + BoundedEncodedLen, + S: Get, + BoundedVec: Encode, +{ + fn max_encoded_len() -> usize { + // BoundedVec encodes like Vec which encodes like [T], which is a compact u32 + // plus each item in the slice: + // https://substrate.dev/rustdocs/v3.0.0/src/parity_scale_codec/codec.rs.html#798-808 + codec::Compact::::max_encoded_len() + .saturating_add(Self::bound().saturating_mul(T::max_encoded_len())) + } +} + #[cfg(test)] pub mod test { use super::*;