From 59ae7636bc3824b09b0ee265b3d27ac4fe1d6dd4 Mon Sep 17 00:00:00 2001
From: Kaloyan Gangov <gangov1@gmail.com>
Date: Thu, 25 Jan 2024 21:37:13 +0200
Subject: [PATCH] Phoenix: updates validate_bps macro to check the range in a
 more Rust-native way; Pool, Pool-Stable: uses validate_bps macro in the init
 call and updates tests.

---
 contracts/pool/src/contract.rs               | 9 ++++++++-
 contracts/pool/src/tests/liquidity.rs        | 2 +-
 contracts/pool/src/tests/setup.rs            | 6 +-----
 contracts/pool_stable/src/contract.rs        | 7 ++++++-
 contracts/pool_stable/src/tests/liquidity.rs | 2 +-
 packages/phoenix/src/utils.rs                | 7 ++++---
 6 files changed, 21 insertions(+), 12 deletions(-)

diff --git a/contracts/pool/src/contract.rs b/contracts/pool/src/contract.rs
index 8b6672396..1b711a1f3 100644
--- a/contracts/pool/src/contract.rs
+++ b/contracts/pool/src/contract.rs
@@ -17,7 +17,7 @@ use crate::{
     token_contract,
 };
 use decimal::Decimal;
-use phoenix::{utils::is_approx_ratio, validate_int_parameters};
+use phoenix::{utils::is_approx_ratio, validate_bps, validate_int_parameters};
 
 // Metadata that is added on to the WASM custom section
 contractmeta!(
@@ -144,6 +144,13 @@ impl LiquidityPoolTrait for LiquidityPool {
         let token_init_info = lp_init_info.token_init_info;
         let stake_init_info = lp_init_info.stake_init_info;
 
+        validate_bps!(
+            swap_fee_bps,
+            max_allowed_slippage_bps,
+            max_allowed_spread_bps,
+            max_referral_bps
+        );
+
         set_initialized(&env);
 
         // Token info
diff --git a/contracts/pool/src/tests/liquidity.rs b/contracts/pool/src/tests/liquidity.rs
index 13516ac5a..d48cbc6d4 100644
--- a/contracts/pool/src/tests/liquidity.rs
+++ b/contracts/pool/src/tests/liquidity.rs
@@ -542,7 +542,7 @@ fn provide_liqudity_single_asset_one_third_with_fees() {
 }
 
 #[test]
-#[should_panic(expected = "Pool: Initialize: Fees must be between 0 and 100%")]
+#[should_panic(expected = "The value 10001 is out of range. Must be between 0 and 10000 bps.")]
 fn provide_liqudity_too_high_fees() {
     let env = Env::default();
     env.mock_all_auths();
diff --git a/contracts/pool/src/tests/setup.rs b/contracts/pool/src/tests/setup.rs
index 3e1c639fc..d229b0c64 100644
--- a/contracts/pool/src/tests/setup.rs
+++ b/contracts/pool/src/tests/setup.rs
@@ -65,10 +65,6 @@ pub fn deploy_liquidity_pool_contract<'a>(
         stake_init_info,
     };
 
-    pool.initialize(
-        &stake_wasm_hash,
-        &token_wasm_hash,
-        &lp_init_info,
-    );
+    pool.initialize(&stake_wasm_hash, &token_wasm_hash, &lp_init_info);
     pool
 }
diff --git a/contracts/pool_stable/src/contract.rs b/contracts/pool_stable/src/contract.rs
index 4aa72de3a..dc73b6507 100644
--- a/contracts/pool_stable/src/contract.rs
+++ b/contracts/pool_stable/src/contract.rs
@@ -14,7 +14,7 @@ use crate::{
     token_contract,
 };
 use decimal::Decimal;
-use phoenix::validate_int_parameters;
+use phoenix::{validate_bps, validate_int_parameters};
 
 // Minimum amount of initial LP shares to mint
 const MINIMUM_LIQUIDITY_AMOUNT: i128 = 1000;
@@ -140,6 +140,11 @@ impl StableLiquidityPoolTrait for StableLiquidityPool {
         let token_init_info = lp_init_info.token_init_info;
         let stake_init_info = lp_init_info.stake_init_info;
 
+        validate_bps!(
+            swap_fee_bps,
+            max_allowed_slippage_bps,
+            max_allowed_spread_bps
+        );
         set_initialized(&env);
 
         // Token info
diff --git a/contracts/pool_stable/src/tests/liquidity.rs b/contracts/pool_stable/src/tests/liquidity.rs
index 53ecf19e7..80210183a 100644
--- a/contracts/pool_stable/src/tests/liquidity.rs
+++ b/contracts/pool_stable/src/tests/liquidity.rs
@@ -542,7 +542,7 @@ fn provide_liqudity_single_asset_one_third_with_fees() {
 }
 
 #[test]
-#[should_panic(expected = "Pool: Initialize: Fees must be between 0 and 100%")]
+#[should_panic(expected = "The value 10001 is out of range. Must be between 0 and 10000 bps.")]
 fn provide_liqudity_too_high_fees() {
     let env = Env::default();
     env.mock_all_auths();
diff --git a/packages/phoenix/src/utils.rs b/packages/phoenix/src/utils.rs
index f6fcff2c2..1395f51d2 100644
--- a/packages/phoenix/src/utils.rs
+++ b/packages/phoenix/src/utils.rs
@@ -25,9 +25,10 @@ macro_rules! validate_bps {
         const MIN_BPS: i64 = 0;
         const MAX_BPS: i64 = 10_000;
         $(
-            if $value < MIN_BPS || $value > MAX_BPS {
-                panic!("The value {} is out of range. Must be between {} and {} bps.", $value, MIN_BPS, MAX_BPS);
-            }
+            // if $value < MIN_BPS || $value > MAX_BPS {
+            //     panic!("The value {} is out of range. Must be between {} and {} bps.", $value, MIN_BPS, MAX_BPS);
+            // }
+            assert!((MIN_BPS..=MAX_BPS).contains(&$value), "The value {} is out of range. Must be between {} and {} bps.", $value, MIN_BPS, MAX_BPS);
         )+
     }
 }