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,