package app import ( "errors" ibcante "github.com/cosmos/ibc-go/v8/modules/core/ante" "github.com/cosmos/ibc-go/v8/modules/core/keeper" circuitante "cosmossdk.io/x/circuit/ante" circuitkeeper "cosmossdk.io/x/circuit/keeper" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/auth/ante" stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" sdkmath "cosmossdk.io/math" poaante "github.com/strangelove-ventures/poa/ante" globalfeeante "github.com/strangelove-ventures/globalfee/x/globalfee/ante" globalfeekeeper "github.com/strangelove-ventures/globalfee/x/globalfee/keeper" ) // HandlerOptions extend the SDK's AnteHandler options by requiring the IBC // channel keeper. type HandlerOptions struct { ante.HandlerOptions IBCKeeper *keeper.Keeper CircuitKeeper *circuitkeeper.Keeper StakingKeeper *stakingkeeper.Keeper GlobalFeeKeeper globalfeekeeper.Keeper BypassMinFeeMsgTypes []string } // NewAnteHandler constructor func NewAnteHandler(options HandlerOptions) (sdk.AnteHandler, error) { if options.AccountKeeper == nil { return nil, errors.New("account keeper is required for ante builder") } if options.BankKeeper == nil { return nil, errors.New("bank keeper is required for ante builder") } if options.SignModeHandler == nil { return nil, errors.New("sign mode handler is required for ante builder") } if options.CircuitKeeper == nil { return nil, errors.New("circuit keeper is required for ante builder") } poaDoGenTxRateValidation := false poaRateFloor := sdkmath.LegacyMustNewDecFromStr("0.10") poaRateCeil := sdkmath.LegacyMustNewDecFromStr("0.50") anteDecorators := []sdk.AnteDecorator{ ante.NewSetUpContextDecorator(), // outermost AnteDecorator. SetUpContext must be called first circuitante.NewCircuitBreakerDecorator(options.CircuitKeeper), ante.NewExtensionOptionsDecorator(options.ExtensionOptionChecker), ante.NewValidateBasicDecorator(), ante.NewTxTimeoutHeightDecorator(), ante.NewValidateMemoDecorator(options.AccountKeeper), ante.NewConsumeGasForTxSizeDecorator(options.AccountKeeper), globalfeeante.NewFeeDecorator(options.BypassMinFeeMsgTypes, options.GlobalFeeKeeper, options.StakingKeeper, 2_000_000), // ante.NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper, options.TxFeeChecker), ante.NewSetPubKeyDecorator(options.AccountKeeper), // SetPubKeyDecorator must be called before all signature verification decorators ante.NewValidateSigCountDecorator(options.AccountKeeper), ante.NewSigGasConsumeDecorator(options.AccountKeeper, options.SigGasConsumer), ante.NewSigVerificationDecorator(options.AccountKeeper, options.SignModeHandler), ante.NewIncrementSequenceDecorator(options.AccountKeeper), ibcante.NewRedundantRelayDecorator(options.IBCKeeper), poaante.NewPOADisableStakingDecorator(), poaante.NewCommissionLimitDecorator(poaDoGenTxRateValidation, poaRateFloor, poaRateCeil), } return sdk.ChainAnteDecorators(anteDecorators...), nil }