diff --git a/frame/ping/src/lib.rs b/frame/ping/src/lib.rs index 8f126acf941..d8d905bf538 100644 --- a/frame/ping/src/lib.rs +++ b/frame/ping/src/lib.rs @@ -62,13 +62,23 @@ pub mod pallet { type Call: From> + Encode; type XcmSender: SendXcm; + + #[pallet::constant] + type MaxTargets: Get; + + #[pallet::constant] + type MaxPayload: Get; } /// The target parachains to ping. #[pallet::storage] - // Targets is an empty Vec by default, which causes the pallet not to ping any targets. + // Targets is an empty BoundedVec by default, which causes the pallet not to ping any targets. #[allow(clippy::disallowed_type)] - pub(super) type Targets = StorageValue<_, Vec<(ParaId, Vec)>, ValueQuery>; + pub(super) type Targets = StorageValue< + _, + BoundedVec<(ParaId, BoundedVec), T::MaxTargets>, + ValueQuery, + >; /// The total number of pings sent. #[pallet::storage] @@ -94,7 +104,9 @@ pub mod pallet { } #[pallet::error] - pub enum Error {} + pub enum Error { + MaxPayload, + } #[pallet::hooks] impl Hooks> for Pallet { @@ -111,7 +123,7 @@ pub mod pallet { require_weight_at_most: 1_000, call: ::Call::from(Call::::ping { seq, - payload: payload.clone(), + payload: payload.to_vec(), }) .encode() .into(), @@ -119,10 +131,15 @@ pub mod pallet { ) { Ok(()) => { Pings::::insert(seq, n); - Self::deposit_event(Event::PingSent(para, seq, payload)); + Self::deposit_event(Event::PingSent(para, seq, payload.to_vec())); }, Err(e) => { - Self::deposit_event(Event::ErrorSendingPing(e, para, seq, payload)); + Self::deposit_event(Event::ErrorSendingPing( + e, + para, + seq, + payload.to_vec(), + )); }, } } @@ -134,7 +151,12 @@ pub mod pallet { #[pallet::weight(0)] pub fn start(origin: OriginFor, para: ParaId, payload: Vec) -> DispatchResult { ensure_root(origin)?; - Targets::::mutate(|t| t.push((para, payload))); + let payload = payload.try_into().map_err(|_| Error::::MaxPayload)?; + Targets::::mutate(|t| -> DispatchResult { + t.try_push((para, payload)).map_err(|_| Error::::MaxPayload)?; + Ok(()) + })?; + Ok(()) } @@ -146,8 +168,12 @@ pub mod pallet { payload: Vec, ) -> DispatchResult { ensure_root(origin)?; + let payload = BoundedVec::try_from(payload).map_err(|_| Error::::MaxPayload)?; for _ in 0..count { - Targets::::mutate(|t| t.push((para, payload.clone()))); + Targets::::try_mutate(|t| -> DispatchResult { + t.try_push((para, payload.clone())).map_err(|_| Error::::MaxPayload)?; + Ok(()) + })?; } Ok(()) }