Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: Mark tips as beta #12089

Merged
merged 9 commits into from
May 31, 2022
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,14 @@ Ref: https://keepachangelog.com/en/1.0.0/

* (cli) [#12028](https://github.com/cosmos/cosmos-sdk/pull/12028) Add the `tendermint key-migrate` to perform Tendermint v0.35 DB key migration.

### Improvements

* [#12089](https://github.com/cosmos/cosmos-sdk/pull/12089) Mark the `TipDecorator` as beta, don't include it in simapp by default.

### Bug Fixes

* (migrations) [#12028](https://github.com/cosmos/cosmos-sdk/pull/12028) Fix v0.45->v0.46 in-place store migrations.
* (baseapp) [#12089](https://github.com/cosmos/cosmos-sdk/pull/12089) Include antehandler and runMsgs events in SimulateTx.

## [v0.46.0-rc1](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.46.0-rc1) - 2022-05-23

Expand Down
8 changes: 4 additions & 4 deletions baseapp/baseapp.go
Original file line number Diff line number Diff line change
Expand Up @@ -707,11 +707,11 @@ func (app *BaseApp) runTx(mode runTxMode, txBytes []byte) (gInfo sdk.GasInfo, re
consumeBlockGas()

msCache.Write()
}

if len(anteEvents) > 0 {
// append the events in the order of occurrence
result.Events = append(anteEvents, result.Events...)
}
if len(anteEvents) > 0 && (mode == runTxModeDeliver || mode == runTxModeSimulate) {
// append the events in the order of occurrence
result.Events = append(anteEvents, result.Events...)
Comment on lines +712 to +714
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change fixes a SimulateTx test. When there's no posthandler, we were only returning runMsgs events in SimulateTx.

}
}

Expand Down
53 changes: 34 additions & 19 deletions docs/core/tips.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ order: 14

# Transaction Tips

Transaction tips are a mechanism to pay for transaction fees using another denom than the native fee denom of the chain. {synopsis}
Transaction tips are a mechanism to pay for transaction fees using another denom than the native fee denom of the chain. They are still in beta, and are not included by default in the SDK. {synopsis}

## Context

Expand Down Expand Up @@ -72,27 +72,42 @@ In both cases, using `SIGN_MODE_LEGACY_AMINO_JSON` is recommended only if hardwa

## Enabling Tips on your Chain

The transaction tips functionality is introduced in Cosmos SDK v0.46, so earlier versions do not have support for tips. If you're using v0.46 or later, then enabling tips on your chain is as simple as adding the `TipMiddleware` in your middleware stack:
The transaction tips functionality is introduced in Cosmos SDK v0.46, so earlier versions do not have support for tips. It is however not included by default in a v0.46 app. Enabling tips on your chain is done by adding the `TipDecorator` in your posthandler chain:

```go
// NewTxHandler defines a TxHandler middleware stack.
func NewTxHandler(options TxHandlerOptions) (tx.Handler, error) {
// --snip--

return ComposeMiddlewares(
// base tx handler that executes Msgs
NewRunMsgsTxHandler(options.MsgServiceRouter, options.LegacyRouter),
// --snip other middlewares--

// Add the TipMiddleware
NewTipMiddleware(options.BankKeeper),
)
// HandlerOptions are the options required for constructing a default SDK PostHandler.
type HandlerOptions struct {
BankKeeper types.BankKeeper
}
```

Notice that `NewTipMiddleware` needs a reference to the BankKeeper, for transferring the tip to the fee payer.
// MyPostHandler returns a posthandler chain with the TipDecorator.
func MyPostHandler(options HandlerOptions) (sdk.AnteHandler, error) {
if options.BankKeeper == nil {
return nil, sdkerrors.Wrap(sdkerrors.ErrLogic, "bank keeper is required for posthandler")
}

postDecorators := []sdk.AnteDecorator{
posthandler.NewTipDecorator(options.bankKeeper),
}

return sdk.ChainAnteDecorators(postDecorators...), nil
}

func (app *SimApp) setPostHandler() {
postHandler, err := MyPostHandler(
HandlerOptions{
BankKeeper: app.BankKeeper,
},
)
if err != nil {
panic(err)
}

app.SetPostHandler(postHandler)
}
```

If you are using the Cosmos SDK's default middleware stack `NewDefaultTxHandler()`, then the tip middleware is included by default.
Notice that `NewTipDecorator` needs a reference to the BankKeeper, for transferring the tip to the fee payer.

## CLI Usage

Expand Down Expand Up @@ -170,7 +185,7 @@ For the fee payer, the SDK added a new method on the existing `TxBuilder` to imp
txBuilder := clientCtx.TxConfig.NewTxBuilder()
err := txBuilder.AddAuxSignerData(auxSignerData)
if err != nil {
return err
return err
}

// A lot of fields will be populated in txBuilder, such as its Msgs, tip
Expand All @@ -184,6 +199,6 @@ txBuilder.SetGasLimit(...)
// Usual signing code
err = authclient.SignTx(...)
if err != nil {
return err
return err
}
```
11 changes: 2 additions & 9 deletions simapp/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -436,12 +436,7 @@ func NewSimApp(
// meaning that both `runMsgs` and `postHandler` state will be committed if
// both are successful, and both will be reverted if any of the two fails.
//
// The SDK exposes a default postHandlers chain, which comprises of only
// one decorator: the Transaction Tips decorator. However, some chains do
// not need it by default, so feel free to comment the next line if you do
// not need tips.
// To read more about tips:
// https://docs.cosmos.network/main/core/tips.html
// The SDK exposes a default empty postHandlers chain.
//
// Please note that changing any of the anteHandler or postHandler chain is
// likely to be a state-machine breaking change, which needs a coordinated
Expand Down Expand Up @@ -480,9 +475,7 @@ func (app *SimApp) setAnteHandler(txConfig client.TxConfig, indexEventsStr []str

func (app *SimApp) setPostHandler() {
postHandler, err := posthandler.NewPostHandler(
posthandler.HandlerOptions{
BankKeeper: app.BankKeeper,
},
posthandler.HandlerOptions{},
)
if err != nil {
panic(err)
Expand Down
3 changes: 3 additions & 0 deletions x/auth/client/testutil/suite.go
Original file line number Diff line number Diff line change
Expand Up @@ -1562,6 +1562,9 @@ func (s *IntegrationTestSuite) TestAuxSigner() {
}

func (s *IntegrationTestSuite) TestAuxToFeeWithTips() {
// Skipping this test as it needs a simapp with the TipDecorator in post handler.
s.T().Skip()

require := s.Require()
val := s.network.Validators[0]

Expand Down
18 changes: 3 additions & 15 deletions x/auth/posthandler/post.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,14 @@ package posthandler

import (
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
"github.com/cosmos/cosmos-sdk/x/auth/types"
)

// HandlerOptions are the options required for constructing a default SDK PostHandler.
type HandlerOptions struct {
BankKeeper types.BankKeeper
}
type HandlerOptions struct{}

// NewAnteHandler returns an AnteHandler that checks and increments sequence
// numbers, checks signatures & account numbers, and deducts fees from the first
// signer.
// NewPostHandler returns an empty posthandler chain.
func NewPostHandler(options HandlerOptions) (sdk.AnteHandler, error) {
if options.BankKeeper == nil {
return nil, sdkerrors.Wrap(sdkerrors.ErrLogic, "bank keeper is required for posthandler")
}

postDecorators := []sdk.AnteDecorator{
NewTipDecorator(options.BankKeeper),
}
postDecorators := []sdk.AnteDecorator{}

return sdk.ChainAnteDecorators(postDecorators...), nil
}
2 changes: 2 additions & 0 deletions x/auth/posthandler/tips.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ type tipDecorator struct {

// NewTipDecorator returns a new decorator for handling transactions with
// tips.
//
// IMPORTANT: This decorator is still in beta, please use it at your own risk.
func NewTipDecorator(bankKeeper types.BankKeeper) sdk.AnteDecorator {
return tipDecorator{
bankKeeper: bankKeeper,
Expand Down