Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Cancel unbonding delegation entry #10885

Merged
merged 56 commits into from
Apr 5, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
b18cbc2
feat(WIP): add msg service for cancel unbonding delegation
Jan 5, 2022
276d33b
WIP: add simulation for canceling unbonding delegation
Jan 5, 2022
5f197f1
Merge the master
Jan 5, 2022
759fff3
WIP: update the initial balance in ubd entry
Jan 5, 2022
bf10855
WIP: update the initial balance and balance in ubd entry
Jan 6, 2022
bcee445
Merge remote-tracking branch 'upstream/master' into sai/577_cancel_un…
Jan 6, 2022
ff8be0f
revert the proto-gen for gov,staking
Jan 6, 2022
ee7079e
Merge branch 'master' into sai/577_cancel_unbond
gsk967 Jan 6, 2022
98a6126
test: add cli test for cancel unbond delegation
Jan 7, 2022
8d3a82b
Merge branch 'sai/577_cancel_unbond' of github.com:gsk967/cosmos-sdk …
Jan 7, 2022
78042e6
test: add simulation test for cancel-unbond
Jan 8, 2022
5147003
chore: check the validator is jailed or not for cancel unbond
Jan 11, 2022
d93705f
chore: try to fix cancel unbond simulation
Jan 11, 2022
389bd1f
Merge branch 'master' into sai/577_cancel_unbond
gsk967 Jan 11, 2022
f909286
chore: update the consensus version and changelog
Jan 19, 2022
07a4822
chore: update the consensus version and changelog
Jan 19, 2022
a8cd5dd
Merge branch 'master' of https://github.com/cosmos/cosmos-sdk into sa…
Jan 20, 2022
31c54a1
test: add more test cases for cancel unbond delegation
Jan 20, 2022
927e3b9
Merge remote-tracking branch 'upstream/master' into sai/577_cancel_un…
Jan 21, 2022
550e27d
fix: fix the issue of docs bug
Jan 27, 2022
65b8527
Merge the upstream/master
Jan 27, 2022
2d26ab3
Merge branch 'master' into sai/577_cancel_unbond
gsk967 Jan 27, 2022
816cb9c
Merge branch 'master' into sai/577_cancel_unbond
gsk967 Jan 28, 2022
e27b990
Merge remote upstream master
Jan 29, 2022
61c4818
Merge branch 'master' into sai/577_cancel_unbond
gsk967 Jan 31, 2022
be0b721
Merge branch 'master' into sai/577_cancel_unbond
gsk967 Feb 1, 2022
ad66dc4
Merge branch 'master' into sai/577_cancel_unbond
Mar 21, 2022
ef9f21e
fix: fix the build issue
Mar 21, 2022
15d215e
Merge branch 'master' into sai/577_cancel_unbond
gsk967 Mar 23, 2022
b21d5a0
chore: address the pr comments
Mar 23, 2022
563db02
Merge branch 'master' into sai/577_cancel_unbond
gsk967 Mar 23, 2022
f288ecd
Update CHANGELOG.md
alexanderbez Mar 23, 2022
70a2b53
Merge branch 'master' into sai/577_cancel_unbond
gsk967 Mar 24, 2022
e9bd4bb
Merge branch 'master' into sai/577_cancel_unbond
gsk967 Mar 24, 2022
971dc0a
chore: remove commented code
Mar 24, 2022
8b9fee6
Merge branch 'master' into sai/577_cancel_unbond
gsk967 Mar 25, 2022
ea69358
Merge branch 'master' into sai/577_cancel_unbond
gsk967 Mar 25, 2022
f7cafe2
Merge branch 'master' into sai/577_cancel_unbond
gsk967 Mar 26, 2022
28243eb
Merge branch 'master' into sai/577_cancel_unbond
gsk967 Mar 28, 2022
6c3aa6f
Merge branch 'master' into sai/577_cancel_unbond
gsk967 Mar 29, 2022
4c67387
Merge branch 'master' into sai/577_cancel_unbond
gsk967 Mar 30, 2022
793ce7f
test: add test cases for cancel unbond
Mar 30, 2022
8c1e20a
chore: covert creation_height from uint64 to int64
Mar 30, 2022
de22757
Merge branch 'master' into sai/577_cancel_unbond
gsk967 Mar 30, 2022
597aa0b
Merge branch 'master' into sai/577_cancel_unbond
gsk967 Mar 30, 2022
5390f78
Merge branch 'master' into sai/577_cancel_unbond
gsk967 Mar 31, 2022
b468491
Merge branch 'master' into sai/577_cancel_unbond
gsk967 Apr 1, 2022
b8b643e
Merge branch 'master' into sai/577_cancel_unbond
anilcse Apr 1, 2022
0bc4085
Merge branch 'master' into sai/577_cancel_unbond
gsk967 Apr 3, 2022
069101a
Merge branch 'master' into sai/577_cancel_unbond
gsk967 Apr 4, 2022
ebaa959
Merge branch 'master' into sai/577_cancel_unbond
gsk967 Apr 4, 2022
78725ee
Merge branch 'master' into sai/577_cancel_unbond
gsk967 Apr 5, 2022
d4bba93
Merge branch 'master' into sai/577_cancel_unbond
gsk967 Apr 5, 2022
376024d
chore: address the review comments
Apr 5, 2022
21ce078
Merge branch 'sai/577_cancel_unbond' of github.com:gsk967/cosmos-sdk …
Apr 5, 2022
bb70c1c
Merge branch 'master' into sai/577_cancel_unbond
gsk967 Apr 5, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
test: add more test cases for cancel unbond delegation
  • Loading branch information
