From f1cb574733b17d292fdcacf80f52b27abf8ce00e Mon Sep 17 00:00:00 2001 From: Michael Tsitrin Date: Tue, 21 Jan 2025 11:08:00 +0200 Subject: [PATCH] first sell tokens, than charge fee --- x/iro/keeper/trade.go | 16 ++++++++-------- x/iro/types/bonding_curve.go | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/x/iro/keeper/trade.go b/x/iro/keeper/trade.go index 6c5124ba9..9beab62cb 100644 --- a/x/iro/keeper/trade.go +++ b/x/iro/keeper/trade.go @@ -215,14 +215,6 @@ func (k Keeper) Sell(ctx sdk.Context, planId string, seller sdk.AccAddress, amou return errorsmod.Wrapf(types.ErrInvalidMinCost, "minCost: %s, cost: %s, fee: %s", minIncomeAmt.String(), costAmt.String(), takerFeeAmt.String()) } - // Charge taker fee - takerFee := sdk.NewCoin(appparams.BaseDenom, takerFeeAmt) - owner := k.rk.MustGetRollappOwner(ctx, plan.RollappId) - err = k.chargeTakerFee(ctx, takerFee, seller, &owner) - if err != nil { - return err - } - // send allocated tokens from seller to the plan err = k.BK.SendCoinsFromAccountToModule(ctx, seller, types.ModuleName, sdk.NewCoins(sdk.NewCoin(plan.TotalAllocation.Denom, amountTokensToSell))) if err != nil { @@ -240,6 +232,14 @@ func (k Keeper) Sell(ctx sdk.Context, planId string, seller sdk.AccAddress, amou plan.SoldAmt = plan.SoldAmt.Sub(amountTokensToSell) k.SetPlan(ctx, *plan) + // Charge taker fee + takerFee := sdk.NewCoin(appparams.BaseDenom, takerFeeAmt) + owner := k.rk.MustGetRollappOwner(ctx, plan.RollappId) + err = k.chargeTakerFee(ctx, takerFee, seller, &owner) + if err != nil { + return err + } + // Emit event err = uevent.EmitTypedEvent(ctx, &types.EventSell{ Seller: seller.String(), diff --git a/x/iro/types/bonding_curve.go b/x/iro/types/bonding_curve.go index 2b2ea8210..f97adaf90 100644 --- a/x/iro/types/bonding_curve.go +++ b/x/iro/types/bonding_curve.go @@ -164,13 +164,13 @@ func (lbc BondingCurve) TokensApproximation(startingX, spendTokens math.LegacyDe // Newton-Raphson iteration epsilonDec := math.LegacyNewDecWithPrec(1, epsilonPrecision) for i := 0; i < maxIterations; i++ { - fx := f(x) + fx := f(x) // diff between spendTokens and the actual cost to get to x // If the function converges, return the result if fx.Abs().LT(epsilonDec) { return x, i, nil } prevX := x - fPrimex := fPrime(x) + fPrimex := fPrime(x) // price for new X // defensive check to avoid division by zero // not supposed to happen, as spotPriceInternal should never return 0