From c0c1c481d4b857884ced02e7413707d2408d6aee Mon Sep 17 00:00:00 2001 From: Amaury Date: Fri, 11 Dec 2020 19:48:04 +0100 Subject: [PATCH] Add test with Multi Signers into Robert's TxSign PR (#8142) * Add test with Multi Signers * remove true false * Use SIGN_MODE_DIRECT * Fix litn * Use correct pubkeys * Correct accNum and seq * Use amino --- x/auth/client/cli/broadcast.go | 4 +++ x/auth/client/cli/cli_test.go | 58 +++++++++++++++++++++++++++++++++- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/x/auth/client/cli/broadcast.go b/x/auth/client/cli/broadcast.go index d234b0252163..0a728bb9b566 100644 --- a/x/auth/client/cli/broadcast.go +++ b/x/auth/client/cli/broadcast.go @@ -26,6 +26,10 @@ $ tx broadcast ./mytxn.json Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { clientCtx := client.GetClientContextFromCmd(cmd) + clientCtx, err := client.ReadTxCommandFlags(clientCtx, cmd.Flags()) + if err != nil { + return err + } if offline, _ := cmd.Flags().GetBool(flags.FlagOffline); offline { return errors.New("cannot broadcast tx during offline mode") diff --git a/x/auth/client/cli/cli_test.go b/x/auth/client/cli/cli_test.go index 5d600e897479..2844addd6a26 100644 --- a/x/auth/client/cli/cli_test.go +++ b/x/auth/client/cli/cli_test.go @@ -48,7 +48,7 @@ func (s *IntegrationTestSuite) SetupSuite() { s.T().Log("setting up integration test suite") cfg := network.DefaultConfig() - cfg.NumValidators = 1 + cfg.NumValidators = 2 s.cfg = cfg s.network = network.New(s.T(), cfg) @@ -1029,6 +1029,62 @@ func (s *IntegrationTestSuite) createBankMsg(val *network.Validator, toAddr sdk. return res } +func (s *IntegrationTestSuite) TestSignWithMultiSigners_AminoJSON() { + val0, val1 := s.network.Validators[0], s.network.Validators[1] + + val0Coin := sdk.NewCoin(fmt.Sprintf("%stoken", val0.Moniker), sdk.NewInt(10)) + val1Coin := sdk.NewCoin(fmt.Sprintf("%stoken", val1.Moniker), sdk.NewInt(10)) + + _, _, addr1 := testdata.KeyTestPubAddr() + + // Creating a tx with 2 msgs from 2 signers: val0 and val1. + // The validators sign with SIGN_MODE_LEGACY_AMINO_JSON by default. + // Since we we amino, we don't need to pre-populate signer_infos. + txBuilder := val0.ClientCtx.TxConfig.NewTxBuilder() + txBuilder.SetMsgs( + banktypes.NewMsgSend(val0.Address, addr1, sdk.NewCoins(val0Coin)), + banktypes.NewMsgSend(val1.Address, addr1, sdk.NewCoins(val1Coin)), + ) + txBuilder.SetFeeAmount(sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10)))) + txBuilder.SetGasLimit(testdata.NewTestGasLimit()) + s.Require().Equal([]sdk.AccAddress{val0.Address, val1.Address}, txBuilder.GetTx().GetSigners()) + + // Write the unsigned tx into a file. + txJSON, err := val0.ClientCtx.TxConfig.TxJSONEncoder()(txBuilder.GetTx()) + s.Require().NoError(err) + unsignedTxFile := testutil.WriteToNewTempFile(s.T(), string(txJSON)) + + // Let val0 sign first the file with the unsignedTx. + signedByVal0, err := authtest.TxSignExec(val0.ClientCtx, val0.Address, unsignedTxFile.Name(), "--overwrite") + s.Require().NoError(err) + signedByVal0File := testutil.WriteToNewTempFile(s.T(), signedByVal0.String()) + + // Then let val1 sign the file with signedByVal0. + val1AccNum, val1Seq, err := val0.ClientCtx.AccountRetriever.GetAccountNumberSequence(val0.ClientCtx, val1.Address) + s.Require().NoError(err) + signedTx, err := authtest.TxSignExec( + val1.ClientCtx, val1.Address, signedByVal0File.Name(), + "--offline", fmt.Sprintf("--account-number=%d", val1AccNum), fmt.Sprintf("--sequence=%d", val1Seq), + ) + s.Require().NoError(err) + signedTxFile := testutil.WriteToNewTempFile(s.T(), signedTx.String()) + + // Now let's try to send this tx. + res, err := authtest.TxBroadcastExec(val0.ClientCtx, signedTxFile.Name(), fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock)) + s.Require().NoError(err) + var txRes sdk.TxResponse + s.Require().NoError(val0.ClientCtx.JSONMarshaler.UnmarshalJSON(res.Bytes(), &txRes)) + s.Require().Equal(uint32(0), txRes.Code) + + // Make sure the addr1's balance got funded. + queryResJSON, err := bankcli.QueryBalancesExec(val0.ClientCtx, addr1) + s.Require().NoError(err) + var queryRes banktypes.QueryAllBalancesResponse + err = val0.ClientCtx.JSONMarshaler.UnmarshalJSON(queryResJSON.Bytes(), &queryRes) + s.Require().NoError(err) + s.Require().Equal(sdk.NewCoins(val0Coin, val1Coin), queryRes.Balances) +} + func TestIntegrationTestSuite(t *testing.T) { suite.Run(t, new(IntegrationTestSuite)) }