Skip to content

Commit 0d2e9ac

Browse files
authored
Merge branch 'master' into aleem/8754-reverse-iteration
2 parents 91ab261 + 025d226 commit 0d2e9ac

15 files changed

+161
-294
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
6565
* (x/bank) [\#8517](https://github.com/cosmos/cosmos-sdk/pull/8517) `SupplyI` interface and `Supply` are removed and uses `sdk.Coins` for supply tracking
6666
* (x/upgrade) [\#8743](https://github.com/cosmos/cosmos-sdk/pull/8743) `UpgradeHandler` includes a new argument `VersionMap` which helps facilitate in-place migrations.
6767
* (x/auth) [\#8129](https://github.com/cosmos/cosmos-sdk/pull/8828) Updated `SigVerifiableTx.GetPubKeys` method signature to return error.
68+
* [\#8682](https://github.com/cosmos/cosmos-sdk/pull/8682) `ante.NewAnteHandler` updated to receive all positional params as `ante.HandlerOptions` struct. If required fields aren't set, throws error accordingly.
6869

6970

7071
### State Machine Breaking

simapp/app.go

+15-6
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ import (
5656
evidencekeeper "github.com/cosmos/cosmos-sdk/x/evidence/keeper"
5757
evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types"
5858
feegrant "github.com/cosmos/cosmos-sdk/x/feegrant"
59-
feegrantante "github.com/cosmos/cosmos-sdk/x/feegrant/ante"
6059
feegrantkeeper "github.com/cosmos/cosmos-sdk/x/feegrant/keeper"
6160
feegranttypes "github.com/cosmos/cosmos-sdk/x/feegrant/types"
6261
"github.com/cosmos/cosmos-sdk/x/genutil"
@@ -375,12 +374,22 @@ func NewSimApp(
375374
// initialize BaseApp
376375
app.SetInitChainer(app.InitChainer)
377376
app.SetBeginBlocker(app.BeginBlocker)
378-
app.SetAnteHandler(
379-
feegrantante.NewAnteHandler(
380-
app.AccountKeeper, app.BankKeeper, app.FeeGrantKeeper, ante.DefaultSigVerificationGasConsumer,
381-
encodingConfig.TxConfig.SignModeHandler(),
382-
),
377+
378+
anteHandler, err := ante.NewAnteHandler(
379+
ante.HandlerOptions{
380+
AccountKeeper: app.AccountKeeper,
381+
BankKeeper: app.BankKeeper,
382+
SignModeHandler: encodingConfig.TxConfig.SignModeHandler(),
383+
FeegrantKeeper: app.FeeGrantKeeper,
384+
SigGasConsumer: ante.DefaultSigVerificationGasConsumer,
385+
},
383386
)
387+
388+
if err != nil {
389+
panic(err)
390+
}
391+
392+
app.SetAnteHandler(anteHandler)
384393
app.SetEndBlocker(app.EndBlocker)
385394

386395
if loadLatest {

x/auth/ante/ante.go

+42-17
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,57 @@ package ante
22

33
import (
44
sdk "github.com/cosmos/cosmos-sdk/types"
5-
"github.com/cosmos/cosmos-sdk/x/auth/signing"
5+
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
6+
"github.com/cosmos/cosmos-sdk/types/tx/signing"
7+
authsigning "github.com/cosmos/cosmos-sdk/x/auth/signing"
68
"github.com/cosmos/cosmos-sdk/x/auth/types"
79
)
810

11+
// HandlerOptions are the options required for constructing a default SDK AnteHandler.
12+
type HandlerOptions struct {
13+
AccountKeeper AccountKeeper
14+
BankKeeper types.BankKeeper
15+
FeegrantKeeper FeegrantKeeper
16+
SignModeHandler authsigning.SignModeHandler
17+
SigGasConsumer func(meter sdk.GasMeter, sig signing.SignatureV2, params types.Params) error
18+
}
19+
920
// NewAnteHandler returns an AnteHandler that checks and increments sequence
1021
// numbers, checks signatures & account numbers, and deducts fees from the first
1122
// signer.
12-
func NewAnteHandler(
13-
ak AccountKeeper, bankKeeper types.BankKeeper,
14-
sigGasConsumer SignatureVerificationGasConsumer,
15-
signModeHandler signing.SignModeHandler,
16-
) sdk.AnteHandler {
17-
return sdk.ChainAnteDecorators(
23+
func NewAnteHandler(options HandlerOptions) (sdk.AnteHandler, error) {
24+
if options.AccountKeeper == nil {
25+
return nil, sdkerrors.Wrap(sdkerrors.ErrLogic, "account keeper is required for ante builder")
26+
}
27+
28+
if options.BankKeeper == nil {
29+
return nil, sdkerrors.Wrap(sdkerrors.ErrLogic, "bank keeper is required for ante builder")
30+
}
31+
32+
if options.SignModeHandler == nil {
33+
return nil, sdkerrors.Wrap(sdkerrors.ErrLogic, "sign mode handler is required for ante builder")
34+
}
35+
36+
var sigGasConsumer = options.SigGasConsumer
37+
if sigGasConsumer == nil {
38+
sigGasConsumer = DefaultSigVerificationGasConsumer
39+
}
40+
41+
anteDecorators := []sdk.AnteDecorator{
1842
NewSetUpContextDecorator(), // outermost AnteDecorator. SetUpContext must be called first
1943
NewRejectExtensionOptionsDecorator(),
2044
NewMempoolFeeDecorator(),
2145
NewValidateBasicDecorator(),
2246
TxTimeoutHeightDecorator{},
23-
NewValidateMemoDecorator(ak),
24-
NewConsumeGasForTxSizeDecorator(ak),
25-
NewRejectFeeGranterDecorator(),
26-
NewSetPubKeyDecorator(ak), // SetPubKeyDecorator must be called before all signature verification decorators
27-
NewValidateSigCountDecorator(ak),
28-
NewDeductFeeDecorator(ak, bankKeeper),
29-
NewSigGasConsumeDecorator(ak, sigGasConsumer),
30-
NewSigVerificationDecorator(ak, signModeHandler),
31-
NewIncrementSequenceDecorator(ak),
32-
)
47+
NewValidateMemoDecorator(options.AccountKeeper),
48+
NewConsumeGasForTxSizeDecorator(options.AccountKeeper),
49+
NewDeductFeeDecorator(options.AccountKeeper, options.BankKeeper, options.FeegrantKeeper),
50+
NewSetPubKeyDecorator(options.AccountKeeper), // SetPubKeyDecorator must be called before all signature verification decorators
51+
NewValidateSigCountDecorator(options.AccountKeeper),
52+
NewSigGasConsumeDecorator(options.AccountKeeper, sigGasConsumer),
53+
NewSigVerificationDecorator(options.AccountKeeper, options.SignModeHandler),
54+
NewIncrementSequenceDecorator(options.AccountKeeper),
55+
}
56+
57+
return sdk.ChainAnteDecorators(anteDecorators...), nil
3358
}

x/auth/ante/ante_test.go

+20-9
Original file line numberDiff line numberDiff line change
@@ -1010,15 +1010,26 @@ func (suite *AnteTestSuite) TestCustomSignatureVerificationGasConsumer() {
10101010
suite.SetupTest(false) // setup
10111011

10121012
// setup an ante handler that only accepts PubKeyEd25519
1013-
suite.anteHandler = ante.NewAnteHandler(suite.app.AccountKeeper, suite.app.BankKeeper, func(meter sdk.GasMeter, sig signing.SignatureV2, params types.Params) error {
1014-
switch pubkey := sig.PubKey.(type) {
1015-
case *ed25519.PubKey:
1016-
meter.ConsumeGas(params.SigVerifyCostED25519, "ante verify: ed25519")
1017-
return nil
1018-
default:
1019-
return sdkerrors.Wrapf(sdkerrors.ErrInvalidPubKey, "unrecognized public key type: %T", pubkey)
1020-
}
1021-
}, suite.clientCtx.TxConfig.SignModeHandler())
1013+
anteHandler, err := ante.NewAnteHandler(
1014+
ante.HandlerOptions{
1015+
AccountKeeper: suite.app.AccountKeeper,
1016+
BankKeeper: suite.app.BankKeeper,
1017+
FeegrantKeeper: suite.app.FeeGrantKeeper,
1018+
SignModeHandler: suite.clientCtx.TxConfig.SignModeHandler(),
1019+
SigGasConsumer: func(meter sdk.GasMeter, sig signing.SignatureV2, params types.Params) error {
1020+
switch pubkey := sig.PubKey.(type) {
1021+
case *ed25519.PubKey:
1022+
meter.ConsumeGas(params.SigVerifyCostED25519, "ante verify: ed25519")
1023+
return nil
1024+
default:
1025+
return sdkerrors.Wrapf(sdkerrors.ErrInvalidPubKey, "unrecognized public key type: %T", pubkey)
1026+
}
1027+
},
1028+
},
1029+
)
1030+
1031+
suite.Require().NoError(err)
1032+
suite.anteHandler = anteHandler
10221033

10231034
// Same data for every test cases
10241035
accounts := suite.CreateTestAccounts(1)

x/auth/ante/expected_keepers.go

+5
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,8 @@ type AccountKeeper interface {
1313
SetAccount(ctx sdk.Context, acc types.AccountI)
1414
GetModuleAddress(moduleName string) sdk.AccAddress
1515
}
16+
17+
// FeegrantKeeper defines the expected feegrant keeper.
18+
type FeegrantKeeper interface {
19+
UseGrantedFees(ctx sdk.Context, granter, grantee sdk.AccAddress, fee sdk.Coins) error
20+
}

x/auth/ante/fee.go

+31-9
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,16 @@ func (mfd MempoolFeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate b
5959
// Call next AnteHandler if fees successfully deducted
6060
// CONTRACT: Tx must implement FeeTx interface to use DeductFeeDecorator
6161
type DeductFeeDecorator struct {
62-
ak AccountKeeper
63-
bankKeeper types.BankKeeper
62+
ak AccountKeeper
63+
bankKeeper types.BankKeeper
64+
feegrantKeeper FeegrantKeeper
6465
}
6566

66-
func NewDeductFeeDecorator(ak AccountKeeper, bk types.BankKeeper) DeductFeeDecorator {
67+
func NewDeductFeeDecorator(ak AccountKeeper, bk types.BankKeeper, fk FeegrantKeeper) DeductFeeDecorator {
6768
return DeductFeeDecorator{
68-
ak: ak,
69-
bankKeeper: bk,
69+
ak: ak,
70+
bankKeeper: bk,
71+
feegrantKeeper: fk,
7072
}
7173
}
7274

@@ -80,16 +82,36 @@ func (dfd DeductFeeDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bo
8082
panic(fmt.Sprintf("%s module account has not been set", types.FeeCollectorName))
8183
}
8284

85+
fee := feeTx.GetFee()
8386
feePayer := feeTx.FeePayer()
84-
feePayerAcc := dfd.ak.GetAccount(ctx, feePayer)
87+
feeGranter := feeTx.FeeGranter()
8588

86-
if feePayerAcc == nil {
87-
return ctx, sdkerrors.Wrapf(sdkerrors.ErrUnknownAddress, "fee payer address: %s does not exist", feePayer)
89+
deductFeesFrom := feePayer
90+
91+
// if feegranter set deduct fee from feegranter account.
92+
// this works with only when feegrant enabled.
93+
if feeGranter != nil {
94+
if dfd.feegrantKeeper == nil {
95+
return ctx, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "fee grants are not enabled")
96+
} else if !feeGranter.Equals(feePayer) {
97+
err := dfd.feegrantKeeper.UseGrantedFees(ctx, feeGranter, feePayer, fee)
98+
99+
if err != nil {
100+
return ctx, sdkerrors.Wrapf(err, "%s not allowed to pay fees from %s", feeGranter, feePayer)
101+
}
102+
}
103+
104+
deductFeesFrom = feeGranter
105+
}
106+
107+
deductFeesFromAcc := dfd.ak.GetAccount(ctx, deductFeesFrom)
108+
if deductFeesFromAcc == nil {
109+
return ctx, sdkerrors.Wrapf(sdkerrors.ErrUnknownAddress, "fee payer address: %s does not exist", deductFeesFrom)
88110
}
89111

90112
// deduct the fees
91113
if !feeTx.GetFee().IsZero() {
92-
err = DeductFees(dfd.bankKeeper, ctx, feePayerAcc, feeTx.GetFee())
114+
err = DeductFees(dfd.bankKeeper, ctx, deductFeesFromAcc, feeTx.GetFee())
93115
if err != nil {
94116
return ctx, err
95117
}

x/auth/ante/fee_grant.go

-27
This file was deleted.

x/auth/ante/fee_grant_test.go

-32
This file was deleted.

x/auth/ante/fee_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ func (suite *AnteTestSuite) TestDeductFees() {
8686
err = simapp.FundAccount(suite.app, suite.ctx, addr1, coins)
8787
suite.Require().NoError(err)
8888

89-
dfd := ante.NewDeductFeeDecorator(suite.app.AccountKeeper, suite.app.BankKeeper)
89+
dfd := ante.NewDeductFeeDecorator(suite.app.AccountKeeper, suite.app.BankKeeper, nil)
9090
antehandler := sdk.ChainAnteDecorators(dfd)
9191

9292
_, err = antehandler(suite.ctx, tx, false)

0 commit comments

Comments
 (0)