From 45d28749c7c7da90d542dc08905708ce99482bf0 Mon Sep 17 00:00:00 2001 From: gangov <6922910+gangov@users.noreply.github.com> Date: Sat, 7 Dec 2024 16:26:11 +0200 Subject: [PATCH 1/7] xyz pool - pho stake --- contracts/pool/src/contract.rs | 7 +++ contracts/pool/src/storage.rs | 2 + contracts/pool/src/tests/config.rs | 59 +++++++++++++++++++- contracts/pool/src/tests/liquidity.rs | 24 ++++++++ contracts/pool/src/tests/setup.rs | 2 + contracts/pool/src/tests/stake_deployment.rs | 4 ++ contracts/pool/src/tests/swap.rs | 19 +++++++ packages/phoenix/src/utils.rs | 1 + 8 files changed, 115 insertions(+), 3 deletions(-) diff --git a/contracts/pool/src/contract.rs b/contracts/pool/src/contract.rs index ca9e8d652..e3e4b2355 100644 --- a/contracts/pool/src/contract.rs +++ b/contracts/pool/src/contract.rs @@ -109,6 +109,7 @@ pub trait LiquidityPoolTrait { max_allowed_slippage_bps: Option, max_allowed_spread_bps: Option, max_referral_bps: Option, + pho_token_staking_addr: Option
, ); // Migration entrypoint @@ -248,6 +249,7 @@ impl LiquidityPoolTrait for LiquidityPool { max_allowed_slippage_bps, max_allowed_spread_bps, max_referral_bps, + pho_token_staking_addr: stake_init_info.pho_token_staking_addr, }; save_config(&env, config); @@ -545,6 +547,7 @@ impl LiquidityPoolTrait for LiquidityPool { max_allowed_slippage_bps: Option, max_allowed_spread_bps: Option, max_referral_bps: Option, + pho_token_staking_addr: Option
, ) { let admin: Address = utils::get_admin(&env); admin.require_auth(); @@ -576,6 +579,9 @@ impl LiquidityPoolTrait for LiquidityPool { validate_bps!(max_referral_bps); config.max_referral_bps = max_referral_bps; } + if let Some(pho_token_staking_addr) = pho_token_staking_addr { + config.pho_token_staking_addr = pho_token_staking_addr; + } save_config(&env, config); } @@ -1404,6 +1410,7 @@ mod tests { max_allowed_slippage_bps: 100i64, max_allowed_spread_bps: 100i64, max_referral_bps: 1_000i64, + pho_token_staking_addr: Address::generate(&env), }; split_deposit_based_on_pool_ratio(&env, config, 100, 100, 100, &Address::generate(&env)); } diff --git a/contracts/pool/src/storage.rs b/contracts/pool/src/storage.rs index 633a0aec1..e29370c56 100644 --- a/contracts/pool/src/storage.rs +++ b/contracts/pool/src/storage.rs @@ -50,6 +50,7 @@ pub struct Config { pub max_allowed_spread_bps: i64, /// The maximum allowed percentage (in bps) for referral fee pub max_referral_bps: i64, + pub pho_token_staking_addr: Address, } const CONFIG: Symbol = symbol_short!("CONFIG"); @@ -702,6 +703,7 @@ mod tests { fee_recipient: Address::generate(&env), max_allowed_spread_bps: 10_i64, max_referral_bps: 10i64, + pho_token_staking_addr: Address::generate(&env), }; let result = config.max_allowed_slippage(); diff --git a/contracts/pool/src/tests/config.rs b/contracts/pool/src/tests/config.rs index ff1fcada7..7558b6a9f 100644 --- a/contracts/pool/src/tests/config.rs +++ b/contracts/pool/src/tests/config.rs @@ -39,6 +39,7 @@ fn test_initialize_with_bigger_first_token_should_fail() { min_reward: 5i128, manager: Address::generate(&env), max_complexity: 10u32, + pho_token_staking_addr: Address::generate(&env), }; let stake_wasm_hash = install_stake_wasm(&env); let token_wasm_hash = install_token_wasm(&env); @@ -86,6 +87,8 @@ fn update_config() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); + let pho_token_staking_addr = Address::generate(&env); + let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( &env, @@ -97,6 +100,7 @@ fn update_config() { 200, stake_manager, stake_owner, + pho_token_staking_addr, ); let share_token_address = pool.query_share_token_address(); @@ -115,9 +119,12 @@ fn update_config() { max_allowed_slippage_bps: 500, max_allowed_spread_bps: 200, max_referral_bps: 5_000, + pho_token_staking_addr: Address::generate(&env), } ); + let new_pho_token_staking_addr = Address::generate(&env); + // update fees and recipient pool.update_config( &None, @@ -126,6 +133,7 @@ fn update_config() { &None, &None, &Some(1_000i64), + &Some(new_pho_token_staking_addr.clone()), ); assert_eq!( pool.query_config(), @@ -140,11 +148,20 @@ fn update_config() { max_allowed_slippage_bps: 500, max_allowed_spread_bps: 200, max_referral_bps: 1_000, + pho_token_staking_addr: new_pho_token_staking_addr, } ); // update slippage and spread - pool.update_config(&None, &None, &None, &None, &Some(5_000i64), &Some(500)); + pool.update_config( + &None, + &None, + &None, + &None, + &Some(5_000i64), + &Some(500), + &None, + ); assert_eq!( pool.query_config(), Config { @@ -158,6 +175,7 @@ fn update_config() { max_allowed_slippage_bps: 500, max_allowed_spread_bps: 5_000, max_referral_bps: 500, + pho_token_staking_addr: Address::generate(&env), } ); } @@ -179,6 +197,7 @@ fn update_config_unauthorized() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); + let pho_token_staking_addr = Address::generate(&env); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -191,6 +210,7 @@ fn update_config_unauthorized() { 200, stake_manager, stake_owner, + pho_token_staking_addr, ); pool.update_config( @@ -200,6 +220,7 @@ fn update_config_unauthorized() { &None, &None, &None, + &None, ); } @@ -221,6 +242,7 @@ fn update_config_update_admin() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); + let pho_token_staking_addr = Address::generate(&env); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -233,16 +255,33 @@ fn update_config_update_admin() { 200, stake_manager, stake_owner, + pho_token_staking_addr, ); // update admin to new admin - pool.update_config(&Some(admin2.clone()), &None, &None, &None, &None, &None); + pool.update_config( + &Some(admin2.clone()), + &None, + &None, + &None, + &None, + &None, + &None, + ); let share_token_address = pool.query_share_token_address(); let stake_token_address = pool.query_stake_contract_address(); // now update succeeds - pool.update_config(&Some(admin2.clone()), &None, &None, &None, &None, &None); + pool.update_config( + &Some(admin2.clone()), + &None, + &None, + &None, + &None, + &None, + &None, + ); assert_eq!( pool.query_config(), Config { @@ -256,6 +295,7 @@ fn update_config_update_admin() { max_allowed_slippage_bps: 500, max_allowed_spread_bps: 200, max_referral_bps: 5_000, + pho_token_staking_addr: Address::generate(&env), } ); } @@ -278,6 +318,7 @@ fn update_config_too_high_fees() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); + let pho_token_staking_addr = Address::generate(&env); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -290,6 +331,7 @@ fn update_config_too_high_fees() { 200, stake_manager, stake_owner, + pho_token_staking_addr, ); // update fees and recipient @@ -300,6 +342,7 @@ fn update_config_too_high_fees() { &None, &None, &None, + &None, ); } @@ -321,6 +364,8 @@ fn update_liquidity_pool_works() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); + let pho_token_staking_addr = Address::generate(&env); + let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( &env, @@ -332,6 +377,7 @@ fn update_liquidity_pool_works() { 200, stake_manager, stake_owner, + pho_token_staking_addr, ); let new_wasm_hash = install_new_lp_wasm(&env); @@ -380,6 +426,8 @@ fn update_configs_all_bps_values_should_work() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); + let pho_token_staking_addr = Address::generate(&env); + let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( &env, @@ -391,6 +439,7 @@ fn update_configs_all_bps_values_should_work() { 200, stake_manager, stake_owner, + pho_token_staking_addr, ); let share_token_address = pool.query_share_token_address(); @@ -409,6 +458,7 @@ fn update_configs_all_bps_values_should_work() { max_allowed_slippage_bps: 500, max_allowed_spread_bps: 200, max_referral_bps: 5_000, + pho_token_staking_addr: Address::generate(&env), } ); @@ -420,6 +470,7 @@ fn update_configs_all_bps_values_should_work() { &Some(1000i64), &Some(1000i64), &Some(1000i64), + &None, ); // assert the changes @@ -436,6 +487,7 @@ fn update_configs_all_bps_values_should_work() { max_allowed_slippage_bps: 1000, max_allowed_spread_bps: 1000, max_referral_bps: 1000, + pho_token_staking_addr: Address::generate(&env), } ); } @@ -466,6 +518,7 @@ fn test_initialize_with_maximum_allowed_swap_fee_bps_over_the_cap_should_fail() min_reward: 5i128, manager: Address::generate(&env), max_complexity: 10u32, + pho_token_staking_addr: Address::generate(&env), }; let stake_wasm_hash = install_stake_wasm(&env); let token_wasm_hash = install_token_wasm(&env); diff --git a/contracts/pool/src/tests/liquidity.rs b/contracts/pool/src/tests/liquidity.rs index d19ca1c2e..87f06a9c9 100644 --- a/contracts/pool/src/tests/liquidity.rs +++ b/contracts/pool/src/tests/liquidity.rs @@ -32,6 +32,7 @@ fn provide_liquidity() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); + let pho_token_staking_addr = Address::generate(&env); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -44,6 +45,7 @@ fn provide_liquidity() { None, stake_manager, stake_owner, + pho_token_staking_addr, ); let share_token_address = pool.query_share_token_address(); @@ -153,6 +155,7 @@ fn withdraw_liquidity() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); + let pho_token_staking_addr = Address::generate(&env); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -165,6 +168,7 @@ fn withdraw_liquidity() { None, stake_manager, stake_owner, + pho_token_staking_addr, ); let share_token_address = pool.query_share_token_address(); @@ -287,6 +291,7 @@ fn swap_with_no_amounts() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); + let pho_token_staking_addr = Address::generate(&env); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -299,6 +304,7 @@ fn swap_with_no_amounts() { None, stake_manager, stake_owner, + pho_token_staking_addr, ); token1.mint(&user1, &10_001_000); @@ -327,6 +333,7 @@ fn withdraw_liqudity_below_min() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); + let pho_token_staking_addr = Address::generate(&env); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -339,6 +346,7 @@ fn withdraw_liqudity_below_min() { None, stake_manager, stake_owner, + pho_token_staking_addr, ); token1.mint(&user1, &10_000); @@ -379,6 +387,7 @@ fn query_share_valid_liquidity() { let user3 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); + let pho_token_staking_addr = Address::generate(&env); let pool = deploy_liquidity_pool_contract( &env, @@ -390,6 +399,7 @@ fn query_share_valid_liquidity() { None, stake_manager, stake_owner, + pho_token_staking_addr, ); let share_token_address = pool.query_share_token_address(); @@ -749,6 +759,7 @@ fn query_share_empty_pool() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); + let pho_token_staking_addr = Address::generate(&env); let pool = deploy_liquidity_pool_contract( &env, @@ -760,6 +771,7 @@ fn query_share_empty_pool() { None, stake_manager, stake_owner, + pho_token_staking_addr, ); let share_token_address = pool.query_share_token_address(); @@ -793,6 +805,7 @@ fn provide_liquidity_slippage_tolerance_too_high() { let mut admin1 = Address::generate(&env); let mut admin2 = Address::generate(&env); + let pho_token_staking_addr = Address::generate(&env); let mut token1 = deploy_token_contract(&env, &admin1); let mut token2 = deploy_token_contract(&env, &admin2); @@ -811,6 +824,7 @@ fn provide_liquidity_slippage_tolerance_too_high() { None, Address::generate(&env), Address::generate(&env), + pho_token_staking_addr, ); pool.provide_liquidity( @@ -832,6 +846,7 @@ fn test_query_info_for_factory_works() { let mut admin1 = Address::generate(&env); let mut admin2 = Address::generate(&env); + let pho_token_staking_addr = Address::generate(&env); let mut token1 = deploy_token_contract(&env, &admin1); let mut token2 = deploy_token_contract(&env, &admin2); @@ -853,6 +868,7 @@ fn test_query_info_for_factory_works() { 200, stake_manager, stake_owner, + pho_token_staking_addr, ); let result = pool.query_pool_info_for_factory(); @@ -896,6 +912,7 @@ fn provide_liqudity_with_deadline_should_work() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); + let pho_token_staking_addr = Address::generate(&env); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -908,6 +925,7 @@ fn provide_liqudity_with_deadline_should_work() { None, stake_manager, stake_owner, + pho_token_staking_addr, ); let share_token_address = pool.query_share_token_address(); @@ -1018,6 +1036,7 @@ fn provide_liqudity_past_deadline_should_panic() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); + let pho_token_staking_addr = Address::generate(&env); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -1030,6 +1049,7 @@ fn provide_liqudity_past_deadline_should_panic() { None, stake_manager, stake_owner, + pho_token_staking_addr, ); token1.mint(&user1, &10_000); @@ -1068,6 +1088,7 @@ fn withdraw_liquidity_with_deadline_should_work() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); + let pho_token_staking_addr = Address::generate(&env); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -1080,6 +1101,7 @@ fn withdraw_liquidity_with_deadline_should_work() { None, stake_manager, stake_owner, + pho_token_staking_addr, ); let share_token_address = pool.query_share_token_address(); @@ -1186,6 +1208,7 @@ fn withdraw_liquidity_past_deadline_should_panic() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); + let pho_token_staking_addr = Address::generate(&env); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -1198,6 +1221,7 @@ fn withdraw_liquidity_past_deadline_should_panic() { None, stake_manager, stake_owner, + pho_token_staking_addr, ); token1.mint(&user1, &10_000); diff --git a/contracts/pool/src/tests/setup.rs b/contracts/pool/src/tests/setup.rs index 2d30a3eea..2e46578c6 100644 --- a/contracts/pool/src/tests/setup.rs +++ b/contracts/pool/src/tests/setup.rs @@ -49,6 +49,7 @@ pub fn deploy_liquidity_pool_contract<'a>( max_allowed_spread_bps: impl Into>, stake_manager: Address, stake_owner: Address, + pho_token_staking_addr: Address, ) -> LiquidityPoolClient<'a> { let admin = admin.into().unwrap_or(Address::generate(env)); let pool = LiquidityPoolClient::new(env, &env.register(LiquidityPool, ())); @@ -65,6 +66,7 @@ pub fn deploy_liquidity_pool_contract<'a>( min_reward: 5i128, manager: stake_manager, max_complexity: 10u32, + pho_token_staking_addr, }; let stake_wasm_hash = install_stake_wasm(env); let token_wasm_hash = install_token_wasm(env); diff --git a/contracts/pool/src/tests/stake_deployment.rs b/contracts/pool/src/tests/stake_deployment.rs index de41e7bbf..c95f7f151 100644 --- a/contracts/pool/src/tests/stake_deployment.rs +++ b/contracts/pool/src/tests/stake_deployment.rs @@ -29,6 +29,7 @@ fn confirm_stake_contract_deployment() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); + let pho_token_staking_addr = Address::generate(&env); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -41,6 +42,7 @@ fn confirm_stake_contract_deployment() { 200, stake_manager.clone(), stake_owner.clone(), + pho_token_staking_addr.clone(), ); let share_token_address = pool.query_share_token_address(); @@ -59,6 +61,7 @@ fn confirm_stake_contract_deployment() { max_allowed_slippage_bps: 500, max_allowed_spread_bps: 200, max_referral_bps: 5_000, + pho_token_staking_addr, } ); @@ -113,6 +116,7 @@ fn second_pool_deployment_should_fail() { min_reward: 5i128, manager: Address::generate(&env), max_complexity: 10u32, + pho_token_staking_addr: Address::generate(&env), }; let lp_init_info = LiquidityPoolInitInfo { diff --git a/contracts/pool/src/tests/swap.rs b/contracts/pool/src/tests/swap.rs index 213263d5b..88c333085 100644 --- a/contracts/pool/src/tests/swap.rs +++ b/contracts/pool/src/tests/swap.rs @@ -41,6 +41,7 @@ fn simple_swap() { None, stake_manager, stake_owner, + Address::generate(&env), ); let liquidity_amount = 100_000_000_000_000_i128; // 10 million with 7 decimal places @@ -203,6 +204,7 @@ fn simple_swap_with_preferred_pool_fee() { None, stake_manager, stake_owner, + Address::generate(&env), ); token1.mint(&user1, &1_001_000); @@ -357,6 +359,7 @@ fn simple_swap_should_panic_when_user_accepted_fee_is_less_than_pool_fee() { None, stake_manager, stake_owner, + Address::generate(&env), ); token1.mint(&user1, &1_001_000); @@ -487,6 +490,7 @@ fn simple_swap_with_referral_fee() { None, stake_manager, stake_owner, + Address::generate(&env), ); token1.mint(&user1, &1_001_000); @@ -617,6 +621,7 @@ fn test_swap_should_fail_when_referral_fee_is_larger_than_allowed() { None, stake_manager, stake_owner, + Address::generate(&env), ); token1.mint(&user1, &1_001_000); @@ -683,6 +688,7 @@ fn swap_should_panic_with_bad_max_spread() { None, stake_manager, stake_owner, + Address::generate(&env), ); token1.mint(&user1, &1_001_000); @@ -741,6 +747,7 @@ fn swap_with_high_fee() { None, stake_manager, stake_owner, + Address::generate(&env), ); let initial_liquidity = 1_000_000i128; @@ -827,6 +834,7 @@ fn swap_simulation_even_pool() { None, stake_manager, stake_owner, + Address::generate(&env), ); let initial_liquidity = 1_000_000i128; @@ -932,6 +940,7 @@ fn swap_simulation_one_third_pool() { None, stake_manager, stake_owner, + Address::generate(&env), ); let initial_liquidity = 1_000_000i128; @@ -1037,6 +1046,7 @@ fn test_swap_fee_variants(swap_fees: i64, commission_fee: i128) { 10_000i64, stake_manager, stake_owner, + Address::generate(&env), ); let initial_liquidity = 110_358_880_127; // taken from the current amount of tokens in pool @@ -1122,6 +1132,7 @@ fn test_v_phx_vul_021_should_panic_when_max_spread_invalid_range(max_spread: Opt Some(500i64), Address::generate(&env), Address::generate(&env), + Address::generate(&env), ); token1.mint(&user1, &1_001_000); @@ -1178,6 +1189,7 @@ fn test_v_phx_vul_017_should_panic_when_swapping_non_existing_token_in_pool() { None, Address::generate(&env), Address::generate(&env), + Address::generate(&env), ); // Swap fails because we provide incorrect token as offer token. pool.swap( @@ -1221,6 +1233,7 @@ fn test_v_phx_vul_017_should_panic_when_simulating_swap_for_non_existing_token_i None, Address::generate(&env), Address::generate(&env), + Address::generate(&env), ); // Simulate swap fails because we provide incorrect token as offer token. pool.simulate_swap( @@ -1259,6 +1272,7 @@ fn test_v_phx_vul_017_should_panic_when_simulating_reverse_swap_for_non_existing None, Address::generate(&env), Address::generate(&env), + Address::generate(&env), ); // Simulate swap fails because we provide incorrect token as offer token. pool.simulate_reverse_swap( @@ -1293,6 +1307,7 @@ fn test_should_swap_with_valid_ask_asset_min_amount() { None, Address::generate(&env), Address::generate(&env), + Address::generate(&env), ); token1.mint(&user, &1_050_000); @@ -1361,6 +1376,7 @@ fn test_should_fail_when_invalid_ask_asset_min_amount() { None, stake_manager, stake_owner, + Address::generate(&env), ); token1.mint(&user, &1_001_000); @@ -1417,6 +1433,7 @@ fn simple_swap_with_deadline_success() { None, stake_manager, stake_owner, + Address::generate(&env), ); token1.mint(&user1, &1_001_000); @@ -1539,6 +1556,7 @@ fn simple_swap_with_should_fail_when_after_the_deadline() { None, stake_manager, stake_owner, + Address::generate(&env), ); token1.mint(&user1, &1_001_000); @@ -1602,6 +1620,7 @@ fn simple_swap_with_biggest_possible_decimal_precision() { Some(10_000), stake_manager, stake_owner, + Address::generate(&env), ); token1.mint(&user1, &999_000_000_000_001_000); diff --git a/packages/phoenix/src/utils.rs b/packages/phoenix/src/utils.rs index 4503679af..9af82b91a 100644 --- a/packages/phoenix/src/utils.rs +++ b/packages/phoenix/src/utils.rs @@ -68,6 +68,7 @@ pub struct StakeInitInfo { pub min_reward: i128, pub manager: Address, pub max_complexity: u32, + pub pho_token_staking_addr: Address, } #[contracttype] From cb0bc65438805e9769d764c4d81c156d3c192bb2 Mon Sep 17 00:00:00 2001 From: gangov <6922910+gangov@users.noreply.github.com> Date: Sat, 7 Dec 2024 21:49:18 +0200 Subject: [PATCH 2/7] removes the staking address from the pool initialisation --- contracts/pool/src/contract.rs | 6 ++-- contracts/pool/src/storage.rs | 4 +-- contracts/pool/src/tests/config.rs | 33 ++++++++--------- contracts/pool/src/tests/liquidity.rs | 36 +++++++------------ contracts/pool/src/tests/setup.rs | 3 +- contracts/pool/src/tests/stake_deployment.rs | 3 +- contracts/pool/src/tests/swap.rs | 38 ++++++++++---------- packages/phoenix/src/utils.rs | 1 - 8 files changed, 53 insertions(+), 71 deletions(-) diff --git a/contracts/pool/src/contract.rs b/contracts/pool/src/contract.rs index e3e4b2355..319cfe303 100644 --- a/contracts/pool/src/contract.rs +++ b/contracts/pool/src/contract.rs @@ -249,7 +249,7 @@ impl LiquidityPoolTrait for LiquidityPool { max_allowed_slippage_bps, max_allowed_spread_bps, max_referral_bps, - pho_token_staking_addr: stake_init_info.pho_token_staking_addr, + pho_token_staking_addr: None, }; save_config(&env, config); @@ -580,7 +580,7 @@ impl LiquidityPoolTrait for LiquidityPool { config.max_referral_bps = max_referral_bps; } if let Some(pho_token_staking_addr) = pho_token_staking_addr { - config.pho_token_staking_addr = pho_token_staking_addr; + config.pho_token_staking_addr = Some(pho_token_staking_addr); } save_config(&env, config); @@ -1410,7 +1410,7 @@ mod tests { max_allowed_slippage_bps: 100i64, max_allowed_spread_bps: 100i64, max_referral_bps: 1_000i64, - pho_token_staking_addr: Address::generate(&env), + pho_token_staking_addr: None, }; split_deposit_based_on_pool_ratio(&env, config, 100, 100, 100, &Address::generate(&env)); } diff --git a/contracts/pool/src/storage.rs b/contracts/pool/src/storage.rs index e29370c56..372cfaf21 100644 --- a/contracts/pool/src/storage.rs +++ b/contracts/pool/src/storage.rs @@ -50,7 +50,7 @@ pub struct Config { pub max_allowed_spread_bps: i64, /// The maximum allowed percentage (in bps) for referral fee pub max_referral_bps: i64, - pub pho_token_staking_addr: Address, + pub pho_token_staking_addr: Option
, } const CONFIG: Symbol = symbol_short!("CONFIG"); @@ -703,7 +703,7 @@ mod tests { fee_recipient: Address::generate(&env), max_allowed_spread_bps: 10_i64, max_referral_bps: 10i64, - pho_token_staking_addr: Address::generate(&env), + pho_token_staking_addr: Some(Address::generate(&env)), }; let result = config.max_allowed_slippage(); diff --git a/contracts/pool/src/tests/config.rs b/contracts/pool/src/tests/config.rs index 7558b6a9f..38884b15c 100644 --- a/contracts/pool/src/tests/config.rs +++ b/contracts/pool/src/tests/config.rs @@ -39,7 +39,6 @@ fn test_initialize_with_bigger_first_token_should_fail() { min_reward: 5i128, manager: Address::generate(&env), max_complexity: 10u32, - pho_token_staking_addr: Address::generate(&env), }; let stake_wasm_hash = install_stake_wasm(&env); let token_wasm_hash = install_token_wasm(&env); @@ -87,7 +86,7 @@ fn update_config() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); - let pho_token_staking_addr = Address::generate(&env); + let pho_token_staking_addr = Some(Address::generate(&env)); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -100,7 +99,7 @@ fn update_config() { 200, stake_manager, stake_owner, - pho_token_staking_addr, + pho_token_staking_addr.clone(), ); let share_token_address = pool.query_share_token_address(); @@ -119,7 +118,7 @@ fn update_config() { max_allowed_slippage_bps: 500, max_allowed_spread_bps: 200, max_referral_bps: 5_000, - pho_token_staking_addr: Address::generate(&env), + pho_token_staking_addr, } ); @@ -148,7 +147,7 @@ fn update_config() { max_allowed_slippage_bps: 500, max_allowed_spread_bps: 200, max_referral_bps: 1_000, - pho_token_staking_addr: new_pho_token_staking_addr, + pho_token_staking_addr: Some(new_pho_token_staking_addr), } ); @@ -175,7 +174,7 @@ fn update_config() { max_allowed_slippage_bps: 500, max_allowed_spread_bps: 5_000, max_referral_bps: 500, - pho_token_staking_addr: Address::generate(&env), + pho_token_staking_addr: None, } ); } @@ -197,7 +196,6 @@ fn update_config_unauthorized() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); - let pho_token_staking_addr = Address::generate(&env); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -210,7 +208,7 @@ fn update_config_unauthorized() { 200, stake_manager, stake_owner, - pho_token_staking_addr, + None, ); pool.update_config( @@ -242,7 +240,6 @@ fn update_config_update_admin() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); - let pho_token_staking_addr = Address::generate(&env); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -255,7 +252,7 @@ fn update_config_update_admin() { 200, stake_manager, stake_owner, - pho_token_staking_addr, + None, ); // update admin to new admin @@ -271,6 +268,7 @@ fn update_config_update_admin() { let share_token_address = pool.query_share_token_address(); let stake_token_address = pool.query_stake_contract_address(); + let new_token_staking_addr = Address::generate(&env); // now update succeeds pool.update_config( @@ -280,7 +278,7 @@ fn update_config_update_admin() { &None, &None, &None, - &None, + &Some(new_token_staking_addr.clone()), ); assert_eq!( pool.query_config(), @@ -295,7 +293,7 @@ fn update_config_update_admin() { max_allowed_slippage_bps: 500, max_allowed_spread_bps: 200, max_referral_bps: 5_000, - pho_token_staking_addr: Address::generate(&env), + pho_token_staking_addr: Some(new_token_staking_addr), } ); } @@ -331,7 +329,7 @@ fn update_config_too_high_fees() { 200, stake_manager, stake_owner, - pho_token_staking_addr, + None, ); // update fees and recipient @@ -377,7 +375,7 @@ fn update_liquidity_pool_works() { 200, stake_manager, stake_owner, - pho_token_staking_addr, + None, ); let new_wasm_hash = install_new_lp_wasm(&env); @@ -439,7 +437,7 @@ fn update_configs_all_bps_values_should_work() { 200, stake_manager, stake_owner, - pho_token_staking_addr, + None, ); let share_token_address = pool.query_share_token_address(); @@ -458,7 +456,7 @@ fn update_configs_all_bps_values_should_work() { max_allowed_slippage_bps: 500, max_allowed_spread_bps: 200, max_referral_bps: 5_000, - pho_token_staking_addr: Address::generate(&env), + pho_token_staking_addr: None, } ); @@ -487,7 +485,7 @@ fn update_configs_all_bps_values_should_work() { max_allowed_slippage_bps: 1000, max_allowed_spread_bps: 1000, max_referral_bps: 1000, - pho_token_staking_addr: Address::generate(&env), + pho_token_staking_addr: None, } ); } @@ -518,7 +516,6 @@ fn test_initialize_with_maximum_allowed_swap_fee_bps_over_the_cap_should_fail() min_reward: 5i128, manager: Address::generate(&env), max_complexity: 10u32, - pho_token_staking_addr: Address::generate(&env), }; let stake_wasm_hash = install_stake_wasm(&env); let token_wasm_hash = install_token_wasm(&env); diff --git a/contracts/pool/src/tests/liquidity.rs b/contracts/pool/src/tests/liquidity.rs index 87f06a9c9..4c127fedd 100644 --- a/contracts/pool/src/tests/liquidity.rs +++ b/contracts/pool/src/tests/liquidity.rs @@ -32,7 +32,6 @@ fn provide_liquidity() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); - let pho_token_staking_addr = Address::generate(&env); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -45,7 +44,7 @@ fn provide_liquidity() { None, stake_manager, stake_owner, - pho_token_staking_addr, + Some(Address::generate(&env)), ); let share_token_address = pool.query_share_token_address(); @@ -155,7 +154,6 @@ fn withdraw_liquidity() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); - let pho_token_staking_addr = Address::generate(&env); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -168,7 +166,7 @@ fn withdraw_liquidity() { None, stake_manager, stake_owner, - pho_token_staking_addr, + Some(Address::generate(&env)), ); let share_token_address = pool.query_share_token_address(); @@ -291,7 +289,6 @@ fn swap_with_no_amounts() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); - let pho_token_staking_addr = Address::generate(&env); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -304,7 +301,7 @@ fn swap_with_no_amounts() { None, stake_manager, stake_owner, - pho_token_staking_addr, + None, ); token1.mint(&user1, &10_001_000); @@ -333,7 +330,6 @@ fn withdraw_liqudity_below_min() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); - let pho_token_staking_addr = Address::generate(&env); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -346,7 +342,7 @@ fn withdraw_liqudity_below_min() { None, stake_manager, stake_owner, - pho_token_staking_addr, + None, ); token1.mint(&user1, &10_000); @@ -387,7 +383,6 @@ fn query_share_valid_liquidity() { let user3 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); - let pho_token_staking_addr = Address::generate(&env); let pool = deploy_liquidity_pool_contract( &env, @@ -399,7 +394,7 @@ fn query_share_valid_liquidity() { None, stake_manager, stake_owner, - pho_token_staking_addr, + None, ); let share_token_address = pool.query_share_token_address(); @@ -759,7 +754,6 @@ fn query_share_empty_pool() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); - let pho_token_staking_addr = Address::generate(&env); let pool = deploy_liquidity_pool_contract( &env, @@ -771,7 +765,7 @@ fn query_share_empty_pool() { None, stake_manager, stake_owner, - pho_token_staking_addr, + None, ); let share_token_address = pool.query_share_token_address(); @@ -805,7 +799,6 @@ fn provide_liquidity_slippage_tolerance_too_high() { let mut admin1 = Address::generate(&env); let mut admin2 = Address::generate(&env); - let pho_token_staking_addr = Address::generate(&env); let mut token1 = deploy_token_contract(&env, &admin1); let mut token2 = deploy_token_contract(&env, &admin2); @@ -824,7 +817,7 @@ fn provide_liquidity_slippage_tolerance_too_high() { None, Address::generate(&env), Address::generate(&env), - pho_token_staking_addr, + None, ); pool.provide_liquidity( @@ -846,7 +839,6 @@ fn test_query_info_for_factory_works() { let mut admin1 = Address::generate(&env); let mut admin2 = Address::generate(&env); - let pho_token_staking_addr = Address::generate(&env); let mut token1 = deploy_token_contract(&env, &admin1); let mut token2 = deploy_token_contract(&env, &admin2); @@ -868,7 +860,7 @@ fn test_query_info_for_factory_works() { 200, stake_manager, stake_owner, - pho_token_staking_addr, + None, ); let result = pool.query_pool_info_for_factory(); @@ -912,7 +904,6 @@ fn provide_liqudity_with_deadline_should_work() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); - let pho_token_staking_addr = Address::generate(&env); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -925,7 +916,7 @@ fn provide_liqudity_with_deadline_should_work() { None, stake_manager, stake_owner, - pho_token_staking_addr, + None, ); let share_token_address = pool.query_share_token_address(); @@ -1036,7 +1027,6 @@ fn provide_liqudity_past_deadline_should_panic() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); - let pho_token_staking_addr = Address::generate(&env); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -1049,7 +1039,7 @@ fn provide_liqudity_past_deadline_should_panic() { None, stake_manager, stake_owner, - pho_token_staking_addr, + None, ); token1.mint(&user1, &10_000); @@ -1088,7 +1078,6 @@ fn withdraw_liquidity_with_deadline_should_work() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); - let pho_token_staking_addr = Address::generate(&env); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -1101,7 +1090,7 @@ fn withdraw_liquidity_with_deadline_should_work() { None, stake_manager, stake_owner, - pho_token_staking_addr, + Some(Address::generate(&env)), ); let share_token_address = pool.query_share_token_address(); @@ -1208,7 +1197,6 @@ fn withdraw_liquidity_past_deadline_should_panic() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); - let pho_token_staking_addr = Address::generate(&env); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -1221,7 +1209,7 @@ fn withdraw_liquidity_past_deadline_should_panic() { None, stake_manager, stake_owner, - pho_token_staking_addr, + None, ); token1.mint(&user1, &10_000); diff --git a/contracts/pool/src/tests/setup.rs b/contracts/pool/src/tests/setup.rs index 2e46578c6..8bfab570e 100644 --- a/contracts/pool/src/tests/setup.rs +++ b/contracts/pool/src/tests/setup.rs @@ -49,7 +49,7 @@ pub fn deploy_liquidity_pool_contract<'a>( max_allowed_spread_bps: impl Into>, stake_manager: Address, stake_owner: Address, - pho_token_staking_addr: Address, + pho_token_staking_addr: Option
, ) -> LiquidityPoolClient<'a> { let admin = admin.into().unwrap_or(Address::generate(env)); let pool = LiquidityPoolClient::new(env, &env.register(LiquidityPool, ())); @@ -66,7 +66,6 @@ pub fn deploy_liquidity_pool_contract<'a>( min_reward: 5i128, manager: stake_manager, max_complexity: 10u32, - pho_token_staking_addr, }; let stake_wasm_hash = install_stake_wasm(env); let token_wasm_hash = install_token_wasm(env); diff --git a/contracts/pool/src/tests/stake_deployment.rs b/contracts/pool/src/tests/stake_deployment.rs index c95f7f151..188b9b26d 100644 --- a/contracts/pool/src/tests/stake_deployment.rs +++ b/contracts/pool/src/tests/stake_deployment.rs @@ -29,7 +29,7 @@ fn confirm_stake_contract_deployment() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); - let pho_token_staking_addr = Address::generate(&env); + let pho_token_staking_addr = Some(Address::generate(&env)); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -116,7 +116,6 @@ fn second_pool_deployment_should_fail() { min_reward: 5i128, manager: Address::generate(&env), max_complexity: 10u32, - pho_token_staking_addr: Address::generate(&env), }; let lp_init_info = LiquidityPoolInitInfo { diff --git a/contracts/pool/src/tests/swap.rs b/contracts/pool/src/tests/swap.rs index 88c333085..baaf87c2f 100644 --- a/contracts/pool/src/tests/swap.rs +++ b/contracts/pool/src/tests/swap.rs @@ -41,7 +41,7 @@ fn simple_swap() { None, stake_manager, stake_owner, - Address::generate(&env), + Some(Address::generate(&env)), ); let liquidity_amount = 100_000_000_000_000_i128; // 10 million with 7 decimal places @@ -204,7 +204,7 @@ fn simple_swap_with_preferred_pool_fee() { None, stake_manager, stake_owner, - Address::generate(&env), + Some(Address::generate(&env)), ); token1.mint(&user1, &1_001_000); @@ -359,7 +359,7 @@ fn simple_swap_should_panic_when_user_accepted_fee_is_less_than_pool_fee() { None, stake_manager, stake_owner, - Address::generate(&env), + Some(Address::generate(&env)), ); token1.mint(&user1, &1_001_000); @@ -490,7 +490,7 @@ fn simple_swap_with_referral_fee() { None, stake_manager, stake_owner, - Address::generate(&env), + Some(Address::generate(&env)), ); token1.mint(&user1, &1_001_000); @@ -621,7 +621,7 @@ fn test_swap_should_fail_when_referral_fee_is_larger_than_allowed() { None, stake_manager, stake_owner, - Address::generate(&env), + Some(Address::generate(&env)), ); token1.mint(&user1, &1_001_000); @@ -688,7 +688,7 @@ fn swap_should_panic_with_bad_max_spread() { None, stake_manager, stake_owner, - Address::generate(&env), + Some(Address::generate(&env)), ); token1.mint(&user1, &1_001_000); @@ -747,7 +747,7 @@ fn swap_with_high_fee() { None, stake_manager, stake_owner, - Address::generate(&env), + Some(Address::generate(&env)), ); let initial_liquidity = 1_000_000i128; @@ -834,7 +834,7 @@ fn swap_simulation_even_pool() { None, stake_manager, stake_owner, - Address::generate(&env), + Some(Address::generate(&env)), ); let initial_liquidity = 1_000_000i128; @@ -940,7 +940,7 @@ fn swap_simulation_one_third_pool() { None, stake_manager, stake_owner, - Address::generate(&env), + Some(Address::generate(&env)), ); let initial_liquidity = 1_000_000i128; @@ -1046,7 +1046,7 @@ fn test_swap_fee_variants(swap_fees: i64, commission_fee: i128) { 10_000i64, stake_manager, stake_owner, - Address::generate(&env), + Some(Address::generate(&env)), ); let initial_liquidity = 110_358_880_127; // taken from the current amount of tokens in pool @@ -1132,7 +1132,7 @@ fn test_v_phx_vul_021_should_panic_when_max_spread_invalid_range(max_spread: Opt Some(500i64), Address::generate(&env), Address::generate(&env), - Address::generate(&env), + Some(Address::generate(&env)), ); token1.mint(&user1, &1_001_000); @@ -1189,7 +1189,7 @@ fn test_v_phx_vul_017_should_panic_when_swapping_non_existing_token_in_pool() { None, Address::generate(&env), Address::generate(&env), - Address::generate(&env), + Some(Address::generate(&env)), ); // Swap fails because we provide incorrect token as offer token. pool.swap( @@ -1233,7 +1233,7 @@ fn test_v_phx_vul_017_should_panic_when_simulating_swap_for_non_existing_token_i None, Address::generate(&env), Address::generate(&env), - Address::generate(&env), + Some(Address::generate(&env)), ); // Simulate swap fails because we provide incorrect token as offer token. pool.simulate_swap( @@ -1272,7 +1272,7 @@ fn test_v_phx_vul_017_should_panic_when_simulating_reverse_swap_for_non_existing None, Address::generate(&env), Address::generate(&env), - Address::generate(&env), + Some(Address::generate(&env)), ); // Simulate swap fails because we provide incorrect token as offer token. pool.simulate_reverse_swap( @@ -1307,7 +1307,7 @@ fn test_should_swap_with_valid_ask_asset_min_amount() { None, Address::generate(&env), Address::generate(&env), - Address::generate(&env), + Some(Address::generate(&env)), ); token1.mint(&user, &1_050_000); @@ -1376,7 +1376,7 @@ fn test_should_fail_when_invalid_ask_asset_min_amount() { None, stake_manager, stake_owner, - Address::generate(&env), + Some(Address::generate(&env)), ); token1.mint(&user, &1_001_000); @@ -1433,7 +1433,7 @@ fn simple_swap_with_deadline_success() { None, stake_manager, stake_owner, - Address::generate(&env), + Some(Address::generate(&env)), ); token1.mint(&user1, &1_001_000); @@ -1556,7 +1556,7 @@ fn simple_swap_with_should_fail_when_after_the_deadline() { None, stake_manager, stake_owner, - Address::generate(&env), + None, ); token1.mint(&user1, &1_001_000); @@ -1620,7 +1620,7 @@ fn simple_swap_with_biggest_possible_decimal_precision() { Some(10_000), stake_manager, stake_owner, - Address::generate(&env), + None, ); token1.mint(&user1, &999_000_000_000_001_000); diff --git a/packages/phoenix/src/utils.rs b/packages/phoenix/src/utils.rs index 9af82b91a..4503679af 100644 --- a/packages/phoenix/src/utils.rs +++ b/packages/phoenix/src/utils.rs @@ -68,7 +68,6 @@ pub struct StakeInitInfo { pub min_reward: i128, pub manager: Address, pub max_complexity: u32, - pub pho_token_staking_addr: Address, } #[contracttype] From 8d84a588d546a95211cff14ee9b29135c8ac4d51 Mon Sep 17 00:00:00 2001 From: gangov <6922910+gangov@users.noreply.github.com> Date: Sat, 7 Dec 2024 22:13:42 +0200 Subject: [PATCH 3/7] adds staking_breakpoint --- contracts/pool/src/contract.rs | 8 ++++++++ contracts/pool/src/storage.rs | 2 ++ 2 files changed, 10 insertions(+) diff --git a/contracts/pool/src/contract.rs b/contracts/pool/src/contract.rs index 319cfe303..8a1b569ed 100644 --- a/contracts/pool/src/contract.rs +++ b/contracts/pool/src/contract.rs @@ -110,6 +110,7 @@ pub trait LiquidityPoolTrait { max_allowed_spread_bps: Option, max_referral_bps: Option, pho_token_staking_addr: Option
, + staking_breakpoint: Option, ); // Migration entrypoint @@ -250,6 +251,7 @@ impl LiquidityPoolTrait for LiquidityPool { max_allowed_spread_bps, max_referral_bps, pho_token_staking_addr: None, + staking_breakpoint: None, }; save_config(&env, config); @@ -548,6 +550,7 @@ impl LiquidityPoolTrait for LiquidityPool { max_allowed_spread_bps: Option, max_referral_bps: Option, pho_token_staking_addr: Option
, + staking_breakpoint: Option, ) { let admin: Address = utils::get_admin(&env); admin.require_auth(); @@ -583,6 +586,10 @@ impl LiquidityPoolTrait for LiquidityPool { config.pho_token_staking_addr = Some(pho_token_staking_addr); } + if let Some(staking_breakpoint) = staking_breakpoint { + config.staking_breakpoint = Some(staking_breakpoint); + } + save_config(&env, config); } @@ -1411,6 +1418,7 @@ mod tests { max_allowed_spread_bps: 100i64, max_referral_bps: 1_000i64, pho_token_staking_addr: None, + staking_breakpoint: None, }; split_deposit_based_on_pool_ratio(&env, config, 100, 100, 100, &Address::generate(&env)); } diff --git a/contracts/pool/src/storage.rs b/contracts/pool/src/storage.rs index 372cfaf21..4d04d34a0 100644 --- a/contracts/pool/src/storage.rs +++ b/contracts/pool/src/storage.rs @@ -51,6 +51,7 @@ pub struct Config { /// The maximum allowed percentage (in bps) for referral fee pub max_referral_bps: i64, pub pho_token_staking_addr: Option
, + pub staking_breakpoint: Option, } const CONFIG: Symbol = symbol_short!("CONFIG"); @@ -704,6 +705,7 @@ mod tests { max_allowed_spread_bps: 10_i64, max_referral_bps: 10i64, pho_token_staking_addr: Some(Address::generate(&env)), + staking_breakpoint: None, }; let result = config.max_allowed_slippage(); From d32c699829faa43c24ba26659015db6f0b24c460 Mon Sep 17 00:00:00 2001 From: gangov <6922910+gangov@users.noreply.github.com> Date: Sat, 7 Dec 2024 22:13:51 +0200 Subject: [PATCH 4/7] removes unnecessary pool initialisation param --- contracts/pool/src/tests/config.rs | 25 +++++++++++--------- contracts/pool/src/tests/liquidity.rs | 12 ---------- contracts/pool/src/tests/setup.rs | 1 - contracts/pool/src/tests/stake_deployment.rs | 2 +- contracts/pool/src/tests/swap.rs | 19 --------------- 5 files changed, 15 insertions(+), 44 deletions(-) diff --git a/contracts/pool/src/tests/config.rs b/contracts/pool/src/tests/config.rs index 38884b15c..a710dbcab 100644 --- a/contracts/pool/src/tests/config.rs +++ b/contracts/pool/src/tests/config.rs @@ -86,7 +86,6 @@ fn update_config() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); - let pho_token_staking_addr = Some(Address::generate(&env)); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -99,7 +98,6 @@ fn update_config() { 200, stake_manager, stake_owner, - pho_token_staking_addr.clone(), ); let share_token_address = pool.query_share_token_address(); @@ -118,7 +116,8 @@ fn update_config() { max_allowed_slippage_bps: 500, max_allowed_spread_bps: 200, max_referral_bps: 5_000, - pho_token_staking_addr, + pho_token_staking_addr: None, + staking_breakpoint: None } ); @@ -133,6 +132,7 @@ fn update_config() { &None, &Some(1_000i64), &Some(new_pho_token_staking_addr.clone()), + &Some(500), ); assert_eq!( pool.query_config(), @@ -148,6 +148,7 @@ fn update_config() { max_allowed_spread_bps: 200, max_referral_bps: 1_000, pho_token_staking_addr: Some(new_pho_token_staking_addr), + staking_breakpoint: Some(500), } ); @@ -160,6 +161,7 @@ fn update_config() { &Some(5_000i64), &Some(500), &None, + &None, ); assert_eq!( pool.query_config(), @@ -175,6 +177,7 @@ fn update_config() { max_allowed_spread_bps: 5_000, max_referral_bps: 500, pho_token_staking_addr: None, + staking_breakpoint: None, } ); } @@ -208,7 +211,6 @@ fn update_config_unauthorized() { 200, stake_manager, stake_owner, - None, ); pool.update_config( @@ -219,6 +221,7 @@ fn update_config_unauthorized() { &None, &None, &None, + &None, ); } @@ -252,7 +255,6 @@ fn update_config_update_admin() { 200, stake_manager, stake_owner, - None, ); // update admin to new admin @@ -264,6 +266,7 @@ fn update_config_update_admin() { &None, &None, &None, + &None, ); let share_token_address = pool.query_share_token_address(); @@ -279,6 +282,7 @@ fn update_config_update_admin() { &None, &None, &Some(new_token_staking_addr.clone()), + &None, ); assert_eq!( pool.query_config(), @@ -294,6 +298,7 @@ fn update_config_update_admin() { max_allowed_spread_bps: 200, max_referral_bps: 5_000, pho_token_staking_addr: Some(new_token_staking_addr), + staking_breakpoint: None } ); } @@ -316,7 +321,6 @@ fn update_config_too_high_fees() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); - let pho_token_staking_addr = Address::generate(&env); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -329,7 +333,6 @@ fn update_config_too_high_fees() { 200, stake_manager, stake_owner, - None, ); // update fees and recipient @@ -341,6 +344,7 @@ fn update_config_too_high_fees() { &None, &None, &None, + &None, ); } @@ -362,7 +366,6 @@ fn update_liquidity_pool_works() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); - let pho_token_staking_addr = Address::generate(&env); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -375,7 +378,6 @@ fn update_liquidity_pool_works() { 200, stake_manager, stake_owner, - None, ); let new_wasm_hash = install_new_lp_wasm(&env); @@ -424,7 +426,6 @@ fn update_configs_all_bps_values_should_work() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); - let pho_token_staking_addr = Address::generate(&env); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -437,7 +438,6 @@ fn update_configs_all_bps_values_should_work() { 200, stake_manager, stake_owner, - None, ); let share_token_address = pool.query_share_token_address(); @@ -457,6 +457,7 @@ fn update_configs_all_bps_values_should_work() { max_allowed_spread_bps: 200, max_referral_bps: 5_000, pho_token_staking_addr: None, + staking_breakpoint: None, } ); @@ -469,6 +470,7 @@ fn update_configs_all_bps_values_should_work() { &Some(1000i64), &Some(1000i64), &None, + &Some(500), ); // assert the changes @@ -486,6 +488,7 @@ fn update_configs_all_bps_values_should_work() { max_allowed_spread_bps: 1000, max_referral_bps: 1000, pho_token_staking_addr: None, + staking_breakpoint: Some(500), } ); } diff --git a/contracts/pool/src/tests/liquidity.rs b/contracts/pool/src/tests/liquidity.rs index 4c127fedd..d19ca1c2e 100644 --- a/contracts/pool/src/tests/liquidity.rs +++ b/contracts/pool/src/tests/liquidity.rs @@ -44,7 +44,6 @@ fn provide_liquidity() { None, stake_manager, stake_owner, - Some(Address::generate(&env)), ); let share_token_address = pool.query_share_token_address(); @@ -166,7 +165,6 @@ fn withdraw_liquidity() { None, stake_manager, stake_owner, - Some(Address::generate(&env)), ); let share_token_address = pool.query_share_token_address(); @@ -301,7 +299,6 @@ fn swap_with_no_amounts() { None, stake_manager, stake_owner, - None, ); token1.mint(&user1, &10_001_000); @@ -342,7 +339,6 @@ fn withdraw_liqudity_below_min() { None, stake_manager, stake_owner, - None, ); token1.mint(&user1, &10_000); @@ -394,7 +390,6 @@ fn query_share_valid_liquidity() { None, stake_manager, stake_owner, - None, ); let share_token_address = pool.query_share_token_address(); @@ -765,7 +760,6 @@ fn query_share_empty_pool() { None, stake_manager, stake_owner, - None, ); let share_token_address = pool.query_share_token_address(); @@ -817,7 +811,6 @@ fn provide_liquidity_slippage_tolerance_too_high() { None, Address::generate(&env), Address::generate(&env), - None, ); pool.provide_liquidity( @@ -860,7 +853,6 @@ fn test_query_info_for_factory_works() { 200, stake_manager, stake_owner, - None, ); let result = pool.query_pool_info_for_factory(); @@ -916,7 +908,6 @@ fn provide_liqudity_with_deadline_should_work() { None, stake_manager, stake_owner, - None, ); let share_token_address = pool.query_share_token_address(); @@ -1039,7 +1030,6 @@ fn provide_liqudity_past_deadline_should_panic() { None, stake_manager, stake_owner, - None, ); token1.mint(&user1, &10_000); @@ -1090,7 +1080,6 @@ fn withdraw_liquidity_with_deadline_should_work() { None, stake_manager, stake_owner, - Some(Address::generate(&env)), ); let share_token_address = pool.query_share_token_address(); @@ -1209,7 +1198,6 @@ fn withdraw_liquidity_past_deadline_should_panic() { None, stake_manager, stake_owner, - None, ); token1.mint(&user1, &10_000); diff --git a/contracts/pool/src/tests/setup.rs b/contracts/pool/src/tests/setup.rs index 8bfab570e..2d30a3eea 100644 --- a/contracts/pool/src/tests/setup.rs +++ b/contracts/pool/src/tests/setup.rs @@ -49,7 +49,6 @@ pub fn deploy_liquidity_pool_contract<'a>( max_allowed_spread_bps: impl Into>, stake_manager: Address, stake_owner: Address, - pho_token_staking_addr: Option
, ) -> LiquidityPoolClient<'a> { let admin = admin.into().unwrap_or(Address::generate(env)); let pool = LiquidityPoolClient::new(env, &env.register(LiquidityPool, ())); diff --git a/contracts/pool/src/tests/stake_deployment.rs b/contracts/pool/src/tests/stake_deployment.rs index 188b9b26d..6cef048d1 100644 --- a/contracts/pool/src/tests/stake_deployment.rs +++ b/contracts/pool/src/tests/stake_deployment.rs @@ -42,7 +42,6 @@ fn confirm_stake_contract_deployment() { 200, stake_manager.clone(), stake_owner.clone(), - pho_token_staking_addr.clone(), ); let share_token_address = pool.query_share_token_address(); @@ -62,6 +61,7 @@ fn confirm_stake_contract_deployment() { max_allowed_spread_bps: 200, max_referral_bps: 5_000, pho_token_staking_addr, + staking_breakpoint: Some(500), } ); diff --git a/contracts/pool/src/tests/swap.rs b/contracts/pool/src/tests/swap.rs index baaf87c2f..213263d5b 100644 --- a/contracts/pool/src/tests/swap.rs +++ b/contracts/pool/src/tests/swap.rs @@ -41,7 +41,6 @@ fn simple_swap() { None, stake_manager, stake_owner, - Some(Address::generate(&env)), ); let liquidity_amount = 100_000_000_000_000_i128; // 10 million with 7 decimal places @@ -204,7 +203,6 @@ fn simple_swap_with_preferred_pool_fee() { None, stake_manager, stake_owner, - Some(Address::generate(&env)), ); token1.mint(&user1, &1_001_000); @@ -359,7 +357,6 @@ fn simple_swap_should_panic_when_user_accepted_fee_is_less_than_pool_fee() { None, stake_manager, stake_owner, - Some(Address::generate(&env)), ); token1.mint(&user1, &1_001_000); @@ -490,7 +487,6 @@ fn simple_swap_with_referral_fee() { None, stake_manager, stake_owner, - Some(Address::generate(&env)), ); token1.mint(&user1, &1_001_000); @@ -621,7 +617,6 @@ fn test_swap_should_fail_when_referral_fee_is_larger_than_allowed() { None, stake_manager, stake_owner, - Some(Address::generate(&env)), ); token1.mint(&user1, &1_001_000); @@ -688,7 +683,6 @@ fn swap_should_panic_with_bad_max_spread() { None, stake_manager, stake_owner, - Some(Address::generate(&env)), ); token1.mint(&user1, &1_001_000); @@ -747,7 +741,6 @@ fn swap_with_high_fee() { None, stake_manager, stake_owner, - Some(Address::generate(&env)), ); let initial_liquidity = 1_000_000i128; @@ -834,7 +827,6 @@ fn swap_simulation_even_pool() { None, stake_manager, stake_owner, - Some(Address::generate(&env)), ); let initial_liquidity = 1_000_000i128; @@ -940,7 +932,6 @@ fn swap_simulation_one_third_pool() { None, stake_manager, stake_owner, - Some(Address::generate(&env)), ); let initial_liquidity = 1_000_000i128; @@ -1046,7 +1037,6 @@ fn test_swap_fee_variants(swap_fees: i64, commission_fee: i128) { 10_000i64, stake_manager, stake_owner, - Some(Address::generate(&env)), ); let initial_liquidity = 110_358_880_127; // taken from the current amount of tokens in pool @@ -1132,7 +1122,6 @@ fn test_v_phx_vul_021_should_panic_when_max_spread_invalid_range(max_spread: Opt Some(500i64), Address::generate(&env), Address::generate(&env), - Some(Address::generate(&env)), ); token1.mint(&user1, &1_001_000); @@ -1189,7 +1178,6 @@ fn test_v_phx_vul_017_should_panic_when_swapping_non_existing_token_in_pool() { None, Address::generate(&env), Address::generate(&env), - Some(Address::generate(&env)), ); // Swap fails because we provide incorrect token as offer token. pool.swap( @@ -1233,7 +1221,6 @@ fn test_v_phx_vul_017_should_panic_when_simulating_swap_for_non_existing_token_i None, Address::generate(&env), Address::generate(&env), - Some(Address::generate(&env)), ); // Simulate swap fails because we provide incorrect token as offer token. pool.simulate_swap( @@ -1272,7 +1259,6 @@ fn test_v_phx_vul_017_should_panic_when_simulating_reverse_swap_for_non_existing None, Address::generate(&env), Address::generate(&env), - Some(Address::generate(&env)), ); // Simulate swap fails because we provide incorrect token as offer token. pool.simulate_reverse_swap( @@ -1307,7 +1293,6 @@ fn test_should_swap_with_valid_ask_asset_min_amount() { None, Address::generate(&env), Address::generate(&env), - Some(Address::generate(&env)), ); token1.mint(&user, &1_050_000); @@ -1376,7 +1361,6 @@ fn test_should_fail_when_invalid_ask_asset_min_amount() { None, stake_manager, stake_owner, - Some(Address::generate(&env)), ); token1.mint(&user, &1_001_000); @@ -1433,7 +1417,6 @@ fn simple_swap_with_deadline_success() { None, stake_manager, stake_owner, - Some(Address::generate(&env)), ); token1.mint(&user1, &1_001_000); @@ -1556,7 +1539,6 @@ fn simple_swap_with_should_fail_when_after_the_deadline() { None, stake_manager, stake_owner, - None, ); token1.mint(&user1, &1_001_000); @@ -1620,7 +1602,6 @@ fn simple_swap_with_biggest_possible_decimal_precision() { Some(10_000), stake_manager, stake_owner, - None, ); token1.mint(&user1, &999_000_000_000_001_000); From f5b1b243e19f074c235ba7ae70efe5ce87a27fd6 Mon Sep 17 00:00:00 2001 From: gangov <6922910+gangov@users.noreply.github.com> Date: Sat, 7 Dec 2024 22:15:36 +0200 Subject: [PATCH 5/7] explains the new Config values in pool --- contracts/pool/src/storage.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contracts/pool/src/storage.rs b/contracts/pool/src/storage.rs index 4d04d34a0..1aa2df09a 100644 --- a/contracts/pool/src/storage.rs +++ b/contracts/pool/src/storage.rs @@ -50,7 +50,10 @@ pub struct Config { pub max_allowed_spread_bps: i64, /// The maximum allowed percentage (in bps) for referral fee pub max_referral_bps: i64, + /// The $PHO token staking address pub pho_token_staking_addr: Option
, + /// value representing the number of tokens that the user must have staked in order for the + /// `total_fee_bps` to start becoming significantly cheaper pub staking_breakpoint: Option, } const CONFIG: Symbol = symbol_short!("CONFIG"); From fdfca0cafb3a50ea093ef3e41aba7c24eb665010 Mon Sep 17 00:00:00 2001 From: gangov <6922910+gangov@users.noreply.github.com> Date: Sun, 8 Dec 2024 01:04:37 +0200 Subject: [PATCH 6/7] pool - variable swap fee --- contracts/pool/src/contract.rs | 86 +++++++++--- contracts/pool/src/error.rs | 3 + contracts/pool/src/storage.rs | 132 ++++++++++++++++++- contracts/pool/src/tests/config.rs | 56 +------- contracts/pool/src/tests/stake_deployment.rs | 3 - 5 files changed, 200 insertions(+), 80 deletions(-) diff --git a/contracts/pool/src/contract.rs b/contracts/pool/src/contract.rs index 8a1b569ed..4c2fca169 100644 --- a/contracts/pool/src/contract.rs +++ b/contracts/pool/src/contract.rs @@ -9,9 +9,12 @@ use crate::{ stake_contract, storage::{ get_config, get_default_slippage_bps, save_config, save_default_slippage_bps, - utils::{self, get_admin, is_initialized, set_initialized}, + utils::{ + self, calculate_swap_fee, get_admin, get_variable_fee_info, is_initialized, + save_variable_fee_info, set_initialized, + }, Asset, ComputeSwap, Config, LiquidityPoolInfo, PairType, PoolResponse, - SimulateReverseSwapResponse, SimulateSwapResponse, + SimulateReverseSwapResponse, SimulateSwapResponse, VariableFeeInfo, VARIABLE_FEE_INFO, }, token_contract, }; @@ -24,6 +27,14 @@ use soroban_decimal::Decimal; /// Minimum initial LP share const MINIMUM_LIQUIDITY_AMOUNT: i128 = 1_000i128; +/// The smallest fee allowed +const SMALLEST_ALLOWED_FEE: u128 = 10u128; // 0.1% in bps +/// The largest fee allowed +const LARGEST_ALLOWED_FEE: u128 = 200u128; // 2.0% in bps +/// The amount after which the users get higher discount +const MAXIMUM_ALLOWED_STAKING_BREAKPOINT: u128 = 1_000u128; // we shouldn't ask for more than 1_000 + // staked $PHO for the users get + // significantly cheaper swap fees // Metadata that is added on to the WASM custom section contractmeta!( @@ -109,10 +120,12 @@ pub trait LiquidityPoolTrait { max_allowed_slippage_bps: Option, max_allowed_spread_bps: Option, max_referral_bps: Option, - pho_token_staking_addr: Option
, - staking_breakpoint: Option, ); + fn update_variable_fee(env: Env, variable_fee_info: VariableFeeInfo); + + fn delete_variable_fee(env: Env); + // Migration entrypoint fn upgrade(e: Env, new_wasm_hash: BytesN<32>, new_default_slippage_bps: i64); @@ -250,8 +263,6 @@ impl LiquidityPoolTrait for LiquidityPool { max_allowed_slippage_bps, max_allowed_spread_bps, max_referral_bps, - pho_token_staking_addr: None, - staking_breakpoint: None, }; save_config(&env, config); @@ -549,8 +560,6 @@ impl LiquidityPoolTrait for LiquidityPool { max_allowed_slippage_bps: Option, max_allowed_spread_bps: Option, max_referral_bps: Option, - pho_token_staking_addr: Option
, - staking_breakpoint: Option, ) { let admin: Address = utils::get_admin(&env); admin.require_auth(); @@ -582,15 +591,49 @@ impl LiquidityPoolTrait for LiquidityPool { validate_bps!(max_referral_bps); config.max_referral_bps = max_referral_bps; } - if let Some(pho_token_staking_addr) = pho_token_staking_addr { - config.pho_token_staking_addr = Some(pho_token_staking_addr); + + save_config(&env, config); + } + + fn update_variable_fee(env: Env, variable_fee_info: VariableFeeInfo) { + let admin = get_admin(&env); + admin.require_auth(); + + if variable_fee_info.min_fee < SMALLEST_ALLOWED_FEE { + log!( + env, + "Pool: Enable Variable Fee: Invalid minimum fee - less than 0.1%" + ); + panic_with_error!(env, ContractError::InvalidMinimumFeeBps); } - if let Some(staking_breakpoint) = staking_breakpoint { - config.staking_breakpoint = Some(staking_breakpoint); + if variable_fee_info.max_fee > LARGEST_ALLOWED_FEE { + log!( + env, + "Pool: Enable Variable Fee: Invalid maximum fee - over 2.0%" + ); + panic_with_error!(env, ContractError::InvalidMinimumFeeBps); } - save_config(&env, config); + if variable_fee_info.staking_breakpoint > MAXIMUM_ALLOWED_STAKING_BREAKPOINT { + log!( + env, + "Pool: Enable Variable Fee: Invalid staking breakpoint - over 1000" + ); + panic_with_error!(env, ContractError::InvalidStakingBreakpoint); + } + + // TODO: add a way to verify that the address provided is really `$PHO` staking contract's + // probably add a new query msg in staking that verifies that + + save_variable_fee_info(&env, variable_fee_info); + } + + fn delete_variable_fee(env: Env) { + let admin = get_admin(&env); + admin.require_auth(); + + env.storage().instance().remove(&VARIABLE_FEE_INFO); } fn upgrade(env: Env, new_wasm_hash: BytesN<32>, new_default_slippage_bps: i64) { @@ -854,13 +897,24 @@ fn do_swap( // }; let referral_fee_bps = 0; - // 1. We calculate the referral_fee below. If none referral fee will be 0 + let swap_fee = if env.storage().instance().has(&VARIABLE_FEE_INFO) { + let variable_fee_info = get_variable_fee_info(&env); + let user_staked = + stake_contract::Client::new(&env, &variable_fee_info.pho_token_staking_addr) + .query_staked(&sender) + .total_stake; + + calculate_swap_fee(convert_i128_to_u128(user_staked), variable_fee_info) + } else { + config.protocol_fee_rate() + }; + let compute_swap: ComputeSwap = compute_swap( &env, pool_balance_sell, pool_balance_buy, offer_amount, - config.protocol_fee_rate(), + swap_fee, referral_fee_bps, ); @@ -1417,8 +1471,6 @@ mod tests { max_allowed_slippage_bps: 100i64, max_allowed_spread_bps: 100i64, max_referral_bps: 1_000i64, - pho_token_staking_addr: None, - staking_breakpoint: None, }; split_deposit_based_on_pool_ratio(&env, config, 100, 100, 100, &Address::generate(&env)); } diff --git a/contracts/pool/src/error.rs b/contracts/pool/src/error.rs index a7237e952..b6f86c47b 100644 --- a/contracts/pool/src/error.rs +++ b/contracts/pool/src/error.rs @@ -35,4 +35,7 @@ pub enum ContractError { SwapFeeBpsOverLimit = 25, NotEnoughSharesToBeMinted = 26, NotEnoughLiquidityProvided = 27, + VariableFeeNotSet = 28, + InvalidMinimumFeeBps = 29, + InvalidStakingBreakpoint = 30, } diff --git a/contracts/pool/src/storage.rs b/contracts/pool/src/storage.rs index 1aa2df09a..fdf7ad140 100644 --- a/contracts/pool/src/storage.rs +++ b/contracts/pool/src/storage.rs @@ -32,6 +32,22 @@ pub enum PairType { Xyk = 0, } +#[contracttype] +#[derive(Clone, Debug, Eq, PartialEq)] +pub struct VariableFeeInfo { + /// minimum fee that the users can pay on each swap in `bps` + pub min_fee: u128, + /// maximum fee that the users can pay on each swap in `bps` + pub max_fee: u128, + /// The $PHO token staking address + pub pho_token_staking_addr: Address, + /// value representing the number of tokens that the user must have staked in order for the + /// `total_fee_bps` to start becoming significantly cheaper + pub staking_breakpoint: u128, +} + +pub const VARIABLE_FEE_INFO: Symbol = symbol_short!("VAR_INFO"); + #[contracttype] #[derive(Clone, Debug, Eq, PartialEq)] pub struct Config { @@ -50,12 +66,8 @@ pub struct Config { pub max_allowed_spread_bps: i64, /// The maximum allowed percentage (in bps) for referral fee pub max_referral_bps: i64, - /// The $PHO token staking address - pub pho_token_staking_addr: Option
, - /// value representing the number of tokens that the user must have staked in order for the - /// `total_fee_bps` to start becoming significantly cheaper - pub staking_breakpoint: Option, } + const CONFIG: Symbol = symbol_short!("CONFIG"); const DEFAULT_SLIPPAGE_BPS: Symbol = symbol_short!("DSLIPBPS"); @@ -185,6 +197,7 @@ pub struct SimulateReverseSwapResponse { } pub mod utils { + use phoenix::ttl::{INSTANCE_BUMP_AMOUNT, INSTANCE_LIFETIME_THRESHOLD}; use soroban_sdk::String; use super::*; @@ -456,13 +469,56 @@ pub mod utils { PERSISTENT_BUMP_AMOUNT, ); } + + pub fn save_variable_fee_info(env: &Env, variable_fee_info: VariableFeeInfo) { + env.storage() + .instance() + .extend_ttl(INSTANCE_LIFETIME_THRESHOLD, INSTANCE_BUMP_AMOUNT); + + env.storage() + .instance() + .set(&VARIABLE_FEE_INFO, &variable_fee_info); + } + + pub fn get_variable_fee_info(env: &Env) -> VariableFeeInfo { + env.storage() + .instance() + .extend_ttl(INSTANCE_LIFETIME_THRESHOLD, INSTANCE_BUMP_AMOUNT); + + env.storage() + .instance() + .get(&VARIABLE_FEE_INFO) + .unwrap_or_else(|| { + log!(env, "Pool: Get Variable Fee Info: Fee not set"); + panic_with_error!(env, ContractError::VariableFeeNotSet); + }) + } + + // Swap Fee = fee_min + (fee_max−fee_min) × (staking_breakpoint / (staking_breakpoint+staked)) + pub fn calculate_swap_fee(user_staked: u128, variable_fee_info: VariableFeeInfo) -> Decimal { + let fee_min = Decimal::bps(variable_fee_info.min_fee as i64); + let fee_max = Decimal::bps(variable_fee_info.max_fee as i64); + + let staked = Decimal::new(user_staked as i128); + let breakpoint = Decimal::new(variable_fee_info.staking_breakpoint as i128); + + // Compute ratio in Decimal + let ratio = breakpoint / (breakpoint + staked); + + // Perform calculation in Decimal + + // Now swap_fee is already a properly scaled Decimal + fee_min + (fee_max - fee_min) * ratio + } } #[cfg(test)] mod tests { use super::*; + use phoenix::utils::is_approx_ratio; use soroban_sdk::testutils::Address as _; use test_case::test_case; + use utils::calculate_swap_fee; #[test] #[should_panic] @@ -707,8 +763,6 @@ mod tests { fee_recipient: Address::generate(&env), max_allowed_spread_bps: 10_i64, max_referral_bps: 10i64, - pho_token_staking_addr: Some(Address::generate(&env)), - staking_breakpoint: None, }; let result = config.max_allowed_slippage(); @@ -719,4 +773,68 @@ mod tests { "Max allowed slippage should be 1%." ); } + + #[test] + fn swap_fee_should_be_one_percent_no_tokens_staked() { + let env = Env::default(); + + let variable_fee_info = VariableFeeInfo { + min_fee: 10, // 0.1% in bps + max_fee: 100, // 1.0% in bps + pho_token_staking_addr: Address::generate(&env), + staking_breakpoint: 800, + }; + + let result = calculate_swap_fee(0, variable_fee_info); + // should be around 100 bps +/- 1 bps + assert!(is_approx_ratio(result, Decimal::bps(100), Decimal::bps(1))); + } + + #[test] + fn swap_fee_should_be_half_percent_percent_staked_1000() { + let env = Env::default(); + + let variable_fee_info = VariableFeeInfo { + min_fee: 10, // 0.1% + max_fee: 100, // 1.0% + pho_token_staking_addr: Address::generate(&env), + staking_breakpoint: 800, + }; + + let result = calculate_swap_fee(1000, variable_fee_info); + // should be around 50 bps +/- 1 bps + assert!(is_approx_ratio(result, Decimal::bps(50), Decimal::bps(1))); + } + + #[test] + fn swap_fee_should_be_zero_one_percent_large_stake() { + let env = Env::default(); + + let variable_fee_info = VariableFeeInfo { + min_fee: 10, // 0.1% + max_fee: 100, // 1.0% + pho_token_staking_addr: Address::generate(&env), + staking_breakpoint: 800, + }; + + // very large stake + let result = calculate_swap_fee(1_000_000_000_000u128, variable_fee_info); + // should be around 10 bps +/- 1 bps + assert!(is_approx_ratio(result, Decimal::bps(10), Decimal::bps(1))); + } + + #[test] + fn swap_fee_should_be_one_and_half_percent() { + let env = Env::default(); + + let variable_fee_info = VariableFeeInfo { + min_fee: 10, // 0.1% + max_fee: 150, // 1.5% + pho_token_staking_addr: Address::generate(&env), + staking_breakpoint: 800, + }; + + let result = calculate_swap_fee(0, variable_fee_info); + assert_eq!(result, Decimal::bps(150)); + } } diff --git a/contracts/pool/src/tests/config.rs b/contracts/pool/src/tests/config.rs index a710dbcab..a3adb6dec 100644 --- a/contracts/pool/src/tests/config.rs +++ b/contracts/pool/src/tests/config.rs @@ -116,13 +116,9 @@ fn update_config() { max_allowed_slippage_bps: 500, max_allowed_spread_bps: 200, max_referral_bps: 5_000, - pho_token_staking_addr: None, - staking_breakpoint: None } ); - let new_pho_token_staking_addr = Address::generate(&env); - // update fees and recipient pool.update_config( &None, @@ -131,8 +127,6 @@ fn update_config() { &None, &None, &Some(1_000i64), - &Some(new_pho_token_staking_addr.clone()), - &Some(500), ); assert_eq!( pool.query_config(), @@ -147,22 +141,11 @@ fn update_config() { max_allowed_slippage_bps: 500, max_allowed_spread_bps: 200, max_referral_bps: 1_000, - pho_token_staking_addr: Some(new_pho_token_staking_addr), - staking_breakpoint: Some(500), } ); // update slippage and spread - pool.update_config( - &None, - &None, - &None, - &None, - &Some(5_000i64), - &Some(500), - &None, - &None, - ); + pool.update_config(&None, &None, &None, &None, &Some(5_000i64), &Some(500)); assert_eq!( pool.query_config(), Config { @@ -176,8 +159,6 @@ fn update_config() { max_allowed_slippage_bps: 500, max_allowed_spread_bps: 5_000, max_referral_bps: 500, - pho_token_staking_addr: None, - staking_breakpoint: None, } ); } @@ -220,8 +201,6 @@ fn update_config_unauthorized() { &None, &None, &None, - &None, - &None, ); } @@ -258,32 +237,13 @@ fn update_config_update_admin() { ); // update admin to new admin - pool.update_config( - &Some(admin2.clone()), - &None, - &None, - &None, - &None, - &None, - &None, - &None, - ); + pool.update_config(&Some(admin2.clone()), &None, &None, &None, &None, &None); let share_token_address = pool.query_share_token_address(); let stake_token_address = pool.query_stake_contract_address(); - let new_token_staking_addr = Address::generate(&env); // now update succeeds - pool.update_config( - &Some(admin2.clone()), - &None, - &None, - &None, - &None, - &None, - &Some(new_token_staking_addr.clone()), - &None, - ); + pool.update_config(&Some(admin2.clone()), &None, &None, &None, &None, &None); assert_eq!( pool.query_config(), Config { @@ -297,8 +257,6 @@ fn update_config_update_admin() { max_allowed_slippage_bps: 500, max_allowed_spread_bps: 200, max_referral_bps: 5_000, - pho_token_staking_addr: Some(new_token_staking_addr), - staking_breakpoint: None } ); } @@ -343,8 +301,6 @@ fn update_config_too_high_fees() { &None, &None, &None, - &None, - &None, ); } @@ -456,8 +412,6 @@ fn update_configs_all_bps_values_should_work() { max_allowed_slippage_bps: 500, max_allowed_spread_bps: 200, max_referral_bps: 5_000, - pho_token_staking_addr: None, - staking_breakpoint: None, } ); @@ -469,8 +423,6 @@ fn update_configs_all_bps_values_should_work() { &Some(1000i64), &Some(1000i64), &Some(1000i64), - &None, - &Some(500), ); // assert the changes @@ -487,8 +439,6 @@ fn update_configs_all_bps_values_should_work() { max_allowed_slippage_bps: 1000, max_allowed_spread_bps: 1000, max_referral_bps: 1000, - pho_token_staking_addr: None, - staking_breakpoint: Some(500), } ); } diff --git a/contracts/pool/src/tests/stake_deployment.rs b/contracts/pool/src/tests/stake_deployment.rs index 6cef048d1..de41e7bbf 100644 --- a/contracts/pool/src/tests/stake_deployment.rs +++ b/contracts/pool/src/tests/stake_deployment.rs @@ -29,7 +29,6 @@ fn confirm_stake_contract_deployment() { let user1 = Address::generate(&env); let stake_manager = Address::generate(&env); let stake_owner = Address::generate(&env); - let pho_token_staking_addr = Some(Address::generate(&env)); let swap_fees = 0i64; let pool = deploy_liquidity_pool_contract( @@ -60,8 +59,6 @@ fn confirm_stake_contract_deployment() { max_allowed_slippage_bps: 500, max_allowed_spread_bps: 200, max_referral_bps: 5_000, - pho_token_staking_addr, - staking_breakpoint: Some(500), } ); From fc267bde60aa33027df82edc0777a6ded8af8651 Mon Sep 17 00:00:00 2001 From: gangov <6922910+gangov@users.noreply.github.com> Date: Sun, 8 Dec 2024 21:48:44 +0200 Subject: [PATCH 7/7] unnecessary --- contracts/pool/src/storage.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/contracts/pool/src/storage.rs b/contracts/pool/src/storage.rs index fdf7ad140..8397154a5 100644 --- a/contracts/pool/src/storage.rs +++ b/contracts/pool/src/storage.rs @@ -502,12 +502,8 @@ pub mod utils { let staked = Decimal::new(user_staked as i128); let breakpoint = Decimal::new(variable_fee_info.staking_breakpoint as i128); - // Compute ratio in Decimal let ratio = breakpoint / (breakpoint + staked); - // Perform calculation in Decimal - - // Now swap_fee is already a properly scaled Decimal fee_min + (fee_max - fee_min) * ratio } }