* WIP: middleware refactor * refactor `tx.Request` * Add MsgResponses any in sdk.Result * add helper functions in abci * refactor tips * review changes * Fix mock tests * Update baseapp/abci.go * Update baseapp/abci.go * Update types/tx/middleware.go * Update types/tx/middleware.go * tx.Response to abci conversion * refactor makeABCIData * Add comments * Fix build * fix build error * fix tests * fix test * fix tests * Fix TestSimulateTx * fix tests * fix test * Fix build * Simplify code * fix test build * Use repeated bytes in txMsgData * Fix grpc-gateway test * Make proto-gen * Automagically register MsgResponse * review changes * Use froydi's trick * Use Any in TxMsgData * Finally remove API breaking change * Revert unnecessary stuff * refactor: Move TxDecoder into its own middleware * Add test for txDecoderMiddleware * Fix some baseapp tests * Fix some more tests * Fix mock tests * Fix middleware tests * Add cl * Fix tests * Update types/tx/middleware.go Co-authored-by: atheeshp <59333759+atheeshp@users.noreply.github.com> Co-authored-by: atheesh <atheesh@vitwit.com> Co-authored-by: atheeshp <59333759+atheeshp@users.noreply.github.com>
94 lines
3.2 KiB
Go
94 lines
3.2 KiB
Go
package baseapp
|
|
|
|
import (
|
|
abci "github.com/tendermint/tendermint/abci/types"
|
|
tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
|
|
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
|
"github.com/cosmos/cosmos-sdk/types/tx"
|
|
)
|
|
|
|
// SimCheck defines a CheckTx helper function that used in tests and simulations.
|
|
func (app *BaseApp) SimCheck(txEncoder sdk.TxEncoder, sdkTx sdk.Tx) (sdk.GasInfo, *sdk.Result, error) {
|
|
// CheckTx expects tx bytes as argument, so we encode the tx argument into
|
|
// bytes. Note that CheckTx will actually decode those bytes again. But since
|
|
// this helper is only used in tests/simulation, it's fine.
|
|
bz, err := txEncoder(sdkTx)
|
|
if err != nil {
|
|
return sdk.GasInfo{}, nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "%s", err)
|
|
}
|
|
|
|
ctx := app.getContextForTx(runTxModeDeliver, bz)
|
|
res, _, err := app.txHandler.CheckTx(ctx, tx.Request{Tx: sdkTx, TxBytes: bz}, tx.RequestCheckTx{Type: abci.CheckTxType_New})
|
|
gInfo := sdk.GasInfo{GasWanted: uint64(res.GasWanted), GasUsed: uint64(res.GasUsed)}
|
|
if err != nil {
|
|
return gInfo, nil, err
|
|
}
|
|
|
|
data, err := makeABCIData(res)
|
|
if err != nil {
|
|
return gInfo, nil, err
|
|
}
|
|
|
|
return gInfo, &sdk.Result{Data: data, Log: res.Log, Events: res.Events, MsgResponses: res.MsgResponses}, nil
|
|
}
|
|
|
|
// Simulate executes a tx in simulate mode to get result and gas info.
|
|
func (app *BaseApp) Simulate(txBytes []byte) (sdk.GasInfo, *sdk.Result, error) {
|
|
ctx := app.getContextForTx(runTxModeSimulate, txBytes)
|
|
res, err := app.txHandler.SimulateTx(ctx, tx.Request{TxBytes: txBytes})
|
|
gasInfo := sdk.GasInfo{
|
|
GasWanted: res.GasWanted,
|
|
GasUsed: res.GasUsed,
|
|
}
|
|
if err != nil {
|
|
return gasInfo, nil, err
|
|
}
|
|
|
|
data, err := makeABCIData(res)
|
|
if err != nil {
|
|
return gasInfo, nil, err
|
|
}
|
|
|
|
return gasInfo, &sdk.Result{Data: data, Log: res.Log, Events: res.Events, MsgResponses: res.MsgResponses}, nil
|
|
}
|
|
|
|
// SimDeliver defines a DeliverTx helper function that used in tests and
|
|
// simulations.
|
|
func (app *BaseApp) SimDeliver(txEncoder sdk.TxEncoder, sdkTx sdk.Tx) (sdk.GasInfo, *sdk.Result, error) {
|
|
// See comment for Check().
|
|
bz, err := txEncoder(sdkTx)
|
|
if err != nil {
|
|
return sdk.GasInfo{}, nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "%s", err)
|
|
}
|
|
|
|
ctx := app.getContextForTx(runTxModeDeliver, bz)
|
|
res, err := app.txHandler.DeliverTx(ctx, tx.Request{Tx: sdkTx, TxBytes: bz})
|
|
gInfo := sdk.GasInfo{GasWanted: uint64(res.GasWanted), GasUsed: uint64(res.GasUsed)}
|
|
if err != nil {
|
|
return gInfo, nil, err
|
|
}
|
|
|
|
data, err := makeABCIData(res)
|
|
if err != nil {
|
|
return gInfo, nil, err
|
|
}
|
|
|
|
return gInfo, &sdk.Result{Data: data, Log: res.Log, Events: res.Events, MsgResponses: res.MsgResponses}, nil
|
|
}
|
|
|
|
// Context with current {check, deliver}State of the app used by tests.
|
|
func (app *BaseApp) NewContext(isCheckTx bool, header tmproto.Header) sdk.Context {
|
|
if isCheckTx {
|
|
return sdk.NewContext(app.checkState.ms, header, true, app.logger).
|
|
WithMinGasPrices(app.minGasPrices)
|
|
}
|
|
|
|
return sdk.NewContext(app.deliverState.ms, header, false, app.logger)
|
|
}
|
|
|
|
func (app *BaseApp) NewUncachedContext(isCheckTx bool, header tmproto.Header) sdk.Context {
|
|
return sdk.NewContext(app.cms, header, isCheckTx, app.logger)
|
|
}
|