diff --git a/parachains/pallets/ping/src/lib.rs b/parachains/pallets/ping/src/lib.rs index 52a300b329..9d325d9145 100644 --- a/parachains/pallets/ping/src/lib.rs +++ b/parachains/pallets/ping/src/lib.rs @@ -20,6 +20,7 @@ use cumulus_pallet_xcm::{ensure_sibling_para, Origin as CumulusOrigin}; use cumulus_primitives_core::ParaId; +use frame_support::{parameter_types, BoundedVec}; use frame_system::Config as SystemConfig; use sp_runtime::traits::Saturating; use sp_std::prelude::*; @@ -27,6 +28,11 @@ use xcm::latest::prelude::*; pub use pallet::*; +parameter_types! { + const MaxParachains: u32 = 100; + const MaxPayloadSize: u32 = 1024; +} + #[frame_support::pallet] pub mod pallet { use super::*; @@ -35,7 +41,6 @@ pub mod pallet { #[pallet::pallet] #[pallet::generate_store(pub(super) trait Store)] - #[pallet::without_storage_info] pub struct Pallet(_); /// The module configuration trait. @@ -55,7 +60,11 @@ pub mod pallet { /// The target parachains to ping. #[pallet::storage] - pub(super) type Targets = StorageValue<_, Vec<(ParaId, Vec)>, ValueQuery>; + pub(super) type Targets = StorageValue< + _, + BoundedVec<(ParaId, BoundedVec), MaxParachains>, + ValueQuery, + >; /// The total number of pings sent. #[pallet::storage] @@ -79,7 +88,12 @@ pub mod pallet { } #[pallet::error] - pub enum Error {} + pub enum Error { + /// Too many parachains have been added as a target. + TooManyTargets, + /// The payload provided is too large, limit is 1024 bytes. + PayloadTooLarge, + } #[pallet::hooks] impl Hooks> for Pallet { @@ -96,7 +110,7 @@ pub mod pallet { require_weight_at_most: 1_000, call: ::Call::from(Call::::ping { seq, - payload: payload.clone(), + payload: payload.clone().to_vec(), }) .encode() .into(), @@ -104,10 +118,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(), + )); }, } } @@ -119,7 +138,11 @@ 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 = BoundedVec::::try_from(payload) + .map_err(|_| Error::::PayloadTooLarge)?; + Targets::::try_mutate(|t| { + t.try_push((para, payload)).map_err(|_| Error::::TooManyTargets) + })?; Ok(()) } @@ -131,8 +154,13 @@ pub mod pallet { payload: Vec, ) -> DispatchResult { ensure_root(origin)?; + let bounded_payload = BoundedVec::::try_from(payload) + .map_err(|_| Error::::PayloadTooLarge)?; for _ in 0..count { - Targets::::mutate(|t| t.push((para, payload.clone()))); + Targets::::try_mutate(|t| { + t.try_push((para, bounded_payload.clone())) + .map_err(|_| Error::::TooManyTargets) + })?; } Ok(()) }