From 318aace7ce996178f877a2b420bc34657efacbfa Mon Sep 17 00:00:00 2001 From: gangov <6922910+gangov@users.noreply.github.com> Date: Tue, 14 Jan 2025 19:21:27 +0200 Subject: [PATCH 01/11] adds test for the upgrade off factory, pool and stake --- .artifacts/old_phoenix_factory.wasm | Bin 0 -> 21848 bytes .artifacts/old_phoenix_multihop.wasm | Bin 0 -> 14829 bytes .artifacts/old_phoenix_pool.wasm | Bin 0 -> 40003 bytes .artifacts/old_phoenix_pool_stable.wasm | Bin 0 -> 42506 bytes .artifacts/old_phoenix_stake.wasm | Bin 0 -> 24323 bytes .artifacts/old_phoenix_stake_rewards.wasm | Bin 0 -> 49631 bytes .artifacts/old_phoenix_vesting.wasm | Bin 0 -> 29951 bytes .artifacts/old_soroban_token_contract.wasm | Bin 0 -> 7184 bytes contracts/factory/Cargo.toml | 1 + contracts/factory/src/tests/setup.rs | 76 ++++++++++- contracts/pool/Cargo.toml | 1 + contracts/pool/src/tests/config.rs | 70 +---------- contracts/pool/src/tests/setup.rs | 139 ++++++++++++++++++++- contracts/stake/src/tests/setup.rs | 53 ++++---- 14 files changed, 250 insertions(+), 90 deletions(-) create mode 100755 .artifacts/old_phoenix_factory.wasm create mode 100755 .artifacts/old_phoenix_multihop.wasm create mode 100755 .artifacts/old_phoenix_pool.wasm create mode 100755 .artifacts/old_phoenix_pool_stable.wasm create mode 100755 .artifacts/old_phoenix_stake.wasm create mode 100755 .artifacts/old_phoenix_stake_rewards.wasm create mode 100755 .artifacts/old_phoenix_vesting.wasm create mode 100755 .artifacts/old_soroban_token_contract.wasm diff --git a/.artifacts/old_phoenix_factory.wasm b/.artifacts/old_phoenix_factory.wasm new file mode 100755 index 0000000000000000000000000000000000000000..a1f44bedacaee0ac75ae12b789c8b19864021d2e GIT binary patch literal 21848 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 literal 0 HcmV?d00001 diff --git a/.artifacts/old_phoenix_pool.wasm b/.artifacts/old_phoenix_pool.wasm new file mode 100755 index 0000000000000000000000000000000000000000..1b614a6abea7bac68786728830fd8dc7d52e4642 GIT binary patch literal 40003 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 Sf|Ns2MQkwitd?b4{r>_SFnc@z literal 0 HcmV?d00001 diff --git a/.artifacts/old_phoenix_stake_rewards.wasm b/.artifacts/old_phoenix_stake_rewards.wasm new file mode 100755 index 0000000000000000000000000000000000000000..9ffcb389f4c7f1b2ca0dedb5a81b7e08e5311d7b GIT binary patch literal 49631 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 BytesN<32> { + soroban_sdk::contractimport!(file = "../../.artifacts/old_phoenix_pool.wasm"); + env.deployer().upload_contract_wasm(WASM) +} + +#[allow(clippy::too_many_arguments)] +pub fn old_stake_wasm(env: &Env) -> BytesN<32> { + soroban_sdk::contractimport!(file = "../../.artifacts/old_phoenix_stake.wasm"); + env.deployer().upload_contract_wasm(WASM) +} + +#[allow(clippy::too_many_arguments)] +pub fn install_latest_factory(env: &Env) -> BytesN<32> { + soroban_sdk::contractimport!( + file = "../../target/wasm32-unknown-unknown/release/phoenix_factory.wasm" + ); + env.deployer().upload_contract_wasm(WASM) +} + #[allow(clippy::too_many_arguments)] pub mod lp_contract { soroban_sdk::contractimport!( @@ -126,3 +154,49 @@ pub fn install_and_deploy_token_contract<'a>( token_client } + +#[test] +#[allow(deprecated)] +#[cfg(feature = "upgrade")] +fn update_factory() { + let env = Env::default(); + env.mock_all_auths(); + env.cost_estimate().budget().reset_unlimited(); + let admin = Address::generate(&env); + + let factory_addr = env.register_contract_wasm(None, old_factory::WASM); + let old_factory_client = old_factory::Client::new(&env, &factory_addr); + + old_factory_client.initialize( + &admin.clone(), + &install_multihop_wasm(&env), + &old_lp_wasm(&env), + &install_stable_lp(&env), + &old_stake_wasm(&env), + &install_token_wasm(&env), + &vec![ + &env, + admin.clone(), + Address::generate(&env), + Address::generate(&env), + ], + &7u32, + ); + + assert_eq!(old_factory_client.get_admin(), admin.clone()); + + let latest_factory_wasm = install_latest_factory(&env); + let stable_wasm = install_stable_lp(&env); + + old_factory_client.update(&latest_factory_wasm, &stable_wasm); + + let latest_factory_client = FactoryClient::new(&env, &factory_addr); + + assert_eq!(latest_factory_client.get_admin(), admin.clone()); + + latest_factory_client.update_wasm_hashes( + &Some(install_lp_contract(&env)), + &Some(install_stake_wasm(&env)), + &Some(install_token_wasm(&env)), + ); +} diff --git a/contracts/pool/Cargo.toml b/contracts/pool/Cargo.toml index 3297d9555..c8a3d9155 100644 --- a/contracts/pool/Cargo.toml +++ b/contracts/pool/Cargo.toml @@ -11,6 +11,7 @@ crate-type = ["cdylib"] [features] testutils = ["soroban-sdk/testutils"] +upgrade = [] [dependencies] soroban-decimal = { workspace = true } diff --git a/contracts/pool/src/tests/config.rs b/contracts/pool/src/tests/config.rs index cfdb3bf4a..c00c3c3cb 100644 --- a/contracts/pool/src/tests/config.rs +++ b/contracts/pool/src/tests/config.rs @@ -1,14 +1,15 @@ -extern crate std; use phoenix::utils::{LiquidityPoolInitInfo, StakeInitInfo, TokenInitInfo}; -use soroban_sdk::{testutils::Address as _, Address, Env, String}; +use soroban_sdk::{ + testutils::{arbitrary::std, Address as _}, + Address, Env, String, +}; use super::setup::{ - deploy_liquidity_pool_contract, deploy_token_contract, install_new_lp_wasm, install_stake_wasm, - install_token_wasm, + deploy_liquidity_pool_contract, deploy_token_contract, install_stake_wasm, install_token_wasm, }; use crate::{ contract::{LiquidityPool, LiquidityPoolClient}, - storage::{Asset, Config, PairType, PoolResponse}, + storage::{Config, PairType}, }; #[should_panic( @@ -302,65 +303,6 @@ fn update_config_too_high_fees() { ); } -#[test] -fn update_liquidity_pool_works() { - let env = Env::default(); - env.mock_all_auths(); - env.cost_estimate().budget().reset_unlimited(); - - let mut admin1 = Address::generate(&env); - let mut admin2 = Address::generate(&env); - - let mut token1 = deploy_token_contract(&env, &admin1); - let mut token2 = deploy_token_contract(&env, &admin2); - if token2.address < token1.address { - std::mem::swap(&mut token1, &mut token2); - std::mem::swap(&mut admin1, &mut admin2); - } - let user1 = Address::generate(&env); - let stake_manager = Address::generate(&env); - let stake_owner = Address::generate(&env); - let swap_fees = 0i64; - let pool = deploy_liquidity_pool_contract( - &env, - Some(admin1.clone()), - (&token1.address, &token2.address), - swap_fees, - user1.clone(), - 500, - 200, - stake_manager, - stake_owner, - ); - - let new_wasm_hash = install_new_lp_wasm(&env); - - // no assertions, just check if it goes smooth - pool.upgrade(&new_wasm_hash, &5_000i64); - - let result = pool.query_pool_info_for_factory(); - // not using result only because we have to take the current contract address, which is not known during the test - assert_eq!( - result.pool_response, - PoolResponse { - asset_a: Asset { - address: token1.address, - amount: 0 - }, - asset_b: Asset { - address: token2.address, - amount: 0 - }, - asset_lp_share: Asset { - address: pool.query_share_token_address(), - amount: 0 - }, - stake_address: pool.query_stake_contract_address(), - } - ); - assert_eq!(result.total_fee_bps, 0); -} - #[test] fn update_configs_all_bps_values_should_work() { let env = Env::default(); diff --git a/contracts/pool/src/tests/setup.rs b/contracts/pool/src/tests/setup.rs index 2e5faac0e..af2b57b8c 100644 --- a/contracts/pool/src/tests/setup.rs +++ b/contracts/pool/src/tests/setup.rs @@ -1,4 +1,7 @@ -use soroban_sdk::{testutils::Address as _, Address, BytesN, Env, String}; +use soroban_sdk::{ + testutils::{arbitrary::std, Address as _}, + Address, BytesN, Env, String, +}; use crate::{ contract::{LiquidityPool, LiquidityPoolClient}, @@ -15,6 +18,23 @@ pub fn deploy_token_contract<'a>(env: &Env, admin: &Address) -> token_contract:: ) } +#[allow(clippy::too_many_arguments)] +pub mod old_liquidity_pool { + soroban_sdk::contractimport!(file = "../../.artifacts/old_phoenix_pool.wasm"); +} + +#[allow(clippy::too_many_arguments)] +pub mod latest_liquidity_pool { + soroban_sdk::contractimport!( + file = "../../target/wasm32-unknown-unknown/release/phoenix_pool.wasm" + ); +} + +pub fn install_old_token_wasm(env: &Env) -> BytesN<32> { + soroban_sdk::contractimport!(file = "../../.artifacts/old_soroban_token_contract.wasm"); + env.deployer().upload_contract_wasm(WASM) +} + pub fn install_token_wasm(env: &Env) -> BytesN<32> { soroban_sdk::contractimport!( file = "../../target/wasm32-unknown-unknown/release/soroban_token_contract.wasm" @@ -93,3 +113,120 @@ pub fn deploy_liquidity_pool_contract<'a>( ); pool } + +#[test] +#[allow(deprecated)] +#[cfg(feature = "upgrade")] +fn update_liquidity_pool() { + use soroban_sdk::testutils::Ledger; + + let env = Env::default(); + env.mock_all_auths(); + env.cost_estimate().budget().reset_unlimited(); + + let mut admin1 = Address::generate(&env); + let mut admin2 = Address::generate(&env); + let user1 = Address::generate(&env); + + let mut token1 = deploy_token_contract(&env, &admin1); + let mut token2 = deploy_token_contract(&env, &admin2); + + if token2.address < token1.address { + std::mem::swap(&mut token1, &mut token2); + std::mem::swap(&mut admin1, &mut admin2); + } + + let old_lp_addr = env.register_contract_wasm(None, old_liquidity_pool::WASM); + let old_lp_client = old_liquidity_pool::Client::new(&env, &old_lp_addr); + + let token_init_info = old_liquidity_pool::TokenInitInfo { + token_a: token1.address.clone(), + token_b: token2.address.clone(), + }; + let stake_init_info = old_liquidity_pool::StakeInitInfo { + min_bond: 10i128, + min_reward: 5i128, + manager: Address::generate(&env), + max_complexity: 10u32, + }; + let stake_wasm_hash = install_stake_wasm(&env); + let token_wasm_hash = install_old_token_wasm(&env); + + let lp_init_info = old_liquidity_pool::LiquidityPoolInitInfo { + admin: admin1.clone(), + swap_fee_bps: 0, + fee_recipient: admin1.clone(), + max_allowed_slippage_bps: 5_000, + default_slippage_bps: 2_500, + max_allowed_spread_bps: 1_000, + max_referral_bps: 5_000, + token_init_info, + stake_init_info, + }; + + old_lp_client.initialize( + &stake_wasm_hash, + &token_wasm_hash, + &lp_init_info, + &Address::generate(&env), + &7, + &String::from_str(&env, "Pool"), + &String::from_str(&env, "PHOBTC"), + &100i64, + &1_000, + ); + + assert_eq!(old_lp_client.query_config().fee_recipient, admin1); + + env.ledger().with_mut(|li| li.timestamp = 100); + + token1.mint(&user1, &1_000_000_000_000_000); + token2.mint(&user1, &1_000_000_000_000_000); + + old_lp_client.provide_liquidity( + &user1, + &Some(1_000_000_000_000_000), + &Some(1_000_000_000_000_000), + &Some(1_000_000_000_000_000), + &Some(1_000_000_000_000_000), + &None, + &None, + ); + + let new_lp_wasm = install_new_lp_wasm(&env); + old_lp_client.update(&new_lp_wasm); + + let new_lp_client = latest_liquidity_pool::Client::new(&env, &old_lp_addr); + + assert_eq!(new_lp_client.query_config().fee_recipient, admin1); + + env.ledger().with_mut(|li| li.timestamp = 10_000); + + new_lp_client.withdraw_liquidity( + &user1, + &500_000_000_000_000, + &500_000_000_000_000, + &500_000_000_000_000, + &None, + ); + + let pool_info_after_upgrade = new_lp_client.query_pool_info_for_factory(); + assert_eq!( + pool_info_after_upgrade.pool_response, + latest_liquidity_pool::PoolResponse { + asset_a: latest_liquidity_pool::Asset { + address: token1.address, + amount: 500000000000000 + }, + asset_b: latest_liquidity_pool::Asset { + address: token2.address, + amount: 500000000000000, + }, + asset_lp_share: latest_liquidity_pool::Asset { + address: new_lp_client.query_share_token_address(), + amount: 500000000000000 + }, + stake_address: new_lp_client.query_stake_contract_address(), + } + ); +} diff --git a/contracts/stake/src/tests/setup.rs b/contracts/stake/src/tests/setup.rs index 9d393a5ac..0f3449c47 100644 --- a/contracts/stake/src/tests/setup.rs +++ b/contracts/stake/src/tests/setup.rs @@ -1,9 +1,9 @@ -use soroban_sdk::{testutils::Address as _, Address, BytesN, Env}; - use crate::{ contract::{Staking, StakingClient}, token_contract, }; +use soroban_sdk::{testutils::Address as _, Address, BytesN, Env}; +use soroban_sdk::{testutils::Ledger, vec}; pub fn deploy_token_contract<'a>(env: &Env, admin: &Address) -> token_contract::Client<'a> { token_contract::Client::new( @@ -20,6 +20,11 @@ mod stake_latest { ); } +#[allow(clippy::too_many_arguments)] +mod old_stake { + soroban_sdk::contractimport!(file = "../../.artifacts/old_phoenix_stake.wasm"); +} + #[allow(dead_code)] fn install_stake_latest_wasm(env: &Env) -> BytesN<32> { env.deployer().upload_contract_wasm(stake_latest::WASM) @@ -54,29 +59,27 @@ pub fn deploy_staking_contract<'a>( staking } -#[cfg(feature = "upgrade")] -use soroban_sdk::{testutils::Ledger, vec}; - #[test] +#[allow(deprecated)] #[cfg(feature = "upgrade")] fn upgrade_stake_contract() { let env = Env::default(); env.mock_all_auths(); - env.budget().reset_unlimited(); + env.cost_estimate().budget().reset_unlimited(); let admin = Address::generate(&env); let user = Address::generate(&env); let token_client = deploy_token_contract(&env, &admin); token_client.mint(&user, &1_000); - let stake_addr = env.register_contract_wasm(None, stake_v_1_0_0::WASM); + let stake_addr = env.register_contract_wasm(None, old_stake::WASM); - let stake_v_1_0_0_client = stake_v_1_0_0::Client::new(&env, &stake_addr); + let old_stake_client = old_stake::Client::new(&env, &stake_addr); let manager = Address::generate(&env); let owner = Address::generate(&env); - stake_v_1_0_0_client.initialize( + old_stake_client.initialize( &admin, &token_client.address, &10, @@ -86,45 +89,47 @@ fn upgrade_stake_contract() { &10, ); - assert_eq!(stake_v_1_0_0_client.query_admin(), admin); + assert_eq!(old_stake_client.query_admin(), admin); env.ledger().with_mut(|li| li.timestamp = 100); - stake_v_1_0_0_client.bond(&user, &1_000); + old_stake_client.bond(&user, &1_000); assert_eq!( - stake_v_1_0_0_client.query_staked(&user), - stake_v_1_0_0::StakedResponse { + old_stake_client.query_staked(&user), + old_stake::StakedResponse { stakes: vec![ &env, - stake_v_1_0_0::Stake { + old_stake::Stake { stake: 1_000i128, stake_timestamp: 100 } - ] + ], + last_reward_time: 0u64, + total_stake: 1_000i128, } ); env.ledger().with_mut(|li| li.timestamp = 10_000); let new_stake_wasm = install_stake_latest_wasm(&env); - stake_v_1_0_0_client.update(&new_stake_wasm); - stake_v_1_0_0_client.update(&new_stake_wasm); + old_stake_client.update(&new_stake_wasm); - let upgraded_stake_client = stake_latest::Client::new(&env, &stake_addr); + let new_stake_client = stake_latest::Client::new(&env, &stake_addr); - assert_eq!(upgraded_stake_client.query_admin(), admin); + assert_eq!(new_stake_client.query_admin(), admin); env.ledger().with_mut(|li| li.timestamp = 20_000); - upgraded_stake_client.unbond(&user, &1_000, &100); + new_stake_client.unbond(&user, &1_000, &100); assert_eq!( - upgraded_stake_client.query_staked(&user), + new_stake_client.query_staked(&user), stake_latest::StakedResponse { stakes: vec![&env,], - total_stake: 0i128 + total_stake: 0i128, + last_reward_time: 0u64, } ); - upgraded_stake_client.create_distribution_flow(&owner, &token_client.address); + new_stake_client.create_distribution_flow(&owner, &token_client.address); token_client.mint(&owner, &1_000); - upgraded_stake_client.distribute_rewards(&owner, &1_000, &token_client.address); + new_stake_client.distribute_rewards(&owner, &1_000, &token_client.address); } From 99507e22ecf960cde6f9d84805a2f65245c43cd6 Mon Sep 17 00:00:00 2001 From: gangov <6922910+gangov@users.noreply.github.com> Date: Wed, 15 Jan 2025 10:00:26 +0200 Subject: [PATCH 02/11] basic test for updating the multihop --- contracts/multihop/Cargo.toml | 1 + contracts/multihop/src/tests/setup.rs | 30 +++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/contracts/multihop/Cargo.toml b/contracts/multihop/Cargo.toml index 9db3c69fa..ffe81fe84 100644 --- a/contracts/multihop/Cargo.toml +++ b/contracts/multihop/Cargo.toml @@ -11,6 +11,7 @@ crate-type = ["cdylib"] [features] testutils = ["soroban-sdk/testutils"] +upgrade = [] [dependencies] soroban-sdk = { workspace = true } diff --git a/contracts/multihop/src/tests/setup.rs b/contracts/multihop/src/tests/setup.rs index 02225e9b7..f1ef906e2 100644 --- a/contracts/multihop/src/tests/setup.rs +++ b/contracts/multihop/src/tests/setup.rs @@ -7,6 +7,17 @@ use soroban_sdk::{ Address, Bytes, BytesN, Env, }; use soroban_sdk::{vec, String}; + +pub mod old_multihop { + soroban_sdk::contractimport!(file = "../../.artifacts/old_phoenix_multihop.wasm"); +} + +pub mod latest_multihop { + soroban_sdk::contractimport!( + file = "../../target/wasm32-unknown-unknown/release/phoenix_multihop.wasm" + ); +} + pub fn create_token_contract_with_metadata<'a>( env: &Env, admin: &Address, @@ -198,3 +209,22 @@ pub fn deploy_and_initialize_pool( } } } + +#[test] +#[allow(deprecated)] +#[cfg(feature = "upgrade")] +fn updapte_multihop() { + let env = Env::default(); + env.mock_all_auths(); + env.cost_estimate().budget().reset_unlimited(); + + let admin = Address::generate(&env); + let factory = Address::generate(&env); + + let old_multhop_addr = env.register_contract_wasm(None, old_multihop::WASM); + let old_multihop_client = old_multihop::Client::new(&env, &old_multhop_addr); + + old_multihop_client.initialize(&admin, &factory); + let latest_multihop_wasm = install_multihop_wasm(&env); + old_multihop_client.update(&latest_multihop_wasm); +} From c062240c6eb6ecf8ef9e727289622342311925e3 Mon Sep 17 00:00:00 2001 From: gangov <6922910+gangov@users.noreply.github.com> Date: Wed, 15 Jan 2025 10:21:55 +0200 Subject: [PATCH 03/11] clippy --- contracts/multihop/src/tests/setup.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contracts/multihop/src/tests/setup.rs b/contracts/multihop/src/tests/setup.rs index f1ef906e2..98372f32a 100644 --- a/contracts/multihop/src/tests/setup.rs +++ b/contracts/multihop/src/tests/setup.rs @@ -8,10 +8,12 @@ use soroban_sdk::{ }; use soroban_sdk::{vec, String}; +#[allow(clippy::too_many_arguments)] pub mod old_multihop { soroban_sdk::contractimport!(file = "../../.artifacts/old_phoenix_multihop.wasm"); } +#[allow(clippy::too_many_arguments)] pub mod latest_multihop { soroban_sdk::contractimport!( file = "../../target/wasm32-unknown-unknown/release/phoenix_multihop.wasm" From f77cf2040cfb5b373040790f59ab190ca6429479 Mon Sep 17 00:00:00 2001 From: gangov <6922910+gangov@users.noreply.github.com> Date: Wed, 15 Jan 2025 11:32:43 +0200 Subject: [PATCH 04/11] lints --- contracts/factory/src/tests/setup.rs | 3 + contracts/pool/src/tests/setup.rs | 2 + contracts/stake/src/tests/setup.rs | 3 +- contracts/stake_rewards/Cargo.toml | 1 + contracts/stake_rewards/src/tests/setup.rs | 81 +++++++++++++++++++++- 5 files changed, 88 insertions(+), 2 deletions(-) diff --git a/contracts/factory/src/tests/setup.rs b/contracts/factory/src/tests/setup.rs index a5f98a1d7..6154ed39f 100644 --- a/contracts/factory/src/tests/setup.rs +++ b/contracts/factory/src/tests/setup.rs @@ -17,18 +17,21 @@ pub mod old_factory { } #[allow(clippy::too_many_arguments)] +#[cfg(feature = "upgrade")] pub fn old_lp_wasm(env: &Env) -> BytesN<32> { soroban_sdk::contractimport!(file = "../../.artifacts/old_phoenix_pool.wasm"); env.deployer().upload_contract_wasm(WASM) } #[allow(clippy::too_many_arguments)] +#[cfg(feature = "upgrade")] pub fn old_stake_wasm(env: &Env) -> BytesN<32> { soroban_sdk::contractimport!(file = "../../.artifacts/old_phoenix_stake.wasm"); env.deployer().upload_contract_wasm(WASM) } #[allow(clippy::too_many_arguments)] +#[cfg(feature = "upgrade")] pub fn install_latest_factory(env: &Env) -> BytesN<32> { soroban_sdk::contractimport!( file = "../../target/wasm32-unknown-unknown/release/phoenix_factory.wasm" diff --git a/contracts/pool/src/tests/setup.rs b/contracts/pool/src/tests/setup.rs index af2b57b8c..b53829878 100644 --- a/contracts/pool/src/tests/setup.rs +++ b/contracts/pool/src/tests/setup.rs @@ -30,6 +30,7 @@ pub mod latest_liquidity_pool { ); } +#[cfg(feature = "upgrade")] pub fn install_old_token_wasm(env: &Env) -> BytesN<32> { soroban_sdk::contractimport!(file = "../../.artifacts/old_soroban_token_contract.wasm"); env.deployer().upload_contract_wasm(WASM) @@ -51,6 +52,7 @@ pub fn install_stake_wasm(env: &Env) -> BytesN<32> { } #[allow(clippy::too_many_arguments)] +#[cfg(feature = "upgrade")] pub fn install_new_lp_wasm(env: &Env) -> BytesN<32> { soroban_sdk::contractimport!( file = "../../target/wasm32-unknown-unknown/release/phoenix_pool.wasm" diff --git a/contracts/stake/src/tests/setup.rs b/contracts/stake/src/tests/setup.rs index 0f3449c47..3172870ca 100644 --- a/contracts/stake/src/tests/setup.rs +++ b/contracts/stake/src/tests/setup.rs @@ -3,7 +3,6 @@ use crate::{ token_contract, }; use soroban_sdk::{testutils::Address as _, Address, BytesN, Env}; -use soroban_sdk::{testutils::Ledger, vec}; pub fn deploy_token_contract<'a>(env: &Env, admin: &Address) -> token_contract::Client<'a> { token_contract::Client::new( @@ -63,6 +62,8 @@ pub fn deploy_staking_contract<'a>( #[allow(deprecated)] #[cfg(feature = "upgrade")] fn upgrade_stake_contract() { + use soroban_sdk::{testutils::Ledger, vec}; + let env = Env::default(); env.mock_all_auths(); env.cost_estimate().budget().reset_unlimited(); diff --git a/contracts/stake_rewards/Cargo.toml b/contracts/stake_rewards/Cargo.toml index 1b23eec86..98edf6a75 100644 --- a/contracts/stake_rewards/Cargo.toml +++ b/contracts/stake_rewards/Cargo.toml @@ -11,6 +11,7 @@ crate-type = ["cdylib"] [features] testutils = ["soroban-sdk/testutils"] +upgrade = [] [dependencies] soroban-decimal = { workspace = true } diff --git a/contracts/stake_rewards/src/tests/setup.rs b/contracts/stake_rewards/src/tests/setup.rs index 341a5409e..c4b1eeb13 100644 --- a/contracts/stake_rewards/src/tests/setup.rs +++ b/contracts/stake_rewards/src/tests/setup.rs @@ -1,10 +1,30 @@ -use soroban_sdk::{Address, Env}; +use soroban_sdk::{Address, BytesN, Env}; use crate::{ contract::{StakingRewards, StakingRewardsClient}, token_contract, }; +#[allow(clippy::too_many_arguments)] +pub mod old_stake_rewards { + soroban_sdk::contractimport!(file = "../../.artifacts/old_phoenix_stake_rewards.wasm"); +} + +#[allow(clippy::too_many_arguments)] +pub mod latest_stake_rewards { + soroban_sdk::contractimport!( + file = "../../target/wasm32-unknown-unknown/release/phoenix_stake_rewards.wasm" + ); +} + +#[allow(clippy::too_many_arguments)] +pub fn install_stake_rewards_wasm(env: &Env) -> BytesN<32> { + soroban_sdk::contractimport!( + file = "../../target/wasm32-unknown-unknown/release/phoenix_stake_rewards.wasm" + ); + env.deployer().upload_contract_wasm(WASM) +} + pub fn deploy_token_contract<'a>(env: &Env, admin: &Address) -> token_contract::Client<'a> { token_contract::Client::new( env, @@ -35,3 +55,62 @@ pub fn deploy_staking_rewards_contract<'a>( ); staking_rewards } + +#[test] +#[allow(deprecated)] +#[cfg(feature = "upgrade")] +fn updapte_stake_rewards() { + use soroban_sdk::testutils::Address as _; + + let env = Env::default(); + env.mock_all_auths(); + env.cost_estimate().budget().reset_unlimited(); + + let admin = Address::generate(&env); + let staking_contract = Address::generate(&env); + let reward_token = Address::generate(&env); + + let old_stake_rewards_addr = env.register_contract_wasm(None, old_stake_rewards::WASM); + + let old_stake_rewards_client = old_stake_rewards::Client::new(&env, &old_stake_rewards_addr); + + old_stake_rewards_client.initialize( + &admin, + &staking_contract, + &reward_token, + &MAX_COMPLEXITY, + &MIN_REWARD, + &MIN_BOND, + ); + + assert_eq!(old_stake_rewards_client.query_admin(), admin); + assert_eq!( + old_stake_rewards_client.query_config().config, + old_stake_rewards::Config { + max_complexity: MAX_COMPLEXITY, + min_bond: MIN_BOND, + min_reward: MIN_REWARD, + reward_token: reward_token.clone(), + staking_contract: staking_contract.clone(), + } + ); + + let latest_stake_rewards_wasm = install_stake_rewards_wasm(&env); + + old_stake_rewards_client.update(&latest_stake_rewards_wasm); + + let latest_stake_rewards_client = + latest_stake_rewards::Client::new(&env, &old_stake_rewards_addr); + + assert_eq!(latest_stake_rewards_client.query_admin(), admin); + assert_eq!( + latest_stake_rewards_client.query_config().config, + latest_stake_rewards::Config { + max_complexity: MAX_COMPLEXITY, + min_bond: MIN_BOND, + min_reward: MIN_REWARD, + reward_token, + staking_contract + } + ); +} From 219b856db83ac7a71eb26ce99641cf28a3f3ab3e Mon Sep 17 00:00:00 2001 From: gangov <6922910+gangov@users.noreply.github.com> Date: Wed, 15 Jan 2025 15:37:45 +0200 Subject: [PATCH 05/11] factory update test --- .artifacts/old_phoenix_factory.optimized.wasm | Bin 0 -> 19194 bytes .../old_phoenix_multihop.optimized.wasm | Bin 0 -> 12893 bytes .artifacts/old_phoenix_pool.optimized.wasm | Bin 0 -> 34501 bytes .../old_phoenix_pool_stable.optimized.wasm | Bin 0 -> 36495 bytes .artifacts/old_phoenix_stake.optimized.wasm | Bin 0 -> 21129 bytes .../old_phoenix_stake_rewards.optimized.wasm | Bin 0 -> 43669 bytes .../old_soroban_token_contract.optimized.wasm | Bin 0 -> 5928 bytes scripts/update.sh | 224 ++++++++++++++++++ 8 files changed, 224 insertions(+) create mode 100644 .artifacts/old_phoenix_factory.optimized.wasm create mode 100644 .artifacts/old_phoenix_multihop.optimized.wasm create mode 100644 .artifacts/old_phoenix_pool.optimized.wasm create mode 100644 .artifacts/old_phoenix_pool_stable.optimized.wasm create mode 100644 .artifacts/old_phoenix_stake.optimized.wasm create mode 100644 .artifacts/old_phoenix_stake_rewards.optimized.wasm create mode 100644 .artifacts/old_soroban_token_contract.optimized.wasm create mode 100755 scripts/update.sh diff --git a/.artifacts/old_phoenix_factory.optimized.wasm b/.artifacts/old_phoenix_factory.optimized.wasm new file mode 100644 index 0000000000000000000000000000000000000000..c8bfe3f77bb4b689ba65e20c04268833fab8f721 GIT binary patch literal 19194 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 literal 0 HcmV?d00001 diff --git a/.artifacts/old_phoenix_multihop.optimized.wasm b/.artifacts/old_phoenix_multihop.optimized.wasm new file mode 100644 index 0000000000000000000000000000000000000000..9e3144ae82372c3bd791a59e7cea97a47034d20e GIT binary patch literal 12893 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

-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 literal 0 HcmV?d00001 diff --git a/.artifacts/old_phoenix_pool.optimized.wasm b/.artifacts/old_phoenix_pool.optimized.wasm new file mode 100644 index 0000000000000000000000000000000000000000..358fd384b77d110b99d77434a080512ea2d44470 GIT binary patch literal 34501 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 E|9E{^vH$=8 literal 0 HcmV?d00001 diff --git a/.artifacts/old_phoenix_stake.optimized.wasm b/.artifacts/old_phoenix_stake.optimized.wasm new file mode 100644 index 0000000000000000000000000000000000000000..49a6870e7b6b5001d5d1bca7f6acb4a1096053d0 GIT binary patch literal 21129 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 G5&suC#>V;p literal 0 HcmV?d00001 diff --git a/.artifacts/old_phoenix_stake_rewards.optimized.wasm b/.artifacts/old_phoenix_stake_rewards.optimized.wasm new file mode 100644 index 0000000000000000000000000000000000000000..775de7b11cbac759a3a6583e3375bec2f4f42bf0 GIT binary patch literal 43669 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 literal 0 HcmV?d00001 diff --git a/.artifacts/old_soroban_token_contract.optimized.wasm b/.artifacts/old_soroban_token_contract.optimized.wasm new file mode 100644 index 0000000000000000000000000000000000000000..3b0fa5c9a6bf5e161859c1f953286d2a154baa5b GIT binary patch literal 5928 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 S(X*BLvEygU^JnLd(Z2zHkJYFE literal 0 HcmV?d00001 diff --git a/scripts/update.sh b/scripts/update.sh new file mode 100755 index 000000000..9b3b351ed --- /dev/null +++ b/scripts/update.sh @@ -0,0 +1,224 @@ +# Ensure the script exits on any errors +set -e + +# Check if the argument is provided +if [ -z "$1" ]; then + echo "Usage: $0 " + exit 1 +fi + +IDENTITY_STRING=$1 +ADMIN_ADDRESS=$(soroban keys address $IDENTITY_STRING) +NETWORK="testnet" + +echo "Build and optimize the contracts..."; + +make build > /dev/null + +echo "Contracts compiled." +echo "Optimize contracts..." + +soroban contract optimize --wasm target/wasm32-unknown-unknown/release/soroban_token_contract.wasm +soroban contract optimize --wasm .artifacts/old_soroban_token_contract.wasm + +soroban contract optimize --wasm target/wasm32-unknown-unknown/release/phoenix_factory.wasm +soroban contract optimize --wasm .artifacts/old_phoenix_factory.wasm + +soroban contract optimize --wasm target/wasm32-unknown-unknown/release/phoenix_pool.wasm +soroban contract optimize --wasm .artifacts/old_phoenix_pool.wasm + +soroban contract optimize --wasm target/wasm32-unknown-unknown/release/phoenix_pool_stable.wasm +soroban contract optimize --wasm .artifacts/old_phoenix_pool_stable.wasm + +soroban contract optimize --wasm target/wasm32-unknown-unknown/release/phoenix_stake.wasm +soroban contract optimize --wasm .artifacts/old_phoenix_stake.wasm + +soroban contract optimize --wasm target/wasm32-unknown-unknown/release/phoenix_stake_rewards.wasm +soroban contract optimize --wasm .artifacts/old_phoenix_stake_rewards.wasm + +soroban contract optimize --wasm target/wasm32-unknown-unknown/release/phoenix_multihop.wasm +soroban contract optimize --wasm .artifacts/old_phoenix_multihop.wasm + +echo "Contracts optimized." + +echo "installing old and latest wasm hashes" + +OLD_SOROBAN_TOKEN_WASM_HASH=$(soroban contract install \ + --wasm .artifacts/old_soroban_token_contract.wasm \ + --source $IDENTITY_STRING \ + --network $NETWORK) + +LATEST_SOROBAN_TOKEN_WASM_HASH=$(soroban contract install \ + --wasm target/wasm32-unknown-unknown/release/soroban_token_contract.wasm \ + --source $IDENTITY_STRING \ + --network $NETWORK) + +echo "Installed old token wasm: $OLD_SOROBAN_TOKEN_WASM_HASH" +echo "Installed latest token wasm: $LATEST_SOROBAN_TOKEN_WASM_HASH" + +OLD_PHOENIX_FACTORY_WASM_HASH=$(soroban contract install \ + --wasm .artifacts/old_phoenix_factory.wasm \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK") +LATEST_PHOENIX_FACTORY_WASM_HASH=$(soroban contract install \ + --wasm target/wasm32-unknown-unknown/release/phoenix_factory.wasm \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK") +echo "Installed old factory wasm: $OLD_PHOENIX_FACTORY_WASM_HASH" +echo "Installed latest factory wasm: $LATEST_PHOENIX_FACTORY_WASM_HASH" + +OLD_PHOENIX_POOL_WASM_HASH=$(soroban contract install \ + --wasm .artifacts/old_phoenix_pool.wasm \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK") +LATEST_PHOENIX_POOL_WASM_HASH=$(soroban contract install \ + --wasm target/wasm32-unknown-unknown/release/phoenix_pool.wasm \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK") +echo "Installed old pool wasm: $OLD_PHOENIX_POOL_WASM_HASH" +echo "Installed latest pool wasm: $LATEST_PHOENIX_POOL_WASM_HASH" + +OLD_PHOENIX_POOL_STABLE_WASM_HASH=$(soroban contract install \ + --wasm .artifacts/old_phoenix_pool_stable.wasm \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK") +LATEST_PHOENIX_POOL_STABLE_WASM_HASH=$(soroban contract install \ + --wasm target/wasm32-unknown-unknown/release/phoenix_pool_stable.wasm \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK") +echo "Installed old stable pool wasm: $OLD_PHOENIX_POOL_STABLE_WASM_HASH" +echo "Installed latest stable pool wasm: $LATEST_PHOENIX_POOL_STABLE_WASM_HASH" + +OLD_PHOENIX_STAKE_WASM_HASH=$(soroban contract install \ + --wasm .artifacts/old_phoenix_stake.wasm \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK") +LATEST_PHOENIX_STAKE_WASM_HASH=$(soroban contract install \ + --wasm target/wasm32-unknown-unknown/release/phoenix_stake.wasm \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK") +echo "Installed old stake wasm: $OLD_PHOENIX_STAKE_WASM_HASH" +echo "Installed latest stake wasm: $LATEST_PHOENIX_STAKE_WASM_HASH" + +OLD_PHOENIX_STAKE_REWARDS_WASM_HASH=$(soroban contract install \ + --wasm .artifacts/old_phoenix_stake_rewards.wasm \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK") +LATEST_PHOENIX_STAKE_REWARDS_WASM_HASH=$(soroban contract install \ + --wasm target/wasm32-unknown-unknown/release/phoenix_stake_rewards.wasm \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK") +echo "Installed old stake rewards wasm: $OLD_PHOENIX_STAKE_REWARDS_WASM_HASH" +echo "Installed latest stake rewards wasm: $LATEST_PHOENIX_STAKE_REWARDS_WASM_HASH" + +OLD_PHOENIX_MULTIHOP_WASM_HASH=$(soroban contract install \ + --wasm .artifacts/old_phoenix_multihop.wasm \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK") +LATEST_PHOENIX_MULTIHOP_WASM_HASH=$(soroban contract install \ + --wasm target/wasm32-unknown-unknown/release/phoenix_multihop.wasm \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK") +echo "Installed old multihop wasm: $OLD_PHOENIX_MULTIHOP_WASM_HASH" +echo "Installed latest multihop wasm: $LATEST_PHOENIX_MULTIHOP_WASM_HASH" + +echo "All old and latest WASMs have been installed successfully." + + +echo "Deploying old factory contract..." +FACTORY_ADDR=$(soroban contract deploy \ + --wasm-hash "$OLD_PHOENIX_FACTORY_WASM_HASH" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK") +echo "Old factory deployed at: $FACTORY_ADDR" + + +echo "Initializing old factory..." +soroban contract invoke \ + --id "$FACTORY_ADDR" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + initialize \ + --admin "$ADMIN_ADDRESS" \ + --multihop_wasm_hash "$OLD_PHOENIX_MULTIHOP_WASM_HASH" \ + --lp_wasm_hash "$OLD_PHOENIX_POOL_WASM_HASH" \ + --stable_wasm_hash "$OLD_PHOENIX_POOL_STABLE_WASM_HASH" \ + --stake_wasm_hash "$OLD_PHOENIX_STAKE_WASM_HASH" \ + --token_wasm_hash "$OLD_SOROBAN_TOKEN_WASM_HASH" \ + --whitelisted_accounts "[ \"$ADMIN_ADDRESS\" ]" \ + --lp_token_decimals 7 + +echo "Old factory initialized." + + +echo "Checking the admin of the old factory..." +FACTORY_ADMIN=$(soroban contract invoke \ + --id "$FACTORY_ADDR" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + get_admin) + +echo "Factory admin is: $FACTORY_ADMIN (expected \"${ADMIN_ADDRESS}\")" +# Typically the returned value is in quotes, e.g. "\"GA...\"" +if [ "$FACTORY_ADMIN" != "\"${ADMIN_ADDRESS}\"" ]; then + echo "ERROR: Admin does not match expected address." + exit 1 +else + echo "Factory admin matches as expected." +fi + + +echo "Updating old factory to new factory code..." + +soroban contract invoke \ + --id "$FACTORY_ADDR" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + update \ + --new_wasm_hash "$LATEST_PHOENIX_FACTORY_WASM_HASH" \ + --new_stable_pool_hash "$LATEST_PHOENIX_POOL_STABLE_WASM_HASH" + +echo "Factory updated to the latest code." + + +echo "Checking the admin of the updated factory..." +UPDATED_FACTORY_ADMIN=$(soroban contract invoke \ + --id "$FACTORY_ADDR" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + get_admin) + +echo "Updated factory admin is: $UPDATED_FACTORY_ADMIN (expected \"${ADMIN_ADDRESS}\")" +if [ "$UPDATED_FACTORY_ADMIN" != "\"${ADMIN_ADDRESS}\"" ]; then + echo "ERROR: Admin changed after update." + exit 1 +else + echo "Admin is still correct after factory update." +fi + + +echo "Updating wasm hashes on the updated factory..." + +LATEST_LP_WASM_HASH="$LATEST_PHOENIX_POOL_WASM_HASH" +LATEST_STAKE_WASM_HASH="$LATEST_PHOENIX_STAKE_WASM_HASH" +LATEST_TOKEN_WASM_HASH="$LATEST_SOROBAN_TOKEN_WASM_HASH" + +soroban contract invoke \ + --id "$FACTORY_ADDR" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + update_wasm_hashes \ + --lp_wasm_hash "$LATEST_LP_WASM_HASH" \ + --stake_wasm_hash "$LATEST_STAKE_WASM_HASH" \ + --token_wasm_hash "$LATEST_TOKEN_WASM_HASH" + +echo "WASM hashes updated on the factory." + + +echo "'update_factory' test have been replicated via shell." + From 12775a863c2bbfe146803eff58bcb58d06c4fb0a Mon Sep 17 00:00:00 2001 From: gangov <6922910+gangov@users.noreply.github.com> Date: Wed, 15 Jan 2025 15:52:50 +0200 Subject: [PATCH 06/11] update multihop --- scripts/update.sh | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/scripts/update.sh b/scripts/update.sh index 9b3b351ed..0b25ed713 100755 --- a/scripts/update.sh +++ b/scripts/update.sh @@ -222,3 +222,42 @@ echo "WASM hashes updated on the factory." echo "'update_factory' test have been replicated via shell." + +echo "Deploying old multihop contract..." + +OLD_MULTIHOP_ADDR=$(soroban contract deploy \ + --wasm-hash "$OLD_PHOENIX_MULTIHOP_WASM_HASH" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK") + +echo "Old multihop contract deployed at: $OLD_MULTIHOP_ADDR" + + +echo "Initializing old multihop contract..." + +soroban contract invoke \ + --id "$OLD_MULTIHOP_ADDR" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + initialize \ + --admin "$ADMIN_ADDRESS" \ + --factory "$FACTORY_ADDR" + +echo "Old multihop initialized with admin=$ADMIN_ADDRESS factory=$FACTORY_ADDR." + +echo "Updating old multihop contract to latest multihop code..." + +soroban contract invoke \ + --id "$OLD_MULTIHOP_ADDR" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + update \ + --new_wasm_hash "$LATEST_PHOENIX_MULTIHOP_WASM_HASH" + +echo "Multihop contract updated to the latest code." + +echo "'updapte_multihop' test have been replicated." +echo "Old -> Updated multihop contract address: $OLD_MULTIHOP_ADDR" + From b7d75718c1ef852ca7e564b78d658af64a375d43 Mon Sep 17 00:00:00 2001 From: gangov <6922910+gangov@users.noreply.github.com> Date: Wed, 15 Jan 2025 18:47:27 +0200 Subject: [PATCH 07/11] wip --- scripts/update.sh | 382 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 300 insertions(+), 82 deletions(-) diff --git a/scripts/update.sh b/scripts/update.sh index 0b25ed713..8c3438cf4 100755 --- a/scripts/update.sh +++ b/scripts/update.sh @@ -7,6 +7,18 @@ if [ -z "$1" ]; then exit 1 fi +# Folder name to check and delete +FOLDER=".stellar" + +# Check if the folder exists +if [ -d "$FOLDER" ]; then + echo "Folder '$FOLDER' exists. Deleting it..." + rm -rf "$FOLDER" + echo "Folder '$FOLDER' has been deleted." +else + echo "Folder '$FOLDER' does not exist." +fi + IDENTITY_STRING=$1 ADMIN_ADDRESS=$(soroban keys address $IDENTITY_STRING) NETWORK="testnet" @@ -125,139 +137,345 @@ echo "Installed latest multihop wasm: $LATEST_PHOENIX_MULTIHOP_WASM_HASH" echo "All old and latest WASMs have been installed successfully." -echo "Deploying old factory contract..." -FACTORY_ADDR=$(soroban contract deploy \ - --wasm-hash "$OLD_PHOENIX_FACTORY_WASM_HASH" \ +# echo "Deploying old factory contract..." +# FACTORY_ADDR=$(soroban contract deploy \ +# --wasm-hash "$OLD_PHOENIX_FACTORY_WASM_HASH" \ +# --source "$IDENTITY_STRING" \ +# --network "$NETWORK") +# echo "Old factory deployed at: $FACTORY_ADDR" +# +# +# echo "Initializing old factory..." +# soroban contract invoke \ +# --id "$FACTORY_ADDR" \ +# --source "$IDENTITY_STRING" \ +# --network "$NETWORK" \ +# -- \ +# initialize \ +# --admin "$ADMIN_ADDRESS" \ +# --multihop_wasm_hash "$OLD_PHOENIX_MULTIHOP_WASM_HASH" \ +# --lp_wasm_hash "$OLD_PHOENIX_POOL_WASM_HASH" \ +# --stable_wasm_hash "$OLD_PHOENIX_POOL_STABLE_WASM_HASH" \ +# --stake_wasm_hash "$OLD_PHOENIX_STAKE_WASM_HASH" \ +# --token_wasm_hash "$OLD_SOROBAN_TOKEN_WASM_HASH" \ +# --whitelisted_accounts "[ \"$ADMIN_ADDRESS\" ]" \ +# --lp_token_decimals 7 +# +# echo "Old factory initialized." +# +# +# echo "Checking the admin of the old factory..." +# FACTORY_ADMIN=$(soroban contract invoke \ +# --id "$FACTORY_ADDR" \ +# --source "$IDENTITY_STRING" \ +# --network "$NETWORK" \ +# -- \ +# get_admin) +# +# echo "Factory admin is: $FACTORY_ADMIN (expected \"${ADMIN_ADDRESS}\")" +# # Typically the returned value is in quotes, e.g. "\"GA...\"" +# if [ "$FACTORY_ADMIN" != "\"${ADMIN_ADDRESS}\"" ]; then +# echo "ERROR: Admin does not match expected address." +# exit 1 +# else +# echo "Factory admin matches as expected." +# fi +# +# +# echo "Updating old factory to new factory code..." +# +# soroban contract invoke \ +# --id "$FACTORY_ADDR" \ +# --source "$IDENTITY_STRING" \ +# --network "$NETWORK" \ +# -- \ +# update \ +# --new_wasm_hash "$LATEST_PHOENIX_FACTORY_WASM_HASH" \ +# --new_stable_pool_hash "$LATEST_PHOENIX_POOL_STABLE_WASM_HASH" +# +# echo "Factory updated to the latest code." +# +# +# echo "Checking the admin of the updated factory..." +# UPDATED_FACTORY_ADMIN=$(soroban contract invoke \ +# --id "$FACTORY_ADDR" \ +# --source "$IDENTITY_STRING" \ +# --network "$NETWORK" \ +# -- \ +# get_admin) +# +# echo "Updated factory admin is: $UPDATED_FACTORY_ADMIN (expected \"${ADMIN_ADDRESS}\")" +# if [ "$UPDATED_FACTORY_ADMIN" != "\"${ADMIN_ADDRESS}\"" ]; then +# echo "ERROR: Admin changed after update." +# exit 1 +# else +# echo "Admin is still correct after factory update." +# fi +# +# +# echo "Updating wasm hashes on the updated factory..." +# +# LATEST_LP_WASM_HASH="$LATEST_PHOENIX_POOL_WASM_HASH" +# LATEST_STAKE_WASM_HASH="$LATEST_PHOENIX_STAKE_WASM_HASH" +# LATEST_TOKEN_WASM_HASH="$LATEST_SOROBAN_TOKEN_WASM_HASH" +# +# soroban contract invoke \ +# --id "$FACTORY_ADDR" \ +# --source "$IDENTITY_STRING" \ +# --network "$NETWORK" \ +# -- \ +# update_wasm_hashes \ +# --lp_wasm_hash "$LATEST_LP_WASM_HASH" \ +# --stake_wasm_hash "$LATEST_STAKE_WASM_HASH" \ +# --token_wasm_hash "$LATEST_TOKEN_WASM_HASH" +# +# echo "WASM hashes updated on the factory." +# +# +# echo "'update_factory' test have been replicated via shell." +# +# +# echo "Deploying old multihop contract..." +# +# OLD_MULTIHOP_ADDR=$(soroban contract deploy \ +# --wasm-hash "$OLD_PHOENIX_MULTIHOP_WASM_HASH" \ +# --source "$IDENTITY_STRING" \ +# --network "$NETWORK") +# +# echo "Old multihop contract deployed at: $OLD_MULTIHOP_ADDR" +# +# +# echo "Initializing old multihop contract..." +# +# soroban contract invoke \ +# --id "$OLD_MULTIHOP_ADDR" \ +# --source "$IDENTITY_STRING" \ +# --network "$NETWORK" \ +# -- \ +# initialize \ +# --admin "$ADMIN_ADDRESS" \ +# --factory "$FACTORY_ADDR" +# +# echo "Old multihop initialized with admin=$ADMIN_ADDRESS factory=$FACTORY_ADDR." +# +# echo "Updating old multihop contract to latest multihop code..." +# +# soroban contract invoke \ +# --id "$OLD_MULTIHOP_ADDR" \ +# --source "$IDENTITY_STRING" \ +# --network "$NETWORK" \ +# -- \ +# update \ +# --new_wasm_hash "$LATEST_PHOENIX_MULTIHOP_WASM_HASH" +# +# echo "Multihop contract updated to the latest code." +# +# echo "'updapte_multihop' test have been replicated." +# echo "Old -> Updated multihop contract address: $OLD_MULTIHOP_ADDR" + +soroban keys generate luke --network testnet --fund +soroban keys generate obiwan --network testnet --fund +soroban keys generate jarjar --network testnet --fund + +ADMIN=$(soroban keys address luke) +USER=$(soroban keys address jarjar) + + +echo "Deploying token contract 1 under admin..." +TOKEN_ADDR1=$(soroban contract deploy \ + --wasm-hash "$OLD_SOROBAN_TOKEN_WASM_HASH" \ --source "$IDENTITY_STRING" \ --network "$NETWORK") -echo "Old factory deployed at: $FACTORY_ADDR" +echo "token1 deployed at: $TOKEN_ADDR1" - -echo "Initializing old factory..." +echo "Initializing token1 with admin=$ADMIN..." soroban contract invoke \ - --id "$FACTORY_ADDR" \ + --id "$TOKEN_ADDR1" \ --source "$IDENTITY_STRING" \ --network "$NETWORK" \ -- \ initialize \ - --admin "$ADMIN_ADDRESS" \ - --multihop_wasm_hash "$OLD_PHOENIX_MULTIHOP_WASM_HASH" \ - --lp_wasm_hash "$OLD_PHOENIX_POOL_WASM_HASH" \ - --stable_wasm_hash "$OLD_PHOENIX_POOL_STABLE_WASM_HASH" \ - --stake_wasm_hash "$OLD_PHOENIX_STAKE_WASM_HASH" \ - --token_wasm_hash "$OLD_SOROBAN_TOKEN_WASM_HASH" \ - --whitelisted_accounts "[ \"$ADMIN_ADDRESS\" ]" \ - --lp_token_decimals 7 - -echo "Old factory initialized." - + --admin "$IDENTITY_STRING" \ + --decimal 7 \ + --name "TestToken1" \ + --symbol "TKN1" + +echo "Deploying token contract 2 under admin..." +TOKEN_ADDR2=$(soroban contract deploy \ + --wasm-hash "$OLD_SOROBAN_TOKEN_WASM_HASH" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK") +echo "token2 deployed at: $TOKEN_ADDR2" -echo "Checking the admin of the old factory..." -FACTORY_ADMIN=$(soroban contract invoke \ - --id "$FACTORY_ADDR" \ +echo "Initializing token2 with admin=$ADMIN..." +soroban contract invoke \ + --id "$TOKEN_ADDR2" \ --source "$IDENTITY_STRING" \ --network "$NETWORK" \ -- \ - get_admin) - -echo "Factory admin is: $FACTORY_ADMIN (expected \"${ADMIN_ADDRESS}\")" -# Typically the returned value is in quotes, e.g. "\"GA...\"" -if [ "$FACTORY_ADMIN" != "\"${ADMIN_ADDRESS}\"" ]; then - echo "ERROR: Admin does not match expected address." - exit 1 + initialize \ + --admin "$IDENTITY_STRING" \ + --decimal 7 \ + --name "TestToken2" \ + --symbol "TKN2" + +# Sort the token addresses alphabetically +if [[ "$TOKEN_ADDR1" < "$TOKEN_ADDR2" ]]; then + TOKEN_ID1=$TOKEN_ADDR1 + TOKEN_ID2=$TOKEN_ADDR2 else - echo "Factory admin matches as expected." + TOKEN_ID1=$TOKEN_ADDR2 + TOKEN_ID2=$TOKEN_ADDR1 fi +echo "Sorted token1: $TOKEN_ID1 (admin: $ADMIN)" +echo "Sorted token2: $TOKEN_ID2 (admin: $ADMIN)" + +echo "Deploying old liquidity pool contract..." +OLD_LP_ID=$(soroban contract deploy \ + --wasm-hash "$OLD_PHOENIX_POOL_WASM_HASH" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK") +echo "Old liquidity pool contract at: $OLD_LP_ID" -echo "Updating old factory to new factory code..." +STAKE_WASM_HASH="$OLD_PHOENIX_STAKE_WASM_HASH" +TOKEN_WASM_HASH="$OLD_SOROBAN_TOKEN_WASM_HASH" + +echo "Initializing old liquidity pool..." soroban contract invoke \ - --id "$FACTORY_ADDR" \ + --id "$OLD_LP_ID" \ --source "$IDENTITY_STRING" \ --network "$NETWORK" \ -- \ - update \ - --new_wasm_hash "$LATEST_PHOENIX_FACTORY_WASM_HASH" \ - --new_stable_pool_hash "$LATEST_PHOENIX_POOL_STABLE_WASM_HASH" - -echo "Factory updated to the latest code." - - -echo "Checking the admin of the updated factory..." -UPDATED_FACTORY_ADMIN=$(soroban contract invoke \ - --id "$FACTORY_ADDR" \ + initialize \ + --stake_wasm_hash "$STAKE_WASM_HASH" \ + --token_wasm_hash "$TOKEN_WASM_HASH" \ + --lp_init_info "{ + \"admin\": \"${ADMIN_ADDRESS}\", + \"swap_fee_bps\": 1000, + \"fee_recipient\": \"${ADMIN_ADDRESS}\", + \"max_allowed_slippage_bps\": 5000, + \"default_slippage_bps\": 2500, + \"max_allowed_spread_bps\": 10000, + \"max_referral_bps\": 5000, + \"token_init_info\": { + \"token_a\": \"${TOKEN_ID1}\", + \"token_b\": \"${TOKEN_ID2}\" + }, + \"stake_init_info\": { + \"min_bond\": \"100\", + \"min_reward\": \"5\", + \"manager\": \"${ADMIN_ADDRESS}\", + \"max_complexity\": 7 + } + }" \ + --factory_addr "$ADMIN_ADDRESS" \ + --share_token_decimals 7 \ + --share_token_name "Pool" \ + --share_token_symbol "PHOBTC" \ + --default_slippage_bps 100 \ + --max_allowed_fee_bps 1000 + +echo "Old LP initialized." + +echo "Querying old LP config for fee_recipient..." +FEE_RECIPIENT=$(soroban contract invoke \ + --id "$OLD_LP_ID" \ --source "$IDENTITY_STRING" \ --network "$NETWORK" \ -- \ - get_admin) + query_config | jq -r '.fee_recipient') -echo "Updated factory admin is: $UPDATED_FACTORY_ADMIN (expected \"${ADMIN_ADDRESS}\")" -if [ "$UPDATED_FACTORY_ADMIN" != "\"${ADMIN_ADDRESS}\"" ]; then - echo "ERROR: Admin changed after update." - exit 1 -else - echo "Admin is still correct after factory update." -fi +echo "Fee recipient in old LP: $FEE_RECIPIENT (expected ${ADMIN_ADDRESS})" -echo "Updating wasm hashes on the updated factory..." +echo "Minting big amounts of token1 and token2 for user..." -LATEST_LP_WASM_HASH="$LATEST_PHOENIX_POOL_WASM_HASH" -LATEST_STAKE_WASM_HASH="$LATEST_PHOENIX_STAKE_WASM_HASH" -LATEST_TOKEN_WASM_HASH="$LATEST_SOROBAN_TOKEN_WASM_HASH" +soroban contract invoke \ + --id $TOKEN_ID1 \ + --source $IDENTITY_STRING \ + --network $NETWORK \ + -- \ + mint --to $USER --amount 10000000000 # 7 decimals, 1k tokens soroban contract invoke \ - --id "$FACTORY_ADDR" \ - --source "$IDENTITY_STRING" \ - --network "$NETWORK" \ + --id $TOKEN_ID2 \ + --source $IDENTITY_STRING \ + --network $NETWORK \ -- \ - update_wasm_hashes \ - --lp_wasm_hash "$LATEST_LP_WASM_HASH" \ - --stake_wasm_hash "$LATEST_STAKE_WASM_HASH" \ - --token_wasm_hash "$LATEST_TOKEN_WASM_HASH" + mint --to $USER --amount 10000000000 # 7 decimals, 1k tokens -echo "WASM hashes updated on the factory." +echo "User1 now has 1000 of each token." +echo "User providing liquidity to old LP..." -echo "'update_factory' test have been replicated via shell." +soroban contract invoke \ + --id "$OLD_LP_ID" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + provide_liquidity \ + --sender $USER \ + --min_a 5000000000 \ + --min_b 5000000000 \ + --desired_a 5000000000 \ + --desired_b 5000000000 \ + +echo "Liquidity provided in old LP." +soroban contract invoke \ + --id "$OLD_LP_ID" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + update \ + --new_wasm_hash "$LATEST_PHOENIX_POOL_WASM_HASH" -echo "Deploying old multihop contract..." +echo "Old LP updated to new code!" -OLD_MULTIHOP_ADDR=$(soroban contract deploy \ - --wasm-hash "$OLD_PHOENIX_MULTIHOP_WASM_HASH" \ +NEW_FEE_RECIPIENT=$(soroban contract invoke \ + --id "$OLD_LP_ID" \ --source "$IDENTITY_STRING" \ - --network "$NETWORK") + --network "$NETWORK" \ + -- \ + query_config | jq -r '.fee_recipient') -echo "Old multihop contract deployed at: $OLD_MULTIHOP_ADDR" +echo "Fee recipient in new LP: $NEW_FEE_RECIPIENT (expected ${ADMIN})" -echo "Initializing old multihop contract..." +echo "User1 withdrawing half of liquidity from new LP..." soroban contract invoke \ - --id "$OLD_MULTIHOP_ADDR" \ + --id "$OLD_LP_ID" \ --source "$IDENTITY_STRING" \ --network "$NETWORK" \ -- \ - initialize \ - --admin "$ADMIN_ADDRESS" \ - --factory "$FACTORY_ADDR" - -echo "Old multihop initialized with admin=$ADMIN_ADDRESS factory=$FACTORY_ADDR." + withdraw_liquidity \ + --sender "$USER" \ + --lp_amount 2500000000 \ + --min_a_out 2500000000 \ + --min_b_out 2500000000 \ -echo "Updating old multihop contract to latest multihop code..." +echo "Liquidity partially withdrawn." -soroban contract invoke \ - --id "$OLD_MULTIHOP_ADDR" \ +POOL_INFO=$(soroban contract invoke \ + --id "$OLD_LP_ID" \ --source "$IDENTITY_STRING" \ --network "$NETWORK" \ -- \ - update \ - --new_wasm_hash "$LATEST_PHOENIX_MULTIHOP_WASM_HASH" + query_pool_info_for_factory) + +echo "Pool info after upgrade: $POOL_INFO" +echo "Expected: asset_a.amount=2500000000, asset_b.amount=2500000000, etc." -echo "Multihop contract updated to the latest code." +ASSET_A_AMOUNT=$(echo "$POOL_INFO" | jq -r '.pool_response.asset_a.amount') +ASSET_B_AMOUNT=$(echo "$POOL_INFO" | jq -r '.pool_response.asset_b.amount') +ASSET_LP_SHARE_AMOUNT=$(echo "$POOL_INFO" | jq -r '.pool_response.asset_lp_share.amount') -echo "'updapte_multihop' test have been replicated." -echo "Old -> Updated multihop contract address: $OLD_MULTIHOP_ADDR" +echo "ASSET_A_AMOUNT: $ASSET_A_AMOUNT" +echo "ASSET_B_AMOUNT: $ASSET_B_AMOUNT" +echo "ASSET_LP_SHARE: $ASSET_LP_SHARE_AMOUNT" +echo "All steps from 'update_liquidity_pool' test have been replicated via shell." +echo "Liquidity Pool contract address: $OLD_LP_ID" From 5df7d6c597f5b0ddce7e48af27bebea00cb93df5 Mon Sep 17 00:00:00 2001 From: gangov <6922910+gangov@users.noreply.github.com> Date: Wed, 15 Jan 2025 19:00:19 +0200 Subject: [PATCH 08/11] working test for xyk pool --- scripts/update.sh | 284 +++++++++++++++++++++++----------------------- 1 file changed, 143 insertions(+), 141 deletions(-) diff --git a/scripts/update.sh b/scripts/update.sh index 8c3438cf4..6e9de597f 100755 --- a/scripts/update.sh +++ b/scripts/update.sh @@ -137,141 +137,141 @@ echo "Installed latest multihop wasm: $LATEST_PHOENIX_MULTIHOP_WASM_HASH" echo "All old and latest WASMs have been installed successfully." -# echo "Deploying old factory contract..." -# FACTORY_ADDR=$(soroban contract deploy \ -# --wasm-hash "$OLD_PHOENIX_FACTORY_WASM_HASH" \ -# --source "$IDENTITY_STRING" \ -# --network "$NETWORK") -# echo "Old factory deployed at: $FACTORY_ADDR" -# -# -# echo "Initializing old factory..." -# soroban contract invoke \ -# --id "$FACTORY_ADDR" \ -# --source "$IDENTITY_STRING" \ -# --network "$NETWORK" \ -# -- \ -# initialize \ -# --admin "$ADMIN_ADDRESS" \ -# --multihop_wasm_hash "$OLD_PHOENIX_MULTIHOP_WASM_HASH" \ -# --lp_wasm_hash "$OLD_PHOENIX_POOL_WASM_HASH" \ -# --stable_wasm_hash "$OLD_PHOENIX_POOL_STABLE_WASM_HASH" \ -# --stake_wasm_hash "$OLD_PHOENIX_STAKE_WASM_HASH" \ -# --token_wasm_hash "$OLD_SOROBAN_TOKEN_WASM_HASH" \ -# --whitelisted_accounts "[ \"$ADMIN_ADDRESS\" ]" \ -# --lp_token_decimals 7 -# -# echo "Old factory initialized." -# -# -# echo "Checking the admin of the old factory..." -# FACTORY_ADMIN=$(soroban contract invoke \ -# --id "$FACTORY_ADDR" \ -# --source "$IDENTITY_STRING" \ -# --network "$NETWORK" \ -# -- \ -# get_admin) -# -# echo "Factory admin is: $FACTORY_ADMIN (expected \"${ADMIN_ADDRESS}\")" -# # Typically the returned value is in quotes, e.g. "\"GA...\"" -# if [ "$FACTORY_ADMIN" != "\"${ADMIN_ADDRESS}\"" ]; then -# echo "ERROR: Admin does not match expected address." -# exit 1 -# else -# echo "Factory admin matches as expected." -# fi -# -# -# echo "Updating old factory to new factory code..." -# -# soroban contract invoke \ -# --id "$FACTORY_ADDR" \ -# --source "$IDENTITY_STRING" \ -# --network "$NETWORK" \ -# -- \ -# update \ -# --new_wasm_hash "$LATEST_PHOENIX_FACTORY_WASM_HASH" \ -# --new_stable_pool_hash "$LATEST_PHOENIX_POOL_STABLE_WASM_HASH" -# -# echo "Factory updated to the latest code." -# -# -# echo "Checking the admin of the updated factory..." -# UPDATED_FACTORY_ADMIN=$(soroban contract invoke \ -# --id "$FACTORY_ADDR" \ -# --source "$IDENTITY_STRING" \ -# --network "$NETWORK" \ -# -- \ -# get_admin) -# -# echo "Updated factory admin is: $UPDATED_FACTORY_ADMIN (expected \"${ADMIN_ADDRESS}\")" -# if [ "$UPDATED_FACTORY_ADMIN" != "\"${ADMIN_ADDRESS}\"" ]; then -# echo "ERROR: Admin changed after update." -# exit 1 -# else -# echo "Admin is still correct after factory update." -# fi -# -# -# echo "Updating wasm hashes on the updated factory..." -# -# LATEST_LP_WASM_HASH="$LATEST_PHOENIX_POOL_WASM_HASH" -# LATEST_STAKE_WASM_HASH="$LATEST_PHOENIX_STAKE_WASM_HASH" -# LATEST_TOKEN_WASM_HASH="$LATEST_SOROBAN_TOKEN_WASM_HASH" -# -# soroban contract invoke \ -# --id "$FACTORY_ADDR" \ -# --source "$IDENTITY_STRING" \ -# --network "$NETWORK" \ -# -- \ -# update_wasm_hashes \ -# --lp_wasm_hash "$LATEST_LP_WASM_HASH" \ -# --stake_wasm_hash "$LATEST_STAKE_WASM_HASH" \ -# --token_wasm_hash "$LATEST_TOKEN_WASM_HASH" -# -# echo "WASM hashes updated on the factory." -# -# -# echo "'update_factory' test have been replicated via shell." -# -# -# echo "Deploying old multihop contract..." -# -# OLD_MULTIHOP_ADDR=$(soroban contract deploy \ -# --wasm-hash "$OLD_PHOENIX_MULTIHOP_WASM_HASH" \ -# --source "$IDENTITY_STRING" \ -# --network "$NETWORK") -# -# echo "Old multihop contract deployed at: $OLD_MULTIHOP_ADDR" -# -# -# echo "Initializing old multihop contract..." -# -# soroban contract invoke \ -# --id "$OLD_MULTIHOP_ADDR" \ -# --source "$IDENTITY_STRING" \ -# --network "$NETWORK" \ -# -- \ -# initialize \ -# --admin "$ADMIN_ADDRESS" \ -# --factory "$FACTORY_ADDR" -# -# echo "Old multihop initialized with admin=$ADMIN_ADDRESS factory=$FACTORY_ADDR." -# -# echo "Updating old multihop contract to latest multihop code..." -# -# soroban contract invoke \ -# --id "$OLD_MULTIHOP_ADDR" \ -# --source "$IDENTITY_STRING" \ -# --network "$NETWORK" \ -# -- \ -# update \ -# --new_wasm_hash "$LATEST_PHOENIX_MULTIHOP_WASM_HASH" -# -# echo "Multihop contract updated to the latest code." -# -# echo "'updapte_multihop' test have been replicated." -# echo "Old -> Updated multihop contract address: $OLD_MULTIHOP_ADDR" +echo "Deploying old factory contract..." +FACTORY_ADDR=$(soroban contract deploy \ + --wasm-hash "$OLD_PHOENIX_FACTORY_WASM_HASH" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK") +echo "Old factory deployed at: $FACTORY_ADDR" + + +echo "Initializing old factory..." +soroban contract invoke \ + --id "$FACTORY_ADDR" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + initialize \ + --admin "$ADMIN_ADDRESS" \ + --multihop_wasm_hash "$OLD_PHOENIX_MULTIHOP_WASM_HASH" \ + --lp_wasm_hash "$OLD_PHOENIX_POOL_WASM_HASH" \ + --stable_wasm_hash "$OLD_PHOENIX_POOL_STABLE_WASM_HASH" \ + --stake_wasm_hash "$OLD_PHOENIX_STAKE_WASM_HASH" \ + --token_wasm_hash "$OLD_SOROBAN_TOKEN_WASM_HASH" \ + --whitelisted_accounts "[ \"$ADMIN_ADDRESS\" ]" \ + --lp_token_decimals 7 + +echo "Old factory initialized." + + +echo "Checking the admin of the old factory..." +FACTORY_ADMIN=$(soroban contract invoke \ + --id "$FACTORY_ADDR" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + get_admin) + +echo "Factory admin is: $FACTORY_ADMIN (expected \"${ADMIN_ADDRESS}\")" +# Typically the returned value is in quotes, e.g. "\"GA...\"" +if [ "$FACTORY_ADMIN" != "\"${ADMIN_ADDRESS}\"" ]; then + echo "ERROR: Admin does not match expected address." + exit 1 +else + echo "Factory admin matches as expected." +fi + + +echo "Updating old factory to new factory code..." + +soroban contract invoke \ + --id "$FACTORY_ADDR" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + update \ + --new_wasm_hash "$LATEST_PHOENIX_FACTORY_WASM_HASH" \ + --new_stable_pool_hash "$LATEST_PHOENIX_POOL_STABLE_WASM_HASH" + +echo "Factory updated to the latest code." + + +echo "Checking the admin of the updated factory..." +UPDATED_FACTORY_ADMIN=$(soroban contract invoke \ + --id "$FACTORY_ADDR" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + get_admin) + +echo "Updated factory admin is: $UPDATED_FACTORY_ADMIN (expected \"${ADMIN_ADDRESS}\")" +if [ "$UPDATED_FACTORY_ADMIN" != "\"${ADMIN_ADDRESS}\"" ]; then + echo "ERROR: Admin changed after update." + exit 1 +else + echo "Admin is still correct after factory update." +fi + + +echo "Updating wasm hashes on the updated factory..." + +LATEST_LP_WASM_HASH="$LATEST_PHOENIX_POOL_WASM_HASH" +LATEST_STAKE_WASM_HASH="$LATEST_PHOENIX_STAKE_WASM_HASH" +LATEST_TOKEN_WASM_HASH="$LATEST_SOROBAN_TOKEN_WASM_HASH" + +soroban contract invoke \ + --id "$FACTORY_ADDR" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + update_wasm_hashes \ + --lp_wasm_hash "$LATEST_LP_WASM_HASH" \ + --stake_wasm_hash "$LATEST_STAKE_WASM_HASH" \ + --token_wasm_hash "$LATEST_TOKEN_WASM_HASH" + +echo "WASM hashes updated on the factory." + + +echo "'update_factory' test have been replicated via shell." + + +echo "Deploying old multihop contract..." + +OLD_MULTIHOP_ADDR=$(soroban contract deploy \ + --wasm-hash "$OLD_PHOENIX_MULTIHOP_WASM_HASH" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK") + +echo "Old multihop contract deployed at: $OLD_MULTIHOP_ADDR" + + +echo "Initializing old multihop contract..." + +soroban contract invoke \ + --id "$OLD_MULTIHOP_ADDR" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + initialize \ + --admin "$ADMIN_ADDRESS" \ + --factory "$FACTORY_ADDR" + +echo "Old multihop initialized with admin=$ADMIN_ADDRESS factory=$FACTORY_ADDR." + +echo "Updating old multihop contract to latest multihop code..." + +soroban contract invoke \ + --id "$OLD_MULTIHOP_ADDR" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + update \ + --new_wasm_hash "$LATEST_PHOENIX_MULTIHOP_WASM_HASH" + +echo "Multihop contract updated to the latest code." + +echo "'updapte_multihop' test have been replicated." +echo "Old -> Updated multihop contract address: $OLD_MULTIHOP_ADDR" soroban keys generate luke --network testnet --fund soroban keys generate obiwan --network testnet --fund @@ -409,6 +409,8 @@ soroban contract invoke \ echo "User1 now has 1000 of each token." echo "User providing liquidity to old LP..." +echo "USER: " $USER +echo "OLD_LP_ID: " $OLD_LP_ID soroban contract invoke \ --id "$OLD_LP_ID" \ @@ -416,7 +418,7 @@ soroban contract invoke \ --network "$NETWORK" \ -- \ provide_liquidity \ - --sender $USER \ + --sender $(soroban keys secret jarjar) \ --min_a 5000000000 \ --min_b 5000000000 \ --desired_a 5000000000 \ @@ -452,10 +454,10 @@ soroban contract invoke \ --network "$NETWORK" \ -- \ withdraw_liquidity \ - --sender "$USER" \ - --lp_amount 2500000000 \ - --min_a_out 2500000000 \ - --min_b_out 2500000000 \ + --sender $(soroban keys secret jarjar) \ + --share_amount 2500000000 \ + --min_a 2500000000 \ + --min_b 2500000000 \ echo "Liquidity partially withdrawn." @@ -477,5 +479,5 @@ echo "ASSET_A_AMOUNT: $ASSET_A_AMOUNT" echo "ASSET_B_AMOUNT: $ASSET_B_AMOUNT" echo "ASSET_LP_SHARE: $ASSET_LP_SHARE_AMOUNT" -echo "All steps from 'update_liquidity_pool' test have been replicated via shell." +echo "'update_liquidity_pool' test have been replicated via shell." echo "Liquidity Pool contract address: $OLD_LP_ID" From 898f0f859d5749611f7adb68e19f43b135a68db0 Mon Sep 17 00:00:00 2001 From: gangov <6922910+gangov@users.noreply.github.com> Date: Wed, 15 Jan 2025 19:33:40 +0200 Subject: [PATCH 09/11] stake test --- scripts/update.sh | 157 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 154 insertions(+), 3 deletions(-) diff --git a/scripts/update.sh b/scripts/update.sh index 6e9de597f..4ff410519 100755 --- a/scripts/update.sh +++ b/scripts/update.sh @@ -273,9 +273,9 @@ echo "Multihop contract updated to the latest code." echo "'updapte_multihop' test have been replicated." echo "Old -> Updated multihop contract address: $OLD_MULTIHOP_ADDR" -soroban keys generate luke --network testnet --fund -soroban keys generate obiwan --network testnet --fund -soroban keys generate jarjar --network testnet --fund +soroban keys generate luke --network $NETWORK --fund +soroban keys generate obiwan --network $NETWORK --fund +soroban keys generate jarjar --network $NETWORK --fund ADMIN=$(soroban keys address luke) USER=$(soroban keys address jarjar) @@ -481,3 +481,154 @@ echo "ASSET_LP_SHARE: $ASSET_LP_SHARE_AMOUNT" echo "'update_liquidity_pool' test have been replicated via shell." echo "Liquidity Pool contract address: $OLD_LP_ID" + +soroban keys generate stake_admin --network "$NETWORK" --fund +soroban keys generate stake_user --network "$NETWORK" --fund + +STAKE_ADMIN=$(soroban keys address stake_admin) +STAKE_USER=$(soroban keys address stake_user) + +STAKE_ADMIN_SECRET=$(soroban keys secret stake_admin) +STAKE_USER_SECRET=$(soroban keys secret stake_user) + +echo "Stake admin: $STAKE_ADMIN" +echo "Stake user: $STAKE_USER" +echo "Stake admin: $STAKE_ADMIN_SECRET" +echo "Stake user: $STAKE_USER_SECRET" + +STAKE_TOKEN_ADDR=$(soroban contract deploy \ + --wasm-hash "$OLD_SOROBAN_TOKEN_WASM_HASH" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK") + +echo "Token for stake deployed at: $STAKE_TOKEN_ADDR" + +echo "Initializing stake token with admin=$STAKE_ADMIN..." +soroban contract invoke \ + --id "$STAKE_TOKEN_ADDR" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + initialize \ + --admin "$STAKE_ADMIN" \ + --decimal 7 \ + --name "StakeToken" \ + --symbol "STK" + +soroban contract invoke \ + --id "$STAKE_TOKEN_ADDR" \ + --source "$STAKE_ADMIN_SECRET" \ + --network "$NETWORK" \ + -- \ + mint \ + --to "$STAKE_USER" \ + --amount 1000 + +OLD_STAKE_ADDR=$(soroban contract deploy \ + --wasm-hash "$OLD_PHOENIX_STAKE_WASM_HASH" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK") +echo "Old stake contract deployed at: $OLD_STAKE_ADDR" + +soroban keys generate stake_manager --network "$NETWORK" --fund +soroban keys generate stake_owner --network "$NETWORK" --fund + +MANAGER_ADDR=$(soroban keys address stake_manager) +OWNER_ADDR=$(soroban keys address stake_owner) + +MANAGER_SECRET=$(soroban keys secret stake_manager) +OWNER_SECRET=$(soroban keys secret stake_owner) + +echo "Manager: $MANAGER_ADDR" +echo "Owner: $OWNER_ADDR" + +soroban contract invoke \ + --id "$OLD_STAKE_ADDR" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + initialize \ + --admin "$STAKE_ADMIN" \ + --lp_token "$STAKE_TOKEN_ADDR" \ + --min_bond "10" \ + --min_reward "10" \ + --manager "$MANAGER_ADDR" \ + --owner "$OWNER_ADDR" \ + --max_complexity "10" + +echo "Old stake initialized." + +echo "Bonding 1000 tokens from $STAKE_USER..." +soroban contract invoke \ + --id "$OLD_STAKE_ADDR" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + bond \ + --sender "$STAKE_USER_SECRET" \ + --tokens 1000 + +echo "Bonded 1000 tokens." + +echo "Checking staked info for user after bonding..." + +STAKED_INFO=$(soroban contract invoke \ + --id "$OLD_STAKE_ADDR" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + query_staked \ + --address "$STAKE_USER") + +echo "Staked info: $STAKED_INFO" + +STAKE_AMOUNT=$(echo "$STAKED_INFO" | jq -r '.stakes[0].stake') +STAKE_TIMESTAMP=$(echo "$STAKED_INFO" | jq -r '.stakes[0].stake_timestamp') +LAST_REWARD_TIME=$(echo "$STAKED_INFO" | jq -r '.last_reward_time') +TOTAL_STAKE=$(echo "$STAKED_INFO" | jq -r '.total_stake') + +if [ "$STAKE_AMOUNT" -eq 1000 ] \ + && [ "$LAST_REWARD_TIME" -eq 0 ] \ + && [ "$TOTAL_STAKE" -eq 1000 ]; then + echo "Staked info matches expected values!" +else + echo "ERROR: Staked info mismatch." + echo " stake=$STAKE_AMOUNT (expected 1000)" + echo " last_reward_time=$LAST_REWARD_TIME (expected 0)" + echo " total_stake=$TOTAL_STAKE (expected 1000)" + exit 1 +fi + +echo "Updating old stake contract to latest stake code..." +soroban contract invoke \ + --id "$OLD_STAKE_ADDR" \ + --source "$STAKE_ADMIN_SECRET" \ + --network "$NETWORK" \ + -- \ + update \ + --new_wasm_hash "$LATEST_PHOENIX_STAKE_WASM_HASH" + +echo "Stake contract updated." + +UPDATED_STAKE_ADMIN=$(soroban contract invoke \ + --id "$OLD_STAKE_ADDR" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + query_admin) + +echo "Updated stake admin is: $UPDATED_STAKE_ADMIN (expected \"$STAKE_ADMIN\")" + +echo "Unbonding 1000 tokens from user..." +soroban contract invoke \ + --id "$OLD_STAKE_ADDR" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + unbond \ + --sender "$STAKE_USER_SECRET" \ + --stake_amount 1000 \ + --stake_timestamp $STAKE_TIMESTAMP + +echo "'upgrade_stake_contract' test replicated!" +echo "Stake contract address: $OLD_STAKE_ADDR" From 371664cdd78981db348d87d58feb13352aac84c3 Mon Sep 17 00:00:00 2001 From: gangov <6922910+gangov@users.noreply.github.com> Date: Wed, 15 Jan 2025 19:47:21 +0200 Subject: [PATCH 10/11] all migration tests replicated with bash in testnet --- scripts/update.sh | 94 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/scripts/update.sh b/scripts/update.sh index 4ff410519..edc277891 100755 --- a/scripts/update.sh +++ b/scripts/update.sh @@ -632,3 +632,97 @@ soroban contract invoke \ echo "'upgrade_stake_contract' test replicated!" echo "Stake contract address: $OLD_STAKE_ADDR" + +echo "Running updapte_stake_rewards test" + +soroban keys generate stake_rewards_admin --network "$NETWORK" --fund +soroban keys generate stake_rewards_staking --network "$NETWORK" --fund +soroban keys generate stake_rewards_token --network "$NETWORK" --fund + +STAKE_REWARDS_ADMIN=$(soroban keys address stake_rewards_admin) +STAKE_REWARDS_STAKING=$(soroban keys address stake_rewards_staking) +STAKE_REWARDS_TOKEN=$(soroban keys address stake_rewards_token) + +echo "Stake Rewards Admin: $STAKE_REWARDS_ADMIN" +echo "Staking Contract (mock): $STAKE_REWARDS_STAKING" +echo "Reward Token (mock): $STAKE_REWARDS_TOKEN" + +OLD_STAKE_REWARDS_ADDR=$(soroban contract deploy \ + --wasm-hash "$OLD_PHOENIX_STAKE_REWARDS_WASM_HASH" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK") + +echo "Old stake rewards contract deployed at: $OLD_STAKE_REWARDS_ADDR" + +MAX_COMPLEXITY="10" +MIN_REWARD="5" +MIN_BOND="5" + +echo "Initializing old stake rewards contract..." +soroban contract invoke \ + --id "$OLD_STAKE_REWARDS_ADDR" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + initialize \ + --admin "$STAKE_REWARDS_ADMIN" \ + --staking_contract "$STAKE_REWARDS_STAKING" \ + --reward_token "$STAKE_REWARDS_TOKEN" \ + --max_complexity "$MAX_COMPLEXITY" \ + --min_reward "$MIN_REWARD" \ + --min_bond "$MIN_BOND" + +echo "Old stake rewards contract initialized." + +echo "Checking old stake rewards admin..." +OLD_STAKE_REWARDS_ADMIN=$(soroban contract invoke \ + --id "$OLD_STAKE_REWARDS_ADDR" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + query_admin) +echo "Admin in old stake rewards: $OLD_STAKE_REWARDS_ADMIN (expected \"$STAKE_REWARDS_ADMIN\")" + +echo "Querying old stake rewards config..." +OLD_SR_CONFIG=$(soroban contract invoke \ + --id "$OLD_STAKE_REWARDS_ADDR" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + query_config) + +echo "Old stake rewards config: $OLD_SR_CONFIG" +echo "Updating old stake rewards contract to latest code..." +soroban contract invoke \ + --id "$OLD_STAKE_REWARDS_ADDR" \ + --source "$(soroban keys secret stake_rewards_admin)" \ + --network "$NETWORK" \ + -- \ + update \ + --new_wasm_hash "$LATEST_PHOENIX_STAKE_REWARDS_WASM_HASH" + +echo "Stake rewards contract updated." + +echo "Checking updated stake rewards admin..." +UPDATED_STAKE_REWARDS_ADMIN=$(soroban contract invoke \ + --id "$OLD_STAKE_REWARDS_ADDR" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + query_admin) +echo "Updated stake rewards admin is: $UPDATED_STAKE_REWARDS_ADMIN (expected \"$STAKE_REWARDS_ADMIN\")" + +echo "Querying updated stake rewards config..." +UPDATED_SR_CONFIG=$(soroban contract invoke \ + --id "$OLD_STAKE_REWARDS_ADDR" \ + --source "$IDENTITY_STRING" \ + --network "$NETWORK" \ + -- \ + query_config) + +echo "Updated stake rewards config: $UPDATED_SR_CONFIG" + +echo "'updapte_stake_rewards' test replicated successfully!" +echo "Old -> Updated stake rewards contract address: $OLD_STAKE_REWARDS_ADDR" + +echo "Updates were successful" From 892a4c9b21778a7e8167ac9ba0b4d4ac95750923 Mon Sep 17 00:00:00 2001 From: gangov <6922910+gangov@users.noreply.github.com> Date: Wed, 15 Jan 2025 19:47:51 +0200 Subject: [PATCH 11/11] minor cleanup --- scripts/update.sh | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/scripts/update.sh b/scripts/update.sh index edc277891..3021732c3 100755 --- a/scripts/update.sh +++ b/scripts/update.sh @@ -725,4 +725,13 @@ echo "Updated stake rewards config: $UPDATED_SR_CONFIG" echo "'updapte_stake_rewards' test replicated successfully!" echo "Old -> Updated stake rewards contract address: $OLD_STAKE_REWARDS_ADDR" +# Check if the folder exists +if [ -d "$FOLDER" ]; then + echo "Folder '$FOLDER' exists. Deleting it..." + rm -rf "$FOLDER" + echo "Folder '$FOLDER' has been deleted." +else + echo "Folder '$FOLDER' does not exist." +fi + echo "Updates were successful"