Handle nil *Any in UnpackAny and add panic handler for tx decoding (#7594)
* Handle nil any in UnpackAny * Add test * Add flag back * Update runTx signature * Update Simulate signature * Update calls to Simulate * Add txEncoder in baseapp * Fix TestTxWithoutPublicKey * Wrap errors * Use amino in baseapp tests * Add txEncoder arg to Check & Deliver * Fix gas in test * Fix remaining base app tests * Rename to amionTxEncoder * Update codec/types/interface_registry.go Co-authored-by: Aaron Craelius <aaron@regen.network> * golangci-lint fix Co-authored-by: Amaury Martiny <amaury.martiny@protonmail.com> Co-authored-by: Aaron Craelius <aaron@regen.network> Co-authored-by: Cory Levinson <cjlevinson@gmail.com> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
This commit is contained in:
parent
9e7eb0da00
commit
eba4c8a264
|
@ -213,11 +213,6 @@ func (app *BaseApp) EndBlock(req abci.RequestEndBlock) (res abci.ResponseEndBloc
|
|||
func (app *BaseApp) CheckTx(req abci.RequestCheckTx) abci.ResponseCheckTx {
|
||||
defer telemetry.MeasureSince(time.Now(), "abci", "check_tx")
|
||||
|
||||
tx, err := app.txDecoder(req.Tx)
|
||||
if err != nil {
|
||||
return sdkerrors.ResponseCheckTx(err, 0, 0, app.trace)
|
||||
}
|
||||
|
||||
var mode runTxMode
|
||||
|
||||
switch {
|
||||
|
@ -231,7 +226,7 @@ func (app *BaseApp) CheckTx(req abci.RequestCheckTx) abci.ResponseCheckTx {
|
|||
panic(fmt.Sprintf("unknown RequestCheckTx type: %s", req.Type))
|
||||
}
|
||||
|
||||
gInfo, result, err := app.runTx(mode, req.Tx, tx)
|
||||
gInfo, result, err := app.runTx(mode, req.Tx)
|
||||
if err != nil {
|
||||
return sdkerrors.ResponseCheckTx(err, gInfo.GasWanted, gInfo.GasUsed, app.trace)
|
||||
}
|
||||
|
@ -253,11 +248,6 @@ func (app *BaseApp) CheckTx(req abci.RequestCheckTx) abci.ResponseCheckTx {
|
|||
func (app *BaseApp) DeliverTx(req abci.RequestDeliverTx) abci.ResponseDeliverTx {
|
||||
defer telemetry.MeasureSince(time.Now(), "abci", "deliver_tx")
|
||||
|
||||
tx, err := app.txDecoder(req.Tx)
|
||||
if err != nil {
|
||||
return sdkerrors.ResponseDeliverTx(err, 0, 0, app.trace)
|
||||
}
|
||||
|
||||
gInfo := sdk.GasInfo{}
|
||||
resultStr := "successful"
|
||||
|
||||
|
@ -268,7 +258,7 @@ func (app *BaseApp) DeliverTx(req abci.RequestDeliverTx) abci.ResponseDeliverTx
|
|||
telemetry.SetGauge(float32(gInfo.GasWanted), "tx", "gas", "wanted")
|
||||
}()
|
||||
|
||||
gInfo, result, err := app.runTx(runTxModeDeliver, req.Tx, tx)
|
||||
gInfo, result, err := app.runTx(runTxModeDeliver, req.Tx)
|
||||
if err != nil {
|
||||
resultStr = "failed"
|
||||
return sdkerrors.ResponseDeliverTx(err, gInfo.GasWanted, gInfo.GasUsed, app.trace)
|
||||
|
@ -673,12 +663,7 @@ func handleQueryApp(app *BaseApp, path []string, req abci.RequestQuery) abci.Res
|
|||
case "simulate":
|
||||
txBytes := req.Data
|
||||
|
||||
tx, err := app.txDecoder(txBytes)
|
||||
if err != nil {
|
||||
return sdkerrors.QueryResult(sdkerrors.Wrap(err, "failed to decode tx"))
|
||||
}
|
||||
|
||||
gInfo, res, err := app.Simulate(txBytes, tx)
|
||||
gInfo, res, err := app.Simulate(txBytes)
|
||||
if err != nil {
|
||||
return sdkerrors.QueryResult(sdkerrors.Wrap(err, "failed to simulate tx"))
|
||||
}
|
||||
|
|
|
@ -557,7 +557,7 @@ func (app *BaseApp) cacheTxContext(ctx sdk.Context, txBytes []byte) (sdk.Context
|
|||
// Note, gas execution info is always returned. A reference to a Result is
|
||||
// returned if the tx does not run out of gas and if all the messages are valid
|
||||
// and execute successfully. An error is returned otherwise.
|
||||
func (app *BaseApp) runTx(mode runTxMode, txBytes []byte, tx sdk.Tx) (gInfo sdk.GasInfo, result *sdk.Result, err error) {
|
||||
func (app *BaseApp) runTx(mode runTxMode, txBytes []byte) (gInfo sdk.GasInfo, result *sdk.Result, err error) {
|
||||
// NOTE: GasWanted should be returned by the AnteHandler. GasUsed is
|
||||
// determined by the GasMeter. We need access to the context to get the gas
|
||||
// meter so we initialize upfront.
|
||||
|
@ -603,6 +603,11 @@ func (app *BaseApp) runTx(mode runTxMode, txBytes []byte, tx sdk.Tx) (gInfo sdk.
|
|||
}
|
||||
}()
|
||||
|
||||
tx, err := app.txDecoder(txBytes)
|
||||
if err != nil {
|
||||
return sdk.GasInfo{}, nil, err
|
||||
}
|
||||
|
||||
msgs := tx.GetMsgs()
|
||||
if err := validateBasicTxMsgs(msgs); err != nil {
|
||||
return sdk.GasInfo{}, nil, err
|
||||
|
|
|
@ -29,6 +29,7 @@ import (
|
|||
"github.com/cosmos/cosmos-sdk/testutil/testdata"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
||||
"github.com/cosmos/cosmos-sdk/x/auth/legacy/legacytx"
|
||||
)
|
||||
|
||||
var (
|
||||
|
@ -97,6 +98,14 @@ func registerTestCodec(cdc *codec.LegacyAmino) {
|
|||
cdc.RegisterConcrete(&msgNoRoute{}, "cosmos-sdk/baseapp/msgNoRoute", nil)
|
||||
}
|
||||
|
||||
// aminoTxEncoder creates a amino TxEncoder for testing purposes.
|
||||
func aminoTxEncoder() sdk.TxEncoder {
|
||||
cdc := codec.NewLegacyAmino()
|
||||
registerTestCodec(cdc)
|
||||
|
||||
return legacytx.StdTxConfig{Cdc: cdc}.TxEncoder()
|
||||
}
|
||||
|
||||
// simple one store baseapp
|
||||
func setupBaseApp(t *testing.T, options ...func(*BaseApp)) *BaseApp {
|
||||
app := newBaseApp(t.Name(), options...)
|
||||
|
@ -1118,13 +1127,13 @@ func TestSimulateTx(t *testing.T) {
|
|||
require.Nil(t, err)
|
||||
|
||||
// simulate a message, check gas reported
|
||||
gInfo, result, err := app.Simulate(txBytes, tx)
|
||||
gInfo, result, err := app.Simulate(txBytes)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, result)
|
||||
require.Equal(t, gasConsumed, gInfo.GasUsed)
|
||||
|
||||
// simulate again, same result
|
||||
gInfo, result, err = app.Simulate(txBytes, tx)
|
||||
gInfo, result, err = app.Simulate(txBytes)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, result)
|
||||
require.Equal(t, gasConsumed, gInfo.GasUsed)
|
||||
|
@ -1171,7 +1180,7 @@ func TestRunInvalidTransaction(t *testing.T) {
|
|||
// transaction with no messages
|
||||
{
|
||||
emptyTx := &txTest{}
|
||||
_, result, err := app.Deliver(emptyTx)
|
||||
_, result, err := app.Deliver(aminoTxEncoder(), emptyTx)
|
||||
require.Error(t, err)
|
||||
require.Nil(t, result)
|
||||
|
||||
|
@ -1198,7 +1207,7 @@ func TestRunInvalidTransaction(t *testing.T) {
|
|||
|
||||
for _, testCase := range testCases {
|
||||
tx := testCase.tx
|
||||
_, result, err := app.Deliver(tx)
|
||||
_, result, err := app.Deliver(aminoTxEncoder(), tx)
|
||||
|
||||
if testCase.fail {
|
||||
require.Error(t, err)
|
||||
|
@ -1215,7 +1224,7 @@ func TestRunInvalidTransaction(t *testing.T) {
|
|||
// transaction with no known route
|
||||
{
|
||||
unknownRouteTx := txTest{[]sdk.Msg{msgNoRoute{}}, 0, false}
|
||||
_, result, err := app.Deliver(unknownRouteTx)
|
||||
_, result, err := app.Deliver(aminoTxEncoder(), unknownRouteTx)
|
||||
require.Error(t, err)
|
||||
require.Nil(t, result)
|
||||
|
||||
|
@ -1224,7 +1233,7 @@ func TestRunInvalidTransaction(t *testing.T) {
|
|||
require.EqualValues(t, sdkerrors.ErrUnknownRequest.ABCICode(), code, err)
|
||||
|
||||
unknownRouteTx = txTest{[]sdk.Msg{msgCounter{}, msgNoRoute{}}, 0, false}
|
||||
_, result, err = app.Deliver(unknownRouteTx)
|
||||
_, result, err = app.Deliver(aminoTxEncoder(), unknownRouteTx)
|
||||
require.Error(t, err)
|
||||
require.Nil(t, result)
|
||||
|
||||
|
@ -1274,7 +1283,7 @@ func TestTxGasLimits(t *testing.T) {
|
|||
}
|
||||
}()
|
||||
|
||||
count := tx.(*txTest).Counter
|
||||
count := tx.(txTest).Counter
|
||||
newCtx.GasMeter().ConsumeGas(uint64(count), "counter-ante")
|
||||
|
||||
return newCtx, nil
|
||||
|
@ -1284,7 +1293,7 @@ func TestTxGasLimits(t *testing.T) {
|
|||
|
||||
routerOpt := func(bapp *BaseApp) {
|
||||
r := sdk.NewRoute(routeMsgCounter, func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) {
|
||||
count := msg.(msgCounter).Counter
|
||||
count := msg.(*msgCounter).Counter
|
||||
ctx.GasMeter().ConsumeGas(uint64(count), "counter-handler")
|
||||
return &sdk.Result{}, nil
|
||||
})
|
||||
|
@ -1322,7 +1331,7 @@ func TestTxGasLimits(t *testing.T) {
|
|||
|
||||
for i, tc := range testCases {
|
||||
tx := tc.tx
|
||||
gInfo, result, err := app.Deliver(tx)
|
||||
gInfo, result, err := app.Deliver(aminoTxEncoder(), tx)
|
||||
|
||||
// check gas used and wanted
|
||||
require.Equal(t, tc.gasUsed, gInfo.GasUsed, fmt.Sprintf("tc #%d; gas: %v, result: %v, err: %s", i, gInfo, result, err))
|
||||
|
@ -1359,7 +1368,7 @@ func TestMaxBlockGasLimits(t *testing.T) {
|
|||
}
|
||||
}()
|
||||
|
||||
count := tx.(*txTest).Counter
|
||||
count := tx.(txTest).Counter
|
||||
newCtx.GasMeter().ConsumeGas(uint64(count), "counter-ante")
|
||||
|
||||
return
|
||||
|
@ -1368,7 +1377,7 @@ func TestMaxBlockGasLimits(t *testing.T) {
|
|||
|
||||
routerOpt := func(bapp *BaseApp) {
|
||||
r := sdk.NewRoute(routeMsgCounter, func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) {
|
||||
count := msg.(msgCounter).Counter
|
||||
count := msg.(*msgCounter).Counter
|
||||
ctx.GasMeter().ConsumeGas(uint64(count), "counter-handler")
|
||||
return &sdk.Result{}, nil
|
||||
})
|
||||
|
@ -1412,7 +1421,7 @@ func TestMaxBlockGasLimits(t *testing.T) {
|
|||
|
||||
// execute the transaction multiple times
|
||||
for j := 0; j < tc.numDelivers; j++ {
|
||||
_, result, err := app.Deliver(tx)
|
||||
_, result, err := app.Deliver(aminoTxEncoder(), tx)
|
||||
|
||||
ctx := app.getState(runTxModeDeliver).ctx
|
||||
|
||||
|
@ -1480,7 +1489,7 @@ func TestCustomRunTxPanicHandler(t *testing.T) {
|
|||
{
|
||||
tx := newTxCounter(0, 0)
|
||||
|
||||
require.PanicsWithValue(t, customPanicMsg, func() { app.Deliver(tx) })
|
||||
require.PanicsWithValue(t, customPanicMsg, func() { app.Deliver(aminoTxEncoder(), tx) })
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1589,7 +1598,7 @@ func TestGasConsumptionBadTx(t *testing.T) {
|
|||
|
||||
routerOpt := func(bapp *BaseApp) {
|
||||
r := sdk.NewRoute(routeMsgCounter, func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) {
|
||||
count := msg.(msgCounter).Counter
|
||||
count := msg.(*msgCounter).Counter
|
||||
ctx.GasMeter().ConsumeGas(uint64(count), "counter-handler")
|
||||
return &sdk.Result{}, nil
|
||||
})
|
||||
|
@ -1668,7 +1677,7 @@ func TestQuery(t *testing.T) {
|
|||
require.Equal(t, 0, len(res.Value))
|
||||
|
||||
// query is still empty after a CheckTx
|
||||
_, resTx, err := app.Check(tx)
|
||||
_, resTx, err := app.Check(aminoTxEncoder(), tx)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, resTx)
|
||||
res = app.Query(query)
|
||||
|
@ -1678,7 +1687,7 @@ func TestQuery(t *testing.T) {
|
|||
header := tmproto.Header{Height: app.LastBlockHeight() + 1}
|
||||
app.BeginBlock(abci.RequestBeginBlock{Header: header})
|
||||
|
||||
_, resTx, err = app.Deliver(tx)
|
||||
_, resTx, err = app.Deliver(aminoTxEncoder(), tx)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, resTx)
|
||||
res = app.Query(query)
|
||||
|
|
|
@ -1,33 +0,0 @@
|
|||
package baseapp
|
||||
|
||||
import (
|
||||
tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
|
||||
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
)
|
||||
|
||||
func (app *BaseApp) Check(tx sdk.Tx) (sdk.GasInfo, *sdk.Result, error) {
|
||||
return app.runTx(runTxModeCheck, nil, tx)
|
||||
}
|
||||
|
||||
func (app *BaseApp) Simulate(txBytes []byte, tx sdk.Tx) (sdk.GasInfo, *sdk.Result, error) {
|
||||
return app.runTx(runTxModeSimulate, txBytes, tx)
|
||||
}
|
||||
|
||||
func (app *BaseApp) Deliver(tx sdk.Tx) (sdk.GasInfo, *sdk.Result, error) {
|
||||
return app.runTx(runTxModeDeliver, nil, tx)
|
||||
}
|
||||
|
||||
// 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)
|
||||
}
|
|
@ -0,0 +1,46 @@
|
|||
package baseapp
|
||||
|
||||
import (
|
||||
tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
|
||||
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
||||
)
|
||||
|
||||
func (app *BaseApp) Check(txEncoder sdk.TxEncoder, tx sdk.Tx) (sdk.GasInfo, *sdk.Result, error) {
|
||||
// runTx expects tx bytes as argument, so we encode the tx argument into
|
||||
// bytes. Note that runTx will actually decode those bytes again. But since
|
||||
// this helper is only used in tests/simulation, it's fine.
|
||||
bz, err := txEncoder(tx)
|
||||
if err != nil {
|
||||
return sdk.GasInfo{}, nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "%s", err)
|
||||
}
|
||||
return app.runTx(runTxModeCheck, bz)
|
||||
}
|
||||
|
||||
func (app *BaseApp) Simulate(txBytes []byte) (sdk.GasInfo, *sdk.Result, error) {
|
||||
return app.runTx(runTxModeSimulate, txBytes)
|
||||
}
|
||||
|
||||
func (app *BaseApp) Deliver(txEncoder sdk.TxEncoder, tx sdk.Tx) (sdk.GasInfo, *sdk.Result, error) {
|
||||
// See comment for Check().
|
||||
bz, err := txEncoder(tx)
|
||||
if err != nil {
|
||||
return sdk.GasInfo{}, nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "%s", err)
|
||||
}
|
||||
return app.runTx(runTxModeDeliver, bz)
|
||||
}
|
||||
|
||||
// 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)
|
||||
}
|
|
@ -8,11 +8,10 @@ import (
|
|||
|
||||
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
authtx "github.com/cosmos/cosmos-sdk/x/auth/tx"
|
||||
)
|
||||
|
||||
// BaseAppSimulateFn is the signature of the Baseapp#Simulate function.
|
||||
type BaseAppSimulateFn func(txBytes []byte, txtypes sdk.Tx) (sdk.GasInfo, *sdk.Result, error)
|
||||
type BaseAppSimulateFn func(txBytes []byte) (sdk.GasInfo, *sdk.Result, error)
|
||||
|
||||
type simulateServer struct {
|
||||
simulate BaseAppSimulateFn
|
||||
|
@ -39,13 +38,12 @@ func (s simulateServer) Simulate(ctx context.Context, req *SimulateRequest) (*Si
|
|||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
txBuilder := authtx.WrapTx(req.Tx)
|
||||
txBytes, err := req.Tx.Marshal()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
gasInfo, result, err := s.simulate(txBytes, txBuilder.GetTx())
|
||||
gasInfo, result, err := s.simulate(txBytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
|
@ -172,6 +172,11 @@ func (registry *interfaceRegistry) ListImplementations(ifaceName string) []strin
|
|||
}
|
||||
|
||||
func (registry *interfaceRegistry) UnpackAny(any *Any, iface interface{}) error {
|
||||
// here we gracefully handle the case in which `any` itself is `nil`, which may occur in message decoding
|
||||
if any == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
if any.TypeUrl == "" {
|
||||
// if TypeUrl is empty return nil because without it we can't actually unpack anything
|
||||
return nil
|
||||
|
|
|
@ -320,12 +320,12 @@ func CheckBalance(t *testing.T, app *SimApp, addr sdk.AccAddress, balances sdk.C
|
|||
// the parameter 'expPass' against the result. A corresponding result is
|
||||
// returned.
|
||||
func SignCheckDeliver(
|
||||
t *testing.T, txGen client.TxConfig, app *bam.BaseApp, header tmproto.Header, msgs []sdk.Msg,
|
||||
t *testing.T, txCfg client.TxConfig, app *bam.BaseApp, header tmproto.Header, msgs []sdk.Msg,
|
||||
chainID string, accNums, accSeqs []uint64, expSimPass, expPass bool, priv ...crypto.PrivKey,
|
||||
) (sdk.GasInfo, *sdk.Result, error) {
|
||||
|
||||
tx, err := helpers.GenTx(
|
||||
txGen,
|
||||
txCfg,
|
||||
msgs,
|
||||
sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 0)},
|
||||
helpers.DefaultGenTxGas,
|
||||
|
@ -335,11 +335,11 @@ func SignCheckDeliver(
|
|||
priv...,
|
||||
)
|
||||
require.NoError(t, err)
|
||||
txBytes, err := txGen.TxEncoder()(tx)
|
||||
txBytes, err := txCfg.TxEncoder()(tx)
|
||||
require.Nil(t, err)
|
||||
|
||||
// Must simulate now as CheckTx doesn't run Msgs anymore
|
||||
_, res, err := app.Simulate(txBytes, tx)
|
||||
_, res, err := app.Simulate(txBytes)
|
||||
|
||||
if expSimPass {
|
||||
require.NoError(t, err)
|
||||
|
@ -351,7 +351,7 @@ func SignCheckDeliver(
|
|||
|
||||
// Simulate a sending a transaction and committing a block
|
||||
app.BeginBlock(abci.RequestBeginBlock{Header: header})
|
||||
gInfo, res, err := app.Deliver(tx)
|
||||
gInfo, res, err := app.Deliver(txCfg.TxEncoder(), tx)
|
||||
|
||||
if expPass {
|
||||
require.NoError(t, err)
|
||||
|
|
|
@ -28,6 +28,8 @@ import (
|
|||
"github.com/cosmos/cosmos-sdk/testutil/network"
|
||||
"github.com/cosmos/cosmos-sdk/testutil/testdata"
|
||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||
"github.com/cosmos/cosmos-sdk/types/tx"
|
||||
"github.com/cosmos/cosmos-sdk/types/tx/signing"
|
||||
authcli "github.com/cosmos/cosmos-sdk/x/auth/client/cli"
|
||||
authtest "github.com/cosmos/cosmos-sdk/x/auth/client/testutil"
|
||||
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
|
||||
|
@ -833,6 +835,66 @@ func (s *IntegrationTestSuite) TestQueryParamsCmd() {
|
|||
}
|
||||
}
|
||||
|
||||
// TestTxWithoutPublicKey makes sure sending a proto tx message without the
|
||||
// public key doesn't cause any error in the RPC layer (broadcast).
|
||||
// See https://github.com/cosmos/cosmos-sdk/issues/7585 for more details.
|
||||
func (s *IntegrationTestSuite) TestTxWithoutPublicKey() {
|
||||
val1 := s.network.Validators[0]
|
||||
txCfg := val1.ClientCtx.TxConfig
|
||||
|
||||
// Create a txBuilder with an unsigned tx.
|
||||
txBuilder := txCfg.NewTxBuilder()
|
||||
msg := banktypes.NewMsgSend(val1.Address, val1.Address, sdk.NewCoins(
|
||||
sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10)),
|
||||
))
|
||||
err := txBuilder.SetMsgs(msg)
|
||||
s.Require().NoError(err)
|
||||
txBuilder.SetFeeAmount(sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150))))
|
||||
txBuilder.SetGasLimit(testdata.NewTestGasLimit())
|
||||
// Set empty signature to set signer infos.
|
||||
sigV2 := signing.SignatureV2{
|
||||
PubKey: val1.PubKey,
|
||||
Data: &signing.SingleSignatureData{
|
||||
SignMode: txCfg.SignModeHandler().DefaultMode(),
|
||||
Signature: nil,
|
||||
},
|
||||
}
|
||||
err = txBuilder.SetSignatures(sigV2)
|
||||
s.Require().NoError(err)
|
||||
|
||||
// Create a file with the unsigned tx.
|
||||
txJSON, err := txCfg.TxJSONEncoder()(txBuilder.GetTx())
|
||||
s.Require().NoError(err)
|
||||
unsignedTxFile, cleanup := testutil.WriteToNewTempFile(s.T(), string(txJSON))
|
||||
defer cleanup()
|
||||
|
||||
// Sign the file with the unsignedTx.
|
||||
signedTx, err := authtest.TxSignExec(val1.ClientCtx, val1.Address, unsignedTxFile.Name())
|
||||
s.Require().NoError(err)
|
||||
|
||||
// Remove the signerInfo's `public_key` field manually from the signedTx.
|
||||
// Note: this method is only used for test purposes! In general, one should
|
||||
// use txBuilder and TxEncoder/TxDecoder to manipulate txs.
|
||||
var tx tx.Tx
|
||||
err = val1.ClientCtx.JSONMarshaler.UnmarshalJSON(signedTx.Bytes(), &tx)
|
||||
s.Require().NoError(err)
|
||||
tx.AuthInfo.SignerInfos[0].PublicKey = nil
|
||||
// Re-encode the tx again, to another file.
|
||||
txJSON, err = val1.ClientCtx.JSONMarshaler.MarshalJSON(&tx)
|
||||
s.Require().NoError(err)
|
||||
signedTxFile, cleanup2 := testutil.WriteToNewTempFile(s.T(), string(txJSON))
|
||||
s.Require().True(strings.Contains(string(txJSON), "\"public_key\":null"))
|
||||
defer cleanup2()
|
||||
|
||||
// Broadcast tx, test that it shouldn't panic.
|
||||
val1.ClientCtx.BroadcastMode = flags.BroadcastSync
|
||||
out, err := authtest.TxBroadcastExec(val1.ClientCtx, signedTxFile.Name())
|
||||
var res sdk.TxResponse
|
||||
s.Require().NoError(val1.ClientCtx.JSONMarshaler.UnmarshalJSON(out.Bytes(), &res))
|
||||
s.Require().NotEqual(0, res.Code)
|
||||
s.Require().NoError(err)
|
||||
}
|
||||
|
||||
func TestIntegrationTestSuite(t *testing.T) {
|
||||
suite.Run(t, new(IntegrationTestSuite))
|
||||
}
|
||||
|
|
|
@ -46,12 +46,12 @@ func BenchmarkOneBankSendTxPerBlock(b *testing.B) {
|
|||
// Committing, and what time comes from Check/Deliver Tx.
|
||||
for i := 0; i < b.N; i++ {
|
||||
benchmarkApp.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: height}})
|
||||
_, _, err := benchmarkApp.Check(txs[i])
|
||||
_, _, err := benchmarkApp.Check(txGen.TxEncoder(), txs[i])
|
||||
if err != nil {
|
||||
panic("something is broken in checking transaction")
|
||||
}
|
||||
|
||||
_, _, err = benchmarkApp.Deliver(txs[i])
|
||||
_, _, err = benchmarkApp.Deliver(txGen.TxEncoder(), txs[i])
|
||||
require.NoError(b, err)
|
||||
benchmarkApp.EndBlock(abci.RequestEndBlock{Height: height})
|
||||
benchmarkApp.Commit()
|
||||
|
@ -88,12 +88,12 @@ func BenchmarkOneBankMultiSendTxPerBlock(b *testing.B) {
|
|||
// Committing, and what time comes from Check/Deliver Tx.
|
||||
for i := 0; i < b.N; i++ {
|
||||
benchmarkApp.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: height}})
|
||||
_, _, err := benchmarkApp.Check(txs[i])
|
||||
_, _, err := benchmarkApp.Check(txGen.TxEncoder(), txs[i])
|
||||
if err != nil {
|
||||
panic("something is broken in checking transaction")
|
||||
}
|
||||
|
||||
_, _, err = benchmarkApp.Deliver(txs[i])
|
||||
_, _, err = benchmarkApp.Deliver(txGen.TxEncoder(), txs[i])
|
||||
require.NoError(b, err)
|
||||
benchmarkApp.EndBlock(abci.RequestEndBlock{Height: height})
|
||||
benchmarkApp.Commit()
|
||||
|
|
|
@ -123,7 +123,7 @@ func sendMsgSend(
|
|||
return err
|
||||
}
|
||||
|
||||
_, _, err = app.Deliver(tx)
|
||||
_, _, err = app.Deliver(txGen.TxEncoder(), tx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -280,7 +280,7 @@ func sendMsgMultiSend(
|
|||
return err
|
||||
}
|
||||
|
||||
_, _, err = app.Deliver(tx)
|
||||
_, _, err = app.Deliver(txGen.TxEncoder(), tx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -115,7 +115,7 @@ func SimulateMsgSetWithdrawAddress(ak types.AccountKeeper, bk types.BankKeeper,
|
|||
return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err
|
||||
}
|
||||
|
||||
_, _, err = app.Deliver(tx)
|
||||
_, _, err = app.Deliver(txGen.TxEncoder(), tx)
|
||||
if err != nil {
|
||||
return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to deliver tx"), nil, err
|
||||
}
|
||||
|
@ -167,7 +167,7 @@ func SimulateMsgWithdrawDelegatorReward(ak types.AccountKeeper, bk types.BankKee
|
|||
return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err
|
||||
}
|
||||
|
||||
_, _, err = app.Deliver(tx)
|
||||
_, _, err = app.Deliver(txGen.TxEncoder(), tx)
|
||||
if err != nil {
|
||||
return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to deliver tx"), nil, err
|
||||
}
|
||||
|
@ -222,7 +222,7 @@ func SimulateMsgWithdrawValidatorCommission(ak types.AccountKeeper, bk types.Ban
|
|||
return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err
|
||||
}
|
||||
|
||||
_, _, err = app.Deliver(tx)
|
||||
_, _, err = app.Deliver(txGen.TxEncoder(), tx)
|
||||
if err != nil {
|
||||
return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to deliver tx"), nil, err
|
||||
}
|
||||
|
@ -277,7 +277,7 @@ func SimulateMsgFundCommunityPool(ak types.AccountKeeper, bk types.BankKeeper, k
|
|||
return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err
|
||||
}
|
||||
|
||||
_, _, err = app.Deliver(tx)
|
||||
_, _, err = app.Deliver(txGen.TxEncoder(), tx)
|
||||
if err != nil {
|
||||
return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to deliver tx"), nil, err
|
||||
}
|
||||
|
|
|
@ -157,7 +157,7 @@ func SimulateMsgSubmitProposal(
|
|||
return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err
|
||||
}
|
||||
|
||||
_, _, err = app.Deliver(tx)
|
||||
_, _, err = app.Deliver(txGen.TxEncoder(), tx)
|
||||
if err != nil {
|
||||
return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to deliver tx"), nil, err
|
||||
}
|
||||
|
@ -243,7 +243,7 @@ func SimulateMsgDeposit(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Ke
|
|||
if err != nil {
|
||||
return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err
|
||||
}
|
||||
_, _, err = app.Deliver(tx)
|
||||
_, _, err = app.Deliver(txGen.TxEncoder(), tx)
|
||||
if err != nil {
|
||||
return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to deliver tx"), nil, err
|
||||
}
|
||||
|
@ -306,7 +306,7 @@ func operationSimulateMsgVote(ak types.AccountKeeper, bk types.BankKeeper, k kee
|
|||
return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err
|
||||
}
|
||||
|
||||
_, _, err = app.Deliver(tx)
|
||||
_, _, err = app.Deliver(txGen.TxEncoder(), tx)
|
||||
if err != nil {
|
||||
return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to deliver tx"), nil, err
|
||||
}
|
||||
|
|
|
@ -101,7 +101,7 @@ func SimulateMsgUnjail(ak types.AccountKeeper, bk types.BankKeeper, k keeper.Kee
|
|||
return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err
|
||||
}
|
||||
|
||||
_, res, err := app.Deliver(tx)
|
||||
_, res, err := app.Deliver(txGen.TxEncoder(), tx)
|
||||
|
||||
// result should fail if:
|
||||
// - validator cannot be unjailed due to tombstone
|
||||
|
|
|
@ -168,7 +168,7 @@ func SimulateMsgCreateValidator(ak types.AccountKeeper, bk types.BankKeeper, k k
|
|||
return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err
|
||||
}
|
||||
|
||||
_, _, err = app.Deliver(tx)
|
||||
_, _, err = app.Deliver(txGen.TxEncoder(), tx)
|
||||
if err != nil {
|
||||
return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to deliver tx"), nil, err
|
||||
}
|
||||
|
@ -239,7 +239,7 @@ func SimulateMsgEditValidator(ak types.AccountKeeper, bk types.BankKeeper, k kee
|
|||
return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err
|
||||
}
|
||||
|
||||
_, _, err = app.Deliver(tx)
|
||||
_, _, err = app.Deliver(txGen.TxEncoder(), tx)
|
||||
if err != nil {
|
||||
return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to deliver tx"), nil, err
|
||||
}
|
||||
|
@ -312,7 +312,7 @@ func SimulateMsgDelegate(ak types.AccountKeeper, bk types.BankKeeper, k keeper.K
|
|||
return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err
|
||||
}
|
||||
|
||||
_, _, err = app.Deliver(tx)
|
||||
_, _, err = app.Deliver(txGen.TxEncoder(), tx)
|
||||
if err != nil {
|
||||
return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to deliver tx"), nil, err
|
||||
}
|
||||
|
@ -402,7 +402,7 @@ func SimulateMsgUndelegate(ak types.AccountKeeper, bk types.BankKeeper, k keeper
|
|||
return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err
|
||||
}
|
||||
|
||||
_, _, err = app.Deliver(tx)
|
||||
_, _, err = app.Deliver(txGen.TxEncoder(), tx)
|
||||
if err != nil {
|
||||
return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to deliver tx"), nil, err
|
||||
}
|
||||
|
@ -515,7 +515,7 @@ func SimulateMsgBeginRedelegate(ak types.AccountKeeper, bk types.BankKeeper, k k
|
|||
return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to generate mock tx"), nil, err
|
||||
}
|
||||
|
||||
_, _, err = app.Deliver(tx)
|
||||
_, _, err = app.Deliver(txGen.TxEncoder(), tx)
|
||||
if err != nil {
|
||||
return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "unable to deliver tx"), nil, err
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue