From d97ff810624c444cfa4d945db706d44eaf81d49f Mon Sep 17 00:00:00 2001 From: Keyne Date: Thu, 17 Oct 2024 15:15:54 +0100 Subject: [PATCH] Fix astroport LPer limit handling (#74) * fix limit * add extra check --- .../services/astroport-lper/src/contract.rs | 6 +- .../services/astroport-lper/src/tests.rs | 55 +++++++++++++------ 2 files changed, 39 insertions(+), 22 deletions(-) diff --git a/contracts/services/astroport-lper/src/contract.rs b/contracts/services/astroport-lper/src/contract.rs index 738dbeeb..5b3e47cd 100644 --- a/contracts/services/astroport-lper/src/contract.rs +++ b/contracts/services/astroport-lper/src/contract.rs @@ -275,7 +275,7 @@ mod actions { )?; // Check which asset is being provided and get its balance - let (asset_balance, other_asset) = if asset == cfg.lp_config.asset_data.asset1 { + let (mut asset_balance, other_asset) = if asset == cfg.lp_config.asset_data.asset1 { (balance_asset1.clone(), balance_asset2.clone()) } else if asset == cfg.lp_config.asset_data.asset2 { (balance_asset2.clone(), balance_asset1.clone()) @@ -295,9 +295,7 @@ mod actions { // Check limit if provided if let Some(limit) = limit { if limit < asset_balance.amount { - return Err(ServiceError::ExecutionError( - "Asset amount is greater than the limit".to_string(), - )); + asset_balance.amount = limit; } } diff --git a/contracts/services/astroport-lper/src/tests.rs b/contracts/services/astroport-lper/src/tests.rs index 0161a95f..8d2cb3a3 100644 --- a/contracts/services/astroport-lper/src/tests.rs +++ b/contracts/services/astroport-lper/src/tests.rs @@ -1,7 +1,7 @@ use cosmwasm_std::Uint128; use neutron_test_tube::{ neutron_std::types::cosmos::{ - bank::v1beta1::{MsgSend, QueryAllBalancesRequest}, + bank::v1beta1::{MsgSend, QueryAllBalancesRequest, QueryBalanceRequest}, base::v1beta1::Coin as BankCoin, }, Account, Bank, Module, Wasm, @@ -688,23 +688,42 @@ fn provide_single_sided_liquidity_cw20_lp_token() { fn test_limit_single_sided_liquidity() { let setup = LPerTestSuite::default(); let wasm = Wasm::new(&setup.inner.app); + let bank = Bank::new(&setup.inner.app); - let error = wasm - .execute::>( - &setup.lper_addr, - &ExecuteMsg::ProcessAction(ActionsMsgs::ProvideSingleSidedLiquidity { - asset: setup.inner.pool_asset1.clone(), - limit: Some(Uint128::new(1)), - expected_pool_ratio_range: None, - }), - &[], - setup.inner.processor_acc(), - ) - .unwrap_err(); + let query_balance = |address: &str| -> u128 { + bank.query_balance(&QueryBalanceRequest { + address: address.to_string(), + denom: setup.inner.pool_asset1.clone(), + }) + .unwrap() + .balance + .unwrap() + .amount + .parse() + .unwrap() + }; - assert!(error.to_string().contains( - ServiceError::ExecutionError("Asset amount is greater than the limit".to_string()) - .to_string() - .as_str(), - ),); + let input_acc_balance_before = query_balance(&setup.input_acc); + + let liquidity_provided = 500_000u128; + + wasm.execute::>( + &setup.lper_addr, + &ExecuteMsg::ProcessAction(ActionsMsgs::ProvideSingleSidedLiquidity { + asset: setup.inner.pool_asset1.clone(), + limit: Some(Uint128::new(liquidity_provided)), + expected_pool_ratio_range: None, + }), + &[], + setup.inner.processor_acc(), + ) + .unwrap(); + + let input_acc_balance_after = query_balance(&setup.input_acc); + + assert!(input_acc_balance_after > 0); + assert_eq!( + input_acc_balance_before - liquidity_provided, + input_acc_balance_after + ); }