Skip to content

Commit

Permalink
refactor: update logic check burn amount
Browse files Browse the repository at this point in the history
  • Loading branch information
hoanguyenkh committed Jan 31, 2023
1 parent b3b3bee commit 40ae284
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 7 deletions.
2 changes: 0 additions & 2 deletions x/feeburn/keeper/evm_hooks.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package keeper

import (
"fmt"
"github.com/AstraProtocol/astra/v2/cmd/config"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/ethereum/go-ethereum/core"
Expand Down Expand Up @@ -45,7 +44,6 @@ func (k Keeper) PostTxProcessing(

totalFeeAmount := sdk.NewIntFromUint64(receipt.GasUsed).Mul(sdk.NewIntFromBigInt(msg.GasPrice()))
totalFees := sdk.Coins{{Denom: config.BaseDenom, Amount: totalFeeAmount}}
fmt.Println("evm total fee", totalFees)
err := k.BurnFee(ctx, k.bankKeeper, totalFees, params)
if err != nil {
return err
Expand Down
5 changes: 3 additions & 2 deletions x/feeburn/keeper/fee_burn.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package keeper

import (
"github.com/AstraProtocol/astra/v2/cmd/config"
feeburntype "github.com/AstraProtocol/astra/v2/x/feeburn/types"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
"strings"
)

// BurnFee takes the total fees and burn 50% (or param set)
Expand All @@ -22,12 +24,11 @@ func (k Keeper) BurnFee(ctx sdk.Context, bankKeeper feeburntype.BankKeeper,
totalBurnAmount := sdk.NewDec(0)
for _, c := range totalFees {
burnAmount := params.FeeBurn.MulInt(c.Amount).RoundInt()
if !burnAmount.IsZero() {
if burnAmount.IsPositive() && strings.Compare(c.Denom, config.BaseDenom) == 0 {
feeBurn = feeBurn.Add(sdk.NewCoin(c.Denom, burnAmount))
totalBurnAmount = totalBurnAmount.Add(burnAmount.ToDec())
}
}

err := bankKeeper.SendCoinsFromModuleToModule(ctx, authtypes.FeeCollectorName, feeburntype.ModuleName, feeBurn)
if err != nil {
return sdkerrors.Wrapf(err, feeburntype.ErrFeeBurnSend.Error())
Expand Down
70 changes: 67 additions & 3 deletions x/feeburn/keeper/fee_burn_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,19 +39,83 @@ func (suite *KeeperTestSuite) TestBurnSuccess() {
newParams := suite.app.FeeBurnKeeper.GetParams(suite.ctx)
newParams.FeeBurn = sdk.NewDec(int64(j)).Quo(sdk.NewDec(int64(10)))
suite.app.FeeBurnKeeper.SetParams(suite.ctx, newParams)
for i := 1; i < 10000; i++ {
for i := 0; i < 10000; i++ {
params := suite.app.FeeBurnKeeper.GetParams(suite.ctx)
totalFees := sdk.Coins{{Denom: config.BaseDenom, Amount: sdk.NewInt(int64(i))}}
supplyBefore := suite.app.BankKeeper.GetSupply(suite.ctx, config.BaseDenom)
totalFeeBurnBefore := suite.app.FeeBurnKeeper.GetTotalFeeBurn(suite.ctx)
// send coin to feecollector module
err := suite.app.BankKeeper.SendCoinsFromModuleToModule(suite.ctx, minttypes.ModuleName, authtypes.FeeCollectorName, totalFees)
if i > 0 {
err := suite.app.BankKeeper.SendCoinsFromModuleToModule(suite.ctx, minttypes.ModuleName, authtypes.FeeCollectorName, totalFees)
suite.Require().NoError(err)
}
err := suite.app.FeeBurnKeeper.BurnFee(suite.ctx, suite.app.BankKeeper, totalFees, params)
suite.Require().NoError(err)
err = suite.app.FeeBurnKeeper.BurnFee(suite.ctx, suite.app.BankKeeper, totalFees, params)
totalFeeBurnAfter := suite.app.FeeBurnKeeper.GetTotalFeeBurn(suite.ctx)
supplyAfter := suite.app.BankKeeper.GetSupply(suite.ctx, config.BaseDenom)
totalFeeBurn := params.FeeBurn.MulInt(sdk.NewInt(int64(i))).RoundInt()
suite.Require().Equal(supplyBefore.Amount.Sub(totalFeeBurn), supplyAfter.Amount)
suite.Require().Equal(true, totalFeeBurn.ToDec().Equal(totalFeeBurnAfter.Sub(totalFeeBurnBefore)))
}
}
}

func (suite *KeeperTestSuite) TestBurnWhenFeeNegative() {
for j := 0; j < 10; j++ {
newParams := suite.app.FeeBurnKeeper.GetParams(suite.ctx)
newParams.FeeBurn = sdk.NewDec(int64(j)).Quo(sdk.NewDec(int64(10)))
suite.app.FeeBurnKeeper.SetParams(suite.ctx, newParams)
for i := 0; i < 10000; i++ {
params := suite.app.FeeBurnKeeper.GetParams(suite.ctx)
totalFeesNegative := sdk.Coins{{Denom: config.BaseDenom, Amount: sdk.NewInt(int64(-i))}}
totalFees := sdk.Coins{{Denom: config.BaseDenom, Amount: sdk.NewInt(int64(i))}}
supplyBefore := suite.app.BankKeeper.GetSupply(suite.ctx, config.BaseDenom)
totalFeeBurnBefore := suite.app.FeeBurnKeeper.GetTotalFeeBurn(suite.ctx)
// send coin to feecollector module
if i > 0 {
err := suite.app.BankKeeper.SendCoinsFromModuleToModule(suite.ctx, minttypes.ModuleName, authtypes.FeeCollectorName, totalFees)
suite.Require().NoError(err)
}
err := suite.app.FeeBurnKeeper.BurnFee(suite.ctx, suite.app.BankKeeper, totalFeesNegative, params)
suite.Require().NoError(err)
totalFeeBurnAfter := suite.app.FeeBurnKeeper.GetTotalFeeBurn(suite.ctx)
supplyAfter := suite.app.BankKeeper.GetSupply(suite.ctx, config.BaseDenom)

// when fee is negative then fee burn is zero
totalFeeBurn := params.FeeBurn.MulInt(sdk.NewInt(int64(0))).RoundInt()
suite.Require().Equal(supplyBefore.Amount.Sub(totalFeeBurn), supplyAfter.Amount)
suite.Require().Equal(true, totalFeeBurn.ToDec().Equal(totalFeeBurnAfter.Sub(totalFeeBurnBefore)))
}
}
}

func (suite *KeeperTestSuite) TestBurnWhenManyFeeDenom() {
for j := 0; j < 10; j++ {
newParams := suite.app.FeeBurnKeeper.GetParams(suite.ctx)
newParams.FeeBurn = sdk.NewDec(int64(j)).Quo(sdk.NewDec(int64(10)))
suite.app.FeeBurnKeeper.SetParams(suite.ctx, newParams)
for i := 0; i < 10000; i++ {
params := suite.app.FeeBurnKeeper.GetParams(suite.ctx)
denom := config.BaseDenom
if i%2 == 0 {
denom = "test"
}
totalFees := sdk.Coins{{Denom: denom, Amount: sdk.NewInt(int64(i))}}
supplyBefore := suite.app.BankKeeper.GetSupply(suite.ctx, config.BaseDenom)
totalFeeBurnBefore := suite.app.FeeBurnKeeper.GetTotalFeeBurn(suite.ctx)
// send coin to feecollector module
if i%2 == 1 {
err := suite.app.BankKeeper.SendCoinsFromModuleToModule(suite.ctx, minttypes.ModuleName, authtypes.FeeCollectorName, totalFees)
suite.Require().NoError(err)
}
err := suite.app.FeeBurnKeeper.BurnFee(suite.ctx, suite.app.BankKeeper, totalFees, params)
suite.Require().NoError(err)
totalFeeBurnAfter := suite.app.FeeBurnKeeper.GetTotalFeeBurn(suite.ctx)
supplyAfter := suite.app.BankKeeper.GetSupply(suite.ctx, config.BaseDenom)
totalFeeBurn := params.FeeBurn.MulInt(sdk.NewInt(int64(i))).RoundInt()
if i%2 == 0 {
totalFeeBurn = params.FeeBurn.MulInt(sdk.NewInt(int64(0))).RoundInt()
}
suite.Require().Equal(supplyBefore.Amount.Sub(totalFeeBurn), supplyAfter.Amount)
suite.Require().Equal(true, totalFeeBurn.ToDec().Equal(totalFeeBurnAfter.Sub(totalFeeBurnBefore)))
}
Expand Down

0 comments on commit 40ae284

Please sign in to comment.