Sai Kumar committed Jan 20, 2022
commit 31c54a1202bbefbbf442c4e3165324ae59520339
4 changes: 2 additions & 2 deletions proto/cosmos/staking/v1beta1/tx.proto
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ service Msg {
rpc Undelegate(MsgUndelegate) returns (MsgUndelegateResponse);

// CancelUnbondingDelegation defines a method for performing canceling the unbonding delegation
// and delegate back to previous validator
// and delegate back to previous validator.
rpc CancelUnbondingDelegation(MsgCancelUnbondingDelegation) returns (MsgCancelUnbondingDelegationResponse);
gsk967 marked this conversation as resolved.
Show resolved Hide resolved
}

Expand Down Expand Up @@ -125,7 +125,7 @@ message MsgUndelegateResponse {
google.protobuf.Timestamp completion_time = 1 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true];
}

// MsgCancelUnbondingDelegation defines the SDK message for performing an cancel unbonding delegation for delegator
// MsgCancelUnbondingDelegation defines the SDK message for performing a cancel unbonding delegation for delegator
message MsgCancelUnbondingDelegation{
option (gogoproto.equal) = false;
gsk967 marked this conversation as resolved.
Show resolved Hide resolved
option (gogoproto.goproto_getters) = false;
Expand Down
4 changes: 2 additions & 2 deletions x/staking/client/cli/tx.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ func NewTxCmd() *cobra.Command {
NewDelegateCmd(),
NewRedelegateCmd(),
NewUnbondCmd(),
NewCancelUnBondDelegation(),
NewCancelUnbondingDelegation(),
)

return stakingTxCmd
Expand Down Expand Up @@ -278,7 +278,7 @@ $ %s tx staking unbond %s1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj 100stake --from
return cmd
}

