diff --git a/apps/contracts/vault/src/deposit.rs b/apps/contracts/vault/src/deposit.rs index 173cb8d4..c98a13cd 100644 --- a/apps/contracts/vault/src/deposit.rs +++ b/apps/contracts/vault/src/deposit.rs @@ -5,11 +5,11 @@ use crate::{funds::{fetch_invested_funds_for_asset, fetch_invested_funds_for_str /// Common logic for processing deposits. pub fn process_deposit( e: &Env, + assets: &Vec, amounts_desired: &Vec, amounts_min: &Vec, from: &Address, ) -> Result<(Vec, i128), ContractError> { - let assets = get_assets(&e); let assets_length = assets.len(); // Validate inputs @@ -97,7 +97,7 @@ fn mint_shares( pub fn generate_and_execute_investments( e: &Env, amounts: &Vec, - assets: Vec, + assets: &Vec, ) -> Result<(), ContractError> { let mut asset_investments = Vec::new(&e); @@ -135,6 +135,6 @@ pub fn generate_and_execute_investments( })); } - check_and_execute_investments(e.clone(), assets, asset_investments)?; + check_and_execute_investments(e.clone(), assets.clone(), asset_investments)?; Ok(()) } \ No newline at end of file diff --git a/apps/contracts/vault/src/interface.rs b/apps/contracts/vault/src/interface.rs index 7449c7e7..eb5605e6 100644 --- a/apps/contracts/vault/src/interface.rs +++ b/apps/contracts/vault/src/interface.rs @@ -78,26 +78,7 @@ pub trait VaultTrait { amounts_desired: Vec, amounts_min: Vec, from: Address, - ) -> Result<(Vec, i128), ContractError>; - - /// Handles user deposits into the DeFindex Vault and invest them immediately. - /// - /// - /// # Parameters - /// * `e` - The current environment reference (`Env`), for access to the contract state and utilities. - /// * `amounts_desired` - A vector specifying the user's intended deposit amounts for each asset. - /// * `amounts_min` - A vector of minimum deposit amounts required for the transaction to proceed. - /// * `from` - The address of the user making the deposit. - /// - /// # Returns - /// * `Result<(Vec, i128), ContractError>` - Returns the actual deposited `amounts` and `shares_to_mint` if successful, - /// otherwise a `ContractError`. - /// - fn deposit_and_invest( - e: Env, - amounts_desired: Vec, - amounts_min: Vec, - from: Address, + invest: bool, ) -> Result<(Vec, i128), ContractError>; /// Withdraws assets from the DeFindex Vault by burning dfTokens. diff --git a/apps/contracts/vault/src/lib.rs b/apps/contracts/vault/src/lib.rs index 72a13f86..d2c2fe6e 100755 --- a/apps/contracts/vault/src/lib.rs +++ b/apps/contracts/vault/src/lib.rs @@ -195,6 +195,7 @@ impl VaultTrait for DeFindexVault { amounts_desired: Vec, amounts_min: Vec, from: Address, + invest: bool, ) -> Result<(Vec, i128), ContractError> { extend_instance_ttl(&e); check_initialized(&e)?; @@ -204,45 +205,15 @@ impl VaultTrait for DeFindexVault { // If this was not done before, last_fee_assesment will set to be current timestamp and this will return without action collect_fees(&e)?; - let (amounts, shares_to_mint) = process_deposit(&e, &amounts_desired, &amounts_min, &from)?; - - events::emit_deposit_event(&e, from, amounts.clone(), shares_to_mint.clone()); - - Ok((amounts, shares_to_mint)) - } - - /// Handles user deposits into the DeFindex Vault and invest them immediately. - /// - /// - /// # Parameters - /// * `e` - The current environment reference (`Env`), for access to the contract state and utilities. - /// * `amounts_desired` - A vector specifying the user's intended deposit amounts for each asset. - /// * `amounts_min` - A vector of minimum deposit amounts required for the transaction to proceed. - /// * `from` - The address of the user making the deposit. - /// - /// # Returns - /// * `Result<(Vec, i128), ContractError>` - Returns the actual deposited `amounts` and `shares_to_mint` if successful, - /// otherwise a `ContractError`. - /// - fn deposit_and_invest( - e: Env, - amounts_desired: Vec, - amounts_min: Vec, - from: Address, - ) -> Result<(Vec, i128), ContractError> { - extend_instance_ttl(&e); - check_initialized(&e)?; - from.require_auth(); - - // Collect Fees - collect_fees(&e)?; + let assets = get_assets(&e); - let (amounts, shares_to_mint) = process_deposit(&e, &amounts_desired, &amounts_min, &from)?; + let (amounts, shares_to_mint) = process_deposit(&e, &assets, &amounts_desired, &amounts_min, &from)?; events::emit_deposit_event(&e, from, amounts.clone(), shares_to_mint.clone()); - let assets = get_assets(&e); - // Generate investment allocations and execute them - generate_and_execute_investments(&e, &amounts, assets)?; + if invest { + // Generate investment allocations and execute them + generate_and_execute_investments(&e, &amounts, &assets)?; + } Ok((amounts, shares_to_mint)) } diff --git a/apps/contracts/vault/src/test/deposit.rs b/apps/contracts/vault/src/test/deposit.rs index 5b9ffd6f..08fbe5fe 100644 --- a/apps/contracts/vault/src/test/deposit.rs +++ b/apps/contracts/vault/src/test/deposit.rs @@ -15,6 +15,7 @@ fn test_deposit_not_yet_initialized() { &sorobanvec![&test.env, 100i128], &sorobanvec![&test.env, 100i128], &users[0], + &false, ); assert_eq!(result, Err(Ok(ContractError::NotInitialized))); @@ -60,6 +61,7 @@ fn deposit_amounts_desired_less_length() { &sorobanvec![&test.env, amount], // wrong amount desired &sorobanvec![&test.env, amount, amount], &users[0], + &false, ); assert_eq!(response, Err(Ok(ContractError::WrongAmountsLength))); @@ -101,6 +103,7 @@ fn deposit_amounts_desired_more_length() { &sorobanvec![&test.env, amount, amount], // wrong amount desired &sorobanvec![&test.env, amount], &users[0], + &false, ); assert_eq!(response, Err(Ok(ContractError::WrongAmountsLength))); @@ -146,6 +149,7 @@ fn deposit_amounts_min_less_length() { &sorobanvec![&test.env, amount, amount], &sorobanvec![&test.env, amount], // wrong amount min &users[0], + &false, ); assert_eq!(response, Err(Ok(ContractError::WrongAmountsLength))); @@ -192,6 +196,7 @@ fn deposit_amounts_min_more_length() { &sorobanvec![&test.env, amount, amount], &sorobanvec![&test.env, amount, amount, amount], // wrong amount min &users[0], + &false, ); assert_eq!(response, Err(Ok(ContractError::WrongAmountsLength))); @@ -237,6 +242,7 @@ fn deposit_amounts_desired_negative() { &sorobanvec![&test.env, -amount, amount], &sorobanvec![&test.env, amount, amount], &users[0], + &false, ); assert_eq!(response, Err(Ok(ContractError::NegativeNotAllowed))); @@ -286,6 +292,7 @@ fn deposit_one_asset_success() { &sorobanvec![&test.env, amount], &sorobanvec![&test.env, amount], &users[0], + &false, ); // check balances after deposit @@ -330,6 +337,7 @@ fn deposit_one_asset_success() { &sorobanvec![&test.env, amount2], &sorobanvec![&test.env, amount2], &users[0], + &false, ); //map shuould be map @@ -412,6 +420,7 @@ fn deposit_one_asset_min_more_than_desired() { &sorobanvec![&test.env, amount], &sorobanvec![&test.env, amount + 1], &users[0], + &false, ); // this should fail assert_eq!(result, Err(Ok(ContractError::InsufficientAmount))); @@ -471,6 +480,7 @@ fn deposit_several_assets_success() { &sorobanvec![&test.env, amount0, amount1], &sorobanvec![&test.env, amount0, amount1], &users[0], + &false, ); // check deposit result @@ -541,6 +551,7 @@ fn deposit_several_assets_success() { &sorobanvec![&test.env, amount0_new, amount1_new], &sorobanvec![&test.env, 0i128, 0i128], &users[1], + &false, ); // check deposit result. Ok((amounts, shares_to_mint)) @@ -607,6 +618,7 @@ fn deposit_several_assets_success() { &sorobanvec![&test.env, amount0_new, amount1_new], &sorobanvec![&test.env, 0i128, 0i128], &users[1], + &false, ); // check deposit result. Ok((amounts, shares_to_mint)) @@ -668,6 +680,7 @@ fn deposit_several_assets_min_greater_than_optimal() { &sorobanvec![&test.env, amount0, amount1], &sorobanvec![&test.env, amount0 + 1, amount1], &users[0], + &false, ); // this should fail @@ -678,6 +691,7 @@ fn deposit_several_assets_min_greater_than_optimal() { &sorobanvec![&test.env, amount0, amount1], &sorobanvec![&test.env, amount0, amount1], &users[0], + &false, ); // check deposit result @@ -697,6 +711,7 @@ fn deposit_several_assets_min_greater_than_optimal() { &sorobanvec![&test.env, amount0_new, amount1_new], &sorobanvec![&test.env, amount0*2+1, amount1*2], &users[0], + &false, ); // this should fail diff --git a/apps/contracts/vault/src/test/deposit_and_invest.rs b/apps/contracts/vault/src/test/deposit_and_invest.rs index 8237b69d..a85ff29b 100644 --- a/apps/contracts/vault/src/test/deposit_and_invest.rs +++ b/apps/contracts/vault/src/test/deposit_and_invest.rs @@ -45,10 +45,11 @@ fn deposit_and_invest_one_asset_success() { assert_eq!(df_balance, 0i128); // deposit - test.defindex_contract.deposit_and_invest( + test.defindex_contract.deposit( &sorobanvec![&test.env, amount], &sorobanvec![&test.env, amount], &users[0], + &true, ); // check balances after deposit @@ -88,10 +89,11 @@ fn deposit_and_invest_one_asset_success() { assert_eq!(user_balance, amount2); // deposit - test.defindex_contract.deposit_and_invest( + test.defindex_contract.deposit( &sorobanvec![&test.env, amount2], &sorobanvec![&test.env, amount2], &users[0], + &true, ); //map shuould be map @@ -174,10 +176,11 @@ fn deposit_and_invest_several_assets_success() { assert_eq!(df_balance, 0i128); // deposit - let deposit_result=test.defindex_contract.deposit_and_invest( + let deposit_result=test.defindex_contract.deposit( &sorobanvec![&test.env, amount0, amount1], &sorobanvec![&test.env, amount0, amount1], &users[0], + &true, ); // check deposit result @@ -242,10 +245,11 @@ fn deposit_and_invest_several_assets_success() { // user 1 deposits - let deposit_result=test.defindex_contract.deposit_and_invest( + let deposit_result=test.defindex_contract.deposit( &sorobanvec![&test.env, amount0_new, amount1_new], &sorobanvec![&test.env, 0i128, 0i128], &users[1], + &true, ); // check deposit result. Ok((amounts, shares_to_mint)) @@ -307,10 +311,11 @@ fn deposit_and_invest_several_assets_success() { assert_eq!(user_balance1, amount1_new); // user 1 deposits - let deposit_result=test.defindex_contract.deposit_and_invest( + let deposit_result=test.defindex_contract.deposit( &sorobanvec![&test.env, amount0_new, amount1_new], &sorobanvec![&test.env, 0i128, 0i128], &users[1], + &true, ); // check deposit result. Ok((amounts, shares_to_mint)) diff --git a/apps/contracts/vault/src/test/emergency_withdraw.rs b/apps/contracts/vault/src/test/emergency_withdraw.rs index 1c014738..cf74ec8b 100644 --- a/apps/contracts/vault/src/test/emergency_withdraw.rs +++ b/apps/contracts/vault/src/test/emergency_withdraw.rs @@ -49,6 +49,7 @@ fn test_emergency_withdraw_success() { &sorobanvec![&test.env, amount], &sorobanvec![&test.env, amount], &users[0], + &false ); let df_balance = test.defindex_contract.balance(&users[0]); diff --git a/apps/contracts/vault/src/test/invest.rs b/apps/contracts/vault/src/test/invest.rs index 338c2c2a..a5b06171 100644 --- a/apps/contracts/vault/src/test/invest.rs +++ b/apps/contracts/vault/src/test/invest.rs @@ -446,6 +446,7 @@ fn test_invest_in_strategy() { &sorobanvec![&test.env, amount_0, amount_1], // asset 0 &sorobanvec![&test.env, amount_0, amount_1], // asset 1 &users[0], + &false, ); @@ -609,6 +610,7 @@ fn test_invest_more_than_idle_funds() { &sorobanvec![&test.env, amount_0, amount_1], // asset 0 &sorobanvec![&test.env, amount_0, amount_1], // asset 1 &users[0], + &false, ); // check vault balances @@ -753,6 +755,7 @@ fn test_invest_without_mock_all_auths() { &sorobanvec![&test.env, amount_0, amount_1], // asset 0 &sorobanvec![&test.env, amount_0, amount_1], // asset 1 &users[0], + &false, ); // TODO check that the blockchain saw this authorizations diff --git a/apps/contracts/vault/src/test/rebalance.rs b/apps/contracts/vault/src/test/rebalance.rs index dffb1e7a..c0aec907 100644 --- a/apps/contracts/vault/src/test/rebalance.rs +++ b/apps/contracts/vault/src/test/rebalance.rs @@ -53,6 +53,7 @@ fn rebalance() { &sorobanvec![&test.env, amount], &sorobanvec![&test.env, amount], &users[0], + &false ); let df_balance = test.defindex_contract.balance(&users[0]); diff --git a/apps/contracts/vault/src/test/withdraw.rs b/apps/contracts/vault/src/test/withdraw.rs index b5fe4ef8..38edb80f 100644 --- a/apps/contracts/vault/src/test/withdraw.rs +++ b/apps/contracts/vault/src/test/withdraw.rs @@ -54,6 +54,7 @@ fn test_withdraw_from_idle_success() { &sorobanvec![&test.env, amount_to_deposit], &sorobanvec![&test.env, amount_to_deposit], &users[0], + &false ); // Check Balances after deposit @@ -165,6 +166,7 @@ fn test_withdraw_from_strategy_success() { &sorobanvec![&test.env, amount], &sorobanvec![&test.env, amount], &users[0], + &false ); let df_balance = test.defindex_contract.balance(&users[0]);