Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
### Improvements

- (flags) [#23](https://github.com/EscanBE/evermint/pull/23) ~~Change default gas adjustment to 1.2 and~~ update default value of some flags (backport #22), partially reverted by [#27](https://github.com/EscanBE/evermint/pull/27)
- (fee) [#38](https://github.com/EscanBE/evermint/pull/38) Reject cosmos txs that fee denom is not evm denom (backport #37)

### Bug Fixes

Expand Down
25 changes: 22 additions & 3 deletions app/ante/cosmos/min_price.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,22 +31,28 @@ func (mpd MinGasPriceDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate
return ctx, errorsmod.Wrapf(errortypes.ErrInvalidType, "invalid transaction type %T, expected sdk.FeeTx", tx)
}

feeCoins := feeTx.GetFee()
evmParams := mpd.evmKeeper.GetParams(ctx)
evmDenom := evmParams.GetEvmDenom()

if !isNoFeeProvidedOrOnlyEvmDenom(feeCoins, evmDenom) {
return ctx, errorsmod.Wrapf(errortypes.ErrInvalidCoins, "fee can only be %s", evmDenom)
}

minGasPrice := mpd.feesKeeper.GetParams(ctx).MinGasPrice

// Short-circuit if min gas price is 0 or if simulating
if minGasPrice.IsZero() || simulate {
return next(ctx, tx, simulate)
}
evmParams := mpd.evmKeeper.GetParams(ctx)
evmDenom := evmParams.GetEvmDenom()

minGasPrices := sdk.DecCoins{
{
Denom: evmDenom,
Amount: minGasPrice,
},
}

feeCoins := feeTx.GetFee()
gas := feeTx.GetGas()

requiredFees := make(sdk.Coins, 0)
Expand Down Expand Up @@ -78,3 +84,16 @@ func (mpd MinGasPriceDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate

return next(ctx, tx, simulate)
}

// isNoFeeProvidedOrOnlyEvmDenom returns true if fees is empty or only accept one fee denom which is the evm denom
func isNoFeeProvidedOrOnlyEvmDenom(fees sdk.Coins, evmDenom string) bool {
if len(fees) == 0 {
return true
}

if len(fees) > 1 {
return false
}

return fees[0].Denom == evmDenom
}
58 changes: 53 additions & 5 deletions app/ante/cosmos/min_price_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package cosmos_test

import (
sdkmath "cosmossdk.io/math"
"fmt"
cosmosante "github.com/EscanBE/evermint/v12/app/ante/cosmos"
"github.com/EscanBE/evermint/v12/constants"
"github.com/EscanBE/evermint/v12/rename_chain/marker"
Expand Down Expand Up @@ -105,8 +106,8 @@ func (suite *AnteTestSuite) TestMinGasPriceDecorator() {
true,
},
{
"invalid cosmos tx with wrong denom",
func() sdk.Tx {
name: "invalid cosmos tx with wrong denom",
malleate: func() sdk.Tx {
params := suite.app.FeeMarketKeeper.GetParams(suite.ctx)
params.MinGasPrice = sdk.NewDec(10)
err := suite.app.FeeMarketKeeper.SetParams(suite.ctx, params)
Expand All @@ -115,9 +116,56 @@ func (suite *AnteTestSuite) TestMinGasPriceDecorator() {
txBuilder := suite.CreateTestCosmosTxBuilder(sdkmath.NewInt(10), "stake", &testMsg)
return txBuilder.GetTx()
},
false,
"provided fee < minimum global fee",
true,
expPass: false,
errMsg: fmt.Sprintf("fee can only be %s", constants.BaseDenom),
allowPassOnSimulate: false,
},
{
name: "valid cosmos tx but wrong fee denom",
malleate: func() sdk.Tx {
params := suite.app.FeeMarketKeeper.GetParams(suite.ctx)
params.MinGasPrice = sdk.NewDec(10)
err := suite.app.FeeMarketKeeper.SetParams(suite.ctx, params)
suite.Require().NoError(err)

txBuilder := suite.CreateTestCosmosTxBuilder(sdkmath.NewInt(10), "stake", &testMsg)
txBuilder.SetFeeAmount(sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(20))))
return txBuilder.GetTx()
},
expPass: false,
errMsg: fmt.Sprintf("fee can only be %s", constants.BaseDenom),
allowPassOnSimulate: false,
},
{
name: "valid cosmos tx, multiple fee and contains at least one is wrong fee denom",
malleate: func() sdk.Tx {
params := suite.app.FeeMarketKeeper.GetParams(suite.ctx)
params.MinGasPrice = sdk.NewDec(10)
err := suite.app.FeeMarketKeeper.SetParams(suite.ctx, params)
suite.Require().NoError(err)

txBuilder := suite.CreateTestCosmosTxBuilder(sdkmath.NewInt(10), "stake", &testMsg)
txBuilder.SetFeeAmount(sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(20)), sdk.NewCoin(constants.BaseDenom, sdkmath.NewInt(20))))
return txBuilder.GetTx()
},
expPass: false,
errMsg: fmt.Sprintf("fee can only be %s", constants.BaseDenom),
allowPassOnSimulate: false,
},
{
name: "valid cosmos tx, insufficient fee",
malleate: func() sdk.Tx {
params := suite.app.FeeMarketKeeper.GetParams(suite.ctx)
params.MinGasPrice = sdk.NewDec(10)
err := suite.app.FeeMarketKeeper.SetParams(suite.ctx, params)
suite.Require().NoError(err)

txBuilder := suite.CreateTestCosmosTxBuilder(sdkmath.NewInt(1), constants.BaseDenom, &testMsg)
return txBuilder.GetTx()
},
expPass: false,
errMsg: "provided fee < minimum global fee",
allowPassOnSimulate: true,
},
}

Expand Down