|
9 | 9 |
|
10 | 10 | "github.com/gorilla/mux"
|
11 | 11 | "github.com/rakyll/statik/fs"
|
| 12 | + feemarketkeeper "github.com/skip-mev/feemarket/x/feemarket/keeper" |
12 | 13 | "github.com/spf13/cast"
|
13 | 14 |
|
14 | 15 | // unnamed import of statik for swagger UI support
|
@@ -56,7 +57,6 @@ import (
|
56 | 57 | "github.com/cosmos/gaia/v18/app/params"
|
57 | 58 | "github.com/cosmos/gaia/v18/app/upgrades"
|
58 | 59 | v18 "github.com/cosmos/gaia/v18/app/upgrades/v18"
|
59 |
| - "github.com/cosmos/gaia/v18/x/globalfee" |
60 | 60 | )
|
61 | 61 |
|
62 | 62 | var (
|
@@ -223,20 +223,34 @@ func NewGaiaApp(
|
223 | 223 | SignModeHandler: encodingConfig.TxConfig.SignModeHandler(),
|
224 | 224 | SigGasConsumer: ante.DefaultSigVerificationGasConsumer,
|
225 | 225 | },
|
226 |
| - Codec: appCodec, |
227 |
| - IBCkeeper: app.IBCKeeper, |
228 |
| - GlobalFeeSubspace: app.GetSubspace(globalfee.ModuleName), |
229 |
| - StakingKeeper: app.StakingKeeper, |
230 |
| - // If TxFeeChecker is nil the default ante TxFeeChecker is used |
231 |
| - // so we use this no-op to keep the global fee module behaviour unchanged |
232 |
| - TxFeeChecker: noOpTxFeeChecker, |
| 226 | + Codec: appCodec, |
| 227 | + IBCkeeper: app.IBCKeeper, |
| 228 | + StakingKeeper: app.StakingKeeper, |
| 229 | + FeeMarketKeeper: app.FeeMarketKeeper, |
| 230 | + TxFeeChecker: func(ctx sdk.Context, tx sdk.Tx) (sdk.Coins, int64, error) { |
| 231 | + return minTxFeesChecker(ctx, tx, *app.FeeMarketKeeper) |
| 232 | + }, |
233 | 233 | },
|
234 | 234 | )
|
235 | 235 | if err != nil {
|
236 | 236 | panic(fmt.Errorf("failed to create AnteHandler: %s", err))
|
237 | 237 | }
|
238 | 238 |
|
| 239 | + postHandlerOptions := PostHandlerOptions{ |
| 240 | + AccountKeeper: app.AccountKeeper, |
| 241 | + BankKeeper: app.BankKeeper, |
| 242 | + FeeGrantKeeper: app.FeeGrantKeeper, |
| 243 | + FeeMarketKeeper: app.FeeMarketKeeper, |
| 244 | + } |
| 245 | + postHandler, err := NewPostHandler(postHandlerOptions) |
| 246 | + if err != nil { |
| 247 | + panic(err) |
| 248 | + } |
| 249 | + |
| 250 | + // set ante and post handlers |
239 | 251 | app.SetAnteHandler(anteHandler)
|
| 252 | + app.SetPostHandler(postHandler) |
| 253 | + |
240 | 254 | app.SetInitChainer(app.InitChainer)
|
241 | 255 | app.SetBeginBlocker(app.BeginBlocker)
|
242 | 256 | app.SetEndBlocker(app.EndBlocker)
|
@@ -442,13 +456,41 @@ func (ao EmptyAppOptions) Get(_ string) interface{} {
|
442 | 456 | return nil
|
443 | 457 | }
|
444 | 458 |
|
445 |
| -// noOpTxFeeChecker is an ante TxFeeChecker for the DeductFeeDecorator, see x/auth/ante/fee.go, |
446 |
| -// it performs a no-op by not checking tx fees and always returns a zero tx priority |
447 |
| -func noOpTxFeeChecker(_ sdk.Context, tx sdk.Tx) (sdk.Coins, int64, error) { |
| 459 | +// minTxFeesChecker will be executed only if the feemarket module is disabled. |
| 460 | +// In this case, the auth module's DeductFeeDecorator is executed, and |
| 461 | +// we use the minTxFeesChecker to enforce the minimum transaction fees. |
| 462 | +// Min tx fees are calculated as gas_limit * feemarket_min_base_gas_price |
| 463 | +func minTxFeesChecker(ctx sdk.Context, tx sdk.Tx, feemarketKp feemarketkeeper.Keeper) (sdk.Coins, int64, error) { |
448 | 464 | feeTx, ok := tx.(sdk.FeeTx)
|
449 | 465 | if !ok {
|
450 | 466 | return nil, 0, errorsmod.Wrap(sdkerrors.ErrTxDecode, "Tx must be a FeeTx")
|
451 | 467 | }
|
452 | 468 |
|
| 469 | + // To keep the gentxs with zero fees, we need to skip the validation in the first block |
| 470 | + if ctx.BlockHeight() == 0 { |
| 471 | + return feeTx.GetFee(), 0, nil |
| 472 | + } |
| 473 | + |
| 474 | + feeMarketParams, err := feemarketKp.GetParams(ctx) |
| 475 | + if err != nil { |
| 476 | + return nil, 0, err |
| 477 | + } |
| 478 | + |
| 479 | + feeRequired := sdk.NewCoins( |
| 480 | + sdk.NewCoin( |
| 481 | + feeMarketParams.FeeDenom, |
| 482 | + feeMarketParams.MinBaseGasPrice.MulInt(sdk.NewIntFromUint64(feeTx.GetGas())).Ceil().RoundInt())) |
| 483 | + |
| 484 | + feeCoins := feeTx.GetFee() |
| 485 | + if len(feeCoins) != 1 { |
| 486 | + return nil, 0, fmt.Errorf( |
| 487 | + "expected exactly one fee coin; got %s, required: %s", feeCoins.String(), feeRequired.String()) |
| 488 | + } |
| 489 | + |
| 490 | + if !feeCoins.IsAnyGTE(feeRequired) { |
| 491 | + return nil, 0, fmt.Errorf( |
| 492 | + "not enough fees provided; got %s, required: %s", feeCoins.String(), feeRequired.String()) |
| 493 | + } |
| 494 | + |
453 | 495 | return feeTx.GetFee(), 0, nil
|
454 | 496 | }
|
0 commit comments