diff --git a/CHANGELOG.md b/CHANGELOG.md index 72dc04203087..de7274cfe386 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### Features +* (testutil) [#17868](https://github.com/cosmos/cosmos-sdk/pull/17868) Added helper method `SubmitTestTx` in testutil to broadcast test txns to test e2e tests. * (x/protocolpool) [#17657](https://github.com/cosmos/cosmos-sdk/pull/17657) Create a new `x/protocolpool` module that is responsible for handling community pool funds. This module is split out into a new module from x/distribution. * (baseapp) [#16581](https://github.com/cosmos/cosmos-sdk/pull/16581) Implement Optimistic Execution as an experimental feature (not enabled by default). * (client/keys) [#17639](https://github.com/cosmos/cosmos-sdk/pull/17639) Allows using and saving public keys encoded as base64 @@ -64,6 +65,7 @@ Ref: https://keepachangelog.com/en/1.0.0/ ### API Breaking Changes +* (testutil) [#17868](https://github.com/cosmos/cosmos-sdk/pull/17868) `MsgSendExec` has been removed because of AutoCLI migration. * (x/distribution) [#17657](https://github.com/cosmos/cosmos-sdk/pull/17657) The `FundCommunityPool` and `DistributeFromFeePool` keeper methods are now removed from x/distribution. * (x/distribution) [#17657](https://github.com/cosmos/cosmos-sdk/pull/17657) The distribution module keeper now takes a new argument `PoolKeeper` in addition. * (app) [#17838](https://github.com/cosmos/cosmos-sdk/pull/17838) Params module was removed from simapp and all imports of the params module removed throughout the repo. diff --git a/tests/e2e/auth/suite.go b/tests/e2e/auth/suite.go index a8e4a64c4511..39b2231fa1d4 100644 --- a/tests/e2e/auth/suite.go +++ b/tests/e2e/auth/suite.go @@ -16,7 +16,6 @@ import ( "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" - addresscodec "github.com/cosmos/cosmos-sdk/codec/address" "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" @@ -31,7 +30,6 @@ import ( authcli "github.com/cosmos/cosmos-sdk/x/auth/client/cli" authclitestutil "github.com/cosmos/cosmos-sdk/x/auth/client/testutil" authtestutil "github.com/cosmos/cosmos-sdk/x/auth/testutil" - bank "github.com/cosmos/cosmos-sdk/x/bank/client/cli" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/genutil/client/cli" govtestutil "github.com/cosmos/cosmos-sdk/x/gov/client/testutil" @@ -99,15 +97,20 @@ func (s *E2ETestSuite) TestCLISignGenOnly() { s.Require().NoError(err) sendTokens := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(10))) - args := []string{ - keyName, // from keyname - val2.Address.String(), - sendTokens.String(), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), // shouldn't break if we use keyname with --generate-only flag - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), + msgSend := &banktypes.MsgSend{ + FromAddress: val.Address.String(), + ToAddress: val2.Address.String(), + Amount: sendTokens, } - generatedStd, err := clitestutil.ExecTestCLICmd(val.ClientCtx, bank.NewSendTxCmd(addresscodec.NewBech32Codec("cosmos")), args) + + generatedStd, err := clitestutil.SubmitTestTx( + val.ClientCtx, + msgSend, + val.Address, + clitestutil.TestTxConfig{ + GenOnly: true, + }, + ) s.Require().NoError(err) opFile := testutil.WriteToNewTempFile(s.T(), generatedStd.String()) defer opFile.Close() @@ -208,11 +211,16 @@ func (s *E2ETestSuite) TestCLISignBatch() { sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10)), ) - generatedStd, err := s.createBankMsg(val, val.Address, - sendTokens, fmt.Sprintf("--%s=true", flags.FlagGenerateOnly)) + generatedStd, err := s.createBankMsg( + val, + val.Address, + sendTokens, clitestutil.TestTxConfig{ + GenOnly: true, + }, + ) s.Require().NoError(err) - outputFile := testutil.WriteToNewTempFile(s.T(), strings.Repeat(generatedStd.String(), 3)) + outputFile := testutil.WriteToNewTempFile(s.T(), strings.Repeat(generatedStd.String()+"\n", 3)) defer outputFile.Close() val.ClientCtx.HomeDir = strings.Replace(val.ClientCtx.HomeDir, "simd", "simcli", 1) @@ -244,7 +252,7 @@ func (s *E2ETestSuite) TestCLISignBatch() { s.Require().Equal(3, len(strings.Split(strings.Trim(res.String(), "\n"), "\n"))) // Sign batch malformed tx file. - malformedFile := testutil.WriteToNewTempFile(s.T(), fmt.Sprintf("%smalformed", generatedStd)) + malformedFile := testutil.WriteToNewTempFile(s.T(), fmt.Sprintf("malformed%s", generatedStd)) defer malformedFile.Close() _, err = authclitestutil.TxSignBatchExec(val.ClientCtx, val.Address, malformedFile.Name(), fmt.Sprintf("--%s=%s", flags.FlagChainID, val.ClientCtx.ChainID)) s.Require().Error(err) @@ -268,6 +276,7 @@ func (s *E2ETestSuite) TestCLISignBatch() { val, addr, sdk.NewCoins(sdk.NewInt64Coin(s.cfg.BondDenom, 1000)), + clitestutil.TestTxConfig{}, ) s.Require().NoError(err) s.Require().NoError(s.network.WaitForNextBlock()) @@ -300,15 +309,17 @@ func (s *E2ETestSuite) TestCLIQueryTxCmdByHash() { s.Require().NoError(err) // Send coins. - out, err := s.createBankMsg( - val, addr, + res, err := s.createBankMsg( + val, + addr, sdk.NewCoins(sendTokens), + clitestutil.TestTxConfig{}, ) s.Require().NoError(err) s.Require().NoError(s.network.WaitForNextBlock()) var txRes sdk.TxResponse - s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &txRes)) + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(res.Bytes(), &txRes)) testCases := []struct { name string @@ -380,15 +391,18 @@ func (s *E2ETestSuite) TestCLIQueryTxCmdByEvents() { s.Require().NoError(err) // Send coins. - out, err := s.createBankMsg( - val, addr2, + res, err := s.createBankMsg( + val, + addr2, sdk.NewCoins(sendTokens), + clitestutil.TestTxConfig{}, ) s.Require().NoError(err) var txRes sdk.TxResponse - s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &txRes)) + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(res.Bytes(), &txRes)) s.Require().NoError(s.network.WaitForNextBlock()) + var out testutil.BufferWriter // Query the tx by hash to get the inner tx. err = s.network.RetryForBlocks(func() error { out, err = clitestutil.ExecTestCLICmd(val.ClientCtx, authcli.QueryTxCmd(), []string{txRes.TxHash, fmt.Sprintf("--%s=json", flags.FlagOutput)}) @@ -500,16 +514,18 @@ func (s *E2ETestSuite) TestCLIQueryTxsCmdByEvents() { addr2, err := account2.GetAddress() s.Require().NoError(err) // Send coins. - out, err := s.createBankMsg( + res, err := s.createBankMsg( val, addr2, sdk.NewCoins(sendTokens), + clitestutil.TestTxConfig{}, ) s.Require().NoError(err) var txRes sdk.TxResponse - s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &txRes)) + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(res.Bytes(), &txRes)) s.Require().NoError(s.network.WaitForNextBlock()) + var out testutil.BufferWriter // Query the tx by hash to get the inner tx. err = s.network.RetryForBlocks(func() error { out, err = clitestutil.ExecTestCLICmd(val.ClientCtx, authcli.QueryTxCmd(), []string{txRes.TxHash, fmt.Sprintf("--%s=json", flags.FlagOutput)}) @@ -579,8 +595,14 @@ func (s *E2ETestSuite) TestCLISendGenerateSignAndBroadcast() { addr, err := account.GetAddress() s.Require().NoError(err) - normalGeneratedTx, err := s.createBankMsg(val1, addr, - sdk.NewCoins(sendTokens), fmt.Sprintf("--%s=true", flags.FlagGenerateOnly)) + normalGeneratedTx, err := s.createBankMsg( + val1, + addr, + sdk.NewCoins(sendTokens), + clitestutil.TestTxConfig{ + GenOnly: true, + }, + ) s.Require().NoError(err) txCfg := val1.ClientCtx.TxConfig @@ -597,8 +619,10 @@ func (s *E2ETestSuite) TestCLISendGenerateSignAndBroadcast() { // Test generate sendTx with --gas=$amount limitedGasGeneratedTx, err := s.createBankMsg(val1, addr, - sdk.NewCoins(sendTokens), fmt.Sprintf("--gas=%d", 100), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), + sdk.NewCoins(sendTokens), clitestutil.TestTxConfig{ + GenOnly: true, + Gas: 100, + }, ) s.Require().NoError(err) @@ -621,9 +645,13 @@ func (s *E2ETestSuite) TestCLISendGenerateSignAndBroadcast() { startTokens := balRes.Balances.AmountOf(s.cfg.BondDenom) // Test generate sendTx, estimate gas - finalGeneratedTx, err := s.createBankMsg(val1, addr, - sdk.NewCoins(sendTokens), fmt.Sprintf("--gas=%d", flags.DefaultGasLimit), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly)) + finalGeneratedTx, err := s.createBankMsg( + val1, + addr, + sdk.NewCoins(sendTokens), clitestutil.TestTxConfig{ + GenOnly: true, + Gas: flags.DefaultGasLimit, + }) s.Require().NoError(err) finalStdTx, err := txCfg.TxJSONDecoder()(finalGeneratedTx.Bytes()) @@ -736,23 +764,26 @@ func (s *E2ETestSuite) TestCLIMultisignInsufficientCosigners() { sdk.NewCoins( sdk.NewInt64Coin(s.cfg.BondDenom, 10), ), + clitestutil.TestTxConfig{}, ) s.Require().NoError(err) s.Require().NoError(s.network.WaitForNextBlock()) + coins := sdk.NewCoins(sdk.NewInt64Coin(s.cfg.BondDenom, 5)) + msgSend := &banktypes.MsgSend{ + FromAddress: addr.String(), + ToAddress: val1.Address.String(), + Amount: coins, + } + // Generate multisig transaction. - multiGeneratedTx, err := clitestutil.MsgSendExec( + multiGeneratedTx, err := clitestutil.SubmitTestTx( val1.ClientCtx, + msgSend, addr, - val1.Address, - sdk.NewCoins( - sdk.NewInt64Coin(s.cfg.BondDenom, 5), - ), - addresscodec.NewBech32Codec("cosmos"), - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), + clitestutil.TestTxConfig{ + GenOnly: true, + }, ) s.Require().NoError(err) @@ -789,8 +820,10 @@ func (s *E2ETestSuite) TestCLIEncode() { normalGeneratedTx, err := s.createBankMsg( val1, val1.Address, sdk.NewCoins(sendTokens), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), - fmt.Sprintf("--%s=deadbeef", flags.FlagNote), + clitestutil.TestTxConfig{ + GenOnly: true, + Memo: "deadbeef", + }, ) s.Require().NoError(err) savedTxFile := testutil.WriteToNewTempFile(s.T(), normalGeneratedTx.String()) @@ -846,6 +879,7 @@ func (s *E2ETestSuite) TestCLIMultisignSortSignatures() { val1, addr, sdk.NewCoins(sendTokens), + clitestutil.TestTxConfig{}, ) s.Require().NoError(err) s.Require().NoError(s.network.WaitForNextBlock()) @@ -857,19 +891,21 @@ func (s *E2ETestSuite) TestCLIMultisignSortSignatures() { diff, _ := balRes.Balances.SafeSub(intialCoins...) s.Require().Equal(sendTokens.Amount, diff.AmountOf(s.cfg.BondDenom)) + tokens := sdk.NewCoins(sdk.NewInt64Coin(s.cfg.BondDenom, 5)) + msgSend := &banktypes.MsgSend{ + FromAddress: addr.String(), + ToAddress: val1.Address.String(), + Amount: tokens, + } + // Generate multisig transaction. - multiGeneratedTx, err := clitestutil.MsgSendExec( + multiGeneratedTx, err := clitestutil.SubmitTestTx( val1.ClientCtx, + msgSend, addr, - val1.Address, - sdk.NewCoins( - sdk.NewInt64Coin(s.cfg.BondDenom, 5), - ), - addresscodec.NewBech32Codec("cosmos"), - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), + clitestutil.TestTxConfig{ + GenOnly: true, + }, ) s.Require().NoError(err) @@ -935,19 +971,23 @@ func (s *E2ETestSuite) TestSignWithMultisig() { multisigAddr, err := sdk.AccAddressFromBech32(multisig) s.Require().NoError(err) + tokens := sdk.NewCoins( + sdk.NewInt64Coin(s.cfg.BondDenom, 5), + ) + msgSend := &banktypes.MsgSend{ + FromAddress: val1.Address.String(), + ToAddress: val1.Address.String(), + Amount: tokens, + } + // Generate a transaction for testing --multisig with an address not in the keyring. - multisigTx, err := clitestutil.MsgSendExec( + multisigTx, err := clitestutil.SubmitTestTx( val1.ClientCtx, + msgSend, val1.Address, - val1.Address, - sdk.NewCoins( - sdk.NewInt64Coin(s.cfg.BondDenom, 5), - ), - addresscodec.NewBech32Codec("cosmos"), - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), + clitestutil.TestTxConfig{ + GenOnly: true, + }, ) s.Require().NoError(err) @@ -985,6 +1025,7 @@ func (s *E2ETestSuite) TestCLIMultisign() { _, err = s.createBankMsg( val1, addr, sdk.NewCoins(sendTokens), + clitestutil.TestTxConfig{}, ) s.Require().NoError(err) s.Require().NoError(s.network.WaitForNextBlock()) @@ -1000,19 +1041,21 @@ func (s *E2ETestSuite) TestCLIMultisign() { s.Require().NoError(err) s.Require().True(sendTokens.Amount.Equal(balRes.Balances.AmountOf(s.cfg.BondDenom))) + tokens := sdk.NewCoins(sdk.NewInt64Coin(s.cfg.BondDenom, 5)) + msgSend := &banktypes.MsgSend{ + FromAddress: addr.String(), + ToAddress: val1.Address.String(), + Amount: tokens, + } + // Generate multisig transaction. - multiGeneratedTx, err := clitestutil.MsgSendExec( + multiGeneratedTx, err := clitestutil.SubmitTestTx( val1.ClientCtx, + msgSend, addr, - val1.Address, - sdk.NewCoins( - sdk.NewInt64Coin(s.cfg.BondDenom, 5), - ), - addresscodec.NewBech32Codec("cosmos"), - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), + clitestutil.TestTxConfig{ + GenOnly: true, + }, ) s.Require().NoError(err) @@ -1091,22 +1134,27 @@ func (s *E2ETestSuite) TestSignBatchMultisig() { val, addr, sdk.NewCoins(sendTokens), + clitestutil.TestTxConfig{}, ) s.Require().NoError(err) s.Require().NoError(s.network.WaitForNextBlock()) - generatedStd, err := clitestutil.MsgSendExec( + tokens := sdk.NewCoins( + sdk.NewCoin(s.cfg.BondDenom, math.NewInt(1)), + ) + msgSend := &banktypes.MsgSend{ + FromAddress: addr.String(), + ToAddress: val.Address.String(), + Amount: tokens, + } + + generatedStd, err := clitestutil.SubmitTestTx( val.ClientCtx, + msgSend, addr, - val.Address, - sdk.NewCoins( - sdk.NewCoin(s.cfg.BondDenom, math.NewInt(1)), - ), - addresscodec.NewBech32Codec("cosmos"), - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), + clitestutil.TestTxConfig{ + GenOnly: true, + }, ) s.Require().NoError(err) @@ -1157,27 +1205,30 @@ func (s *E2ETestSuite) TestMultisignBatch() { val, addr, sdk.NewCoins(sendTokens), + clitestutil.TestTxConfig{}, ) s.Require().NoError(err) s.Require().NoError(s.network.WaitForNextBlock()) - generatedStd, err := clitestutil.MsgSendExec( + tokens := sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(1))) + msgSend := &banktypes.MsgSend{ + FromAddress: addr.String(), + ToAddress: val.Address.String(), + Amount: tokens, + } + + generatedStd, err := clitestutil.SubmitTestTx( val.ClientCtx, + msgSend, addr, - val.Address, - sdk.NewCoins( - sdk.NewCoin(s.cfg.BondDenom, math.NewInt(1)), - ), - addresscodec.NewBech32Codec("cosmos"), - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), + clitestutil.TestTxConfig{ + GenOnly: true, + }, ) s.Require().NoError(err) // Write the output to disk - filename := testutil.WriteToNewTempFile(s.T(), strings.Repeat(generatedStd.String(), 3)) + filename := testutil.WriteToNewTempFile(s.T(), strings.Repeat(generatedStd.String()+"\n", 3)) defer filename.Close() val.ClientCtx.HomeDir = strings.Replace(val.ClientCtx.HomeDir, "simd", "simcli", 1) @@ -1476,7 +1527,12 @@ func (s *E2ETestSuite) TestAuxToFeeWithTips() { tip := sdk.NewCoin(fmt.Sprintf("%stoken", val.Moniker), math.NewInt(1000)) require.NoError(s.network.WaitForNextBlock()) - _, err = s.createBankMsg(val, tipper, sdk.NewCoins(tipperInitialBal)) + _, err = s.createBankMsg( + val, + tipper, + sdk.NewCoins(tipperInitialBal), + clitestutil.TestTxConfig{}, + ) require.NoError(err) require.NoError(s.network.WaitForNextBlock()) @@ -1709,16 +1765,14 @@ func (s *E2ETestSuite) TestAuxToFeeWithTips() { } } -func (s *E2ETestSuite) createBankMsg(val *network.Validator, toAddr sdk.AccAddress, amount sdk.Coins, extraFlags ...string) (testutil.BufferWriter, error) { - flags := []string{ - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, - sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), +func (s *E2ETestSuite) createBankMsg(val *network.Validator, toAddr sdk.AccAddress, amount sdk.Coins, config clitestutil.TestTxConfig) (testutil.BufferWriter, error) { + msgSend := &banktypes.MsgSend{ + FromAddress: val.Address.String(), + ToAddress: toAddr.String(), + Amount: amount, } - flags = append(flags, extraFlags...) - return clitestutil.MsgSendExec(val.ClientCtx, val.Address, toAddr, amount, addresscodec.NewBech32Codec("cosmos"), flags...) + return clitestutil.SubmitTestTx(val.ClientCtx, msgSend, val.Address, config) } func (s *E2ETestSuite) getBalances(clientCtx client.Context, addr sdk.AccAddress, denom string) math.Int { diff --git a/tests/e2e/authz/tx.go b/tests/e2e/authz/tx.go index 225a8332e8ad..194a26c8019f 100644 --- a/tests/e2e/authz/tx.go +++ b/tests/e2e/authz/tx.go @@ -147,14 +147,22 @@ func (s *E2ETestSuite) createAccount(uid string) sdk.AccAddress { func (s *E2ETestSuite) msgSendExec(grantee sdk.AccAddress) { val := s.network.Validators[0] // Send some funds to the new account. - out, err := clitestutil.MsgSendExec( + + from := val.Address + coins := sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(200))) + msgSend := &bank.MsgSend{ + FromAddress: from.String(), + ToAddress: grantee.String(), + Amount: coins, + } + + out, err := clitestutil.SubmitTestTx( val.ClientCtx, - val.Address, - grantee, - sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(200))), addresscodec.NewBech32Codec("cosmos"), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), + msgSend, + from, + clitestutil.TestTxConfig{}, ) + s.Require().NoError(err) s.Require().Contains(out.String(), `"code":0`) s.Require().NoError(s.network.WaitForNextBlock()) @@ -495,20 +503,24 @@ func (s *E2ETestSuite) TestNewExecGrantAuthorized() { s.Require().NoError(err) s.Require().NoError(s.network.WaitForNextBlock()) + from := val.Address tokens := sdk.NewCoins( sdk.NewCoin(fmt.Sprintf("%stoken", val.Moniker), math.NewInt(12)), ) - normalGeneratedTx, err := clitestutil.MsgSendExec( + msgSend := &bank.MsgSend{ + FromAddress: from.String(), + ToAddress: grantee.String(), + Amount: tokens, + } + normalGeneratedTx, err := clitestutil.SubmitTestTx( val.ClientCtx, - val.Address, - grantee, - tokens, - addresscodec.NewBech32Codec("cosmos"), - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), + msgSend, + from, + clitestutil.TestTxConfig{ + GenOnly: true, + }, ) + s.Require().NoError(err) execMsg := testutil.WriteToNewTempFile(s.T(), normalGeneratedTx.String()) defer execMsg.Close() @@ -609,35 +621,40 @@ func (s *E2ETestSuite) TestExecSendAuthzWithAllowList() { s.Require().NoError(err) s.Require().NoError(s.network.WaitForNextBlock()) + from := val.Address tokens := sdk.NewCoins( sdk.NewCoin("stake", math.NewInt(12)), ) + msgSend := &bank.MsgSend{ + FromAddress: from.String(), + ToAddress: allowedAddr.String(), + Amount: tokens, + } - validGeneratedTx, err := clitestutil.MsgSendExec( + validGeneratedTx, err := clitestutil.SubmitTestTx( val.ClientCtx, - val.Address, - allowedAddr, - tokens, - addresscodec.NewBech32Codec("cosmos"), - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), + msgSend, + from, + clitestutil.TestTxConfig{ + GenOnly: true, + }, ) s.Require().NoError(err) execMsg := testutil.WriteToNewTempFile(s.T(), validGeneratedTx.String()) defer execMsg.Close() - invalidGeneratedTx, err := clitestutil.MsgSendExec( + msgSend1 := &bank.MsgSend{ + FromAddress: from.String(), + ToAddress: notAllowedAddr.String(), + Amount: tokens, + } + invalidGeneratedTx, err := clitestutil.SubmitTestTx( val.ClientCtx, - val.Address, - notAllowedAddr, - tokens, - addresscodec.NewBech32Codec("cosmos"), - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), + msgSend1, + from, + clitestutil.TestTxConfig{ + GenOnly: true, + }, ) s.Require().NoError(err) execMsg1 := testutil.WriteToNewTempFile(s.T(), invalidGeneratedTx.String()) diff --git a/tests/e2e/bank/suite.go b/tests/e2e/bank/suite.go index 48b34f12b483..0cb3d837fe24 100644 --- a/tests/e2e/bank/suite.go +++ b/tests/e2e/bank/suite.go @@ -2,8 +2,6 @@ package client import ( "fmt" - "io" - "os" "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/suite" @@ -98,23 +96,29 @@ func (s *E2ETestSuite) TearDownSuite() { func (s *E2ETestSuite) TestNewSendTxCmdGenOnly() { val := s.network.Validators[0] - clientCtx := val.ClientCtx - from := val.Address to := val.Address amount := sdk.NewCoins( sdk.NewCoin(fmt.Sprintf("%stoken", val.Moniker), math.NewInt(10)), sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10)), ) - args := []string{ - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), + + msgSend := &types.MsgSend{ + FromAddress: from.String(), + ToAddress: to.String(), + Amount: amount, } - bz, err := clitestutil.MsgSendExec(clientCtx, from, to, amount, addresscodec.NewBech32Codec("cosmos"), args...) + bz, err := clitestutil.SubmitTestTx( + val.ClientCtx, + msgSend, + from, + clitestutil.TestTxConfig{ + GenOnly: true, + }, + ) s.Require().NoError(err) + tx, err := s.cfg.TxConfig.TxJSONDecoder()(bz.Bytes()) s.Require().NoError(err) s.Require().Equal([]sdk.Msg{types.NewMsgSend(from, to, amount)}, tx.GetMsgs()) @@ -123,33 +127,30 @@ func (s *E2ETestSuite) TestNewSendTxCmdGenOnly() { func (s *E2ETestSuite) TestNewSendTxCmdDryRun() { val := s.network.Validators[0] - clientCtx := val.ClientCtx - from := val.Address to := val.Address amount := sdk.NewCoins( sdk.NewCoin(fmt.Sprintf("%stoken", val.Moniker), math.NewInt(10)), sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10)), ) - args := []string{ - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), - fmt.Sprintf("--%s=true", flags.FlagDryRun), - } - oldSterr := os.Stderr - r, w, _ := os.Pipe() - os.Stderr = w + msgSend := &types.MsgSend{ + FromAddress: from.String(), + ToAddress: to.String(), + Amount: amount, + } - _, err := clitestutil.MsgSendExec(clientCtx, from, to, amount, addresscodec.NewBech32Codec("cosmos"), args...) + out, err := clitestutil.SubmitTestTx( + val.ClientCtx, + msgSend, + from, + clitestutil.TestTxConfig{ + Simulate: true, + }, + ) s.Require().NoError(err) - - w.Close() - out, _ := io.ReadAll(r) - os.Stderr = oldSterr - - s.Require().Regexp("gas estimate: [0-9]+", string(out)) + s.Require().Regexp("\"gas_info\"", out.String()) + s.Require().Regexp("\"gas_used\":\"[0-9]+\"", out.String()) } func (s *E2ETestSuite) TestNewSendTxCmd() { @@ -159,7 +160,7 @@ func (s *E2ETestSuite) TestNewSendTxCmd() { name string from, to sdk.AccAddress amount sdk.Coins - args []string + config clitestutil.TestTxConfig expectErr bool expectedCode uint32 respType proto.Message @@ -172,30 +173,11 @@ func (s *E2ETestSuite) TestNewSendTxCmd() { sdk.NewCoin(fmt.Sprintf("%stoken", val.Moniker), math.NewInt(10)), sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10)), ), - []string{ - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), + clitestutil.TestTxConfig{ + Fee: sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))), }, false, 0, &sdk.TxResponse{}, }, - { - "chain-id shouldn't be used with offline and generate-only flags", - val.Address, - val.Address, - sdk.NewCoins( - sdk.NewCoin(fmt.Sprintf("%stoken", val.Moniker), math.NewInt(10)), - sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10)), - ), - []string{ - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), - fmt.Sprintf("--%s=true", flags.FlagOffline), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), - }, - true, 0, &sdk.TxResponse{}, - }, { "not enough fees", val.Address, @@ -204,11 +186,10 @@ func (s *E2ETestSuite) TestNewSendTxCmd() { sdk.NewCoin(fmt.Sprintf("%stoken", val.Moniker), math.NewInt(10)), sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10)), ), - []string{ - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(1))).String()), + clitestutil.TestTxConfig{ + Fee: sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(1))), }, + false, sdkerrors.ErrInsufficientFee.ABCICode(), &sdk.TxResponse{}, @@ -221,11 +202,9 @@ func (s *E2ETestSuite) TestNewSendTxCmd() { sdk.NewCoin(fmt.Sprintf("%stoken", val.Moniker), math.NewInt(10)), sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10)), ), - []string{ - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), - "--gas=10", + clitestutil.TestTxConfig{ + Gas: 10, + Fee: sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))), }, false, sdkerrors.ErrOutOfGas.ABCICode(), @@ -240,7 +219,12 @@ func (s *E2ETestSuite) TestNewSendTxCmd() { s.Run(tc.name, func() { clientCtx := val.ClientCtx - bz, err := clitestutil.MsgSendExec(clientCtx, tc.from, tc.to, tc.amount, addresscodec.NewBech32Codec("cosmos"), tc.args...) + msgSend := types.MsgSend{ + FromAddress: tc.from.String(), + ToAddress: tc.to.String(), + Amount: tc.amount, + } + bz, err := clitestutil.SubmitTestTx(val.ClientCtx, &msgSend, tc.from, tc.config) if tc.expectErr { s.Require().Error(err) } else { diff --git a/tests/e2e/distribution/withdraw_all_suite.go b/tests/e2e/distribution/withdraw_all_suite.go index 18a7a5b11555..4110f88bf077 100644 --- a/tests/e2e/distribution/withdraw_all_suite.go +++ b/tests/e2e/distribution/withdraw_all_suite.go @@ -17,6 +17,7 @@ import ( clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" "github.com/cosmos/cosmos-sdk/testutil/network" sdk "github.com/cosmos/cosmos-sdk/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/distribution/client/cli" stakingcli "github.com/cosmos/cosmos-sdk/x/staking/client/cli" ) @@ -62,14 +63,19 @@ func (s *WithdrawAllTestSuite) TestNewWithdrawAllRewardsGenerateOnly() { require.NoError(err) newAddr := sdk.AccAddress(pubkey.Address()) - _, err = clitestutil.MsgSendExec( + + msgSend := &banktypes.MsgSend{ + FromAddress: val.Address.String(), + ToAddress: newAddr.String(), + Amount: sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(2000))), + } + _, err = clitestutil.SubmitTestTx( val.ClientCtx, + msgSend, val.Address, - newAddr, - sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(2000))), address.NewBech32Codec("cosmos"), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), + clitestutil.TestTxConfig{}, ) + require.NoError(err) require.NoError(s.network.WaitForNextBlock()) diff --git a/tests/e2e/group/suite.go b/tests/e2e/group/suite.go index 6d1525e543aa..d2c1b6a14afd 100644 --- a/tests/e2e/group/suite.go +++ b/tests/e2e/group/suite.go @@ -12,7 +12,6 @@ import ( "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/cosmos/cosmos-sdk/codec/address" "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" "github.com/cosmos/cosmos-sdk/testutil" @@ -68,16 +67,21 @@ func (s *E2ETestSuite) SetupSuite() { s.Require().NoError(err) account := sdk.AccAddress(pk.Address()) - _, err = clitestutil.MsgSendExec( + msgSend := &banktypes.MsgSend{ + FromAddress: val.Address.String(), + ToAddress: account.String(), + Amount: sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(2000))), + } + + _, err = clitestutil.SubmitTestTx( val.ClientCtx, + msgSend, val.Address, - account, - sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(2000))), - address.NewBech32Codec("cosmos"), - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), + clitestutil.TestTxConfig{ + GenOnly: true, + }, ) + s.Require().NoError(err) s.Require().NoError(s.network.WaitForNextBlock()) @@ -269,11 +273,22 @@ func (s *E2ETestSuite) createGroupThresholdPolicyWithBalance(adminAddress, group addr, err := sdk.AccAddressFromBech32(groupPolicyAddress) s.Require().NoError(err) - _, err = clitestutil.MsgSendExec(clientCtx, val.Address, addr, - sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(tokens))), - address.NewBech32Codec("cosmos"), - s.commonFlags..., + + msgSend := &banktypes.MsgSend{ + FromAddress: val.Address.String(), + ToAddress: addr.String(), + Amount: sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(tokens))), + } + + _, err = clitestutil.SubmitTestTx( + val.ClientCtx, + msgSend, + val.Address, + clitestutil.TestTxConfig{ + GenOnly: true, + }, ) s.Require().NoError(err) + return groupPolicyAddress } diff --git a/tests/e2e/staking/suite.go b/tests/e2e/staking/suite.go index 174138281967..fc5b3bb9277b 100644 --- a/tests/e2e/staking/suite.go +++ b/tests/e2e/staking/suite.go @@ -19,6 +19,7 @@ import ( clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" "github.com/cosmos/cosmos-sdk/testutil/network" sdk "github.com/cosmos/cosmos-sdk/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/staking/client/cli" ) @@ -102,14 +103,18 @@ func (s *E2ETestSuite) TestBlockResults() { require.NoError(err) newAddr := sdk.AccAddress(pub.Address()) + msgSend := &banktypes.MsgSend{ + FromAddress: val.Address.String(), + ToAddress: newAddr.String(), + Amount: sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(200))), + } + // Send some funds to the new account. - _, err = clitestutil.MsgSendExec( + _, err = clitestutil.SubmitTestTx( val.ClientCtx, + msgSend, val.Address, - newAddr, - sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(200))), addresscodec.NewBech32Codec("cosmos"), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), + clitestutil.TestTxConfig{}, ) require.NoError(err) require.NoError(s.network.WaitForNextBlock()) diff --git a/tests/e2e/tx/benchmarks_test.go b/tests/e2e/tx/benchmarks_test.go index e323ddb91e26..78c1df1c8a9d 100644 --- a/tests/e2e/tx/benchmarks_test.go +++ b/tests/e2e/tx/benchmarks_test.go @@ -2,7 +2,6 @@ package tx_test import ( "context" - "fmt" "testing" "gotest.tools/v3/assert" @@ -11,9 +10,7 @@ import ( "cosmossdk.io/simapp" "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" clienttx "github.com/cosmos/cosmos-sdk/client/tx" - addresscodec "github.com/cosmos/cosmos-sdk/codec/address" "github.com/cosmos/cosmos-sdk/testutil/cli" "github.com/cosmos/cosmos-sdk/testutil/network" "github.com/cosmos/cosmos-sdk/testutil/testdata" @@ -30,7 +27,6 @@ type E2EBenchmarkSuite struct { txHeight int64 queryClient tx.ServiceClient - txRes sdk.TxResponse } // BenchmarkTx is lifted from E2ETestSuite from this package, with irrelevant state checks removed. @@ -75,12 +71,12 @@ func BenchmarkTx(b *testing.B) { assert.NilError(b, err) // Check the result and gas used are correct. // - // The 12 events are: - // - Sending Fee to the pool: coin_spent, coin_received, transfer and message.sender= - // - tx.* events: tx.fee, tx.acc_seq, tx.signature - // - Sending Amount to recipient: coin_spent, coin_received, transfer and message.sender= - // - Msg events: message.module=bank and message.action=/cosmos.bank.v1beta1.MsgSend (in one message) - assert.Equal(b, 12, len(res.GetResult().GetEvents())) + // The 10 events are: + // - Sending Fee to the pool (3 events): coin_spent, coin_received, transfer + // - tx.* events (3 events): tx.fee, tx.acc_seq, tx.signature + // - Sending Amount to recipient (3 events): coin_spent, coin_received, transfer and message.sender= + // - Msg events (1 event): message.module=bank, message.action=/cosmos.bank.v1beta1.MsgSend and message.sender= (all in one event) + assert.Equal(b, 10, len(res.GetResult().GetEvents())) assert.Assert(b, res.GetGasInfo().GetGasUsed() > 0) // Gas used sometimes change, just check it's not empty. } } @@ -104,42 +100,46 @@ func NewE2EBenchmarkSuite(tb testing.TB) *E2EBenchmarkSuite { s.queryClient = tx.NewServiceClient(val.ClientCtx) + msgSend := &banktypes.MsgSend{ + FromAddress: val.Address.String(), + ToAddress: val.Address.String(), + Amount: sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdkmath.NewInt(10))), + } + // Create a new MsgSend tx from val to itself. - out, err := cli.MsgSendExec( + out, err := cli.SubmitTestTx( val.ClientCtx, + msgSend, val.Address, - val.Address, - sdk.NewCoins( - sdk.NewCoin(s.cfg.BondDenom, sdkmath.NewInt(10)), - ), - addresscodec.NewBech32Codec("cosmos"), - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdkmath.NewInt(10))).String()), - fmt.Sprintf("--gas=%d", flags.DefaultGasLimit), - fmt.Sprintf("--%s=foobar", flags.FlagNote), + cli.TestTxConfig{ + Memo: "foobar", + }, ) + assert.NilError(tb, err) - assert.NilError(tb, val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &s.txRes)) - assert.Equal(tb, uint32(0), s.txRes.Code, s.txRes) - out, err = cli.MsgSendExec( + var txRes sdk.TxResponse + assert.NilError(tb, val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &txRes)) + assert.Equal(tb, uint32(0), txRes.Code, txRes) + + msgSend1 := &banktypes.MsgSend{ + FromAddress: val.Address.String(), + ToAddress: val.Address.String(), + Amount: sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdkmath.NewInt(1))), + } + + out, err = cli.SubmitTestTx( val.ClientCtx, + msgSend1, val.Address, - val.Address, - sdk.NewCoins( - sdk.NewCoin(s.cfg.BondDenom, sdkmath.NewInt(1)), - ), - addresscodec.NewBech32Codec("cosmos"), - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s", flags.FlagOffline), - fmt.Sprintf("--%s=0", flags.FlagAccountNumber), - fmt.Sprintf("--%s=2", flags.FlagSequence), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdkmath.NewInt(10))).String()), - fmt.Sprintf("--gas=%d", flags.DefaultGasLimit), - fmt.Sprintf("--%s=foobar", flags.FlagNote), + cli.TestTxConfig{ + Offline: true, + AccNum: 0, + Seq: 2, + Memo: "foobar", + }, ) + assert.NilError(tb, err) var tr sdk.TxResponse assert.NilError(tb, val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &tr)) diff --git a/tests/e2e/tx/service_test.go b/tests/e2e/tx/service_test.go index fa878a901f84..7a076b57ec8b 100644 --- a/tests/e2e/tx/service_test.go +++ b/tests/e2e/tx/service_test.go @@ -15,9 +15,7 @@ import ( "cosmossdk.io/simapp" "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" clienttx "github.com/cosmos/cosmos-sdk/client/tx" - addresscodec "github.com/cosmos/cosmos-sdk/codec/address" "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" kmultisig "github.com/cosmos/cosmos-sdk/crypto/keys/multisig" @@ -48,7 +46,7 @@ type E2ETestSuite struct { txHeight int64 queryClient tx.ServiceClient - txRes sdk.TxResponse + goodTxHash string } func (s *E2ETestSuite) SetupSuite() { @@ -67,45 +65,50 @@ func (s *E2ETestSuite) SetupSuite() { s.queryClient = tx.NewServiceClient(val.ClientCtx) + msgSend := &banktypes.MsgSend{ + FromAddress: val.Address.String(), + ToAddress: val.Address.String(), + Amount: sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))), + } + // Create a new MsgSend tx from val to itself. - out, err := cli.MsgSendExec( + out, err := cli.SubmitTestTx( val.ClientCtx, + msgSend, val.Address, - val.Address, - sdk.NewCoins( - sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10)), - ), - addresscodec.NewBech32Codec("cosmos"), - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), - fmt.Sprintf("--gas=%d", flags.DefaultGasLimit), - fmt.Sprintf("--%s=foobar", flags.FlagNote), + cli.TestTxConfig{ + Memo: "foobar", + }, ) + s.Require().NoError(err) - s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &s.txRes)) - s.Require().Equal(uint32(0), s.txRes.Code, s.txRes) - out, err = cli.MsgSendExec( + var txRes sdk.TxResponse + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &txRes)) + s.Require().Equal(uint32(0), txRes.Code, txRes) + s.goodTxHash = txRes.TxHash + + msgSend1 := &banktypes.MsgSend{ + FromAddress: val.Address.String(), + ToAddress: val.Address.String(), + Amount: sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(1))), + } + + out1, err := cli.SubmitTestTx( val.ClientCtx, + msgSend1, val.Address, - val.Address, - sdk.NewCoins( - sdk.NewCoin(s.cfg.BondDenom, math.NewInt(1)), - ), - addresscodec.NewBech32Codec("cosmos"), - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s", flags.FlagOffline), - fmt.Sprintf("--%s=0", flags.FlagAccountNumber), - fmt.Sprintf("--%s=2", flags.FlagSequence), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), - fmt.Sprintf("--gas=%d", flags.DefaultGasLimit), - fmt.Sprintf("--%s=foobar", flags.FlagNote), + cli.TestTxConfig{ + Offline: true, + AccNum: 0, + Seq: 2, + Memo: "foobar", + }, ) + s.Require().NoError(err) var tr sdk.TxResponse - s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &tr)) + s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out1.Bytes(), &tr)) s.Require().Equal(uint32(0), tr.Code) resp, err := cli.GetTxResponse(s.network, val.ClientCtx, tr.TxHash) @@ -419,7 +422,7 @@ func (s *E2ETestSuite) TestGetTx_GRPC() { {"nil request", nil, true, "request cannot be nil"}, {"empty request", &tx.GetTxRequest{}, true, "tx hash cannot be empty"}, {"request with dummy hash", &tx.GetTxRequest{Hash: "deadbeef"}, true, "code = NotFound desc = tx not found: deadbeef"}, - {"good request", &tx.GetTxRequest{Hash: s.txRes.TxHash}, false, ""}, + {"good request", &tx.GetTxRequest{Hash: s.goodTxHash}, false, ""}, } for _, tc := range testCases { s.Run(tc.name, func() { @@ -456,7 +459,7 @@ func (s *E2ETestSuite) TestGetTx_GRPCGateway() { }, { "good hash", - fmt.Sprintf("%s/cosmos/tx/v1beta1/txs/%s", val.APIAddress, s.txRes.TxHash), + fmt.Sprintf("%s/cosmos/tx/v1beta1/txs/%s", val.APIAddress, s.goodTxHash), false, "", }, } @@ -594,18 +597,20 @@ func (s *E2ETestSuite) TestSimMultiSigTx() { s.Require().NoError(err) // Send coins from validator to multisig. - coins := sdk.NewInt64Coin(s.cfg.BondDenom, 15) - _, err = cli.MsgSendExec( + coin := sdk.NewInt64Coin(s.cfg.BondDenom, 15) + msgSend := &banktypes.MsgSend{ + FromAddress: val1.Address.String(), + ToAddress: addr.String(), + Amount: sdk.NewCoins(coin), + } + + _, err = cli.SubmitTestTx( val1.ClientCtx, + msgSend, val1.Address, - addr, - sdk.NewCoins(coins), - addresscodec.NewBech32Codec("cosmos"), - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), - fmt.Sprintf("--gas=%d", flags.DefaultGasLimit), + cli.TestTxConfig{}, ) + s.Require().NoError(err) height, err = s.network.LatestHeight() @@ -613,21 +618,24 @@ func (s *E2ETestSuite) TestSimMultiSigTx() { _, err = s.network.WaitForHeight(height + 1) s.Require().NoError(err) + msgSend1 := &banktypes.MsgSend{ + FromAddress: addr.String(), + ToAddress: val1.Address.String(), + Amount: sdk.NewCoins( + sdk.NewInt64Coin(s.cfg.BondDenom, 5), + ), + } // Generate multisig transaction. - multiGeneratedTx, err := cli.MsgSendExec( + multiGeneratedTx, err := cli.SubmitTestTx( val1.ClientCtx, - addr, + msgSend1, val1.Address, - sdk.NewCoins( - sdk.NewInt64Coin(s.cfg.BondDenom, 5), - ), - addresscodec.NewBech32Codec("cosmos"), - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))).String()), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), - fmt.Sprintf("--%s=foobar", flags.FlagNote), + cli.TestTxConfig{ + GenOnly: true, + Memo: "foobar", + }, ) + s.Require().NoError(err) // Save tx to file diff --git a/tests/integration/auth/client/cli/suite_test.go b/tests/integration/auth/client/cli/suite_test.go index 80b0c7b24bd6..41c6380b5538 100644 --- a/tests/integration/auth/client/cli/suite_test.go +++ b/tests/integration/auth/client/cli/suite_test.go @@ -114,7 +114,7 @@ func (s *CLITestSuite) TestCLIValidateSignatures() { sdk.NewCoin("stake", math.NewInt(10))) res, err := s.createBankMsg(s.clientCtx, s.val, sendTokens, - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly)) + clitestutil.TestTxConfig{GenOnly: true}) s.Require().NoError(err) // write unsigned tx to file @@ -151,7 +151,7 @@ func (s *CLITestSuite) TestCLISignBatch() { ) generatedStd, err := s.createBankMsg(s.clientCtx, s.val, - sendTokens, fmt.Sprintf("--%s=true", flags.FlagGenerateOnly)) + sendTokens, clitestutil.TestTxConfig{GenOnly: true}) s.Require().NoError(err) outputFile := testutil.WriteToNewTempFile(s.T(), strings.Repeat(generatedStd.String(), 3)) @@ -178,6 +178,7 @@ func (s *CLITestSuite) TestCLIQueryTxCmdByHash() { out, err := s.createBankMsg( s.clientCtx, s.val, sdk.NewCoins(sendTokens), + clitestutil.TestTxConfig{}, ) s.Require().NoError(err) @@ -336,7 +337,7 @@ func (s *CLITestSuite) TestCLISendGenerateSignAndBroadcast() { sendTokens := sdk.NewCoin("stake", sdk.TokensFromConsensusPower(10, sdk.DefaultPowerReduction)) normalGeneratedTx, err := s.createBankMsg(s.clientCtx, s.val, - sdk.NewCoins(sendTokens), fmt.Sprintf("--%s=true", flags.FlagGenerateOnly)) + sdk.NewCoins(sendTokens), clitestutil.TestTxConfig{GenOnly: true}) s.Require().NoError(err) txCfg := s.clientCtx.TxConfig @@ -353,8 +354,8 @@ func (s *CLITestSuite) TestCLISendGenerateSignAndBroadcast() { // Test generate sendTx with --gas=$amount limitedGasGeneratedTx, err := s.createBankMsg(s.clientCtx, s.val, - sdk.NewCoins(sendTokens), fmt.Sprintf("--gas=%d", 100), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), + sdk.NewCoins(sendTokens), + clitestutil.TestTxConfig{GenOnly: true, Gas: 100}, ) s.Require().NoError(err) @@ -370,8 +371,7 @@ func (s *CLITestSuite) TestCLISendGenerateSignAndBroadcast() { // Test generate sendTx, estimate gas finalGeneratedTx, err := s.createBankMsg(s.clientCtx, s.val, - sdk.NewCoins(sendTokens), fmt.Sprintf("--gas=%d", flags.DefaultGasLimit), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly)) + sdk.NewCoins(sendTokens), clitestutil.TestTxConfig{GenOnly: true}) s.Require().NoError(err) finalStdTx, err := txCfg.TxJSONDecoder()(finalGeneratedTx.Bytes()) @@ -454,23 +454,23 @@ func (s *CLITestSuite) TestCLIMultisignInsufficientCosigners() { sdk.NewCoins( sdk.NewInt64Coin("stake", 10), ), + clitestutil.TestTxConfig{}, ) s.Require().NoError(err) - // Generate multisig transaction. - multiGeneratedTx, err := clitestutil.MsgSendExec( + msgSend := &banktypes.MsgSend{ + FromAddress: addr.String(), + ToAddress: s.val.String(), + Amount: sdk.NewCoins(sdk.NewInt64Coin("stake", 5)), + } + + multiGeneratedTx, err := clitestutil.SubmitTestTx( s.clientCtx, + msgSend, addr, - s.val, - sdk.NewCoins( - sdk.NewInt64Coin("stake", 5), - ), - s.ac, - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin("stake", math.NewInt(10))).String()), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), - ) + clitestutil.TestTxConfig{ + GenOnly: true, + }) s.Require().NoError(err) // Save tx to file @@ -504,8 +504,10 @@ func (s *CLITestSuite) TestCLIEncode() { normalGeneratedTx, err := s.createBankMsg( s.clientCtx, s.val, sdk.NewCoins(sendTokens), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), - fmt.Sprintf("--%s=deadbeef", flags.FlagNote), + clitestutil.TestTxConfig{ + GenOnly: true, + Memo: "deadbeef", + }, ) s.Require().NoError(err) savedTxFile := testutil.WriteToNewTempFile(s.T(), normalGeneratedTx.String()) @@ -546,20 +548,14 @@ func (s *CLITestSuite) TestCLIMultisignSortSignatures() { addr, err := multisigRecord.GetAddress() s.Require().NoError(err) + msgSend := &banktypes.MsgSend{ + FromAddress: addr.String(), + ToAddress: s.val.String(), + Amount: sdk.NewCoins(sdk.NewInt64Coin("stake", 5)), + } + // Generate multisig transaction. - multiGeneratedTx, err := clitestutil.MsgSendExec( - s.clientCtx, - addr, - s.val, - sdk.NewCoins( - sdk.NewInt64Coin("stake", 5), - ), - s.ac, - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin("stake", math.NewInt(10))).String()), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), - ) + multiGeneratedTx, err := clitestutil.SubmitTestTx(s.clientCtx, msgSend, addr, clitestutil.TestTxConfig{GenOnly: true}) s.Require().NoError(err) // Save tx to file @@ -620,20 +616,14 @@ func (s *CLITestSuite) TestSignWithMultisig() { _, err = s.ac.StringToBytes(multisig) s.Require().NoError(err) + msgSend := &banktypes.MsgSend{ + FromAddress: s.val.String(), + ToAddress: s.val.String(), + Amount: sdk.NewCoins(sdk.NewInt64Coin("stake", 5)), + } + // Generate a transaction for testing --multisig with an address not in the keyring. - multisigTx, err := clitestutil.MsgSendExec( - s.clientCtx, - s.val, - s.val, - sdk.NewCoins( - sdk.NewInt64Coin("stake", 5), - ), - s.ac, - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin("stake", math.NewInt(10))).String()), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), - ) + multisigTx, err := clitestutil.SubmitTestTx(s.clientCtx, msgSend, s.val, clitestutil.TestTxConfig{GenOnly: true}) s.Require().NoError(err) // Save multi tx to file @@ -662,20 +652,14 @@ func (s *CLITestSuite) TestCLIMultisign() { addr, err := multisigRecord.GetAddress() s.Require().NoError(err) + msgSend := &banktypes.MsgSend{ + FromAddress: addr.String(), + ToAddress: s.val.String(), + Amount: sdk.NewCoins(sdk.NewInt64Coin("stake", 5)), + } + // Generate multisig transaction. - multiGeneratedTx, err := clitestutil.MsgSendExec( - s.clientCtx, - addr, - s.val, - sdk.NewCoins( - sdk.NewInt64Coin("stake", 5), - ), - s.ac, - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin("stake", math.NewInt(10))).String()), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), - ) + multiGeneratedTx, err := clitestutil.SubmitTestTx(s.clientCtx, msgSend, addr, clitestutil.TestTxConfig{GenOnly: true}) s.Require().NoError(err) // Save tx to file @@ -734,22 +718,17 @@ func (s *CLITestSuite) TestSignBatchMultisig() { s.clientCtx, addr, sdk.NewCoins(sendTokens), + clitestutil.TestTxConfig{}, ) s.Require().NoError(err) - generatedStd, err := clitestutil.MsgSendExec( - s.clientCtx, - addr, - s.val, - sdk.NewCoins( - sdk.NewCoin("stake", math.NewInt(1)), - ), - s.ac, - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin("stake", math.NewInt(10))).String()), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), - ) + msgSend := &banktypes.MsgSend{ + FromAddress: addr.String(), + ToAddress: s.val.String(), + Amount: sdk.NewCoins(sdk.NewInt64Coin("stake", 5)), + } + + generatedStd, err := clitestutil.SubmitTestTx(s.clientCtx, msgSend, addr, clitestutil.TestTxConfig{GenOnly: true}) s.Require().NoError(err) // Write the output to disk @@ -1008,7 +987,7 @@ func (s *CLITestSuite) TestAuxToFeeWithTips() { fee := sdk.NewCoin("stake", math.NewInt(1000)) tip := sdk.NewCoin("testtoken", math.NewInt(1000)) - _, err = s.createBankMsg(s.clientCtx, tipper, sdk.NewCoins(tipperInitialBal)) + _, err = s.createBankMsg(s.clientCtx, tipper, sdk.NewCoins(tipperInitialBal), clitestutil.TestTxConfig{}) require.NoError(err) bal := s.getBalances(s.clientCtx, tipper, tip.Denom) @@ -1249,14 +1228,12 @@ func (s *CLITestSuite) getBalances(clientCtx client.Context, addr sdk.AccAddress return startTokens } -func (s *CLITestSuite) createBankMsg(clientCtx client.Context, toAddr sdk.AccAddress, amount sdk.Coins, extraFlags ...string) (testutil.BufferWriter, error) { - flags := []string{ - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, - sdk.NewCoins(sdk.NewCoin("stake", math.NewInt(10))).String()), +func (s *CLITestSuite) createBankMsg(clientCtx client.Context, toAddr sdk.AccAddress, amount sdk.Coins, cfg clitestutil.TestTxConfig) (testutil.BufferWriter, error) { + msgSend := &banktypes.MsgSend{ + FromAddress: s.val.String(), + ToAddress: toAddr.String(), + Amount: amount, } - flags = append(flags, extraFlags...) - return clitestutil.MsgSendExec(clientCtx, s.val, toAddr, amount, s.ac, flags...) + return clitestutil.SubmitTestTx(clientCtx, msgSend, s.val, cfg) } diff --git a/testutil/cli/cmd.go b/testutil/cli/cmd.go index 57b5b11ee6e5..90093fb0ec8b 100644 --- a/testutil/cli/cmd.go +++ b/testutil/cli/cmd.go @@ -1,16 +1,21 @@ package cli import ( + "bytes" "context" - "fmt" + "github.com/cosmos/gogoproto/proto" "github.com/spf13/cobra" - "cosmossdk.io/core/address" + sdkmath "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" "github.com/cosmos/cosmos-sdk/testutil" - "github.com/cosmos/cosmos-sdk/x/bank/client/cli" + sdk "github.com/cosmos/cosmos-sdk/types" + txtypes "github.com/cosmos/cosmos-sdk/types/tx" + "github.com/cosmos/cosmos-sdk/types/tx/signing" ) // ExecTestCLICmd builds the client context, mocks the output and executes the command. @@ -30,9 +35,123 @@ func ExecTestCLICmd(clientCtx client.Context, cmd *cobra.Command, extraArgs []st return out, nil } -func MsgSendExec(clientCtx client.Context, from, to, amount fmt.Stringer, ac address.Codec, extraArgs ...string) (testutil.BufferWriter, error) { - args := []string{from.String(), to.String(), amount.String()} - args = append(args, extraArgs...) +type TestTxConfig struct { + Simulate bool + GenOnly bool + Offline bool + Memo string + Gas uint64 + AccNum uint64 + Seq uint64 + Fee sdk.Coins + IsAsyncBroadcastMode bool +} + +func SubmitTestTx(clientCtx client.Context, msg proto.Message, from sdk.AccAddress, config TestTxConfig) (testutil.BufferWriter, error) { + txBuilder := clientCtx.TxConfig.NewTxBuilder() + + err := txBuilder.SetMsgs(msg) + if err != nil { + return nil, err + } + + if config.Fee != nil { + txBuilder.SetFeeAmount(config.Fee) + } else { + txBuilder.SetFeeAmount(sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(10)))) // Arbitrary fee + } + + if config.Gas != 0 { + txBuilder.SetGasLimit(config.Gas) + } else { + txBuilder.SetGasLimit(flags.DefaultGasLimit) // Need at least 100386 + } + + if config.Memo != "" { + txBuilder.SetMemo(config.Memo) + } + + if config.GenOnly { + txBz, err := clientCtx.TxConfig.TxJSONEncoder()(txBuilder.GetTx()) + if err != nil { + return nil, err + } + + out := bytes.NewBuffer(txBz) + return out, nil + } + + txFactory := tx.Factory{} + txFactory = txFactory. + WithChainID(clientCtx.ChainID). + WithKeybase(clientCtx.Keyring). + WithTxConfig(clientCtx.TxConfig). + WithSignMode(signing.SignMode_SIGN_MODE_DIRECT) + + if config.Offline { + txFactory = txFactory. + WithAccountNumber(config.AccNum). + WithSequence(config.Seq) + } else { + accNum, accSeq, err := clientCtx.AccountRetriever.GetAccountNumberSequence(clientCtx, from) + if err != nil { + return nil, err + } + + txFactory = txFactory. + WithAccountNumber(accNum). + WithSequence(accSeq) + } + + accBytes, err := clientCtx.AddressCodec.StringToBytes(from.String()) + if err != nil { + return nil, err + } + + keyRecord, err := clientCtx.Keyring.KeyByAddress(accBytes) + if err != nil { + return nil, err + } + + err = tx.Sign(context.Background(), txFactory, keyRecord.Name, txBuilder, true) + if err != nil { + return nil, err + } + + txBz, err := clientCtx.TxConfig.TxEncoder()(txBuilder.GetTx()) + if err != nil { + return nil, err + } + + clientCtx.BroadcastMode = flags.BroadcastSync + if config.IsAsyncBroadcastMode { + clientCtx.BroadcastMode = flags.BroadcastAsync + } + + var res proto.Message + + if config.Simulate { + txSvcClient := txtypes.NewServiceClient(clientCtx) + res, err = txSvcClient.Simulate(context.Background(), &txtypes.SimulateRequest{ + TxBytes: txBz, + }) + if err != nil { + return nil, err + } + + } else { + res, err = clientCtx.BroadcastTxSync(txBz) + if err != nil { + return nil, err + } + } + + bz, err := clientCtx.Codec.MarshalJSON(res) + if err != nil { + return nil, err + } + + out := bytes.NewBuffer(bz) - return ExecTestCLICmd(clientCtx, cli.NewSendTxCmd(ac), args) + return out, err } diff --git a/x/authz/client/cli/tx_test.go b/x/authz/client/cli/tx_test.go index 546042524ad7..100293f9a6fd 100644 --- a/x/authz/client/cli/tx_test.go +++ b/x/authz/client/cli/tx_test.go @@ -61,6 +61,7 @@ func TestCLITestSuite(t *testing.T) { func (s *CLITestSuite) SetupSuite() { s.encCfg = testutilmod.MakeTestEncodingConfig(gov.AppModuleBasic{}, bank.AppModuleBasic{}) s.kr = keyring.NewInMemory(s.encCfg.Codec) + s.baseCtx = client.Context{}. WithKeyring(s.kr). WithTxConfig(s.encCfg.TxConfig). @@ -180,18 +181,16 @@ func (s *CLITestSuite) msgSendExec(grantee sdk.AccAddress) { _, err := s.ac.StringToBytes("cosmos16zex22087zs656t0vedytv5wqhm6axxd5679ry") s.Require().NoError(err) - out, err := clitestutil.MsgSendExec( - s.clientCtx, - val[0].Address, - grantee, - sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(200))), - s.ac, - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(10))).String()), - ) + coins := sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(200))) + from := val[0].Address + msgSend := &banktypes.MsgSend{ + FromAddress: from.String(), + ToAddress: grantee.String(), + Amount: coins, + } + + _, err = clitestutil.SubmitTestTx(s.clientCtx, msgSend, from, clitestutil.TestTxConfig{}) s.Require().NoError(err) - s.Require().Contains(out.String(), `"code":0`) } func (s *CLITestSuite) TestCLITxGrantAuthorization() { @@ -766,19 +765,20 @@ func (s *CLITestSuite) TestNewExecGrantAuthorized() { ) s.Require().NoError(err) + from := val[0].Address tokens := sdk.NewCoins( sdk.NewCoin("testtoken", sdkmath.NewInt(12)), ) - normalGeneratedTx, err := clitestutil.MsgSendExec( + msgSend := &banktypes.MsgSend{ + FromAddress: from.String(), + ToAddress: grantee.String(), + Amount: tokens, + } + normalGeneratedTx, err := clitestutil.SubmitTestTx( s.clientCtx, - val[0].Address, - grantee, - tokens, - s.ac, - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(10))).String()), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), + msgSend, + from, + clitestutil.TestTxConfig{GenOnly: true}, ) s.Require().NoError(err) execMsg := testutil.WriteToNewTempFile(s.T(), normalGeneratedTx.String()) @@ -863,36 +863,38 @@ func (s *CLITestSuite) TestExecSendAuthzWithAllowList() { ) s.Require().NoError(err) + from := val[0].Address tokens := sdk.NewCoins( sdk.NewCoin("stake", sdkmath.NewInt(12)), ) - - validGeneratedTx, err := clitestutil.MsgSendExec( + msgSend := &banktypes.MsgSend{ + FromAddress: from.String(), + ToAddress: grantee.String(), + Amount: tokens, + } + validGeneratedTx, err := clitestutil.SubmitTestTx( s.clientCtx, - val[0].Address, - allowedAddr, - tokens, - s.ac, - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(10))).String()), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), + msgSend, + from, + clitestutil.TestTxConfig{GenOnly: true}, ) + s.Require().NoError(err) execMsg := testutil.WriteToNewTempFile(s.T(), validGeneratedTx.String()) defer execMsg.Close() - invalidGeneratedTx, err := clitestutil.MsgSendExec( + msgSend1 := &banktypes.MsgSend{ + FromAddress: from.String(), + ToAddress: notAllowedAddr.String(), + Amount: tokens, + } + invalidGeneratedTx, err := clitestutil.SubmitTestTx( s.clientCtx, - val[0].Address, - notAllowedAddr, - tokens, - s.ac, - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(10))).String()), - fmt.Sprintf("--%s=true", flags.FlagGenerateOnly), + msgSend1, + from, + clitestutil.TestTxConfig{GenOnly: true}, ) + s.Require().NoError(err) execMsg1 := testutil.WriteToNewTempFile(s.T(), invalidGeneratedTx.String()) defer execMsg1.Close() diff --git a/x/bank/autocli.go b/x/bank/autocli.go index 25d65feecb97..a4f680e3a578 100644 --- a/x/bank/autocli.go +++ b/x/bank/autocli.go @@ -87,5 +87,35 @@ func (am AppModule) AutoCLIOptions() *autocliv1.ModuleOptions { }, }, }, + Tx: &autocliv1.ServiceCommandDescriptor{ + Service: bankv1beta1.Msg_ServiceDesc.ServiceName, + EnhanceCustomCommand: true, + RpcCommandOptions: []*autocliv1.RpcCommandOptions{ + { + RpcMethod: "Send", + Use: "send [from_key_or_address] [to_address] [amount]", + Short: "Send funds from one account to another.", + Long: `Send funds from one account to another. + Note, the '--from' flag is ignored as it is implied from [from_key_or_address]. + When using '--dry-run' a key name cannot be used, only a bech32 address. + Note: multiple coins can be send by space separated.`, + PositionalArgs: []*autocliv1.PositionalArgDescriptor{{ProtoField: "from_address"}, {ProtoField: "to_address"}, {ProtoField: "amount", Varargs: true}}, + }, + { + RpcMethod: "Burn", + Use: "burn [from_key_or_address] [amount]", + Short: "Burns the amount specified from the given account.", + PositionalArgs: []*autocliv1.PositionalArgDescriptor{{ProtoField: "from_address"}, {ProtoField: "amount", Varargs: true}}, + }, + { + RpcMethod: "UpdateParams", + Skip: true, // skipped because authority gated + }, + { + RpcMethod: "SetSendEnabled", + Skip: true, // skipped because authority gated + }, + }, + }, } } diff --git a/x/bank/client/cli/tx.go b/x/bank/client/cli/tx.go index 11beeabd137e..d45db2b248f1 100644 --- a/x/bank/client/cli/tx.go +++ b/x/bank/client/cli/tx.go @@ -29,57 +29,12 @@ func NewTxCmd(ac address.Codec) *cobra.Command { } txCmd.AddCommand( - NewSendTxCmd(ac), NewMultiSendTxCmd(ac), ) return txCmd } -// NewSendTxCmd returns a CLI command handler for creating a MsgSend transaction. -func NewSendTxCmd(ac address.Codec) *cobra.Command { - cmd := &cobra.Command{ - Use: "send [from_key_or_address] [to_address] [amount]", - Short: "Send funds from one account to another.", - Long: `Send funds from one account to another. -Note, the '--from' flag is ignored as it is implied from [from_key_or_address]. -When using '--dry-run' a key name cannot be used, only a bech32 address. -`, - Args: cobra.ExactArgs(3), - RunE: func(cmd *cobra.Command, args []string) error { - err := cmd.Flags().Set(flags.FlagFrom, args[0]) - if err != nil { - return err - } - clientCtx, err := client.GetClientTxContext(cmd) - if err != nil { - return err - } - toAddr, err := ac.StringToBytes(args[1]) - if err != nil { - return err - } - - coins, err := sdk.ParseCoinsNormalized(args[2]) - if err != nil { - return err - } - - if len(coins) == 0 { - return fmt.Errorf("invalid coins") - } - - msg := types.NewMsgSend(clientCtx.GetFromAddress(), toAddr, coins) - - return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) - }, - } - - flags.AddTxFlagsToCmd(cmd) - - return cmd -} - // NewMultiSendTxCmd returns a CLI command handler for creating a MsgMultiSend transaction. // For a better UX this command is limited to send funds from one account to two or more accounts. func NewMultiSendTxCmd(ac address.Codec) *cobra.Command { diff --git a/x/bank/client/cli/tx_test.go b/x/bank/client/cli/tx_test.go index 197093aa788a..e3f4e418ea01 100644 --- a/x/bank/client/cli/tx_test.go +++ b/x/bank/client/cli/tx_test.go @@ -51,91 +51,6 @@ func (s *CLITestSuite) SetupSuite() { WithConsensusAddressCodec(addresscodec.NewBech32Codec("cosmosvalcons")) } -func (s *CLITestSuite) TestSendTxCmd() { - accounts := testutil.CreateKeyringAccounts(s.T(), s.kr, 1) - cmd := cli.NewSendTxCmd(addresscodec.NewBech32Codec("cosmos")) - cmd.SetOutput(io.Discard) - - extraArgs := []string{ - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin("photon", sdkmath.NewInt(10))).String()), - fmt.Sprintf("--%s=test-chain", flags.FlagChainID), - } - - testCases := []struct { - name string - ctxGen func() client.Context - from, to sdk.AccAddress - amount sdk.Coins - extraArgs []string - expectErrMsg string - }{ - { - "valid transaction", - func() client.Context { - return s.baseCtx - }, - accounts[0].Address, - accounts[0].Address, - sdk.NewCoins( - sdk.NewCoin("stake", sdkmath.NewInt(10)), - sdk.NewCoin("photon", sdkmath.NewInt(40)), - ), - extraArgs, - "", - }, - { - "invalid to Address", - func() client.Context { - return s.baseCtx - }, - accounts[0].Address, - sdk.AccAddress{}, - sdk.NewCoins( - sdk.NewCoin("stake", sdkmath.NewInt(10)), - sdk.NewCoin("photon", sdkmath.NewInt(40)), - ), - extraArgs, - "empty address string is not allowed", - }, - { - "invalid coins", - func() client.Context { - return s.baseCtx - }, - accounts[0].Address, - accounts[0].Address, - nil, - extraArgs, - "invalid coins", - }, - } - - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - args := append([]string{tc.from.String(), tc.to.String(), tc.amount.String()}, tc.extraArgs...) - - ctx := svrcmd.CreateExecuteContext(context.Background()) - cmd.SetContext(ctx) - cmd.SetArgs(args) - s.Require().NoError(client.SetCmdClientContextHandler(tc.ctxGen(), cmd)) - - out, err := clitestutil.ExecTestCLICmd(tc.ctxGen(), cmd, args) - if tc.expectErrMsg != "" { - s.Require().Error(err) - s.Require().Contains(out.String(), tc.expectErrMsg) - } else { - s.Require().NoError(err) - msg := &sdk.TxResponse{} - s.Require().NoError(tc.ctxGen().Codec.UnmarshalJSON(out.Bytes(), msg), out.String()) - } - }) - } -} - func (s *CLITestSuite) TestMultiSendTxCmd() { accounts := testutil.CreateKeyringAccounts(s.T(), s.kr, 3) diff --git a/x/group/client/cli/tx_test.go b/x/group/client/cli/tx_test.go index 3dd17517c1f4..79932c58e6ce 100644 --- a/x/group/client/cli/tx_test.go +++ b/x/group/client/cli/tx_test.go @@ -25,6 +25,7 @@ import ( clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" sdk "github.com/cosmos/cosmos-sdk/types" testutilmod "github.com/cosmos/cosmos-sdk/types/module/testutil" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/group" groupcli "github.com/cosmos/cosmos-sdk/x/group/client/cli" groupmodule "github.com/cosmos/cosmos-sdk/x/group/module" @@ -88,14 +89,17 @@ func (s *CLITestSuite) SetupSuite() { s.Require().NoError(err) account := sdk.AccAddress(pk.Address()) - _, err = clitestutil.MsgSendExec( - s.clientCtx, - val.Address, - account, - sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(2000))), addresscodec.NewBech32Codec("cosmos"), fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(10))).String()), - ) + + from := val.Address + coins := sdk.NewCoins(sdk.NewCoin("stake", sdkmath.NewInt(2000))) + + msgSend := &banktypes.MsgSend{ + FromAddress: from.String(), + ToAddress: account.String(), + Amount: coins, + } + + _, err = clitestutil.SubmitTestTx(s.clientCtx, msgSend, from, clitestutil.TestTxConfig{}) s.Require().NoError(err) // create a group