github.com/cosmos/cosmos-sdk@v0.50.10/x/staking/keeper/delegation_test.go (about)

     1  package keeper_test
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/golang/mock/gomock"
     7  
     8  	"cosmossdk.io/math"
     9  
    10  	"github.com/cosmos/cosmos-sdk/codec/address"
    11  	simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims"
    12  	sdk "github.com/cosmos/cosmos-sdk/types"
    13  	stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper"
    14  	"github.com/cosmos/cosmos-sdk/x/staking/testutil"
    15  	stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
    16  )
    17  
    18  func createValAddrs(count int) ([]sdk.AccAddress, []sdk.ValAddress) {
    19  	addrs := simtestutil.CreateIncrementalAccounts(count)
    20  	valAddrs := simtestutil.ConvertAddrsToValAddrs(addrs)
    21  
    22  	return addrs, valAddrs
    23  }
    24  
    25  // tests GetDelegation, GetDelegatorDelegations, SetDelegation, RemoveDelegation, GetDelegatorDelegations
    26  func (s *KeeperTestSuite) TestDelegation() {
    27  	ctx, keeper := s.ctx, s.stakingKeeper
    28  	require := s.Require()
    29  
    30  	addrDels, valAddrs := createValAddrs(3)
    31  
    32  	s.accountKeeper.EXPECT().AddressCodec().Return(address.NewBech32Codec("cosmos")).AnyTimes()
    33  
    34  	// construct the validators
    35  	amts := []math.Int{math.NewInt(9), math.NewInt(8), math.NewInt(7)}
    36  	var validators [3]stakingtypes.Validator
    37  	for i, amt := range amts {
    38  		validators[i] = testutil.NewValidator(s.T(), valAddrs[i], PKs[i])
    39  		validators[i], _ = validators[i].AddTokensFromDel(amt)
    40  
    41  		validators[i] = stakingkeeper.TestingUpdateValidator(keeper, ctx, validators[i], true)
    42  	}
    43  
    44  	// first add a validators[0] to delegate too
    45  	bond1to1 := stakingtypes.NewDelegation(addrDels[0].String(), valAddrs[0].String(), math.LegacyNewDec(9))
    46  
    47  	// check the empty keeper first
    48  	_, err := keeper.GetDelegation(ctx, addrDels[0], valAddrs[0])
    49  	require.ErrorIs(err, stakingtypes.ErrNoDelegation)
    50  
    51  	// set and retrieve a record
    52  	require.NoError(keeper.SetDelegation(ctx, bond1to1))
    53  	resBond, err := keeper.GetDelegation(ctx, addrDels[0], valAddrs[0])
    54  	require.NoError(err)
    55  	require.Equal(bond1to1, resBond)
    56  
    57  	// modify a records, save, and retrieve
    58  	bond1to1.Shares = math.LegacyNewDec(99)
    59  	require.NoError(keeper.SetDelegation(ctx, bond1to1))
    60  	resBond, err = keeper.GetDelegation(ctx, addrDels[0], valAddrs[0])
    61  	require.NoError(err)
    62  	require.Equal(bond1to1, resBond)
    63  
    64  	// add some more records
    65  	bond1to2 := stakingtypes.NewDelegation(addrDels[0].String(), valAddrs[1].String(), math.LegacyNewDec(9))
    66  	bond1to3 := stakingtypes.NewDelegation(addrDels[0].String(), valAddrs[2].String(), math.LegacyNewDec(9))
    67  	bond2to1 := stakingtypes.NewDelegation(addrDels[1].String(), valAddrs[0].String(), math.LegacyNewDec(9))
    68  	bond2to2 := stakingtypes.NewDelegation(addrDels[1].String(), valAddrs[1].String(), math.LegacyNewDec(9))
    69  	bond2to3 := stakingtypes.NewDelegation(addrDels[1].String(), valAddrs[2].String(), math.LegacyNewDec(9))
    70  	require.NoError(keeper.SetDelegation(ctx, bond1to2))
    71  	require.NoError(keeper.SetDelegation(ctx, bond1to3))
    72  	require.NoError(keeper.SetDelegation(ctx, bond2to1))
    73  	require.NoError(keeper.SetDelegation(ctx, bond2to2))
    74  	require.NoError(keeper.SetDelegation(ctx, bond2to3))
    75  
    76  	// test all bond retrieve capabilities
    77  	resBonds, err := keeper.GetDelegatorDelegations(ctx, addrDels[0], 5)
    78  	require.NoError(err)
    79  	require.Equal(3, len(resBonds))
    80  	require.Equal(bond1to1, resBonds[0])
    81  	require.Equal(bond1to2, resBonds[1])
    82  	require.Equal(bond1to3, resBonds[2])
    83  	resBonds, err = keeper.GetAllDelegatorDelegations(ctx, addrDels[0])
    84  	require.NoError(err)
    85  	require.Equal(3, len(resBonds))
    86  	resBonds, err = keeper.GetDelegatorDelegations(ctx, addrDels[0], 2)
    87  	require.NoError(err)
    88  	require.Equal(2, len(resBonds))
    89  	resBonds, err = keeper.GetDelegatorDelegations(ctx, addrDels[1], 5)
    90  	require.NoError(err)
    91  	require.Equal(3, len(resBonds))
    92  	require.Equal(bond2to1, resBonds[0])
    93  	require.Equal(bond2to2, resBonds[1])
    94  	require.Equal(bond2to3, resBonds[2])
    95  	allBonds, err := keeper.GetAllDelegations(ctx)
    96  	require.NoError(err)
    97  	require.Equal(6, len(allBonds))
    98  	require.Equal(bond1to1, allBonds[0])
    99  	require.Equal(bond1to2, allBonds[1])
   100  	require.Equal(bond1to3, allBonds[2])
   101  	require.Equal(bond2to1, allBonds[3])
   102  	require.Equal(bond2to2, allBonds[4])
   103  	require.Equal(bond2to3, allBonds[5])
   104  
   105  	resVals, err := keeper.GetDelegatorValidators(ctx, addrDels[0], 3)
   106  	require.NoError(err)
   107  	require.Equal(3, len(resVals.Validators))
   108  	resVals, err = keeper.GetDelegatorValidators(ctx, addrDels[1], 4)
   109  	require.NoError(err)
   110  	require.Equal(3, len(resVals.Validators))
   111  
   112  	for i := 0; i < 3; i++ {
   113  		resVal, err := keeper.GetDelegatorValidator(ctx, addrDels[0], valAddrs[i])
   114  		require.Nil(err)
   115  		require.Equal(valAddrs[i].String(), resVal.GetOperator())
   116  
   117  		resVal, err = keeper.GetDelegatorValidator(ctx, addrDels[1], valAddrs[i])
   118  		require.Nil(err)
   119  		require.Equal(valAddrs[i].String(), resVal.GetOperator())
   120  
   121  		resDels, err := keeper.GetValidatorDelegations(ctx, valAddrs[i])
   122  		require.NoError(err)
   123  		require.Len(resDels, 2)
   124  	}
   125  
   126  	// test total bonded for single delegator
   127  	expBonded := bond1to1.Shares.Add(bond2to1.Shares).Add(bond1to3.Shares)
   128  	resDelBond, err := keeper.GetDelegatorBonded(ctx, addrDels[0])
   129  	require.NoError(err)
   130  	require.Equal(expBonded, math.LegacyNewDecFromInt(resDelBond))
   131  
   132  	// delete a record
   133  	require.NoError(keeper.RemoveDelegation(ctx, bond2to3))
   134  	_, err = keeper.GetDelegation(ctx, addrDels[1], valAddrs[2])
   135  	require.ErrorIs(err, stakingtypes.ErrNoDelegation)
   136  	resBonds, err = keeper.GetDelegatorDelegations(ctx, addrDels[1], 5)
   137  	require.NoError(err)
   138  	require.Equal(2, len(resBonds))
   139  	require.Equal(bond2to1, resBonds[0])
   140  	require.Equal(bond2to2, resBonds[1])
   141  
   142  	resBonds, err = keeper.GetAllDelegatorDelegations(ctx, addrDels[1])
   143  	require.NoError(err)
   144  	require.Equal(2, len(resBonds))
   145  
   146  	// delete all the records from delegator 2
   147  	require.NoError(keeper.RemoveDelegation(ctx, bond2to1))
   148  	require.NoError(keeper.RemoveDelegation(ctx, bond2to2))
   149  	_, err = keeper.GetDelegation(ctx, addrDels[1], valAddrs[0])
   150  	require.ErrorIs(err, stakingtypes.ErrNoDelegation)
   151  	_, err = keeper.GetDelegation(ctx, addrDels[1], valAddrs[1])
   152  	require.ErrorIs(err, stakingtypes.ErrNoDelegation)
   153  	resBonds, err = keeper.GetDelegatorDelegations(ctx, addrDels[1], 5)
   154  	require.NoError(err)
   155  	require.Equal(0, len(resBonds))
   156  }
   157  
   158  func (s *KeeperTestSuite) TestDelegationsByValIndex() {
   159  	ctx, keeper := s.ctx, s.stakingKeeper
   160  	require := s.Require()
   161  
   162  	addrDels, valAddrs := createValAddrs(3)
   163  
   164  	for _, addr := range addrDels {
   165  		s.bankKeeper.EXPECT().DelegateCoinsFromAccountToModule(gomock.Any(), addr, gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
   166  	}
   167  	s.accountKeeper.EXPECT().AddressCodec().Return(address.NewBech32Codec("cosmos")).AnyTimes()
   168  
   169  	// construct the validators
   170  	amts := []math.Int{math.NewInt(9), math.NewInt(8), math.NewInt(7)}
   171  	var validators [3]stakingtypes.Validator
   172  	for i, amt := range amts {
   173  		validators[i] = testutil.NewValidator(s.T(), valAddrs[i], PKs[i])
   174  		validators[i], _ = validators[i].AddTokensFromDel(amt)
   175  
   176  		validators[i] = stakingkeeper.TestingUpdateValidator(keeper, ctx, validators[i], true)
   177  	}
   178  
   179  	// delegate 2 tokens
   180  	//
   181  	// total delegations after delegating: del1 -> 2stake
   182  	_, err := s.msgServer.Delegate(ctx, stakingtypes.NewMsgDelegate(addrDels[0].String(), valAddrs[0].String(), sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(2))))
   183  	require.NoError(err)
   184  
   185  	dels, err := s.stakingKeeper.GetValidatorDelegations(ctx, valAddrs[0])
   186  	require.NoError(err)
   187  	require.Len(dels, 1)
   188  
   189  	// delegate 4 tokens
   190  	//
   191  	// total delegations after delegating: del1 -> 2stake, del2 -> 4stake
   192  	_, err = s.msgServer.Delegate(ctx, stakingtypes.NewMsgDelegate(addrDels[1].String(), valAddrs[0].String(), sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(4))))
   193  	require.NoError(err)
   194  
   195  	dels, err = s.stakingKeeper.GetValidatorDelegations(ctx, valAddrs[0])
   196  	require.NoError(err)
   197  	require.Len(dels, 2)
   198  
   199  	// undelegate 1 token from del1
   200  	//
   201  	// total delegations after undelegating: del1 -> 1stake, del2 -> 4stake
   202  	_, err = s.msgServer.Undelegate(ctx, stakingtypes.NewMsgUndelegate(addrDels[0].String(), valAddrs[0].String(), sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(1))))
   203  	require.NoError(err)
   204  
   205  	dels, err = s.stakingKeeper.GetValidatorDelegations(ctx, valAddrs[0])
   206  	require.NoError(err)
   207  	require.Len(dels, 2)
   208  
   209  	// undelegate 1 token from del1
   210  	//
   211  	// total delegations after undelegating: del2 -> 4stake
   212  	_, err = s.msgServer.Undelegate(ctx, stakingtypes.NewMsgUndelegate(addrDels[0].String(), valAddrs[0].String(), sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(1))))
   213  	require.NoError(err)
   214  
   215  	dels, err = s.stakingKeeper.GetValidatorDelegations(ctx, valAddrs[0])
   216  	require.NoError(err)
   217  	require.Len(dels, 1)
   218  
   219  	// undelegate 2 tokens from del2
   220  	//
   221  	// total delegations after undelegating: del2 -> 2stake
   222  	_, err = s.msgServer.Undelegate(ctx, stakingtypes.NewMsgUndelegate(addrDels[1].String(), valAddrs[0].String(), sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(2))))
   223  	require.NoError(err)
   224  
   225  	dels, err = s.stakingKeeper.GetValidatorDelegations(ctx, valAddrs[0])
   226  	require.NoError(err)
   227  	require.Len(dels, 1)
   228  
   229  	// undelegate 2 tokens from del2
   230  	//
   231  	// total delegations after undelegating: []
   232  	_, err = s.msgServer.Undelegate(ctx, stakingtypes.NewMsgUndelegate(addrDels[1].String(), valAddrs[0].String(), sdk.NewCoin(sdk.DefaultBondDenom, math.NewInt(2))))
   233  	require.NoError(err)
   234  
   235  	dels, err = s.stakingKeeper.GetValidatorDelegations(ctx, valAddrs[0])
   236  	require.NoError(err)
   237  	require.Len(dels, 0)
   238  }
   239  
   240  // tests Get/Set/Remove UnbondingDelegation
   241  func (s *KeeperTestSuite) TestUnbondingDelegation() {
   242  	ctx, keeper := s.ctx, s.stakingKeeper
   243  	require := s.Require()
   244  
   245  	delAddrs, valAddrs := createValAddrs(2)
   246  
   247  	s.accountKeeper.EXPECT().AddressCodec().Return(address.NewBech32Codec("cosmos")).AnyTimes()
   248  
   249  	ubd := stakingtypes.NewUnbondingDelegation(
   250  		delAddrs[0],
   251  		valAddrs[0],
   252  		0,
   253  		time.Unix(0, 0).UTC(),
   254  		math.NewInt(5),
   255  		0,
   256  		address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos"),
   257  	)
   258  
   259  	// set and retrieve a record
   260  	require.NoError(keeper.SetUnbondingDelegation(ctx, ubd))
   261  	resUnbond, err := keeper.GetUnbondingDelegation(ctx, delAddrs[0], valAddrs[0])
   262  	require.NoError(err)
   263  	require.Equal(ubd, resUnbond)
   264  
   265  	// modify a records, save, and retrieve
   266  	expUnbond := math.NewInt(21)
   267  	ubd.Entries[0].Balance = expUnbond
   268  	require.NoError(keeper.SetUnbondingDelegation(ctx, ubd))
   269  
   270  	resUnbonds, err := keeper.GetUnbondingDelegations(ctx, delAddrs[0], 5)
   271  	require.NoError(err)
   272  	require.Equal(1, len(resUnbonds))
   273  
   274  	resUnbonds, err = keeper.GetAllUnbondingDelegations(ctx, delAddrs[0])
   275  	require.NoError(err)
   276  	require.Equal(1, len(resUnbonds))
   277  
   278  	resUnbond, err = keeper.GetUnbondingDelegation(ctx, delAddrs[0], valAddrs[0])
   279  	require.NoError(err)
   280  	require.Equal(ubd, resUnbond)
   281  
   282  	resDelUnbond, err := keeper.GetDelegatorUnbonding(ctx, delAddrs[0])
   283  	require.NoError(err)
   284  	require.Equal(expUnbond, resDelUnbond)
   285  
   286  	// delete a record
   287  	require.NoError(keeper.RemoveUnbondingDelegation(ctx, ubd))
   288  	_, err = keeper.GetUnbondingDelegation(ctx, delAddrs[0], valAddrs[0])
   289  	require.ErrorIs(err, stakingtypes.ErrNoUnbondingDelegation)
   290  
   291  	resUnbonds, err = keeper.GetUnbondingDelegations(ctx, delAddrs[0], 5)
   292  	require.NoError(err)
   293  	require.Equal(0, len(resUnbonds))
   294  
   295  	resUnbonds, err = keeper.GetAllUnbondingDelegations(ctx, delAddrs[0])
   296  	require.NoError(err)
   297  	require.Equal(0, len(resUnbonds))
   298  }
   299  
   300  func (s *KeeperTestSuite) TestUnbondingDelegationsFromValidator() {
   301  	ctx, keeper := s.ctx, s.stakingKeeper
   302  	require := s.Require()
   303  
   304  	delAddrs, valAddrs := createValAddrs(2)
   305  
   306  	ubd := stakingtypes.NewUnbondingDelegation(
   307  		delAddrs[0],
   308  		valAddrs[0],
   309  		0,
   310  		time.Unix(0, 0).UTC(),
   311  		math.NewInt(5),
   312  		0,
   313  		address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos"),
   314  	)
   315  
   316  	// set and retrieve a record
   317  	require.NoError(keeper.SetUnbondingDelegation(ctx, ubd))
   318  	resUnbond, err := keeper.GetUnbondingDelegation(ctx, delAddrs[0], valAddrs[0])
   319  	require.NoError(err)
   320  	require.Equal(ubd, resUnbond)
   321  
   322  	// modify a records, save, and retrieve
   323  	expUnbond := math.NewInt(21)
   324  	ubd.Entries[0].Balance = expUnbond
   325  	require.NoError(keeper.SetUnbondingDelegation(ctx, ubd))
   326  
   327  	resUnbonds, err := keeper.GetUnbondingDelegations(ctx, delAddrs[0], 5)
   328  	require.NoError(err)
   329  	require.Equal(1, len(resUnbonds))
   330  
   331  	resUnbonds, err = keeper.GetAllUnbondingDelegations(ctx, delAddrs[0])
   332  	require.NoError(err)
   333  	require.Equal(1, len(resUnbonds))
   334  
   335  	resUnbonds, err = keeper.GetUnbondingDelegationsFromValidator(ctx, valAddrs[0])
   336  	require.NoError(err)
   337  	require.Equal(1, len(resUnbonds))
   338  
   339  	resUnbond, err = keeper.GetUnbondingDelegation(ctx, delAddrs[0], valAddrs[0])
   340  	require.NoError(err)
   341  	require.Equal(ubd, resUnbond)
   342  
   343  	resDelUnbond, err := keeper.GetDelegatorUnbonding(ctx, delAddrs[0])
   344  	require.NoError(err)
   345  	require.Equal(expUnbond, resDelUnbond)
   346  
   347  	// delete a record
   348  	require.NoError(keeper.RemoveUnbondingDelegation(ctx, ubd))
   349  	_, err = keeper.GetUnbondingDelegation(ctx, delAddrs[0], valAddrs[0])
   350  	require.ErrorIs(err, stakingtypes.ErrNoUnbondingDelegation)
   351  
   352  	resUnbonds, err = keeper.GetUnbondingDelegations(ctx, delAddrs[0], 5)
   353  	require.NoError(err)
   354  	require.Equal(0, len(resUnbonds))
   355  
   356  	resUnbonds, err = keeper.GetAllUnbondingDelegations(ctx, delAddrs[0])
   357  	require.NoError(err)
   358  	require.Equal(0, len(resUnbonds))
   359  
   360  	resUnbonds, err = keeper.GetUnbondingDelegationsFromValidator(ctx, valAddrs[0])
   361  	require.NoError(err)
   362  	require.Equal(0, len(resUnbonds))
   363  }
   364  
   365  func (s *KeeperTestSuite) TestUnbondDelegation() {
   366  	ctx, keeper := s.ctx, s.stakingKeeper
   367  	require := s.Require()
   368  
   369  	delAddrs, valAddrs := createValAddrs(1)
   370  
   371  	startTokens := keeper.TokensFromConsensusPower(ctx, 10)
   372  	validator := testutil.NewValidator(s.T(), valAddrs[0], PKs[0])
   373  
   374  	validator, issuedShares := validator.AddTokensFromDel(startTokens)
   375  	require.Equal(startTokens, issuedShares.RoundInt())
   376  
   377  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.NotBondedPoolName, stakingtypes.BondedPoolName, gomock.Any())
   378  	_ = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true)
   379  
   380  	delegation := stakingtypes.NewDelegation(delAddrs[0].String(), valAddrs[0].String(), issuedShares)
   381  	require.NoError(keeper.SetDelegation(ctx, delegation))
   382  
   383  	bondTokens := keeper.TokensFromConsensusPower(ctx, 6)
   384  	amount, err := keeper.Unbond(ctx, delAddrs[0], valAddrs[0], math.LegacyNewDecFromInt(bondTokens))
   385  	require.NoError(err)
   386  	require.Equal(bondTokens, amount) // shares to be added to an unbonding delegation
   387  
   388  	delegation, err = keeper.GetDelegation(ctx, delAddrs[0], valAddrs[0])
   389  	require.NoError(err)
   390  	validator, err = keeper.GetValidator(ctx, valAddrs[0])
   391  	require.NoError(err)
   392  
   393  	remainingTokens := startTokens.Sub(bondTokens)
   394  
   395  	require.Equal(remainingTokens, delegation.Shares.RoundInt())
   396  	require.Equal(remainingTokens, validator.BondedTokens())
   397  }
   398  
   399  // // test undelegating self delegation from a validator pushing it below MinSelfDelegation
   400  // // shift it from the bonded to unbonding state and jailed
   401  func (s *KeeperTestSuite) TestUndelegateSelfDelegationBelowMinSelfDelegation() {
   402  	ctx, keeper := s.ctx, s.stakingKeeper
   403  	require := s.Require()
   404  
   405  	addrDels, addrVals := createValAddrs(1)
   406  	delTokens := keeper.TokensFromConsensusPower(ctx, 10)
   407  
   408  	// create a validator with a self-delegation
   409  	validator := testutil.NewValidator(s.T(), addrVals[0], PKs[0])
   410  
   411  	validator.MinSelfDelegation = delTokens
   412  	validator, issuedShares := validator.AddTokensFromDel(delTokens)
   413  	require.Equal(delTokens, issuedShares.RoundInt())
   414  
   415  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.NotBondedPoolName, stakingtypes.BondedPoolName, gomock.Any())
   416  	validator = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true)
   417  	require.NoError(keeper.SetValidatorByConsAddr(ctx, validator))
   418  	require.True(validator.IsBonded())
   419  
   420  	selfDelegation := stakingtypes.NewDelegation(sdk.AccAddress(addrVals[0].Bytes()).String(), addrVals[0].String(), issuedShares)
   421  	require.NoError(keeper.SetDelegation(ctx, selfDelegation))
   422  
   423  	// create a second delegation to this validator
   424  	require.NoError(keeper.DeleteValidatorByPowerIndex(ctx, validator))
   425  	validator, issuedShares = validator.AddTokensFromDel(delTokens)
   426  	require.True(validator.IsBonded())
   427  	require.Equal(delTokens, issuedShares.RoundInt())
   428  
   429  	validator = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true)
   430  	delegation := stakingtypes.NewDelegation(addrDels[0].String(), addrVals[0].String(), issuedShares)
   431  	require.NoError(keeper.SetDelegation(ctx, delegation))
   432  
   433  	val0AccAddr := sdk.AccAddress(addrVals[0].Bytes())
   434  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.BondedPoolName, stakingtypes.NotBondedPoolName, gomock.Any())
   435  	_, _, err := keeper.Undelegate(ctx, val0AccAddr, addrVals[0], math.LegacyNewDecFromInt(keeper.TokensFromConsensusPower(ctx, 6)))
   436  	require.NoError(err)
   437  
   438  	// end block
   439  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.BondedPoolName, stakingtypes.NotBondedPoolName, gomock.Any())
   440  	s.applyValidatorSetUpdates(ctx, keeper, 1)
   441  
   442  	validator, err = keeper.GetValidator(ctx, addrVals[0])
   443  	require.NoError(err)
   444  	require.Equal(keeper.TokensFromConsensusPower(ctx, 14), validator.Tokens)
   445  	require.Equal(stakingtypes.Unbonding, validator.Status)
   446  	require.True(validator.Jailed)
   447  }
   448  
   449  func (s *KeeperTestSuite) TestUndelegateFromUnbondingValidator() {
   450  	ctx, keeper := s.ctx, s.stakingKeeper
   451  	require := s.Require()
   452  	delTokens := keeper.TokensFromConsensusPower(ctx, 10)
   453  
   454  	addrDels, addrVals := createValAddrs(2)
   455  
   456  	// create a validator with a self-delegation
   457  	validator := testutil.NewValidator(s.T(), addrVals[0], PKs[0])
   458  	require.NoError(keeper.SetValidatorByConsAddr(ctx, validator))
   459  
   460  	validator, issuedShares := validator.AddTokensFromDel(delTokens)
   461  	require.Equal(delTokens, issuedShares.RoundInt())
   462  
   463  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.NotBondedPoolName, stakingtypes.BondedPoolName, gomock.Any())
   464  	validator = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true)
   465  	require.True(validator.IsBonded())
   466  
   467  	selfDelegation := stakingtypes.NewDelegation(addrDels[0].String(), addrVals[0].String(), issuedShares)
   468  	require.NoError(keeper.SetDelegation(ctx, selfDelegation))
   469  
   470  	// create a second delegation to this validator
   471  	require.NoError(keeper.DeleteValidatorByPowerIndex(ctx, validator))
   472  
   473  	validator, issuedShares = validator.AddTokensFromDel(delTokens)
   474  	require.Equal(delTokens, issuedShares.RoundInt())
   475  
   476  	stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true)
   477  	delegation := stakingtypes.NewDelegation(addrDels[1].String(), addrVals[0].String(), issuedShares)
   478  	require.NoError(keeper.SetDelegation(ctx, delegation))
   479  
   480  	header := ctx.BlockHeader()
   481  	blockHeight := int64(10)
   482  	header.Height = blockHeight
   483  	blockTime := time.Unix(333, 0)
   484  	header.Time = blockTime
   485  	ctx = ctx.WithBlockHeader(header)
   486  
   487  	// unbond the all self-delegation to put validator in unbonding state
   488  	val0AccAddr := sdk.AccAddress(addrVals[0])
   489  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.BondedPoolName, stakingtypes.NotBondedPoolName, gomock.Any())
   490  	_, amount, err := keeper.Undelegate(ctx, val0AccAddr, addrVals[0], math.LegacyNewDecFromInt(delTokens))
   491  	require.NoError(err)
   492  	require.Equal(amount, delTokens)
   493  
   494  	// end block
   495  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.BondedPoolName, stakingtypes.NotBondedPoolName, gomock.Any())
   496  	s.applyValidatorSetUpdates(ctx, keeper, 1)
   497  
   498  	validator, err = keeper.GetValidator(ctx, addrVals[0])
   499  	require.NoError(err)
   500  	require.Equal(blockHeight, validator.UnbondingHeight)
   501  	params, err := keeper.GetParams(ctx)
   502  	require.NoError(err)
   503  	require.True(blockTime.Add(params.UnbondingTime).Equal(validator.UnbondingTime))
   504  
   505  	blockHeight2 := int64(20)
   506  	blockTime2 := time.Unix(444, 0).UTC()
   507  	ctx = ctx.WithBlockHeight(blockHeight2)
   508  	ctx = ctx.WithBlockTime(blockTime2)
   509  
   510  	// unbond some of the other delegation's shares
   511  	undelegateAmount := math.LegacyNewDec(6)
   512  	_, undelegatedAmount, err := keeper.Undelegate(ctx, addrDels[1], addrVals[0], undelegateAmount)
   513  	require.NoError(err)
   514  	require.Equal(math.LegacyNewDecFromInt(undelegatedAmount), undelegateAmount)
   515  
   516  	// retrieve the unbonding delegation
   517  	ubd, err := keeper.GetUnbondingDelegation(ctx, addrDels[1], addrVals[0])
   518  	require.NoError(err)
   519  	require.Len(ubd.Entries, 1)
   520  	require.True(ubd.Entries[0].Balance.Equal(math.NewInt(6)))
   521  	require.Equal(blockHeight2, ubd.Entries[0].CreationHeight)
   522  	require.True(blockTime2.Add(params.UnbondingTime).Equal(ubd.Entries[0].CompletionTime))
   523  }
   524  
   525  func (s *KeeperTestSuite) TestUndelegateFromUnbondedValidator() {
   526  	ctx, keeper := s.ctx, s.stakingKeeper
   527  	require := s.Require()
   528  
   529  	delTokens := keeper.TokensFromConsensusPower(ctx, 10)
   530  	addrDels, addrVals := createValAddrs(2)
   531  
   532  	// create a validator with a self-delegation
   533  	validator := testutil.NewValidator(s.T(), addrVals[0], PKs[0])
   534  	require.NoError(keeper.SetValidatorByConsAddr(ctx, validator))
   535  
   536  	valTokens := keeper.TokensFromConsensusPower(ctx, 10)
   537  	validator, issuedShares := validator.AddTokensFromDel(valTokens)
   538  	require.Equal(valTokens, issuedShares.RoundInt())
   539  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.NotBondedPoolName, stakingtypes.BondedPoolName, gomock.Any())
   540  	validator = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true)
   541  	require.True(validator.IsBonded())
   542  
   543  	val0AccAddr := sdk.AccAddress(addrVals[0])
   544  	selfDelegation := stakingtypes.NewDelegation(val0AccAddr.String(), addrVals[0].String(), issuedShares)
   545  	require.NoError(keeper.SetDelegation(ctx, selfDelegation))
   546  
   547  	// create a second delegation to this validator
   548  	require.NoError(keeper.DeleteValidatorByPowerIndex(ctx, validator))
   549  	validator, issuedShares = validator.AddTokensFromDel(delTokens)
   550  	require.Equal(delTokens, issuedShares.RoundInt())
   551  	validator = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true)
   552  	require.True(validator.IsBonded())
   553  	delegation := stakingtypes.NewDelegation(addrDels[1].String(), addrVals[0].String(), issuedShares)
   554  	require.NoError(keeper.SetDelegation(ctx, delegation))
   555  
   556  	ctx = ctx.WithBlockHeight(10)
   557  	ctx = ctx.WithBlockTime(time.Unix(333, 0))
   558  
   559  	// unbond the all self-delegation to put validator in unbonding state
   560  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.BondedPoolName, stakingtypes.NotBondedPoolName, gomock.Any())
   561  	_, amount, err := keeper.Undelegate(ctx, val0AccAddr, addrVals[0], math.LegacyNewDecFromInt(valTokens))
   562  	require.NoError(err)
   563  	require.Equal(amount, valTokens)
   564  
   565  	// end block
   566  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.BondedPoolName, stakingtypes.NotBondedPoolName, gomock.Any())
   567  	s.applyValidatorSetUpdates(ctx, keeper, 1)
   568  
   569  	validator, err = keeper.GetValidator(ctx, addrVals[0])
   570  	require.NoError(err)
   571  	require.Equal(ctx.BlockHeight(), validator.UnbondingHeight)
   572  	params, err := keeper.GetParams(ctx)
   573  	require.NoError(err)
   574  	require.True(ctx.BlockHeader().Time.Add(params.UnbondingTime).Equal(validator.UnbondingTime))
   575  
   576  	// unbond the validator
   577  	ctx = ctx.WithBlockTime(validator.UnbondingTime)
   578  	err = keeper.UnbondAllMatureValidators(ctx)
   579  	require.NoError(err)
   580  
   581  	// Make sure validator is still in state because there is still an outstanding delegation
   582  	validator, err = keeper.GetValidator(ctx, addrVals[0])
   583  	require.NoError(err)
   584  	require.Equal(validator.Status, stakingtypes.Unbonded)
   585  
   586  	// unbond some of the other delegation's shares
   587  	unbondTokens := keeper.TokensFromConsensusPower(ctx, 6)
   588  	_, amount2, err := keeper.Undelegate(ctx, addrDels[1], addrVals[0], math.LegacyNewDecFromInt(unbondTokens))
   589  	require.NoError(err)
   590  	require.Equal(amount2, unbondTokens)
   591  
   592  	// unbond rest of the other delegation's shares
   593  	remainingTokens := delTokens.Sub(unbondTokens)
   594  	_, amount3, err := keeper.Undelegate(ctx, addrDels[1], addrVals[0], math.LegacyNewDecFromInt(remainingTokens))
   595  	require.NoError(err)
   596  	require.Equal(amount3, remainingTokens)
   597  
   598  	//  now validator should be deleted from state
   599  	validator, err = keeper.GetValidator(ctx, addrVals[0])
   600  	require.ErrorIs(err, stakingtypes.ErrNoValidatorFound)
   601  }
   602  
   603  func (s *KeeperTestSuite) TestUnbondingAllDelegationFromValidator() {
   604  	ctx, keeper := s.ctx, s.stakingKeeper
   605  	require := s.Require()
   606  
   607  	delTokens := keeper.TokensFromConsensusPower(ctx, 10)
   608  	addrDels, addrVals := createValAddrs(2)
   609  
   610  	// create a validator with a self-delegation
   611  	validator := testutil.NewValidator(s.T(), addrVals[0], PKs[0])
   612  	require.NoError(keeper.SetValidatorByConsAddr(ctx, validator))
   613  
   614  	valTokens := keeper.TokensFromConsensusPower(ctx, 10)
   615  	validator, issuedShares := validator.AddTokensFromDel(valTokens)
   616  	require.Equal(valTokens, issuedShares.RoundInt())
   617  
   618  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.NotBondedPoolName, stakingtypes.BondedPoolName, gomock.Any())
   619  	validator = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true)
   620  	require.True(validator.IsBonded())
   621  	val0AccAddr := sdk.AccAddress(addrVals[0].Bytes())
   622  
   623  	selfDelegation := stakingtypes.NewDelegation(val0AccAddr.String(), addrVals[0].String(), issuedShares)
   624  	require.NoError(keeper.SetDelegation(ctx, selfDelegation))
   625  
   626  	// create a second delegation to this validator
   627  	require.NoError(keeper.DeleteValidatorByPowerIndex(ctx, validator))
   628  	validator, issuedShares = validator.AddTokensFromDel(delTokens)
   629  	require.Equal(delTokens, issuedShares.RoundInt())
   630  
   631  	validator = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true)
   632  	require.True(validator.IsBonded())
   633  
   634  	delegation := stakingtypes.NewDelegation(addrDels[1].String(), addrVals[0].String(), issuedShares)
   635  	require.NoError(keeper.SetDelegation(ctx, delegation))
   636  
   637  	ctx = ctx.WithBlockHeight(10)
   638  	ctx = ctx.WithBlockTime(time.Unix(333, 0))
   639  
   640  	// unbond the all self-delegation to put validator in unbonding state
   641  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.BondedPoolName, stakingtypes.NotBondedPoolName, gomock.Any())
   642  	_, amount, err := keeper.Undelegate(ctx, val0AccAddr, addrVals[0], math.LegacyNewDecFromInt(valTokens))
   643  	require.NoError(err)
   644  	require.Equal(amount, valTokens)
   645  
   646  	// end block
   647  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.BondedPoolName, stakingtypes.NotBondedPoolName, gomock.Any())
   648  	s.applyValidatorSetUpdates(ctx, keeper, 1)
   649  
   650  	// unbond all the remaining delegation
   651  	_, amount2, err := keeper.Undelegate(ctx, addrDels[1], addrVals[0], math.LegacyNewDecFromInt(delTokens))
   652  	require.NoError(err)
   653  	require.Equal(amount2, delTokens)
   654  
   655  	// validator should still be in state and still be in unbonding state
   656  	validator, err = keeper.GetValidator(ctx, addrVals[0])
   657  	require.NoError(err)
   658  	require.Equal(validator.Status, stakingtypes.Unbonding)
   659  
   660  	// unbond the validator
   661  	ctx = ctx.WithBlockTime(validator.UnbondingTime)
   662  	err = keeper.UnbondAllMatureValidators(ctx)
   663  	require.NoError(err)
   664  
   665  	// validator should now be deleted from state
   666  	_, err = keeper.GetValidator(ctx, addrVals[0])
   667  	require.ErrorIs(err, stakingtypes.ErrNoValidatorFound)
   668  }
   669  
   670  // Make sure that that the retrieving the delegations doesn't affect the state
   671  func (s *KeeperTestSuite) TestGetRedelegationsFromSrcValidator() {
   672  	ctx, keeper := s.ctx, s.stakingKeeper
   673  	require := s.Require()
   674  
   675  	addrDels, addrVals := createValAddrs(2)
   676  
   677  	rd := stakingtypes.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 0,
   678  		time.Unix(0, 0), math.NewInt(5),
   679  		math.LegacyNewDec(5), 0, address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos"))
   680  
   681  	// set and retrieve a record
   682  	err := keeper.SetRedelegation(ctx, rd)
   683  	require.NoError(err)
   684  	resBond, err := keeper.GetRedelegation(ctx, addrDels[0], addrVals[0], addrVals[1])
   685  	require.NoError(err)
   686  
   687  	// get the redelegations one time
   688  	redelegations, err := keeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0])
   689  	require.NoError(err)
   690  	require.Equal(1, len(redelegations))
   691  	require.Equal(redelegations[0], resBond)
   692  
   693  	// get the redelegations a second time, should be exactly the same
   694  	redelegations, err = keeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0])
   695  	require.NoError(err)
   696  	require.Equal(1, len(redelegations))
   697  	require.Equal(redelegations[0], resBond)
   698  }
   699  
   700  // tests Get/Set/Remove/Has UnbondingDelegation
   701  func (s *KeeperTestSuite) TestRedelegation() {
   702  	ctx, keeper := s.ctx, s.stakingKeeper
   703  	require := s.Require()
   704  
   705  	addrDels, addrVals := createValAddrs(2)
   706  
   707  	rd := stakingtypes.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 0,
   708  		time.Unix(0, 0).UTC(), math.NewInt(5),
   709  		math.LegacyNewDec(5), 0, address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos"))
   710  
   711  	// test shouldn't have and redelegations
   712  	has, err := keeper.HasReceivingRedelegation(ctx, addrDels[0], addrVals[1])
   713  	require.NoError(err)
   714  	require.False(has)
   715  
   716  	// set and retrieve a record
   717  	err = keeper.SetRedelegation(ctx, rd)
   718  	require.NoError(err)
   719  	resRed, err := keeper.GetRedelegation(ctx, addrDels[0], addrVals[0], addrVals[1])
   720  	require.NoError(err)
   721  
   722  	redelegations, err := keeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0])
   723  	require.NoError(err)
   724  	require.Equal(1, len(redelegations))
   725  	require.Equal(redelegations[0], resRed)
   726  
   727  	redelegations, err = keeper.GetRedelegations(ctx, addrDels[0], 5)
   728  	require.NoError(err)
   729  	require.Equal(1, len(redelegations))
   730  	require.Equal(redelegations[0], resRed)
   731  
   732  	redelegations, err = keeper.GetAllRedelegations(ctx, addrDels[0], nil, nil)
   733  	require.NoError(err)
   734  	require.Equal(1, len(redelegations))
   735  	require.Equal(redelegations[0], resRed)
   736  
   737  	// check if has the redelegation
   738  	has, err = keeper.HasReceivingRedelegation(ctx, addrDels[0], addrVals[1])
   739  	require.NoError(err)
   740  	require.True(has)
   741  
   742  	// modify a records, save, and retrieve
   743  	rd.Entries[0].SharesDst = math.LegacyNewDec(21)
   744  	err = keeper.SetRedelegation(ctx, rd)
   745  	require.NoError(err)
   746  
   747  	resRed, err = keeper.GetRedelegation(ctx, addrDels[0], addrVals[0], addrVals[1])
   748  	require.NoError(err)
   749  	require.Equal(rd, resRed)
   750  
   751  	redelegations, err = keeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0])
   752  	require.NoError(err)
   753  	require.Equal(1, len(redelegations))
   754  	require.Equal(redelegations[0], resRed)
   755  
   756  	redelegations, err = keeper.GetRedelegations(ctx, addrDels[0], 5)
   757  	require.NoError(err)
   758  	require.Equal(1, len(redelegations))
   759  	require.Equal(redelegations[0], resRed)
   760  
   761  	// delete a record
   762  	err = keeper.RemoveRedelegation(ctx, rd)
   763  	require.NoError(err)
   764  	_, err = keeper.GetRedelegation(ctx, addrDels[0], addrVals[0], addrVals[1])
   765  	require.ErrorIs(err, stakingtypes.ErrNoRedelegation)
   766  
   767  	redelegations, err = keeper.GetRedelegations(ctx, addrDels[0], 5)
   768  	require.NoError(err)
   769  	require.Equal(0, len(redelegations))
   770  
   771  	redelegations, err = keeper.GetAllRedelegations(ctx, addrDels[0], nil, nil)
   772  	require.NoError(err)
   773  	require.Equal(0, len(redelegations))
   774  }
   775  
   776  func (s *KeeperTestSuite) TestRedelegateToSameValidator() {
   777  	ctx, keeper := s.ctx, s.stakingKeeper
   778  	require := s.Require()
   779  
   780  	_, addrVals := createValAddrs(1)
   781  	valTokens := keeper.TokensFromConsensusPower(ctx, 10)
   782  
   783  	// create a validator with a self-delegation
   784  	validator := testutil.NewValidator(s.T(), addrVals[0], PKs[0])
   785  	validator, issuedShares := validator.AddTokensFromDel(valTokens)
   786  	require.Equal(valTokens, issuedShares.RoundInt())
   787  
   788  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.NotBondedPoolName, stakingtypes.BondedPoolName, gomock.Any())
   789  	validator = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true)
   790  	require.True(validator.IsBonded())
   791  
   792  	val0AccAddr := sdk.AccAddress(addrVals[0].Bytes())
   793  
   794  	selfDelegation := stakingtypes.NewDelegation(val0AccAddr.String(), addrVals[0].String(), issuedShares)
   795  	require.NoError(keeper.SetDelegation(ctx, selfDelegation))
   796  
   797  	_, err := keeper.BeginRedelegation(ctx, val0AccAddr, addrVals[0], addrVals[0], math.LegacyNewDec(5))
   798  	require.Error(err)
   799  }
   800  
   801  func (s *KeeperTestSuite) TestRedelegationMaxEntries() {
   802  	ctx, keeper := s.ctx, s.stakingKeeper
   803  	require := s.Require()
   804  
   805  	_, addrVals := createValAddrs(2)
   806  
   807  	// create a validator with a self-delegation
   808  	validator := testutil.NewValidator(s.T(), addrVals[0], PKs[0])
   809  	valTokens := keeper.TokensFromConsensusPower(ctx, 10)
   810  	validator, issuedShares := validator.AddTokensFromDel(valTokens)
   811  	require.Equal(valTokens, issuedShares.RoundInt())
   812  
   813  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.NotBondedPoolName, stakingtypes.BondedPoolName, gomock.Any())
   814  	_ = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true)
   815  	val0AccAddr := sdk.AccAddress(addrVals[0].Bytes())
   816  	selfDelegation := stakingtypes.NewDelegation(val0AccAddr.String(), addrVals[0].String(), issuedShares)
   817  	require.NoError(keeper.SetDelegation(ctx, selfDelegation))
   818  
   819  	// create a second validator
   820  	validator2 := testutil.NewValidator(s.T(), addrVals[1], PKs[1])
   821  	validator2, issuedShares = validator2.AddTokensFromDel(valTokens)
   822  	require.Equal(valTokens, issuedShares.RoundInt())
   823  
   824  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.NotBondedPoolName, stakingtypes.BondedPoolName, gomock.Any())
   825  	validator2 = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator2, true)
   826  	require.Equal(stakingtypes.Bonded, validator2.Status)
   827  
   828  	maxEntries, err := keeper.MaxEntries(ctx)
   829  	require.NoError(err)
   830  
   831  	// redelegations should pass
   832  	var completionTime time.Time
   833  	for i := uint32(0); i < maxEntries; i++ {
   834  		var err error
   835  		completionTime, err = keeper.BeginRedelegation(ctx, val0AccAddr, addrVals[0], addrVals[1], math.LegacyNewDec(1))
   836  		require.NoError(err)
   837  	}
   838  
   839  	// an additional redelegation should fail due to max entries
   840  	_, err = keeper.BeginRedelegation(ctx, val0AccAddr, addrVals[0], addrVals[1], math.LegacyNewDec(1))
   841  	require.Error(err)
   842  
   843  	// mature redelegations
   844  	ctx = ctx.WithBlockTime(completionTime)
   845  	_, err = keeper.CompleteRedelegation(ctx, val0AccAddr, addrVals[0], addrVals[1])
   846  	require.NoError(err)
   847  
   848  	// redelegation should work again
   849  	_, err = keeper.BeginRedelegation(ctx, val0AccAddr, addrVals[0], addrVals[1], math.LegacyNewDec(1))
   850  	require.NoError(err)
   851  }
   852  
   853  func (s *KeeperTestSuite) TestRedelegateSelfDelegation() {
   854  	ctx, keeper := s.ctx, s.stakingKeeper
   855  	require := s.Require()
   856  
   857  	addrDels, addrVals := createValAddrs(2)
   858  
   859  	// create a validator with a self-delegation
   860  	validator := testutil.NewValidator(s.T(), addrVals[0], PKs[0])
   861  	require.NoError(keeper.SetValidatorByConsAddr(ctx, validator))
   862  
   863  	valTokens := keeper.TokensFromConsensusPower(ctx, 10)
   864  	validator, issuedShares := validator.AddTokensFromDel(valTokens)
   865  	require.Equal(valTokens, issuedShares.RoundInt())
   866  
   867  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.NotBondedPoolName, stakingtypes.BondedPoolName, gomock.Any())
   868  	validator = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true)
   869  
   870  	val0AccAddr := sdk.AccAddress(addrVals[0])
   871  	selfDelegation := stakingtypes.NewDelegation(val0AccAddr.String(), addrVals[0].String(), issuedShares)
   872  	require.NoError(keeper.SetDelegation(ctx, selfDelegation))
   873  
   874  	// create a second validator
   875  	validator2 := testutil.NewValidator(s.T(), addrVals[1], PKs[1])
   876  	validator2, issuedShares = validator2.AddTokensFromDel(valTokens)
   877  	require.Equal(valTokens, issuedShares.RoundInt())
   878  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.NotBondedPoolName, stakingtypes.BondedPoolName, gomock.Any())
   879  	validator2 = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator2, true)
   880  	require.Equal(stakingtypes.Bonded, validator2.Status)
   881  
   882  	// create a second delegation to validator 1
   883  	delTokens := keeper.TokensFromConsensusPower(ctx, 10)
   884  	validator, issuedShares = validator.AddTokensFromDel(delTokens)
   885  	require.Equal(delTokens, issuedShares.RoundInt())
   886  	stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true)
   887  
   888  	delegation := stakingtypes.NewDelegation(addrDels[0].String(), addrVals[0].String(), issuedShares)
   889  	require.NoError(keeper.SetDelegation(ctx, delegation))
   890  
   891  	_, err := keeper.BeginRedelegation(ctx, val0AccAddr, addrVals[0], addrVals[1], math.LegacyNewDecFromInt(delTokens))
   892  	require.NoError(err)
   893  
   894  	// end block
   895  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.BondedPoolName, stakingtypes.NotBondedPoolName, gomock.Any())
   896  	s.applyValidatorSetUpdates(ctx, keeper, 2)
   897  
   898  	validator, err = keeper.GetValidator(ctx, addrVals[0])
   899  	require.NoError(err)
   900  	require.Equal(valTokens, validator.Tokens)
   901  	require.Equal(stakingtypes.Unbonding, validator.Status)
   902  }
   903  
   904  func (s *KeeperTestSuite) TestRedelegateFromUnbondingValidator() {
   905  	ctx, keeper := s.ctx, s.stakingKeeper
   906  	require := s.Require()
   907  
   908  	addrDels, addrVals := createValAddrs(2)
   909  
   910  	// create a validator with a self-delegation
   911  	validator := testutil.NewValidator(s.T(), addrVals[0], PKs[0])
   912  	require.NoError(keeper.SetValidatorByConsAddr(ctx, validator))
   913  
   914  	valTokens := keeper.TokensFromConsensusPower(ctx, 10)
   915  	validator, issuedShares := validator.AddTokensFromDel(valTokens)
   916  	require.Equal(valTokens, issuedShares.RoundInt())
   917  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.NotBondedPoolName, stakingtypes.BondedPoolName, gomock.Any())
   918  	validator = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true)
   919  	val0AccAddr := sdk.AccAddress(addrVals[0].Bytes())
   920  	selfDelegation := stakingtypes.NewDelegation(val0AccAddr.String(), addrVals[0].String(), issuedShares)
   921  	require.NoError(keeper.SetDelegation(ctx, selfDelegation))
   922  
   923  	// create a second delegation to this validator
   924  	require.NoError(keeper.DeleteValidatorByPowerIndex(ctx, validator))
   925  	delTokens := keeper.TokensFromConsensusPower(ctx, 10)
   926  	validator, issuedShares = validator.AddTokensFromDel(delTokens)
   927  	require.Equal(delTokens, issuedShares.RoundInt())
   928  	stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true)
   929  	delegation := stakingtypes.NewDelegation(addrDels[1].String(), addrVals[0].String(), issuedShares)
   930  	require.NoError(keeper.SetDelegation(ctx, delegation))
   931  
   932  	// create a second validator
   933  	validator2 := testutil.NewValidator(s.T(), addrVals[1], PKs[1])
   934  	validator2, issuedShares = validator2.AddTokensFromDel(valTokens)
   935  	require.Equal(valTokens, issuedShares.RoundInt())
   936  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.NotBondedPoolName, stakingtypes.BondedPoolName, gomock.Any())
   937  	_ = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator2, true)
   938  
   939  	header := ctx.BlockHeader()
   940  	blockHeight := int64(10)
   941  	header.Height = blockHeight
   942  	blockTime := time.Unix(333, 0)
   943  	header.Time = blockTime
   944  	ctx = ctx.WithBlockHeader(header)
   945  
   946  	// unbond the all self-delegation to put validator in unbonding state
   947  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.BondedPoolName, stakingtypes.NotBondedPoolName, gomock.Any())
   948  	_, amount, err := keeper.Undelegate(ctx, val0AccAddr, addrVals[0], math.LegacyNewDecFromInt(delTokens))
   949  	require.NoError(err)
   950  	require.Equal(amount, delTokens)
   951  
   952  	// end block
   953  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.BondedPoolName, stakingtypes.NotBondedPoolName, gomock.Any())
   954  	s.applyValidatorSetUpdates(ctx, keeper, 1)
   955  
   956  	validator, err = keeper.GetValidator(ctx, addrVals[0])
   957  	require.NoError(err)
   958  	require.Equal(blockHeight, validator.UnbondingHeight)
   959  	params, err := keeper.GetParams(ctx)
   960  	require.NoError(err)
   961  	require.True(blockTime.Add(params.UnbondingTime).Equal(validator.UnbondingTime))
   962  
   963  	// change the context
   964  	header = ctx.BlockHeader()
   965  	blockHeight2 := int64(20)
   966  	header.Height = blockHeight2
   967  	blockTime2 := time.Unix(444, 0)
   968  	header.Time = blockTime2
   969  	ctx = ctx.WithBlockHeader(header)
   970  
   971  	// unbond some of the other delegation's shares
   972  	redelegateTokens := keeper.TokensFromConsensusPower(ctx, 6)
   973  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.NotBondedPoolName, stakingtypes.BondedPoolName, gomock.Any())
   974  	_, err = keeper.BeginRedelegation(ctx, addrDels[1], addrVals[0], addrVals[1], math.LegacyNewDecFromInt(redelegateTokens))
   975  	require.NoError(err)
   976  
   977  	// retrieve the unbonding delegation
   978  	ubd, err := keeper.GetRedelegation(ctx, addrDels[1], addrVals[0], addrVals[1])
   979  	require.NoError(err)
   980  	require.Len(ubd.Entries, 1)
   981  	require.Equal(blockHeight, ubd.Entries[0].CreationHeight)
   982  	require.True(blockTime.Add(params.UnbondingTime).Equal(ubd.Entries[0].CompletionTime))
   983  }
   984  
   985  func (s *KeeperTestSuite) TestRedelegateFromUnbondedValidator() {
   986  	ctx, keeper := s.ctx, s.stakingKeeper
   987  	require := s.Require()
   988  
   989  	addrDels, addrVals := createValAddrs(2)
   990  
   991  	// create a validator with a self-delegation
   992  	validator := testutil.NewValidator(s.T(), addrVals[0], PKs[0])
   993  	require.NoError(keeper.SetValidatorByConsAddr(ctx, validator))
   994  
   995  	valTokens := keeper.TokensFromConsensusPower(ctx, 10)
   996  	validator, issuedShares := validator.AddTokensFromDel(valTokens)
   997  	require.Equal(valTokens, issuedShares.RoundInt())
   998  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.NotBondedPoolName, stakingtypes.BondedPoolName, gomock.Any())
   999  	validator = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true)
  1000  	val0AccAddr := sdk.AccAddress(addrVals[0].Bytes())
  1001  	selfDelegation := stakingtypes.NewDelegation(val0AccAddr.String(), addrVals[0].String(), issuedShares)
  1002  	require.NoError(keeper.SetDelegation(ctx, selfDelegation))
  1003  
  1004  	// create a second delegation to this validator
  1005  	require.NoError(keeper.DeleteValidatorByPowerIndex(ctx, validator))
  1006  	delTokens := keeper.TokensFromConsensusPower(ctx, 10)
  1007  	validator, issuedShares = validator.AddTokensFromDel(delTokens)
  1008  	require.Equal(delTokens, issuedShares.RoundInt())
  1009  	stakingkeeper.TestingUpdateValidator(keeper, ctx, validator, true)
  1010  	delegation := stakingtypes.NewDelegation(addrDels[1].String(), addrVals[0].String(), issuedShares)
  1011  	require.NoError(keeper.SetDelegation(ctx, delegation))
  1012  
  1013  	// create a second validator
  1014  	validator2 := testutil.NewValidator(s.T(), addrVals[1], PKs[1])
  1015  	validator2, issuedShares = validator2.AddTokensFromDel(valTokens)
  1016  	require.Equal(valTokens, issuedShares.RoundInt())
  1017  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.NotBondedPoolName, stakingtypes.BondedPoolName, gomock.Any())
  1018  	validator2 = stakingkeeper.TestingUpdateValidator(keeper, ctx, validator2, true)
  1019  	require.Equal(stakingtypes.Bonded, validator2.Status)
  1020  
  1021  	ctx = ctx.WithBlockHeight(10)
  1022  	ctx = ctx.WithBlockTime(time.Unix(333, 0))
  1023  
  1024  	// unbond the all self-delegation to put validator in unbonding state
  1025  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.BondedPoolName, stakingtypes.NotBondedPoolName, gomock.Any())
  1026  	_, amount, err := keeper.Undelegate(ctx, val0AccAddr, addrVals[0], math.LegacyNewDecFromInt(delTokens))
  1027  	require.NoError(err)
  1028  	require.Equal(amount, delTokens)
  1029  
  1030  	// end block
  1031  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.BondedPoolName, stakingtypes.NotBondedPoolName, gomock.Any())
  1032  	s.applyValidatorSetUpdates(ctx, keeper, 1)
  1033  
  1034  	validator, err = keeper.GetValidator(ctx, addrVals[0])
  1035  	require.NoError(err)
  1036  	require.Equal(ctx.BlockHeight(), validator.UnbondingHeight)
  1037  	params, err := keeper.GetParams(ctx)
  1038  	require.NoError(err)
  1039  	require.True(ctx.BlockHeader().Time.Add(params.UnbondingTime).Equal(validator.UnbondingTime))
  1040  
  1041  	// unbond the validator
  1042  	_, err = keeper.UnbondingToUnbonded(ctx, validator)
  1043  	require.NoError(err)
  1044  
  1045  	// redelegate some of the delegation's shares
  1046  	redelegationTokens := keeper.TokensFromConsensusPower(ctx, 6)
  1047  	s.bankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), stakingtypes.NotBondedPoolName, stakingtypes.BondedPoolName, gomock.Any())
  1048  	_, err = keeper.BeginRedelegation(ctx, addrDels[1], addrVals[0], addrVals[1], math.LegacyNewDecFromInt(redelegationTokens))
  1049  	require.NoError(err)
  1050  
  1051  	// no red should have been found
  1052  	red, err := keeper.GetRedelegation(ctx, addrDels[0], addrVals[0], addrVals[1])
  1053  	require.ErrorIs(err, stakingtypes.ErrNoRedelegation, "%v", red)
  1054  }
  1055  
  1056  func (s *KeeperTestSuite) TestUnbondingDelegationAddEntry() {
  1057  	require := s.Require()
  1058  
  1059  	delAddrs, valAddrs := createValAddrs(1)
  1060  
  1061  	delAddr := delAddrs[0]
  1062  	valAddr := valAddrs[0]
  1063  	creationHeight := int64(10)
  1064  	ubd := stakingtypes.NewUnbondingDelegation(
  1065  		delAddr,
  1066  		valAddr,
  1067  		creationHeight,
  1068  		time.Unix(0, 0).UTC(),
  1069  		math.NewInt(10),
  1070  		0,
  1071  		address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos"),
  1072  	)
  1073  	var initialEntries []stakingtypes.UnbondingDelegationEntry
  1074  	initialEntries = append(initialEntries, ubd.Entries...)
  1075  	require.Len(initialEntries, 1)
  1076  
  1077  	isNew := ubd.AddEntry(creationHeight, time.Unix(0, 0).UTC(), math.NewInt(5), 1)
  1078  	require.False(isNew)
  1079  	require.Len(ubd.Entries, 1) // entry was merged
  1080  	require.NotEqual(initialEntries, ubd.Entries)
  1081  	require.Equal(creationHeight, ubd.Entries[0].CreationHeight)
  1082  	require.Equal(initialEntries[0].UnbondingId, ubd.Entries[0].UnbondingId) // unbondingID remains unchanged
  1083  	require.Equal(ubd.Entries[0].Balance, math.NewInt(15))                   // 10 from previous + 5 from merged
  1084  
  1085  	newCreationHeight := int64(11)
  1086  	isNew = ubd.AddEntry(newCreationHeight, time.Unix(1, 0).UTC(), math.NewInt(5), 2)
  1087  	require.True(isNew)
  1088  	require.Len(ubd.Entries, 2) // entry was appended
  1089  	require.NotEqual(initialEntries, ubd.Entries)
  1090  	require.Equal(creationHeight, ubd.Entries[0].CreationHeight)
  1091  	require.Equal(newCreationHeight, ubd.Entries[1].CreationHeight)
  1092  	require.Equal(ubd.Entries[0].Balance, math.NewInt(15))
  1093  	require.Equal(ubd.Entries[1].Balance, math.NewInt(5))
  1094  	require.NotEqual(ubd.Entries[0].UnbondingId, ubd.Entries[1].UnbondingId) // appended entry has a new unbondingID
  1095  }
  1096  
  1097  func (s *KeeperTestSuite) TestSetUnbondingDelegationEntry() {
  1098  	ctx, keeper := s.ctx, s.stakingKeeper
  1099  	require := s.Require()
  1100  
  1101  	delAddrs, valAddrs := createValAddrs(1)
  1102  
  1103  	delAddr := delAddrs[0]
  1104  	valAddr := valAddrs[0]
  1105  	creationHeight := int64(0)
  1106  	ubd := stakingtypes.NewUnbondingDelegation(
  1107  		delAddr,
  1108  		valAddr,
  1109  		creationHeight,
  1110  		time.Unix(0, 0).UTC(),
  1111  		math.NewInt(5),
  1112  		0,
  1113  		address.NewBech32Codec("cosmosvaloper"), address.NewBech32Codec("cosmos"),
  1114  	)
  1115  
  1116  	// set and retrieve a record
  1117  	require.NoError(keeper.SetUnbondingDelegation(ctx, ubd))
  1118  	resUnbond, err := keeper.GetUnbondingDelegation(ctx, delAddr, valAddr)
  1119  	require.NoError(err)
  1120  	require.Equal(ubd, resUnbond)
  1121  
  1122  	initialEntries := ubd.Entries
  1123  	require.Len(initialEntries, 1)
  1124  	require.Equal(initialEntries[0].Balance, math.NewInt(5))
  1125  	require.Equal(initialEntries[0].UnbondingId, uint64(0)) // initial unbondingID
  1126  
  1127  	// set unbonding delegation entry for existing creationHeight
  1128  	// entries are expected to be merged
  1129  	_, err = keeper.SetUnbondingDelegationEntry(
  1130  		ctx,
  1131  		delAddr,
  1132  		valAddr,
  1133  		creationHeight,
  1134  		time.Unix(0, 0).UTC(),
  1135  		math.NewInt(5),
  1136  	)
  1137  	require.NoError(err)
  1138  	resUnbonding, err := keeper.GetUnbondingDelegation(ctx, delAddr, valAddr)
  1139  	require.NoError(err)
  1140  	require.Len(resUnbonding.Entries, 1)
  1141  	require.NotEqual(initialEntries, resUnbonding.Entries)
  1142  	require.Equal(creationHeight, resUnbonding.Entries[0].CreationHeight)
  1143  	require.Equal(initialEntries[0].UnbondingId, resUnbonding.Entries[0].UnbondingId) // initial unbondingID remains unchanged
  1144  	require.Equal(resUnbonding.Entries[0].Balance, math.NewInt(10))                   // 5 from previous entry + 5 from merged entry
  1145  
  1146  	// set unbonding delegation entry for newCreationHeight
  1147  	// new entry is expected to be appended to the existing entries
  1148  	newCreationHeight := int64(1)
  1149  	_, err = keeper.SetUnbondingDelegationEntry(
  1150  		ctx,
  1151  		delAddr,
  1152  		valAddr,
  1153  		newCreationHeight,
  1154  		time.Unix(1, 0).UTC(),
  1155  		math.NewInt(10),
  1156  	)
  1157  	require.NoError(err)
  1158  	resUnbonding, err = keeper.GetUnbondingDelegation(ctx, delAddr, valAddr)
  1159  	require.NoError(err)
  1160  	require.Len(resUnbonding.Entries, 2)
  1161  	require.NotEqual(initialEntries, resUnbonding.Entries)
  1162  	require.NotEqual(resUnbonding.Entries[0], resUnbonding.Entries[1])
  1163  	require.Equal(creationHeight, resUnbonding.Entries[0].CreationHeight)
  1164  	require.Equal(newCreationHeight, resUnbonding.Entries[1].CreationHeight)
  1165  
  1166  	// unbondingID is incremented on every call to SetUnbondingDelegationEntry
  1167  	// unbondingID == 1 was skipped because the entry was merged with the existing entry with unbondingID == 0
  1168  	// unbondingID comes from a global counter -> gaps in unbondingIDs are OK as long as every unbondingID is unique
  1169  	require.Equal(uint64(2), resUnbonding.Entries[1].UnbondingId)
  1170  }