diff --git a/client/tx/search.go b/client/tx/search.go index 2f3bd9070..ab1bdf177 100644 --- a/client/tx/search.go +++ b/client/tx/search.go @@ -35,12 +35,12 @@ passed to the --tag option. To match any transaction, use the --any option. For example: -$ gaiacli query txs --tags :&: +$ gaiacli query txs --tags :&: will match any transaction tagged with both = and =. To match a transaction tagged with either value1 or value2, use: -$ gaiacli query txs --tags :&: --any +$ gaiacli query txs --tags :&: --any `), RunE: func(cmd *cobra.Command, args []string) error { tagsStr := viper.GetString(flagTags) @@ -97,7 +97,7 @@ $ gaiacli query txs --tags :&: --any viper.BindPFlag(client.FlagChainID, cmd.Flags().Lookup(client.FlagChainID)) cmd.Flags().Bool(client.FlagTrustNode, false, "Trust connected full node (don't verify proofs for responses)") viper.BindPFlag(client.FlagTrustNode, cmd.Flags().Lookup(client.FlagTrustNode)) - cmd.Flags().String(flagTags, "", "key:value list of tags that must match") + cmd.Flags().String(flagTags, "", "tag:value list of tags that must match") cmd.Flags().Bool(flagAny, false, "Return transactions that match ANY tag, rather than ALL") return cmd } diff --git a/cmd/gaia/cli_test/cli_test.go b/cmd/gaia/cli_test/cli_test.go index ee773da62..d92433f29 100644 --- a/cmd/gaia/cli_test/cli_test.go +++ b/cmd/gaia/cli_test/cli_test.go @@ -14,6 +14,7 @@ import ( "github.com/stretchr/testify/require" + abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/crypto" cmn "github.com/tendermint/tendermint/libs/common" @@ -30,37 +31,6 @@ import ( stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types" ) -// import ( -// "encoding/json" -// "fmt" -// "io/ioutil" -// "os" -// "path" -// "path/filepath" -// "testing" -// -// "github.com/tendermint/tendermint/types" -// -// "github.com/stretchr/testify/require" -// -// abci "github.com/tendermint/tendermint/abci/types" -// "github.com/tendermint/tendermint/crypto" -// cmn "github.com/tendermint/tendermint/libs/common" -// -// "github.com/cosmos/cosmos-sdk/client" -// "github.com/cosmos/cosmos-sdk/client/keys" -// "github.com/cosmos/cosmos-sdk/client/tx" -// "github.com/cosmos/cosmos-sdk/cmd/gaia/app" -// "github.com/cosmos/cosmos-sdk/codec" -// "github.com/cosmos/cosmos-sdk/server" -// "github.com/cosmos/cosmos-sdk/tests" -// sdk "github.com/cosmos/cosmos-sdk/types" -// "github.com/cosmos/cosmos-sdk/x/auth" -// "github.com/cosmos/cosmos-sdk/x/gov" -// "github.com/cosmos/cosmos-sdk/x/stake" -// stakeTypes "github.com/cosmos/cosmos-sdk/x/stake/types" -// ) - var ( gaiadHome = "" gaiacliHome = "" @@ -70,270 +40,270 @@ func init() { gaiadHome, gaiacliHome = getTestingHomeDirs() } -// func TestGaiaCLIMinimumFees(t *testing.T) { -// chainID, servAddr, port := initializeFixtures(t) -// flags := fmt.Sprintf("--home=%s --node=%v --chain-id=%v", gaiacliHome, servAddr, chainID) -// -// // start gaiad server with minimum fees -// proc := tests.GoExecuteTWithStdout(t, fmt.Sprintf("gaiad start --home=%s --rpc.laddr=%v --minimum_fees=2feeToken", gaiadHome, servAddr)) -// -// defer proc.Stop(false) -// tests.WaitForTMStart(port) -// tests.WaitForNextNBlocksTM(2, port) -// -// fooAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show foo --output=json --home=%s", gaiacliHome)) -// barAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show bar --output=json --home=%s", gaiacliHome)) -// -// fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) -// require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) -// -// success := executeWrite(t, fmt.Sprintf( -// "gaiacli tx send %v --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) -// require.False(t, success) -// tests.WaitForNextNBlocksTM(2, port) -// -// } -// -// func TestGaiaCLIFeesDeduction(t *testing.T) { -// chainID, servAddr, port := initializeFixtures(t) -// flags := fmt.Sprintf("--home=%s --node=%v --chain-id=%v", gaiacliHome, servAddr, chainID) -// -// // start gaiad server with minimum fees -// proc := tests.GoExecuteTWithStdout(t, fmt.Sprintf("gaiad start --home=%s --rpc.laddr=%v --minimum_fees=1fooToken", gaiadHome, servAddr)) -// -// defer proc.Stop(false) -// tests.WaitForTMStart(port) -// tests.WaitForNextNBlocksTM(2, port) -// -// fooAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show foo --output=json --home=%s", gaiacliHome)) -// barAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show bar --output=json --home=%s", gaiacliHome)) -// -// fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) -// require.Equal(t, int64(1000), fooAcc.GetCoins().AmountOf("fooToken").Int64()) -// -// // test simulation -// success := executeWrite(t, fmt.Sprintf( -// "gaiacli tx send %v --amount=1000fooToken --to=%s --from=foo --fee=1fooToken --dry-run", flags, barAddr), app.DefaultKeyPass) -// require.True(t, success) -// tests.WaitForNextNBlocksTM(2, port) -// // ensure state didn't change -// fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) -// require.Equal(t, int64(1000), fooAcc.GetCoins().AmountOf("fooToken").Int64()) -// -// // insufficient funds (coins + fees) -// success = executeWrite(t, fmt.Sprintf( -// "gaiacli tx send %v --amount=1000fooToken --to=%s --from=foo --fee=1fooToken", flags, barAddr), app.DefaultKeyPass) -// require.False(t, success) -// tests.WaitForNextNBlocksTM(2, port) -// // ensure state didn't change -// fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) -// require.Equal(t, int64(1000), fooAcc.GetCoins().AmountOf("fooToken").Int64()) -// -// // test success (transfer = coins + fees) -// success = executeWrite(t, fmt.Sprintf( -// "gaiacli tx send %v --fee=300fooToken --amount=500fooToken --to=%s --from=foo", flags, barAddr), app.DefaultKeyPass) -// require.True(t, success) -// tests.WaitForNextNBlocksTM(2, port) -// } -// -// func TestGaiaCLISend(t *testing.T) { -// chainID, servAddr, port := initializeFixtures(t) -// flags := fmt.Sprintf("--home=%s --node=%v --chain-id=%v", gaiacliHome, servAddr, chainID) -// -// // start gaiad server -// proc := tests.GoExecuteTWithStdout(t, fmt.Sprintf("gaiad start --home=%s --rpc.laddr=%v", gaiadHome, servAddr)) -// -// defer proc.Stop(false) -// tests.WaitForTMStart(port) -// tests.WaitForNextNBlocksTM(2, port) -// -// fooAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show foo --output=json --home=%s", gaiacliHome)) -// barAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show bar --output=json --home=%s", gaiacliHome)) -// -// fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) -// require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) -// -// executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) -// tests.WaitForNextNBlocksTM(2, port) -// -// barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags)) -// require.Equal(t, int64(10), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) -// fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) -// require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) -// -// // Test --dry-run -// success := executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10%s --to=%s --from=foo --dry-run", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) -// require.True(t, success) -// // Check state didn't change -// fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) -// require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) -// -// // test autosequencing -// executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) -// tests.WaitForNextNBlocksTM(2, port) -// -// barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags)) -// require.Equal(t, int64(20), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) -// fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) -// require.Equal(t, int64(30), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) -// -// // test memo -// executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10%s --to=%s --from=foo --memo 'testmemo'", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) -// tests.WaitForNextNBlocksTM(2, port) -// -// barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags)) -// require.Equal(t, int64(30), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) -// fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) -// require.Equal(t, int64(20), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) -// } -// -// func TestGaiaCLIGasAuto(t *testing.T) { -// chainID, servAddr, port := initializeFixtures(t) -// flags := fmt.Sprintf("--home=%s --node=%v --chain-id=%v", gaiacliHome, servAddr, chainID) -// -// // start gaiad server -// proc := tests.GoExecuteTWithStdout(t, fmt.Sprintf("gaiad start --home=%s --rpc.laddr=%v", gaiadHome, servAddr)) -// -// defer proc.Stop(false) -// tests.WaitForTMStart(port) -// tests.WaitForNextNBlocksTM(2, port) -// -// fooAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show foo --output=json --home=%s", gaiacliHome)) -// barAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show bar --output=json --home=%s", gaiacliHome)) -// -// fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) -// require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) -// -// // Test failure with auto gas disabled and very little gas set by hand -// success := executeWrite(t, fmt.Sprintf("gaiacli tx send %v --gas=10 --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) -// require.False(t, success) -// tests.WaitForNextNBlocksTM(2, port) -// // Check state didn't change -// fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) -// require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) -// -// // Test failure with negative gas -// success = executeWrite(t, fmt.Sprintf("gaiacli tx send %v --gas=-100 --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) -// require.False(t, success) -// -// // Test failure with 0 gas -// success = executeWrite(t, fmt.Sprintf("gaiacli tx send %v --gas=0 --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) -// require.False(t, success) -// -// // Enable auto gas -// success, stdout, _ := executeWriteRetStdStreams(t, fmt.Sprintf("gaiacli tx send %v --json --gas=simulate --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) -// require.True(t, success) -// // check that gas wanted == gas used -// cdc := app.MakeCodec() -// jsonOutput := struct { -// Height int64 -// TxHash string -// Response abci.ResponseDeliverTx -// }{} -// require.Nil(t, cdc.UnmarshalJSON([]byte(stdout), &jsonOutput)) -// require.Equal(t, jsonOutput.Response.GasWanted, jsonOutput.Response.GasUsed) -// tests.WaitForNextNBlocksTM(2, port) -// // Check state has changed accordingly -// fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) -// require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) -// } -// -// func TestGaiaCLICreateValidator(t *testing.T) { -// chainID, servAddr, port := initializeFixtures(t) -// flags := fmt.Sprintf("--home=%s --chain-id=%v --node=%s", gaiacliHome, chainID, servAddr) -// -// // start gaiad server -// proc := tests.GoExecuteTWithStdout(t, fmt.Sprintf("gaiad start --home=%s --rpc.laddr=%v", gaiadHome, servAddr)) -// -// defer proc.Stop(false) -// tests.WaitForTMStart(port) -// tests.WaitForNextNBlocksTM(2, port) -// -// fooAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show foo --output=json --home=%s", gaiacliHome)) -// barAddr, barPubKey := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show bar --output=json --home=%s", gaiacliHome)) -// barCeshPubKey := sdk.MustBech32ifyConsPub(barPubKey) -// -// executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) -// tests.WaitForNextNBlocksTM(2, port) -// -// barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags)) -// require.Equal(t, int64(10), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) -// fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) -// require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) -// -// defaultParams := stake.DefaultParams() -// initialPool := stake.InitialPool() -// initialPool.BondedTokens = initialPool.BondedTokens.Add(sdk.NewDec(100)) // Delegate tx on GaiaAppGenState -// -// // create validator -// cvStr := fmt.Sprintf("gaiacli tx stake create-validator %v", flags) -// cvStr += fmt.Sprintf(" --from=%s", "bar") -// cvStr += fmt.Sprintf(" --pubkey=%s", barCeshPubKey) -// cvStr += fmt.Sprintf(" --amount=%v", fmt.Sprintf("2%s", stakeTypes.DefaultBondDenom)) -// cvStr += fmt.Sprintf(" --moniker=%v", "bar-vally") -// cvStr += fmt.Sprintf(" --commission-rate=%v", "0.05") -// cvStr += fmt.Sprintf(" --commission-max-rate=%v", "0.20") -// cvStr += fmt.Sprintf(" --commission-max-change-rate=%v", "0.10") -// -// initialPool.BondedTokens = initialPool.BondedTokens.Add(sdk.NewDec(1)) -// -// // Test --generate-only -// success, stdout, stderr := executeWriteRetStdStreams(t, cvStr+" --generate-only", app.DefaultKeyPass) -// require.True(t, success) -// require.True(t, success) -// require.Empty(t, stderr) -// msg := unmarshalStdTx(t, stdout) -// require.NotZero(t, msg.Fee.Gas) -// require.Equal(t, len(msg.Msgs), 1) -// require.Equal(t, 0, len(msg.GetSignatures())) -// -// // Test --dry-run -// success = executeWrite(t, cvStr+" --dry-run", app.DefaultKeyPass) -// require.True(t, success) -// -// executeWrite(t, cvStr, app.DefaultKeyPass) -// tests.WaitForNextNBlocksTM(2, port) -// -// barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags)) -// require.Equal(t, int64(8), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64(), "%v", barAcc) -// -// validator := executeGetValidator(t, fmt.Sprintf("gaiacli query stake validator %s --output=json %v", sdk.ValAddress(barAddr), flags)) -// require.Equal(t, validator.OperatorAddr, sdk.ValAddress(barAddr)) -// require.True(sdk.DecEq(t, sdk.NewDec(2), validator.Tokens)) -// -// validatorDelegations := executeGetValidatorDelegations(t, fmt.Sprintf("gaiacli query stake delegations-to %s --output=json %v", sdk.ValAddress(barAddr), flags)) -// require.Len(t, validatorDelegations, 1) -// require.NotZero(t, validatorDelegations[0].Shares) -// -// // unbond a single share -// unbondStr := fmt.Sprintf("gaiacli tx stake unbond begin %v", flags) -// unbondStr += fmt.Sprintf(" --from=%s", "bar") -// unbondStr += fmt.Sprintf(" --validator=%s", sdk.ValAddress(barAddr)) -// unbondStr += fmt.Sprintf(" --shares-amount=%v", "1") -// -// success = executeWrite(t, unbondStr, app.DefaultKeyPass) -// require.True(t, success) -// tests.WaitForNextNBlocksTM(2, port) -// -// /* // this won't be what we expect because we've only started unbonding, haven't completed -// barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %v %v", barCech, flags)) -// require.Equal(t, int64(9), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64(), "%v", barAcc) -// */ -// validator = executeGetValidator(t, fmt.Sprintf("gaiacli query stake validator %s --output=json %v", sdk.ValAddress(barAddr), flags)) -// require.Equal(t, "1.0000000000", validator.Tokens.String()) -// -// validatorUbds := executeGetValidatorUnbondingDelegations(t, -// fmt.Sprintf("gaiacli query stake unbonding-delegations-from %s --output=json %v", -// sdk.ValAddress(barAddr), flags)) -// require.Len(t, validatorUbds, 1) -// require.Equal(t, "1", validatorUbds[0].Balance.Amount.String()) -// -// params := executeGetParams(t, fmt.Sprintf("gaiacli query stake parameters --output=json %v", flags)) -// require.True(t, defaultParams.Equal(params)) -// -// pool := executeGetPool(t, fmt.Sprintf("gaiacli query stake pool --output=json %v", flags)) -// require.Equal(t, initialPool.BondedTokens, pool.BondedTokens) -// } +func TestGaiaCLIMinimumFees(t *testing.T) { + chainID, servAddr, port := initializeFixtures(t) + flags := fmt.Sprintf("--home=%s --node=%v --chain-id=%v", gaiacliHome, servAddr, chainID) + + // start gaiad server with minimum fees + proc := tests.GoExecuteTWithStdout(t, fmt.Sprintf("gaiad start --home=%s --rpc.laddr=%v --minimum_fees=2feeToken", gaiadHome, servAddr)) + + defer proc.Stop(false) + tests.WaitForTMStart(port) + tests.WaitForNextNBlocksTM(2, port) + + fooAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show foo --output=json --home=%s", gaiacliHome)) + barAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show bar --output=json --home=%s", gaiacliHome)) + + fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) + require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) + + success := executeWrite(t, fmt.Sprintf( + "gaiacli tx send %v --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) + require.False(t, success) + tests.WaitForNextNBlocksTM(2, port) + +} + +func TestGaiaCLIFeesDeduction(t *testing.T) { + chainID, servAddr, port := initializeFixtures(t) + flags := fmt.Sprintf("--home=%s --node=%v --chain-id=%v", gaiacliHome, servAddr, chainID) + + // start gaiad server with minimum fees + proc := tests.GoExecuteTWithStdout(t, fmt.Sprintf("gaiad start --home=%s --rpc.laddr=%v --minimum_fees=1fooToken", gaiadHome, servAddr)) + + defer proc.Stop(false) + tests.WaitForTMStart(port) + tests.WaitForNextNBlocksTM(2, port) + + fooAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show foo --output=json --home=%s", gaiacliHome)) + barAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show bar --output=json --home=%s", gaiacliHome)) + + fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) + require.Equal(t, int64(1000), fooAcc.GetCoins().AmountOf("fooToken").Int64()) + + // test simulation + success := executeWrite(t, fmt.Sprintf( + "gaiacli tx send %v --amount=1000fooToken --to=%s --from=foo --fee=1fooToken --dry-run", flags, barAddr), app.DefaultKeyPass) + require.True(t, success) + tests.WaitForNextNBlocksTM(2, port) + // ensure state didn't change + fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) + require.Equal(t, int64(1000), fooAcc.GetCoins().AmountOf("fooToken").Int64()) + + // insufficient funds (coins + fees) + success = executeWrite(t, fmt.Sprintf( + "gaiacli tx send %v --amount=1000fooToken --to=%s --from=foo --fee=1fooToken", flags, barAddr), app.DefaultKeyPass) + require.False(t, success) + tests.WaitForNextNBlocksTM(2, port) + // ensure state didn't change + fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) + require.Equal(t, int64(1000), fooAcc.GetCoins().AmountOf("fooToken").Int64()) + + // test success (transfer = coins + fees) + success = executeWrite(t, fmt.Sprintf( + "gaiacli tx send %v --fee=300fooToken --amount=500fooToken --to=%s --from=foo", flags, barAddr), app.DefaultKeyPass) + require.True(t, success) + tests.WaitForNextNBlocksTM(2, port) +} + +func TestGaiaCLISend(t *testing.T) { + chainID, servAddr, port := initializeFixtures(t) + flags := fmt.Sprintf("--home=%s --node=%v --chain-id=%v", gaiacliHome, servAddr, chainID) + + // start gaiad server + proc := tests.GoExecuteTWithStdout(t, fmt.Sprintf("gaiad start --home=%s --rpc.laddr=%v", gaiadHome, servAddr)) + + defer proc.Stop(false) + tests.WaitForTMStart(port) + tests.WaitForNextNBlocksTM(2, port) + + fooAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show foo --output=json --home=%s", gaiacliHome)) + barAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show bar --output=json --home=%s", gaiacliHome)) + + fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) + require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) + + executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) + tests.WaitForNextNBlocksTM(2, port) + + barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags)) + require.Equal(t, int64(10), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) + fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) + require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) + + // Test --dry-run + success := executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10%s --to=%s --from=foo --dry-run", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) + require.True(t, success) + // Check state didn't change + fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) + require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) + + // test autosequencing + executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) + tests.WaitForNextNBlocksTM(2, port) + + barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags)) + require.Equal(t, int64(20), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) + fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) + require.Equal(t, int64(30), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) + + // test memo + executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10%s --to=%s --from=foo --memo 'testmemo'", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) + tests.WaitForNextNBlocksTM(2, port) + + barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags)) + require.Equal(t, int64(30), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) + fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) + require.Equal(t, int64(20), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) +} + +func TestGaiaCLIGasAuto(t *testing.T) { + chainID, servAddr, port := initializeFixtures(t) + flags := fmt.Sprintf("--home=%s --node=%v --chain-id=%v", gaiacliHome, servAddr, chainID) + + // start gaiad server + proc := tests.GoExecuteTWithStdout(t, fmt.Sprintf("gaiad start --home=%s --rpc.laddr=%v", gaiadHome, servAddr)) + + defer proc.Stop(false) + tests.WaitForTMStart(port) + tests.WaitForNextNBlocksTM(2, port) + + fooAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show foo --output=json --home=%s", gaiacliHome)) + barAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show bar --output=json --home=%s", gaiacliHome)) + + fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) + require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) + + // Test failure with auto gas disabled and very little gas set by hand + success := executeWrite(t, fmt.Sprintf("gaiacli tx send %v --gas=10 --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) + require.False(t, success) + tests.WaitForNextNBlocksTM(2, port) + // Check state didn't change + fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) + require.Equal(t, int64(50), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) + + // Test failure with negative gas + success = executeWrite(t, fmt.Sprintf("gaiacli tx send %v --gas=-100 --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) + require.False(t, success) + + // Test failure with 0 gas + success = executeWrite(t, fmt.Sprintf("gaiacli tx send %v --gas=0 --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) + require.False(t, success) + + // Enable auto gas + success, stdout, _ := executeWriteRetStdStreams(t, fmt.Sprintf("gaiacli tx send %v --json --gas=simulate --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) + require.True(t, success) + // check that gas wanted == gas used + cdc := app.MakeCodec() + jsonOutput := struct { + Height int64 + TxHash string + Response abci.ResponseDeliverTx + }{} + require.Nil(t, cdc.UnmarshalJSON([]byte(stdout), &jsonOutput)) + require.Equal(t, jsonOutput.Response.GasWanted, jsonOutput.Response.GasUsed) + tests.WaitForNextNBlocksTM(2, port) + // Check state has changed accordingly + fooAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) + require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) +} + +func TestGaiaCLICreateValidator(t *testing.T) { + chainID, servAddr, port := initializeFixtures(t) + flags := fmt.Sprintf("--home=%s --chain-id=%v --node=%s", gaiacliHome, chainID, servAddr) + + // start gaiad server + proc := tests.GoExecuteTWithStdout(t, fmt.Sprintf("gaiad start --home=%s --rpc.laddr=%v", gaiadHome, servAddr)) + + defer proc.Stop(false) + tests.WaitForTMStart(port) + tests.WaitForNextNBlocksTM(2, port) + + fooAddr, _ := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show foo --output=json --home=%s", gaiacliHome)) + barAddr, barPubKey := executeGetAddrPK(t, fmt.Sprintf("gaiacli keys show bar --output=json --home=%s", gaiacliHome)) + barCeshPubKey := sdk.MustBech32ifyConsPub(barPubKey) + + executeWrite(t, fmt.Sprintf("gaiacli tx send %v --amount=10%s --to=%s --from=foo", flags, stakeTypes.DefaultBondDenom, barAddr), app.DefaultKeyPass) + tests.WaitForNextNBlocksTM(2, port) + + barAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags)) + require.Equal(t, int64(10), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) + fooAcc := executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", fooAddr, flags)) + require.Equal(t, int64(40), fooAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64()) + + defaultParams := stake.DefaultParams() + initialPool := stake.InitialPool() + initialPool.BondedTokens = initialPool.BondedTokens.Add(sdk.NewDec(100)) // Delegate tx on GaiaAppGenState + + // create validator + cvStr := fmt.Sprintf("gaiacli tx stake create-validator %v", flags) + cvStr += fmt.Sprintf(" --from=%s", "bar") + cvStr += fmt.Sprintf(" --pubkey=%s", barCeshPubKey) + cvStr += fmt.Sprintf(" --amount=%v", fmt.Sprintf("2%s", stakeTypes.DefaultBondDenom)) + cvStr += fmt.Sprintf(" --moniker=%v", "bar-vally") + cvStr += fmt.Sprintf(" --commission-rate=%v", "0.05") + cvStr += fmt.Sprintf(" --commission-max-rate=%v", "0.20") + cvStr += fmt.Sprintf(" --commission-max-change-rate=%v", "0.10") + + initialPool.BondedTokens = initialPool.BondedTokens.Add(sdk.NewDec(1)) + + // Test --generate-only + success, stdout, stderr := executeWriteRetStdStreams(t, cvStr+" --generate-only", app.DefaultKeyPass) + require.True(t, success) + require.True(t, success) + require.Empty(t, stderr) + msg := unmarshalStdTx(t, stdout) + require.NotZero(t, msg.Fee.Gas) + require.Equal(t, len(msg.Msgs), 1) + require.Equal(t, 0, len(msg.GetSignatures())) + + // Test --dry-run + success = executeWrite(t, cvStr+" --dry-run", app.DefaultKeyPass) + require.True(t, success) + + executeWrite(t, cvStr, app.DefaultKeyPass) + tests.WaitForNextNBlocksTM(2, port) + + barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %s %v", barAddr, flags)) + require.Equal(t, int64(8), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64(), "%v", barAcc) + + validator := executeGetValidator(t, fmt.Sprintf("gaiacli query stake validator %s --output=json %v", sdk.ValAddress(barAddr), flags)) + require.Equal(t, validator.OperatorAddr, sdk.ValAddress(barAddr)) + require.True(sdk.DecEq(t, sdk.NewDec(2), validator.Tokens)) + + validatorDelegations := executeGetValidatorDelegations(t, fmt.Sprintf("gaiacli query stake delegations-to %s --output=json %v", sdk.ValAddress(barAddr), flags)) + require.Len(t, validatorDelegations, 1) + require.NotZero(t, validatorDelegations[0].Shares) + + // unbond a single share + unbondStr := fmt.Sprintf("gaiacli tx stake unbond begin %v", flags) + unbondStr += fmt.Sprintf(" --from=%s", "bar") + unbondStr += fmt.Sprintf(" --validator=%s", sdk.ValAddress(barAddr)) + unbondStr += fmt.Sprintf(" --shares-amount=%v", "1") + + success = executeWrite(t, unbondStr, app.DefaultKeyPass) + require.True(t, success) + tests.WaitForNextNBlocksTM(2, port) + + /* // this won't be what we expect because we've only started unbonding, haven't completed + barAcc = executeGetAccount(t, fmt.Sprintf("gaiacli query account %v %v", barCech, flags)) + require.Equal(t, int64(9), barAcc.GetCoins().AmountOf(stakeTypes.DefaultBondDenom).Int64(), "%v", barAcc) + */ + validator = executeGetValidator(t, fmt.Sprintf("gaiacli query stake validator %s --output=json %v", sdk.ValAddress(barAddr), flags)) + require.Equal(t, "1.0000000000", validator.Tokens.String()) + + validatorUbds := executeGetValidatorUnbondingDelegations(t, + fmt.Sprintf("gaiacli query stake unbonding-delegations-from %s --output=json %v", + sdk.ValAddress(barAddr), flags)) + require.Len(t, validatorUbds, 1) + require.Equal(t, "1", validatorUbds[0].Balance.Amount.String()) + + params := executeGetParams(t, fmt.Sprintf("gaiacli query stake parameters --output=json %v", flags)) + require.True(t, defaultParams.Equal(params)) + + pool := executeGetPool(t, fmt.Sprintf("gaiacli query stake pool --output=json %v", flags)) + require.Equal(t, initialPool.BondedTokens, pool.BondedTokens) +} func TestGaiaCLISubmitProposal(t *testing.T) { chainID, servAddr, port := initializeFixtures(t) diff --git a/docs/gaia/gaiacli.md b/docs/gaia/gaiacli.md index 38eaa0b8b..4bf93b2fb 100644 --- a/docs/gaia/gaiacli.md +++ b/docs/gaia/gaiacli.md @@ -183,10 +183,40 @@ gaiacli tx sign --validate-signatures signedSendTx.json You can broadcast the signed transaction to a node by providing the JSON file to the following command: -``` +```bash gaiacli tx broadcast --node= signedSendTx.json ``` +### Query Transactions + +#### Matching a set of tags + +You can use the transaction search command to query for transactions that match a specific set of `tags`, which are added on every transaction. + +```bash +gaiacli query txs --tags=:&: +``` + +::: tip Note + +You can find a list of available `tags` on each of the SDK modules: + +- [Common tags](https://github.com/cosmos/cosmos-sdk/blob/d1e76221d8e28824bb4791cb4ad8662d2ae9051e/types/tags.go#L57-L63) +- [Staking tags](https://github.com/cosmos/cosmos-sdk/blob/d1e76221d8e28824bb4791cb4ad8662d2ae9051e/x/stake/tags/tags.go#L8-L24) +- [Governance tags](https://github.com/cosmos/cosmos-sdk/blob/d1e76221d8e28824bb4791cb4ad8662d2ae9051e/x/gov/tags/tags.go#L8-L22) +- [Slashing tags](https://github.com/cosmos/cosmos-sdk/blob/d1e76221d8e28824bb4791cb4ad8662d2ae9051e/x/slashing/handler.go#L52) +- [Distribution tags](https://github.com/cosmos/cosmos-sdk/blob/develop/x/distribution/tags/tags.go#L8-L17) +- [Bank tags](https://github.com/cosmos/cosmos-sdk/blob/d1e76221d8e28824bb4791cb4ad8662d2ae9051e/x/bank/keeper.go#L193-L206) +::: + +#### Matching a transaction's hash + +You can also query a single transaction by its hash using the following command: + +```bash +gaiacli query tx [hash] +``` + ### Staking #### Set up a Validator