diff --git a/contracts/factory/src/contract.rs b/contracts/factory/src/contract.rs index 2842b1055..10f6fb74b 100644 --- a/contracts/factory/src/contract.rs +++ b/contracts/factory/src/contract.rs @@ -23,6 +23,9 @@ pub trait FactoryTrait { env: Env, admin: Address, multihop_wasm_hash: BytesN<32>, + lp_wasm_hash: BytesN<32>, + stake_wasm_hash: BytesN<32>, + token_wasm_hash: BytesN<32>, whitelisted_accounts: Vec
, ); @@ -51,6 +54,9 @@ impl FactoryTrait for Factory { env: Env, admin: Address, multihop_wasm_hash: BytesN<32>, + lp_wasm_hash: BytesN<32>, + stake_wasm_hash: BytesN<32>, + token_wasm_hash: BytesN<32>, whitelisted_accounts: Vec
, ) { if is_initialized(&env) { @@ -71,6 +77,9 @@ impl FactoryTrait for Factory { Config { admin: admin.clone(), multihop_address, + lp_wasm_hash, + stake_wasm_hash, + token_wasm_hash, whitelisted_accounts, }, ); @@ -99,26 +108,21 @@ impl FactoryTrait for Factory { &lp_init_info.stake_init_info, ); + let config = get_config(&env); + let lp_wasm_hash = config.lp_wasm_hash; + let stake_wasm_hash = config.stake_wasm_hash; + let token_wasm_hash = config.token_wasm_hash; + let lp_contract_address = deploy_lp_contract( &env, - lp_init_info.lp_wasm_hash, + lp_wasm_hash, &lp_init_info.token_init_info.token_a, &lp_init_info.token_init_info.token_b, ); let init_fn: Symbol = Symbol::new(&env, "initialize"); - let init_fn_args: Vec = ( - lp_init_info.admin, - lp_init_info.share_token_decimals, - lp_init_info.swap_fee_bps, - lp_init_info.fee_recipient, - lp_init_info.max_allowed_slippage_bps, - lp_init_info.max_allowed_spread_bps, - lp_init_info.max_referral_bps, - lp_init_info.token_init_info.clone(), - lp_init_info.stake_init_info, - ) - .into_val(&env); + let init_fn_args: Vec = + (stake_wasm_hash, token_wasm_hash, lp_init_info.clone()).into_val(&env); env.invoke_contract::(&lp_contract_address, &init_fn, init_fn_args); @@ -227,7 +231,7 @@ fn validate_token_info( #[cfg(test)] mod tests { use super::*; - use soroban_sdk::{testutils::Address as _, Address, BytesN, String}; + use soroban_sdk::{testutils::Address as _, Address, String}; #[test] #[should_panic( @@ -236,9 +240,6 @@ mod tests { fn validate_token_info_should_fail_on_token_a_less_than_token_b() { let env = Env::default(); - let token_wasm_hash = BytesN::from_array(&env, &[8u8; 0x20]); - let stake_wasm_hash = BytesN::from_array(&env, &[15u8; 0x20]); - let token_a = Address::from_string(&String::from_str( &env, "CBGJMPOZ573XUTIRRFWGWTGSIAOGKJRVMIKBTFYEWTEIU7AEDWKDYMUX", @@ -248,17 +249,12 @@ mod tests { "CAOUDQCLN3BYHH4L7GSH3OSQJFVELHKOEVKOPBENVIGZ6WZ5ZRHFC5LN", )); - let token_init_info = TokenInitInfo { - token_a, - token_b, - token_wasm_hash, - }; + let token_init_info = TokenInitInfo { token_a, token_b }; let stake_init_info = StakeInitInfo { max_distributions: 10, min_bond: 10, min_reward: 10, - stake_wasm_hash, }; validate_token_info(&env, &token_init_info, &stake_init_info); } @@ -270,23 +266,15 @@ mod tests { fn validate_token_info_should_fail_on_min_bond_less_than_zero() { let env = Env::default(); - let token_wasm_hash = BytesN::from_array(&env, &[8u8; 0x20]); - let stake_wasm_hash = BytesN::from_array(&env, &[15u8; 0x20]); - let token_a = Address::generate(&env); let token_b = Address::generate(&env); - let token_init_info = TokenInitInfo { - token_a, - token_b, - token_wasm_hash, - }; + let token_init_info = TokenInitInfo { token_a, token_b }; let stake_init_info = StakeInitInfo { max_distributions: 10, min_bond: 0, min_reward: 10, - stake_wasm_hash, }; validate_token_info(&env, &token_init_info, &stake_init_info); @@ -297,23 +285,15 @@ mod tests { fn validate_token_info_should_fail_on_min_reward_less_than_zero() { let env = Env::default(); - let token_wasm_hash = BytesN::from_array(&env, &[8u8; 0x20]); - let stake_wasm_hash = BytesN::from_array(&env, &[15u8; 0x20]); - let token_a = Address::generate(&env); let token_b = Address::generate(&env); - let token_init_info = TokenInitInfo { - token_a, - token_b, - token_wasm_hash, - }; + let token_init_info = TokenInitInfo { token_a, token_b }; let stake_init_info = StakeInitInfo { max_distributions: 10, min_bond: 10, min_reward: 0, - stake_wasm_hash, }; validate_token_info(&env, &token_init_info, &stake_init_info); } diff --git a/contracts/factory/src/storage.rs b/contracts/factory/src/storage.rs index 44d67eafa..88ff19709 100644 --- a/contracts/factory/src/storage.rs +++ b/contracts/factory/src/storage.rs @@ -1,4 +1,4 @@ -use soroban_sdk::{contracttype, Address, ConversionError, Env, TryFromVal, Val, Vec}; +use soroban_sdk::{contracttype, Address, BytesN, ConversionError, Env, TryFromVal, Val, Vec}; #[derive(Clone, Copy)] #[repr(u32)] @@ -28,7 +28,9 @@ impl TryFromVal for Val { pub struct Config { pub admin: Address, pub multihop_address: Address, - /// A vec of whitelisted addresses that can create liquidity pools + pub lp_wasm_hash: BytesN<32>, + pub stake_wasm_hash: BytesN<32>, + pub token_wasm_hash: BytesN<32>, pub whitelisted_accounts: Vec
, } diff --git a/contracts/factory/src/tests.rs b/contracts/factory/src/tests.rs index cf762b58f..b340c0b48 100644 --- a/contracts/factory/src/tests.rs +++ b/contracts/factory/src/tests.rs @@ -1,7 +1,9 @@ -use crate::contract::{Factory, FactoryClient}; use soroban_sdk::{testutils::Address as _, vec, Address, Env}; -use self::setup::install_multihop_wasm; +use self::setup::{ + deploy_factory_contract, install_lp_contract, install_multihop_wasm, install_stake_wasm, + install_token_wasm, +}; mod config; mod setup; @@ -17,9 +19,27 @@ fn test_deploy_factory_twice_should_fail() { let admin = Address::generate(&env); let auth_user = Address::generate(&env); - let multihop = FactoryClient::new(&env, &env.register_contract(None, Factory {})); let multihop_wasm_hash = install_multihop_wasm(&env); + let lp_wasm_hash = install_lp_contract(&env); + let stake_wasm_hash = install_stake_wasm(&env); + let token_wasm_hash = install_token_wasm(&env); - multihop.initialize(&admin, &multihop_wasm_hash, &vec![&env, auth_user.clone()]); - multihop.initialize(&admin, &multihop_wasm_hash, &vec![&env, auth_user]); + let factory = deploy_factory_contract(&env, admin.clone()); + + factory.initialize( + &admin, + &multihop_wasm_hash, + &lp_wasm_hash, + &stake_wasm_hash, + &token_wasm_hash, + &vec![&env, auth_user.clone()], + ); + factory.initialize( + &admin, + &multihop_wasm_hash, + &lp_wasm_hash, + &stake_wasm_hash, + &token_wasm_hash, + &vec![&env, auth_user.clone()], + ); } diff --git a/contracts/factory/src/tests/config.rs b/contracts/factory/src/tests/config.rs index f975f33e4..db9054536 100644 --- a/contracts/factory/src/tests/config.rs +++ b/contracts/factory/src/tests/config.rs @@ -1,7 +1,4 @@ -use super::setup::{ - deploy_factory_contract, install_lp_contract, install_stake_wasm, install_token_wasm, - lp_contract, -}; +use super::setup::{deploy_factory_contract, lp_contract}; use phoenix::utils::{LiquidityPoolInitInfo, StakeInitInfo, TokenInitInfo}; use soroban_sdk::{ @@ -59,23 +56,18 @@ fn factory_successfully_inits_lp() { assert_eq!(factory.get_admin(), admin); let token_init_info = TokenInitInfo { - token_wasm_hash: install_token_wasm(&env), token_a: token1, token_b: token2, }; let stake_init_info = StakeInitInfo { - stake_wasm_hash: install_stake_wasm(&env), min_bond: 10i128, max_distributions: 10u32, min_reward: 5i128, }; - let lp_wasm_hash = install_lp_contract(&env); - let lp_init_info = LiquidityPoolInitInfo { admin: admin.clone(), fee_recipient: user.clone(), - lp_wasm_hash, max_allowed_slippage_bps: 5_000, max_allowed_spread_bps: 500, share_token_decimals: 7, @@ -135,23 +127,18 @@ fn factory_fails_to_init_lp_when_authorized_address_not_present() { assert_eq!(factory.get_admin(), admin); let token_init_info = TokenInitInfo { - token_wasm_hash: install_token_wasm(&env), token_a: token1, token_b: token2, }; let stake_init_info = StakeInitInfo { - stake_wasm_hash: install_stake_wasm(&env), min_bond: 10i128, max_distributions: 10u32, min_reward: 5i128, }; - let lp_wasm_hash = install_lp_contract(&env); - let lp_init_info = LiquidityPoolInitInfo { admin, fee_recipient: user.clone(), - lp_wasm_hash, max_allowed_slippage_bps: 5_000, max_allowed_spread_bps: 500, share_token_decimals: 7, diff --git a/contracts/factory/src/tests/queries.rs b/contracts/factory/src/tests/queries.rs index ab6927e56..a8d3cd6fd 100644 --- a/contracts/factory/src/tests/queries.rs +++ b/contracts/factory/src/tests/queries.rs @@ -1,6 +1,4 @@ -use super::setup::{ - deploy_factory_contract, install_lp_contract, install_stake_wasm, install_token_wasm, -}; +use super::setup::deploy_factory_contract; use phoenix::utils::{LiquidityPoolInitInfo, StakeInitInfo, TokenInitInfo}; use soroban_sdk::{ @@ -65,47 +63,38 @@ fn test_deploy_multiple_liquidity_pools() { let factory = deploy_factory_contract(&env, Some(admin.clone())); let first_token_init_info = TokenInitInfo { - token_wasm_hash: install_token_wasm(&env), token_a: token1.clone(), token_b: token2.clone(), }; let first_stake_init_info = StakeInitInfo { - stake_wasm_hash: install_stake_wasm(&env), min_bond: 10i128, max_distributions: 10u32, min_reward: 5i128, }; let second_token_init_info = TokenInitInfo { - token_wasm_hash: install_token_wasm(&env), token_a: token3.clone(), token_b: token4.clone(), }; let second_stake_init_info = StakeInitInfo { - stake_wasm_hash: install_stake_wasm(&env), min_bond: 5i128, max_distributions: 5u32, min_reward: 2i128, }; let third_token_init_info = TokenInitInfo { - token_wasm_hash: install_token_wasm(&env), token_a: token5.clone(), token_b: token6.clone(), }; let third_stake_init_info = StakeInitInfo { - stake_wasm_hash: install_stake_wasm(&env), min_bond: 6i128, max_distributions: 6u32, min_reward: 3i128, }; - let lp_wasm_hash = install_lp_contract(&env); - let first_lp_init_info = LiquidityPoolInitInfo { admin: admin.clone(), fee_recipient: user.clone(), - lp_wasm_hash: lp_wasm_hash.clone(), max_allowed_slippage_bps: 5_000, max_allowed_spread_bps: 500, share_token_decimals: 7, @@ -118,7 +107,6 @@ fn test_deploy_multiple_liquidity_pools() { let second_lp_init_info = LiquidityPoolInitInfo { admin: admin.clone(), fee_recipient: user.clone(), - lp_wasm_hash: lp_wasm_hash.clone(), max_allowed_slippage_bps: 4_000, max_allowed_spread_bps: 400, share_token_decimals: 6, @@ -131,7 +119,6 @@ fn test_deploy_multiple_liquidity_pools() { let third_lp_init_info = LiquidityPoolInitInfo { admin: admin.clone(), fee_recipient: user.clone(), - lp_wasm_hash, max_allowed_slippage_bps: 4_000, max_allowed_spread_bps: 400, share_token_decimals: 6, @@ -262,47 +249,38 @@ fn test_queries_by_tuple() { let factory = deploy_factory_contract(&env, Some(admin.clone())); let first_token_init_info = TokenInitInfo { - token_wasm_hash: install_token_wasm(&env), token_a: token1.clone(), token_b: token2.clone(), }; let first_stake_init_info = StakeInitInfo { - stake_wasm_hash: install_stake_wasm(&env), min_bond: 10i128, max_distributions: 10u32, min_reward: 5i128, }; let second_token_init_info = TokenInitInfo { - token_wasm_hash: install_token_wasm(&env), token_a: token3.clone(), token_b: token4.clone(), }; let second_stake_init_info = StakeInitInfo { - stake_wasm_hash: install_stake_wasm(&env), min_bond: 5i128, max_distributions: 5u32, min_reward: 2i128, }; let third_token_init_info = TokenInitInfo { - token_wasm_hash: install_token_wasm(&env), token_a: token5.clone(), token_b: token6.clone(), }; let third_stake_init_info = StakeInitInfo { - stake_wasm_hash: install_stake_wasm(&env), min_bond: 6i128, max_distributions: 6u32, min_reward: 3i128, }; - let lp_wasm_hash = install_lp_contract(&env); - let first_lp_init_info = LiquidityPoolInitInfo { admin: admin.clone(), fee_recipient: user.clone(), - lp_wasm_hash: lp_wasm_hash.clone(), max_allowed_slippage_bps: 5_000, max_allowed_spread_bps: 500, share_token_decimals: 7, @@ -315,7 +293,6 @@ fn test_queries_by_tuple() { let second_lp_init_info = LiquidityPoolInitInfo { admin: admin.clone(), fee_recipient: user.clone(), - lp_wasm_hash: lp_wasm_hash.clone(), max_allowed_slippage_bps: 4_000, max_allowed_spread_bps: 400, share_token_decimals: 6, @@ -328,7 +305,6 @@ fn test_queries_by_tuple() { let third_lp_init_info = LiquidityPoolInitInfo { admin: admin.clone(), fee_recipient: user.clone(), - lp_wasm_hash, max_allowed_slippage_bps: 4_000, max_allowed_spread_bps: 400, share_token_decimals: 6, diff --git a/contracts/factory/src/tests/setup.rs b/contracts/factory/src/tests/setup.rs index b9f0f06e9..260b340bd 100644 --- a/contracts/factory/src/tests/setup.rs +++ b/contracts/factory/src/tests/setup.rs @@ -41,6 +41,17 @@ pub fn deploy_factory_contract<'a>( let multihop_wasm_hash = install_multihop_wasm(env); let whitelisted_accounts = vec![env, admin.clone()]; - factory.initialize(&admin, &multihop_wasm_hash, &whitelisted_accounts); + let lp_wasm_hash = install_lp_contract(env); + let stake_wasm_hash = install_stake_wasm(env); + let token_wasm_hash = install_token_wasm(env); + + factory.initialize( + &admin, + &multihop_wasm_hash, + &lp_wasm_hash, + &stake_wasm_hash, + &token_wasm_hash, + &whitelisted_accounts, + ); factory } diff --git a/contracts/multihop/src/tests/setup.rs b/contracts/multihop/src/tests/setup.rs index 3ed91ae64..3c89da4fe 100644 --- a/contracts/multihop/src/tests/setup.rs +++ b/contracts/multihop/src/tests/setup.rs @@ -92,7 +92,18 @@ pub fn deploy_and_initialize_factory(env: &Env, admin: Address) -> factory::Clie let multihop_wasm_hash = install_multihop_wasm(env); let whitelisted_accounts = vec![env, admin.clone()]; - factory_client.initialize(&admin.clone(), &multihop_wasm_hash, &whitelisted_accounts); + let lp_wasm_hash = install_lp_contract(env); + let stake_wasm_hash = install_stake_wasm(env); + let token_wasm_hash = install_token_wasm(env); + + factory_client.initialize( + &admin.clone(), + &multihop_wasm_hash, + &lp_wasm_hash, + &stake_wasm_hash, + &token_wasm_hash, + &whitelisted_accounts, + ); factory_client } @@ -108,7 +119,6 @@ pub fn deploy_and_initialize_lp( fees: Option, ) { // 2. create liquidity pool from factory - let lp_wasm_hash = install_lp_contract(env); if token_b < token_a { std::mem::swap(&mut token_a, &mut token_b); @@ -116,12 +126,10 @@ pub fn deploy_and_initialize_lp( } let token_init_info = TokenInitInfo { - token_wasm_hash: install_token_wasm(env), token_a: token_a.clone(), token_b: token_b.clone(), }; let stake_init_info = StakeInitInfo { - stake_wasm_hash: install_stake_wasm(env), min_bond: 10i128, max_distributions: 10u32, min_reward: 5i128, @@ -130,7 +138,6 @@ pub fn deploy_and_initialize_lp( let lp_init_info = LiquidityPoolInitInfo { admin: admin.clone(), fee_recipient: admin.clone(), - lp_wasm_hash: lp_wasm_hash.clone(), max_allowed_slippage_bps: 5000, max_allowed_spread_bps: 500, share_token_decimals: 7, diff --git a/contracts/pool/src/contract.rs b/contracts/pool/src/contract.rs index c8bf5f9e4..8b6672396 100644 --- a/contracts/pool/src/contract.rs +++ b/contracts/pool/src/contract.rs @@ -1,3 +1,4 @@ +use phoenix::utils::LiquidityPoolInitInfo; use soroban_sdk::{ contract, contractimpl, contractmeta, log, panic_with_error, Address, BytesN, Env, IntoVal, }; @@ -16,10 +17,7 @@ use crate::{ token_contract, }; use decimal::Decimal; -use phoenix::{ - utils::{is_approx_ratio, StakeInitInfo, TokenInitInfo}, - validate_int_parameters, -}; +use phoenix::{utils::is_approx_ratio, validate_int_parameters}; // Metadata that is added on to the WASM custom section contractmeta!( @@ -36,15 +34,9 @@ pub trait LiquidityPoolTrait { #[allow(clippy::too_many_arguments)] fn initialize( env: Env, - admin: Address, - share_token_decimals: u32, - swap_fee_bps: i64, - fee_recipient: Address, - max_allowed_slippage_bps: i64, - max_allowed_spread_bps: i64, - max_referral_bps: i64, - token_init_info: TokenInitInfo, - stake_contract_info: StakeInitInfo, + stake_wasm_hash: BytesN<32>, + token_wasm_hash: BytesN<32>, + lp_init_info: LiquidityPoolInitInfo, ); // Deposits token_a and token_b. Also mints pool shares for the "to" Identifier. The amount minted @@ -134,28 +126,30 @@ impl LiquidityPoolTrait for LiquidityPool { #[allow(clippy::too_many_arguments)] fn initialize( env: Env, - admin: Address, - share_token_decimals: u32, - swap_fee_bps: i64, - fee_recipient: Address, - max_allowed_slippage_bps: i64, - max_allowed_spread_bps: i64, - max_referral_bps: i64, - token_init_info: TokenInitInfo, - stake_init_info: StakeInitInfo, + stake_wasm_hash: BytesN<32>, + token_wasm_hash: BytesN<32>, + lp_init_info: LiquidityPoolInitInfo, ) { if is_initialized(&env) { panic!("Liquidity Pool: Initialize: initializing contract twice is not allowed"); } + let admin = lp_init_info.admin; + let share_token_decimals = lp_init_info.share_token_decimals; + let swap_fee_bps = lp_init_info.swap_fee_bps; + let fee_recipient = lp_init_info.fee_recipient; + let max_allowed_slippage_bps = lp_init_info.max_allowed_slippage_bps; + let max_allowed_spread_bps = lp_init_info.max_allowed_spread_bps; + let max_referral_bps = lp_init_info.max_referral_bps; + let token_init_info = lp_init_info.token_init_info; + let stake_init_info = lp_init_info.stake_init_info; + set_initialized(&env); // Token info let token_a = token_init_info.token_a; let token_b = token_init_info.token_b; - let token_wasm_hash = token_init_info.token_wasm_hash; // Contract info - let stake_wasm_hash = stake_init_info.stake_wasm_hash; let min_bond = stake_init_info.min_bond; let max_distributions = stake_init_info.max_distributions; let min_reward = stake_init_info.min_reward; diff --git a/contracts/pool/src/tests/setup.rs b/contracts/pool/src/tests/setup.rs index e6e1c49c3..3e1c639fc 100644 --- a/contracts/pool/src/tests/setup.rs +++ b/contracts/pool/src/tests/setup.rs @@ -5,7 +5,7 @@ use crate::{ token_contract, }; -use phoenix::utils::{StakeInitInfo, TokenInitInfo}; +use phoenix::utils::{LiquidityPoolInitInfo, StakeInitInfo, TokenInitInfo}; pub fn deploy_token_contract<'a>(env: &Env, admin: &Address) -> token_contract::Client<'a> { token_contract::Client::new(env, &env.register_stellar_asset_contract(admin.clone())) @@ -37,37 +37,38 @@ pub fn deploy_liquidity_pool_contract<'a>( ) -> LiquidityPoolClient<'a> { let admin = admin.into().unwrap_or(Address::generate(env)); let pool = LiquidityPoolClient::new(env, &env.register_contract(None, LiquidityPool {})); - let token_wasm_hash = install_token_wasm(env); - let stake_wasm_hash = install_stake_wasm(env); let fee_recipient = fee_recipient .into() .unwrap_or_else(|| Address::generate(env)); - let max_allowed_slippage = max_allowed_slippage_bps.into().unwrap_or(5_000); // 50% if not specified - let max_allowed_spread = max_allowed_spread_bps.into().unwrap_or(500); // 5% if not specified - let share_token_decimals = 7u32; let token_init_info = TokenInitInfo { - token_wasm_hash, token_a: token_a_b.0.clone(), token_b: token_a_b.1.clone(), }; let stake_init_info = StakeInitInfo { - stake_wasm_hash, min_bond: 10i128, max_distributions: 10u32, min_reward: 5i128, }; + let stake_wasm_hash = install_stake_wasm(env); + let token_wasm_hash = install_token_wasm(env); + + let lp_init_info = LiquidityPoolInitInfo { + admin, + share_token_decimals: 7u32, + swap_fee_bps: swap_fees, + fee_recipient, + max_allowed_slippage_bps: max_allowed_slippage_bps.into().unwrap_or(5_000), + max_allowed_spread_bps: max_allowed_spread_bps.into().unwrap_or(500), + max_referral_bps: 5_000, + token_init_info, + stake_init_info, + }; pool.initialize( - &admin, - &share_token_decimals, - &swap_fees, - &fee_recipient, - &max_allowed_slippage, - &max_allowed_spread, - &5_000, - &token_init_info, - &stake_init_info, + &stake_wasm_hash, + &token_wasm_hash, + &lp_init_info, ); pool } diff --git a/contracts/pool/src/tests/stake_deployment.rs b/contracts/pool/src/tests/stake_deployment.rs index 8f55643bb..b1941d702 100644 --- a/contracts/pool/src/tests/stake_deployment.rs +++ b/contracts/pool/src/tests/stake_deployment.rs @@ -1,5 +1,5 @@ extern crate std; -use phoenix::utils::{StakeInitInfo, TokenInitInfo}; +use phoenix::utils::{LiquidityPoolInitInfo, StakeInitInfo, TokenInitInfo}; use soroban_sdk::{testutils::Address as _, Address, Env}; use super::setup::{deploy_liquidity_pool_contract, deploy_token_contract}; @@ -96,41 +96,30 @@ fn second_pool_deployment_should_fail() { let fee_recipient = user; let max_allowed_slippage = 5_000i64; // 50% if not specified let max_allowed_spread = 500i64; // 5% if not specified - let share_token_decimals = 7u32; let token_init_info = TokenInitInfo { - token_wasm_hash, token_a: token1.address.clone(), token_b: token2.address.clone(), }; let stake_init_info = StakeInitInfo { - stake_wasm_hash, min_bond: 10i128, max_distributions: 10u32, min_reward: 5i128, }; - pool.initialize( - &admin1, - &share_token_decimals, - &0i64, - &fee_recipient, - &max_allowed_slippage, - &max_allowed_spread, - &500, - &token_init_info, - &stake_init_info, - ); + let lp_init_info = LiquidityPoolInitInfo { + admin: admin1, + share_token_decimals: 7u32, + swap_fee_bps: 0i64, + fee_recipient, + max_allowed_slippage_bps: max_allowed_slippage, + max_allowed_spread_bps: max_allowed_spread, + max_referral_bps: 500, + token_init_info, + stake_init_info, + }; - pool.initialize( - &admin1, - &share_token_decimals, - &0i64, - &fee_recipient, - &max_allowed_slippage, - &max_allowed_spread, - &500, - &token_init_info, - &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); } diff --git a/contracts/pool_stable/src/contract.rs b/contracts/pool_stable/src/contract.rs index 548a05cc6..4aa72de3a 100644 --- a/contracts/pool_stable/src/contract.rs +++ b/contracts/pool_stable/src/contract.rs @@ -1,3 +1,4 @@ +use phoenix::utils::LiquidityPoolInitInfo; use soroban_sdk::{contract, contractimpl, contractmeta, log, Address, BytesN, Env, IntoVal}; use crate::storage::utils::{is_initialized, set_initialized}; @@ -13,10 +14,7 @@ use crate::{ token_contract, }; use decimal::Decimal; -use phoenix::{ - utils::{StakeInitInfo, TokenInitInfo}, - validate_int_parameters, -}; +use phoenix::validate_int_parameters; // Minimum amount of initial LP shares to mint const MINIMUM_LIQUIDITY_AMOUNT: i128 = 1000; @@ -36,15 +34,10 @@ pub trait StableLiquidityPoolTrait { #[allow(clippy::too_many_arguments)] fn initialize( env: Env, - admin: Address, - share_token_decimals: u32, - swap_fee_bps: i64, - fee_recipient: Address, - max_allowed_slippage_bps: i64, - max_allowed_spread_bps: i64, + stake_wasm_hash: BytesN<32>, + token_wasm_hash: BytesN<32>, amp: u64, - token_init_info: TokenInitInfo, - stake_contract_info: StakeInitInfo, + lp_init_info: LiquidityPoolInitInfo, ); // Deposits token_a and token_b. Also mints pool shares for the "to" Identifier. The amount minted @@ -129,28 +122,30 @@ impl StableLiquidityPoolTrait for StableLiquidityPool { #[allow(clippy::too_many_arguments)] fn initialize( env: Env, - admin: Address, - share_token_decimals: u32, - swap_fee_bps: i64, - fee_recipient: Address, - max_allowed_slippage_bps: i64, - max_allowed_spread_bps: i64, + stake_wasm_hash: BytesN<32>, + token_wasm_hash: BytesN<32>, amp: u64, - token_init_info: TokenInitInfo, - stake_init_info: StakeInitInfo, + lp_init_info: LiquidityPoolInitInfo, ) { if is_initialized(&env) { panic!("Pool stable: Initialize: initializing contract twice is not allowed"); } + let admin = lp_init_info.admin; + let share_token_decimals = lp_init_info.share_token_decimals; + let swap_fee_bps = lp_init_info.swap_fee_bps; + let fee_recipient = lp_init_info.fee_recipient; + let max_allowed_slippage_bps = lp_init_info.max_allowed_slippage_bps; + let max_allowed_spread_bps = lp_init_info.max_allowed_spread_bps; + let token_init_info = lp_init_info.token_init_info; + let stake_init_info = lp_init_info.stake_init_info; + set_initialized(&env); // Token info let token_a = token_init_info.token_a; let token_b = token_init_info.token_b; - let token_wasm_hash = token_init_info.token_wasm_hash; // Contract info - let stake_wasm_hash = stake_init_info.stake_wasm_hash; let min_bond = stake_init_info.min_bond; let max_distributions = stake_init_info.max_distributions; let min_reward = stake_init_info.min_reward; diff --git a/contracts/pool_stable/src/tests/setup.rs b/contracts/pool_stable/src/tests/setup.rs index 58f5301b0..1d5d3da2e 100644 --- a/contracts/pool_stable/src/tests/setup.rs +++ b/contracts/pool_stable/src/tests/setup.rs @@ -5,7 +5,7 @@ use crate::{ token_contract, }; -use phoenix::utils::{StakeInitInfo, TokenInitInfo}; +use phoenix::utils::{LiquidityPoolInitInfo, StakeInitInfo, TokenInitInfo}; pub fn deploy_token_contract<'a>(env: &Env, admin: &Address) -> token_contract::Client<'a> { token_contract::Client::new(env, &env.register_stellar_asset_contract(admin.clone())) @@ -38,36 +38,39 @@ pub fn deploy_stable_liquidity_pool_contract<'a>( let admin = admin.into().unwrap_or(Address::generate(env)); let pool = StableLiquidityPoolClient::new(env, &env.register_contract(None, StableLiquidityPool {})); - let token_wasm_hash = install_token_wasm(env); - let stake_wasm_hash = install_stake_wasm(env); let fee_recipient = fee_recipient .into() .unwrap_or_else(|| Address::generate(env)); - let max_allowed_slippage = max_allowed_slippage_bps.into().unwrap_or(5_000); // 50% if not specified - let max_allowed_spread = max_allowed_spread_bps.into().unwrap_or(500); // 5% if not specified - let share_token_decimals = 7u32; let token_init_info = TokenInitInfo { - token_wasm_hash, token_a: token_a_b.0.clone(), token_b: token_a_b.1.clone(), }; let stake_init_info = StakeInitInfo { - stake_wasm_hash, min_bond: 10i128, max_distributions: 10u32, min_reward: 5i128, }; + let token_wasm_hash = install_token_wasm(env); + let stake_wasm_hash = install_stake_wasm(env); + + let lp_init_info = LiquidityPoolInitInfo { + admin, + share_token_decimals: 7u32, + swap_fee_bps: swap_fees, + fee_recipient, + max_allowed_slippage_bps: max_allowed_slippage_bps.into().unwrap_or(5_000), + max_allowed_spread_bps: max_allowed_spread_bps.into().unwrap_or(500), + max_referral_bps: 5_000, + token_init_info, + stake_init_info, + }; + pool.initialize( - &admin, - &share_token_decimals, - &swap_fees, - &fee_recipient, - &max_allowed_slippage, - &max_allowed_spread, - &token_init_info, - &stake_init_info, + &stake_wasm_hash, + &token_wasm_hash, + &lp_init_info, ); pool } diff --git a/contracts/pool_stable/src/tests/stake_deployment.rs b/contracts/pool_stable/src/tests/stake_deployment.rs index 49beb7640..8b5a2eacb 100644 --- a/contracts/pool_stable/src/tests/stake_deployment.rs +++ b/contracts/pool_stable/src/tests/stake_deployment.rs @@ -1,5 +1,5 @@ extern crate std; -use phoenix::utils::{StakeInitInfo, TokenInitInfo}; +use phoenix::utils::{LiquidityPoolInitInfo, StakeInitInfo, TokenInitInfo}; use soroban_sdk::{testutils::Address as _, Address, Env}; use super::setup::{deploy_stable_liquidity_pool_contract, deploy_token_contract}; @@ -95,39 +95,29 @@ fn second_pool_stable_deployment_should_fail() { let fee_recipient = user; let max_allowed_slippage = 5_000i64; // 50% if not specified let max_allowed_spread = 500i64; // 5% if not specified - let share_token_decimals = 7u32; let token_init_info = TokenInitInfo { - token_wasm_hash, token_a: token1.address.clone(), token_b: token2.address.clone(), }; let stake_init_info = StakeInitInfo { - stake_wasm_hash, min_bond: 10i128, max_distributions: 10u32, min_reward: 5i128, }; - pool.initialize( - &admin1, - &share_token_decimals, - &0i64, - &fee_recipient, - &max_allowed_slippage, - &max_allowed_spread, - &token_init_info, - &stake_init_info, - ); + let lp_init_info = LiquidityPoolInitInfo { + admin: admin1, + share_token_decimals: 7u32, + swap_fee_bps: 0i64, + fee_recipient, + max_allowed_slippage_bps: max_allowed_slippage, + max_allowed_spread_bps: max_allowed_spread, + max_referral_bps: 500, + token_init_info, + stake_init_info, + }; - pool.initialize( - &admin1, - &share_token_decimals, - &0i64, - &fee_recipient, - &max_allowed_slippage, - &max_allowed_spread, - &token_init_info, - &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); } diff --git a/packages/phoenix/src/utils.rs b/packages/phoenix/src/utils.rs index 844f59f07..7aad3c4d4 100644 --- a/packages/phoenix/src/utils.rs +++ b/packages/phoenix/src/utils.rs @@ -1,5 +1,5 @@ use decimal::Decimal; -use soroban_sdk::{contracttype, Address, BytesN}; +use soroban_sdk::{contracttype, Address}; // Validate if int value is bigger then 0 #[macro_export] @@ -26,7 +26,6 @@ pub fn is_approx_ratio(a: Decimal, b: Decimal, tolerance: Decimal) -> bool { #[contracttype] #[derive(Clone, Debug, Eq, PartialEq)] pub struct TokenInitInfo { - pub token_wasm_hash: BytesN<32>, pub token_a: Address, pub token_b: Address, } @@ -34,7 +33,6 @@ pub struct TokenInitInfo { #[contracttype] #[derive(Clone, Debug, Eq, PartialEq)] pub struct StakeInitInfo { - pub stake_wasm_hash: BytesN<32>, pub min_bond: i128, pub max_distributions: u32, pub min_reward: i128, @@ -44,7 +42,6 @@ pub struct StakeInitInfo { #[derive(Clone, Debug, Eq, PartialEq)] pub struct LiquidityPoolInitInfo { pub admin: Address, - pub lp_wasm_hash: BytesN<32>, pub share_token_decimals: u32, pub swap_fee_bps: i64, pub fee_recipient: Address,