Skip to content

Commit bd6c16b

Browse files
authored
Handle ServiceMsg in StdTxBuilder.SetMsgs (cosmos#7731)
* Handle ServiceMsg in StdTxBuilder.SetMsgs * Add test
1 parent 1961935 commit bd6c16b

File tree

2 files changed

+66
-4
lines changed

2 files changed

+66
-4
lines changed

x/auth/client/rest/rest_test.go

+47-3
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,22 @@ package rest_test
22

33
import (
44
"fmt"
5-
"testing"
6-
75
"strings"
6+
"testing"
87

98
"github.com/stretchr/testify/suite"
109

10+
"github.com/cosmos/cosmos-sdk/client/flags"
1111
"github.com/cosmos/cosmos-sdk/client/tx"
12+
"github.com/cosmos/cosmos-sdk/crypto/hd"
13+
"github.com/cosmos/cosmos-sdk/crypto/keyring"
1214
"github.com/cosmos/cosmos-sdk/testutil/network"
1315
"github.com/cosmos/cosmos-sdk/testutil/testdata"
1416
sdk "github.com/cosmos/cosmos-sdk/types"
1517
"github.com/cosmos/cosmos-sdk/types/rest"
1618
"github.com/cosmos/cosmos-sdk/types/tx/signing"
1719
authclient "github.com/cosmos/cosmos-sdk/x/auth/client"
20+
bankcli "github.com/cosmos/cosmos-sdk/x/bank/client/testutil"
1821

1922
rest2 "github.com/cosmos/cosmos-sdk/x/auth/client/rest"
2023
"github.com/cosmos/cosmos-sdk/x/auth/legacy/legacytx"
@@ -37,7 +40,11 @@ func (s *IntegrationTestSuite) SetupSuite() {
3740
s.cfg = cfg
3841
s.network = network.New(s.T(), cfg)
3942

40-
_, err := s.network.WaitForHeight(1)
43+
kb := s.network.Validators[0].ClientCtx.Keyring
44+
_, _, err := kb.NewMnemonic("newAccount", keyring.English, sdk.FullFundraiserPath, hd.Secp256k1)
45+
s.Require().NoError(err)
46+
47+
_, err = s.network.WaitForHeight(1)
4148
s.Require().NoError(err)
4249
}
4350

@@ -128,6 +135,43 @@ func (s *IntegrationTestSuite) TestQueryTxByHash() {
128135
s.Require().True(strings.Contains(string(txJSON), stdTx.Memo))
129136
}
130137

138+
func (s *IntegrationTestSuite) TestQueryTxByHashWithServiceMessage() {
139+
val := s.network.Validators[0]
140+
141+
account, err := val.ClientCtx.Keyring.Key("newAccount")
142+
s.Require().NoError(err)
143+
144+
sendTokens := sdk.NewInt64Coin(s.cfg.BondDenom, 10)
145+
146+
out, err := bankcli.ServiceMsgSendExec(
147+
val.ClientCtx,
148+
val.Address,
149+
account.GetAddress(),
150+
sdk.NewCoins(sendTokens),
151+
fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
152+
fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock),
153+
fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()),
154+
fmt.Sprintf("--gas=%d", flags.DefaultGasLimit),
155+
)
156+
157+
s.Require().NoError(err)
158+
var txRes sdk.TxResponse
159+
s.Require().NoError(val.ClientCtx.JSONMarshaler.UnmarshalJSON(out.Bytes(), &txRes))
160+
161+
s.Require().NoError(s.network.WaitForNextBlock())
162+
163+
txJSON, err := rest.GetRequest(fmt.Sprintf("%s/txs/%s", val.APIAddress, txRes.TxHash))
164+
s.Require().NoError(err)
165+
166+
var result legacytx.StdTx
167+
s.Require().NoError(val.ClientCtx.LegacyAmino.UnmarshalJSON(txJSON, &result))
168+
s.Require().NotNil(result)
169+
msgs := result.GetMsgs()
170+
s.Require().Equal(len(msgs), 1)
171+
_, ok := msgs[0].(*types.MsgSend)
172+
s.Require().True(ok)
173+
}
174+
131175
func (s *IntegrationTestSuite) TestMultipleSyncBroadcastTxRequests() {
132176
// First test transaction from validator should have sequence=1 (non-genesis tx)
133177
testCases := []struct {

x/auth/legacy/legacytx/stdtx_builder.go

+19-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,25 @@ func (s *StdTxBuilder) GetTx() authsigning.Tx {
2929

3030
// SetMsgs implements TxBuilder.SetMsgs
3131
func (s *StdTxBuilder) SetMsgs(msgs ...sdk.Msg) error {
32-
s.Msgs = msgs
32+
stdTxMsgs := make([]sdk.Msg, len(msgs))
33+
34+
for i, msg := range msgs {
35+
switch msg := msg.(type) {
36+
case sdk.ServiceMsg:
37+
// Since ServiceMsg isn't registered with amino, we unpack msg.Request
38+
// into a Msg so that it's handled gracefully for the legacy
39+
// GET /txs/{hash} and /txs endpoints.
40+
sdkMsg, ok := msg.Request.(sdk.Msg)
41+
if !ok {
42+
return sdkerrors.Wrapf(sdkerrors.ErrInvalidType, "Expecting %T at %d to implement sdk.Msg", msg.Request, i)
43+
}
44+
stdTxMsgs[i] = sdkMsg
45+
default:
46+
// legacy sdk.Msg
47+
stdTxMsgs[i] = msg
48+
}
49+
}
50+
s.Msgs = stdTxMsgs
3351
return nil
3452
}
3553

0 commit comments

Comments
 (0)