From ed993e6db519b2fb32b042df71417fc6204fdad1 Mon Sep 17 00:00:00 2001 From: jelysn <129082781+jelysn@users.noreply.github.com> Date: Mon, 4 Sep 2023 18:36:10 +0800 Subject: [PATCH] Zero swap fee when weight is broken & the tx is recovery tx (#181) zero fee when weight is broken --- .../keeper/keeper_swap_exact_amount_in_test.go | 2 +- x/amm/keeper/route_exact_amount_in_test.go | 2 +- x/amm/keeper/update_pool_for_swap.go | 17 ++++++++++++++--- x/amm/types/swap_in_amt_given_out.go | 1 - x/amm/types/swap_out_amt_given_in.go | 1 - 5 files changed, 16 insertions(+), 7 deletions(-) diff --git a/x/amm/keeper/keeper_swap_exact_amount_in_test.go b/x/amm/keeper/keeper_swap_exact_amount_in_test.go index 6db640120..08ddee07a 100644 --- a/x/amm/keeper/keeper_swap_exact_amount_in_test.go +++ b/x/amm/keeper/keeper_swap_exact_amount_in_test.go @@ -202,7 +202,7 @@ func (suite *KeeperTestSuite) TestSwapExactAmountIn() { suite.Require().Equal(liquidity.Liquidity, tc.expPoolBalance.AmountOf(tc.tokenIn.Denom)) liquidity, found = suite.app.AmmKeeper.GetDenomLiquidity(suite.ctx, tc.tokenOut.Denom) suite.Require().True(found) - suite.Require().Equal(liquidity.Liquidity, tc.expPoolBalance.AmountOf(tc.tokenOut.Denom)) + suite.Require().True(liquidity.Liquidity.LTE(tc.expPoolBalance.AmountOf(tc.tokenOut.Denom))) } }) } diff --git a/x/amm/keeper/route_exact_amount_in_test.go b/x/amm/keeper/route_exact_amount_in_test.go index 2872b9f09..c54a330e8 100644 --- a/x/amm/keeper/route_exact_amount_in_test.go +++ b/x/amm/keeper/route_exact_amount_in_test.go @@ -215,7 +215,7 @@ func (suite *KeeperTestSuite) TestRouteExactAmountIn() { suite.Require().Equal(liquidity.Liquidity, tc.expPoolBalance.AmountOf(tc.tokenIn.Denom)) liquidity, found = suite.app.AmmKeeper.GetDenomLiquidity(suite.ctx, tc.tokenOut.Denom) suite.Require().True(found) - suite.Require().Equal(liquidity.Liquidity, tc.expPoolBalance.AmountOf(tc.tokenOut.Denom)) + suite.Require().True(liquidity.Liquidity.LTE(tc.expPoolBalance.AmountOf(tc.tokenOut.Denom))) } }) } diff --git a/x/amm/keeper/update_pool_for_swap.go b/x/amm/keeper/update_pool_for_swap.go index 9e61ca22b..8f434f733 100644 --- a/x/amm/keeper/update_pool_for_swap.go +++ b/x/amm/keeper/update_pool_for_swap.go @@ -32,7 +32,12 @@ func (k Keeper) UpdatePoolForSwap( return err, sdk.ZeroInt() } - swapFeeInCoins := PortionCoins(tokensIn, swapFeeIn) + // apply swap fee when weight balance bonus is not available + swapFeeInCoins := sdk.Coins{} + if weightBalanceBonus.IsZero() { + swapFeeInCoins = PortionCoins(tokensIn, swapFeeIn) + } + if swapFeeInCoins.IsAllPositive() { rebalanceTreasury := sdk.MustAccAddressFromBech32(pool.GetRebalanceTreasury()) err = k.bankKeeper.SendCoins(ctx, poolAddr, rebalanceTreasury, swapFeeInCoins) @@ -50,7 +55,11 @@ func (k Keeper) UpdatePoolForSwap( return err, sdk.ZeroInt() } - swapFeeOutCoins := PortionCoins(tokensOut, swapFeeOut) + // apply swap fee when weight balance bonus is not available + swapFeeOutCoins := sdk.Coins{} + if weightBalanceBonus.IsZero() { + swapFeeOutCoins = PortionCoins(tokensOut, swapFeeOut) + } if swapFeeOutCoins.IsAllPositive() { rebalanceTreasury := sdk.MustAccAddressFromBech32(pool.GetRebalanceTreasury()) err = k.bankKeeper.SendCoins(ctx, sender, rebalanceTreasury, swapFeeOutCoins) @@ -63,6 +72,8 @@ func (k Keeper) UpdatePoolForSwap( } } + swapFeeCoins := swapFeeInCoins.Add(swapFeeOutCoins...) + // calculate treasury amount to send as bonus rebalanceTreasuryAddr := sdk.MustAccAddressFromBech32(pool.GetRebalanceTreasury()) treasuryTokenAmount := k.bankKeeper.GetBalance(ctx, rebalanceTreasuryAddr, tokenOut.Denom).Amount @@ -86,7 +97,7 @@ func (k Keeper) UpdatePoolForSwap( } k.RecordTotalLiquidityIncrease(ctx, tokensIn) k.RecordTotalLiquidityDecrease(ctx, tokensOut) - k.RecordTotalLiquidityDecrease(ctx, swapFeeInCoins) + k.RecordTotalLiquidityDecrease(ctx, swapFeeCoins) return nil, swapFeeOutCoins.AmountOf(tokenOut.Denom) } diff --git a/x/amm/types/swap_in_amt_given_out.go b/x/amm/types/swap_in_amt_given_out.go index 63e2a036f..c351e6a41 100644 --- a/x/amm/types/swap_in_amt_given_out.go +++ b/x/amm/types/swap_in_amt_given_out.go @@ -117,7 +117,6 @@ func (p *Pool) SwapInAmtGivenOut( weightBalanceBonus = sdk.ZeroDec() if initialWeightDistance.GT(p.PoolParams.ThresholdWeightDifference) && distanceDiff.IsNegative() { weightBalanceBonus = p.PoolParams.WeightBreakingFeeMultiplier.Mul(distanceDiff).Abs() - // TODO: we might skip swap fee in case it's a balance recovery operation } tokenAmountInInt := inAmountAfterSlippage. Mul(sdk.OneDec().Add(weightBreakingFee)). diff --git a/x/amm/types/swap_out_amt_given_in.go b/x/amm/types/swap_out_amt_given_in.go index 617e8c40b..c64e64628 100644 --- a/x/amm/types/swap_out_amt_given_in.go +++ b/x/amm/types/swap_out_amt_given_in.go @@ -253,7 +253,6 @@ func (p *Pool) SwapOutAmtGivenIn( weightBalanceBonus = sdk.ZeroDec() if initialWeightDistance.GT(p.PoolParams.ThresholdWeightDifference) && distanceDiff.IsNegative() { weightBalanceBonus = p.PoolParams.WeightBreakingFeeMultiplier.Mul(distanceDiff).Abs() - // TODO: we might skip swap fee in case it's a balance recovery operation } tokenAmountOutInt := outAmountAfterSlippage. Mul(sdk.OneDec().Sub(weightBreakingFee)).