From 582bc67a6d417afccfd7292712d6cbcae218b7e4 Mon Sep 17 00:00:00 2001 From: toints Date: Tue, 25 Jun 2024 15:57:21 +0800 Subject: [PATCH] Fixed: Add boundary checks for ratio and threshold parameters - Added boundary checks for the following parameters: - SystemRatio, TreasuryRatio, and OperationRatio: Ensure the sum is <= 100%. - MinLiquidationThreshold: Ensure it is greater than ExistentialDeposit. - ProfitDistributionCycle: Ensure it is greater than 1. --- pallets/liquidation/src/lib.rs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/pallets/liquidation/src/lib.rs b/pallets/liquidation/src/lib.rs index 2c4105e..a9368ca 100644 --- a/pallets/liquidation/src/lib.rs +++ b/pallets/liquidation/src/lib.rs @@ -230,6 +230,14 @@ pub mod pallet { /// Require admin authority RequireAdmin, + + /// Invalid ratio sum (must be <= 100%) + InvalidRatio, + /// MinLiquidationThreshold must be greater than ExistentialDeposit + InvalidMinLiquidationThreshold, + /// ProfitDistributionCycle must be greater than 1 + InvalidProfitDistributionCycle, + ///xcm error XcmError, } @@ -567,6 +575,13 @@ pub mod pallet { ) -> DispatchResultWithPostInfo { ensure_root_or_admin::(origin)?; + let treasury_ratio = TreasuryRatio::::get(); + let operation_ratio = OperationRatio::::get(); + ensure!( + ratio + treasury_ratio + operation_ratio <= Perbill::one(), + Error::::InvalidRatio + ); + SystemRatio::::put(ratio); Self::deposit_event(Event::SystemRatioSet(ratio)); Ok(Pays::No.into()) @@ -580,6 +595,13 @@ pub mod pallet { ) -> DispatchResultWithPostInfo { ensure_root_or_admin::(origin)?; + let system_ratio = SystemRatio::::get(); + let operation_ratio = OperationRatio::::get(); + ensure!( + system_ratio + ratio + operation_ratio <= Perbill::one(), + Error::::InvalidRatio + ); + TreasuryRatio::::put(ratio); Self::deposit_event(Event::TreasuryRatioSet(ratio)); Ok(Pays::No.into()) @@ -593,6 +615,13 @@ pub mod pallet { ) -> DispatchResultWithPostInfo { ensure_root_or_admin::(origin)?; + let system_ratio = SystemRatio::::get(); + let treasury_ratio = TreasuryRatio::::get(); + ensure!( + system_ratio + treasury_ratio + ratio <= Perbill::one(), + Error::::InvalidRatio + ); + OperationRatio::::put(ratio); Self::deposit_event(Event::OperationRatioSet(ratio)); Ok(Pays::No.into()) @@ -606,6 +635,9 @@ pub mod pallet { ) -> DispatchResultWithPostInfo { ensure_root_or_admin::(origin)?; + let existential_deposit = ::ExistentialDeposit::get(); + ensure!(threshold > existential_deposit, Error::::InvalidMinLiquidationThreshold); + MinLiquidationThreshold::::put(threshold); Self::deposit_event(Event::MinLiquidationThresholdSet(threshold)); Ok(Pays::No.into()) @@ -619,6 +651,8 @@ pub mod pallet { ) -> DispatchResultWithPostInfo { ensure_root_or_admin::(origin)?; + ensure!(cycle > 1u32.into(), Error::::InvalidProfitDistributionCycle); + ProfitDistributionCycle::::put(cycle); Self::deposit_event(Event::ProfitDistributionCycleSet(cycle)); Ok(Pays::No.into())