From ea9762001c5ed5457f25353f1092987fbbcf8b9a Mon Sep 17 00:00:00 2001 From: Matias Poblete <86752543+MattPoblete@users.noreply.github.com> Date: Mon, 2 Dec 2024 16:55:58 -0300 Subject: [PATCH 1/3] =?UTF-8?q?=E2=9C=A8=20Add=20invest=20&=20withdraw=20c?= =?UTF-8?q?ases=20to=20insufficient=20balance=20rebalance=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/contracts/vault/src/test/rebalance.rs | 57 +++++++++++++++++----- 1 file changed, 45 insertions(+), 12 deletions(-) diff --git a/apps/contracts/vault/src/test/rebalance.rs b/apps/contracts/vault/src/test/rebalance.rs index 19bb9cf4..ecea4880 100644 --- a/apps/contracts/vault/src/test/rebalance.rs +++ b/apps/contracts/vault/src/test/rebalance.rs @@ -1,17 +1,9 @@ use soroban_sdk::{vec as sorobanvec, InvokeError, String, Vec}; use crate::test::{ - create_strategy_params_token0, - defindex_vault::{ - ActionType, - AssetStrategySet, - Instruction, - AssetInvestmentAllocation, - StrategyInvestment, - OptionalSwapDetailsExactIn, - OptionalSwapDetailsExactOut, - }, - DeFindexVaultTest, + create_strategy_params_token0, defindex_vault::{ + ActionType, AssetInvestmentAllocation, AssetStrategySet, Instruction, OptionalSwapDetailsExactIn, OptionalSwapDetailsExactOut, StrategyInvestment + }, invest, DeFindexVaultTest }; use crate::test::defindex_vault::ContractError; @@ -333,7 +325,7 @@ fn rebalance_insufficient_balance(){ &test.manager, &test.emergency_manager, &test.vault_fee_receiver, - &100u32, + &10u32, &test.defindex_protocol_receiver, &test.defindex_factory, &String::from_str(&test.env, "testVault"), @@ -342,9 +334,45 @@ fn rebalance_insufficient_balance(){ let amount: i128 = 987654321; let users = DeFindexVaultTest::generate_random_users(&test.env, 1); test.token0_admin_client.mint(&users[0], &amount); + + //Balance should be 0 let vault_balance = test.defindex_contract.balance(&users[0]); assert_eq!(vault_balance, 0i128); + //Withdraw with no funds + let withdraw_no_funds_instructions = sorobanvec![ + &test.env, + Instruction { + action: ActionType::Withdraw, + strategy: Some(test.strategy_client_token0.address.clone()), + amount: Some(amount + 1), + swap_details_exact_in: OptionalSwapDetailsExactIn::None, + swap_details_exact_out: OptionalSwapDetailsExactOut::None, + }, + ]; + + let withdraw_no_funds = test.defindex_contract.try_rebalance(&withdraw_no_funds_instructions); + assert_eq!(withdraw_no_funds, Err(Ok(ContractError::StrategyWithdrawError))); //Contract should respond 'Insuficient balance'? + + //Invest with no funds + let invest_no_funds_instructions = sorobanvec![ + &test.env, + Instruction { + action: ActionType::Invest, + strategy: Some(test.strategy_client_token0.address.clone()), + amount: Some(1), + swap_details_exact_in: OptionalSwapDetailsExactIn::None, + swap_details_exact_out: OptionalSwapDetailsExactOut::None, + }, + ]; + let invest_no_funds = test.defindex_contract.try_rebalance(&invest_no_funds_instructions); + + //Contract should fail with error #10 no balance or panic the test + if invest_no_funds != Err(Err(InvokeError::Contract(10))) { + panic!("Expected error not returned"); + } + + //Deposit 987654321 stroops test.defindex_contract.deposit( &sorobanvec![&test.env, amount], &sorobanvec![&test.env, amount], @@ -354,6 +382,7 @@ fn rebalance_insufficient_balance(){ let df_balance: i128 = test.defindex_contract.balance(&users[0]); assert_eq!(df_balance, amount - 1000); + //Withdraw more than available let withdraw_instructions = sorobanvec![ &test.env, Instruction { @@ -377,6 +406,8 @@ fn rebalance_insufficient_balance(){ swap_details_exact_out: OptionalSwapDetailsExactOut::None, }, ); + + //Contract should fail with error #10 no balance let rebalance = test.defindex_contract.try_rebalance(&invest_instructions); if rebalance == Err(Err(InvokeError::Contract(10))) { return; @@ -385,3 +416,5 @@ fn rebalance_insufficient_balance(){ } } + + From 80d71792e6d5ece7f8e752cb6c68e97f4393a975 Mon Sep 17 00:00:00 2001 From: Matias Poblete <86752543+MattPoblete@users.noreply.github.com> Date: Tue, 3 Dec 2024 11:43:48 -0300 Subject: [PATCH 2/3] =?UTF-8?q?=F0=9F=9A=9A=20Moved=20rebalance=20test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/contracts/vault/src/test/deposit.rs | 1031 ----------------- apps/contracts/vault/src/test/rebalance.rs | 420 ------- .../vault/src/test/vault/rebalance.rs | 57 +- 3 files changed, 45 insertions(+), 1463 deletions(-) delete mode 100644 apps/contracts/vault/src/test/deposit.rs delete mode 100644 apps/contracts/vault/src/test/rebalance.rs diff --git a/apps/contracts/vault/src/test/deposit.rs b/apps/contracts/vault/src/test/deposit.rs deleted file mode 100644 index 1b3e1648..00000000 --- a/apps/contracts/vault/src/test/deposit.rs +++ /dev/null @@ -1,1031 +0,0 @@ -use soroban_sdk::{vec as sorobanvec, InvokeError, Map, String, Vec}; - -use crate::test::defindex_vault::{AssetStrategySet, ContractError}; -use crate::test::{ - create_strategy_params_token0, create_strategy_params_token1, DeFindexVaultTest, -}; - -// Test deposit not yet initialized -#[test] -fn test_deposit_not_yet_initialized() { - let test = DeFindexVaultTest::setup(); - let users = DeFindexVaultTest::generate_random_users(&test.env, 1); - - let result = test.defindex_contract.try_deposit( - &sorobanvec![&test.env, 100i128], - &sorobanvec![&test.env, 100i128], - &users[0], - &false, - ); - - assert_eq!(result, Err(Ok(ContractError::NotInitialized))); -} - - -#[test] -fn deposit_amounts_desired_less_length() { - let test = DeFindexVaultTest::setup(); - test.env.mock_all_auths(); - let strategy_params_token0 = create_strategy_params_token0(&test); - let strategy_params_token1 = create_strategy_params_token1(&test); - - // initialize with 2 assets - let assets: Vec = sorobanvec![ - &test.env, - AssetStrategySet { - address: test.token0.address.clone(), - strategies: strategy_params_token0.clone() - }, - AssetStrategySet { - address: test.token1.address.clone(), - strategies: strategy_params_token1.clone() - } - ]; - - test.defindex_contract.initialize( - &assets, - &test.manager, - &test.emergency_manager, - &test.vault_fee_receiver, - &2000u32, - &test.defindex_protocol_receiver, - &test.defindex_factory, - &String::from_str(&test.env, "dfToken"), - &String::from_str(&test.env, "DFT"), - ); - let amount = 1000i128; - - let users = DeFindexVaultTest::generate_random_users(&test.env, 1); - - let response = test.defindex_contract.try_deposit( - &sorobanvec![&test.env, amount], // wrong amount desired - &sorobanvec![&test.env, amount, amount], - &users[0], - &false, - ); - - assert_eq!(response, Err(Ok(ContractError::WrongAmountsLength))); -} - -// test deposit amount desired more length -#[test] -fn deposit_amounts_desired_more_length() { - let test = DeFindexVaultTest::setup(); - test.env.mock_all_auths(); - let strategy_params_token0 = create_strategy_params_token0(&test); - // let strategy_params_token1 = create_strategy_params_token1(&test); - - // initialize with 2 assets - let assets: Vec = sorobanvec![ - &test.env, - AssetStrategySet { - address: test.token0.address.clone(), - strategies: strategy_params_token0.clone() - } - ]; - - test.defindex_contract.initialize( - &assets, - &test.manager, - &test.emergency_manager, - &test.vault_fee_receiver, - &2000u32, - &test.defindex_protocol_receiver, - &test.defindex_factory, - &String::from_str(&test.env, "dfToken"), - &String::from_str(&test.env, "DFT"), - ); - let amount = 1000i128; - - let users = DeFindexVaultTest::generate_random_users(&test.env, 1); - - let response = test.defindex_contract.try_deposit( - &sorobanvec![&test.env, amount, amount], // wrong amount desired - &sorobanvec![&test.env, amount], - &users[0], - &false, - ); - - assert_eq!(response, Err(Ok(ContractError::WrongAmountsLength))); -} - -// test deposit amount min less length -#[test] -fn deposit_amounts_min_less_length() { - let test = DeFindexVaultTest::setup(); - test.env.mock_all_auths(); - let strategy_params_token0 = create_strategy_params_token0(&test); - let strategy_params_token1 = create_strategy_params_token1(&test); - - // initialize with 2 assets - let assets: Vec = sorobanvec![ - &test.env, - AssetStrategySet { - address: test.token0.address.clone(), - strategies: strategy_params_token0.clone() - }, - AssetStrategySet { - address: test.token1.address.clone(), - strategies: strategy_params_token1.clone() - } - ]; - - test.defindex_contract.initialize( - &assets, - &test.manager, - &test.emergency_manager, - &test.vault_fee_receiver, - &2000u32, - &test.defindex_protocol_receiver, - &test.defindex_factory, - &String::from_str(&test.env, "dfToken"), - &String::from_str(&test.env, "DFT"), - ); - let amount = 1000i128; - - let users = DeFindexVaultTest::generate_random_users(&test.env, 1); - - let response = test.defindex_contract.try_deposit( - &sorobanvec![&test.env, amount, amount], - &sorobanvec![&test.env, amount], // wrong amount min - &users[0], - &false, - ); - - assert_eq!(response, Err(Ok(ContractError::WrongAmountsLength))); -} - - -// test deposit amount min more length -#[test] -fn deposit_amounts_min_more_length() { - let test = DeFindexVaultTest::setup(); - test.env.mock_all_auths(); - let strategy_params_token0 = create_strategy_params_token0(&test); - let strategy_params_token1 = create_strategy_params_token1(&test); - - // initialize with 2 assets - let assets: Vec = sorobanvec![ - &test.env, - AssetStrategySet { - address: test.token0.address.clone(), - strategies: strategy_params_token0.clone() - }, - AssetStrategySet { - address: test.token1.address.clone(), - strategies: strategy_params_token1.clone() - } - ]; - - test.defindex_contract.initialize( - &assets, - &test.manager, - &test.emergency_manager, - &test.vault_fee_receiver, - &2000u32, - &test.defindex_protocol_receiver, - &test.defindex_factory, - &String::from_str(&test.env, "dfToken"), - &String::from_str(&test.env, "DFT"), - ); - let amount = 1000i128; - - let users = DeFindexVaultTest::generate_random_users(&test.env, 1); - - let response = test.defindex_contract.try_deposit( - &sorobanvec![&test.env, amount, amount], - &sorobanvec![&test.env, amount, amount, amount], // wrong amount min - &users[0], - &false, - ); - - assert_eq!(response, Err(Ok(ContractError::WrongAmountsLength))); -} - -// test amount desired negative -#[test] -fn deposit_amounts_desired_negative() { - let test = DeFindexVaultTest::setup(); - test.env.mock_all_auths(); - let strategy_params_token0 = create_strategy_params_token0(&test); - let strategy_params_token1 = create_strategy_params_token1(&test); - - // initialize with 2 assets - let assets: Vec = sorobanvec![ - &test.env, - AssetStrategySet { - address: test.token0.address.clone(), - strategies: strategy_params_token0.clone() - }, - AssetStrategySet { - address: test.token1.address.clone(), - strategies: strategy_params_token1.clone() - } - ]; - - test.defindex_contract.initialize( - &assets, - &test.manager, - &test.emergency_manager, - &test.vault_fee_receiver, - &2000u32, - &test.defindex_protocol_receiver, - &test.defindex_factory, - &String::from_str(&test.env, "dfToken"), - &String::from_str(&test.env, "DFT"), - ); - let amount = 1000i128; - - let users = DeFindexVaultTest::generate_random_users(&test.env, 1); - - let response = test.defindex_contract.try_deposit( - &sorobanvec![&test.env, -amount, amount], - &sorobanvec![&test.env, amount, amount], - &users[0], - &false, - ); - - assert_eq!(response, Err(Ok(ContractError::NegativeNotAllowed))); -} - -// test deposit one asset success -#[test] -fn deposit_one_asset_success() { - let test = DeFindexVaultTest::setup(); - test.env.mock_all_auths(); - let strategy_params_token0 = create_strategy_params_token0(&test); - - // initialize with 1 assets - let assets: Vec = sorobanvec![ - &test.env, - AssetStrategySet { - address: test.token0.address.clone(), - strategies: strategy_params_token0.clone() - } - ]; - - test.defindex_contract.initialize( - &assets, - &test.manager, - &test.emergency_manager, - &test.vault_fee_receiver, - &2000u32, - &test.defindex_protocol_receiver, - &test.defindex_factory, - &String::from_str(&test.env, "dfToken"), - &String::from_str(&test.env, "DFT"), - ); - let amount = 123456789i128; - - let users = DeFindexVaultTest::generate_random_users(&test.env, 1); - - // Balances before deposit - test.token0_admin_client.mint(&users[0], &amount); - let user_balance = test.token0.balance(&users[0]); - assert_eq!(user_balance, amount); - - let df_balance = test.defindex_contract.balance(&users[0]); - assert_eq!(df_balance, 0i128); - - // deposit - test.defindex_contract.deposit( - &sorobanvec![&test.env, amount], - &sorobanvec![&test.env, amount], - &users[0], - &false, - ); - - // check balances after deposit - let df_balance = test.defindex_contract.balance(&users[0]); - assert_eq!(df_balance, amount - 1000); - - let user_balance = test.token0.balance(&users[0]); - assert_eq!(user_balance, 0i128); - - //map shuould be map - let mut expected_map = Map::new(&test.env); - expected_map.set(test.token0.address.clone(), amount); - - // check that all the assets are in the vault - let vault_balance = test.token0.balance(&test.defindex_contract.address); - assert_eq!(vault_balance, amount); - - // check that fetch_total_managed_funds returns correct amount - let total_managed_funds = test.defindex_contract.fetch_total_managed_funds(); - assert_eq!(total_managed_funds, expected_map); - - // check current idle funds, - let current_idle_funds = test.defindex_contract.fetch_current_idle_funds(); - assert_eq!(current_idle_funds, expected_map); - - //map shuould be map - let mut expected_map = Map::new(&test.env); - expected_map.set(test.token0.address.clone(), 0i128); - - // check that current invested funds is now 0, funds still in idle funds - let current_invested_funds = test.defindex_contract.fetch_current_invested_funds(); - assert_eq!(current_invested_funds, expected_map); - - // Now user deposits for the second time - let amount2 = 987654321i128; - test.token0_admin_client.mint(&users[0], &amount2); - let user_balance = test.token0.balance(&users[0]); - assert_eq!(user_balance, amount2); - - // deposit - test.defindex_contract.deposit( - &sorobanvec![&test.env, amount2], - &sorobanvec![&test.env, amount2], - &users[0], - &false, - ); - - //map shuould be map - let mut expected_map = Map::new(&test.env); - expected_map.set(test.token0.address.clone(), amount + amount2); - - // check balances after deposit - let df_balance = test.defindex_contract.balance(&users[0]); - assert_eq!(df_balance, amount + amount2 - 1000); - - let user_balance = test.token0.balance(&users[0]); - assert_eq!(user_balance, 0i128); - - // check that all the assets are in the vault - let vault_balance = test.token0.balance(&test.defindex_contract.address); - assert_eq!(vault_balance, amount + amount2); - - // check that fetch_total_managed_funds returns correct amount - let total_managed_funds = test.defindex_contract.fetch_total_managed_funds(); - assert_eq!(total_managed_funds, expected_map); - - // check current idle funds - let current_idle_funds = test.defindex_contract.fetch_current_idle_funds(); - assert_eq!(current_idle_funds, expected_map); - - - //map shuould be map - let mut expected_map = Map::new(&test.env); - expected_map.set(test.token0.address.clone(), 0i128); - - // check that current invested funds is now 0, funds still in idle funds - let current_invested_funds = test.defindex_contract.fetch_current_invested_funds(); - assert_eq!(current_invested_funds, expected_map); - - - -} - -// test deposit one asset with minimum more than desired -#[test] -fn deposit_one_asset_min_more_than_desired() { - let test = DeFindexVaultTest::setup(); - test.env.mock_all_auths(); - let strategy_params_token0 = create_strategy_params_token0(&test); - - // initialize with 1 assets - let assets: Vec = sorobanvec![ - &test.env, - AssetStrategySet { - address: test.token0.address.clone(), - strategies: strategy_params_token0.clone() - } - ]; - - test.defindex_contract.initialize( - &assets, - &test.manager, - &test.emergency_manager, - &test.vault_fee_receiver, - &2000u32, - &test.defindex_protocol_receiver, - &test.defindex_factory, - &String::from_str(&test.env, "dfToken"), - &String::from_str(&test.env, "DFT"), - ); - let amount = 123456789i128; - - let users = DeFindexVaultTest::generate_random_users(&test.env, 1); - - // Balances before deposit - test.token0_admin_client.mint(&users[0], &amount); - let user_balance = test.token0.balance(&users[0]); - assert_eq!(user_balance, amount); - - let df_balance = test.defindex_contract.balance(&users[0]); - assert_eq!(df_balance, 0i128); - - // deposit - let result=test.defindex_contract.try_deposit( - &sorobanvec![&test.env, amount], - &sorobanvec![&test.env, amount + 1], - &users[0], - &false, - ); - // this should fail - assert_eq!(result, Err(Ok(ContractError::InsufficientAmount))); - -} - -// test deposit of several asset, considering different proportion of assets -#[test] -fn deposit_several_assets_success() { - let test = DeFindexVaultTest::setup(); - test.env.mock_all_auths(); - let strategy_params_token0 = create_strategy_params_token0(&test); - let strategy_params_token1 = create_strategy_params_token1(&test); - - // initialize with 2 assets - let assets: Vec = sorobanvec![ - &test.env, - AssetStrategySet { - address: test.token0.address.clone(), - strategies: strategy_params_token0.clone() - }, - AssetStrategySet { - address: test.token1.address.clone(), - strategies: strategy_params_token1.clone() - } - ]; - - test.defindex_contract.initialize( - &assets, - &test.manager, - &test.emergency_manager, - &test.vault_fee_receiver, - &2000u32, - &test.defindex_protocol_receiver, - &test.defindex_factory, - &String::from_str(&test.env, "dfToken"), - &String::from_str(&test.env, "DFT"), - ); - let amount0 = 123456789i128; - let amount1 = 987654321i128; - - let users = DeFindexVaultTest::generate_random_users(&test.env, 2); - - // Balances before deposit - test.token0_admin_client.mint(&users[0], &amount0); - test.token1_admin_client.mint(&users[0], &amount1); - let user_balance0 = test.token0.balance(&users[0]); - assert_eq!(user_balance0, amount0); - let user_balance1 = test.token1.balance(&users[0]); - assert_eq!(user_balance1, amount1); - - let df_balance = test.defindex_contract.balance(&users[0]); - assert_eq!(df_balance, 0i128); - - // deposit - let deposit_result=test.defindex_contract.deposit( - &sorobanvec![&test.env, amount0, amount1], - &sorobanvec![&test.env, amount0, amount1], - &users[0], - &false, - ); - - // check deposit result - assert_eq!(deposit_result, (sorobanvec![&test.env, amount0, amount1], amount0 + amount1)); - - // check balances after deposit - let df_balance = test.defindex_contract.balance(&users[0]); - // For first deposit, a minimum amount LIQUIDITY OF 1000 is being locked in the contract - assert_eq!(df_balance, amount0 + amount1 - 1000); - - // check that the vault holds 1000 shares - let vault_df_shares = test.defindex_contract.balance(&test.defindex_contract.address); - assert_eq!(vault_df_shares, 1000i128); - - let user_balance0 = test.token0.balance(&users[0]); - assert_eq!(user_balance0,0i128); - let user_balance1 = test.token1.balance(&users[0]); - assert_eq!(user_balance1,0i128); - - // check vault balance of asset 0 - let vault_balance0 = test.token0.balance(&test.defindex_contract.address); - assert_eq!(vault_balance0, amount0); - // check vault balance of asset 1 - let vault_balance1 = test.token1.balance(&test.defindex_contract.address); - assert_eq!(vault_balance1, amount1); - - //map shuould be map - let mut expected_map = Map::new(&test.env); - expected_map.set(test.token0.address.clone(), amount0); - expected_map.set(test.token1.address.clone(), amount1); - - // check that fetch_total_managed_funds returns correct amount - let total_managed_funds = test.defindex_contract.fetch_total_managed_funds(); - assert_eq!(total_managed_funds, expected_map); - - // check current idle funds - let current_idle_funds = test.defindex_contract.fetch_current_idle_funds(); - assert_eq!(current_idle_funds, expected_map); - - //map shuould be map - let mut expected_map = Map::new(&test.env); - expected_map.set(test.token0.address.clone(), 0i128); - expected_map.set(test.token1.address.clone(), 0i128); - - // check that current invested funds is now 0, funds still in idle funds - let current_invested_funds = test.defindex_contract.fetch_current_invested_funds(); - assert_eq!(current_invested_funds, expected_map); - - - // new user wants to do a deposit with more assets 0 than the proportion, but with minium amount 0 - // multiply amount0 by 2 - let amount0_new = amount0*2 +100 ; - let amount1_new = amount1*2; - - // mint this to user 1 - test.token0_admin_client.mint(&users[1], &amount0_new); - test.token1_admin_client.mint(&users[1], &amount1_new); - - // check user balances - let user_balance0 = test.token0.balance(&users[1]); - assert_eq!(user_balance0, amount0_new); - let user_balance1 = test.token1.balance(&users[1]); - assert_eq!(user_balance1, amount1_new); - - - // user 1 deposits - let deposit_result=test.defindex_contract.deposit( - &sorobanvec![&test.env, amount0_new, amount1_new], - &sorobanvec![&test.env, 0i128, 0i128], - &users[1], - &false, - ); - - // check deposit result. Ok((amounts, shares_to_mint)) - // Vec, i128 - - assert_eq!(deposit_result, (sorobanvec![&test.env, amount0*2, amount1*2], amount0*2 + amount1*2)); - - - // check balances after deposit - let df_balance = test.defindex_contract.balance(&users[1]); - assert_eq!(df_balance, 2*(amount0 + amount1)); - - let user_balance0 = test.token0.balance(&users[1]); - assert_eq!(user_balance0, amount0_new - 2*amount0); - - let user_balance1 = test.token1.balance(&users[1]); - assert_eq!(user_balance1, amount1_new - 2*amount1); - - // check vault balance of asset 0 - let vault_balance0 = test.token0.balance(&test.defindex_contract.address); - assert_eq!(vault_balance0, 3*amount0); - // check vault balance of asset 1 - let vault_balance1 = test.token1.balance(&test.defindex_contract.address); - assert_eq!(vault_balance1, 3*amount1); - - //map shuould be map - let mut expected_map = Map::new(&test.env); - expected_map.set(test.token0.address.clone(), 3*amount0); - expected_map.set(test.token1.address.clone(), 3*amount1); - - // check that fetch_total_managed_funds returns correct amount - let total_managed_funds = test.defindex_contract.fetch_total_managed_funds(); - assert_eq!(total_managed_funds, expected_map); - - // check current idle funds - let current_idle_funds = test.defindex_contract.fetch_current_idle_funds(); - assert_eq!(current_idle_funds, expected_map); - - //map shuould be map - let mut expected_map = Map::new(&test.env); - expected_map.set(test.token0.address.clone(), 0i128); - expected_map.set(test.token1.address.clone(), 0i128); - - // check that current invested funds is now 0, funds still in idle funds - let current_invested_funds = test.defindex_contract.fetch_current_invested_funds(); - assert_eq!(current_invested_funds, expected_map); - - // we will repeat one more time, now enforcing the first asset - let amount0_new = amount0*2; - let amount1_new = amount1*2+100; - - // mint this to user 1 - test.token0_admin_client.mint(&users[1], &amount0_new); - test.token1_admin_client.mint(&users[1], &amount1_new); - - // check user balances - let user_balance0 = test.token0.balance(&users[1]); - assert_eq!(user_balance0, 100 + amount0_new); // we still have 100 from before - let user_balance1 = test.token1.balance(&users[1]); - assert_eq!(user_balance1, amount1_new); - - // user 1 deposits - let deposit_result=test.defindex_contract.deposit( - &sorobanvec![&test.env, amount0_new, amount1_new], - &sorobanvec![&test.env, 0i128, 0i128], - &users[1], - &false, - ); - - // check deposit result. Ok((amounts, shares_to_mint)) - // Vec, i128 - assert_eq!(deposit_result, (sorobanvec![&test.env, amount0*2, amount1*2], amount0*2 + amount1*2)); - -} - -// test deposit of several asset, imposing a minimum amount greater than optimal for asset 0 -#[test] -fn deposit_several_assets_min_greater_than_optimal() { - let test = DeFindexVaultTest::setup(); - test.env.mock_all_auths(); - let strategy_params_token0 = create_strategy_params_token0(&test); - let strategy_params_token1 = create_strategy_params_token1(&test); - - // initialize with 2 assets - let assets: Vec = sorobanvec![ - &test.env, - AssetStrategySet { - address: test.token0.address.clone(), - strategies: strategy_params_token0.clone() - }, - AssetStrategySet { - address: test.token1.address.clone(), - strategies: strategy_params_token1.clone() - } - ]; - - test.defindex_contract.initialize( - &assets, - &test.manager, - &test.emergency_manager, - &test.vault_fee_receiver, - &2000u32, - &test.defindex_protocol_receiver, - &test.defindex_factory, - &String::from_str(&test.env, "dfToken"), - &String::from_str(&test.env, "DFT"), - ); - let amount0 = 123456789i128; - let amount1 = 987654321i128; - - let users = DeFindexVaultTest::generate_random_users(&test.env, 2); - - // Balances before deposit - test.token0_admin_client.mint(&users[0], &amount0); - test.token1_admin_client.mint(&users[0], &amount1); - let user_balance0 = test.token0.balance(&users[0]); - assert_eq!(user_balance0, amount0); - let user_balance1 = test.token1.balance(&users[0]); - assert_eq!(user_balance1, amount1); - - let df_balance = test.defindex_contract.balance(&users[0]); - assert_eq!(df_balance, 0i128); - - // deposit - let deposit_result=test.defindex_contract.try_deposit( - &sorobanvec![&test.env, amount0, amount1], - &sorobanvec![&test.env, amount0 + 1, amount1], - &users[0], - &false, - ); - - // this should fail - assert_eq!(deposit_result, Err(Ok(ContractError::InsufficientAmount))); - - // now we manage to deposit - test.defindex_contract.deposit( - &sorobanvec![&test.env, amount0, amount1], - &sorobanvec![&test.env, amount0, amount1], - &users[0], - &false, - ); - - // check deposit result - - // and now will try again with minimum more than optimal - - // new user wants to do a deposit with more assets 0 than the proportion, but with minium amount 0 - // multiply amount0 by 2 - let amount0_new = amount0*2 +100 ; - let amount1_new = amount1*2; - - // mint this to user - test.token0_admin_client.mint(&users[0], &amount0_new); - test.token1_admin_client.mint(&users[0], &amount1_new); - - let deposit_result=test.defindex_contract.try_deposit( - &sorobanvec![&test.env, amount0_new, amount1_new], - &sorobanvec![&test.env, amount0*2+1, amount1*2], - &users[0], - &false, - ); - - // this should fail - - assert_eq!(deposit_result, Err(Ok(ContractError::InsufficientAmount))); - -} - -//test deposit amounts_min greater than amounts_desired -#[test] -fn deposit_amounts_min_greater_than_amounts_desired(){ - let test = DeFindexVaultTest::setup(); - test.env.mock_all_auths(); - let strategy_params_token0 = create_strategy_params_token0(&test); - let strategy_params_token1 = create_strategy_params_token1(&test); - - // initialize with 2 assets - let assets: Vec = sorobanvec![ - &test.env, - AssetStrategySet { - address: test.token0.address.clone(), - strategies: strategy_params_token0.clone() - }, - AssetStrategySet { - address: test.token1.address.clone(), - strategies: strategy_params_token1.clone() - } - ]; - - test.defindex_contract.initialize( - &assets, - &test.manager, - &test.emergency_manager, - &test.vault_fee_receiver, - &2000u32, - &test.defindex_protocol_receiver, - &test.defindex_factory, - &String::from_str(&test.env, "dfToken"), - &String::from_str(&test.env, "DFT"), - ); - let amount0 = 123456789i128; - let amount1 = 987654321i128; - - let users = DeFindexVaultTest::generate_random_users(&test.env, 2); - - // Balances before deposit - test.token0_admin_client.mint(&users[0], &amount0); - test.token1_admin_client.mint(&users[0], &amount1); - let user_balance0 = test.token0.balance(&users[0]); - assert_eq!(user_balance0, amount0); - let user_balance1 = test.token1.balance(&users[0]); - assert_eq!(user_balance1, amount1); - - let df_balance = test.defindex_contract.balance(&users[0]); - assert_eq!(df_balance, 0i128); - - // deposit - let deposit_result=test.defindex_contract.try_deposit( - &sorobanvec![&test.env, amount0, amount1], - &sorobanvec![&test.env, amount0 + 1, amount1 + 1], - &users[0], - &false - ); - - // this should fail - assert_eq!(deposit_result, Err(Ok(ContractError::InsufficientAmount))); -} - -//Test token transfer from user to vault on deposit -#[test] -fn deposit_transfers_tokens_from_user_to_vault(){ - let test = DeFindexVaultTest::setup(); - test.env.mock_all_auths(); - let strategy_params_token0 = create_strategy_params_token0(&test); - let strategy_params_token1 = create_strategy_params_token1(&test); - - // initialize with 2 assets - let assets: Vec = sorobanvec![ - &test.env, - AssetStrategySet { - address: test.token0.address.clone(), - strategies: strategy_params_token0.clone() - }, - AssetStrategySet { - address: test.token1.address.clone(), - strategies: strategy_params_token1.clone() - } - ]; - - test.defindex_contract.initialize( - &assets, - &test.manager, - &test.emergency_manager, - &test.vault_fee_receiver, - &2000u32, - &test.defindex_protocol_receiver, - &test.defindex_factory, - &String::from_str(&test.env, "dfToken"), - &String::from_str(&test.env, "DFT"), - ); - let amount0 = 123456789i128; - let amount1 = 987654321i128; - - let users = DeFindexVaultTest::generate_random_users(&test.env, 2); - - // Balances before deposit - test.token0_admin_client.mint(&users[0], &amount0); - test.token1_admin_client.mint(&users[0], &amount1); - let user_balance0 = test.token0.balance(&users[0]); - assert_eq!(user_balance0, amount0); - let user_balance1 = test.token1.balance(&users[0]); - assert_eq!(user_balance1, amount1); - - let df_balance = test.defindex_contract.balance(&users[0]); - assert_eq!(df_balance, 0i128); - - // deposit - test.defindex_contract.deposit( - &sorobanvec![&test.env, amount0, amount1], - &sorobanvec![&test.env, amount0, amount1], - &users[0], - &false - ); - - // check balances after deposit - let df_balance = test.defindex_contract.balance(&users[0]); - assert_eq!(df_balance, amount0 + amount1 - 1000); - - let user_balance0 = test.token0.balance(&users[0]); - assert_eq!(user_balance0, 0i128); -} - -#[test] -fn test_deposit_arithmetic_error() { - let test = DeFindexVaultTest::setup(); - test.env.mock_all_auths(); - let strategy_params_token0 = create_strategy_params_token0(&test); - - // Initialize with 1 asset - let assets: Vec = sorobanvec![ - &test.env, - AssetStrategySet { - address: test.token0.address.clone(), - strategies: strategy_params_token0.clone() - } - ]; - - test.defindex_contract.initialize( - &assets, - &test.manager, - &test.emergency_manager, - &test.vault_fee_receiver, - &2000u32, - &test.defindex_protocol_receiver, - &test.defindex_factory, - &String::from_str(&test.env, "dfToken"), - &String::from_str(&test.env, "DFT"), - ); - - // Mock the environment to provoke a division by zero - let mut mock_map = Map::new(&test.env); - mock_map.set(test.token0.address.clone(), 0i128); // Total funds for token0 is 0 - - let amount = 123456789i128; - - let users = DeFindexVaultTest::generate_random_users(&test.env, 1); - - // Mint tokens to user - test.token0_admin_client.mint(&users[0], &amount); - - let large_amount = i128::MAX / 2; - test.token0_admin_client.mint(&users[0], &large_amount); - - //first deposit to overflow the balance - test.defindex_contract.deposit( - &sorobanvec![&test.env, large_amount], - &sorobanvec![&test.env, large_amount], - &users[0], - &false - ); - - // Try to deposit a large amount - let result = test.defindex_contract.try_deposit( - &sorobanvec![&test.env, large_amount], - &sorobanvec![&test.env, large_amount], - &users[0], - &false - ); - - // Verify that the returned error is ContractError::ArithmeticError - assert_eq!(result, Err(Ok(ContractError::ArithmeticError))); -} - -//all amounts are cero -#[test] -fn deposit_amounts_desired_zero() { - let test = DeFindexVaultTest::setup(); - test.env.mock_all_auths(); - let strategy_params_token0 = create_strategy_params_token0(&test); - - // Initialize with 1 asset - let assets: Vec = sorobanvec![ - &test.env, - AssetStrategySet { - address: test.token0.address.clone(), - strategies: strategy_params_token0.clone() - } - ]; - - test.defindex_contract.initialize( - &assets, - &test.manager, - &test.emergency_manager, - &test.vault_fee_receiver, - &2000u32, - &test.defindex_protocol_receiver, - &test.defindex_factory, - &String::from_str(&test.env, "dfToken"), - &String::from_str(&test.env, "DFT"), - ); - - let amount = 123456789i128; - - let users = DeFindexVaultTest::generate_random_users(&test.env, 1); - - // Mint tokens to user - test.token0_admin_client.mint(&users[0], &amount); - - // Balances before deposit - let user_balance_before = test.token0.balance(&users[0]); - assert_eq!(user_balance_before, amount); - - let vault_balance_before = test.token0.balance(&test.defindex_contract.address); - assert_eq!(vault_balance_before, 0i128); - - let df_balance_before = test.defindex_contract.balance(&users[0]); - assert_eq!(df_balance_before, 0i128); - - // Attempt to deposit with amounts_desired all set to 0 - let deposit_result = test.defindex_contract.try_deposit( - &sorobanvec![&test.env, 0i128], - &sorobanvec![&test.env, 0i128], - &users[0], - &false - ); - - // Verify that the returned error is ContractError::InsufficientAmount - assert_eq!(deposit_result, Err(Ok(ContractError::InsufficientAmount))); -} - - - // Deposit with insufficient funds and check for specific error message -#[test] -fn deposit_insufficient_funds_with_error_message() { - let test = DeFindexVaultTest::setup(); - test.env.mock_all_auths(); - let strategy_params_token0 = create_strategy_params_token0(&test); - let strategy_params_token1 = create_strategy_params_token1(&test); - - // Initialize with 2 assets - let assets: Vec = sorobanvec![ - &test.env, - AssetStrategySet { - address: test.token0.address.clone(), - strategies: strategy_params_token0.clone() - }, - AssetStrategySet { - address: test.token1.address.clone(), - strategies: strategy_params_token1.clone() - } - ]; - - test.defindex_contract.initialize( - &assets, - &test.manager, - &test.emergency_manager, - &test.vault_fee_receiver, - &2000u32, - &test.defindex_protocol_receiver, - &test.defindex_factory, - &String::from_str(&test.env, "dfToken"), - &String::from_str(&test.env, "DFT"), - ); - - let amount0 = 123456789i128; - let amount1 = 987654321i128; - - let users = DeFindexVaultTest::generate_random_users(&test.env, 1); - - // Mint tokens to user - test.token0_admin_client.mint(&users[0], &amount0); - test.token1_admin_client.mint(&users[0], &amount1); - - // Balances before deposit - let user_balance0 = test.token0.balance(&users[0]); - assert_eq!(user_balance0, amount0); - let user_balance1 = test.token1.balance(&users[0]); - assert_eq!(user_balance1, amount1); - - let df_balance = test.defindex_contract.balance(&users[0]); - assert_eq!(df_balance, 0i128); - - // Attempt to deposit more than available balance - let deposit_result = test.defindex_contract.try_deposit( - &sorobanvec![&test.env, amount0 + 1, amount1 + 1], - &sorobanvec![&test.env, amount0 + 1, amount1 + 1], - &users[0], - &false - ); - - if deposit_result == Err(Err(InvokeError::Contract(10))) { - return; - } else { - panic!("Expected error not returned"); - } - -} \ No newline at end of file diff --git a/apps/contracts/vault/src/test/rebalance.rs b/apps/contracts/vault/src/test/rebalance.rs deleted file mode 100644 index ecea4880..00000000 --- a/apps/contracts/vault/src/test/rebalance.rs +++ /dev/null @@ -1,420 +0,0 @@ -use soroban_sdk::{vec as sorobanvec, InvokeError, String, Vec}; - -use crate::test::{ - create_strategy_params_token0, defindex_vault::{ - ActionType, AssetInvestmentAllocation, AssetStrategySet, Instruction, OptionalSwapDetailsExactIn, OptionalSwapDetailsExactOut, StrategyInvestment - }, invest, DeFindexVaultTest -}; -use crate::test::defindex_vault::ContractError; - -#[test] -fn rebalance_multi_instructions() { - let test = DeFindexVaultTest::setup(); - test.env.mock_all_auths(); - let strategy_params_token0 = create_strategy_params_token0(&test); - let assets: Vec = sorobanvec![ - &test.env, - AssetStrategySet { - address: test.token0.address.clone(), - strategies: strategy_params_token0.clone() - } - ]; - - test.defindex_contract.initialize( - &assets, - &test.manager, - &test.emergency_manager, - &test.vault_fee_receiver, - &2000u32, - &test.defindex_protocol_receiver, - &test.defindex_factory, - &String::from_str(&test.env, "dfToken"), - &String::from_str(&test.env, "DFT"), - ); - let amount = 987654321i128; - - let users = DeFindexVaultTest::generate_random_users(&test.env, 1); - - test.token0_admin_client.mint(&users[0], &amount); - let user_balance = test.token0.balance(&users[0]); - assert_eq!(user_balance, amount); - - let df_balance = test.defindex_contract.balance(&users[0]); - assert_eq!(df_balance, 0i128); - - test.defindex_contract.deposit( - &sorobanvec![&test.env, amount], - &sorobanvec![&test.env, amount], - &users[0], - &false - ); - - let df_balance = test.defindex_contract.balance(&users[0]); - assert_eq!(df_balance, amount - 1000); - - let investments = sorobanvec![ - &test.env, - Some(AssetInvestmentAllocation { - asset: test.token0.address.clone(), - strategy_investments: sorobanvec![ - &test.env, - Some(StrategyInvestment { - strategy: test.strategy_client_token0.address.clone(), - amount: amount, - }), - ], - }), - ]; - - test.defindex_contract.invest(&investments); - - let vault_balance = test.token0.balance(&test.defindex_contract.address); - assert_eq!(vault_balance, 0); - - // REBALANCE - - let instruction_amount_0 = 200i128; - let instruction_amount_1 = 100i128; - - let instructions = sorobanvec![ - &test.env, - Instruction { - action: ActionType::Withdraw, - strategy: Some(test.strategy_client_token0.address.clone()), - amount: Some(instruction_amount_0), - swap_details_exact_in: OptionalSwapDetailsExactIn::None, - swap_details_exact_out: OptionalSwapDetailsExactOut::None, - }, - Instruction { - action: ActionType::Invest, - strategy: Some(test.strategy_client_token0.address.clone()), - amount: Some(instruction_amount_1), - swap_details_exact_in: OptionalSwapDetailsExactIn::None, - swap_details_exact_out: OptionalSwapDetailsExactOut::None, - } - ]; - - test.defindex_contract.rebalance(&instructions); - - let vault_balance = test.token0.balance(&test.defindex_contract.address); - assert_eq!(vault_balance, instruction_amount_1); -} - -#[test] -fn rebalance_one_instruction() { - let test = DeFindexVaultTest::setup(); - test.env.mock_all_auths(); - let strategy_params_token0 = create_strategy_params_token0(&test); - let assets: Vec = sorobanvec![ - &test.env, - AssetStrategySet { - address: test.token0.address.clone(), - strategies: strategy_params_token0.clone() - } - ]; - - test.defindex_contract.initialize( - &assets, - &test.manager, - &test.emergency_manager, - &test.vault_fee_receiver, - &2000u32, - &test.defindex_protocol_receiver, - &test.defindex_factory, - &String::from_str(&test.env, "TestVault"), - &String::from_str(&test.env, "TSTV"), - ); - let amount = 987654321i128; - - let users = DeFindexVaultTest::generate_random_users(&test.env, 1); - - test.token0_admin_client.mint(&users[0], &amount); - let user_balance = test.token0.balance(&users[0]); - assert_eq!(user_balance, amount); - - let df_balance = test.defindex_contract.balance(&users[0]); - assert_eq!(df_balance, 0i128); - - test.defindex_contract.deposit( - &sorobanvec![&test.env, amount], - &sorobanvec![&test.env, amount], - &users[0], - &false - ); - - let df_balance = test.defindex_contract.balance(&users[0]); - assert_eq!(df_balance, amount - 1000); - - let investments = sorobanvec![ - &test.env, - Some(AssetInvestmentAllocation { - asset: test.token0.address.clone(), - strategy_investments: sorobanvec![ - &test.env, - Some(StrategyInvestment { - strategy: test.strategy_client_token0.address.clone(), - amount: amount, - }), - ], - }), - ]; - - test.defindex_contract.invest(&investments); - - let vault_balance = test.token0.balance(&test.defindex_contract.address); - assert_eq!(vault_balance, 0); - - // REBALANCE - - let instruction_amount_0 = 200i128; - - let instructions = sorobanvec![ - &test.env, - Instruction { - action: ActionType::Withdraw, - strategy: Some(test.strategy_client_token0.address.clone()), - amount: Some(instruction_amount_0), - swap_details_exact_in: OptionalSwapDetailsExactIn::None, - swap_details_exact_out: OptionalSwapDetailsExactOut::None, - }, - ]; - - test.defindex_contract.rebalance(&instructions); - - let vault_balance = test.token0.balance(&test.defindex_contract.address); - assert_eq!(vault_balance, instruction_amount_0); -} - -#[test] -fn rebalance_empty_instructions(){ - let test = DeFindexVaultTest::setup(); - test.env.mock_all_auths(); - - let strategy_params_token0 = create_strategy_params_token0(&test); - let assets: Vec = sorobanvec![ - &test.env, - AssetStrategySet { - address: test.token0.address.clone(), - strategies: strategy_params_token0.clone() - } - ]; - test.defindex_contract.initialize( - &assets, - &test.manager, - &test.emergency_manager, - &test.vault_fee_receiver, - &100u32, - &test.defindex_protocol_receiver, - &test.defindex_factory, - &String::from_str(&test.env, "testVault"), - &String::from_str(&test.env, "TSTV"), - ); - let amount: i128 = 987654321; - let users = DeFindexVaultTest::generate_random_users(&test.env, 1); - test.token0_admin_client.mint(&users[0], &amount); - let vault_balance = test.defindex_contract.balance(&users[0]); - assert_eq!(vault_balance, 0i128); - - test.defindex_contract.deposit( - &sorobanvec![&test.env, amount], - &sorobanvec![&test.env, amount], - &users[0], - &false - ); - let df_balance = test.defindex_contract.balance(&users[0]); - assert_eq!(df_balance, amount - 1000); - - let instructions = sorobanvec![ - &test.env, - Instruction { - action: ActionType::Withdraw, - strategy: None, - amount: None, - swap_details_exact_in: OptionalSwapDetailsExactIn::None, - swap_details_exact_out: OptionalSwapDetailsExactOut::None, - }, - ]; - let rebalance = test.defindex_contract.try_rebalance(&instructions); - assert_eq!(rebalance, Err(Ok(ContractError::MissingInstructionData))); - - let no_strategy_instructions = sorobanvec![ - &test.env, - Instruction { - action: ActionType::Withdraw, - strategy: Some(test.strategy_client_token0.address.clone()), - amount: None, - swap_details_exact_in: OptionalSwapDetailsExactIn::None, - swap_details_exact_out: OptionalSwapDetailsExactOut::None, - }, - ]; - let rebalance = test.defindex_contract.try_rebalance(&no_strategy_instructions); - assert_eq!(rebalance, Err(Ok(ContractError::MissingInstructionData))); - - let no_amount_instructions = sorobanvec![ - &test.env, - Instruction { - action: ActionType::Withdraw, - strategy: Some(test.strategy_client_token0.address.clone()), - amount: None, - swap_details_exact_in: OptionalSwapDetailsExactIn::None, - swap_details_exact_out: OptionalSwapDetailsExactOut::None, - }, - ]; - let rebalance = test.defindex_contract.try_rebalance(&no_amount_instructions); - assert_eq!(rebalance, Err(Ok(ContractError::MissingInstructionData))); -} - -#[test] -fn rebalance_no_instructions(){ - let test = DeFindexVaultTest::setup(); - test.env.mock_all_auths(); - - let strategy_params_token0 = create_strategy_params_token0(&test); - let assets: Vec = sorobanvec![ - &test.env, - AssetStrategySet { - address: test.token0.address.clone(), - strategies: strategy_params_token0.clone() - } - ]; - test.defindex_contract.initialize( - &assets, - &test.manager, - &test.emergency_manager, - &test.vault_fee_receiver, - &100u32, - &test.defindex_protocol_receiver, - &test.defindex_factory, - &String::from_str(&test.env, "testVault"), - &String::from_str(&test.env, "TSTV"), - ); - let amount: i128 = 987654321; - let users = DeFindexVaultTest::generate_random_users(&test.env, 1); - test.token0_admin_client.mint(&users[0], &amount); - let vault_balance = test.defindex_contract.balance(&users[0]); - assert_eq!(vault_balance, 0i128); - - test.defindex_contract.deposit( - &sorobanvec![&test.env, amount], - &sorobanvec![&test.env, amount], - &users[0], - &false - ); - let df_balance = test.defindex_contract.balance(&users[0]); - assert_eq!(df_balance, amount - 1000); - - let rebalance = test.defindex_contract.try_rebalance(&sorobanvec![&test.env]); - assert_eq!(rebalance, Err(Ok(ContractError::NoInstructions))); -} - -#[test] -fn rebalance_insufficient_balance(){ - let test = DeFindexVaultTest::setup(); - test.env.mock_all_auths(); - - let strategy_params_token0 = create_strategy_params_token0(&test); - let assets: Vec = sorobanvec![ - &test.env, - AssetStrategySet { - address: test.token0.address.clone(), - strategies: strategy_params_token0.clone() - } - ]; - test.defindex_contract.initialize( - &assets, - &test.manager, - &test.emergency_manager, - &test.vault_fee_receiver, - &10u32, - &test.defindex_protocol_receiver, - &test.defindex_factory, - &String::from_str(&test.env, "testVault"), - &String::from_str(&test.env, "TSTV"), - ); - let amount: i128 = 987654321; - let users = DeFindexVaultTest::generate_random_users(&test.env, 1); - test.token0_admin_client.mint(&users[0], &amount); - - //Balance should be 0 - let vault_balance = test.defindex_contract.balance(&users[0]); - assert_eq!(vault_balance, 0i128); - - //Withdraw with no funds - let withdraw_no_funds_instructions = sorobanvec![ - &test.env, - Instruction { - action: ActionType::Withdraw, - strategy: Some(test.strategy_client_token0.address.clone()), - amount: Some(amount + 1), - swap_details_exact_in: OptionalSwapDetailsExactIn::None, - swap_details_exact_out: OptionalSwapDetailsExactOut::None, - }, - ]; - - let withdraw_no_funds = test.defindex_contract.try_rebalance(&withdraw_no_funds_instructions); - assert_eq!(withdraw_no_funds, Err(Ok(ContractError::StrategyWithdrawError))); //Contract should respond 'Insuficient balance'? - - //Invest with no funds - let invest_no_funds_instructions = sorobanvec![ - &test.env, - Instruction { - action: ActionType::Invest, - strategy: Some(test.strategy_client_token0.address.clone()), - amount: Some(1), - swap_details_exact_in: OptionalSwapDetailsExactIn::None, - swap_details_exact_out: OptionalSwapDetailsExactOut::None, - }, - ]; - let invest_no_funds = test.defindex_contract.try_rebalance(&invest_no_funds_instructions); - - //Contract should fail with error #10 no balance or panic the test - if invest_no_funds != Err(Err(InvokeError::Contract(10))) { - panic!("Expected error not returned"); - } - - //Deposit 987654321 stroops - test.defindex_contract.deposit( - &sorobanvec![&test.env, amount], - &sorobanvec![&test.env, amount], - &users[0], - &false - ); - let df_balance: i128 = test.defindex_contract.balance(&users[0]); - assert_eq!(df_balance, amount - 1000); - - //Withdraw more than available - let withdraw_instructions = sorobanvec![ - &test.env, - Instruction { - action: ActionType::Withdraw, - strategy: Some(test.strategy_client_token0.address.clone()), - amount: Some(amount + 1), - swap_details_exact_in: OptionalSwapDetailsExactIn::None, - swap_details_exact_out: OptionalSwapDetailsExactOut::None, - }, - ]; - let rebalance = test.defindex_contract.try_rebalance(&withdraw_instructions); - assert_eq!(rebalance, Err(Ok(ContractError::StrategyWithdrawError))); - - let invest_instructions = sorobanvec!( - &test.env, - Instruction { - action: ActionType::Invest, - strategy: Some(test.strategy_client_token0.address.clone()), - amount: Some(amount + 1), - swap_details_exact_in: OptionalSwapDetailsExactIn::None, - swap_details_exact_out: OptionalSwapDetailsExactOut::None, - }, - ); - - //Contract should fail with error #10 no balance - let rebalance = test.defindex_contract.try_rebalance(&invest_instructions); - if rebalance == Err(Err(InvokeError::Contract(10))) { - return; - } else { - panic!("Expected error not returned"); - } -} - - - diff --git a/apps/contracts/vault/src/test/vault/rebalance.rs b/apps/contracts/vault/src/test/vault/rebalance.rs index 64006e25..cffb956e 100644 --- a/apps/contracts/vault/src/test/vault/rebalance.rs +++ b/apps/contracts/vault/src/test/vault/rebalance.rs @@ -1,17 +1,9 @@ use soroban_sdk::{vec as sorobanvec, InvokeError, String, Vec}; use crate::test::{ - create_strategy_params_token0, - defindex_vault::{ - ActionType, - AssetStrategySet, - Instruction, - AssetInvestmentAllocation, - StrategyInvestment, - OptionalSwapDetailsExactIn, - OptionalSwapDetailsExactOut, - }, - DeFindexVaultTest, + create_strategy_params_token0, defindex_vault::{ + ActionType, AssetInvestmentAllocation, AssetStrategySet, Instruction, OptionalSwapDetailsExactIn, OptionalSwapDetailsExactOut, StrategyInvestment + }, invest, DeFindexVaultTest }; use crate::test::defindex_vault::ContractError; @@ -333,7 +325,7 @@ fn insufficient_balance(){ &test.manager, &test.emergency_manager, &test.vault_fee_receiver, - &100u32, + &10u32, &test.defindex_protocol_receiver, &test.defindex_factory, &String::from_str(&test.env, "testVault"), @@ -342,9 +334,45 @@ fn insufficient_balance(){ let amount: i128 = 987654321; let users = DeFindexVaultTest::generate_random_users(&test.env, 1); test.token0_admin_client.mint(&users[0], &amount); + + //Balance should be 0 let vault_balance = test.defindex_contract.balance(&users[0]); assert_eq!(vault_balance, 0i128); + //Withdraw with no funds + let withdraw_no_funds_instructions = sorobanvec![ + &test.env, + Instruction { + action: ActionType::Withdraw, + strategy: Some(test.strategy_client_token0.address.clone()), + amount: Some(amount + 1), + swap_details_exact_in: OptionalSwapDetailsExactIn::None, + swap_details_exact_out: OptionalSwapDetailsExactOut::None, + }, + ]; + + let withdraw_no_funds = test.defindex_contract.try_rebalance(&withdraw_no_funds_instructions); + assert_eq!(withdraw_no_funds, Err(Ok(ContractError::StrategyWithdrawError))); //Contract should respond 'Insuficient balance'? + + //Invest with no funds + let invest_no_funds_instructions = sorobanvec![ + &test.env, + Instruction { + action: ActionType::Invest, + strategy: Some(test.strategy_client_token0.address.clone()), + amount: Some(1), + swap_details_exact_in: OptionalSwapDetailsExactIn::None, + swap_details_exact_out: OptionalSwapDetailsExactOut::None, + }, + ]; + let invest_no_funds = test.defindex_contract.try_rebalance(&invest_no_funds_instructions); + + //Contract should fail with error #10 no balance or panic the test + if invest_no_funds != Err(Err(InvokeError::Contract(10))) { + panic!("Expected error not returned"); + } + + //Deposit 987654321 stroops test.defindex_contract.deposit( &sorobanvec![&test.env, amount], &sorobanvec![&test.env, amount], @@ -354,6 +382,7 @@ fn insufficient_balance(){ let df_balance: i128 = test.defindex_contract.balance(&users[0]); assert_eq!(df_balance, amount - 1000); + //Withdraw more than available let withdraw_instructions = sorobanvec![ &test.env, Instruction { @@ -377,6 +406,8 @@ fn insufficient_balance(){ swap_details_exact_out: OptionalSwapDetailsExactOut::None, }, ); + + //Contract should fail with error #10 no balance let rebalance = test.defindex_contract.try_rebalance(&invest_instructions); if rebalance == Err(Err(InvokeError::Contract(10))) { return; @@ -385,3 +416,5 @@ fn insufficient_balance(){ } } + + From 1d8426f0dc6d3a4c48b43029a88598cab0c009dd Mon Sep 17 00:00:00 2001 From: Matias Poblete <86752543+MattPoblete@users.noreply.github.com> Date: Tue, 3 Dec 2024 13:25:57 -0300 Subject: [PATCH 3/3] =?UTF-8?q?=F0=9F=A9=B9Fix=20build?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/contracts/vault/src/test/vault/rebalance.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/contracts/vault/src/test/vault/rebalance.rs b/apps/contracts/vault/src/test/vault/rebalance.rs index cffb956e..7e43422d 100644 --- a/apps/contracts/vault/src/test/vault/rebalance.rs +++ b/apps/contracts/vault/src/test/vault/rebalance.rs @@ -3,7 +3,7 @@ use soroban_sdk::{vec as sorobanvec, InvokeError, String, Vec}; use crate::test::{ create_strategy_params_token0, defindex_vault::{ ActionType, AssetInvestmentAllocation, AssetStrategySet, Instruction, OptionalSwapDetailsExactIn, OptionalSwapDetailsExactOut, StrategyInvestment - }, invest, DeFindexVaultTest + }, DeFindexVaultTest }; use crate::test::defindex_vault::ContractError;