diff --git a/tests/simapp/ante.go b/tests/simapp/ante.go new file mode 100644 index 0000000..a478fe0 --- /dev/null +++ b/tests/simapp/ante.go @@ -0,0 +1,48 @@ +package simapp + +import ( + errorsmod "cosmossdk.io/errors" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + authante "github.com/cosmos/cosmos-sdk/x/auth/ante" +) + +// HandlerOptions are the options required for constructing an SDK AnteHandler with the fee market injected. +type HandlerOptions struct { + BaseOptions authante.HandlerOptions +} + +// NewAnteHandler returns an AnteHandler that checks and increments sequence +// numbers, checks signatures & account numbers, and deducts fees from the first +// signer. +func NewAnteHandler(options HandlerOptions) (sdk.AnteHandler, error) { + if options.BaseOptions.AccountKeeper == nil { + return nil, errorsmod.Wrap(sdkerrors.ErrLogic, "account keeper is required for ante builder") + } + + if options.BaseOptions.BankKeeper == nil { + return nil, errorsmod.Wrap(sdkerrors.ErrLogic, "bank keeper is required for ante builder") + } + + if options.BaseOptions.SignModeHandler == nil { + return nil, errorsmod.Wrap(sdkerrors.ErrLogic, "sign mode handler is required for ante builder") + } + + anteDecorators := []sdk.AnteDecorator{ + authante.NewSetUpContextDecorator(), // outermost AnteDecorator. SetUpContext must be called first + authante.NewExtensionOptionsDecorator(options.BaseOptions.ExtensionOptionChecker), + authante.NewValidateBasicDecorator(), + authante.NewTxTimeoutHeightDecorator(), + authante.NewValidateMemoDecorator(options.BaseOptions.AccountKeeper), + authante.NewConsumeGasForTxSizeDecorator(options.BaseOptions.AccountKeeper), + authante.NewDeductFeeDecorator(options.BaseOptions.AccountKeeper, options.BaseOptions.BankKeeper, options.BaseOptions.FeegrantKeeper, options.BaseOptions.TxFeeChecker), + authante.NewSetPubKeyDecorator(options.BaseOptions.AccountKeeper), // SetPubKeyDecorator must be called before all signature verification decorators + authante.NewValidateSigCountDecorator(options.BaseOptions.AccountKeeper), + authante.NewSigGasConsumeDecorator(options.BaseOptions.AccountKeeper, options.BaseOptions.SigGasConsumer), + authante.NewSigVerificationDecorator(options.BaseOptions.AccountKeeper, options.BaseOptions.SignModeHandler), + authante.NewIncrementSequenceDecorator(options.BaseOptions.AccountKeeper), + } + + return sdk.ChainAnteDecorators(anteDecorators...), nil +} diff --git a/tests/simapp/app.go b/tests/simapp/app.go index 28d052f..6fb5f3b 100644 --- a/tests/simapp/app.go +++ b/tests/simapp/app.go @@ -24,6 +24,7 @@ import ( storetypes "github.com/cosmos/cosmos-sdk/store/types" "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/auth/ante" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" _ "github.com/cosmos/cosmos-sdk/x/auth/tx/config" // import for side-effects "github.com/cosmos/cosmos-sdk/x/auth/vesting" @@ -258,6 +259,26 @@ func NewSimApp( app.App = appBuilder.Build(logger, db, traceStore, baseAppOptions...) + // ---------------------------------------------------------------------------- // + // ------------------------- Begin Custom Code -------------------------------- // + // ---------------------------------------------------------------------------- // + + handlerOptions := ante.HandlerOptions{ + AccountKeeper: app.AccountKeeper, + BankKeeper: app.BankKeeper, + FeegrantKeeper: app.FeeGrantKeeper, + SigGasConsumer: ante.DefaultSigVerificationGasConsumer, + SignModeHandler: app.txConfig.SignModeHandler(), + } + options := HandlerOptions{ + BaseOptions: handlerOptions, + } + anteHandler, err := NewAnteHandler(options) + if err != nil { + panic(err) + } + app.App.SetAnteHandler(anteHandler) + /**** Module Options ****/ app.ModuleManager.RegisterInvariants(app.CrisisKeeper) diff --git a/x/feemarket/ante/expected_keepers.go b/x/feemarket/ante/expected_keepers.go new file mode 100644 index 0000000..bd31753 --- /dev/null +++ b/x/feemarket/ante/expected_keepers.go @@ -0,0 +1,27 @@ +package ante + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth/types" +) + +// AccountKeeper defines the contract needed for AccountKeeper related APIs. +// Interface provides support to use non-sdk AccountKeeper for AnteHandler's decorators. +type AccountKeeper interface { + GetParams(ctx sdk.Context) (params types.Params) + GetAccount(ctx sdk.Context, addr sdk.AccAddress) types.AccountI + SetAccount(ctx sdk.Context, acc types.AccountI) + GetModuleAddress(moduleName string) sdk.AccAddress +} + +// FeegrantKeeper defines the expected feegrant keeper. +type FeegrantKeeper interface { + UseGrantedFees(ctx sdk.Context, granter, grantee sdk.AccAddress, fee sdk.Coins, msgs []sdk.Msg) error +} + +// BankKeeper defines the contract needed for supply related APIs (noalias) +type BankKeeper interface { + IsSendEnabledCoins(ctx sdk.Context, coins ...sdk.Coin) error + SendCoins(ctx sdk.Context, from, to sdk.AccAddress, amt sdk.Coins) error + SendCoinsFromAccountToModule(ctx sdk.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error +}