mirror of
				https://github.com/0glabs/0g-chain.git
				synced 2025-11-04 03:07:28 +00:00 
			
		
		
		
	fix delegation reward index (#888)
This commit is contained in:
		
							parent
							
								
									eb856b5a1f
								
							
						
					
					
						commit
						c7ed944503
					
				@ -515,8 +515,8 @@ func (k Keeper) SynchronizeHardDelegatorRewards(ctx sdk.Context, delegator sdk.A
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	userRewardFactor := claim.DelegatorRewardIndexes[delegatorIndex].RewardFactor
 | 
						userRewardFactor := claim.DelegatorRewardIndexes[delegatorIndex].RewardFactor
 | 
				
			||||||
	rewardsAccumulatedFactor := delagatorFactor.Sub(userRewardFactor)
 | 
						rewardsAccumulatedFactor := delagatorFactor.Sub(userRewardFactor)
 | 
				
			||||||
	if rewardsAccumulatedFactor.IsZero() {
 | 
						if rewardsAccumulatedFactor.IsNegative() {
 | 
				
			||||||
		return
 | 
							panic(fmt.Sprintf("reward accumulation factor cannot be negative: %s", rewardsAccumulatedFactor))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	claim.DelegatorRewardIndexes[delegatorIndex].RewardFactor = delagatorFactor
 | 
						claim.DelegatorRewardIndexes[delegatorIndex].RewardFactor = delagatorFactor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -539,16 +539,12 @@ func (k Keeper) SynchronizeHardDelegatorRewards(ctx sdk.Context, delegator sdk.A
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		delegatedTokens := validator.TokensFromShares(delegation.GetShares())
 | 
							delegatedTokens := validator.TokensFromShares(delegation.GetShares())
 | 
				
			||||||
		if delegatedTokens.IsZero() || delegatedTokens.IsNegative() {
 | 
							if delegatedTokens.IsNegative() {
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		totalDelegated = totalDelegated.Add(delegatedTokens)
 | 
							totalDelegated = totalDelegated.Add(delegatedTokens)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					 | 
				
			||||||
	rewardsEarned := rewardsAccumulatedFactor.Mul(totalDelegated).RoundInt()
 | 
						rewardsEarned := rewardsAccumulatedFactor.Mul(totalDelegated).RoundInt()
 | 
				
			||||||
	if rewardsEarned.IsZero() || rewardsEarned.IsNegative() {
 | 
					 | 
				
			||||||
		return
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Add rewards to delegator's hard claim
 | 
						// Add rewards to delegator's hard claim
 | 
				
			||||||
	newRewardsCoin := sdk.NewCoin(types.HardLiquidityRewardDenom, rewardsEarned)
 | 
						newRewardsCoin := sdk.NewCoin(types.HardLiquidityRewardDenom, rewardsEarned)
 | 
				
			||||||
 | 
				
			|||||||
@ -2324,6 +2324,17 @@ func (suite *KeeperTestSuite) TestSynchronizeHardDelegatorReward() {
 | 
				
			|||||||
				expectedRewards:      cs(c("hard", 52856928000)),
 | 
									expectedRewards:      cs(c("hard", 52856928000)),
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								"delegator reward index updated when reward is zero",
 | 
				
			||||||
 | 
								args{
 | 
				
			||||||
 | 
									delegation:           c("ukava", 1),
 | 
				
			||||||
 | 
									rewardsPerSecond:     c("hard", 1),
 | 
				
			||||||
 | 
									initialTime:          time.Date(2020, 12, 15, 14, 0, 0, 0, time.UTC),
 | 
				
			||||||
 | 
									blockTimes:           []int{10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
 | 
				
			||||||
 | 
									expectedRewardFactor: d("0.000099999900000100"),
 | 
				
			||||||
 | 
									expectedRewards:      nil,
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for _, tc := range testCases {
 | 
						for _, tc := range testCases {
 | 
				
			||||||
		suite.Run(tc.name, func() {
 | 
							suite.Run(tc.name, func() {
 | 
				
			||||||
@ -2351,13 +2362,22 @@ func (suite *KeeperTestSuite) TestSynchronizeHardDelegatorReward() {
 | 
				
			|||||||
			// Set up hard state (interest factor for the relevant denom)
 | 
								// Set up hard state (interest factor for the relevant denom)
 | 
				
			||||||
			suite.hardKeeper.SetPreviousAccrualTime(suite.ctx, tc.args.delegation.Denom, tc.args.initialTime)
 | 
								suite.hardKeeper.SetPreviousAccrualTime(suite.ctx, tc.args.delegation.Denom, tc.args.initialTime)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Delegator delegates
 | 
								// Create validator account
 | 
				
			||||||
			err := suite.deliverMsgCreateValidator(suite.ctx, suite.validatorAddrs[0], tc.args.delegation)
 | 
								staking.BeginBlocker(suite.ctx, suite.stakingKeeper)
 | 
				
			||||||
 | 
								selfDelegationCoins := c("ukava", 1_000_000)
 | 
				
			||||||
 | 
								err := suite.deliverMsgCreateValidator(suite.ctx, suite.validatorAddrs[0], selfDelegationCoins)
 | 
				
			||||||
			suite.Require().NoError(err)
 | 
								suite.Require().NoError(err)
 | 
				
			||||||
			suite.deliverMsgDelegate(suite.ctx, suite.addrs[0], suite.validatorAddrs[0], tc.args.delegation)
 | 
								staking.EndBlocker(suite.ctx, suite.stakingKeeper)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Delegator delegates
 | 
				
			||||||
 | 
								err = suite.deliverMsgDelegate(suite.ctx, suite.addrs[0], suite.validatorAddrs[0], tc.args.delegation)
 | 
				
			||||||
			suite.Require().NoError(err)
 | 
								suite.Require().NoError(err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			staking.EndBlocker(suite.ctx, suite.stakingKeeper)
 | 
								// Check that validator account has been created and delegation was successful
 | 
				
			||||||
 | 
								valAcc, found := suite.stakingKeeper.GetValidator(suite.ctx, suite.validatorAddrs[0])
 | 
				
			||||||
 | 
								suite.True(found)
 | 
				
			||||||
 | 
								suite.Require().Equal(valAcc.Status, sdk.Bonded)
 | 
				
			||||||
 | 
								suite.Require().Equal(valAcc.Tokens, tc.args.delegation.Amount.Add(selfDelegationCoins.Amount))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Check that Staking hooks initialized a HardLiquidityProviderClaim
 | 
								// Check that Staking hooks initialized a HardLiquidityProviderClaim
 | 
				
			||||||
			claim, found := suite.keeper.GetHardLiquidityProviderClaim(suite.ctx, suite.addrs[0])
 | 
								claim, found := suite.keeper.GetHardLiquidityProviderClaim(suite.ctx, suite.addrs[0])
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user