func NewCancelUnBondDelegation() *cobra.Command {
func NewCancelUnbondingDelegation() *cobra.Command {
bech32PrefixValAddr := sdk.GetConfig().GetBech32ValidatorAddrPrefix()

cmd := &cobra.Command{
Expand Down
30 changes: 28 additions & 2 deletions x/staking/client/testutil/suite.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package testutil
import (
"context"
"fmt"
sdkerr "github.com/cosmos/cosmos-sdk/types/errors"
gsk967 marked this conversation as resolved.
Show resolved Hide resolved
"strings"
"testing"

Expand Down Expand Up @@ -534,7 +535,6 @@ func (s *IntegrationTestSuite) TestGetCmdQueryUnbondingDelegations() {

s.Require().NoError(err)
s.Require().Len(ubds.UnbondingResponses, 1)
fmt.Println(ubds.UnbondingResponses)
s.Require().Equal(ubds.UnbondingResponses[0].DelegatorAddress, val.Address.String())
}
})
Expand Down Expand Up @@ -1344,6 +1344,32 @@ func (s *IntegrationTestSuite) TestNewCancelUnbondingDelegationCmd() {
},
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.BroadcastBlock),
fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()),
},
false, sdkerr.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(),
sdk.NewInt(3).String(),
fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()),
fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation),
fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock),
fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()),
},
false, sdkerr.ErrInvalidRequest.ABCICode(), &sdk.TxResponse{},
},
{
"valid transaction of canceling unbonding delegation",
[]string{
Expand All @@ -1363,7 +1389,7 @@ func (s *IntegrationTestSuite) TestNewCancelUnbondingDelegationCmd() {
tc := tc

s.Run(tc.name, func() {
cmd := cli.NewCancelUnBondDelegation()
cmd := cli.NewCancelUnbondingDelegation()
clientCtx := val.ClientCtx

out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
Expand Down
32 changes: 17 additions & 15 deletions x/staking/keeper/msg_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -411,14 +411,14 @@ func (k msgServer) CancelUnbondingDelegation(goCtx context.Context, msg *types.M
return nil, types.ErrNoValidatorFound
}

//// In some situations, the exchange rate becomes invalid, e.g. if
//// Validator loses all tokens due to slashing. In this case,
//// make all future delegations invalid.
// In some situations, the exchange rate becomes invalid, e.g. if
// Validator loses all tokens due to slashing. In this case,
// make all future delegations invalid.
if validator.InvalidExRate() {
return nil, types.ErrDelegatorShareExRateInvalid
}

if validator.IsJailed(){
if validator.IsJailed() {
return nil, types.ErrValidatorJailed
}

Expand All @@ -431,29 +431,31 @@ func (k msgServer) CancelUnbondingDelegation(goCtx context.Context, msg *types.M
}

var (
foundUnBondingAtHeight = false
unbondEntry types.UnbondingDelegationEntry
unbondEntryIndex int64
unbondEntry types.UnbondingDelegationEntry
unbondEntryIndex int64 = -1
)

for i, entry := range ubd.Entries {
if entry.CreationHeight == int64(msg.CreationHeight) {
gsk967 marked this conversation as resolved.
Show resolved Hide resolved
foundUnBondingAtHeight = true
unbondEntry = entry
unbondEntryIndex = int64(i)
break
}
}
if !foundUnBondingAtHeight {
return nil, sdkerrors.Wrapf(sdkerrors.ErrNotFound, "unbonding delegation is not found at block height %d", msg.CreationHeight)
if unbondEntryIndex == -1 {
return nil, sdkerrors.Wrapf(sdkerrors.ErrNotFound, "unbonding delegation entry is not found at block height %d", msg.CreationHeight)
}

if !msg.Amount.IsPositive() {
return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "invalid amount")
}

if unbondEntry.Balance.LT(msg.Amount.Amount) {
return nil, sdkerrors.Wrap(types.ErrNotEnoughDelegationShares, msg.Amount.String())
return nil, sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "amount is greater than the unbonding delegation entry balance")
}

if !ubd.Entries[unbondEntryIndex].CompletionTime.After(ctx.BlockTime()){
return nil, sdkerrors.Wrap(types.ErrNotEnoughDelegationShares, msg.Amount.String())
if ubd.Entries[unbondEntryIndex].CompletionTime.Before(ctx.BlockTime()) {
gsk967 marked this conversation as resolved.
Show resolved Hide resolved
return nil, sdkerrors.Wrapf(sdkerrors.ErrInvalidRequest, "unbonding delegation is already processed.")
gsk967 marked this conversation as resolved.
Show resolved Hide resolved
}

// delegate the unbonding delegation amount to validator back
gsk967 marked this conversation as resolved.
Show resolved Hide resolved
Expand All @@ -463,7 +465,7 @@ func (k msgServer) CancelUnbondingDelegation(goCtx context.Context, msg *types.M
}

amount := unbondEntry.Balance.Sub(msg.Amount.Amount)
atheeshp marked this conversation as resolved.
Show resolved Hide resolved
if amount.Equal(sdk.NewInt(0)) {
if amount.IsZero() {
// remove from ubd
gsk967 marked this conversation as resolved.
Show resolved Hide resolved
ubd.RemoveEntry(unbondEntryIndex)
} else {
Expand All @@ -481,7 +483,7 @@ func (k msgServer) CancelUnbondingDelegation(goCtx context.Context, msg *types.M

ctx.EventManager().EmitEvent(
sdk.NewEvent(
types.EventTypeCancelUnbondDelegation,
types.EventTypeCancelUnbondingDelegation,
sdk.NewAttribute(sdk.AttributeKeyAmount, msg.Amount.String()),
sdk.NewAttribute(types.AttributeKeyValidator, msg.ValidatorAddress),
sdk.NewAttribute(types.AttributeKeyDelegator, msg.DelegatorAddress),
Expand Down
2 changes: 0 additions & 2 deletions x/staking/simulation/operations.go
Original file line number Diff line number Diff line change
Expand Up @@ -405,7 +405,6 @@ func SimulateMsgCancelUnbondingDelegate(ak types.AccountKeeper, bk types.BankKee
valAddr := validator.GetOperator()
unbondingDelegation, found := k.GetUnbondingDelegation(ctx, simAccount.Address, valAddr)
if !found {
//return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgCancelUnbondingDelegation, "account does have any unbonding delegation"), nil, fmt.Errorf("delegation addr: %s does not exist in simulation accounts", simAccount.Address)
return simtypes.NoOpMsg(types.ModuleName, types.TypeMsgCancelUnbondingDelegation, "account does have any unbonding delegation"), nil, nil
}

Expand Down Expand Up @@ -435,7 +434,6 @@ func SimulateMsgCancelUnbondingDelegate(ak types.AccountKeeper, bk types.BankKee

// if simaccount.PrivKey == nil, delegation address does not exist in accs. Return error
gsk967 marked this conversation as resolved.
Show resolved Hide resolved
if simAccount.PrivKey == nil {
//return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "account private key is nil"), nil, fmt.Errorf("delegation addr: %s does not exist in simulation accounts", delAddr)
return simtypes.NoOpMsg(types.ModuleName, msg.Type(), "account private key is nil"), nil, fmt.Errorf("delegation addr: %s does not exist in simulation accounts", simAccount.Address)
}

Expand Down
16 changes: 8 additions & 8 deletions x/staking/types/events.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@ package types

// staking module event types
const (
EventTypeCompleteUnbonding = "complete_unbonding"
EventTypeCompleteRedelegation = "complete_redelegation"
EventTypeCreateValidator = "create_validator"
EventTypeEditValidator = "edit_validator"
EventTypeDelegate = "delegate"
EventTypeUnbond = "unbond"
EventTypeCancelUnbondDelegation = "cancel_unbond_delegation"
EventTypeRedelegate = "redelegate"
EventTypeCompleteUnbonding = "complete_unbonding"
EventTypeCompleteRedelegation = "complete_redelegation"
EventTypeCreateValidator = "create_validator"
EventTypeEditValidator = "edit_validator"
EventTypeDelegate = "delegate"
EventTypeUnbond = "unbond"
EventTypeCancelUnbondingDelegation = "cancel_unbonding_delegation"
EventTypeRedelegate = "redelegate"

AttributeKeyValidator = "validator"
AttributeKeyCommissionRate = "commission_rate"
Expand Down