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 }