feat(x/bank): autocli tx support (#17868)

Co-authored-by: Julien Robert <julien@rbrt.fr>
This commit is contained in:
atheeshp
2023-10-05 14:39:45 +00:00
committed by GitHub
co-authored by Julien Robert
parent c0d2d7038e
commit 6f53f7c4a3
16 changed files with 676 additions and 583 deletions
+2
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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 {
+11 -5
View File
@@ -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
View File
@@ -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
}
+10 -5
View File
@@ -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())
+42 -42
View File
@@ -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))
+67 -59
View File
@@ -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
+59 -82
View 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
View File
@@ -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
}
+41 -39
View File
@@ -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()
+30
View File
@@ -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
},
},
},
}
}
-45
View File
@@ -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 {
-85
View File
@@ -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)
+12 -8
View File
@@ -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