From 8c4cd9262cd40205260c018c3abdd99d5485d6b0 Mon Sep 17 00:00:00 2001 From: marbar3778 Date: Fri, 14 Apr 2023 13:13:23 +0200 Subject: [PATCH 01/23] add msg index to event --- baseapp/baseapp.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index bf29ecc83f48..d7800afe7a71 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -3,6 +3,7 @@ package baseapp import ( "fmt" "sort" + "strconv" "strings" errorsmod "cosmossdk.io/errors" @@ -803,6 +804,15 @@ func (app *BaseApp) runMsgs(ctx sdk.Context, msgs []sdk.Msg, mode runTxMode) (*s // separate each result. events = events.AppendEvents(msgEvents) + // add message index to all events to identify which events are from which message + for _, event := range events { + event.Attributes = append(event.Attributes, abci.EventAttribute{ + Key: "message_index", + Value: strconv.Itoa(i), + }, + ) + } + // Each individual sdk.Result that went through the MsgServiceRouter // (which should represent 99% of the Msgs now, since everyone should // be using protobuf Msgs) has exactly one Msg response, set inside @@ -816,7 +826,6 @@ func (app *BaseApp) runMsgs(ctx sdk.Context, msgs []sdk.Msg, mode runTxMode) (*s msgResponses = append(msgResponses, msgResponse) } - msgLogs = append(msgLogs, sdk.NewABCIMessageLog(uint32(i), msgResult.Log, msgEvents)) } data, err := makeABCIData(msgResponses) From 424280a5a75c325a30e74a0f684cb88fe8f2dc61 Mon Sep 17 00:00:00 2001 From: marbar3778 Date: Fri, 14 Apr 2023 13:18:22 +0200 Subject: [PATCH 02/23] changelog --- CHANGELOG.md | 2 ++ baseapp/baseapp.go | 8 +++----- server/mock/store.go | 4 ++++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e3f787a08fab..5bfa4d804f61 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -165,6 +165,8 @@ Ref: https://keepachangelog.com/en/1.0.0/ * (x/staking) [#15701](https://github.com/cosmos/cosmos-sdk/pull/15701) `HistoricalInfoKey` now has a binary format. * (grpc-web) [#14652](https://github.com/cosmos/cosmos-sdk/pull/14652) Use same port for gRPC-Web and the API server. +* (abci) [#15845](https://github.com/cosmos/cosmos-sdk/pull/15845) Add `msg_index` to all event attributes to associate events and messages +* (abci) [#15845](https://github.com/cosmos/cosmos-sdk/pull/15845) Remove duplicating events in `logs` ### CLI Breaking Changes diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index d7800afe7a71..056bab4a2403 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -4,7 +4,6 @@ import ( "fmt" "sort" "strconv" - "strings" errorsmod "cosmossdk.io/errors" "cosmossdk.io/log" @@ -774,7 +773,6 @@ func (app *BaseApp) runTx(mode runTxMode, txBytes []byte) (gInfo sdk.GasInfo, re // Handler does not exist for a given message route. Otherwise, a reference to a // Result is returned. The caller must not commit state if an error is returned. func (app *BaseApp) runMsgs(ctx sdk.Context, msgs []sdk.Msg, mode runTxMode) (*sdk.Result, error) { - msgLogs := make(sdk.ABCIMessageLogs, 0, len(msgs)) events := sdk.EmptyEvents() var msgResponses []*codectypes.Any @@ -798,7 +796,7 @@ func (app *BaseApp) runMsgs(ctx sdk.Context, msgs []sdk.Msg, mode runTxMode) (*s // create message events msgEvents := createEvents(msgResult.GetEvents(), msg) - // append message events, data and logs + // append message events and data // // Note: Each message result's data must be length-prefixed in order to // separate each result. @@ -807,7 +805,7 @@ func (app *BaseApp) runMsgs(ctx sdk.Context, msgs []sdk.Msg, mode runTxMode) (*s // add message index to all events to identify which events are from which message for _, event := range events { event.Attributes = append(event.Attributes, abci.EventAttribute{ - Key: "message_index", + Key: "msg_index", Value: strconv.Itoa(i), }, ) @@ -835,7 +833,7 @@ func (app *BaseApp) runMsgs(ctx sdk.Context, msgs []sdk.Msg, mode runTxMode) (*s return &sdk.Result{ Data: data, - Log: strings.TrimSpace(msgLogs.String()), + Log: "", Events: events.ToABCIEvents(), MsgResponses: msgResponses, }, nil diff --git a/server/mock/store.go b/server/mock/store.go index 31b73f3fd86f..2094e2905d0a 100644 --- a/server/mock/store.go +++ b/server/mock/store.go @@ -168,6 +168,10 @@ func (ms multiStore) LatestVersion() int64 { panic("not implemented") } +func (ms multiStore) WorkingHash() []byte { + panic("not implemented") +} + var _ storetypes.KVStore = kvStore{} type kvStore struct { From b2678028a2ef0b04169a0984529dd9a06c3e3948 Mon Sep 17 00:00:00 2001 From: marbar3778 Date: Fri, 14 Apr 2023 14:35:01 +0200 Subject: [PATCH 03/23] further manual testing --- baseapp/baseapp.go | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index 056bab4a2403..1c69e8ce4d17 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -800,17 +800,15 @@ func (app *BaseApp) runMsgs(ctx sdk.Context, msgs []sdk.Msg, mode runTxMode) (*s // // Note: Each message result's data must be length-prefixed in order to // separate each result. - events = events.AppendEvents(msgEvents) - - // add message index to all events to identify which events are from which message - for _, event := range events { - event.Attributes = append(event.Attributes, abci.EventAttribute{ - Key: "msg_index", - Value: strconv.Itoa(i), - }, - ) + var me = make(sdk.Events, len(msgEvents)) + + // append message index to all events + for j, event := range msgEvents { + me[j] = event.AppendAttributes(sdk.NewAttribute("msg_index", strconv.Itoa(i))) } + events = events.AppendEvents(me) + // Each individual sdk.Result that went through the MsgServiceRouter // (which should represent 99% of the Msgs now, since everyone should // be using protobuf Msgs) has exactly one Msg response, set inside @@ -833,7 +831,6 @@ func (app *BaseApp) runMsgs(ctx sdk.Context, msgs []sdk.Msg, mode runTxMode) (*s return &sdk.Result{ Data: data, - Log: "", Events: events.ToABCIEvents(), MsgResponses: msgResponses, }, nil From 006035b4a935b22b797a7261fd35e5f70f40ab92 Mon Sep 17 00:00:00 2001 From: marbar3778 Date: Fri, 14 Apr 2023 15:09:32 +0200 Subject: [PATCH 04/23] address comments --- baseapp/baseapp.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index 1c69e8ce4d17..329c04aed64d 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -800,14 +800,12 @@ func (app *BaseApp) runMsgs(ctx sdk.Context, msgs []sdk.Msg, mode runTxMode) (*s // // Note: Each message result's data must be length-prefixed in order to // separate each result. - var me = make(sdk.Events, len(msgEvents)) - // append message index to all events for j, event := range msgEvents { - me[j] = event.AppendAttributes(sdk.NewAttribute("msg_index", strconv.Itoa(i))) + msgEvents[j] = event.AppendAttributes(sdk.NewAttribute("msg_index", strconv.Itoa(i))) } - events = events.AppendEvents(me) + events = events.AppendEvents(msgEvents) // Each individual sdk.Result that went through the MsgServiceRouter // (which should represent 99% of the Msgs now, since everyone should From 7d073fe3d8c5705642a6a075a3f14b286cea4fc8 Mon Sep 17 00:00:00 2001 From: marbar3778 Date: Fri, 14 Apr 2023 15:11:14 +0200 Subject: [PATCH 05/23] move comment --- baseapp/baseapp.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index 329c04aed64d..61833a674d7b 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -800,8 +800,8 @@ func (app *BaseApp) runMsgs(ctx sdk.Context, msgs []sdk.Msg, mode runTxMode) (*s // // Note: Each message result's data must be length-prefixed in order to // separate each result. - // append message index to all events for j, event := range msgEvents { + // append message index to all events msgEvents[j] = event.AppendAttributes(sdk.NewAttribute("msg_index", strconv.Itoa(i))) } From a56cb3e95b67a913ec8a14d1b40b78c9ad1902ae Mon Sep 17 00:00:00 2001 From: marbar3778 Date: Tue, 18 Apr 2023 10:43:01 +0200 Subject: [PATCH 06/23] add upgrading and docs --- UPGRADING.md | 4 ++++ docs/docs/core/08-events.md | 1 + 2 files changed, 5 insertions(+) diff --git a/UPGRADING.md b/UPGRADING.md index 891c6dcba7c0..9fa2277ff6a1 100644 --- a/UPGRADING.md +++ b/UPGRADING.md @@ -36,6 +36,10 @@ simd config migrate v0.48 More information about [confix](https://docs.cosmos.network/main/tooling/confix). +#### Events + +The log section of abci.TxResult is not populated in the case of successful msg(s) execution. Instead a new attribute is added to all messages indicating the `msg_index` which identifies which events and attributes relate the same transaction + #### gRPC-Web gRPC-Web is now listening to the same address as the gRPC Gateway API server (default: `localhost:1317`). diff --git a/docs/docs/core/08-events.md b/docs/docs/core/08-events.md index beb7e06b9491..0f133966e374 100644 --- a/docs/docs/core/08-events.md +++ b/docs/docs/core/08-events.md @@ -29,6 +29,7 @@ An Event contains: * A `type` to categorize the Event at a high-level; for example, the Cosmos SDK uses the `"message"` type to filter Events by `Msg`s. * A list of `attributes` are key-value pairs that give more information about the categorized Event. For example, for the `"message"` type, we can filter Events by key-value pairs using `message.action={some_action}`, `message.module={some_module}` or `message.sender={some_sender}`. +* A `msg_index` to identify which messages relate to the same transaction :::tip To parse the attribute values as strings, make sure to add `'` (single quotes) around each attribute value. From 79ef24177f8cbdf672cab3fd6ca6dd40ec472041 Mon Sep 17 00:00:00 2001 From: marbar3778 Date: Tue, 18 Apr 2023 11:55:13 +0200 Subject: [PATCH 07/23] fix tests --- baseapp/abci_test.go | 4 +++- baseapp/streaming_test.go | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/baseapp/abci_test.go b/baseapp/abci_test.go index cc762dad42c0..97112afc93cf 100644 --- a/baseapp/abci_test.go +++ b/baseapp/abci_test.go @@ -677,7 +677,9 @@ func TestABCI_DeliverTx(t *testing.T) { events := res.GetEvents() require.Len(t, events, 3, "should contain ante handler, message type and counter events respectively") require.Equal(t, sdk.MarkEventsToIndex(counterEvent("ante_handler", counter).ToABCIEvents(), map[string]struct{}{})[0], events[0], "ante handler event") - require.Equal(t, sdk.MarkEventsToIndex(counterEvent(sdk.EventTypeMessage, counter).ToABCIEvents(), map[string]struct{}{})[0], events[2], "msg handler update counter event") + fmt.Println(events, len(events)) + // require.Equal(t, sdk.MarkEventsToIndex(counterEvent("msg_index", counter).ToABCIEvents(), map[string]struct{}{})[0], events[2], "message index attribute") + require.Equal(t, sdk.MarkEventsToIndex(counterEvent(sdk.EventTypeMessage, counter).ToABCIEvents(), map[string]struct{}{})[0].Attributes[0], events[2].Attributes[0], "msg handler update counter event") } suite.baseApp.EndBlock(abci.RequestEndBlock{}) diff --git a/baseapp/streaming_test.go b/baseapp/streaming_test.go index ca63305fcbfa..7ac58833d2a6 100644 --- a/baseapp/streaming_test.go +++ b/baseapp/streaming_test.go @@ -99,7 +99,7 @@ func TestABCI_MultiListener_StateChanges(t *testing.T) { events := res.GetEvents() require.Len(t, events, 3, "should contain ante handler, message type and counter events respectively") require.Equal(t, sdk.MarkEventsToIndex(counterEvent("ante_handler", counter).ToABCIEvents(), map[string]struct{}{})[0], events[0], "ante handler event") - require.Equal(t, sdk.MarkEventsToIndex(counterEvent(sdk.EventTypeMessage, counter).ToABCIEvents(), map[string]struct{}{})[0], events[2], "msg handler update counter event") + require.Equal(t, sdk.MarkEventsToIndex(counterEvent(sdk.EventTypeMessage, counter).ToABCIEvents(), map[string]struct{}{})[0].Attributes[0], events[2].Attributes[0], "msg handler update counter event") } suite.baseApp.EndBlock(abci.RequestEndBlock{}) From 6ff441c9c195b4fe2d38202ccfdd9393b84b9b6c Mon Sep 17 00:00:00 2001 From: marbar3778 Date: Tue, 18 Apr 2023 12:03:15 +0200 Subject: [PATCH 08/23] fix tests --- baseapp/abci_test.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/baseapp/abci_test.go b/baseapp/abci_test.go index 97112afc93cf..b53781d898f9 100644 --- a/baseapp/abci_test.go +++ b/baseapp/abci_test.go @@ -677,8 +677,6 @@ func TestABCI_DeliverTx(t *testing.T) { events := res.GetEvents() require.Len(t, events, 3, "should contain ante handler, message type and counter events respectively") require.Equal(t, sdk.MarkEventsToIndex(counterEvent("ante_handler", counter).ToABCIEvents(), map[string]struct{}{})[0], events[0], "ante handler event") - fmt.Println(events, len(events)) - // require.Equal(t, sdk.MarkEventsToIndex(counterEvent("msg_index", counter).ToABCIEvents(), map[string]struct{}{})[0], events[2], "message index attribute") require.Equal(t, sdk.MarkEventsToIndex(counterEvent(sdk.EventTypeMessage, counter).ToABCIEvents(), map[string]struct{}{})[0].Attributes[0], events[2].Attributes[0], "msg handler update counter event") } From 313c926aa90e615c05ba1623bd1f7ef5540147eb Mon Sep 17 00:00:00 2001 From: marbar3778 Date: Tue, 18 Apr 2023 14:28:38 +0200 Subject: [PATCH 09/23] events --- tests/e2e/staking/suite.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/e2e/staking/suite.go b/tests/e2e/staking/suite.go index 1814545564b3..1ddf4594afdc 100644 --- a/tests/e2e/staking/suite.go +++ b/tests/e2e/staking/suite.go @@ -255,7 +255,7 @@ func (s *E2ETestSuite) TestNewCreateValidatorCmd() { s.Require().Equal(tc.expectedCode, txResp.Code, out.String()) var hadEvent bool - events := txResp.Logs[0].GetEvents() + events := txResp.Events for i := 0; i < len(events); i++ { if events[i].GetType() == "create_validator" { attributes := events[i].GetAttributes() From b28eb6d0f32d4c4a6c183678ae900018a9697efb Mon Sep 17 00:00:00 2001 From: marbar3778 Date: Tue, 18 Apr 2023 15:59:30 +0200 Subject: [PATCH 10/23] events --- tests/e2e/staking/suite.go | 2616 ++++++++++++++++++------------------ 1 file changed, 1303 insertions(+), 1313 deletions(-) diff --git a/tests/e2e/staking/suite.go b/tests/e2e/staking/suite.go index 1ddf4594afdc..2bca43254048 100644 --- a/tests/e2e/staking/suite.go +++ b/tests/e2e/staking/suite.go @@ -1,30 +1,20 @@ package testutil import ( - "context" - "errors" "fmt" - "strings" "testing" - "cosmossdk.io/math" - "github.com/cometbft/cometbft/proto/tendermint/crypto" - "github.com/cometbft/cometbft/rpc/client/http" "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/suite" "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" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" "github.com/cosmos/cosmos-sdk/testutil/network" sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - "github.com/cosmos/cosmos-sdk/types/query" "github.com/cosmos/cosmos-sdk/x/staking/client/cli" - "github.com/cosmos/cosmos-sdk/x/staking/types" ) type E2ETestSuite struct { @@ -271,1306 +261,1306 @@ func (s *E2ETestSuite) TestNewCreateValidatorCmd() { } } -func (s *E2ETestSuite) TestGetCmdQueryValidator() { - val := s.network.Validators[0] - testCases := []struct { - name string - args []string - expectErr bool - }{ - { - "with invalid address ", - []string{"somethinginvalidaddress", fmt.Sprintf("--%s=json", flags.FlagOutput)}, - true, - }, - { - "with valid and not existing address", - []string{"cosmosvaloper15jkng8hytwt22lllv6mw4k89qkqehtahd84ptu", fmt.Sprintf("--%s=json", flags.FlagOutput)}, - true, - }, - { - "happy case", - []string{val.ValAddress.String(), fmt.Sprintf("--%s=json", flags.FlagOutput)}, - false, - }, - } - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - cmd := cli.GetCmdQueryValidator() - clientCtx := val.ClientCtx - out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - if tc.expectErr { - s.Require().Error(err) - s.Require().NotEqual("internal", err.Error()) - } else { - var result types.Validator - s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), &result)) - s.Require().Equal(val.ValAddress.String(), result.OperatorAddress) - } - }) - } -} - -func (s *E2ETestSuite) TestGetCmdQueryValidators() { - val := s.network.Validators[0] - - testCases := []struct { - name string - args []string - minValidatorCount int - }{ - { - "one validator case", - []string{ - fmt.Sprintf("--%s=json", flags.FlagOutput), - fmt.Sprintf("--%s=1", flags.FlagLimit), - }, - 1, - }, - { - "multi validator case", - []string{fmt.Sprintf("--%s=json", flags.FlagOutput)}, - len(s.network.Validators), - }, - } - - for _, tc := range testCases { - tc := tc - - s.Run(tc.name, func() { - cmd := cli.GetCmdQueryValidators() - clientCtx := val.ClientCtx - - out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - s.Require().NoError(err) - - var result types.QueryValidatorsResponse - s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), &result)) - s.Require().Equal(tc.minValidatorCount, len(result.Validators)) - }) - } -} - -func (s *E2ETestSuite) TestGetCmdQueryDelegation() { - val := s.network.Validators[0] - val2 := s.network.Validators[1] - - testCases := []struct { - name string - args []string - expErr bool - respType proto.Message - expected proto.Message - }{ - { - "with wrong delegator address", - []string{ - "wrongDelAddr", - val2.ValAddress.String(), - fmt.Sprintf("--%s=json", flags.FlagOutput), - }, - true, nil, nil, - }, - { - "with wrong validator address", - []string{ - val.Address.String(), - "wrongValAddr", - fmt.Sprintf("--%s=json", flags.FlagOutput), - }, - true, nil, nil, - }, - { - "with json output", - []string{ - val.Address.String(), - val2.ValAddress.String(), - fmt.Sprintf("--%s=json", flags.FlagOutput), - }, - false, - &types.DelegationResponse{}, - &types.DelegationResponse{ - Delegation: types.Delegation{ - DelegatorAddress: val.Address.String(), - ValidatorAddress: val2.ValAddress.String(), - Shares: math.LegacyNewDec(10), - }, - Balance: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10)), - }, - }, - } - - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - cmd := cli.GetCmdQueryDelegation(address.NewBech32Codec("cosmos")) - clientCtx := val.ClientCtx - - out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - if tc.expErr { - s.Require().Error(err) - } else { - s.Require().NoError(err) - s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) - s.Require().Equal(tc.expected.String(), tc.respType.String()) - } - }) - } -} - -func (s *E2ETestSuite) TestGetCmdQueryDelegations() { - val := s.network.Validators[0] - - testCases := []struct { - name string - args []string - expErr bool - respType proto.Message - expected proto.Message - }{ - { - "with no delegator address", - []string{}, - true, nil, nil, - }, - { - "with wrong delegator address", - []string{"wrongDelAddr"}, - true, nil, nil, - }, - { - "valid request (height specific)", - []string{ - val.Address.String(), - fmt.Sprintf("--%s=json", flags.FlagOutput), - fmt.Sprintf("--%s=1", flags.FlagHeight), - }, - false, - &types.QueryDelegatorDelegationsResponse{}, - &types.QueryDelegatorDelegationsResponse{ - DelegationResponses: types.DelegationResponses{ - types.NewDelegationResp(val.Address, val.ValAddress, sdk.NewDecFromInt(cli.DefaultTokens), sdk.NewCoin(sdk.DefaultBondDenom, cli.DefaultTokens)), - }, - Pagination: &query.PageResponse{}, - }, - }, - } - - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - cmd := cli.GetCmdQueryDelegations(address.NewBech32Codec("cosmos")) - clientCtx := val.ClientCtx - - out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - if tc.expErr { - s.Require().Error(err) - } else { - s.Require().NoError(err) - s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) - s.Require().Equal(tc.expected.String(), tc.respType.String()) - } - }) - } -} - -func (s *E2ETestSuite) TestGetCmdQueryValidatorDelegations() { - val := s.network.Validators[0] - - testCases := []struct { - name string - args []string - expErr bool - respType proto.Message - expected proto.Message - }{ - { - "with no validator address", - []string{}, - true, nil, nil, - }, - { - "wrong validator address", - []string{"wrongValAddr"}, - true, nil, nil, - }, - { - "valid request(height specific)", - []string{ - val.Address.String(), - fmt.Sprintf("--%s=json", flags.FlagOutput), - fmt.Sprintf("--%s=1", flags.FlagHeight), - }, - false, - &types.QueryValidatorDelegationsResponse{}, - &types.QueryValidatorDelegationsResponse{ - DelegationResponses: types.DelegationResponses{ - types.NewDelegationResp(val.Address, val.ValAddress, sdk.NewDecFromInt(cli.DefaultTokens), sdk.NewCoin(sdk.DefaultBondDenom, cli.DefaultTokens)), - }, - Pagination: &query.PageResponse{}, - }, - }, - } - - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - cmd := cli.GetCmdQueryDelegations(address.NewBech32Codec("cosmos")) - clientCtx := val.ClientCtx - - out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - if tc.expErr { - s.Require().Error(err) - } else { - s.Require().NoError(err) - s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) - s.Require().Equal(tc.expected.String(), tc.respType.String()) - } - }) - } -} - -func (s *E2ETestSuite) TestGetCmdQueryUnbondingDelegations() { - val := s.network.Validators[0] - - testCases := []struct { - name string - args []string - expErr bool - }{ - { - "wrong delegator address", - []string{ - "wrongDelAddr", - fmt.Sprintf("--%s=json", flags.FlagOutput), - }, - true, - }, - { - "valid request", - []string{ - val.Address.String(), - fmt.Sprintf("--%s=json", flags.FlagOutput), - }, - false, - }, - } - - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - cmd := cli.GetCmdQueryUnbondingDelegations(address.NewBech32Codec("cosmos")) - clientCtx := val.ClientCtx - - out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - - if tc.expErr { - s.Require().Error(err) - } else { - var ubds types.QueryDelegatorUnbondingDelegationsResponse - err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &ubds) - - s.Require().NoError(err) - s.Require().Len(ubds.UnbondingResponses, 1) - s.Require().Equal(ubds.UnbondingResponses[0].DelegatorAddress, val.Address.String()) - } - }) - } -} - -func (s *E2ETestSuite) TestGetCmdQueryUnbondingDelegation() { - val := s.network.Validators[0] - - testCases := []struct { - name string - args []string - expErr bool - }{ - { - "wrong delegator address", - []string{ - "wrongDelAddr", - val.ValAddress.String(), - fmt.Sprintf("--%s=json", flags.FlagOutput), - }, - true, - }, - { - "wrong validator address", - []string{ - val.Address.String(), - "wrongValAddr", - fmt.Sprintf("--%s=json", flags.FlagOutput), - }, - true, - }, - { - "valid request", - []string{ - val.Address.String(), - val.ValAddress.String(), - fmt.Sprintf("--%s=json", flags.FlagOutput), - }, - false, - }, - } - - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - cmd := cli.GetCmdQueryUnbondingDelegation(address.NewBech32Codec("cosmos")) - clientCtx := val.ClientCtx - - out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - - if tc.expErr { - s.Require().Error(err) - } else { - var ubd types.UnbondingDelegation - - err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &ubd) - s.Require().NoError(err) - s.Require().Equal(ubd.DelegatorAddress, val.Address.String()) - s.Require().Equal(ubd.ValidatorAddress, val.ValAddress.String()) - s.Require().Len(ubd.Entries, 2) - } - }) - } -} - -func (s *E2ETestSuite) TestGetCmdQueryValidatorUnbondingDelegations() { - val := s.network.Validators[0] - - testCases := []struct { - name string - args []string - expErr bool - }{ - { - "wrong validator address", - []string{ - "wrongValAddr", - fmt.Sprintf("--%s=json", flags.FlagOutput), - }, - true, - }, - { - "valid request", - []string{ - val.ValAddress.String(), - fmt.Sprintf("--%s=json", flags.FlagOutput), - }, - false, - }, - } - - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - cmd := cli.GetCmdQueryValidatorUnbondingDelegations() - clientCtx := val.ClientCtx - - out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - - if tc.expErr { - s.Require().Error(err) - } else { - var ubds types.QueryValidatorUnbondingDelegationsResponse - err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &ubds) - - s.Require().NoError(err) - s.Require().Len(ubds.UnbondingResponses, 1) - s.Require().Equal(ubds.UnbondingResponses[0].DelegatorAddress, val.Address.String()) - } - }) - } -} - -func (s *E2ETestSuite) TestGetCmdQueryRedelegations() { - val := s.network.Validators[0] - val2 := s.network.Validators[1] - - testCases := []struct { - name string - args []string - expErr bool - }{ - { - "wrong delegator address", - []string{ - "wrongdeladdr", - fmt.Sprintf("--%s=json", flags.FlagOutput), - }, - true, - }, - { - "valid request", - []string{ - val.Address.String(), - fmt.Sprintf("--%s=json", flags.FlagOutput), - }, - false, - }, - } - - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - cmd := cli.GetCmdQueryRedelegations(address.NewBech32Codec("cosmos")) - clientCtx := val.ClientCtx - - out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - - if tc.expErr { - s.Require().Error(err) - } else { - var redelegations types.QueryRedelegationsResponse - err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &redelegations) - - s.Require().NoError(err) - - s.Require().Len(redelegations.RedelegationResponses, 1) - s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.DelegatorAddress, val.Address.String()) - s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorSrcAddress, val.ValAddress.String()) - s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorDstAddress, val2.ValAddress.String()) - } - }) - } -} - -func (s *E2ETestSuite) TestGetCmdQueryRedelegation() { - val := s.network.Validators[0] - val2 := s.network.Validators[1] - - testCases := []struct { - name string - args []string - expErr bool - }{ - { - "wrong delegator address", - []string{ - "wrongdeladdr", - val.ValAddress.String(), - val2.ValAddress.String(), - fmt.Sprintf("--%s=json", flags.FlagOutput), - }, - true, - }, - { - "wrong source validator address address", - []string{ - val.Address.String(), - "wrongSrcValAddress", - val2.ValAddress.String(), - fmt.Sprintf("--%s=json", flags.FlagOutput), - }, - true, - }, - { - "wrong destination validator address address", - []string{ - val.Address.String(), - val.ValAddress.String(), - "wrongDestValAddress", - fmt.Sprintf("--%s=json", flags.FlagOutput), - }, - true, - }, - { - "valid request", - []string{ - val.Address.String(), - val.ValAddress.String(), - val2.ValAddress.String(), - fmt.Sprintf("--%s=json", flags.FlagOutput), - }, - false, - }, - } - - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - cmd := cli.GetCmdQueryRedelegation(address.NewBech32Codec("cosmos")) - clientCtx := val.ClientCtx - - out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - - if tc.expErr { - s.Require().Error(err) - } else { - var redelegations types.QueryRedelegationsResponse - - err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &redelegations) - s.Require().NoError(err) - - s.Require().Len(redelegations.RedelegationResponses, 1) - s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.DelegatorAddress, val.Address.String()) - s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorSrcAddress, val.ValAddress.String()) - s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorDstAddress, val2.ValAddress.String()) - } - }) - } -} - -func (s *E2ETestSuite) TestGetCmdQueryValidatorRedelegations() { - val := s.network.Validators[0] - val2 := s.network.Validators[1] - - testCases := []struct { - name string - args []string - expErr bool - }{ - { - "wrong validator address", - []string{ - "wrongValAddr", - fmt.Sprintf("--%s=json", flags.FlagOutput), - }, - true, - }, - { - "valid request", - []string{ - val.ValAddress.String(), - fmt.Sprintf("--%s=json", flags.FlagOutput), - }, - false, - }, - } - - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - cmd := cli.GetCmdQueryValidatorRedelegations() - clientCtx := val.ClientCtx - - out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - - if tc.expErr { - s.Require().Error(err) - } else { - var redelegations types.QueryRedelegationsResponse - err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &redelegations) - - s.Require().NoError(err) - - s.Require().Len(redelegations.RedelegationResponses, 1) - s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.DelegatorAddress, val.Address.String()) - s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorSrcAddress, val.ValAddress.String()) - s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorDstAddress, val2.ValAddress.String()) - } - }) - } -} - -func (s *E2ETestSuite) TestGetCmdQueryHistoricalInfo() { - val := s.network.Validators[0] - - testCases := []struct { - name string - args []string - error bool - }{ - { - "wrong height", - []string{ - "-1", - fmt.Sprintf("--%s=json", flags.FlagOutput), - }, - true, - }, - { - "valid request", - []string{ - "1", - fmt.Sprintf("--%s=json", flags.FlagOutput), - }, - false, - }, - } - - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - cmd := cli.GetCmdQueryHistoricalInfo() - clientCtx := val.ClientCtx - out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - - if tc.error { - s.Require().Error(err) - } else { - var historicalInfo types.HistoricalInfo - - err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &historicalInfo) - s.Require().NoError(err) - s.Require().NotNil(historicalInfo) - } - }) - } -} - -func (s *E2ETestSuite) TestGetCmdQueryParams() { - val := s.network.Validators[0] - testCases := []struct { - name string - args []string - expectedOutput string - }{ - { - "with text output", - []string{fmt.Sprintf("--%s=text", flags.FlagOutput)}, - `bond_denom: stake -historical_entries: 10000 -max_entries: 7 -max_validators: 100 -min_commission_rate: "0.000000000000000000" -unbonding_time: 1814400s`, - }, - { - "with json output", - []string{fmt.Sprintf("--%s=json", flags.FlagOutput)}, - `{"unbonding_time":"1814400s","max_validators":100,"max_entries":7,"historical_entries":10000,"bond_denom":"stake","min_commission_rate":"0.000000000000000000"}`, - }, - } - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - cmd := cli.GetCmdQueryParams() - clientCtx := val.ClientCtx - out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - s.Require().NoError(err) - s.Require().Equal(tc.expectedOutput, strings.TrimSpace(out.String())) - }) - } -} - -func (s *E2ETestSuite) TestGetCmdQueryPool() { - val := s.network.Validators[0] - testCases := []struct { - name string - args []string - expectedOutput string - }{ - { - "with text", - []string{ - fmt.Sprintf("--%s=text", flags.FlagOutput), - fmt.Sprintf("--%s=1", flags.FlagHeight), - }, - fmt.Sprintf(`bonded_tokens: "%s" -not_bonded_tokens: "0"`, cli.DefaultTokens.Mul(sdk.NewInt(2)).String()), - }, - { - "with json", - []string{ - fmt.Sprintf("--%s=json", flags.FlagOutput), - fmt.Sprintf("--%s=1", flags.FlagHeight), - }, - fmt.Sprintf(`{"not_bonded_tokens":"0","bonded_tokens":"%s"}`, cli.DefaultTokens.Mul(sdk.NewInt(2)).String()), - }, - } - for _, tc := range testCases { - tc := tc - s.Run(tc.name, func() { - cmd := cli.GetCmdQueryPool() - clientCtx := val.ClientCtx - out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - s.Require().NoError(err) - s.Require().Equal(tc.expectedOutput, strings.TrimSpace(out.String())) - }) - } -} - -func (s *E2ETestSuite) TestNewEditValidatorCmd() { - val := s.network.Validators[0] - - details := "bio" - identity := "test identity" - securityContact := "test contact" - website := "https://test.com" - - testCases := []struct { - name string - args []string - expectErr bool - expectedCode uint32 - respType proto.Message - }{ - { - "with no edit flag (since all are optional)", - []string{ - fmt.Sprintf("--%s=%s", flags.FlagFrom, "with wrong from address"), - 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, sdk.NewInt(10))).String()), - }, - true, 0, nil, - }, - { - "with no edit flag (since all are optional)", - []string{ - fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), - }, - false, 0, &sdk.TxResponse{}, - }, - { - "edit validator details", - []string{ - fmt.Sprintf("--details=%s", details), - fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), - }, - false, 0, &sdk.TxResponse{}, - }, - { - "edit validator identity", - []string{ - fmt.Sprintf("--identity=%s", identity), - fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), - }, - false, 0, &sdk.TxResponse{}, - }, - { - "edit validator security-contact", - []string{ - fmt.Sprintf("--security-contact=%s", securityContact), - fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), - }, - false, 0, &sdk.TxResponse{}, - }, - { - "edit validator website", - []string{ - fmt.Sprintf("--website=%s", website), - fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), - }, - false, 0, &sdk.TxResponse{}, - }, - { - "with all edit flags", - []string{ - fmt.Sprintf("--details=%s", details), - fmt.Sprintf("--identity=%s", identity), - fmt.Sprintf("--security-contact=%s", securityContact), - fmt.Sprintf("--website=%s", website), - fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), - }, - false, 0, &sdk.TxResponse{}, - }, - } - - for _, tc := range testCases { - tc := tc - - s.Run(tc.name, func() { - cmd := cli.NewEditValidatorCmd() - clientCtx := val.ClientCtx - - out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - if tc.expectErr { - s.Require().Error(err) - } else { - s.Require().NoError(err, out.String()) - s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) - - txResp := tc.respType.(*sdk.TxResponse) - s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, txResp.TxHash, tc.expectedCode)) - } - }) - } -} - -func (s *E2ETestSuite) TestNewDelegateCmd() { - val := s.network.Validators[0] - - k, _, err := val.ClientCtx.Keyring.NewMnemonic("NewAccount", keyring.English, sdk.FullFundraiserPath, keyring.DefaultBIP39Passphrase, hd.Secp256k1) - s.Require().NoError(err) - - pub, err := k.GetPubKey() - s.Require().NoError(err) - - newAddr := sdk.AccAddress(pub.Address()) - - _, err = clitestutil.MsgSendExec( - val.ClientCtx, - val.Address, - newAddr, - sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(200))), 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, sdk.NewInt(10))).String()), - ) - s.Require().NoError(err) - s.Require().NoError(s.network.WaitForNextBlock()) - - testCases := []struct { - name string - args []string - expectErr bool - expectedCode uint32 - respType proto.Message - }{ - { - "without delegate amount", - []string{ - val.ValAddress.String(), - fmt.Sprintf("--%s=%s", flags.FlagFrom, newAddr.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, sdk.NewInt(10))).String()), - }, - true, 0, nil, - }, - { - "without validator address", - []string{ - sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), - fmt.Sprintf("--%s=%s", flags.FlagFrom, newAddr.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, sdk.NewInt(10))).String()), - }, - true, 0, nil, - }, - { - "valid transaction of delegate", - []string{ - val.ValAddress.String(), - sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), - fmt.Sprintf("--%s=%s", flags.FlagFrom, newAddr.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, sdk.NewInt(10))).String()), - }, - false, 0, &sdk.TxResponse{}, - }, - } - - for _, tc := range testCases { - tc := tc - - s.Run(tc.name, func() { - cmd := cli.NewDelegateCmd() - clientCtx := val.ClientCtx - - out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - if tc.expectErr { - s.Require().Error(err) - } else { - s.Require().NoError(err, out.String()) - s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) - - txResp := tc.respType.(*sdk.TxResponse) - s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, txResp.TxHash, tc.expectedCode)) - } - }) - } -} - -func (s *E2ETestSuite) TestNewRedelegateCmd() { - val := s.network.Validators[0] - val2 := s.network.Validators[1] - - testCases := []struct { - name string - args []string - expectErr bool - expectedCode uint32 - respType proto.Message - }{ - { - "without amount", - []string{ - val.ValAddress.String(), // src-validator-addr - val2.ValAddress.String(), // dst-validator-addr - fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), - }, - true, 0, nil, - }, - { - "with wrong source validator address", - []string{ - `cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj`, // src-validator-addr - val2.ValAddress.String(), // dst-validator-addr - sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), // amount - fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), - }, - false, 3, &sdk.TxResponse{}, - }, - { - "with wrong destination validator address", - []string{ - val.ValAddress.String(), // dst-validator-addr - `cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj`, // src-validator-addr - sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), // amount - fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), - }, - false, 31, &sdk.TxResponse{}, - }, - { - "valid transaction of delegate", - []string{ - val.ValAddress.String(), // src-validator-addr - val2.ValAddress.String(), // dst-validator-addr - sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), // amount - fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), - fmt.Sprintf("--%s=%d", flags.FlagGas, 300000), - 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, sdk.NewInt(10))).String()), - }, - false, 0, &sdk.TxResponse{}, - }, - } - - for _, tc := range testCases { - tc := tc - - s.Run(tc.name, func() { - cmd := cli.NewRedelegateCmd() - clientCtx := val.ClientCtx - - out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - if tc.expectErr { - s.Require().Error(err) - } else { - s.Require().NoError(err, out.String()) - s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) - - txResp := tc.respType.(*sdk.TxResponse) - s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, txResp.TxHash, tc.expectedCode)) - } - }) - } -} - -func (s *E2ETestSuite) TestNewUnbondCmd() { - val := s.network.Validators[0] - - testCases := []struct { - name string - args []string - expectErr bool - expectedCode uint32 - respType proto.Message - }{ - { - "Without unbond amount", - []string{ - val.ValAddress.String(), - fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), - }, - true, 0, nil, - }, - { - "Without validator address", - []string{ - sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), - fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), - }, - true, 0, nil, - }, - { - "valid transaction of unbond", - []string{ - val.ValAddress.String(), - sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), - fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), - }, - false, 0, &sdk.TxResponse{}, - }, - } - - for _, tc := range testCases { - tc := tc - - s.Run(tc.name, func() { - cmd := cli.NewUnbondCmd() - clientCtx := val.ClientCtx - - out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - if tc.expectErr { - s.Require().Error(err) - } else { - s.Require().NoError(err, out.String()) - s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) - - txResp := tc.respType.(*sdk.TxResponse) - s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, txResp.TxHash, tc.expectedCode)) - } - }) - } -} - -func (s *E2ETestSuite) TestNewCancelUnbondingDelegationCmd() { - val := s.network.Validators[0] - - testCases := []struct { - name string - args []string - expectErr bool - expectedCode uint32 - respType proto.Message - }{ - { - "Without validator address", - []string{ - fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), - }, - true, 0, nil, - }, - { - "Without canceling unbond delegation amount", - []string{ - val.ValAddress.String(), - fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), - }, - true, 0, nil, - }, - { - "Without unbond creation height", - []string{ - val.ValAddress.String(), - sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), - fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), - }, - true, 0, nil, - }, - { - "Wrong unbonding creation height", - []string{ - val.ValAddress.String(), - sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10)).String(), - sdk.NewInt(10000).String(), - fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), - }, - false, sdkerrors.ErrNotFound.ABCICode(), &sdk.TxResponse{}, - }, - { - "Invalid unbonding amount (higher than the unbonding amount)", - []string{ - val.ValAddress.String(), - sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10000)).String(), - fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), - }, - false, sdkerrors.ErrInvalidRequest.ABCICode(), &sdk.TxResponse{}, - }, - { - "valid transaction of canceling unbonding delegation", - []string{ - val.ValAddress.String(), - sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(5)).String(), - fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), - }, - false, 0, &sdk.TxResponse{}, - }, - } - - for _, tc := range testCases { - tc := tc - - s.Run(tc.name, func() { - cmd := cli.NewCancelUnbondingDelegation() - clientCtx := val.ClientCtx - if !tc.expectErr && tc.expectedCode != sdkerrors.ErrNotFound.ABCICode() { - getCreationHeight := func() int64 { - // fethichg the unbonding delegations - resp, err := testutil.GetRequest(fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/unbonding_delegations", val.APIAddress, val.Address.String())) - s.Require().NoError(err) - - var ubds types.QueryDelegatorUnbondingDelegationsResponse - - err = val.ClientCtx.Codec.UnmarshalJSON(resp, &ubds) - s.Require().NoError(err) - s.Require().Len(ubds.UnbondingResponses, 1) - s.Require().Equal(ubds.UnbondingResponses[0].DelegatorAddress, val.Address.String()) - return ubds.UnbondingResponses[0].Entries[1].CreationHeight - } - tc.args = append(tc.args, fmt.Sprint(getCreationHeight())) - } - - out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - if tc.expectErr { - s.Require().Error(err) - } else { - s.Require().NoError(err, out.String()) - s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) - - txResp := tc.respType.(*sdk.TxResponse) - s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, txResp.TxHash, tc.expectedCode)) - } - }) - } -} - -// TestBlockResults tests that the validator updates correctly show when -// calling the /block_results RPC endpoint. -// ref: https://github.com/cosmos/cosmos-sdk/issues/7401. -func (s *E2ETestSuite) TestBlockResults() { - require := s.Require() - val := s.network.Validators[0] - - // Create new account in the keyring. - k, _, err := val.ClientCtx.Keyring.NewMnemonic("NewDelegator", keyring.English, sdk.FullFundraiserPath, keyring.DefaultBIP39Passphrase, hd.Secp256k1) - require.NoError(err) - pub, err := k.GetPubKey() - require.NoError(err) - newAddr := sdk.AccAddress(pub.Address()) - - // Send some funds to the new account. - _, err = clitestutil.MsgSendExec( - val.ClientCtx, - val.Address, - newAddr, - sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(200))), 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, sdk.NewInt(10))).String()), - ) - require.NoError(err) - require.NoError(s.network.WaitForNextBlock()) - - // Use CLI to create a delegation from the new account to validator `val`. - cmd := cli.NewDelegateCmd() - _, err = clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, []string{ - val.ValAddress.String(), - sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), - fmt.Sprintf("--%s=%s", flags.FlagFrom, newAddr.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, sdk.NewInt(10))).String()), - }) - require.NoError(err) - require.NoError(s.network.WaitForNextBlock()) - - // Create a HTTP rpc client. - rpcClient, err := http.New(val.RPCAddress, "/websocket") - require.NoError(err) - - // Loop until we find a block result with the correct validator updates. - // By experience, it happens around 2 blocks after `delHeight`. - s.network.RetryForBlocks(func() error { - latestHeight, err := s.network.LatestHeight() - require.NoError(err) - res, err := rpcClient.BlockResults(context.Background(), &latestHeight) - if err != nil { - return err - } - - if len(res.ValidatorUpdates) == 0 { - return errors.New("validator update not found yet") - } - - valUpdate := res.ValidatorUpdates[0] - require.Equal( - valUpdate.GetPubKey().Sum.(*crypto.PublicKey_Ed25519).Ed25519, - val.PubKey.Bytes(), - ) - - return nil - }, 10) -} - -// https://github.com/cosmos/cosmos-sdk/issues/10660 -func (s *E2ETestSuite) TestEditValidatorMoniker() { - val := s.network.Validators[0] - require := s.Require() - - txCmd := cli.NewEditValidatorCmd() - moniker := "testing" - _, err := clitestutil.ExecTestCLICmd(val.ClientCtx, txCmd, []string{ - val.ValAddress.String(), - fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=%s", cli.FlagEditMoniker, moniker), - fmt.Sprintf("--%s=https://newvalidator.io", cli.FlagWebsite), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), - }) - require.NoError(err) - s.Require().NoError(s.network.WaitForNextBlock()) - - queryCmd := cli.GetCmdQueryValidator() - res, err := clitestutil.ExecTestCLICmd( - val.ClientCtx, queryCmd, - []string{val.ValAddress.String(), fmt.Sprintf("--%s=json", flags.FlagOutput)}, - ) - require.NoError(err) - var result types.Validator - require.NoError(val.ClientCtx.Codec.UnmarshalJSON(res.Bytes(), &result)) - require.Equal(result.GetMoniker(), moniker) - - _, err = clitestutil.ExecTestCLICmd(val.ClientCtx, txCmd, []string{ - val.ValAddress.String(), - fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), - fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), - fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), - fmt.Sprintf("--%s=https://newvalidator.io", cli.FlagWebsite), - fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), - }) - require.NoError(err) - s.Require().NoError(s.network.WaitForNextBlock()) - - res, err = clitestutil.ExecTestCLICmd( - val.ClientCtx, queryCmd, - []string{val.ValAddress.String(), fmt.Sprintf("--%s=json", flags.FlagOutput)}, - ) - require.NoError(err) - require.NoError(val.ClientCtx.Codec.UnmarshalJSON(res.Bytes(), &result)) - require.Equal(result.GetMoniker(), moniker) -} +// func (s *E2ETestSuite) TestGetCmdQueryValidator() { +// val := s.network.Validators[0] +// testCases := []struct { +// name string +// args []string +// expectErr bool +// }{ +// { +// "with invalid address ", +// []string{"somethinginvalidaddress", fmt.Sprintf("--%s=json", flags.FlagOutput)}, +// true, +// }, +// { +// "with valid and not existing address", +// []string{"cosmosvaloper15jkng8hytwt22lllv6mw4k89qkqehtahd84ptu", fmt.Sprintf("--%s=json", flags.FlagOutput)}, +// true, +// }, +// { +// "happy case", +// []string{val.ValAddress.String(), fmt.Sprintf("--%s=json", flags.FlagOutput)}, +// false, +// }, +// } +// for _, tc := range testCases { +// tc := tc +// s.Run(tc.name, func() { +// cmd := cli.GetCmdQueryValidator() +// clientCtx := val.ClientCtx +// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) +// if tc.expectErr { +// s.Require().Error(err) +// s.Require().NotEqual("internal", err.Error()) +// } else { +// var result types.Validator +// s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), &result)) +// s.Require().Equal(val.ValAddress.String(), result.OperatorAddress) +// } +// }) +// } +// } + +// func (s *E2ETestSuite) TestGetCmdQueryValidators() { +// val := s.network.Validators[0] + +// testCases := []struct { +// name string +// args []string +// minValidatorCount int +// }{ +// { +// "one validator case", +// []string{ +// fmt.Sprintf("--%s=json", flags.FlagOutput), +// fmt.Sprintf("--%s=1", flags.FlagLimit), +// }, +// 1, +// }, +// { +// "multi validator case", +// []string{fmt.Sprintf("--%s=json", flags.FlagOutput)}, +// len(s.network.Validators), +// }, +// } + +// for _, tc := range testCases { +// tc := tc + +// s.Run(tc.name, func() { +// cmd := cli.GetCmdQueryValidators() +// clientCtx := val.ClientCtx + +// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) +// s.Require().NoError(err) + +// var result types.QueryValidatorsResponse +// s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), &result)) +// s.Require().Equal(tc.minValidatorCount, len(result.Validators)) +// }) +// } +// } + +// func (s *E2ETestSuite) TestGetCmdQueryDelegation() { +// val := s.network.Validators[0] +// val2 := s.network.Validators[1] + +// testCases := []struct { +// name string +// args []string +// expErr bool +// respType proto.Message +// expected proto.Message +// }{ +// { +// "with wrong delegator address", +// []string{ +// "wrongDelAddr", +// val2.ValAddress.String(), +// fmt.Sprintf("--%s=json", flags.FlagOutput), +// }, +// true, nil, nil, +// }, +// { +// "with wrong validator address", +// []string{ +// val.Address.String(), +// "wrongValAddr", +// fmt.Sprintf("--%s=json", flags.FlagOutput), +// }, +// true, nil, nil, +// }, +// { +// "with json output", +// []string{ +// val.Address.String(), +// val2.ValAddress.String(), +// fmt.Sprintf("--%s=json", flags.FlagOutput), +// }, +// false, +// &types.DelegationResponse{}, +// &types.DelegationResponse{ +// Delegation: types.Delegation{ +// DelegatorAddress: val.Address.String(), +// ValidatorAddress: val2.ValAddress.String(), +// Shares: math.LegacyNewDec(10), +// }, +// Balance: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10)), +// }, +// }, +// } + +// for _, tc := range testCases { +// tc := tc +// s.Run(tc.name, func() { +// cmd := cli.GetCmdQueryDelegation(address.NewBech32Codec("cosmos")) +// clientCtx := val.ClientCtx + +// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) +// if tc.expErr { +// s.Require().Error(err) +// } else { +// s.Require().NoError(err) +// s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) +// s.Require().Equal(tc.expected.String(), tc.respType.String()) +// } +// }) +// } +// } + +// func (s *E2ETestSuite) TestGetCmdQueryDelegations() { +// val := s.network.Validators[0] + +// testCases := []struct { +// name string +// args []string +// expErr bool +// respType proto.Message +// expected proto.Message +// }{ +// { +// "with no delegator address", +// []string{}, +// true, nil, nil, +// }, +// { +// "with wrong delegator address", +// []string{"wrongDelAddr"}, +// true, nil, nil, +// }, +// { +// "valid request (height specific)", +// []string{ +// val.Address.String(), +// fmt.Sprintf("--%s=json", flags.FlagOutput), +// fmt.Sprintf("--%s=1", flags.FlagHeight), +// }, +// false, +// &types.QueryDelegatorDelegationsResponse{}, +// &types.QueryDelegatorDelegationsResponse{ +// DelegationResponses: types.DelegationResponses{ +// types.NewDelegationResp(val.Address, val.ValAddress, sdk.NewDecFromInt(cli.DefaultTokens), sdk.NewCoin(sdk.DefaultBondDenom, cli.DefaultTokens)), +// }, +// Pagination: &query.PageResponse{}, +// }, +// }, +// } + +// for _, tc := range testCases { +// tc := tc +// s.Run(tc.name, func() { +// cmd := cli.GetCmdQueryDelegations(address.NewBech32Codec("cosmos")) +// clientCtx := val.ClientCtx + +// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) +// if tc.expErr { +// s.Require().Error(err) +// } else { +// s.Require().NoError(err) +// s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) +// s.Require().Equal(tc.expected.String(), tc.respType.String()) +// } +// }) +// } +// } + +// func (s *E2ETestSuite) TestGetCmdQueryValidatorDelegations() { +// val := s.network.Validators[0] + +// testCases := []struct { +// name string +// args []string +// expErr bool +// respType proto.Message +// expected proto.Message +// }{ +// { +// "with no validator address", +// []string{}, +// true, nil, nil, +// }, +// { +// "wrong validator address", +// []string{"wrongValAddr"}, +// true, nil, nil, +// }, +// { +// "valid request(height specific)", +// []string{ +// val.Address.String(), +// fmt.Sprintf("--%s=json", flags.FlagOutput), +// fmt.Sprintf("--%s=1", flags.FlagHeight), +// }, +// false, +// &types.QueryValidatorDelegationsResponse{}, +// &types.QueryValidatorDelegationsResponse{ +// DelegationResponses: types.DelegationResponses{ +// types.NewDelegationResp(val.Address, val.ValAddress, sdk.NewDecFromInt(cli.DefaultTokens), sdk.NewCoin(sdk.DefaultBondDenom, cli.DefaultTokens)), +// }, +// Pagination: &query.PageResponse{}, +// }, +// }, +// } + +// for _, tc := range testCases { +// tc := tc +// s.Run(tc.name, func() { +// cmd := cli.GetCmdQueryDelegations(address.NewBech32Codec("cosmos")) +// clientCtx := val.ClientCtx + +// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) +// if tc.expErr { +// s.Require().Error(err) +// } else { +// s.Require().NoError(err) +// s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) +// s.Require().Equal(tc.expected.String(), tc.respType.String()) +// } +// }) +// } +// } + +// func (s *E2ETestSuite) TestGetCmdQueryUnbondingDelegations() { +// val := s.network.Validators[0] + +// testCases := []struct { +// name string +// args []string +// expErr bool +// }{ +// { +// "wrong delegator address", +// []string{ +// "wrongDelAddr", +// fmt.Sprintf("--%s=json", flags.FlagOutput), +// }, +// true, +// }, +// { +// "valid request", +// []string{ +// val.Address.String(), +// fmt.Sprintf("--%s=json", flags.FlagOutput), +// }, +// false, +// }, +// } + +// for _, tc := range testCases { +// tc := tc +// s.Run(tc.name, func() { +// cmd := cli.GetCmdQueryUnbondingDelegations(address.NewBech32Codec("cosmos")) +// clientCtx := val.ClientCtx + +// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + +// if tc.expErr { +// s.Require().Error(err) +// } else { +// var ubds types.QueryDelegatorUnbondingDelegationsResponse +// err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &ubds) + +// s.Require().NoError(err) +// s.Require().Len(ubds.UnbondingResponses, 1) +// s.Require().Equal(ubds.UnbondingResponses[0].DelegatorAddress, val.Address.String()) +// } +// }) +// } +// } + +// func (s *E2ETestSuite) TestGetCmdQueryUnbondingDelegation() { +// val := s.network.Validators[0] + +// testCases := []struct { +// name string +// args []string +// expErr bool +// }{ +// { +// "wrong delegator address", +// []string{ +// "wrongDelAddr", +// val.ValAddress.String(), +// fmt.Sprintf("--%s=json", flags.FlagOutput), +// }, +// true, +// }, +// { +// "wrong validator address", +// []string{ +// val.Address.String(), +// "wrongValAddr", +// fmt.Sprintf("--%s=json", flags.FlagOutput), +// }, +// true, +// }, +// { +// "valid request", +// []string{ +// val.Address.String(), +// val.ValAddress.String(), +// fmt.Sprintf("--%s=json", flags.FlagOutput), +// }, +// false, +// }, +// } + +// for _, tc := range testCases { +// tc := tc +// s.Run(tc.name, func() { +// cmd := cli.GetCmdQueryUnbondingDelegation(address.NewBech32Codec("cosmos")) +// clientCtx := val.ClientCtx + +// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + +// if tc.expErr { +// s.Require().Error(err) +// } else { +// var ubd types.UnbondingDelegation + +// err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &ubd) +// s.Require().NoError(err) +// s.Require().Equal(ubd.DelegatorAddress, val.Address.String()) +// s.Require().Equal(ubd.ValidatorAddress, val.ValAddress.String()) +// s.Require().Len(ubd.Entries, 2) +// } +// }) +// } +// } + +// func (s *E2ETestSuite) TestGetCmdQueryValidatorUnbondingDelegations() { +// val := s.network.Validators[0] + +// testCases := []struct { +// name string +// args []string +// expErr bool +// }{ +// { +// "wrong validator address", +// []string{ +// "wrongValAddr", +// fmt.Sprintf("--%s=json", flags.FlagOutput), +// }, +// true, +// }, +// { +// "valid request", +// []string{ +// val.ValAddress.String(), +// fmt.Sprintf("--%s=json", flags.FlagOutput), +// }, +// false, +// }, +// } + +// for _, tc := range testCases { +// tc := tc +// s.Run(tc.name, func() { +// cmd := cli.GetCmdQueryValidatorUnbondingDelegations() +// clientCtx := val.ClientCtx + +// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + +// if tc.expErr { +// s.Require().Error(err) +// } else { +// var ubds types.QueryValidatorUnbondingDelegationsResponse +// err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &ubds) + +// s.Require().NoError(err) +// s.Require().Len(ubds.UnbondingResponses, 1) +// s.Require().Equal(ubds.UnbondingResponses[0].DelegatorAddress, val.Address.String()) +// } +// }) +// } +// } + +// func (s *E2ETestSuite) TestGetCmdQueryRedelegations() { +// val := s.network.Validators[0] +// val2 := s.network.Validators[1] + +// testCases := []struct { +// name string +// args []string +// expErr bool +// }{ +// { +// "wrong delegator address", +// []string{ +// "wrongdeladdr", +// fmt.Sprintf("--%s=json", flags.FlagOutput), +// }, +// true, +// }, +// { +// "valid request", +// []string{ +// val.Address.String(), +// fmt.Sprintf("--%s=json", flags.FlagOutput), +// }, +// false, +// }, +// } + +// for _, tc := range testCases { +// tc := tc +// s.Run(tc.name, func() { +// cmd := cli.GetCmdQueryRedelegations(address.NewBech32Codec("cosmos")) +// clientCtx := val.ClientCtx + +// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + +// if tc.expErr { +// s.Require().Error(err) +// } else { +// var redelegations types.QueryRedelegationsResponse +// err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &redelegations) + +// s.Require().NoError(err) + +// s.Require().Len(redelegations.RedelegationResponses, 1) +// s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.DelegatorAddress, val.Address.String()) +// s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorSrcAddress, val.ValAddress.String()) +// s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorDstAddress, val2.ValAddress.String()) +// } +// }) +// } +// } + +// func (s *E2ETestSuite) TestGetCmdQueryRedelegation() { +// val := s.network.Validators[0] +// val2 := s.network.Validators[1] + +// testCases := []struct { +// name string +// args []string +// expErr bool +// }{ +// { +// "wrong delegator address", +// []string{ +// "wrongdeladdr", +// val.ValAddress.String(), +// val2.ValAddress.String(), +// fmt.Sprintf("--%s=json", flags.FlagOutput), +// }, +// true, +// }, +// { +// "wrong source validator address address", +// []string{ +// val.Address.String(), +// "wrongSrcValAddress", +// val2.ValAddress.String(), +// fmt.Sprintf("--%s=json", flags.FlagOutput), +// }, +// true, +// }, +// { +// "wrong destination validator address address", +// []string{ +// val.Address.String(), +// val.ValAddress.String(), +// "wrongDestValAddress", +// fmt.Sprintf("--%s=json", flags.FlagOutput), +// }, +// true, +// }, +// { +// "valid request", +// []string{ +// val.Address.String(), +// val.ValAddress.String(), +// val2.ValAddress.String(), +// fmt.Sprintf("--%s=json", flags.FlagOutput), +// }, +// false, +// }, +// } + +// for _, tc := range testCases { +// tc := tc +// s.Run(tc.name, func() { +// cmd := cli.GetCmdQueryRedelegation(address.NewBech32Codec("cosmos")) +// clientCtx := val.ClientCtx + +// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + +// if tc.expErr { +// s.Require().Error(err) +// } else { +// var redelegations types.QueryRedelegationsResponse + +// err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &redelegations) +// s.Require().NoError(err) + +// s.Require().Len(redelegations.RedelegationResponses, 1) +// s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.DelegatorAddress, val.Address.String()) +// s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorSrcAddress, val.ValAddress.String()) +// s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorDstAddress, val2.ValAddress.String()) +// } +// }) +// } +// } + +// func (s *E2ETestSuite) TestGetCmdQueryValidatorRedelegations() { +// val := s.network.Validators[0] +// val2 := s.network.Validators[1] + +// testCases := []struct { +// name string +// args []string +// expErr bool +// }{ +// { +// "wrong validator address", +// []string{ +// "wrongValAddr", +// fmt.Sprintf("--%s=json", flags.FlagOutput), +// }, +// true, +// }, +// { +// "valid request", +// []string{ +// val.ValAddress.String(), +// fmt.Sprintf("--%s=json", flags.FlagOutput), +// }, +// false, +// }, +// } + +// for _, tc := range testCases { +// tc := tc +// s.Run(tc.name, func() { +// cmd := cli.GetCmdQueryValidatorRedelegations() +// clientCtx := val.ClientCtx + +// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + +// if tc.expErr { +// s.Require().Error(err) +// } else { +// var redelegations types.QueryRedelegationsResponse +// err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &redelegations) + +// s.Require().NoError(err) + +// s.Require().Len(redelegations.RedelegationResponses, 1) +// s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.DelegatorAddress, val.Address.String()) +// s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorSrcAddress, val.ValAddress.String()) +// s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorDstAddress, val2.ValAddress.String()) +// } +// }) +// } +// } + +// func (s *E2ETestSuite) TestGetCmdQueryHistoricalInfo() { +// val := s.network.Validators[0] + +// testCases := []struct { +// name string +// args []string +// error bool +// }{ +// { +// "wrong height", +// []string{ +// "-1", +// fmt.Sprintf("--%s=json", flags.FlagOutput), +// }, +// true, +// }, +// { +// "valid request", +// []string{ +// "1", +// fmt.Sprintf("--%s=json", flags.FlagOutput), +// }, +// false, +// }, +// } + +// for _, tc := range testCases { +// tc := tc +// s.Run(tc.name, func() { +// cmd := cli.GetCmdQueryHistoricalInfo() +// clientCtx := val.ClientCtx +// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + +// if tc.error { +// s.Require().Error(err) +// } else { +// var historicalInfo types.HistoricalInfo + +// err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &historicalInfo) +// s.Require().NoError(err) +// s.Require().NotNil(historicalInfo) +// } +// }) +// } +// } + +// func (s *E2ETestSuite) TestGetCmdQueryParams() { +// val := s.network.Validators[0] +// testCases := []struct { +// name string +// args []string +// expectedOutput string +// }{ +// { +// "with text output", +// []string{fmt.Sprintf("--%s=text", flags.FlagOutput)}, +// `bond_denom: stake +// historical_entries: 10000 +// max_entries: 7 +// max_validators: 100 +// min_commission_rate: "0.000000000000000000" +// unbonding_time: 1814400s`, +// }, +// { +// "with json output", +// []string{fmt.Sprintf("--%s=json", flags.FlagOutput)}, +// `{"unbonding_time":"1814400s","max_validators":100,"max_entries":7,"historical_entries":10000,"bond_denom":"stake","min_commission_rate":"0.000000000000000000"}`, +// }, +// } +// for _, tc := range testCases { +// tc := tc +// s.Run(tc.name, func() { +// cmd := cli.GetCmdQueryParams() +// clientCtx := val.ClientCtx +// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) +// s.Require().NoError(err) +// s.Require().Equal(tc.expectedOutput, strings.TrimSpace(out.String())) +// }) +// } +// } + +// func (s *E2ETestSuite) TestGetCmdQueryPool() { +// val := s.network.Validators[0] +// testCases := []struct { +// name string +// args []string +// expectedOutput string +// }{ +// { +// "with text", +// []string{ +// fmt.Sprintf("--%s=text", flags.FlagOutput), +// fmt.Sprintf("--%s=1", flags.FlagHeight), +// }, +// fmt.Sprintf(`bonded_tokens: "%s" +// not_bonded_tokens: "0"`, cli.DefaultTokens.Mul(sdk.NewInt(2)).String()), +// }, +// { +// "with json", +// []string{ +// fmt.Sprintf("--%s=json", flags.FlagOutput), +// fmt.Sprintf("--%s=1", flags.FlagHeight), +// }, +// fmt.Sprintf(`{"not_bonded_tokens":"0","bonded_tokens":"%s"}`, cli.DefaultTokens.Mul(sdk.NewInt(2)).String()), +// }, +// } +// for _, tc := range testCases { +// tc := tc +// s.Run(tc.name, func() { +// cmd := cli.GetCmdQueryPool() +// clientCtx := val.ClientCtx +// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) +// s.Require().NoError(err) +// s.Require().Equal(tc.expectedOutput, strings.TrimSpace(out.String())) +// }) +// } +// } + +// func (s *E2ETestSuite) TestNewEditValidatorCmd() { +// val := s.network.Validators[0] + +// details := "bio" +// identity := "test identity" +// securityContact := "test contact" +// website := "https://test.com" + +// testCases := []struct { +// name string +// args []string +// expectErr bool +// expectedCode uint32 +// respType proto.Message +// }{ +// { +// "with no edit flag (since all are optional)", +// []string{ +// fmt.Sprintf("--%s=%s", flags.FlagFrom, "with wrong from address"), +// 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, sdk.NewInt(10))).String()), +// }, +// true, 0, nil, +// }, +// { +// "with no edit flag (since all are optional)", +// []string{ +// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), +// }, +// false, 0, &sdk.TxResponse{}, +// }, +// { +// "edit validator details", +// []string{ +// fmt.Sprintf("--details=%s", details), +// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), +// }, +// false, 0, &sdk.TxResponse{}, +// }, +// { +// "edit validator identity", +// []string{ +// fmt.Sprintf("--identity=%s", identity), +// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), +// }, +// false, 0, &sdk.TxResponse{}, +// }, +// { +// "edit validator security-contact", +// []string{ +// fmt.Sprintf("--security-contact=%s", securityContact), +// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), +// }, +// false, 0, &sdk.TxResponse{}, +// }, +// { +// "edit validator website", +// []string{ +// fmt.Sprintf("--website=%s", website), +// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), +// }, +// false, 0, &sdk.TxResponse{}, +// }, +// { +// "with all edit flags", +// []string{ +// fmt.Sprintf("--details=%s", details), +// fmt.Sprintf("--identity=%s", identity), +// fmt.Sprintf("--security-contact=%s", securityContact), +// fmt.Sprintf("--website=%s", website), +// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), +// }, +// false, 0, &sdk.TxResponse{}, +// }, +// } + +// for _, tc := range testCases { +// tc := tc + +// s.Run(tc.name, func() { +// cmd := cli.NewEditValidatorCmd() +// clientCtx := val.ClientCtx + +// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) +// if tc.expectErr { +// s.Require().Error(err) +// } else { +// s.Require().NoError(err, out.String()) +// s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) + +// txResp := tc.respType.(*sdk.TxResponse) +// s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, txResp.TxHash, tc.expectedCode)) +// } +// }) +// } +// } + +// func (s *E2ETestSuite) TestNewDelegateCmd() { +// val := s.network.Validators[0] + +// k, _, err := val.ClientCtx.Keyring.NewMnemonic("NewAccount", keyring.English, sdk.FullFundraiserPath, keyring.DefaultBIP39Passphrase, hd.Secp256k1) +// s.Require().NoError(err) + +// pub, err := k.GetPubKey() +// s.Require().NoError(err) + +// newAddr := sdk.AccAddress(pub.Address()) + +// _, err = clitestutil.MsgSendExec( +// val.ClientCtx, +// val.Address, +// newAddr, +// sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(200))), 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, sdk.NewInt(10))).String()), +// ) +// s.Require().NoError(err) +// s.Require().NoError(s.network.WaitForNextBlock()) + +// testCases := []struct { +// name string +// args []string +// expectErr bool +// expectedCode uint32 +// respType proto.Message +// }{ +// { +// "without delegate amount", +// []string{ +// val.ValAddress.String(), +// fmt.Sprintf("--%s=%s", flags.FlagFrom, newAddr.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, sdk.NewInt(10))).String()), +// }, +// true, 0, nil, +// }, +// { +// "without validator address", +// []string{ +// sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), +// fmt.Sprintf("--%s=%s", flags.FlagFrom, newAddr.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, sdk.NewInt(10))).String()), +// }, +// true, 0, nil, +// }, +// { +// "valid transaction of delegate", +// []string{ +// val.ValAddress.String(), +// sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), +// fmt.Sprintf("--%s=%s", flags.FlagFrom, newAddr.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, sdk.NewInt(10))).String()), +// }, +// false, 0, &sdk.TxResponse{}, +// }, +// } + +// for _, tc := range testCases { +// tc := tc + +// s.Run(tc.name, func() { +// cmd := cli.NewDelegateCmd() +// clientCtx := val.ClientCtx + +// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) +// if tc.expectErr { +// s.Require().Error(err) +// } else { +// s.Require().NoError(err, out.String()) +// s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) + +// txResp := tc.respType.(*sdk.TxResponse) +// s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, txResp.TxHash, tc.expectedCode)) +// } +// }) +// } +// } + +// func (s *E2ETestSuite) TestNewRedelegateCmd() { +// val := s.network.Validators[0] +// val2 := s.network.Validators[1] + +// testCases := []struct { +// name string +// args []string +// expectErr bool +// expectedCode uint32 +// respType proto.Message +// }{ +// { +// "without amount", +// []string{ +// val.ValAddress.String(), // src-validator-addr +// val2.ValAddress.String(), // dst-validator-addr +// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), +// }, +// true, 0, nil, +// }, +// { +// "with wrong source validator address", +// []string{ +// `cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj`, // src-validator-addr +// val2.ValAddress.String(), // dst-validator-addr +// sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), // amount +// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), +// }, +// false, 3, &sdk.TxResponse{}, +// }, +// { +// "with wrong destination validator address", +// []string{ +// val.ValAddress.String(), // dst-validator-addr +// `cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj`, // src-validator-addr +// sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), // amount +// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), +// }, +// false, 31, &sdk.TxResponse{}, +// }, +// { +// "valid transaction of delegate", +// []string{ +// val.ValAddress.String(), // src-validator-addr +// val2.ValAddress.String(), // dst-validator-addr +// sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), // amount +// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), +// fmt.Sprintf("--%s=%d", flags.FlagGas, 300000), +// 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, sdk.NewInt(10))).String()), +// }, +// false, 0, &sdk.TxResponse{}, +// }, +// } + +// for _, tc := range testCases { +// tc := tc + +// s.Run(tc.name, func() { +// cmd := cli.NewRedelegateCmd() +// clientCtx := val.ClientCtx + +// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) +// if tc.expectErr { +// s.Require().Error(err) +// } else { +// s.Require().NoError(err, out.String()) +// s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) + +// txResp := tc.respType.(*sdk.TxResponse) +// s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, txResp.TxHash, tc.expectedCode)) +// } +// }) +// } +// } + +// func (s *E2ETestSuite) TestNewUnbondCmd() { +// val := s.network.Validators[0] + +// testCases := []struct { +// name string +// args []string +// expectErr bool +// expectedCode uint32 +// respType proto.Message +// }{ +// { +// "Without unbond amount", +// []string{ +// val.ValAddress.String(), +// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), +// }, +// true, 0, nil, +// }, +// { +// "Without validator address", +// []string{ +// sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), +// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), +// }, +// true, 0, nil, +// }, +// { +// "valid transaction of unbond", +// []string{ +// val.ValAddress.String(), +// sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), +// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), +// }, +// false, 0, &sdk.TxResponse{}, +// }, +// } + +// for _, tc := range testCases { +// tc := tc + +// s.Run(tc.name, func() { +// cmd := cli.NewUnbondCmd() +// clientCtx := val.ClientCtx + +// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) +// if tc.expectErr { +// s.Require().Error(err) +// } else { +// s.Require().NoError(err, out.String()) +// s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) + +// txResp := tc.respType.(*sdk.TxResponse) +// s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, txResp.TxHash, tc.expectedCode)) +// } +// }) +// } +// } + +// func (s *E2ETestSuite) TestNewCancelUnbondingDelegationCmd() { +// val := s.network.Validators[0] + +// testCases := []struct { +// name string +// args []string +// expectErr bool +// expectedCode uint32 +// respType proto.Message +// }{ +// { +// "Without validator address", +// []string{ +// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), +// }, +// true, 0, nil, +// }, +// { +// "Without canceling unbond delegation amount", +// []string{ +// val.ValAddress.String(), +// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), +// }, +// true, 0, nil, +// }, +// { +// "Without unbond creation height", +// []string{ +// val.ValAddress.String(), +// sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), +// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), +// }, +// true, 0, nil, +// }, +// { +// "Wrong unbonding creation height", +// []string{ +// val.ValAddress.String(), +// sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10)).String(), +// sdk.NewInt(10000).String(), +// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), +// }, +// false, sdkerrors.ErrNotFound.ABCICode(), &sdk.TxResponse{}, +// }, +// { +// "Invalid unbonding amount (higher than the unbonding amount)", +// []string{ +// val.ValAddress.String(), +// sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10000)).String(), +// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), +// }, +// false, sdkerrors.ErrInvalidRequest.ABCICode(), &sdk.TxResponse{}, +// }, +// { +// "valid transaction of canceling unbonding delegation", +// []string{ +// val.ValAddress.String(), +// sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(5)).String(), +// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), +// }, +// false, 0, &sdk.TxResponse{}, +// }, +// } + +// for _, tc := range testCases { +// tc := tc + +// s.Run(tc.name, func() { +// cmd := cli.NewCancelUnbondingDelegation() +// clientCtx := val.ClientCtx +// if !tc.expectErr && tc.expectedCode != sdkerrors.ErrNotFound.ABCICode() { +// getCreationHeight := func() int64 { +// // fethichg the unbonding delegations +// resp, err := testutil.GetRequest(fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/unbonding_delegations", val.APIAddress, val.Address.String())) +// s.Require().NoError(err) + +// var ubds types.QueryDelegatorUnbondingDelegationsResponse + +// err = val.ClientCtx.Codec.UnmarshalJSON(resp, &ubds) +// s.Require().NoError(err) +// s.Require().Len(ubds.UnbondingResponses, 1) +// s.Require().Equal(ubds.UnbondingResponses[0].DelegatorAddress, val.Address.String()) +// return ubds.UnbondingResponses[0].Entries[1].CreationHeight +// } +// tc.args = append(tc.args, fmt.Sprint(getCreationHeight())) +// } + +// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) +// if tc.expectErr { +// s.Require().Error(err) +// } else { +// s.Require().NoError(err, out.String()) +// s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) + +// txResp := tc.respType.(*sdk.TxResponse) +// s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, txResp.TxHash, tc.expectedCode)) +// } +// }) +// } +// } + +// // TestBlockResults tests that the validator updates correctly show when +// // calling the /block_results RPC endpoint. +// // ref: https://github.com/cosmos/cosmos-sdk/issues/7401. +// func (s *E2ETestSuite) TestBlockResults() { +// require := s.Require() +// val := s.network.Validators[0] + +// // Create new account in the keyring. +// k, _, err := val.ClientCtx.Keyring.NewMnemonic("NewDelegator", keyring.English, sdk.FullFundraiserPath, keyring.DefaultBIP39Passphrase, hd.Secp256k1) +// require.NoError(err) +// pub, err := k.GetPubKey() +// require.NoError(err) +// newAddr := sdk.AccAddress(pub.Address()) + +// // Send some funds to the new account. +// _, err = clitestutil.MsgSendExec( +// val.ClientCtx, +// val.Address, +// newAddr, +// sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(200))), 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, sdk.NewInt(10))).String()), +// ) +// require.NoError(err) +// require.NoError(s.network.WaitForNextBlock()) + +// // Use CLI to create a delegation from the new account to validator `val`. +// cmd := cli.NewDelegateCmd() +// _, err = clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, []string{ +// val.ValAddress.String(), +// sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), +// fmt.Sprintf("--%s=%s", flags.FlagFrom, newAddr.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, sdk.NewInt(10))).String()), +// }) +// require.NoError(err) +// require.NoError(s.network.WaitForNextBlock()) + +// // Create a HTTP rpc client. +// rpcClient, err := http.New(val.RPCAddress, "/websocket") +// require.NoError(err) + +// // Loop until we find a block result with the correct validator updates. +// // By experience, it happens around 2 blocks after `delHeight`. +// s.network.RetryForBlocks(func() error { +// latestHeight, err := s.network.LatestHeight() +// require.NoError(err) +// res, err := rpcClient.BlockResults(context.Background(), &latestHeight) +// if err != nil { +// return err +// } + +// if len(res.ValidatorUpdates) == 0 { +// return errors.New("validator update not found yet") +// } + +// valUpdate := res.ValidatorUpdates[0] +// require.Equal( +// valUpdate.GetPubKey().Sum.(*crypto.PublicKey_Ed25519).Ed25519, +// val.PubKey.Bytes(), +// ) + +// return nil +// }, 10) +// } + +// // https://github.com/cosmos/cosmos-sdk/issues/10660 +// func (s *E2ETestSuite) TestEditValidatorMoniker() { +// val := s.network.Validators[0] +// require := s.Require() + +// txCmd := cli.NewEditValidatorCmd() +// moniker := "testing" +// _, err := clitestutil.ExecTestCLICmd(val.ClientCtx, txCmd, []string{ +// val.ValAddress.String(), +// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), +// fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), +// fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), +// fmt.Sprintf("--%s=%s", cli.FlagEditMoniker, moniker), +// fmt.Sprintf("--%s=https://newvalidator.io", cli.FlagWebsite), +// fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), +// }) +// require.NoError(err) +// s.Require().NoError(s.network.WaitForNextBlock()) + +// queryCmd := cli.GetCmdQueryValidator() +// res, err := clitestutil.ExecTestCLICmd( +// val.ClientCtx, queryCmd, +// []string{val.ValAddress.String(), fmt.Sprintf("--%s=json", flags.FlagOutput)}, +// ) +// require.NoError(err) +// var result types.Validator +// require.NoError(val.ClientCtx.Codec.UnmarshalJSON(res.Bytes(), &result)) +// require.Equal(result.GetMoniker(), moniker) + +// _, err = clitestutil.ExecTestCLICmd(val.ClientCtx, txCmd, []string{ +// val.ValAddress.String(), +// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), +// fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), +// fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), +// fmt.Sprintf("--%s=https://newvalidator.io", cli.FlagWebsite), +// fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), +// }) +// require.NoError(err) +// s.Require().NoError(s.network.WaitForNextBlock()) + +// res, err = clitestutil.ExecTestCLICmd( +// val.ClientCtx, queryCmd, +// []string{val.ValAddress.String(), fmt.Sprintf("--%s=json", flags.FlagOutput)}, +// ) +// require.NoError(err) +// require.NoError(val.ClientCtx.Codec.UnmarshalJSON(res.Bytes(), &result)) +// require.Equal(result.GetMoniker(), moniker) +// } From 4c0b5139dccfbad85f421383272687d63c631785 Mon Sep 17 00:00:00 2001 From: marbar3778 Date: Wed, 19 Apr 2023 09:32:29 +0200 Subject: [PATCH 11/23] revert comment --- tests/e2e/staking/suite.go | 2615 ++++++++++++++++++------------------ 1 file changed, 1312 insertions(+), 1303 deletions(-) diff --git a/tests/e2e/staking/suite.go b/tests/e2e/staking/suite.go index 2bca43254048..f81522bc1975 100644 --- a/tests/e2e/staking/suite.go +++ b/tests/e2e/staking/suite.go @@ -1,20 +1,29 @@ package testutil import ( + "context" + "errors" "fmt" + "strings" "testing" + "cosmossdk.io/api/tendermint/crypto" + "cosmossdk.io/math" + "github.com/cometbft/cometbft/rpc/client/http" "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/suite" "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" clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" "github.com/cosmos/cosmos-sdk/testutil/network" sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/query" "github.com/cosmos/cosmos-sdk/x/staking/client/cli" + "github.com/cosmos/cosmos-sdk/x/staking/types" ) type E2ETestSuite struct { @@ -261,1306 +270,1306 @@ func (s *E2ETestSuite) TestNewCreateValidatorCmd() { } } -// func (s *E2ETestSuite) TestGetCmdQueryValidator() { -// val := s.network.Validators[0] -// testCases := []struct { -// name string -// args []string -// expectErr bool -// }{ -// { -// "with invalid address ", -// []string{"somethinginvalidaddress", fmt.Sprintf("--%s=json", flags.FlagOutput)}, -// true, -// }, -// { -// "with valid and not existing address", -// []string{"cosmosvaloper15jkng8hytwt22lllv6mw4k89qkqehtahd84ptu", fmt.Sprintf("--%s=json", flags.FlagOutput)}, -// true, -// }, -// { -// "happy case", -// []string{val.ValAddress.String(), fmt.Sprintf("--%s=json", flags.FlagOutput)}, -// false, -// }, -// } -// for _, tc := range testCases { -// tc := tc -// s.Run(tc.name, func() { -// cmd := cli.GetCmdQueryValidator() -// clientCtx := val.ClientCtx -// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) -// if tc.expectErr { -// s.Require().Error(err) -// s.Require().NotEqual("internal", err.Error()) -// } else { -// var result types.Validator -// s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), &result)) -// s.Require().Equal(val.ValAddress.String(), result.OperatorAddress) -// } -// }) -// } -// } - -// func (s *E2ETestSuite) TestGetCmdQueryValidators() { -// val := s.network.Validators[0] - -// testCases := []struct { -// name string -// args []string -// minValidatorCount int -// }{ -// { -// "one validator case", -// []string{ -// fmt.Sprintf("--%s=json", flags.FlagOutput), -// fmt.Sprintf("--%s=1", flags.FlagLimit), -// }, -// 1, -// }, -// { -// "multi validator case", -// []string{fmt.Sprintf("--%s=json", flags.FlagOutput)}, -// len(s.network.Validators), -// }, -// } - -// for _, tc := range testCases { -// tc := tc - -// s.Run(tc.name, func() { -// cmd := cli.GetCmdQueryValidators() -// clientCtx := val.ClientCtx - -// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) -// s.Require().NoError(err) - -// var result types.QueryValidatorsResponse -// s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), &result)) -// s.Require().Equal(tc.minValidatorCount, len(result.Validators)) -// }) -// } -// } - -// func (s *E2ETestSuite) TestGetCmdQueryDelegation() { -// val := s.network.Validators[0] -// val2 := s.network.Validators[1] - -// testCases := []struct { -// name string -// args []string -// expErr bool -// respType proto.Message -// expected proto.Message -// }{ -// { -// "with wrong delegator address", -// []string{ -// "wrongDelAddr", -// val2.ValAddress.String(), -// fmt.Sprintf("--%s=json", flags.FlagOutput), -// }, -// true, nil, nil, -// }, -// { -// "with wrong validator address", -// []string{ -// val.Address.String(), -// "wrongValAddr", -// fmt.Sprintf("--%s=json", flags.FlagOutput), -// }, -// true, nil, nil, -// }, -// { -// "with json output", -// []string{ -// val.Address.String(), -// val2.ValAddress.String(), -// fmt.Sprintf("--%s=json", flags.FlagOutput), -// }, -// false, -// &types.DelegationResponse{}, -// &types.DelegationResponse{ -// Delegation: types.Delegation{ -// DelegatorAddress: val.Address.String(), -// ValidatorAddress: val2.ValAddress.String(), -// Shares: math.LegacyNewDec(10), -// }, -// Balance: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10)), -// }, -// }, -// } - -// for _, tc := range testCases { -// tc := tc -// s.Run(tc.name, func() { -// cmd := cli.GetCmdQueryDelegation(address.NewBech32Codec("cosmos")) -// clientCtx := val.ClientCtx - -// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) -// if tc.expErr { -// s.Require().Error(err) -// } else { -// s.Require().NoError(err) -// s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) -// s.Require().Equal(tc.expected.String(), tc.respType.String()) -// } -// }) -// } -// } - -// func (s *E2ETestSuite) TestGetCmdQueryDelegations() { -// val := s.network.Validators[0] - -// testCases := []struct { -// name string -// args []string -// expErr bool -// respType proto.Message -// expected proto.Message -// }{ -// { -// "with no delegator address", -// []string{}, -// true, nil, nil, -// }, -// { -// "with wrong delegator address", -// []string{"wrongDelAddr"}, -// true, nil, nil, -// }, -// { -// "valid request (height specific)", -// []string{ -// val.Address.String(), -// fmt.Sprintf("--%s=json", flags.FlagOutput), -// fmt.Sprintf("--%s=1", flags.FlagHeight), -// }, -// false, -// &types.QueryDelegatorDelegationsResponse{}, -// &types.QueryDelegatorDelegationsResponse{ -// DelegationResponses: types.DelegationResponses{ -// types.NewDelegationResp(val.Address, val.ValAddress, sdk.NewDecFromInt(cli.DefaultTokens), sdk.NewCoin(sdk.DefaultBondDenom, cli.DefaultTokens)), -// }, -// Pagination: &query.PageResponse{}, -// }, -// }, -// } - -// for _, tc := range testCases { -// tc := tc -// s.Run(tc.name, func() { -// cmd := cli.GetCmdQueryDelegations(address.NewBech32Codec("cosmos")) -// clientCtx := val.ClientCtx - -// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) -// if tc.expErr { -// s.Require().Error(err) -// } else { -// s.Require().NoError(err) -// s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) -// s.Require().Equal(tc.expected.String(), tc.respType.String()) -// } -// }) -// } -// } - -// func (s *E2ETestSuite) TestGetCmdQueryValidatorDelegations() { -// val := s.network.Validators[0] - -// testCases := []struct { -// name string -// args []string -// expErr bool -// respType proto.Message -// expected proto.Message -// }{ -// { -// "with no validator address", -// []string{}, -// true, nil, nil, -// }, -// { -// "wrong validator address", -// []string{"wrongValAddr"}, -// true, nil, nil, -// }, -// { -// "valid request(height specific)", -// []string{ -// val.Address.String(), -// fmt.Sprintf("--%s=json", flags.FlagOutput), -// fmt.Sprintf("--%s=1", flags.FlagHeight), -// }, -// false, -// &types.QueryValidatorDelegationsResponse{}, -// &types.QueryValidatorDelegationsResponse{ -// DelegationResponses: types.DelegationResponses{ -// types.NewDelegationResp(val.Address, val.ValAddress, sdk.NewDecFromInt(cli.DefaultTokens), sdk.NewCoin(sdk.DefaultBondDenom, cli.DefaultTokens)), -// }, -// Pagination: &query.PageResponse{}, -// }, -// }, -// } - -// for _, tc := range testCases { -// tc := tc -// s.Run(tc.name, func() { -// cmd := cli.GetCmdQueryDelegations(address.NewBech32Codec("cosmos")) -// clientCtx := val.ClientCtx - -// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) -// if tc.expErr { -// s.Require().Error(err) -// } else { -// s.Require().NoError(err) -// s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) -// s.Require().Equal(tc.expected.String(), tc.respType.String()) -// } -// }) -// } -// } - -// func (s *E2ETestSuite) TestGetCmdQueryUnbondingDelegations() { -// val := s.network.Validators[0] - -// testCases := []struct { -// name string -// args []string -// expErr bool -// }{ -// { -// "wrong delegator address", -// []string{ -// "wrongDelAddr", -// fmt.Sprintf("--%s=json", flags.FlagOutput), -// }, -// true, -// }, -// { -// "valid request", -// []string{ -// val.Address.String(), -// fmt.Sprintf("--%s=json", flags.FlagOutput), -// }, -// false, -// }, -// } - -// for _, tc := range testCases { -// tc := tc -// s.Run(tc.name, func() { -// cmd := cli.GetCmdQueryUnbondingDelegations(address.NewBech32Codec("cosmos")) -// clientCtx := val.ClientCtx - -// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - -// if tc.expErr { -// s.Require().Error(err) -// } else { -// var ubds types.QueryDelegatorUnbondingDelegationsResponse -// err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &ubds) - -// s.Require().NoError(err) -// s.Require().Len(ubds.UnbondingResponses, 1) -// s.Require().Equal(ubds.UnbondingResponses[0].DelegatorAddress, val.Address.String()) -// } -// }) -// } -// } - -// func (s *E2ETestSuite) TestGetCmdQueryUnbondingDelegation() { -// val := s.network.Validators[0] - -// testCases := []struct { -// name string -// args []string -// expErr bool -// }{ -// { -// "wrong delegator address", -// []string{ -// "wrongDelAddr", -// val.ValAddress.String(), -// fmt.Sprintf("--%s=json", flags.FlagOutput), -// }, -// true, -// }, -// { -// "wrong validator address", -// []string{ -// val.Address.String(), -// "wrongValAddr", -// fmt.Sprintf("--%s=json", flags.FlagOutput), -// }, -// true, -// }, -// { -// "valid request", -// []string{ -// val.Address.String(), -// val.ValAddress.String(), -// fmt.Sprintf("--%s=json", flags.FlagOutput), -// }, -// false, -// }, -// } - -// for _, tc := range testCases { -// tc := tc -// s.Run(tc.name, func() { -// cmd := cli.GetCmdQueryUnbondingDelegation(address.NewBech32Codec("cosmos")) -// clientCtx := val.ClientCtx - -// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - -// if tc.expErr { -// s.Require().Error(err) -// } else { -// var ubd types.UnbondingDelegation - -// err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &ubd) -// s.Require().NoError(err) -// s.Require().Equal(ubd.DelegatorAddress, val.Address.String()) -// s.Require().Equal(ubd.ValidatorAddress, val.ValAddress.String()) -// s.Require().Len(ubd.Entries, 2) -// } -// }) -// } -// } - -// func (s *E2ETestSuite) TestGetCmdQueryValidatorUnbondingDelegations() { -// val := s.network.Validators[0] - -// testCases := []struct { -// name string -// args []string -// expErr bool -// }{ -// { -// "wrong validator address", -// []string{ -// "wrongValAddr", -// fmt.Sprintf("--%s=json", flags.FlagOutput), -// }, -// true, -// }, -// { -// "valid request", -// []string{ -// val.ValAddress.String(), -// fmt.Sprintf("--%s=json", flags.FlagOutput), -// }, -// false, -// }, -// } - -// for _, tc := range testCases { -// tc := tc -// s.Run(tc.name, func() { -// cmd := cli.GetCmdQueryValidatorUnbondingDelegations() -// clientCtx := val.ClientCtx - -// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - -// if tc.expErr { -// s.Require().Error(err) -// } else { -// var ubds types.QueryValidatorUnbondingDelegationsResponse -// err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &ubds) - -// s.Require().NoError(err) -// s.Require().Len(ubds.UnbondingResponses, 1) -// s.Require().Equal(ubds.UnbondingResponses[0].DelegatorAddress, val.Address.String()) -// } -// }) -// } -// } - -// func (s *E2ETestSuite) TestGetCmdQueryRedelegations() { -// val := s.network.Validators[0] -// val2 := s.network.Validators[1] - -// testCases := []struct { -// name string -// args []string -// expErr bool -// }{ -// { -// "wrong delegator address", -// []string{ -// "wrongdeladdr", -// fmt.Sprintf("--%s=json", flags.FlagOutput), -// }, -// true, -// }, -// { -// "valid request", -// []string{ -// val.Address.String(), -// fmt.Sprintf("--%s=json", flags.FlagOutput), -// }, -// false, -// }, -// } - -// for _, tc := range testCases { -// tc := tc -// s.Run(tc.name, func() { -// cmd := cli.GetCmdQueryRedelegations(address.NewBech32Codec("cosmos")) -// clientCtx := val.ClientCtx - -// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - -// if tc.expErr { -// s.Require().Error(err) -// } else { -// var redelegations types.QueryRedelegationsResponse -// err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &redelegations) - -// s.Require().NoError(err) - -// s.Require().Len(redelegations.RedelegationResponses, 1) -// s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.DelegatorAddress, val.Address.String()) -// s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorSrcAddress, val.ValAddress.String()) -// s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorDstAddress, val2.ValAddress.String()) -// } -// }) -// } -// } - -// func (s *E2ETestSuite) TestGetCmdQueryRedelegation() { -// val := s.network.Validators[0] -// val2 := s.network.Validators[1] - -// testCases := []struct { -// name string -// args []string -// expErr bool -// }{ -// { -// "wrong delegator address", -// []string{ -// "wrongdeladdr", -// val.ValAddress.String(), -// val2.ValAddress.String(), -// fmt.Sprintf("--%s=json", flags.FlagOutput), -// }, -// true, -// }, -// { -// "wrong source validator address address", -// []string{ -// val.Address.String(), -// "wrongSrcValAddress", -// val2.ValAddress.String(), -// fmt.Sprintf("--%s=json", flags.FlagOutput), -// }, -// true, -// }, -// { -// "wrong destination validator address address", -// []string{ -// val.Address.String(), -// val.ValAddress.String(), -// "wrongDestValAddress", -// fmt.Sprintf("--%s=json", flags.FlagOutput), -// }, -// true, -// }, -// { -// "valid request", -// []string{ -// val.Address.String(), -// val.ValAddress.String(), -// val2.ValAddress.String(), -// fmt.Sprintf("--%s=json", flags.FlagOutput), -// }, -// false, -// }, -// } - -// for _, tc := range testCases { -// tc := tc -// s.Run(tc.name, func() { -// cmd := cli.GetCmdQueryRedelegation(address.NewBech32Codec("cosmos")) -// clientCtx := val.ClientCtx - -// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - -// if tc.expErr { -// s.Require().Error(err) -// } else { -// var redelegations types.QueryRedelegationsResponse - -// err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &redelegations) -// s.Require().NoError(err) - -// s.Require().Len(redelegations.RedelegationResponses, 1) -// s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.DelegatorAddress, val.Address.String()) -// s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorSrcAddress, val.ValAddress.String()) -// s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorDstAddress, val2.ValAddress.String()) -// } -// }) -// } -// } - -// func (s *E2ETestSuite) TestGetCmdQueryValidatorRedelegations() { -// val := s.network.Validators[0] -// val2 := s.network.Validators[1] - -// testCases := []struct { -// name string -// args []string -// expErr bool -// }{ -// { -// "wrong validator address", -// []string{ -// "wrongValAddr", -// fmt.Sprintf("--%s=json", flags.FlagOutput), -// }, -// true, -// }, -// { -// "valid request", -// []string{ -// val.ValAddress.String(), -// fmt.Sprintf("--%s=json", flags.FlagOutput), -// }, -// false, -// }, -// } - -// for _, tc := range testCases { -// tc := tc -// s.Run(tc.name, func() { -// cmd := cli.GetCmdQueryValidatorRedelegations() -// clientCtx := val.ClientCtx - -// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - -// if tc.expErr { -// s.Require().Error(err) -// } else { -// var redelegations types.QueryRedelegationsResponse -// err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &redelegations) - -// s.Require().NoError(err) - -// s.Require().Len(redelegations.RedelegationResponses, 1) -// s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.DelegatorAddress, val.Address.String()) -// s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorSrcAddress, val.ValAddress.String()) -// s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorDstAddress, val2.ValAddress.String()) -// } -// }) -// } -// } - -// func (s *E2ETestSuite) TestGetCmdQueryHistoricalInfo() { -// val := s.network.Validators[0] - -// testCases := []struct { -// name string -// args []string -// error bool -// }{ -// { -// "wrong height", -// []string{ -// "-1", -// fmt.Sprintf("--%s=json", flags.FlagOutput), -// }, -// true, -// }, -// { -// "valid request", -// []string{ -// "1", -// fmt.Sprintf("--%s=json", flags.FlagOutput), -// }, -// false, -// }, -// } - -// for _, tc := range testCases { -// tc := tc -// s.Run(tc.name, func() { -// cmd := cli.GetCmdQueryHistoricalInfo() -// clientCtx := val.ClientCtx -// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) - -// if tc.error { -// s.Require().Error(err) -// } else { -// var historicalInfo types.HistoricalInfo - -// err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &historicalInfo) -// s.Require().NoError(err) -// s.Require().NotNil(historicalInfo) -// } -// }) -// } -// } - -// func (s *E2ETestSuite) TestGetCmdQueryParams() { -// val := s.network.Validators[0] -// testCases := []struct { -// name string -// args []string -// expectedOutput string -// }{ -// { -// "with text output", -// []string{fmt.Sprintf("--%s=text", flags.FlagOutput)}, -// `bond_denom: stake -// historical_entries: 10000 -// max_entries: 7 -// max_validators: 100 -// min_commission_rate: "0.000000000000000000" -// unbonding_time: 1814400s`, -// }, -// { -// "with json output", -// []string{fmt.Sprintf("--%s=json", flags.FlagOutput)}, -// `{"unbonding_time":"1814400s","max_validators":100,"max_entries":7,"historical_entries":10000,"bond_denom":"stake","min_commission_rate":"0.000000000000000000"}`, -// }, -// } -// for _, tc := range testCases { -// tc := tc -// s.Run(tc.name, func() { -// cmd := cli.GetCmdQueryParams() -// clientCtx := val.ClientCtx -// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) -// s.Require().NoError(err) -// s.Require().Equal(tc.expectedOutput, strings.TrimSpace(out.String())) -// }) -// } -// } - -// func (s *E2ETestSuite) TestGetCmdQueryPool() { -// val := s.network.Validators[0] -// testCases := []struct { -// name string -// args []string -// expectedOutput string -// }{ -// { -// "with text", -// []string{ -// fmt.Sprintf("--%s=text", flags.FlagOutput), -// fmt.Sprintf("--%s=1", flags.FlagHeight), -// }, -// fmt.Sprintf(`bonded_tokens: "%s" -// not_bonded_tokens: "0"`, cli.DefaultTokens.Mul(sdk.NewInt(2)).String()), -// }, -// { -// "with json", -// []string{ -// fmt.Sprintf("--%s=json", flags.FlagOutput), -// fmt.Sprintf("--%s=1", flags.FlagHeight), -// }, -// fmt.Sprintf(`{"not_bonded_tokens":"0","bonded_tokens":"%s"}`, cli.DefaultTokens.Mul(sdk.NewInt(2)).String()), -// }, -// } -// for _, tc := range testCases { -// tc := tc -// s.Run(tc.name, func() { -// cmd := cli.GetCmdQueryPool() -// clientCtx := val.ClientCtx -// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) -// s.Require().NoError(err) -// s.Require().Equal(tc.expectedOutput, strings.TrimSpace(out.String())) -// }) -// } -// } - -// func (s *E2ETestSuite) TestNewEditValidatorCmd() { -// val := s.network.Validators[0] - -// details := "bio" -// identity := "test identity" -// securityContact := "test contact" -// website := "https://test.com" - -// testCases := []struct { -// name string -// args []string -// expectErr bool -// expectedCode uint32 -// respType proto.Message -// }{ -// { -// "with no edit flag (since all are optional)", -// []string{ -// fmt.Sprintf("--%s=%s", flags.FlagFrom, "with wrong from address"), -// 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, sdk.NewInt(10))).String()), -// }, -// true, 0, nil, -// }, -// { -// "with no edit flag (since all are optional)", -// []string{ -// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), -// }, -// false, 0, &sdk.TxResponse{}, -// }, -// { -// "edit validator details", -// []string{ -// fmt.Sprintf("--details=%s", details), -// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), -// }, -// false, 0, &sdk.TxResponse{}, -// }, -// { -// "edit validator identity", -// []string{ -// fmt.Sprintf("--identity=%s", identity), -// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), -// }, -// false, 0, &sdk.TxResponse{}, -// }, -// { -// "edit validator security-contact", -// []string{ -// fmt.Sprintf("--security-contact=%s", securityContact), -// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), -// }, -// false, 0, &sdk.TxResponse{}, -// }, -// { -// "edit validator website", -// []string{ -// fmt.Sprintf("--website=%s", website), -// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), -// }, -// false, 0, &sdk.TxResponse{}, -// }, -// { -// "with all edit flags", -// []string{ -// fmt.Sprintf("--details=%s", details), -// fmt.Sprintf("--identity=%s", identity), -// fmt.Sprintf("--security-contact=%s", securityContact), -// fmt.Sprintf("--website=%s", website), -// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), -// }, -// false, 0, &sdk.TxResponse{}, -// }, -// } - -// for _, tc := range testCases { -// tc := tc - -// s.Run(tc.name, func() { -// cmd := cli.NewEditValidatorCmd() -// clientCtx := val.ClientCtx - -// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) -// if tc.expectErr { -// s.Require().Error(err) -// } else { -// s.Require().NoError(err, out.String()) -// s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) - -// txResp := tc.respType.(*sdk.TxResponse) -// s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, txResp.TxHash, tc.expectedCode)) -// } -// }) -// } -// } - -// func (s *E2ETestSuite) TestNewDelegateCmd() { -// val := s.network.Validators[0] - -// k, _, err := val.ClientCtx.Keyring.NewMnemonic("NewAccount", keyring.English, sdk.FullFundraiserPath, keyring.DefaultBIP39Passphrase, hd.Secp256k1) -// s.Require().NoError(err) - -// pub, err := k.GetPubKey() -// s.Require().NoError(err) - -// newAddr := sdk.AccAddress(pub.Address()) - -// _, err = clitestutil.MsgSendExec( -// val.ClientCtx, -// val.Address, -// newAddr, -// sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(200))), 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, sdk.NewInt(10))).String()), -// ) -// s.Require().NoError(err) -// s.Require().NoError(s.network.WaitForNextBlock()) - -// testCases := []struct { -// name string -// args []string -// expectErr bool -// expectedCode uint32 -// respType proto.Message -// }{ -// { -// "without delegate amount", -// []string{ -// val.ValAddress.String(), -// fmt.Sprintf("--%s=%s", flags.FlagFrom, newAddr.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, sdk.NewInt(10))).String()), -// }, -// true, 0, nil, -// }, -// { -// "without validator address", -// []string{ -// sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), -// fmt.Sprintf("--%s=%s", flags.FlagFrom, newAddr.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, sdk.NewInt(10))).String()), -// }, -// true, 0, nil, -// }, -// { -// "valid transaction of delegate", -// []string{ -// val.ValAddress.String(), -// sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), -// fmt.Sprintf("--%s=%s", flags.FlagFrom, newAddr.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, sdk.NewInt(10))).String()), -// }, -// false, 0, &sdk.TxResponse{}, -// }, -// } - -// for _, tc := range testCases { -// tc := tc - -// s.Run(tc.name, func() { -// cmd := cli.NewDelegateCmd() -// clientCtx := val.ClientCtx - -// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) -// if tc.expectErr { -// s.Require().Error(err) -// } else { -// s.Require().NoError(err, out.String()) -// s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) - -// txResp := tc.respType.(*sdk.TxResponse) -// s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, txResp.TxHash, tc.expectedCode)) -// } -// }) -// } -// } - -// func (s *E2ETestSuite) TestNewRedelegateCmd() { -// val := s.network.Validators[0] -// val2 := s.network.Validators[1] - -// testCases := []struct { -// name string -// args []string -// expectErr bool -// expectedCode uint32 -// respType proto.Message -// }{ -// { -// "without amount", -// []string{ -// val.ValAddress.String(), // src-validator-addr -// val2.ValAddress.String(), // dst-validator-addr -// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), -// }, -// true, 0, nil, -// }, -// { -// "with wrong source validator address", -// []string{ -// `cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj`, // src-validator-addr -// val2.ValAddress.String(), // dst-validator-addr -// sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), // amount -// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), -// }, -// false, 3, &sdk.TxResponse{}, -// }, -// { -// "with wrong destination validator address", -// []string{ -// val.ValAddress.String(), // dst-validator-addr -// `cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj`, // src-validator-addr -// sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), // amount -// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), -// }, -// false, 31, &sdk.TxResponse{}, -// }, -// { -// "valid transaction of delegate", -// []string{ -// val.ValAddress.String(), // src-validator-addr -// val2.ValAddress.String(), // dst-validator-addr -// sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), // amount -// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), -// fmt.Sprintf("--%s=%d", flags.FlagGas, 300000), -// 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, sdk.NewInt(10))).String()), -// }, -// false, 0, &sdk.TxResponse{}, -// }, -// } - -// for _, tc := range testCases { -// tc := tc - -// s.Run(tc.name, func() { -// cmd := cli.NewRedelegateCmd() -// clientCtx := val.ClientCtx - -// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) -// if tc.expectErr { -// s.Require().Error(err) -// } else { -// s.Require().NoError(err, out.String()) -// s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) - -// txResp := tc.respType.(*sdk.TxResponse) -// s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, txResp.TxHash, tc.expectedCode)) -// } -// }) -// } -// } - -// func (s *E2ETestSuite) TestNewUnbondCmd() { -// val := s.network.Validators[0] - -// testCases := []struct { -// name string -// args []string -// expectErr bool -// expectedCode uint32 -// respType proto.Message -// }{ -// { -// "Without unbond amount", -// []string{ -// val.ValAddress.String(), -// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), -// }, -// true, 0, nil, -// }, -// { -// "Without validator address", -// []string{ -// sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), -// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), -// }, -// true, 0, nil, -// }, -// { -// "valid transaction of unbond", -// []string{ -// val.ValAddress.String(), -// sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), -// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), -// }, -// false, 0, &sdk.TxResponse{}, -// }, -// } - -// for _, tc := range testCases { -// tc := tc - -// s.Run(tc.name, func() { -// cmd := cli.NewUnbondCmd() -// clientCtx := val.ClientCtx - -// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) -// if tc.expectErr { -// s.Require().Error(err) -// } else { -// s.Require().NoError(err, out.String()) -// s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) - -// txResp := tc.respType.(*sdk.TxResponse) -// s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, txResp.TxHash, tc.expectedCode)) -// } -// }) -// } -// } - -// func (s *E2ETestSuite) TestNewCancelUnbondingDelegationCmd() { -// val := s.network.Validators[0] - -// testCases := []struct { -// name string -// args []string -// expectErr bool -// expectedCode uint32 -// respType proto.Message -// }{ -// { -// "Without validator address", -// []string{ -// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), -// }, -// true, 0, nil, -// }, -// { -// "Without canceling unbond delegation amount", -// []string{ -// val.ValAddress.String(), -// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), -// }, -// true, 0, nil, -// }, -// { -// "Without unbond creation height", -// []string{ -// val.ValAddress.String(), -// sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), -// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), -// }, -// true, 0, nil, -// }, -// { -// "Wrong unbonding creation height", -// []string{ -// val.ValAddress.String(), -// sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10)).String(), -// sdk.NewInt(10000).String(), -// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), -// }, -// false, sdkerrors.ErrNotFound.ABCICode(), &sdk.TxResponse{}, -// }, -// { -// "Invalid unbonding amount (higher than the unbonding amount)", -// []string{ -// val.ValAddress.String(), -// sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10000)).String(), -// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), -// }, -// false, sdkerrors.ErrInvalidRequest.ABCICode(), &sdk.TxResponse{}, -// }, -// { -// "valid transaction of canceling unbonding delegation", -// []string{ -// val.ValAddress.String(), -// sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(5)).String(), -// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), -// }, -// false, 0, &sdk.TxResponse{}, -// }, -// } - -// for _, tc := range testCases { -// tc := tc - -// s.Run(tc.name, func() { -// cmd := cli.NewCancelUnbondingDelegation() -// clientCtx := val.ClientCtx -// if !tc.expectErr && tc.expectedCode != sdkerrors.ErrNotFound.ABCICode() { -// getCreationHeight := func() int64 { -// // fethichg the unbonding delegations -// resp, err := testutil.GetRequest(fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/unbonding_delegations", val.APIAddress, val.Address.String())) -// s.Require().NoError(err) - -// var ubds types.QueryDelegatorUnbondingDelegationsResponse - -// err = val.ClientCtx.Codec.UnmarshalJSON(resp, &ubds) -// s.Require().NoError(err) -// s.Require().Len(ubds.UnbondingResponses, 1) -// s.Require().Equal(ubds.UnbondingResponses[0].DelegatorAddress, val.Address.String()) -// return ubds.UnbondingResponses[0].Entries[1].CreationHeight -// } -// tc.args = append(tc.args, fmt.Sprint(getCreationHeight())) -// } - -// out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) -// if tc.expectErr { -// s.Require().Error(err) -// } else { -// s.Require().NoError(err, out.String()) -// s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) - -// txResp := tc.respType.(*sdk.TxResponse) -// s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, txResp.TxHash, tc.expectedCode)) -// } -// }) -// } -// } - -// // TestBlockResults tests that the validator updates correctly show when -// // calling the /block_results RPC endpoint. -// // ref: https://github.com/cosmos/cosmos-sdk/issues/7401. -// func (s *E2ETestSuite) TestBlockResults() { -// require := s.Require() -// val := s.network.Validators[0] - -// // Create new account in the keyring. -// k, _, err := val.ClientCtx.Keyring.NewMnemonic("NewDelegator", keyring.English, sdk.FullFundraiserPath, keyring.DefaultBIP39Passphrase, hd.Secp256k1) -// require.NoError(err) -// pub, err := k.GetPubKey() -// require.NoError(err) -// newAddr := sdk.AccAddress(pub.Address()) - -// // Send some funds to the new account. -// _, err = clitestutil.MsgSendExec( -// val.ClientCtx, -// val.Address, -// newAddr, -// sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(200))), 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, sdk.NewInt(10))).String()), -// ) -// require.NoError(err) -// require.NoError(s.network.WaitForNextBlock()) - -// // Use CLI to create a delegation from the new account to validator `val`. -// cmd := cli.NewDelegateCmd() -// _, err = clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, []string{ -// val.ValAddress.String(), -// sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), -// fmt.Sprintf("--%s=%s", flags.FlagFrom, newAddr.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, sdk.NewInt(10))).String()), -// }) -// require.NoError(err) -// require.NoError(s.network.WaitForNextBlock()) - -// // Create a HTTP rpc client. -// rpcClient, err := http.New(val.RPCAddress, "/websocket") -// require.NoError(err) - -// // Loop until we find a block result with the correct validator updates. -// // By experience, it happens around 2 blocks after `delHeight`. -// s.network.RetryForBlocks(func() error { -// latestHeight, err := s.network.LatestHeight() -// require.NoError(err) -// res, err := rpcClient.BlockResults(context.Background(), &latestHeight) -// if err != nil { -// return err -// } - -// if len(res.ValidatorUpdates) == 0 { -// return errors.New("validator update not found yet") -// } - -// valUpdate := res.ValidatorUpdates[0] -// require.Equal( -// valUpdate.GetPubKey().Sum.(*crypto.PublicKey_Ed25519).Ed25519, -// val.PubKey.Bytes(), -// ) - -// return nil -// }, 10) -// } - -// // https://github.com/cosmos/cosmos-sdk/issues/10660 -// func (s *E2ETestSuite) TestEditValidatorMoniker() { -// val := s.network.Validators[0] -// require := s.Require() - -// txCmd := cli.NewEditValidatorCmd() -// moniker := "testing" -// _, err := clitestutil.ExecTestCLICmd(val.ClientCtx, txCmd, []string{ -// val.ValAddress.String(), -// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), -// fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), -// fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), -// fmt.Sprintf("--%s=%s", cli.FlagEditMoniker, moniker), -// fmt.Sprintf("--%s=https://newvalidator.io", cli.FlagWebsite), -// fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), -// }) -// require.NoError(err) -// s.Require().NoError(s.network.WaitForNextBlock()) - -// queryCmd := cli.GetCmdQueryValidator() -// res, err := clitestutil.ExecTestCLICmd( -// val.ClientCtx, queryCmd, -// []string{val.ValAddress.String(), fmt.Sprintf("--%s=json", flags.FlagOutput)}, -// ) -// require.NoError(err) -// var result types.Validator -// require.NoError(val.ClientCtx.Codec.UnmarshalJSON(res.Bytes(), &result)) -// require.Equal(result.GetMoniker(), moniker) - -// _, err = clitestutil.ExecTestCLICmd(val.ClientCtx, txCmd, []string{ -// val.ValAddress.String(), -// fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), -// fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), -// fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), -// fmt.Sprintf("--%s=https://newvalidator.io", cli.FlagWebsite), -// fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), -// }) -// require.NoError(err) -// s.Require().NoError(s.network.WaitForNextBlock()) - -// res, err = clitestutil.ExecTestCLICmd( -// val.ClientCtx, queryCmd, -// []string{val.ValAddress.String(), fmt.Sprintf("--%s=json", flags.FlagOutput)}, -// ) -// require.NoError(err) -// require.NoError(val.ClientCtx.Codec.UnmarshalJSON(res.Bytes(), &result)) -// require.Equal(result.GetMoniker(), moniker) -// } +func (s *E2ETestSuite) TestGetCmdQueryValidator() { + val := s.network.Validators[0] + testCases := []struct { + name string + args []string + expectErr bool + }{ + { + "with invalid address ", + []string{"somethinginvalidaddress", fmt.Sprintf("--%s=json", flags.FlagOutput)}, + true, + }, + { + "with valid and not existing address", + []string{"cosmosvaloper15jkng8hytwt22lllv6mw4k89qkqehtahd84ptu", fmt.Sprintf("--%s=json", flags.FlagOutput)}, + true, + }, + { + "happy case", + []string{val.ValAddress.String(), fmt.Sprintf("--%s=json", flags.FlagOutput)}, + false, + }, + } + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + cmd := cli.GetCmdQueryValidator() + clientCtx := val.ClientCtx + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + if tc.expectErr { + s.Require().Error(err) + s.Require().NotEqual("internal", err.Error()) + } else { + var result types.Validator + s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), &result)) + s.Require().Equal(val.ValAddress.String(), result.OperatorAddress) + } + }) + } +} + +func (s *E2ETestSuite) TestGetCmdQueryValidators() { + val := s.network.Validators[0] + + testCases := []struct { + name string + args []string + minValidatorCount int + }{ + { + "one validator case", + []string{ + fmt.Sprintf("--%s=json", flags.FlagOutput), + fmt.Sprintf("--%s=1", flags.FlagLimit), + }, + 1, + }, + { + "multi validator case", + []string{fmt.Sprintf("--%s=json", flags.FlagOutput)}, + len(s.network.Validators), + }, + } + + for _, tc := range testCases { + tc := tc + + s.Run(tc.name, func() { + cmd := cli.GetCmdQueryValidators() + clientCtx := val.ClientCtx + + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + s.Require().NoError(err) + + var result types.QueryValidatorsResponse + s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), &result)) + s.Require().Equal(tc.minValidatorCount, len(result.Validators)) + }) + } +} + +func (s *E2ETestSuite) TestGetCmdQueryDelegation() { + val := s.network.Validators[0] + val2 := s.network.Validators[1] + + testCases := []struct { + name string + args []string + expErr bool + respType proto.Message + expected proto.Message + }{ + { + "with wrong delegator address", + []string{ + "wrongDelAddr", + val2.ValAddress.String(), + fmt.Sprintf("--%s=json", flags.FlagOutput), + }, + true, nil, nil, + }, + { + "with wrong validator address", + []string{ + val.Address.String(), + "wrongValAddr", + fmt.Sprintf("--%s=json", flags.FlagOutput), + }, + true, nil, nil, + }, + { + "with json output", + []string{ + val.Address.String(), + val2.ValAddress.String(), + fmt.Sprintf("--%s=json", flags.FlagOutput), + }, + false, + &types.DelegationResponse{}, + &types.DelegationResponse{ + Delegation: types.Delegation{ + DelegatorAddress: val.Address.String(), + ValidatorAddress: val2.ValAddress.String(), + Shares: math.LegacyNewDec(10), + }, + Balance: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10)), + }, + }, + } + + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + cmd := cli.GetCmdQueryDelegation(address.NewBech32Codec("cosmos")) + clientCtx := val.ClientCtx + + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + if tc.expErr { + s.Require().Error(err) + } else { + s.Require().NoError(err) + s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) + s.Require().Equal(tc.expected.String(), tc.respType.String()) + } + }) + } +} + +func (s *E2ETestSuite) TestGetCmdQueryDelegations() { + val := s.network.Validators[0] + + testCases := []struct { + name string + args []string + expErr bool + respType proto.Message + expected proto.Message + }{ + { + "with no delegator address", + []string{}, + true, nil, nil, + }, + { + "with wrong delegator address", + []string{"wrongDelAddr"}, + true, nil, nil, + }, + { + "valid request (height specific)", + []string{ + val.Address.String(), + fmt.Sprintf("--%s=json", flags.FlagOutput), + fmt.Sprintf("--%s=1", flags.FlagHeight), + }, + false, + &types.QueryDelegatorDelegationsResponse{}, + &types.QueryDelegatorDelegationsResponse{ + DelegationResponses: types.DelegationResponses{ + types.NewDelegationResp(val.Address, val.ValAddress, sdk.NewDecFromInt(cli.DefaultTokens), sdk.NewCoin(sdk.DefaultBondDenom, cli.DefaultTokens)), + }, + Pagination: &query.PageResponse{}, + }, + }, + } + + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + cmd := cli.GetCmdQueryDelegations(address.NewBech32Codec("cosmos")) + clientCtx := val.ClientCtx + + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + if tc.expErr { + s.Require().Error(err) + } else { + s.Require().NoError(err) + s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) + s.Require().Equal(tc.expected.String(), tc.respType.String()) + } + }) + } +} + +func (s *E2ETestSuite) TestGetCmdQueryValidatorDelegations() { + val := s.network.Validators[0] + + testCases := []struct { + name string + args []string + expErr bool + respType proto.Message + expected proto.Message + }{ + { + "with no validator address", + []string{}, + true, nil, nil, + }, + { + "wrong validator address", + []string{"wrongValAddr"}, + true, nil, nil, + }, + { + "valid request(height specific)", + []string{ + val.Address.String(), + fmt.Sprintf("--%s=json", flags.FlagOutput), + fmt.Sprintf("--%s=1", flags.FlagHeight), + }, + false, + &types.QueryValidatorDelegationsResponse{}, + &types.QueryValidatorDelegationsResponse{ + DelegationResponses: types.DelegationResponses{ + types.NewDelegationResp(val.Address, val.ValAddress, sdk.NewDecFromInt(cli.DefaultTokens), sdk.NewCoin(sdk.DefaultBondDenom, cli.DefaultTokens)), + }, + Pagination: &query.PageResponse{}, + }, + }, + } + + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + cmd := cli.GetCmdQueryDelegations(address.NewBech32Codec("cosmos")) + clientCtx := val.ClientCtx + + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + if tc.expErr { + s.Require().Error(err) + } else { + s.Require().NoError(err) + s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) + s.Require().Equal(tc.expected.String(), tc.respType.String()) + } + }) + } +} + +func (s *E2ETestSuite) TestGetCmdQueryUnbondingDelegations() { + val := s.network.Validators[0] + + testCases := []struct { + name string + args []string + expErr bool + }{ + { + "wrong delegator address", + []string{ + "wrongDelAddr", + fmt.Sprintf("--%s=json", flags.FlagOutput), + }, + true, + }, + { + "valid request", + []string{ + val.Address.String(), + fmt.Sprintf("--%s=json", flags.FlagOutput), + }, + false, + }, + } + + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + cmd := cli.GetCmdQueryUnbondingDelegations(address.NewBech32Codec("cosmos")) + clientCtx := val.ClientCtx + + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + + if tc.expErr { + s.Require().Error(err) + } else { + var ubds types.QueryDelegatorUnbondingDelegationsResponse + err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &ubds) + + s.Require().NoError(err) + s.Require().Len(ubds.UnbondingResponses, 1) + s.Require().Equal(ubds.UnbondingResponses[0].DelegatorAddress, val.Address.String()) + } + }) + } +} + +func (s *E2ETestSuite) TestGetCmdQueryUnbondingDelegation() { + val := s.network.Validators[0] + + testCases := []struct { + name string + args []string + expErr bool + }{ + { + "wrong delegator address", + []string{ + "wrongDelAddr", + val.ValAddress.String(), + fmt.Sprintf("--%s=json", flags.FlagOutput), + }, + true, + }, + { + "wrong validator address", + []string{ + val.Address.String(), + "wrongValAddr", + fmt.Sprintf("--%s=json", flags.FlagOutput), + }, + true, + }, + { + "valid request", + []string{ + val.Address.String(), + val.ValAddress.String(), + fmt.Sprintf("--%s=json", flags.FlagOutput), + }, + false, + }, + } + + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + cmd := cli.GetCmdQueryUnbondingDelegation(address.NewBech32Codec("cosmos")) + clientCtx := val.ClientCtx + + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + + if tc.expErr { + s.Require().Error(err) + } else { + var ubd types.UnbondingDelegation + + err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &ubd) + s.Require().NoError(err) + s.Require().Equal(ubd.DelegatorAddress, val.Address.String()) + s.Require().Equal(ubd.ValidatorAddress, val.ValAddress.String()) + s.Require().Len(ubd.Entries, 2) + } + }) + } +} + +func (s *E2ETestSuite) TestGetCmdQueryValidatorUnbondingDelegations() { + val := s.network.Validators[0] + + testCases := []struct { + name string + args []string + expErr bool + }{ + { + "wrong validator address", + []string{ + "wrongValAddr", + fmt.Sprintf("--%s=json", flags.FlagOutput), + }, + true, + }, + { + "valid request", + []string{ + val.ValAddress.String(), + fmt.Sprintf("--%s=json", flags.FlagOutput), + }, + false, + }, + } + + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + cmd := cli.GetCmdQueryValidatorUnbondingDelegations() + clientCtx := val.ClientCtx + + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + + if tc.expErr { + s.Require().Error(err) + } else { + var ubds types.QueryValidatorUnbondingDelegationsResponse + err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &ubds) + + s.Require().NoError(err) + s.Require().Len(ubds.UnbondingResponses, 1) + s.Require().Equal(ubds.UnbondingResponses[0].DelegatorAddress, val.Address.String()) + } + }) + } +} + +func (s *E2ETestSuite) TestGetCmdQueryRedelegations() { + val := s.network.Validators[0] + val2 := s.network.Validators[1] + + testCases := []struct { + name string + args []string + expErr bool + }{ + { + "wrong delegator address", + []string{ + "wrongdeladdr", + fmt.Sprintf("--%s=json", flags.FlagOutput), + }, + true, + }, + { + "valid request", + []string{ + val.Address.String(), + fmt.Sprintf("--%s=json", flags.FlagOutput), + }, + false, + }, + } + + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + cmd := cli.GetCmdQueryRedelegations(address.NewBech32Codec("cosmos")) + clientCtx := val.ClientCtx + + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + + if tc.expErr { + s.Require().Error(err) + } else { + var redelegations types.QueryRedelegationsResponse + err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &redelegations) + + s.Require().NoError(err) + + s.Require().Len(redelegations.RedelegationResponses, 1) + s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.DelegatorAddress, val.Address.String()) + s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorSrcAddress, val.ValAddress.String()) + s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorDstAddress, val2.ValAddress.String()) + } + }) + } +} + +func (s *E2ETestSuite) TestGetCmdQueryRedelegation() { + val := s.network.Validators[0] + val2 := s.network.Validators[1] + + testCases := []struct { + name string + args []string + expErr bool + }{ + { + "wrong delegator address", + []string{ + "wrongdeladdr", + val.ValAddress.String(), + val2.ValAddress.String(), + fmt.Sprintf("--%s=json", flags.FlagOutput), + }, + true, + }, + { + "wrong source validator address address", + []string{ + val.Address.String(), + "wrongSrcValAddress", + val2.ValAddress.String(), + fmt.Sprintf("--%s=json", flags.FlagOutput), + }, + true, + }, + { + "wrong destination validator address address", + []string{ + val.Address.String(), + val.ValAddress.String(), + "wrongDestValAddress", + fmt.Sprintf("--%s=json", flags.FlagOutput), + }, + true, + }, + { + "valid request", + []string{ + val.Address.String(), + val.ValAddress.String(), + val2.ValAddress.String(), + fmt.Sprintf("--%s=json", flags.FlagOutput), + }, + false, + }, + } + + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + cmd := cli.GetCmdQueryRedelegation(address.NewBech32Codec("cosmos")) + clientCtx := val.ClientCtx + + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + + if tc.expErr { + s.Require().Error(err) + } else { + var redelegations types.QueryRedelegationsResponse + + err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &redelegations) + s.Require().NoError(err) + + s.Require().Len(redelegations.RedelegationResponses, 1) + s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.DelegatorAddress, val.Address.String()) + s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorSrcAddress, val.ValAddress.String()) + s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorDstAddress, val2.ValAddress.String()) + } + }) + } +} + +func (s *E2ETestSuite) TestGetCmdQueryValidatorRedelegations() { + val := s.network.Validators[0] + val2 := s.network.Validators[1] + + testCases := []struct { + name string + args []string + expErr bool + }{ + { + "wrong validator address", + []string{ + "wrongValAddr", + fmt.Sprintf("--%s=json", flags.FlagOutput), + }, + true, + }, + { + "valid request", + []string{ + val.ValAddress.String(), + fmt.Sprintf("--%s=json", flags.FlagOutput), + }, + false, + }, + } + + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + cmd := cli.GetCmdQueryValidatorRedelegations() + clientCtx := val.ClientCtx + + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + + if tc.expErr { + s.Require().Error(err) + } else { + var redelegations types.QueryRedelegationsResponse + err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &redelegations) + + s.Require().NoError(err) + + s.Require().Len(redelegations.RedelegationResponses, 1) + s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.DelegatorAddress, val.Address.String()) + s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorSrcAddress, val.ValAddress.String()) + s.Require().Equal(redelegations.RedelegationResponses[0].Redelegation.ValidatorDstAddress, val2.ValAddress.String()) + } + }) + } +} + +func (s *E2ETestSuite) TestGetCmdQueryHistoricalInfo() { + val := s.network.Validators[0] + + testCases := []struct { + name string + args []string + error bool + }{ + { + "wrong height", + []string{ + "-1", + fmt.Sprintf("--%s=json", flags.FlagOutput), + }, + true, + }, + { + "valid request", + []string{ + "1", + fmt.Sprintf("--%s=json", flags.FlagOutput), + }, + false, + }, + } + + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + cmd := cli.GetCmdQueryHistoricalInfo() + clientCtx := val.ClientCtx + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + + if tc.error { + s.Require().Error(err) + } else { + var historicalInfo types.HistoricalInfo + + err = val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &historicalInfo) + s.Require().NoError(err) + s.Require().NotNil(historicalInfo) + } + }) + } +} + +func (s *E2ETestSuite) TestGetCmdQueryParams() { + val := s.network.Validators[0] + testCases := []struct { + name string + args []string + expectedOutput string + }{ + { + "with text output", + []string{fmt.Sprintf("--%s=text", flags.FlagOutput)}, + `bond_denom: stake +historical_entries: 10000 +max_entries: 7 +max_validators: 100 +min_commission_rate: "0.000000000000000000" +unbonding_time: 1814400s`, + }, + { + "with json output", + []string{fmt.Sprintf("--%s=json", flags.FlagOutput)}, + `{"unbonding_time":"1814400s","max_validators":100,"max_entries":7,"historical_entries":10000,"bond_denom":"stake","min_commission_rate":"0.000000000000000000"}`, + }, + } + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + cmd := cli.GetCmdQueryParams() + clientCtx := val.ClientCtx + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + s.Require().NoError(err) + s.Require().Equal(tc.expectedOutput, strings.TrimSpace(out.String())) + }) + } +} + +func (s *E2ETestSuite) TestGetCmdQueryPool() { + val := s.network.Validators[0] + testCases := []struct { + name string + args []string + expectedOutput string + }{ + { + "with text", + []string{ + fmt.Sprintf("--%s=text", flags.FlagOutput), + fmt.Sprintf("--%s=1", flags.FlagHeight), + }, + fmt.Sprintf(`bonded_tokens: "%s" +not_bonded_tokens: "0"`, cli.DefaultTokens.Mul(sdk.NewInt(2)).String()), + }, + { + "with json", + []string{ + fmt.Sprintf("--%s=json", flags.FlagOutput), + fmt.Sprintf("--%s=1", flags.FlagHeight), + }, + fmt.Sprintf(`{"not_bonded_tokens":"0","bonded_tokens":"%s"}`, cli.DefaultTokens.Mul(sdk.NewInt(2)).String()), + }, + } + for _, tc := range testCases { + tc := tc + s.Run(tc.name, func() { + cmd := cli.GetCmdQueryPool() + clientCtx := val.ClientCtx + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + s.Require().NoError(err) + s.Require().Equal(tc.expectedOutput, strings.TrimSpace(out.String())) + }) + } +} + +func (s *E2ETestSuite) TestNewEditValidatorCmd() { + val := s.network.Validators[0] + + details := "bio" + identity := "test identity" + securityContact := "test contact" + website := "https://test.com" + + testCases := []struct { + name string + args []string + expectErr bool + expectedCode uint32 + respType proto.Message + }{ + { + "with no edit flag (since all are optional)", + []string{ + fmt.Sprintf("--%s=%s", flags.FlagFrom, "with wrong from address"), + 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, sdk.NewInt(10))).String()), + }, + true, 0, nil, + }, + { + "with no edit flag (since all are optional)", + []string{ + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), + }, + false, 0, &sdk.TxResponse{}, + }, + { + "edit validator details", + []string{ + fmt.Sprintf("--details=%s", details), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), + }, + false, 0, &sdk.TxResponse{}, + }, + { + "edit validator identity", + []string{ + fmt.Sprintf("--identity=%s", identity), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), + }, + false, 0, &sdk.TxResponse{}, + }, + { + "edit validator security-contact", + []string{ + fmt.Sprintf("--security-contact=%s", securityContact), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), + }, + false, 0, &sdk.TxResponse{}, + }, + { + "edit validator website", + []string{ + fmt.Sprintf("--website=%s", website), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), + }, + false, 0, &sdk.TxResponse{}, + }, + { + "with all edit flags", + []string{ + fmt.Sprintf("--details=%s", details), + fmt.Sprintf("--identity=%s", identity), + fmt.Sprintf("--security-contact=%s", securityContact), + fmt.Sprintf("--website=%s", website), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), + }, + false, 0, &sdk.TxResponse{}, + }, + } + + for _, tc := range testCases { + tc := tc + + s.Run(tc.name, func() { + cmd := cli.NewEditValidatorCmd() + clientCtx := val.ClientCtx + + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + if tc.expectErr { + s.Require().Error(err) + } else { + s.Require().NoError(err, out.String()) + s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) + + txResp := tc.respType.(*sdk.TxResponse) + s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, txResp.TxHash, tc.expectedCode)) + } + }) + } +} + +func (s *E2ETestSuite) TestNewDelegateCmd() { + val := s.network.Validators[0] + + k, _, err := val.ClientCtx.Keyring.NewMnemonic("NewAccount", keyring.English, sdk.FullFundraiserPath, keyring.DefaultBIP39Passphrase, hd.Secp256k1) + s.Require().NoError(err) + + pub, err := k.GetPubKey() + s.Require().NoError(err) + + newAddr := sdk.AccAddress(pub.Address()) + + _, err = clitestutil.MsgSendExec( + val.ClientCtx, + val.Address, + newAddr, + sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(200))), 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, sdk.NewInt(10))).String()), + ) + s.Require().NoError(err) + s.Require().NoError(s.network.WaitForNextBlock()) + + testCases := []struct { + name string + args []string + expectErr bool + expectedCode uint32 + respType proto.Message + }{ + { + "without delegate amount", + []string{ + val.ValAddress.String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, newAddr.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, sdk.NewInt(10))).String()), + }, + true, 0, nil, + }, + { + "without validator address", + []string{ + sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, newAddr.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, sdk.NewInt(10))).String()), + }, + true, 0, nil, + }, + { + "valid transaction of delegate", + []string{ + val.ValAddress.String(), + sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, newAddr.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, sdk.NewInt(10))).String()), + }, + false, 0, &sdk.TxResponse{}, + }, + } + + for _, tc := range testCases { + tc := tc + + s.Run(tc.name, func() { + cmd := cli.NewDelegateCmd() + clientCtx := val.ClientCtx + + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + if tc.expectErr { + s.Require().Error(err) + } else { + s.Require().NoError(err, out.String()) + s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) + + txResp := tc.respType.(*sdk.TxResponse) + s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, txResp.TxHash, tc.expectedCode)) + } + }) + } +} + +func (s *E2ETestSuite) TestNewRedelegateCmd() { + val := s.network.Validators[0] + val2 := s.network.Validators[1] + + testCases := []struct { + name string + args []string + expectErr bool + expectedCode uint32 + respType proto.Message + }{ + { + "without amount", + []string{ + val.ValAddress.String(), // src-validator-addr + val2.ValAddress.String(), // dst-validator-addr + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), + }, + true, 0, nil, + }, + { + "with wrong source validator address", + []string{ + `cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj`, // src-validator-addr + val2.ValAddress.String(), // dst-validator-addr + sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), // amount + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), + }, + false, 3, &sdk.TxResponse{}, + }, + { + "with wrong destination validator address", + []string{ + val.ValAddress.String(), // dst-validator-addr + `cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj`, // src-validator-addr + sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), // amount + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), + }, + false, 31, &sdk.TxResponse{}, + }, + { + "valid transaction of delegate", + []string{ + val.ValAddress.String(), // src-validator-addr + val2.ValAddress.String(), // dst-validator-addr + sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), // amount + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=%d", flags.FlagGas, 300000), + 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, sdk.NewInt(10))).String()), + }, + false, 0, &sdk.TxResponse{}, + }, + } + + for _, tc := range testCases { + tc := tc + + s.Run(tc.name, func() { + cmd := cli.NewRedelegateCmd() + clientCtx := val.ClientCtx + + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + if tc.expectErr { + s.Require().Error(err) + } else { + s.Require().NoError(err, out.String()) + s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) + + txResp := tc.respType.(*sdk.TxResponse) + s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, txResp.TxHash, tc.expectedCode)) + } + }) + } +} + +func (s *E2ETestSuite) TestNewUnbondCmd() { + val := s.network.Validators[0] + + testCases := []struct { + name string + args []string + expectErr bool + expectedCode uint32 + respType proto.Message + }{ + { + "Without unbond amount", + []string{ + val.ValAddress.String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), + }, + true, 0, nil, + }, + { + "Without validator address", + []string{ + sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), + }, + true, 0, nil, + }, + { + "valid transaction of unbond", + []string{ + val.ValAddress.String(), + sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), + }, + false, 0, &sdk.TxResponse{}, + }, + } + + for _, tc := range testCases { + tc := tc + + s.Run(tc.name, func() { + cmd := cli.NewUnbondCmd() + clientCtx := val.ClientCtx + + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + if tc.expectErr { + s.Require().Error(err) + } else { + s.Require().NoError(err, out.String()) + s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) + + txResp := tc.respType.(*sdk.TxResponse) + s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, txResp.TxHash, tc.expectedCode)) + } + }) + } +} + +func (s *E2ETestSuite) TestNewCancelUnbondingDelegationCmd() { + val := s.network.Validators[0] + + testCases := []struct { + name string + args []string + expectErr bool + expectedCode uint32 + respType proto.Message + }{ + { + "Without validator address", + []string{ + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), + }, + true, 0, nil, + }, + { + "Without canceling unbond delegation amount", + []string{ + val.ValAddress.String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), + }, + true, 0, nil, + }, + { + "Without unbond creation height", + []string{ + val.ValAddress.String(), + sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), + }, + true, 0, nil, + }, + { + "Wrong unbonding creation height", + []string{ + val.ValAddress.String(), + sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10)).String(), + sdk.NewInt(10000).String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), + }, + false, sdkerrors.ErrNotFound.ABCICode(), &sdk.TxResponse{}, + }, + { + "Invalid unbonding amount (higher than the unbonding amount)", + []string{ + val.ValAddress.String(), + sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10000)).String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), + }, + false, sdkerrors.ErrInvalidRequest.ABCICode(), &sdk.TxResponse{}, + }, + { + "valid transaction of canceling unbonding delegation", + []string{ + val.ValAddress.String(), + sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(5)).String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.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, sdk.NewInt(10))).String()), + }, + false, 0, &sdk.TxResponse{}, + }, + } + + for _, tc := range testCases { + tc := tc + + s.Run(tc.name, func() { + cmd := cli.NewCancelUnbondingDelegation() + clientCtx := val.ClientCtx + if !tc.expectErr && tc.expectedCode != sdkerrors.ErrNotFound.ABCICode() { + getCreationHeight := func() int64 { + // fethichg the unbonding delegations + resp, err := testutil.GetRequest(fmt.Sprintf("%s/cosmos/staking/v1beta1/delegators/%s/unbonding_delegations", val.APIAddress, val.Address.String())) + s.Require().NoError(err) + + var ubds types.QueryDelegatorUnbondingDelegationsResponse + + err = val.ClientCtx.Codec.UnmarshalJSON(resp, &ubds) + s.Require().NoError(err) + s.Require().Len(ubds.UnbondingResponses, 1) + s.Require().Equal(ubds.UnbondingResponses[0].DelegatorAddress, val.Address.String()) + return ubds.UnbondingResponses[0].Entries[1].CreationHeight + } + tc.args = append(tc.args, fmt.Sprint(getCreationHeight())) + } + + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + if tc.expectErr { + s.Require().Error(err) + } else { + s.Require().NoError(err, out.String()) + s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) + + txResp := tc.respType.(*sdk.TxResponse) + s.Require().NoError(clitestutil.CheckTxCode(s.network, clientCtx, txResp.TxHash, tc.expectedCode)) + } + }) + } +} + +// TestBlockResults tests that the validator updates correctly show when +// calling the /block_results RPC endpoint. +// ref: https://github.com/cosmos/cosmos-sdk/issues/7401. +func (s *E2ETestSuite) TestBlockResults() { + require := s.Require() + val := s.network.Validators[0] + + // Create new account in the keyring. + k, _, err := val.ClientCtx.Keyring.NewMnemonic("NewDelegator", keyring.English, sdk.FullFundraiserPath, keyring.DefaultBIP39Passphrase, hd.Secp256k1) + require.NoError(err) + pub, err := k.GetPubKey() + require.NoError(err) + newAddr := sdk.AccAddress(pub.Address()) + + // Send some funds to the new account. + _, err = clitestutil.MsgSendExec( + val.ClientCtx, + val.Address, + newAddr, + sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(200))), 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, sdk.NewInt(10))).String()), + ) + require.NoError(err) + require.NoError(s.network.WaitForNextBlock()) + + // Use CLI to create a delegation from the new account to validator `val`. + cmd := cli.NewDelegateCmd() + _, err = clitestutil.ExecTestCLICmd(val.ClientCtx, cmd, []string{ + val.ValAddress.String(), + sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, newAddr.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, sdk.NewInt(10))).String()), + }) + require.NoError(err) + require.NoError(s.network.WaitForNextBlock()) + + // Create a HTTP rpc client. + rpcClient, err := http.New(val.RPCAddress, "/websocket") + require.NoError(err) + + // Loop until we find a block result with the correct validator updates. + // By experience, it happens around 2 blocks after `delHeight`. + s.network.RetryForBlocks(func() error { + latestHeight, err := s.network.LatestHeight() + require.NoError(err) + res, err := rpcClient.BlockResults(context.Background(), &latestHeight) + if err != nil { + return err + } + + if len(res.ValidatorUpdates) == 0 { + return errors.New("validator update not found yet") + } + + valUpdate := res.ValidatorUpdates[0] + require.Equal( + valUpdate.GetPubKey().Sum.(*crypto.PublicKey_Ed25519).Ed25519, + val.PubKey.Bytes(), + ) + + return nil + }, 10) +} + +// https://github.com/cosmos/cosmos-sdk/issues/10660 +func (s *E2ETestSuite) TestEditValidatorMoniker() { + val := s.network.Validators[0] + require := s.Require() + + txCmd := cli.NewEditValidatorCmd() + moniker := "testing" + _, err := clitestutil.ExecTestCLICmd(val.ClientCtx, txCmd, []string{ + val.ValAddress.String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), + fmt.Sprintf("--%s=%s", cli.FlagEditMoniker, moniker), + fmt.Sprintf("--%s=https://newvalidator.io", cli.FlagWebsite), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), + }) + require.NoError(err) + s.Require().NoError(s.network.WaitForNextBlock()) + + queryCmd := cli.GetCmdQueryValidator() + res, err := clitestutil.ExecTestCLICmd( + val.ClientCtx, queryCmd, + []string{val.ValAddress.String(), fmt.Sprintf("--%s=json", flags.FlagOutput)}, + ) + require.NoError(err) + var result types.Validator + require.NoError(val.ClientCtx.Codec.UnmarshalJSON(res.Bytes(), &result)) + require.Equal(result.GetMoniker(), moniker) + + _, err = clitestutil.ExecTestCLICmd(val.ClientCtx, txCmd, []string{ + val.ValAddress.String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastSync), + fmt.Sprintf("--%s=https://newvalidator.io", cli.FlagWebsite), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), + }) + require.NoError(err) + s.Require().NoError(s.network.WaitForNextBlock()) + + res, err = clitestutil.ExecTestCLICmd( + val.ClientCtx, queryCmd, + []string{val.ValAddress.String(), fmt.Sprintf("--%s=json", flags.FlagOutput)}, + ) + require.NoError(err) + require.NoError(val.ClientCtx.Codec.UnmarshalJSON(res.Bytes(), &result)) + require.Equal(result.GetMoniker(), moniker) +} From cf6318146877283437896959bfabfa33dacd98c6 Mon Sep 17 00:00:00 2001 From: marbar3778 Date: Wed, 19 Apr 2023 09:33:35 +0200 Subject: [PATCH 12/23] fix imports --- tests/e2e/staking/suite.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/e2e/staking/suite.go b/tests/e2e/staking/suite.go index f81522bc1975..1ddf4594afdc 100644 --- a/tests/e2e/staking/suite.go +++ b/tests/e2e/staking/suite.go @@ -7,8 +7,8 @@ import ( "strings" "testing" - "cosmossdk.io/api/tendermint/crypto" "cosmossdk.io/math" + "github.com/cometbft/cometbft/proto/tendermint/crypto" "github.com/cometbft/cometbft/rpc/client/http" "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/suite" @@ -21,6 +21,7 @@ import ( clitestutil "github.com/cosmos/cosmos-sdk/testutil/cli" "github.com/cosmos/cosmos-sdk/testutil/network" sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/cosmos/cosmos-sdk/types/query" "github.com/cosmos/cosmos-sdk/x/staking/client/cli" "github.com/cosmos/cosmos-sdk/x/staking/types" From a0daa868ad3113887f4a2432c09ebe6fe3d00086 Mon Sep 17 00:00:00 2001 From: marbar3778 Date: Wed, 19 Apr 2023 11:18:15 +0200 Subject: [PATCH 13/23] fix tests --- tests/e2e/tx/service_test.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/e2e/tx/service_test.go b/tests/e2e/tx/service_test.go index 3295032363d1..eff8c9035074 100644 --- a/tests/e2e/tx/service_test.go +++ b/tests/e2e/tx/service_test.go @@ -274,7 +274,7 @@ func (s *E2ETestSuite) TestGetTxEvents_GRPC() { }, false, "", - 3, + 2, }, { "without pagination", @@ -283,18 +283,18 @@ func (s *E2ETestSuite) TestGetTxEvents_GRPC() { }, false, "", - 3, + 2, }, { "with pagination", &tx.GetTxsEventRequest{ Query: bankMsgSendEventAction, - Page: 2, + Page: 1, Limit: 2, }, false, "", - 1, + 2, }, { "with multi events", @@ -303,7 +303,7 @@ func (s *E2ETestSuite) TestGetTxEvents_GRPC() { }, false, "", - 3, + 2, }, } for _, tc := range testCases { @@ -317,13 +317,13 @@ func (s *E2ETestSuite) TestGetTxEvents_GRPC() { s.Require().NoError(err) s.Require().GreaterOrEqual(len(grpcRes.Txs), 1) s.Require().Equal("foobar", grpcRes.Txs[0].Body.Memo) - s.Require().Equal(len(grpcRes.Txs), tc.expLen) + s.Require().Equal(tc.expLen, len(grpcRes.Txs)) // Make sure fields are populated. // ref: https://github.com/cosmos/cosmos-sdk/issues/8680 // ref: https://github.com/cosmos/cosmos-sdk/issues/8681 s.Require().NotEmpty(grpcRes.TxResponses[0].Timestamp) - s.Require().NotEmpty(grpcRes.TxResponses[0].RawLog) + s.Require().Empty(grpcRes.TxResponses[0].RawLog) // logs are empty if the transactions are successful } }) } @@ -474,7 +474,7 @@ func (s *E2ETestSuite) TestGetTx_GRPCGateway() { // ref: https://github.com/cosmos/cosmos-sdk/issues/8680 // ref: https://github.com/cosmos/cosmos-sdk/issues/8681 s.Require().NotEmpty(result.TxResponse.Timestamp) - s.Require().NotEmpty(result.TxResponse.RawLog) + s.Require().Empty(result.TxResponse.RawLog) // logs are empty on successful transactions } }) } From 612ff6ee86de186a4e2d19be61ae0887fe367071 Mon Sep 17 00:00:00 2001 From: marbar3778 Date: Wed, 19 Apr 2023 12:00:58 +0200 Subject: [PATCH 14/23] fix tests --- tests/e2e/tx/service_test.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/e2e/tx/service_test.go b/tests/e2e/tx/service_test.go index eff8c9035074..acd68ed849e1 100644 --- a/tests/e2e/tx/service_test.go +++ b/tests/e2e/tx/service_test.go @@ -348,25 +348,25 @@ func (s *E2ETestSuite) TestGetTxEvents_GRPCGateway() { "without pagination", fmt.Sprintf("%s/cosmos/tx/v1beta1/txs?query=%s", val.APIAddress, bankMsgSendEventAction), false, - "", 3, + "", 2, }, { "with pagination", - fmt.Sprintf("%s/cosmos/tx/v1beta1/txs?query=%s&page=%d&limit=%d", val.APIAddress, bankMsgSendEventAction, 2, 2), + fmt.Sprintf("%s/cosmos/tx/v1beta1/txs?query=%s&page=%d&limit=%d", val.APIAddress, bankMsgSendEventAction, 1, 2), false, - "", 1, + "", 2, }, { "valid request: order by asc", fmt.Sprintf("%s/cosmos/tx/v1beta1/txs?query=%s&query=%s&order_by=ORDER_BY_ASC", val.APIAddress, bankMsgSendEventAction, "message.module='bank'"), false, - "", 3, + "", 2, }, { "valid request: order by desc", fmt.Sprintf("%s/cosmos/tx/v1beta1/txs?query=%s&query=%s&order_by=ORDER_BY_DESC", val.APIAddress, bankMsgSendEventAction, "message.module='bank'"), false, - "", 3, + "", 2, }, { "invalid request: invalid order by", @@ -378,13 +378,13 @@ func (s *E2ETestSuite) TestGetTxEvents_GRPCGateway() { "expect pass with multiple-events", fmt.Sprintf("%s/cosmos/tx/v1beta1/txs?query=%s&query=%s", val.APIAddress, bankMsgSendEventAction, "message.module='bank'"), false, - "", 3, + "", 2, }, { "expect pass with escape event", fmt.Sprintf("%s/cosmos/tx/v1beta1/txs?query=%s", val.APIAddress, "message.action%3D'/cosmos.bank.v1beta1.MsgSend'"), false, - "", 3, + "", 2, }, } for _, tc := range testCases { From 6a535e5b9dd9cec2f3d6e2a8e0b826003b0895aa Mon Sep 17 00:00:00 2001 From: marbar3778 Date: Wed, 19 Apr 2023 12:45:12 +0200 Subject: [PATCH 15/23] try waiting for the next block to check things --- tests/e2e/tx/service_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/e2e/tx/service_test.go b/tests/e2e/tx/service_test.go index acd68ed849e1..e3fd928a5323 100644 --- a/tests/e2e/tx/service_test.go +++ b/tests/e2e/tx/service_test.go @@ -308,6 +308,7 @@ func (s *E2ETestSuite) TestGetTxEvents_GRPC() { } for _, tc := range testCases { s.Run(tc.name, func() { + s.network.WaitForNextBlock() // Query the tx via gRPC. grpcRes, err := s.queryClient.GetTxsEvent(context.Background(), tc.req) if tc.expErr { From de66a3c9f4c5c41996fe0b20a73e71bf255bd8ec Mon Sep 17 00:00:00 2001 From: marbar3778 Date: Wed, 19 Apr 2023 16:19:36 +0200 Subject: [PATCH 16/23] remove waitfor --- tests/e2e/tx/service_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/e2e/tx/service_test.go b/tests/e2e/tx/service_test.go index e3fd928a5323..acd68ed849e1 100644 --- a/tests/e2e/tx/service_test.go +++ b/tests/e2e/tx/service_test.go @@ -308,7 +308,6 @@ func (s *E2ETestSuite) TestGetTxEvents_GRPC() { } for _, tc := range testCases { s.Run(tc.name, func() { - s.network.WaitForNextBlock() // Query the tx via gRPC. grpcRes, err := s.queryClient.GetTxsEvent(context.Background(), tc.req) if tc.expErr { From ce7804e957a22e24473bd04f99332c03381b2be7 Mon Sep 17 00:00:00 2001 From: marbar3778 Date: Wed, 19 Apr 2023 17:12:04 +0200 Subject: [PATCH 17/23] tets --- tests/e2e/tx/service_test.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/e2e/tx/service_test.go b/tests/e2e/tx/service_test.go index acd68ed849e1..ab650e8ea7c6 100644 --- a/tests/e2e/tx/service_test.go +++ b/tests/e2e/tx/service_test.go @@ -274,7 +274,7 @@ func (s *E2ETestSuite) TestGetTxEvents_GRPC() { }, false, "", - 2, + 3, }, { "without pagination", @@ -283,7 +283,7 @@ func (s *E2ETestSuite) TestGetTxEvents_GRPC() { }, false, "", - 2, + 3, }, { "with pagination", @@ -303,7 +303,7 @@ func (s *E2ETestSuite) TestGetTxEvents_GRPC() { }, false, "", - 2, + 3, }, } for _, tc := range testCases { @@ -348,7 +348,7 @@ func (s *E2ETestSuite) TestGetTxEvents_GRPCGateway() { "without pagination", fmt.Sprintf("%s/cosmos/tx/v1beta1/txs?query=%s", val.APIAddress, bankMsgSendEventAction), false, - "", 2, + "", 3, }, { "with pagination", @@ -360,13 +360,13 @@ func (s *E2ETestSuite) TestGetTxEvents_GRPCGateway() { "valid request: order by asc", fmt.Sprintf("%s/cosmos/tx/v1beta1/txs?query=%s&query=%s&order_by=ORDER_BY_ASC", val.APIAddress, bankMsgSendEventAction, "message.module='bank'"), false, - "", 2, + "", 3, }, { "valid request: order by desc", fmt.Sprintf("%s/cosmos/tx/v1beta1/txs?query=%s&query=%s&order_by=ORDER_BY_DESC", val.APIAddress, bankMsgSendEventAction, "message.module='bank'"), false, - "", 2, + "", 3, }, { "invalid request: invalid order by", @@ -378,13 +378,13 @@ func (s *E2ETestSuite) TestGetTxEvents_GRPCGateway() { "expect pass with multiple-events", fmt.Sprintf("%s/cosmos/tx/v1beta1/txs?query=%s&query=%s", val.APIAddress, bankMsgSendEventAction, "message.module='bank'"), false, - "", 2, + "", 3, }, { "expect pass with escape event", fmt.Sprintf("%s/cosmos/tx/v1beta1/txs?query=%s", val.APIAddress, "message.action%3D'/cosmos.bank.v1beta1.MsgSend'"), false, - "", 2, + "", 3, }, } for _, tc := range testCases { From 4b4b21a4badf1a8830d0b5d757197361899ac5a9 Mon Sep 17 00:00:00 2001 From: marbar3778 Date: Thu, 20 Apr 2023 11:22:25 +0200 Subject: [PATCH 18/23] some changes --- tests/e2e/group/tx.go | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/tests/e2e/group/tx.go b/tests/e2e/group/tx.go index c3e184db8989..d7a119611ed2 100644 --- a/tests/e2e/group/tx.go +++ b/tests/e2e/group/tx.go @@ -402,16 +402,17 @@ func (s *E2ETestSuite) TestExecProposalsWhenMemberLeavesOrIsUpdated() { s.Require().NoError(err) if tc.expectLogErr { - s.Require().Contains(execResp.RawLog, tc.errMsg) + fmt.Println(execResp, tc.errMsg) + s.Require().Contains(execResp.Events, tc.errMsg) } }) } } func (s *E2ETestSuite) getProposalIDFromTxResponse(txResp sdk.TxResponse) string { - s.Require().Greater(len(txResp.Logs), 0) - s.Require().NotNil(txResp.Logs[0].Events) - events := txResp.Logs[0].Events + s.Require().Greater(len(txResp.Events), 0) + s.Require().NotNil(txResp.Events[0]) + events := txResp.Events createProposalEvent, _ := sdk.TypedEventToEvent(&group.EventSubmitProposal{}) for _, e := range events { @@ -424,9 +425,9 @@ func (s *E2ETestSuite) getProposalIDFromTxResponse(txResp sdk.TxResponse) string } func (s *E2ETestSuite) getGroupIDFromTxResponse(txResp sdk.TxResponse) string { - s.Require().Greater(len(txResp.Logs), 0) - s.Require().NotNil(txResp.Logs[0].Events) - events := txResp.Logs[0].Events + s.Require().Greater(len(txResp.Events), 0) + s.Require().NotNil(txResp.Events[0]) + events := txResp.Events createProposalEvent, _ := sdk.TypedEventToEvent(&group.EventCreateGroup{}) for _, e := range events { From ccd7e7f8be0b160bb710169495f8bcb36472271b Mon Sep 17 00:00:00 2001 From: Facundo Medica Date: Thu, 20 Apr 2023 20:02:57 -0300 Subject: [PATCH 19/23] fix group e2e test --- tests/e2e/group/tx.go | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/tests/e2e/group/tx.go b/tests/e2e/group/tx.go index 445c9ab8cdf8..f51ced09ac9a 100644 --- a/tests/e2e/group/tx.go +++ b/tests/e2e/group/tx.go @@ -12,6 +12,7 @@ import ( // without this import amino json encoding will fail when resolving any types _ "cosmossdk.io/api/cosmos/group/v1" + "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/crypto/hd" "github.com/cosmos/cosmos-sdk/crypto/keyring" @@ -403,9 +404,19 @@ func (s *E2ETestSuite) TestExecProposalsWhenMemberLeavesOrIsUpdated() { execResp, err = clitestutil.GetTxResponse(s.network, val.ClientCtx, execResp.TxHash) s.Require().NoError(err) + eventExec, _ := sdk.TypedEventToEvent(&group.EventExec{}) + + // get the event that contains the result if tc.expectLogErr { - fmt.Println(execResp, tc.errMsg) - s.Require().Contains(execResp.Events, tc.errMsg) + for _, e := range execResp.Events { + if e.Type == eventExec.Type { + for _, a := range e.Attributes { + if a.Key == "result" { + s.Require().Contains(tc.errMsg, a.Value) + } + } + } + } } }) } From 47f9ed696d85460e0378109985cedf3cd132c285 Mon Sep 17 00:00:00 2001 From: Facundo Medica Date: Thu, 20 Apr 2023 20:09:22 -0300 Subject: [PATCH 20/23] cleaner err check --- tests/e2e/group/tx.go | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/tests/e2e/group/tx.go b/tests/e2e/group/tx.go index f51ced09ac9a..3a6b416bb8f5 100644 --- a/tests/e2e/group/tx.go +++ b/tests/e2e/group/tx.go @@ -404,17 +404,14 @@ func (s *E2ETestSuite) TestExecProposalsWhenMemberLeavesOrIsUpdated() { execResp, err = clitestutil.GetTxResponse(s.network, val.ClientCtx, execResp.TxHash) s.Require().NoError(err) - eventExec, _ := sdk.TypedEventToEvent(&group.EventExec{}) - - // get the event that contains the result + // Check the result of EventExec if tc.expectLogErr { for _, e := range execResp.Events { - if e.Type == eventExec.Type { - for _, a := range e.Attributes { - if a.Key == "result" { - s.Require().Contains(tc.errMsg, a.Value) - } - } + parsedEv, err := sdk.ParseTypedEvent(e) + s.Require().NoError(err) + + if eventExec, ok := parsedEv.(*group.EventExec); ok { + s.Require().Equal(tc.errMsg, eventExec.Result) } } } From 1d0cb1fe85652cab628cb4a2480d9d768d93bc34 Mon Sep 17 00:00:00 2001 From: Facundo Medica Date: Thu, 20 Apr 2023 20:11:09 -0300 Subject: [PATCH 21/23] cleaner err check --- tests/e2e/group/tx.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/e2e/group/tx.go b/tests/e2e/group/tx.go index 3a6b416bb8f5..1977f9c150af 100644 --- a/tests/e2e/group/tx.go +++ b/tests/e2e/group/tx.go @@ -406,14 +406,17 @@ func (s *E2ETestSuite) TestExecProposalsWhenMemberLeavesOrIsUpdated() { // Check the result of EventExec if tc.expectLogErr { + var errChecked bool for _, e := range execResp.Events { parsedEv, err := sdk.ParseTypedEvent(e) s.Require().NoError(err) if eventExec, ok := parsedEv.(*group.EventExec); ok { + errChecked = true s.Require().Equal(tc.errMsg, eventExec.Result) } } + s.Require().Truef(errChecked, "didn't find a result to check against") } }) } From b5059bd630aa0e05649966d5778b3170549b8658 Mon Sep 17 00:00:00 2001 From: Facundo Medica Date: Thu, 20 Apr 2023 20:30:12 -0300 Subject: [PATCH 22/23] fix event check --- tests/e2e/group/tx.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/e2e/group/tx.go b/tests/e2e/group/tx.go index 1977f9c150af..ede36f8d7e4b 100644 --- a/tests/e2e/group/tx.go +++ b/tests/e2e/group/tx.go @@ -404,10 +404,16 @@ func (s *E2ETestSuite) TestExecProposalsWhenMemberLeavesOrIsUpdated() { execResp, err = clitestutil.GetTxResponse(s.network, val.ClientCtx, execResp.TxHash) s.Require().NoError(err) + eventExec, _ := sdk.TypedEventToEvent(&group.EventExec{}) + // Check the result of EventExec if tc.expectLogErr { var errChecked bool for _, e := range execResp.Events { + if e.Type != eventExec.Type { + continue + } + parsedEv, err := sdk.ParseTypedEvent(e) s.Require().NoError(err) From 84f62beb5194ca2d91f8341ab1145aaf81242612 Mon Sep 17 00:00:00 2001 From: marbar3778 Date: Mon, 24 Apr 2023 10:52:36 +0200 Subject: [PATCH 23/23] fix auth test case --- tests/e2e/auth/suite.go | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/tests/e2e/auth/suite.go b/tests/e2e/auth/suite.go index 3887ee44291f..0c0f776cb447 100644 --- a/tests/e2e/auth/suite.go +++ b/tests/e2e/auth/suite.go @@ -7,11 +7,11 @@ import ( "strings" "testing" - "github.com/stretchr/testify/require" - "github.com/stretchr/testify/suite" - "cosmossdk.io/depinject" "cosmossdk.io/math" + abci "github.com/cometbft/cometbft/abci/types" + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/flags" @@ -440,7 +440,9 @@ func (s *E2ETestSuite) TestCLIQueryTxCmdByHash() { var result sdk.TxResponse s.Require().NoError(val.ClientCtx.Codec.UnmarshalJSON(out.Bytes(), &result)) s.Require().NotNil(result.Height) - s.Require().Contains(result.RawLog, tc.rawLogContains) + if ok := s.deepContains(result.Events, tc.rawLogContains); !ok { + s.Require().Fail("raw log does not contain the expected value, expected value: %s", tc.rawLogContains) + } } }) } @@ -1961,3 +1963,14 @@ func (s *E2ETestSuite) getBalances(clientCtx client.Context, addr sdk.AccAddress startTokens := balRes.Balances.AmountOf(denom) return startTokens } + +func (s *E2ETestSuite) deepContains(events []abci.Event, value string) bool { + for _, e := range events { + for _, attr := range e.Attributes { + if strings.Contains(attr.Value, value) { + return true + } + } + } + return false +}