diff --git a/x/distribution/client/cli/cli_test.go b/x/distribution/client/cli/cli_test.go index d2c63acd69c1..6a7c13eb28f1 100644 --- a/x/distribution/client/cli/cli_test.go +++ b/x/distribution/client/cli/cli_test.go @@ -9,6 +9,7 @@ import ( "github.com/stretchr/testify/require" tmtypes "github.com/tendermint/tendermint/types" + "github.com/cosmos/cosmos-sdk/tests" "github.com/cosmos/cosmos-sdk/tests/cli" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/distribution/client/testutil" @@ -40,18 +41,85 @@ func TestCLIWithdrawRewards(t *testing.T) { proc := f.SDStart() t.Cleanup(func() { proc.Stop(false) }) + params := testutil.QueryParameters(f) + require.NotEmpty(t, params) + fooAddr := f.KeyAddress(cli.KeyFoo) + barAddr := f.KeyAddress(cli.KeyBar) + fooVal := sdk.ValAddress(fooAddr) + + outstandingRewards := testutil.QueryValidatorOutstandingRewards(f, fooVal.String()) + require.NotEmpty(t, outstandingRewards) + require.False(t, outstandingRewards.Rewards.IsZero()) + + commission := testutil.QueryCommission(f, fooVal.String()) + require.NotEmpty(t, commission) + require.False(t, commission.Commission.IsZero()) + rewards := testutil.QueryRewards(f, fooAddr) - require.Equal(t, 1, len(rewards.Rewards)) - require.NotNil(t, rewards.Total) + require.Len(t, rewards.Rewards, 1) + require.NotEmpty(t, rewards.Total) - fooVal := sdk.ValAddress(fooAddr) + // withdrawing rewards of a delegation for a single validator success := testutil.TxWithdrawRewards(f, fooVal, fooAddr.String(), "-y") require.True(t, success) rewards = testutil.QueryRewards(f, fooAddr) - require.Equal(t, 1, len(rewards.Rewards)) - + require.Len(t, rewards.Rewards, 1) require.Nil(t, rewards.Total) + + // Setting up a new withdraw address + success, stdout, stderr := testutil.TxSetWithdrawAddress(f, fooAddr.String(), barAddr.String(), "--generate-only") + require.True(t, success) + require.Empty(t, stderr) + + msg := cli.UnmarshalStdTx(t, f.Cdc, stdout) + require.NotZero(t, msg.Fee.Gas) + require.Len(t, msg.Msgs, 1) + require.Len(t, msg.GetSignatures(), 0) + + success, _, stderr = testutil.TxSetWithdrawAddress(f, cli.KeyFoo, barAddr.String(), "-y") + require.True(t, success) + require.Empty(t, stderr) + tests.WaitForNextNBlocksTM(1, f.Port) + + // Withdraw all delegation rewards from all validators + success, stdout, stderr = testutil.TxWithdrawAllRewards(f, fooAddr.String(), "--generate-only") + require.True(t, success) + require.Empty(t, stderr) + + msg = cli.UnmarshalStdTx(t, f.Cdc, stdout) + require.NotZero(t, msg.Fee.Gas) + require.Len(t, msg.Msgs, 1) + require.Len(t, msg.GetSignatures(), 0) + + success, _, stderr = testutil.TxWithdrawAllRewards(f, cli.KeyFoo, "-y") + require.True(t, success) + require.Empty(t, stderr) + tests.WaitForNextNBlocksTM(1, f.Port) + + newTokens := sdk.NewCoin(cli.Denom, sdk.TokensFromConsensusPower(1)) + + // Withdraw all delegation rewards from all validators + success, stdout, stderr = testutil.TxFundCommunityPool(f, fooAddr.String(), newTokens, "--generate-only") + require.True(t, success) + require.Empty(t, stderr) + + msg = cli.UnmarshalStdTx(t, f.Cdc, stdout) + require.NotZero(t, msg.Fee.Gas) + require.Len(t, msg.Msgs, 1) + require.Len(t, msg.GetSignatures(), 0) + + success, _, stderr = testutil.TxFundCommunityPool(f, cli.KeyFoo, newTokens, "-y") + require.True(t, success) + require.Empty(t, stderr) + tests.WaitForNextNBlocksTM(1, f.Port) + + amount := testutil.QueryCommunityPool(f) + require.False(t, amount.IsZero()) + + slashes := testutil.QuerySlashes(f, fooVal.String()) + require.Nil(t, slashes, nil) + f.Cleanup() } diff --git a/x/distribution/client/cli/query.go b/x/distribution/client/cli/query.go index dc76ed679911..720cfe9d22bc 100644 --- a/x/distribution/client/cli/query.go +++ b/x/distribution/client/cli/query.go @@ -190,8 +190,10 @@ $ %s query distribution slashes cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmq return err } - var slashes types.ValidatorSlashEvents - cdc.MustUnmarshalJSON(res, &slashes) + var slashes []types.ValidatorSlashEvent + if err = cdc.UnmarshalJSON(res, &slashes); err != nil { + return fmt.Errorf("failed to unmarshal response: %w", err) + } return clientCtx.PrintOutput(slashes) }, } diff --git a/x/distribution/client/testutil/helpers.go b/x/distribution/client/testutil/helpers.go index 975d31674a64..9b8b601321ef 100644 --- a/x/distribution/client/testutil/helpers.go +++ b/x/distribution/client/testutil/helpers.go @@ -12,11 +12,30 @@ import ( "github.com/cosmos/cosmos-sdk/x/distribution" ) +// TxWithdrawRewards raises a txn to withdraw rewards func TxWithdrawRewards(f *cli.Fixtures, valAddr sdk.ValAddress, from string, flags ...string) bool { cmd := fmt.Sprintf("%s tx distribution withdraw-rewards %s %v --keyring-backend=test --from=%s", f.SimcliBinary, valAddr, f.Flags(), from) return cli.ExecuteWrite(f.T, cli.AddFlags(cmd, flags), clientkeys.DefaultKeyPass) } +// TxSetWithdrawAddress helps to set the withdraw address for rewards associated with a delegator address +func TxSetWithdrawAddress(f *cli.Fixtures, from, withDrawAddr string, flags ...string) (bool, string, string) { + cmd := fmt.Sprintf("%s tx distribution set-withdraw-addr %s --from %s %v --keyring-backend=test", f.SimcliBinary, withDrawAddr, from, f.Flags()) + return cli.ExecuteWriteRetStdStreams(f.T, cli.AddFlags(cmd, flags), clientkeys.DefaultKeyPass) +} + +// TxWithdrawAllRewards raises a txn to withdraw all rewards of a delegator address +func TxWithdrawAllRewards(f *cli.Fixtures, from string, flags ...string) (bool, string, string) { + cmd := fmt.Sprintf("%s tx distribution withdraw-all-rewards %v --keyring-backend=test --from=%s", f.SimcliBinary, f.Flags(), from) + return cli.ExecuteWriteRetStdStreams(f.T, cli.AddFlags(cmd, flags), clientkeys.DefaultKeyPass) +} + +// TxFundCommunityPool Funds the community pool with the specified amount +func TxFundCommunityPool(f *cli.Fixtures, from string, amount sdk.Coin, flags ...string) (bool, string, string) { + cmd := fmt.Sprintf("%s tx distribution fund-community-pool %v %v --keyring-backend=test --from=%s", f.SimcliBinary, amount, f.Flags(), from) + return cli.ExecuteWriteRetStdStreams(f.T, cli.AddFlags(cmd, flags), clientkeys.DefaultKeyPass) +} + // QueryRewards returns the rewards of a delegator func QueryRewards(f *cli.Fixtures, delAddr sdk.AccAddress, flags ...string) distribution.QueryDelegatorTotalRewardsResponse { cmd := fmt.Sprintf("%s query distribution rewards %s %s", f.SimcliBinary, delAddr, f.Flags()) @@ -24,7 +43,61 @@ func QueryRewards(f *cli.Fixtures, delAddr sdk.AccAddress, flags ...string) dist require.Empty(f.T, errStr) var rewards distribution.QueryDelegatorTotalRewardsResponse - err := f.Cdc.UnmarshalJSON([]byte(res), &rewards) - require.NoError(f.T, err) + require.NoError(f.T, f.Cdc.UnmarshalJSON([]byte(res), &rewards)) return rewards } + +// QueryValidatorOutstandingRewards distribution outstanding (un-withdrawn) rewards +func QueryValidatorOutstandingRewards(f *cli.Fixtures, valAddr string) distribution.ValidatorOutstandingRewards { + cmd := fmt.Sprintf("%s query distribution validator-outstanding-rewards %s %v", f.SimcliBinary, valAddr, f.Flags()) + res, errStr := tests.ExecuteT(f.T, cmd, "") + require.Empty(f.T, errStr) + + var outstandingRewards distribution.ValidatorOutstandingRewards + require.NoError(f.T, f.Cdc.UnmarshalJSON([]byte(res), &outstandingRewards)) + return outstandingRewards +} + +// QueryParameters is simcli query distribution parameters +func QueryParameters(f *cli.Fixtures, flags ...string) distribution.Params { + cmd := fmt.Sprintf("%s query distribution params %v", f.SimcliBinary, f.Flags()) + out, errStr := tests.ExecuteT(f.T, cli.AddFlags(cmd, flags), "") + require.Empty(f.T, errStr) + + var params distribution.Params + require.NoError(f.T, f.Cdc.UnmarshalJSON([]byte(out), ¶ms)) + return params +} + +// QueryCommission returns validator commission rewards from delegators to that validator. +func QueryCommission(f *cli.Fixtures, valAddr string, flags ...string) distribution.ValidatorAccumulatedCommission { + cmd := fmt.Sprintf("%s query distribution commission %s %v", f.SimcliBinary, valAddr, f.Flags()) + out, errStr := tests.ExecuteT(f.T, cli.AddFlags(cmd, flags), "") + require.Empty(f.T, errStr) + + var commission distribution.ValidatorAccumulatedCommission + require.NoError(f.T, f.Cdc.UnmarshalJSON([]byte(out), &commission)) + return commission +} + +// QuerySlashes returns all slashes of a validator for a given block range. +func QuerySlashes(f *cli.Fixtures, valAddr string, flags ...string) []distribution.ValidatorSlashEvent { + cmd := fmt.Sprintf("%s query distribution slashes %s 0 5 %v ", f.SimcliBinary, valAddr, f.Flags()) + out, errStr := tests.ExecuteT(f.T, cli.AddFlags(cmd, flags), "") + require.Empty(f.T, errStr) + + var slashes []distribution.ValidatorSlashEvent + require.NoError(f.T, f.Cdc.UnmarshalJSON([]byte(out), &slashes)) + return slashes +} + +// QueryCommunityPool returns the amount of coins in the community pool +func QueryCommunityPool(f *cli.Fixtures, flags ...string) sdk.DecCoins { + cmd := fmt.Sprintf("%s query distribution community-pool %v ", f.SimcliBinary, f.Flags()) + out, errStr := tests.ExecuteT(f.T, cli.AddFlags(cmd, flags), "") + require.Empty(f.T, errStr) + + var amount sdk.DecCoins + require.NoError(f.T, f.Cdc.UnmarshalJSON([]byte(out), &amount)) + return amount +} diff --git a/x/mint/client/cli/cli_test.go b/x/mint/client/cli/cli_test.go new file mode 100644 index 000000000000..1bbff9867b46 --- /dev/null +++ b/x/mint/client/cli/cli_test.go @@ -0,0 +1,28 @@ +// +build cli_test + +package cli_test + +import ( + "testing" + + "github.com/cosmos/cosmos-sdk/tests/cli" + "github.com/cosmos/cosmos-sdk/x/mint/client/testutil" + "github.com/stretchr/testify/require" +) + +func TestCLIMintQueries(t *testing.T) { + t.Parallel() + f := cli.InitFixtures(t) + + proc := f.SDStart() + t.Cleanup(func() { proc.Stop(false) }) + + params := testutil.QueryMintingParams(f) + require.NotEmpty(t, params) + + inflation := testutil.QueryInflation(f) + require.False(t, inflation.IsZero()) + + annualProvisions := testutil.QueryAnnualProvisions(f) + require.False(t, annualProvisions.IsZero()) +} diff --git a/x/mint/client/testutil/helpers.go b/x/mint/client/testutil/helpers.go new file mode 100644 index 000000000000..8b686cced76a --- /dev/null +++ b/x/mint/client/testutil/helpers.go @@ -0,0 +1,44 @@ +package testutil + +import ( + "fmt" + + "github.com/cosmos/cosmos-sdk/tests" + "github.com/cosmos/cosmos-sdk/tests/cli" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/mint/types" + "github.com/stretchr/testify/require" +) + +// QueryMintingParams returns the current minting parameters +func QueryMintingParams(f *cli.Fixtures, flags ...string) types.Params { + cmd := fmt.Sprintf("%s query mint params %v", f.SimcliBinary, f.Flags()) + out, errStr := tests.ExecuteT(f.T, cli.AddFlags(cmd, flags), "") + require.Empty(f.T, errStr) + + var params types.Params + require.NoError(f.T, f.Cdc.UnmarshalJSON([]byte(out), ¶ms)) + return params +} + +// QueryInflation returns the current minting inflation value +func QueryInflation(f *cli.Fixtures, flags ...string) sdk.Dec { + cmd := fmt.Sprintf("%s query mint inflation %v", f.SimcliBinary, f.Flags()) + out, errStr := tests.ExecuteT(f.T, cli.AddFlags(cmd, flags), "") + require.Empty(f.T, errStr) + + var inflation sdk.Dec + require.NoError(f.T, f.Cdc.UnmarshalJSON([]byte(out), &inflation)) + return inflation +} + +// QueryAnnualProvisions returns the current minting annual provisions value +func QueryAnnualProvisions(f *cli.Fixtures, flags ...string) sdk.Dec { + cmd := fmt.Sprintf("%s query mint annual-provisions %v", f.SimcliBinary, f.Flags()) + out, errStr := tests.ExecuteT(f.T, cli.AddFlags(cmd, flags), "") + require.Empty(f.T, errStr) + + var annualProvisions sdk.Dec + require.NoError(f.T, f.Cdc.UnmarshalJSON([]byte(out), &annualProvisions)) + return annualProvisions +}