refactor(x/auth): use transaction service (#19967)

This commit is contained in:
Julien Robert 2024-04-10 20:47:12 +02:00 committed by GitHub
parent 76bb0cd7e0
commit 17bb4c74fb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
20 changed files with 157 additions and 50 deletions

View File

@ -9,7 +9,7 @@ type ExecMode uint8
// For backwards compatibility and easier casting, the exec mode values must be the same as in cosmos/cosmos-sdk/types package.
const (
ExecModeCheck ExecMode = iota
_
ExecModeReCheck
ExecModeSimulate
_
_

View File

@ -37,9 +37,9 @@ func NewAnteHandler(options HandlerOptions) (sdk.AnteHandler, error) {
ante.NewSetUpContextDecorator(), // outermost AnteDecorator. SetUpContext must be called first
circuitante.NewCircuitBreakerDecorator(options.CircuitKeeper),
ante.NewExtensionOptionsDecorator(options.ExtensionOptionChecker),
ante.NewValidateBasicDecorator(),
ante.NewValidateBasicDecorator(options.AccountKeeper.Environment()),
ante.NewTxTimeoutHeightDecorator(),
ante.NewUnorderedTxDecorator(unorderedtx.DefaultMaxUnOrderedTTL, options.TxManager),
ante.NewUnorderedTxDecorator(unorderedtx.DefaultMaxUnOrderedTTL, options.TxManager, options.AccountKeeper.Environment()),
ante.NewValidateMemoDecorator(options.AccountKeeper),
ante.NewConsumeGasForTxSizeDecorator(options.AccountKeeper),
ante.NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper, options.TxFeeChecker),

View File

@ -198,8 +198,10 @@ var (
Config: appconfig.WrapAny(&slashingmodulev1.Module{}),
},
{
Name: "tx",
Config: appconfig.WrapAny(&txconfigv1.Config{}),
Name: "tx",
Config: appconfig.WrapAny(&txconfigv1.Config{
SkipAnteHandler: true, // SimApp is using non default AnteHandler such as circuit and unorderedtx decorators
}),
},
{
Name: genutiltypes.ModuleName,

View File

@ -16,6 +16,7 @@ import (
"cosmossdk.io/log"
storetypes "cosmossdk.io/store/types"
"cosmossdk.io/x/auth"
"cosmossdk.io/x/auth/ante"
"cosmossdk.io/x/auth/ante/unorderedtx"
authkeeper "cosmossdk.io/x/auth/keeper"
authsims "cosmossdk.io/x/auth/simulation"
@ -292,6 +293,9 @@ func NewSimApp(
}
}
// set custom ante handlers
app.setCustomAnteHandler()
if err := app.Load(loadLatest); err != nil {
panic(err)
}
@ -299,6 +303,30 @@ func NewSimApp(
return app
}
// overwritte default ante handlers with custom ante handlers
// set SkipAnteHandler to true in app config and set custom ante handler on baseapp
func (app *SimApp) setCustomAnteHandler() {
anteHandler, err := NewAnteHandler(
HandlerOptions{
ante.HandlerOptions{
AccountKeeper: app.AuthKeeper,
BankKeeper: app.BankKeeper,
SignModeHandler: app.txConfig.SignModeHandler(),
FeegrantKeeper: app.FeeGrantKeeper,
SigGasConsumer: ante.DefaultSigVerificationGasConsumer,
},
&app.CircuitBreakerKeeper,
app.UnorderedTxManager,
},
)
if err != nil {
panic(err)
}
// Set the AnteHandler for the app
app.SetAnteHandler(anteHandler)
}
// Close implements the Application interface and closes all necessary application
// resources.
func (app *SimApp) Close() error {

View File

@ -77,10 +77,10 @@ func (c Context) Logger() log.Logger { return c.logge
func (c Context) VoteInfos() []abci.VoteInfo { return c.voteInfo }
func (c Context) GasMeter() storetypes.GasMeter { return c.gasMeter }
func (c Context) BlockGasMeter() storetypes.GasMeter { return c.blockGasMeter }
func (c Context) IsCheckTx() bool { return c.checkTx } // Deprecated: use execMode instead
func (c Context) IsReCheckTx() bool { return c.recheckTx } // Deprecated: use execMode instead
func (c Context) IsCheckTx() bool { return c.checkTx } // Deprecated: use core/transaction service instead
func (c Context) IsReCheckTx() bool { return c.recheckTx } // Deprecated: use core/transaction service instead
func (c Context) IsSigverifyTx() bool { return c.sigverifyTx }
func (c Context) ExecMode() ExecMode { return c.execMode }
func (c Context) ExecMode() ExecMode { return c.execMode } // Deprecated: use core/transaction service instead
func (c Context) MinGasPrices() DecCoins { return c.minGasPrice }
func (c Context) EventManager() EventManagerI { return c.eventManager }
func (c Context) Priority() int64 { return c.priority }

View File

@ -33,6 +33,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
### Improvements
* [#19967](https://github.com/cosmos/cosmos-sdk/pull/19967) Refactor ante handlers to use `transaction.Service` for getting exec mode.
* [#18780](https://github.com/cosmos/cosmos-sdk/pull/18780) Move sig verification out of the for loop, into the authenticate method.
* [#19188](https://github.com/cosmos/cosmos-sdk/pull/19188) Remove creation of `BaseAccount` when sending a message to an account that does not exist.
* When signing a transaction with an account that has not been created accountnumber 0 must be used

View File

@ -42,7 +42,7 @@ func NewAnteHandler(options HandlerOptions) (sdk.AnteHandler, error) {
anteDecorators := []sdk.AnteDecorator{
NewSetUpContextDecorator(), // outermost AnteDecorator. SetUpContext must be called first
NewExtensionOptionsDecorator(options.ExtensionOptionChecker),
NewValidateBasicDecorator(),
NewValidateBasicDecorator(options.AccountKeeper.Environment()),
NewTxTimeoutHeightDecorator(),
NewValidateMemoDecorator(options.AccountKeeper),
NewConsumeGasForTxSizeDecorator(options.AccountKeeper),

View File

@ -1,6 +1,8 @@
package ante
import (
"cosmossdk.io/core/appmodule/v2"
"cosmossdk.io/core/transaction"
errorsmod "cosmossdk.io/errors"
storetypes "cosmossdk.io/store/types"
"cosmossdk.io/x/auth/migrations/legacytx"
@ -18,15 +20,20 @@ import (
// If ValidateBasic passes, decorator calls next AnteHandler in chain. Note,
// ValidateBasicDecorator decorator will not get executed on ReCheckTx since it
// is not dependent on application state.
type ValidateBasicDecorator struct{}
type ValidateBasicDecorator struct {
env appmodule.Environment
}
func NewValidateBasicDecorator() ValidateBasicDecorator {
return ValidateBasicDecorator{}
func NewValidateBasicDecorator(env appmodule.Environment) ValidateBasicDecorator {
return ValidateBasicDecorator{
env: env,
}
}
func (vbd ValidateBasicDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, _ bool, next sdk.AnteHandler) (sdk.Context, error) {
// no need to validate basic on recheck tx, call next antehandler
if ctx.ExecMode() == sdk.ExecModeReCheck {
txService := vbd.env.TransactionService
if txService.ExecMode(ctx) == transaction.ExecModeReCheck {
return next(ctx, tx, false)
}
@ -36,7 +43,7 @@ func (vbd ValidateBasicDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, _ bool,
}
}
return next(ctx, tx, ctx.ExecMode() == sdk.ExecModeSimulate)
return next(ctx, tx, false)
}
// ValidateMemoDecorator will validate memo given the parameters passed in
@ -69,7 +76,7 @@ func (vmd ValidateMemoDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, _ bool,
}
}
return next(ctx, tx, ctx.ExecMode() == sdk.ExecModeSimulate)
return next(ctx, tx, false)
}
// ConsumeTxSizeGasDecorator will take in parameters and consume gas proportional
@ -101,7 +108,8 @@ func (cgts ConsumeTxSizeGasDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, _ b
ctx.GasMeter().ConsumeGas(params.TxSizeCostPerByte*storetypes.Gas(len(ctx.TxBytes())), "txSize")
// simulate gas cost for signatures in simulate mode
if ctx.ExecMode() == sdk.ExecModeSimulate {
txService := cgts.ak.Environment().TransactionService
if txService.ExecMode(ctx) == transaction.ExecModeSimulate {
// in simulate mode, each element should be a nil signature
sigs, err := sigTx.GetSignaturesV2()
if err != nil {
@ -143,7 +151,7 @@ func (cgts ConsumeTxSizeGasDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, _ b
}
}
return next(ctx, tx, ctx.ExecMode() == sdk.ExecModeSimulate)
return next(ctx, tx, false)
}
// isIncompleteSignature tests whether SignatureData is fully filled in for simulation purposes
@ -206,5 +214,5 @@ func (txh TxTimeoutHeightDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, _ boo
)
}
return next(ctx, tx, ctx.ExecMode() == sdk.ExecModeSimulate)
return next(ctx, tx, false)
}

View File

@ -36,7 +36,7 @@ func TestValidateBasic(t *testing.T) {
invalidTx, err := suite.CreateTestTx(suite.ctx, privs, accNums, accSeqs, suite.ctx.ChainID(), signing.SignMode_SIGN_MODE_DIRECT)
require.NoError(t, err)
vbd := ante.NewValidateBasicDecorator()
vbd := ante.NewValidateBasicDecorator(suite.accountKeeper.Environment())
antehandler := sdk.ChainAnteDecorators(vbd)
_, err = antehandler(suite.ctx, invalidTx, false)

View File

@ -4,11 +4,16 @@ import (
"context"
"cosmossdk.io/core/address"
"cosmossdk.io/core/appmodule"
"cosmossdk.io/x/auth/types"
sdk "github.com/cosmos/cosmos-sdk/types"
)
type HasEnvironment interface {
Environment() appmodule.Environment
}
// AccountKeeper defines the contract needed for AccountKeeper related APIs.
// Interface provides support to use non-sdk AccountKeeper for AnteHandler's decorators.
type AccountKeeper interface {
@ -16,8 +21,9 @@ type AccountKeeper interface {
GetAccount(ctx context.Context, addr sdk.AccAddress) sdk.AccountI
SetAccount(ctx context.Context, acc sdk.AccountI)
GetModuleAddress(moduleName string) sdk.AccAddress
AddressCodec() address.Codec
NewAccountWithAddress(ctx context.Context, addr sdk.AccAddress) sdk.AccountI
AddressCodec() address.Codec
Environment() appmodule.Environment
}
// FeegrantKeeper defines the expected feegrant keeper.

View File

@ -0,0 +1,12 @@
package ante
import (
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
sdk "github.com/cosmos/cosmos-sdk/types"
)
var SimSecp256k1PubkeyInternal = simSecp256k1Pubkey
func SetSVDPubKey(svd SigVerificationDecorator, ctx sdk.Context, acc sdk.AccountI, txPubKey cryptotypes.PubKey) error {
return svd.setPubKey(ctx, acc, txPubKey)
}

View File

@ -49,7 +49,7 @@ func (r RejectExtensionOptionsDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx,
return ctx, err
}
return next(ctx, tx, ctx.ExecMode() == sdk.ExecModeSimulate)
return next(ctx, tx, false)
}
func checkExtOpts(tx sdk.Tx, checker ExtensionOptionChecker) error {

View File

@ -4,6 +4,7 @@ import (
"bytes"
"fmt"
"cosmossdk.io/core/transaction"
errorsmod "cosmossdk.io/errors"
"cosmossdk.io/x/auth/types"
@ -45,7 +46,9 @@ func (dfd DeductFeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, _ bool, nex
return ctx, errorsmod.Wrap(sdkerrors.ErrTxDecode, "Tx must be a FeeTx")
}
if ctx.ExecMode() != sdk.ExecModeSimulate && ctx.BlockHeight() > 0 && feeTx.GetGas() == 0 {
txService := dfd.accountKeeper.Environment().TransactionService
execMode := txService.ExecMode(ctx)
if execMode != transaction.ExecModeSimulate && ctx.BlockHeight() > 0 && feeTx.GetGas() == 0 {
return ctx, errorsmod.Wrap(sdkerrors.ErrInvalidGasLimit, "must provide positive gas")
}
@ -55,7 +58,7 @@ func (dfd DeductFeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, _ bool, nex
)
fee := feeTx.GetFee()
if ctx.ExecMode() != sdk.ExecModeSimulate {
if execMode != transaction.ExecModeSimulate {
fee, priority, err = dfd.txFeeChecker(ctx, tx)
if err != nil {
return ctx, err
@ -67,7 +70,7 @@ func (dfd DeductFeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, _ bool, nex
newCtx := ctx.WithPriority(priority)
return next(newCtx, tx, ctx.ExecMode() == sdk.ExecModeSimulate)
return next(newCtx, tx, false)
}
func (dfd DeductFeeDecorator) checkDeductFee(ctx sdk.Context, sdkTx sdk.Tx, fee sdk.Coins) error {

View File

@ -67,14 +67,14 @@ func (sud SetUpContextDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, _ bool,
}
}()
return next(newCtx, tx, ctx.ExecMode() == sdk.ExecModeSimulate)
return next(newCtx, tx, false)
}
// SetGasMeter returns a new context with a gas meter set from a given context.
func SetGasMeter(ctx sdk.Context, gasLimit uint64) sdk.Context {
// In various cases such as simulation and during the genesis block, we do not
// meter any gas utilization.
if ctx.ExecMode() == sdk.ExecModeSimulate || ctx.BlockHeight() == 0 {
if ctx.ExecMode() == sdk.ExecModeSimulate || ctx.BlockHeight() == 0 { // NOTE: using environment here breaks the API of SetGasMeter, an alternative must be found for server/v2. ref: https://github.com/cosmos/cosmos-sdk/issues/19640
return ctx.WithGasMeter(storetypes.NewInfiniteGasMeter())
}

View File

@ -10,6 +10,7 @@ import (
secp256k1dcrd "github.com/decred/dcrd/dcrec/secp256k1/v4"
"google.golang.org/protobuf/types/known/anypb"
"cosmossdk.io/core/transaction"
errorsmod "cosmossdk.io/errors"
storetypes "cosmossdk.io/store/types"
aa_interface_v1 "cosmossdk.io/x/accounts/interfaces/account_abstraction/v1"
@ -215,7 +216,7 @@ func (svd SigVerificationDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, _ boo
ctx.EventManager().EmitEvents(events)
return next(ctx, tx, ctx.ExecMode() == sdk.ExecModeSimulate)
return next(ctx, tx, false)
}
// authenticate the authentication of the TX for a specific tx signer.
@ -280,7 +281,7 @@ func (svd SigVerificationDecorator) consumeSignatureGas(
pubKey cryptotypes.PubKey,
signature signing.SignatureV2,
) error {
if ctx.ExecMode() == sdk.ExecModeSimulate && pubKey == nil {
if svd.ak.Environment().TransactionService.ExecMode(ctx) == transaction.ExecModeSimulate && pubKey == nil {
pubKey = simSecp256k1Pubkey
}
@ -310,7 +311,7 @@ func (svd SigVerificationDecorator) verifySig(ctx sdk.Context, tx sdk.Tx, acc sd
// we're in simulation mode, or in ReCheckTx, or context is not
// on sig verify tx, then we do not need to verify the signatures
// in the tx.
if ctx.ExecMode() == sdk.ExecModeSimulate || ctx.IsReCheckTx() || !ctx.IsSigverifyTx() {
if svd.ak.Environment().TransactionService.ExecMode(ctx) == transaction.ExecModeSimulate || ctx.IsReCheckTx() || !ctx.IsSigverifyTx() {
return nil
}
@ -384,7 +385,7 @@ func (svd SigVerificationDecorator) setPubKey(ctx sdk.Context, acc sdk.AccountI,
if txPubKey == nil {
// if we're not in simulation mode, and we do not have a valid pubkey
// for this signer, then we simply error.
if ctx.ExecMode() != sdk.ExecModeSimulate {
if svd.ak.Environment().TransactionService.ExecMode(ctx) != transaction.ExecModeSimulate {
return fmt.Errorf("the account %s is without a pubkey and did not provide a pubkey in the tx to set it", acc.GetAddress().String())
}
// if we're in simulation mode, then we can populate the pubkey with the
@ -479,7 +480,7 @@ func (vscd ValidateSigCountDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, _ b
}
}
return next(ctx, tx, ctx.ExecMode() == sdk.ExecModeSimulate)
return next(ctx, tx, false)
}
// DefaultSigVerificationGasConsumer is the default implementation of SignatureVerificationGasConsumer. It consumes gas

View File

@ -1,10 +1,14 @@
package ante
package ante_test
import (
"context"
"testing"
"github.com/stretchr/testify/require"
"cosmossdk.io/core/appmodule"
"cosmossdk.io/core/transaction"
"cosmossdk.io/x/auth/ante"
authcodec "cosmossdk.io/x/auth/codec"
authtypes "cosmossdk.io/x/auth/types"
@ -12,8 +16,26 @@ import (
sdk "github.com/cosmos/cosmos-sdk/types"
)
type mockAccount struct {
ante.AccountKeeper
}
func (*mockAccount) Environment() appmodule.Environment {
return appmodule.Environment{
TransactionService: &mockTransactionService{},
}
}
type mockTransactionService struct {
transaction.Service
}
func (*mockTransactionService) ExecMode(ctx context.Context) transaction.ExecMode {
return transaction.ExecMode(sdk.UnwrapSDKContext(ctx).ExecMode())
}
func TestSigVerify_setPubKey(t *testing.T) {
svd := SigVerificationDecorator{}
svd := ante.NewSigVerificationDecorator(&mockAccount{}, nil, nil, nil)
alicePk := secp256k1.GenPrivKey().PubKey()
bobPk := secp256k1.GenPrivKey().PubKey()
@ -28,22 +50,22 @@ func TestSigVerify_setPubKey(t *testing.T) {
t.Run("on not sig verify tx - skip", func(t *testing.T) {
acc := &authtypes.BaseAccount{}
ctx = ctx.WithExecMode(sdk.ExecModeSimulate).WithIsSigverifyTx(false)
err := svd.setPubKey(ctx, acc, nil)
err := ante.SetSVDPubKey(svd, ctx, acc, nil)
require.NoError(t, err)
})
t.Run("on sim, populate with sim key, if pubkey is nil", func(t *testing.T) {
acc := &authtypes.BaseAccount{Address: aliceAddr}
ctx = ctx.WithExecMode(sdk.ExecModeSimulate).WithIsSigverifyTx(true)
err := svd.setPubKey(ctx, acc, nil)
err := ante.SetSVDPubKey(svd, ctx, acc, nil)
require.NoError(t, err)
require.Equal(t, acc.PubKey.GetCachedValue(), simSecp256k1Pubkey)
require.Equal(t, acc.PubKey.GetCachedValue(), ante.SimSecp256k1PubkeyInternal)
})
t.Run("on sim, populate with real pub key, if pubkey is not nil", func(t *testing.T) {
acc := &authtypes.BaseAccount{Address: aliceAddr}
ctx = ctx.WithExecMode(sdk.ExecModeSimulate).WithIsSigverifyTx(true)
err := svd.setPubKey(ctx, acc, alicePk)
err := ante.SetSVDPubKey(svd, ctx, acc, alicePk)
require.NoError(t, err)
require.Equal(t, acc.PubKey.GetCachedValue(), alicePk)
})
@ -51,7 +73,7 @@ func TestSigVerify_setPubKey(t *testing.T) {
t.Run("not on sim, populate the address", func(t *testing.T) {
acc := &authtypes.BaseAccount{Address: aliceAddr}
ctx = ctx.WithExecMode(sdk.ExecModeFinalize).WithIsSigverifyTx(true)
err := svd.setPubKey(ctx, acc, alicePk)
err := ante.SetSVDPubKey(svd, ctx, acc, alicePk)
require.NoError(t, err)
require.Equal(t, acc.PubKey.GetCachedValue(), alicePk)
})
@ -59,7 +81,7 @@ func TestSigVerify_setPubKey(t *testing.T) {
t.Run("not on sim, fail on invalid pubkey.address", func(t *testing.T) {
acc := &authtypes.BaseAccount{Address: aliceAddr}
ctx = ctx.WithExecMode(sdk.ExecModeFinalize).WithIsSigverifyTx(true)
err := svd.setPubKey(ctx, acc, bobPk)
err := ante.SetSVDPubKey(svd, ctx, acc, bobPk)
require.ErrorContains(t, err, "cannot be claimed")
})
}

View File

@ -3,6 +3,8 @@ package ante
import (
"crypto/sha256"
"cosmossdk.io/core/appmodule/v2"
"cosmossdk.io/core/transaction"
errorsmod "cosmossdk.io/errors"
"cosmossdk.io/x/auth/ante/unorderedtx"
@ -28,12 +30,14 @@ type UnorderedTxDecorator struct {
// maxUnOrderedTTL defines the maximum TTL a transaction can define.
maxUnOrderedTTL uint64
txManager *unorderedtx.Manager
env appmodule.Environment
}
func NewUnorderedTxDecorator(maxTTL uint64, m *unorderedtx.Manager) *UnorderedTxDecorator {
func NewUnorderedTxDecorator(maxTTL uint64, m *unorderedtx.Manager, env appmodule.Environment) *UnorderedTxDecorator {
return &UnorderedTxDecorator{
maxUnOrderedTTL: maxTTL,
txManager: m,
env: env,
}
}
@ -42,7 +46,7 @@ func (d *UnorderedTxDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, _ bool, ne
if !ok || !unorderedTx.GetUnordered() {
// If the transaction does not implement unordered capabilities or has the
// unordered value as false, we bypass.
return next(ctx, tx, ctx.ExecMode() == sdk.ExecModeSimulate)
return next(ctx, tx, false)
}
// TTL is defined as a specific block height at which this tx is no longer valid
@ -65,10 +69,10 @@ func (d *UnorderedTxDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, _ bool, ne
return ctx, errorsmod.Wrap(sdkerrors.ErrInvalidRequest, "tx %X is duplicated")
}
if ctx.ExecMode() == sdk.ExecModeFinalize {
if d.env.TransactionService.ExecMode(ctx) == transaction.ExecModeFinalize {
// a new tx included in the block, add the hash to the unordered tx manager
d.txManager.Add(txHash, ttl)
}
return next(ctx, tx, ctx.ExecMode() == sdk.ExecModeSimulate)
return next(ctx, tx, false)
}

View File

@ -23,7 +23,9 @@ func TestUnorderedTxDecorator_OrderedTx(t *testing.T) {
txm.Start()
chain := sdk.ChainAnteDecorators(ante.NewUnorderedTxDecorator(unorderedtx.DefaultMaxUnOrderedTTL, txm))
suite := SetupTestSuite(t, false)
chain := sdk.ChainAnteDecorators(ante.NewUnorderedTxDecorator(unorderedtx.DefaultMaxUnOrderedTTL, txm, suite.accountKeeper.Environment()))
tx, txBz := genUnorderedTx(t, false, 0)
ctx := sdk.Context{}.WithTxBytes(txBz).WithBlockHeight(100)
@ -40,7 +42,9 @@ func TestUnorderedTxDecorator_UnorderedTx_NoTTL(t *testing.T) {
txm.Start()
chain := sdk.ChainAnteDecorators(ante.NewUnorderedTxDecorator(unorderedtx.DefaultMaxUnOrderedTTL, txm))
suite := SetupTestSuite(t, false)
chain := sdk.ChainAnteDecorators(ante.NewUnorderedTxDecorator(unorderedtx.DefaultMaxUnOrderedTTL, txm, suite.accountKeeper.Environment()))
tx, txBz := genUnorderedTx(t, true, 0)
ctx := sdk.Context{}.WithTxBytes(txBz).WithBlockHeight(100)
@ -57,7 +61,9 @@ func TestUnorderedTxDecorator_UnorderedTx_InvalidTTL(t *testing.T) {
txm.Start()
chain := sdk.ChainAnteDecorators(ante.NewUnorderedTxDecorator(unorderedtx.DefaultMaxUnOrderedTTL, txm))
suite := SetupTestSuite(t, false)
chain := sdk.ChainAnteDecorators(ante.NewUnorderedTxDecorator(unorderedtx.DefaultMaxUnOrderedTTL, txm, suite.accountKeeper.Environment()))
tx, txBz := genUnorderedTx(t, true, 100+unorderedtx.DefaultMaxUnOrderedTTL+1)
ctx := sdk.Context{}.WithTxBytes(txBz).WithBlockHeight(100)
@ -74,7 +80,9 @@ func TestUnorderedTxDecorator_UnorderedTx_AlreadyExists(t *testing.T) {
txm.Start()
chain := sdk.ChainAnteDecorators(ante.NewUnorderedTxDecorator(unorderedtx.DefaultMaxUnOrderedTTL, txm))
suite := SetupTestSuite(t, false)
chain := sdk.ChainAnteDecorators(ante.NewUnorderedTxDecorator(unorderedtx.DefaultMaxUnOrderedTTL, txm, suite.accountKeeper.Environment()))
tx, txBz := genUnorderedTx(t, true, 150)
ctx := sdk.Context{}.WithTxBytes(txBz).WithBlockHeight(100)
@ -94,7 +102,9 @@ func TestUnorderedTxDecorator_UnorderedTx_ValidCheckTx(t *testing.T) {
txm.Start()
chain := sdk.ChainAnteDecorators(ante.NewUnorderedTxDecorator(unorderedtx.DefaultMaxUnOrderedTTL, txm))
suite := SetupTestSuite(t, false)
chain := sdk.ChainAnteDecorators(ante.NewUnorderedTxDecorator(unorderedtx.DefaultMaxUnOrderedTTL, txm, suite.accountKeeper.Environment()))
tx, txBz := genUnorderedTx(t, true, 150)
ctx := sdk.Context{}.WithTxBytes(txBz).WithBlockHeight(100).WithExecMode(sdk.ExecModeCheck)
@ -111,7 +121,9 @@ func TestUnorderedTxDecorator_UnorderedTx_ValidDeliverTx(t *testing.T) {
txm.Start()
chain := sdk.ChainAnteDecorators(ante.NewUnorderedTxDecorator(unorderedtx.DefaultMaxUnOrderedTTL, txm))
suite := SetupTestSuite(t, false)
chain := sdk.ChainAnteDecorators(ante.NewUnorderedTxDecorator(unorderedtx.DefaultMaxUnOrderedTTL, txm, suite.accountKeeper.Environment()))
tx, txBz := genUnorderedTx(t, true, 150)
ctx := sdk.Context{}.WithTxBytes(txBz).WithBlockHeight(100).WithExecMode(sdk.ExecModeFinalize)

View File

@ -24,7 +24,7 @@ func checkTxFeeWithValidatorMinGasPrices(ctx sdk.Context, tx sdk.Tx) (sdk.Coins,
// Ensure that the provided fees meet a minimum threshold for the validator,
// if this is a CheckTx. This is only for local mempool purposes, and thus
// is only ran on check tx.
if ctx.ExecMode() == sdk.ExecModeCheck {
if ctx.ExecMode() == sdk.ExecModeCheck { // NOTE: using environment here breaks the API of fee logic, an alternative must be found for server/v2. ref: https://github.com/cosmos/cosmos-sdk/issues/19640
minGasPrices := ctx.MinGasPrices()
if !minGasPrices.IsZero() {
requiredFees := make(sdk.Coins, len(minGasPrices))

View File

@ -53,6 +53,9 @@ type AccountKeeperI interface {
// AddressCodec returns the account address codec.
AddressCodec() address.Codec
// Environment returns the module's environment.
Environment() appmodule.Environment
}
func NewAccountIndexes(sb *collections.SchemaBuilder) AccountsIndexes {
@ -275,3 +278,8 @@ func (ak AccountKeeper) GetParams(ctx context.Context) (params types.Params) {
}
return params
}
// Environment returns the module's environment.
func (ak AccountKeeper) Environment() appmodule.Environment {
return ak.environment
}