From fae502a5d859e65ef7b2c3174ccb53a1e75d879d Mon Sep 17 00:00:00 2001 From: Omar Date: Wed, 28 Feb 2024 17:00:55 +0300 Subject: [PATCH] [Defiplaza v2 Adapter v1]: Add some basic fee calculation tests. --- packages/defiplaza-v2-adapter-v1/src/lib.rs | 4 +- tests/tests/defiplaza_v2.rs | 133 ++++++++++++++++++++ 2 files changed, 135 insertions(+), 2 deletions(-) diff --git a/packages/defiplaza-v2-adapter-v1/src/lib.rs b/packages/defiplaza-v2-adapter-v1/src/lib.rs index 93c9fd3e..bf7e1764 100644 --- a/packages/defiplaza-v2-adapter-v1/src/lib.rs +++ b/packages/defiplaza-v2-adapter-v1/src/lib.rs @@ -380,13 +380,13 @@ pub mod adapter { }; // Steps 4 and 5 - let base_fees = std::cmp::min( + let base_fees = std::cmp::max( new_base_target .checked_sub(old_base_target) .expect(OVERFLOW_ERROR), Decimal::ZERO, ); - let quote_fees = std::cmp::min( + let quote_fees = std::cmp::max( new_quote_target .checked_sub(old_quote_target) .expect(OVERFLOW_ERROR), diff --git a/tests/tests/defiplaza_v2.rs b/tests/tests/defiplaza_v2.rs index 17eaf21d..d7718394 100644 --- a/tests/tests/defiplaza_v2.rs +++ b/tests/tests/defiplaza_v2.rs @@ -267,3 +267,136 @@ fn can_close_a_liquidity_position_in_defiplaza_that_fits_into_fee_limits() { assert!(total_execution_cost_in_xrd <= dec!(4.8)) } + +#[test] +fn fees_are_zero_when_no_swaps_take_place() -> Result<(), RuntimeError> { + // Arrange + let Environment { + environment: ref mut env, + mut defiplaza_v2, + resources, + .. + } = ScryptoTestEnv::new()?; + + let [bitcoin_bucket, xrd_bucket] = [resources.bitcoin, XRD] + .map(ResourceManager) + .map(|mut resource_manager| { + resource_manager.mint_fungible(dec!(100), env).unwrap() + }); + + let OpenLiquidityPositionOutput { + pool_units, + adapter_specific_information, + .. + } = defiplaza_v2.adapter.open_liquidity_position( + defiplaza_v2.pools.bitcoin.try_into().unwrap(), + (bitcoin_bucket, xrd_bucket), + env, + )?; + + // Act + let CloseLiquidityPositionOutput { fees, .. } = + defiplaza_v2.adapter.close_liquidity_position( + defiplaza_v2.pools.bitcoin.try_into().unwrap(), + pool_units.into_values().collect(), + adapter_specific_information, + env, + )?; + + // Assert + assert!(fees.values().all(|value| *value == Decimal::ZERO)); + + Ok(()) +} + +#[test] +fn a_swap_with_xrd_input_produces_xrd_fees() -> Result<(), RuntimeError> { + // Arrange + let Environment { + environment: ref mut env, + mut defiplaza_v2, + resources, + .. + } = ScryptoTestEnv::new()?; + + let [bitcoin_bucket, xrd_bucket] = [resources.bitcoin, XRD] + .map(ResourceManager) + .map(|mut resource_manager| { + resource_manager.mint_fungible(dec!(100), env).unwrap() + }); + + let OpenLiquidityPositionOutput { + pool_units, + adapter_specific_information, + .. + } = defiplaza_v2.adapter.open_liquidity_position( + defiplaza_v2.pools.bitcoin.try_into().unwrap(), + (bitcoin_bucket, xrd_bucket), + env, + )?; + + let _ = ResourceManager(XRD) + .mint_fungible(dec!(100_000), env) + .and_then(|bucket| defiplaza_v2.pools.bitcoin.swap(bucket, env))?; + + // Act + let CloseLiquidityPositionOutput { fees, .. } = + defiplaza_v2.adapter.close_liquidity_position( + defiplaza_v2.pools.bitcoin.try_into().unwrap(), + pool_units.into_values().collect(), + adapter_specific_information, + env, + )?; + + // Assert + assert_eq!(*fees.get(&resources.bitcoin).unwrap(), dec!(0)); + assert_ne!(*fees.get(&XRD).unwrap(), dec!(0)); + + Ok(()) +} + +#[test] +fn a_swap_with_btc_input_produces_btc_fees() -> Result<(), RuntimeError> { + // Arrange + let Environment { + environment: ref mut env, + mut defiplaza_v2, + resources, + .. + } = ScryptoTestEnv::new()?; + + let [bitcoin_bucket, xrd_bucket] = [resources.bitcoin, XRD] + .map(ResourceManager) + .map(|mut resource_manager| { + resource_manager.mint_fungible(dec!(100), env).unwrap() + }); + + let OpenLiquidityPositionOutput { + pool_units, + adapter_specific_information, + .. + } = defiplaza_v2.adapter.open_liquidity_position( + defiplaza_v2.pools.bitcoin.try_into().unwrap(), + (bitcoin_bucket, xrd_bucket), + env, + )?; + + let _ = ResourceManager(resources.bitcoin) + .mint_fungible(dec!(100_000), env) + .and_then(|bucket| defiplaza_v2.pools.bitcoin.swap(bucket, env))?; + + // Act + let CloseLiquidityPositionOutput { fees, .. } = + defiplaza_v2.adapter.close_liquidity_position( + defiplaza_v2.pools.bitcoin.try_into().unwrap(), + pool_units.into_values().collect(), + adapter_specific_information, + env, + )?; + + // Assert + assert_ne!(*fees.get(&resources.bitcoin).unwrap(), dec!(0)); + assert_eq!(*fees.get(&XRD).unwrap(), dec!(0)); + + Ok(()) +}