feat(x/bank): autocli tx support (#17868)
Co-authored-by: Julien Robert <julien@rbrt.fr>
This commit is contained in:
co-authored by
Julien Robert
parent
c0d2d7038e
commit
6f53f7c4a3
@@ -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.
|
||||
|
||||
+155
-101
@@ -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 {
|
||||
|
||||
+50
-33
@@ -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())
|
||||
|
||||
+44
-60
@@ -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),
|
||||
|
||||
msgSend := &types.MsgSend{
|
||||
FromAddress: from.String(),
|
||||
ToAddress: to.String(),
|
||||
Amount: amount,
|
||||
}
|
||||
|
||||
oldSterr := os.Stderr
|
||||
r, w, _ := os.Pipe()
|
||||
os.Stderr = w
|
||||
|
||||
_, 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 {
|
||||
|
||||
@@ -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())
|
||||
|
||||
|
||||
+27
-12
@@ -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
|
||||
}
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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=<val1>
|
||||
// - tx.* events: tx.fee, tx.acc_seq, tx.signature
|
||||
// - Sending Amount to recipient: coin_spent, coin_received, transfer and message.sender=<val1>
|
||||
// - 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=<val1>
|
||||
// - Msg events (1 event): message.module=bank, message.action=/cosmos.bank.v1beta1.MsgSend and message.sender=<val1> (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)
|
||||
|
||||
// Create a new MsgSend tx from val to itself.
|
||||
out, err := cli.MsgSendExec(
|
||||
val.ClientCtx,
|
||||
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),
|
||||
)
|
||||
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)
|
||||
msgSend := &banktypes.MsgSend{
|
||||
FromAddress: val.Address.String(),
|
||||
ToAddress: val.Address.String(),
|
||||
Amount: sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdkmath.NewInt(10))),
|
||||
}
|
||||
|
||||
out, err = cli.MsgSendExec(
|
||||
// Create a new MsgSend tx from val to itself.
|
||||
out, err := cli.SubmitTestTx(
|
||||
val.ClientCtx,
|
||||
msgSend,
|
||||
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{
|
||||
Memo: "foobar",
|
||||
},
|
||||
)
|
||||
|
||||
assert.NilError(tb, err)
|
||||
|
||||
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,
|
||||
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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
// Create a new MsgSend tx from val to itself.
|
||||
out, err := cli.MsgSendExec(
|
||||
val.ClientCtx,
|
||||
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),
|
||||
)
|
||||
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)
|
||||
msgSend := &banktypes.MsgSend{
|
||||
FromAddress: val.Address.String(),
|
||||
ToAddress: val.Address.String(),
|
||||
Amount: sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, math.NewInt(10))),
|
||||
}
|
||||
|
||||
out, err = cli.MsgSendExec(
|
||||
// Create a new MsgSend tx from val to itself.
|
||||
out, err := cli.SubmitTestTx(
|
||||
val.ClientCtx,
|
||||
msgSend,
|
||||
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{
|
||||
Memo: "foobar",
|
||||
},
|
||||
)
|
||||
|
||||
s.Require().NoError(err)
|
||||
|
||||
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,
|
||||
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)
|
||||
|
||||
// Generate multisig transaction.
|
||||
multiGeneratedTx, err := cli.MsgSendExec(
|
||||
val1.ClientCtx,
|
||||
addr,
|
||||
val1.Address,
|
||||
sdk.NewCoins(
|
||||
msgSend1 := &banktypes.MsgSend{
|
||||
FromAddress: addr.String(),
|
||||
ToAddress: val1.Address.String(),
|
||||
Amount: 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),
|
||||
}
|
||||
// Generate multisig transaction.
|
||||
multiGeneratedTx, err := cli.SubmitTestTx(
|
||||
val1.ClientCtx,
|
||||
msgSend1,
|
||||
val1.Address,
|
||||
cli.TestTxConfig{
|
||||
GenOnly: true,
|
||||
Memo: "foobar",
|
||||
},
|
||||
)
|
||||
|
||||
s.Require().NoError(err)
|
||||
|
||||
// Save tx to file
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
+126
-7
@@ -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
|
||||
}
|
||||
|
||||
return ExecTestCLICmd(clientCtx, cli.NewSendTxCmd(ac), args)
|
||||
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 out, err
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user