diff --git a/contracts/red-bank/tests/tests/test_admin.rs b/contracts/red-bank/tests/tests/test_admin.rs index 2fb396789..37033cedb 100644 --- a/contracts/red-bank/tests/tests/test_admin.rs +++ b/contracts/red-bank/tests/tests/test_admin.rs @@ -137,7 +137,7 @@ fn init_asset() { optimal_utilization_rate: Decimal::one(), base: Decimal::percent(5), slope_1: Decimal::zero(), - slope_2: Decimal::zero(), + slope_2: Decimal::one(), }; let params = InitOrUpdateAssetParams { @@ -269,6 +269,33 @@ fn init_asset() { ); } + // init asset where slope_1 >= slope_2 + { + let invalid_asset_params = InitOrUpdateAssetParams { + interest_rate_model: Some(InterestRateModel { + slope_1: Decimal::percent(10), + slope_2: Decimal::percent(10), + ..ir_model + }), + ..params + }; + let msg = ExecuteMsg::InitAsset { + denom: "someasset".to_string(), + params: invalid_asset_params, + }; + let info = mock_info("owner", &[]); + let error_res = execute(deps.as_mut(), env.clone(), info, msg).unwrap_err(); + assert_eq!( + error_res, + ValidationError::InvalidParam { + param_name: "slope_1".to_string(), + invalid_value: "0.1".to_string(), + predicate: "< 0.1".to_string() + } + .into() + ); + } + // owner is authorized { let msg = ExecuteMsg::InitAsset { @@ -322,7 +349,7 @@ fn update_asset() { optimal_utilization_rate: Decimal::one(), base: Decimal::percent(5), slope_1: Decimal::zero(), - slope_2: Decimal::zero(), + slope_2: Decimal::one(), }; let params = InitOrUpdateAssetParams { @@ -459,7 +486,7 @@ fn update_asset_with_new_interest_rate_model_params() { optimal_utilization_rate: Decimal::one(), base: Decimal::percent(5), slope_1: Decimal::zero(), - slope_2: Decimal::zero(), + slope_2: Decimal::one(), }; let params = InitOrUpdateAssetParams { diff --git a/packages/types/src/red_bank/interest_rate_model.rs b/packages/types/src/red_bank/interest_rate_model.rs index d94e1c7e2..26f844eaa 100644 --- a/packages/types/src/red_bank/interest_rate_model.rs +++ b/packages/types/src/red_bank/interest_rate_model.rs @@ -11,15 +11,24 @@ pub struct InterestRateModel { pub optimal_utilization_rate: Decimal, /// Base rate pub base: Decimal, - /// Slope parameter for interest rate model function when utilization_rate < optimal_utilization_rate + /// Slope parameter for interest rate model function when utilization_rate <= optimal_utilization_rate pub slope_1: Decimal, - /// Slope parameter for interest rate model function when utilization_rate >= optimal_utilization_rate + /// Slope parameter for interest rate model function when utilization_rate > optimal_utilization_rate pub slope_2: Decimal, } impl InterestRateModel { pub fn validate(&self) -> Result<(), ValidationError> { decimal_param_le_one(self.optimal_utilization_rate, "optimal_utilization_rate")?; + + if self.slope_1 >= self.slope_2 { + return Err(ValidationError::InvalidParam { + param_name: "slope_1".to_string(), + invalid_value: self.slope_1.to_string(), + predicate: format!("< {}", self.slope_2), + }); + } + Ok(()) } diff --git a/schemas/mars-red-bank/mars-red-bank.json b/schemas/mars-red-bank/mars-red-bank.json index 5f8b24d6c..569158af9 100644 --- a/schemas/mars-red-bank/mars-red-bank.json +++ b/schemas/mars-red-bank/mars-red-bank.json @@ -454,7 +454,7 @@ ] }, "slope_1": { - "description": "Slope parameter for interest rate model function when utilization_rate < optimal_utilization_rate", + "description": "Slope parameter for interest rate model function when utilization_rate <= optimal_utilization_rate", "allOf": [ { "$ref": "#/definitions/Decimal" @@ -462,7 +462,7 @@ ] }, "slope_2": { - "description": "Slope parameter for interest rate model function when utilization_rate >= optimal_utilization_rate", + "description": "Slope parameter for interest rate model function when utilization_rate > optimal_utilization_rate", "allOf": [ { "$ref": "#/definitions/Decimal" @@ -1146,7 +1146,7 @@ ] }, "slope_1": { - "description": "Slope parameter for interest rate model function when utilization_rate < optimal_utilization_rate", + "description": "Slope parameter for interest rate model function when utilization_rate <= optimal_utilization_rate", "allOf": [ { "$ref": "#/definitions/Decimal" @@ -1154,7 +1154,7 @@ ] }, "slope_2": { - "description": "Slope parameter for interest rate model function when utilization_rate >= optimal_utilization_rate", + "description": "Slope parameter for interest rate model function when utilization_rate > optimal_utilization_rate", "allOf": [ { "$ref": "#/definitions/Decimal" @@ -1208,7 +1208,7 @@ ] }, "slope_1": { - "description": "Slope parameter for interest rate model function when utilization_rate < optimal_utilization_rate", + "description": "Slope parameter for interest rate model function when utilization_rate <= optimal_utilization_rate", "allOf": [ { "$ref": "#/definitions/Decimal" @@ -1216,7 +1216,7 @@ ] }, "slope_2": { - "description": "Slope parameter for interest rate model function when utilization_rate >= optimal_utilization_rate", + "description": "Slope parameter for interest rate model function when utilization_rate > optimal_utilization_rate", "allOf": [ { "$ref": "#/definitions/Decimal"