diff --git a/pallets/commitments/src/lib.rs b/pallets/commitments/src/lib.rs index d5d132034a..7e862a593b 100644 --- a/pallets/commitments/src/lib.rs +++ b/pallets/commitments/src/lib.rs @@ -58,7 +58,7 @@ pub mod pallet { /// The rate limit for commitments #[pallet::constant] - type RateLimit: Get>; + type DefaultRateLimit: Get>; } #[pallet::event] @@ -83,6 +83,16 @@ pub mod pallet { CommitmentSetRateLimitExceeded, } + #[pallet::type_value] + /// Default value for commitment rate limit. + pub fn DefaultRateLimit() -> BlockNumberFor { + T::DefaultRateLimit::get() + } + + /// The rate limit for commitments + #[pallet::storage] + pub type RateLimit = StorageValue<_, BlockNumberFor, ValueQuery, DefaultRateLimit>; + /// Identity data by account #[pallet::storage] #[pallet::getter(fn commitment_of)] @@ -137,7 +147,7 @@ pub mod pallet { let cur_block = >::block_number(); if let Some(last_commit) = >::get(netuid, &who) { ensure!( - cur_block >= last_commit.saturating_add(T::RateLimit::get()), + cur_block >= last_commit.saturating_add(RateLimit::::get()), Error::::CommitmentSetRateLimitExceeded ); } @@ -173,6 +183,19 @@ pub mod pallet { Ok(()) } + + /// Sudo-set the commitment rate limit + #[pallet::call_index(1)] + #[pallet::weight(( + T::WeightInfo::set_rate_limit(), + DispatchClass::Operational, + Pays::No + ))] + pub fn set_rate_limit(origin: OriginFor, rate_limit_blocks: u32) -> DispatchResult { + ensure_root(origin)?; + RateLimit::::set(rate_limit_blocks.into()); + Ok(()) + } } } diff --git a/pallets/commitments/src/tests.rs b/pallets/commitments/src/tests.rs index 036cb5d83e..15675d8ad8 100644 --- a/pallets/commitments/src/tests.rs +++ b/pallets/commitments/src/tests.rs @@ -86,7 +86,7 @@ impl pallet_commitments::Config for Test { type CanCommit = (); type FieldDeposit = frame_support::traits::ConstU64<0>; type InitialDeposit = frame_support::traits::ConstU64<0>; - type RateLimit = frame_support::traits::ConstU64<0>; + type DefaultRateLimit = frame_support::traits::ConstU64<0>; } // // Build genesis storage according to the mock runtime. diff --git a/pallets/commitments/src/weights.rs b/pallets/commitments/src/weights.rs index 5e58b6873c..b91017e050 100644 --- a/pallets/commitments/src/weights.rs +++ b/pallets/commitments/src/weights.rs @@ -30,6 +30,7 @@ use core::marker::PhantomData; /// Weight functions needed for `pallet_commitments`. pub trait WeightInfo { fn set_commitment() -> Weight; + fn set_rate_limit() -> Weight; } /// Weights for `pallet_commitments` using the Substrate node and recommended hardware. @@ -48,6 +49,11 @@ impl WeightInfo for SubstrateWeight { .saturating_add(T::DbWeight::get().reads(2_u64)) .saturating_add(T::DbWeight::get().writes(2_u64)) } + /// Sudo setting rate limit for commitments + fn set_rate_limit() -> Weight { + Weight::from_parts(10_000_000, 2000) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + } } // For backwards compatibility and tests. @@ -65,4 +71,10 @@ impl WeightInfo for () { .saturating_add(RocksDbWeight::get().reads(2_u64)) .saturating_add(RocksDbWeight::get().writes(2_u64)) } + + /// Sudo setting rate limit for commitments + fn set_rate_limit() -> Weight { + Weight::from_parts(10_000_000, 2000) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + } } \ No newline at end of file diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 5c3688a510..36a879e48b 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -974,7 +974,7 @@ impl pallet_commitments::Config for Runtime { type MaxFields = MaxCommitFields; type InitialDeposit = CommitmentInitialDeposit; type FieldDeposit = CommitmentFieldDeposit; - type RateLimit = CommitmentRateLimit; + type DefaultRateLimit = CommitmentRateLimit; } #[cfg(not(feature = "fast-blocks"))]