mirror of
				https://github.com/0glabs/0g-chain.git
				synced 2025-11-04 01:37:28 +00:00 
			
		
		
		
	Refactor to DelegatorClaim and implement new MsgClaimDelegatorReward (#948)
* update claim attribute type to MultiRewardIndexes * update param attribute type to MultiRewardPeriods * keeper: update params to match types * keeper: update delegator core keeper methods * keeper: update InitializeHardDelegatorReward * keeper: update SynchronizeHardDelegatorRewards * remove reward factor in favor of reward indexes * update querier * fix test: delegator init test * fix test: delegator sync test * implement delegator reward accumulation * fix test: delegator general tests * add legact types, update v0_11 -> v0_14 migration * remove duplicate import form v0_15 migration * implement v0_15incentive migration * test data and migration test * add multiple reward denoms to init/sync tests * update delegator test with multiple reward coins * clean up simulation sync * types: introduce DelegatorClaim, refactor HardClaim * add core DelegateClaim store methods * refactor delegator reward init, accumulation, sync * update hooks * update params and genesis logic * update abci * update types tests * update querier types/keeper for compile * update supply rewards tests * update borrow reward tests * update delegator reward tests * update handler/genesis test for compile * add new msg type * implement delegator claim payouts * submission + handling of new msg * implement new querier types/keeper logic * add new queries to cli/rest * update migration * register new msgs/types on codec * remove delegator syncing from hard sync method
This commit is contained in:
		
							parent
							
								
									c7962e45c0
								
							
						
					
					
						commit
						3fc2a63556
					
				@ -297,8 +297,9 @@ func Incentive(incentiveGS v0_14incentive.GenesisState) v0_15incentive.GenesisSt
 | 
				
			|||||||
		usdxMintingClaims = append(usdxMintingClaims, usdxMintingClaim)
 | 
							usdxMintingClaims = append(usdxMintingClaims, usdxMintingClaim)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Migrate Hard protocol claims (including delegation rewards)
 | 
						// Migrate Hard protocol claims (includes creating new Delegator claims)
 | 
				
			||||||
	var hardClaims v0_15incentive.HardLiquidityProviderClaims
 | 
						var hardClaims v0_15incentive.HardLiquidityProviderClaims
 | 
				
			||||||
 | 
						var delegatorClaims v0_15incentive.DelegatorClaims
 | 
				
			||||||
	for _, claim := range incentiveGS.HardLiquidityProviderClaims {
 | 
						for _, claim := range incentiveGS.HardLiquidityProviderClaims {
 | 
				
			||||||
		// Migrate supply multi reward indexes
 | 
							// Migrate supply multi reward indexes
 | 
				
			||||||
		var supplyMultiRewardIndexes v0_15incentive.MultiRewardIndexes
 | 
							var supplyMultiRewardIndexes v0_15incentive.MultiRewardIndexes
 | 
				
			||||||
@ -324,7 +325,7 @@ func Incentive(incentiveGS v0_14incentive.GenesisState) v0_15incentive.GenesisSt
 | 
				
			|||||||
			borrowMultiRewardIndexes = append(borrowMultiRewardIndexes, borrowMultiRewardIndex)
 | 
								borrowMultiRewardIndexes = append(borrowMultiRewardIndexes, borrowMultiRewardIndex)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Migrate delegator reward indexes to multi reward indexes under BondDenom
 | 
							// Migrate delegator reward indexes to multi reward indexes inside DelegatorClaims
 | 
				
			||||||
		var delegatorMultiRewardIndexes v0_15incentive.MultiRewardIndexes
 | 
							var delegatorMultiRewardIndexes v0_15incentive.MultiRewardIndexes
 | 
				
			||||||
		var delegatorRewardIndexes v0_15incentive.RewardIndexes
 | 
							var delegatorRewardIndexes v0_15incentive.RewardIndexes
 | 
				
			||||||
		for _, ri := range claim.DelegatorRewardIndexes {
 | 
							for _, ri := range claim.DelegatorRewardIndexes {
 | 
				
			||||||
@ -334,8 +335,14 @@ func Incentive(incentiveGS v0_14incentive.GenesisState) v0_15incentive.GenesisSt
 | 
				
			|||||||
		delegatorMultiRewardIndex := v0_15incentive.NewMultiRewardIndex(v0_15incentive.BondDenom, delegatorRewardIndexes)
 | 
							delegatorMultiRewardIndex := v0_15incentive.NewMultiRewardIndex(v0_15incentive.BondDenom, delegatorRewardIndexes)
 | 
				
			||||||
		delegatorMultiRewardIndexes = append(delegatorMultiRewardIndexes, delegatorMultiRewardIndex)
 | 
							delegatorMultiRewardIndexes = append(delegatorMultiRewardIndexes, delegatorMultiRewardIndex)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// TODO: It's impossible to distinguish between rewards from delegation vs. liquidity providing
 | 
				
			||||||
 | 
							//		 as they're all combined inside claim.Reward, so I'm just putting them all inside
 | 
				
			||||||
 | 
							// 		 the hard claim to avoid duplicating rewards.
 | 
				
			||||||
 | 
							delegatorClaim := v0_15incentive.NewDelegatorClaim(claim.Owner, sdk.NewCoins(), delegatorMultiRewardIndexes)
 | 
				
			||||||
 | 
							delegatorClaims = append(delegatorClaims, delegatorClaim)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		hardClaim := v0_15incentive.NewHardLiquidityProviderClaim(claim.Owner, claim.Reward,
 | 
							hardClaim := v0_15incentive.NewHardLiquidityProviderClaim(claim.Owner, claim.Reward,
 | 
				
			||||||
			supplyMultiRewardIndexes, borrowMultiRewardIndexes, delegatorMultiRewardIndexes)
 | 
								supplyMultiRewardIndexes, borrowMultiRewardIndexes)
 | 
				
			||||||
		hardClaims = append(hardClaims, hardClaim)
 | 
							hardClaims = append(hardClaims, hardClaim)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -348,5 +355,6 @@ func Incentive(incentiveGS v0_14incentive.GenesisState) v0_15incentive.GenesisSt
 | 
				
			|||||||
		v0_15incentive.DefaultGenesisAccumulationTimes, // There is no previous swap rewards to accumulation starts at genesis time.
 | 
							v0_15incentive.DefaultGenesisAccumulationTimes, // There is no previous swap rewards to accumulation starts at genesis time.
 | 
				
			||||||
		usdxMintingClaims,
 | 
							usdxMintingClaims,
 | 
				
			||||||
		hardClaims,
 | 
							hardClaims,
 | 
				
			||||||
 | 
							delegatorClaims,
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -75,4 +75,6 @@ func TestIncentive(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	require.Equal(t, len(oldIncentiveGenState.USDXMintingClaims), len(newGenState.USDXMintingClaims))
 | 
						require.Equal(t, len(oldIncentiveGenState.USDXMintingClaims), len(newGenState.USDXMintingClaims))
 | 
				
			||||||
	require.Equal(t, len(oldIncentiveGenState.HardLiquidityProviderClaims), len(newGenState.HardLiquidityProviderClaims))
 | 
						require.Equal(t, len(oldIncentiveGenState.HardLiquidityProviderClaims), len(newGenState.HardLiquidityProviderClaims))
 | 
				
			||||||
 | 
						// 1 new DelegatorClaim should have been created for each existing HardLiquidityProviderClaim
 | 
				
			||||||
 | 
						require.Equal(t, len(oldIncentiveGenState.HardLiquidityProviderClaims), len(newGenState.DelegatorClaims))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -27,8 +27,8 @@ func BeginBlocker(ctx sdk.Context, k keeper.Keeper) {
 | 
				
			|||||||
			panic(err)
 | 
								panic(err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for _, rp := range params.HardDelegatorRewardPeriods {
 | 
						for _, rp := range params.DelegatorRewardPeriods {
 | 
				
			||||||
		err := k.AccumulateHardDelegatorRewards(ctx, rp)
 | 
							err := k.AccumulateDelegatorRewards(ctx, rp)
 | 
				
			||||||
		if err != nil {
 | 
							if err != nil {
 | 
				
			||||||
			panic(err)
 | 
								panic(err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
				
			|||||||
@ -84,47 +84,48 @@ var (
 | 
				
			|||||||
	CalculateTimeElapsed                     = keeper.CalculateTimeElapsed
 | 
						CalculateTimeElapsed                     = keeper.CalculateTimeElapsed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// variable aliases
 | 
						// variable aliases
 | 
				
			||||||
	ModuleCdc                                       = types.ModuleCdc
 | 
						ModuleCdc                                     = types.ModuleCdc
 | 
				
			||||||
	ErrClaimNotFound                                = types.ErrClaimNotFound
 | 
						ErrClaimNotFound                              = types.ErrClaimNotFound
 | 
				
			||||||
	ErrRewardPeriodNotFound                         = types.ErrRewardPeriodNotFound
 | 
						ErrRewardPeriodNotFound                       = types.ErrRewardPeriodNotFound
 | 
				
			||||||
	ErrInvalidAccountType                           = types.ErrInvalidAccountType
 | 
						ErrInvalidAccountType                         = types.ErrInvalidAccountType
 | 
				
			||||||
	ErrNoClaimsFound                                = types.ErrNoClaimsFound
 | 
						ErrNoClaimsFound                              = types.ErrNoClaimsFound
 | 
				
			||||||
	ErrInsufficientModAccountBalance                = types.ErrInsufficientModAccountBalance
 | 
						ErrInsufficientModAccountBalance              = types.ErrInsufficientModAccountBalance
 | 
				
			||||||
	ErrAccountNotFound                              = types.ErrAccountNotFound
 | 
						ErrAccountNotFound                            = types.ErrAccountNotFound
 | 
				
			||||||
	ErrInvalidMultiplier                            = types.ErrInvalidMultiplier
 | 
						ErrInvalidMultiplier                          = types.ErrInvalidMultiplier
 | 
				
			||||||
	ErrZeroClaim                                    = types.ErrZeroClaim
 | 
						ErrZeroClaim                                  = types.ErrZeroClaim
 | 
				
			||||||
	ErrClaimExpired                                 = types.ErrClaimExpired
 | 
						ErrClaimExpired                               = types.ErrClaimExpired
 | 
				
			||||||
	ErrInvalidClaimType                             = types.ErrInvalidClaimType
 | 
						ErrInvalidClaimType                           = types.ErrInvalidClaimType
 | 
				
			||||||
	ErrInvalidClaimOwner                            = types.ErrInvalidClaimOwner
 | 
						ErrInvalidClaimOwner                          = types.ErrInvalidClaimOwner
 | 
				
			||||||
	USDXMintingClaimKeyPrefix                       = types.USDXMintingClaimKeyPrefix
 | 
						USDXMintingClaimKeyPrefix                     = types.USDXMintingClaimKeyPrefix
 | 
				
			||||||
	USDXMintingRewardFactorKeyPrefix                = types.USDXMintingRewardFactorKeyPrefix
 | 
						USDXMintingRewardFactorKeyPrefix              = types.USDXMintingRewardFactorKeyPrefix
 | 
				
			||||||
	PreviousUSDXMintingRewardAccrualTimeKeyPrefix   = types.PreviousUSDXMintingRewardAccrualTimeKeyPrefix
 | 
						PreviousUSDXMintingRewardAccrualTimeKeyPrefix = types.PreviousUSDXMintingRewardAccrualTimeKeyPrefix
 | 
				
			||||||
	HardLiquidityClaimKeyPrefix                     = types.HardLiquidityClaimKeyPrefix
 | 
						HardLiquidityClaimKeyPrefix                   = types.HardLiquidityClaimKeyPrefix
 | 
				
			||||||
	HardSupplyRewardIndexesKeyPrefix                = types.HardSupplyRewardIndexesKeyPrefix
 | 
						HardSupplyRewardIndexesKeyPrefix              = types.HardSupplyRewardIndexesKeyPrefix
 | 
				
			||||||
	PreviousHardSupplyRewardAccrualTimeKeyPrefix    = types.PreviousHardSupplyRewardAccrualTimeKeyPrefix
 | 
						PreviousHardSupplyRewardAccrualTimeKeyPrefix  = types.PreviousHardSupplyRewardAccrualTimeKeyPrefix
 | 
				
			||||||
	HardBorrowRewardIndexesKeyPrefix                = types.HardBorrowRewardIndexesKeyPrefix
 | 
						HardBorrowRewardIndexesKeyPrefix              = types.HardBorrowRewardIndexesKeyPrefix
 | 
				
			||||||
	PreviousHardBorrowRewardAccrualTimeKeyPrefix    = types.PreviousHardBorrowRewardAccrualTimeKeyPrefix
 | 
						PreviousHardBorrowRewardAccrualTimeKeyPrefix  = types.PreviousHardBorrowRewardAccrualTimeKeyPrefix
 | 
				
			||||||
	HardDelegatorRewardIndexesKeyPrefix             = types.HardDelegatorRewardIndexesKeyPrefix
 | 
						DelegatorRewardIndexesKeyPrefix               = types.DelegatorRewardIndexesKeyPrefix
 | 
				
			||||||
	PreviousHardDelegatorRewardAccrualTimeKeyPrefix = types.PreviousHardDelegatorRewardAccrualTimeKeyPrefix
 | 
						PreviousDelegatorRewardAccrualTimeKeyPrefix   = types.PreviousDelegatorRewardAccrualTimeKeyPrefix
 | 
				
			||||||
	USDXMintingRewardDenom                          = types.USDXMintingRewardDenom
 | 
						USDXMintingRewardDenom                        = types.USDXMintingRewardDenom
 | 
				
			||||||
	HardLiquidityRewardDenom                        = types.HardLiquidityRewardDenom
 | 
						HardLiquidityRewardDenom                      = types.HardLiquidityRewardDenom
 | 
				
			||||||
	KeyUSDXMintingRewardPeriods                     = types.KeyUSDXMintingRewardPeriods
 | 
						KeyUSDXMintingRewardPeriods                   = types.KeyUSDXMintingRewardPeriods
 | 
				
			||||||
	KeyHardSupplyRewardPeriods                      = types.KeyHardSupplyRewardPeriods
 | 
						KeyHardSupplyRewardPeriods                    = types.KeyHardSupplyRewardPeriods
 | 
				
			||||||
	KeyHardBorrowRewardPeriods                      = types.KeyHardBorrowRewardPeriods
 | 
						KeyHardBorrowRewardPeriods                    = types.KeyHardBorrowRewardPeriods
 | 
				
			||||||
	KeyHardDelegatorRewardPeriods                   = types.KeyHardDelegatorRewardPeriods
 | 
						KeyDelegatorRewardPeriods                     = types.KeyDelegatorRewardPeriods
 | 
				
			||||||
	KeyClaimEnd                                     = types.KeyClaimEnd
 | 
						KeyClaimEnd                                   = types.KeyClaimEnd
 | 
				
			||||||
	KeyMultipliers                                  = types.KeyMultipliers
 | 
						KeyMultipliers                                = types.KeyMultipliers
 | 
				
			||||||
	DefaultActive                                   = types.DefaultActive
 | 
						DefaultActive                                 = types.DefaultActive
 | 
				
			||||||
	DefaultRewardPeriods                            = types.DefaultRewardPeriods
 | 
						DefaultRewardPeriods                          = types.DefaultRewardPeriods
 | 
				
			||||||
	DefaultMultiRewardPeriods                       = types.DefaultMultiRewardPeriods
 | 
						DefaultMultiRewardPeriods                     = types.DefaultMultiRewardPeriods
 | 
				
			||||||
	DefaultMultipliers                              = types.DefaultMultipliers
 | 
						DefaultMultipliers                            = types.DefaultMultipliers
 | 
				
			||||||
	DefaultUSDXClaims                               = types.DefaultUSDXClaims
 | 
						DefaultDelegatorClaims                        = types.DefaultDelegatorClaims
 | 
				
			||||||
	DefaultHardClaims                               = types.DefaultHardClaims
 | 
						DefaultUSDXClaims                             = types.DefaultUSDXClaims
 | 
				
			||||||
	DefaultGenesisAccumulationTimes                 = types.DefaultGenesisAccumulationTimes
 | 
						DefaultHardClaims                             = types.DefaultHardClaims
 | 
				
			||||||
	DefaultClaimEnd                                 = types.DefaultClaimEnd
 | 
						DefaultGenesisAccumulationTimes               = types.DefaultGenesisAccumulationTimes
 | 
				
			||||||
	GovDenom                                        = types.GovDenom
 | 
						DefaultClaimEnd                               = types.DefaultClaimEnd
 | 
				
			||||||
	PrincipalDenom                                  = types.PrincipalDenom
 | 
						GovDenom                                      = types.GovDenom
 | 
				
			||||||
	IncentiveMacc                                   = types.IncentiveMacc
 | 
						PrincipalDenom                                = types.PrincipalDenom
 | 
				
			||||||
 | 
						IncentiveMacc                                 = types.IncentiveMacc
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type (
 | 
					type (
 | 
				
			||||||
 | 
				
			|||||||
@ -51,12 +51,14 @@ func queryRewardsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
 | 
				
			|||||||
			$ %s query %s rewards --owner kava15qdefkmwswysgg4qxgqpqr35k3m49pkx2jdfnw
 | 
								$ %s query %s rewards --owner kava15qdefkmwswysgg4qxgqpqr35k3m49pkx2jdfnw
 | 
				
			||||||
			$ %s query %s rewards --type hard
 | 
								$ %s query %s rewards --type hard
 | 
				
			||||||
			$ %s query %s rewards --type usdx-minting
 | 
								$ %s query %s rewards --type usdx-minting
 | 
				
			||||||
 | 
								$ %s query %s rewards --type delegator
 | 
				
			||||||
			$ %s query %s rewards --type hard --owner kava15qdefkmwswysgg4qxgqpqr35k3m49pkx2jdfnw
 | 
								$ %s query %s rewards --type hard --owner kava15qdefkmwswysgg4qxgqpqr35k3m49pkx2jdfnw
 | 
				
			||||||
			$ %s query %s rewards --type hard --unsynced true
 | 
								$ %s query %s rewards --type hard --unsynced true
 | 
				
			||||||
			`,
 | 
								`,
 | 
				
			||||||
				version.ClientName, types.ModuleName, version.ClientName, types.ModuleName,
 | 
									version.ClientName, types.ModuleName, version.ClientName, types.ModuleName,
 | 
				
			||||||
				version.ClientName, types.ModuleName, version.ClientName, types.ModuleName,
 | 
									version.ClientName, types.ModuleName, version.ClientName, types.ModuleName,
 | 
				
			||||||
				version.ClientName, types.ModuleName, version.ClientName, types.ModuleName)),
 | 
									version.ClientName, types.ModuleName, version.ClientName, types.ModuleName,
 | 
				
			||||||
 | 
									version.ClientName, types.ModuleName)),
 | 
				
			||||||
		Args: cobra.NoArgs,
 | 
							Args: cobra.NoArgs,
 | 
				
			||||||
		RunE: func(cmd *cobra.Command, args []string) error {
 | 
							RunE: func(cmd *cobra.Command, args []string) error {
 | 
				
			||||||
			cliCtx := context.NewCLIContext().WithCodec(cdc)
 | 
								cliCtx := context.NewCLIContext().WithCodec(cdc)
 | 
				
			||||||
@ -106,9 +108,26 @@ func queryRewardsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
 | 
				
			|||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				return cliCtx.PrintOutput(claims)
 | 
									return cliCtx.PrintOutput(claims)
 | 
				
			||||||
 | 
								case "delegator":
 | 
				
			||||||
 | 
									var claims types.DelegatorClaims
 | 
				
			||||||
 | 
									if boolUnsynced {
 | 
				
			||||||
 | 
										params := types.NewQueryDelegatorRewardsUnsyncedParams(page, limit, owner)
 | 
				
			||||||
 | 
										claims, err = executeDelegatorRewardsUnsyncedQuery(queryRoute, cdc, cliCtx, params)
 | 
				
			||||||
 | 
										if err != nil {
 | 
				
			||||||
 | 
											return err
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										params := types.NewQueryDelegatorRewardsParams(page, limit, owner)
 | 
				
			||||||
 | 
										claims, err = executeDelegatorRewardsQuery(queryRoute, cdc, cliCtx, params)
 | 
				
			||||||
 | 
										if err != nil {
 | 
				
			||||||
 | 
											return err
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									return cliCtx.PrintOutput(claims)
 | 
				
			||||||
			default:
 | 
								default:
 | 
				
			||||||
				var hardClaims types.HardLiquidityProviderClaims
 | 
									var hardClaims types.HardLiquidityProviderClaims
 | 
				
			||||||
				var usdxMintingClaims types.USDXMintingClaims
 | 
									var usdxMintingClaims types.USDXMintingClaims
 | 
				
			||||||
 | 
									var delegatorClaims types.DelegatorClaims
 | 
				
			||||||
				if boolUnsynced {
 | 
									if boolUnsynced {
 | 
				
			||||||
					paramsHard := types.NewQueryHardRewardsUnsyncedParams(page, limit, owner)
 | 
										paramsHard := types.NewQueryHardRewardsUnsyncedParams(page, limit, owner)
 | 
				
			||||||
					hardClaims, err = executeHardRewardsUnsyncedQuery(queryRoute, cdc, cliCtx, paramsHard)
 | 
										hardClaims, err = executeHardRewardsUnsyncedQuery(queryRoute, cdc, cliCtx, paramsHard)
 | 
				
			||||||
@ -120,6 +139,11 @@ func queryRewardsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
 | 
				
			|||||||
					if err != nil {
 | 
										if err != nil {
 | 
				
			||||||
						return err
 | 
											return err
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
										paramsDelegator := types.NewQueryDelegatorRewardsUnsyncedParams(page, limit, owner)
 | 
				
			||||||
 | 
										delegatorClaims, err = executeDelegatorRewardsUnsyncedQuery(queryRoute, cdc, cliCtx, paramsDelegator)
 | 
				
			||||||
 | 
										if err != nil {
 | 
				
			||||||
 | 
											return err
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
				} else {
 | 
									} else {
 | 
				
			||||||
					paramsHard := types.NewQueryHardRewardsParams(page, limit, owner)
 | 
										paramsHard := types.NewQueryHardRewardsParams(page, limit, owner)
 | 
				
			||||||
					hardClaims, err = executeHardRewardsQuery(queryRoute, cdc, cliCtx, paramsHard)
 | 
										hardClaims, err = executeHardRewardsQuery(queryRoute, cdc, cliCtx, paramsHard)
 | 
				
			||||||
@ -131,6 +155,11 @@ func queryRewardsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
 | 
				
			|||||||
					if err != nil {
 | 
										if err != nil {
 | 
				
			||||||
						return err
 | 
											return err
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
										paramsDelegator := types.NewQueryDelegatorRewardsParams(page, limit, owner)
 | 
				
			||||||
 | 
										delegatorClaims, err = executeDelegatorRewardsQuery(queryRoute, cdc, cliCtx, paramsDelegator)
 | 
				
			||||||
 | 
										if err != nil {
 | 
				
			||||||
 | 
											return err
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				if len(hardClaims) > 0 {
 | 
									if len(hardClaims) > 0 {
 | 
				
			||||||
					cliCtx.PrintOutput(hardClaims)
 | 
										cliCtx.PrintOutput(hardClaims)
 | 
				
			||||||
@ -138,6 +167,9 @@ func queryRewardsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
 | 
				
			|||||||
				if len(usdxMintingClaims) > 0 {
 | 
									if len(usdxMintingClaims) > 0 {
 | 
				
			||||||
					cliCtx.PrintOutput(usdxMintingClaims)
 | 
										cliCtx.PrintOutput(usdxMintingClaims)
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
									if len(delegatorClaims) > 0 {
 | 
				
			||||||
 | 
										cliCtx.PrintOutput(delegatorClaims)
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			return nil
 | 
								return nil
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
@ -311,3 +343,49 @@ func executeUSDXMintingRewardsUnsyncedQuery(queryRoute string, cdc *codec.Codec,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	return claims, nil
 | 
						return claims, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func executeDelegatorRewardsQuery(queryRoute string, cdc *codec.Codec, cliCtx context.CLIContext,
 | 
				
			||||||
 | 
						params types.QueryDelegatorRewardsParams) (types.DelegatorClaims, error) {
 | 
				
			||||||
 | 
						bz, err := cdc.MarshalJSON(params)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return types.DelegatorClaims{}, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						route := fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryGetDelegatorRewards)
 | 
				
			||||||
 | 
						res, height, err := cliCtx.QueryWithData(route, bz)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return types.DelegatorClaims{}, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cliCtx = cliCtx.WithHeight(height)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var claims types.DelegatorClaims
 | 
				
			||||||
 | 
						if err := cdc.UnmarshalJSON(res, &claims); err != nil {
 | 
				
			||||||
 | 
							return types.DelegatorClaims{}, fmt.Errorf("failed to unmarshal claims: %w", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return claims, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func executeDelegatorRewardsUnsyncedQuery(queryRoute string, cdc *codec.Codec, cliCtx context.CLIContext,
 | 
				
			||||||
 | 
						params types.QueryDelegatorRewardsUnsyncedParams) (types.DelegatorClaims, error) {
 | 
				
			||||||
 | 
						bz, err := cdc.MarshalJSON(params)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return types.DelegatorClaims{}, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						route := fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryGetDelegatorRewardsUnsynced)
 | 
				
			||||||
 | 
						res, height, err := cliCtx.QueryWithData(route, bz)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return types.DelegatorClaims{}, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cliCtx = cliCtx.WithHeight(height)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var claims types.DelegatorClaims
 | 
				
			||||||
 | 
						if err := cdc.UnmarshalJSON(res, &claims); err != nil {
 | 
				
			||||||
 | 
							return types.DelegatorClaims{}, fmt.Errorf("failed to unmarshal claims: %w", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return claims, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -30,6 +30,8 @@ func GetTxCmd(cdc *codec.Codec) *cobra.Command {
 | 
				
			|||||||
		getCmdClaimCdpVVesting(cdc),
 | 
							getCmdClaimCdpVVesting(cdc),
 | 
				
			||||||
		getCmdClaimHard(cdc),
 | 
							getCmdClaimHard(cdc),
 | 
				
			||||||
		getCmdClaimHardVVesting(cdc),
 | 
							getCmdClaimHardVVesting(cdc),
 | 
				
			||||||
 | 
							getCmdClaimDelegator(cdc),
 | 
				
			||||||
 | 
							getCmdClaimDelegatorVVesting(cdc),
 | 
				
			||||||
	)...)
 | 
						)...)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return incentiveTxCmd
 | 
						return incentiveTxCmd
 | 
				
			||||||
@ -164,3 +166,68 @@ func getCmdClaimHard(cdc *codec.Codec) *cobra.Command {
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getCmdClaimDelegator(cdc *codec.Codec) *cobra.Command {
 | 
				
			||||||
 | 
						return &cobra.Command{
 | 
				
			||||||
 | 
							Use:   "claim-delegator [multiplier]",
 | 
				
			||||||
 | 
							Short: "claim sender's delegator rewards using a given multiplier",
 | 
				
			||||||
 | 
							Long: strings.TrimSpace(
 | 
				
			||||||
 | 
								fmt.Sprintf(`Claim sender's outstanding delegator rewards using given multiplier
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								Example:
 | 
				
			||||||
 | 
								$ %s tx %s claim-delegator large
 | 
				
			||||||
 | 
							`, version.ClientName, types.ModuleName),
 | 
				
			||||||
 | 
							),
 | 
				
			||||||
 | 
							Args: cobra.ExactArgs(1),
 | 
				
			||||||
 | 
							RunE: func(cmd *cobra.Command, args []string) error {
 | 
				
			||||||
 | 
								inBuf := bufio.NewReader(cmd.InOrStdin())
 | 
				
			||||||
 | 
								cliCtx := context.NewCLIContext().WithCodec(cdc)
 | 
				
			||||||
 | 
								txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								sender := cliCtx.GetFromAddress()
 | 
				
			||||||
 | 
								multiplier := args[0]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								msg := types.NewMsgClaimDelegatorReward(sender, multiplier)
 | 
				
			||||||
 | 
								err := msg.ValidateBasic()
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getCmdClaimDelegatorVVesting(cdc *codec.Codec) *cobra.Command {
 | 
				
			||||||
 | 
						return &cobra.Command{
 | 
				
			||||||
 | 
							Use:   "claim-delegator-vesting [multiplier] [receiver]",
 | 
				
			||||||
 | 
							Short: "claim delegator rewards on behalf of a validator vesting account using a given multiplier",
 | 
				
			||||||
 | 
							Long: strings.TrimSpace(
 | 
				
			||||||
 | 
								fmt.Sprintf(`Claim sender's outstanding delegator rewards on behalf of a validator vesting account using given multiplier
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								Example:
 | 
				
			||||||
 | 
								$ %s tx %s claim-delegator-vesting large kava15qdefkmwswysgg4qxgqpqr35k3m49pkx2jdfnw
 | 
				
			||||||
 | 
							`, version.ClientName, types.ModuleName),
 | 
				
			||||||
 | 
							),
 | 
				
			||||||
 | 
							Args: cobra.ExactArgs(2),
 | 
				
			||||||
 | 
							RunE: func(cmd *cobra.Command, args []string) error {
 | 
				
			||||||
 | 
								inBuf := bufio.NewReader(cmd.InOrStdin())
 | 
				
			||||||
 | 
								cliCtx := context.NewCLIContext().WithCodec(cdc)
 | 
				
			||||||
 | 
								txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								sender := cliCtx.GetFromAddress()
 | 
				
			||||||
 | 
								multiplier := args[0]
 | 
				
			||||||
 | 
								receiverStr := args[1]
 | 
				
			||||||
 | 
								receiver, err := sdk.AccAddressFromBech32(receiverStr)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								msg := types.NewMsgClaimDelegatorRewardVVesting(sender, receiver, multiplier)
 | 
				
			||||||
 | 
								err = msg.ValidateBasic()
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									return err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -66,10 +66,14 @@ func queryRewardsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
 | 
				
			|||||||
			case "usdx_minting":
 | 
								case "usdx_minting":
 | 
				
			||||||
				params := types.NewQueryUSDXMintingRewardsUnsyncedParams(page, limit, owner)
 | 
									params := types.NewQueryUSDXMintingRewardsUnsyncedParams(page, limit, owner)
 | 
				
			||||||
				executeUSDXMintingRewardsUnsyncedQuery(w, cliCtx, params)
 | 
									executeUSDXMintingRewardsUnsyncedQuery(w, cliCtx, params)
 | 
				
			||||||
 | 
								case "delegator":
 | 
				
			||||||
 | 
									params := types.NewQueryDelegatorRewardsUnsyncedParams(page, limit, owner)
 | 
				
			||||||
 | 
									executeDelegatorRewardsUnsyncedQuery(w, cliCtx, params)
 | 
				
			||||||
			default:
 | 
								default:
 | 
				
			||||||
				hardParams := types.NewQueryHardRewardsUnsyncedParams(page, limit, owner)
 | 
									hardParams := types.NewQueryHardRewardsUnsyncedParams(page, limit, owner)
 | 
				
			||||||
				usdxMintingParams := types.NewQueryUSDXMintingRewardsUnsyncedParams(page, limit, owner)
 | 
									usdxMintingParams := types.NewQueryUSDXMintingRewardsUnsyncedParams(page, limit, owner)
 | 
				
			||||||
				executeBothUnsyncedRewardQueries(w, cliCtx, hardParams, usdxMintingParams)
 | 
									delegatorParams := types.NewQueryDelegatorRewardsUnsyncedParams(page, limit, owner)
 | 
				
			||||||
 | 
									executeAllUnsyncedRewardQueries(w, cliCtx, hardParams, usdxMintingParams, delegatorParams)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			switch strings.ToLower(rewardType) {
 | 
								switch strings.ToLower(rewardType) {
 | 
				
			||||||
@ -79,10 +83,14 @@ func queryRewardsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
 | 
				
			|||||||
			case "usdx_minting":
 | 
								case "usdx_minting":
 | 
				
			||||||
				params := types.NewQueryUSDXMintingRewardsParams(page, limit, owner)
 | 
									params := types.NewQueryUSDXMintingRewardsParams(page, limit, owner)
 | 
				
			||||||
				executeUSDXMintingRewardsQuery(w, cliCtx, params)
 | 
									executeUSDXMintingRewardsQuery(w, cliCtx, params)
 | 
				
			||||||
 | 
								case "delegator":
 | 
				
			||||||
 | 
									params := types.NewQueryDelegatorRewardsParams(page, limit, owner)
 | 
				
			||||||
 | 
									executeDelegatorRewardsQuery(w, cliCtx, params)
 | 
				
			||||||
			default:
 | 
								default:
 | 
				
			||||||
				hardParams := types.NewQueryHardRewardsParams(page, limit, owner)
 | 
									hardParams := types.NewQueryHardRewardsParams(page, limit, owner)
 | 
				
			||||||
				usdxMintingParams := types.NewQueryUSDXMintingRewardsParams(page, limit, owner)
 | 
									usdxMintingParams := types.NewQueryUSDXMintingRewardsParams(page, limit, owner)
 | 
				
			||||||
				executeBothRewardQueries(w, cliCtx, hardParams, usdxMintingParams)
 | 
									delegatorParams := types.NewQueryDelegatorRewardsParams(page, limit, owner)
 | 
				
			||||||
 | 
									executeAllRewardQueries(w, cliCtx, hardParams, usdxMintingParams, delegatorParams)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -214,8 +222,43 @@ func executeUSDXMintingRewardsUnsyncedQuery(w http.ResponseWriter, cliCtx contex
 | 
				
			|||||||
	rest.PostProcessResponse(w, cliCtx, res)
 | 
						rest.PostProcessResponse(w, cliCtx, res)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func executeBothRewardQueries(w http.ResponseWriter, cliCtx context.CLIContext,
 | 
					func executeDelegatorRewardsQuery(w http.ResponseWriter, cliCtx context.CLIContext, params types.QueryDelegatorRewardsParams) {
 | 
				
			||||||
	hardParams types.QueryHardRewardsParams, usdxMintingParams types.QueryUSDXMintingRewardsParams) {
 | 
						bz, err := cliCtx.Codec.MarshalJSON(params)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("failed to marshal query params: %s", err))
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						res, height, err := cliCtx.QueryWithData(fmt.Sprintf("custom/incentive/%s", types.QueryGetDelegatorRewards), bz)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error())
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cliCtx = cliCtx.WithHeight(height)
 | 
				
			||||||
 | 
						rest.PostProcessResponse(w, cliCtx, res)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func executeDelegatorRewardsUnsyncedQuery(w http.ResponseWriter, cliCtx context.CLIContext, params types.QueryDelegatorRewardsUnsyncedParams) {
 | 
				
			||||||
 | 
						bz, err := cliCtx.Codec.MarshalJSON(params)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("failed to marshal query params: %s", err))
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						res, height, err := cliCtx.QueryWithData(fmt.Sprintf("custom/incentive/%s", types.QueryGetDelegatorRewardsUnsynced), bz)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error())
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cliCtx = cliCtx.WithHeight(height)
 | 
				
			||||||
 | 
						rest.PostProcessResponse(w, cliCtx, res)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func executeAllRewardQueries(w http.ResponseWriter, cliCtx context.CLIContext,
 | 
				
			||||||
 | 
						hardParams types.QueryHardRewardsParams, usdxMintingParams types.QueryUSDXMintingRewardsParams,
 | 
				
			||||||
 | 
						delegatorParams types.QueryDelegatorRewardsParams) {
 | 
				
			||||||
	hardBz, err := cliCtx.Codec.MarshalJSON(hardParams)
 | 
						hardBz, err := cliCtx.Codec.MarshalJSON(hardParams)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("failed to marshal query params: %s", err))
 | 
							rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("failed to marshal query params: %s", err))
 | 
				
			||||||
@ -244,16 +287,32 @@ func executeBothRewardQueries(w http.ResponseWriter, cliCtx context.CLIContext,
 | 
				
			|||||||
	var usdxMintingClaims types.USDXMintingClaims
 | 
						var usdxMintingClaims types.USDXMintingClaims
 | 
				
			||||||
	cliCtx.Codec.MustUnmarshalJSON(usdxMintingRes, &usdxMintingClaims)
 | 
						cliCtx.Codec.MustUnmarshalJSON(usdxMintingRes, &usdxMintingClaims)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						delegatorBz, err := cliCtx.Codec.MarshalJSON(delegatorParams)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("failed to marshal query params: %s", err))
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						delegatorRes, height, err := cliCtx.QueryWithData(fmt.Sprintf("custom/incentive/%s", types.QueryGetDelegatorRewards), delegatorBz)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error())
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var delegatorClaims types.DelegatorClaims
 | 
				
			||||||
 | 
						cliCtx.Codec.MustUnmarshalJSON(delegatorRes, &delegatorClaims)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cliCtx = cliCtx.WithHeight(height)
 | 
						cliCtx = cliCtx.WithHeight(height)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	type rewardResult struct {
 | 
						type rewardResult struct {
 | 
				
			||||||
		HardClaims        types.HardLiquidityProviderClaims `json:"hard_claims" yaml:"hard_claims"`
 | 
							HardClaims        types.HardLiquidityProviderClaims `json:"hard_claims" yaml:"hard_claims"`
 | 
				
			||||||
		UsdxMintingClaims types.USDXMintingClaims           `json:"usdx_minting_claims" yaml:"usdx_minting_claims"`
 | 
							UsdxMintingClaims types.USDXMintingClaims           `json:"usdx_minting_claims" yaml:"usdx_minting_claims"`
 | 
				
			||||||
 | 
							DelegatorClaims   types.DelegatorClaims             `json:"delegator_claims" yaml:"delegator_claims"`
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	res := rewardResult{
 | 
						res := rewardResult{
 | 
				
			||||||
		HardClaims:        hardClaims,
 | 
							HardClaims:        hardClaims,
 | 
				
			||||||
		UsdxMintingClaims: usdxMintingClaims,
 | 
							UsdxMintingClaims: usdxMintingClaims,
 | 
				
			||||||
 | 
							DelegatorClaims:   delegatorClaims,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	resBz, err := cliCtx.Codec.MarshalJSON(res)
 | 
						resBz, err := cliCtx.Codec.MarshalJSON(res)
 | 
				
			||||||
@ -265,8 +324,9 @@ func executeBothRewardQueries(w http.ResponseWriter, cliCtx context.CLIContext,
 | 
				
			|||||||
	rest.PostProcessResponse(w, cliCtx, resBz)
 | 
						rest.PostProcessResponse(w, cliCtx, resBz)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func executeBothUnsyncedRewardQueries(w http.ResponseWriter, cliCtx context.CLIContext,
 | 
					func executeAllUnsyncedRewardQueries(w http.ResponseWriter, cliCtx context.CLIContext,
 | 
				
			||||||
	hardParams types.QueryHardRewardsUnsyncedParams, usdxMintingParams types.QueryUSDXMintingRewardsUnsyncedParams) {
 | 
						hardParams types.QueryHardRewardsUnsyncedParams, usdxMintingParams types.QueryUSDXMintingRewardsUnsyncedParams,
 | 
				
			||||||
 | 
						delegatorParams types.QueryDelegatorRewardsUnsyncedParams) {
 | 
				
			||||||
	hardBz, err := cliCtx.Codec.MarshalJSON(hardParams)
 | 
						hardBz, err := cliCtx.Codec.MarshalJSON(hardParams)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("failed to marshal query params: %s", err))
 | 
							rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("failed to marshal query params: %s", err))
 | 
				
			||||||
@ -295,16 +355,32 @@ func executeBothUnsyncedRewardQueries(w http.ResponseWriter, cliCtx context.CLIC
 | 
				
			|||||||
	var usdxMintingClaims types.USDXMintingClaims
 | 
						var usdxMintingClaims types.USDXMintingClaims
 | 
				
			||||||
	cliCtx.Codec.MustUnmarshalJSON(usdxMintingRes, &usdxMintingClaims)
 | 
						cliCtx.Codec.MustUnmarshalJSON(usdxMintingRes, &usdxMintingClaims)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						delegatorBz, err := cliCtx.Codec.MarshalJSON(delegatorParams)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("failed to marshal query params: %s", err))
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						delegatorRes, height, err := cliCtx.QueryWithData(fmt.Sprintf("custom/incentive/%s", types.QueryGetDelegatorRewardsUnsynced), delegatorBz)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error())
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var delegatorClaims types.DelegatorClaims
 | 
				
			||||||
 | 
						cliCtx.Codec.MustUnmarshalJSON(delegatorRes, &delegatorClaims)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cliCtx = cliCtx.WithHeight(height)
 | 
						cliCtx = cliCtx.WithHeight(height)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	type rewardResult struct {
 | 
						type rewardResult struct {
 | 
				
			||||||
		HardClaims        types.HardLiquidityProviderClaims `json:"hard_claims" yaml:"hard_claims"`
 | 
							HardClaims        types.HardLiquidityProviderClaims `json:"hard_claims" yaml:"hard_claims"`
 | 
				
			||||||
		UsdxMintingClaims types.USDXMintingClaims           `json:"usdx_minting_claims" yaml:"usdx_minting_claims"`
 | 
							UsdxMintingClaims types.USDXMintingClaims           `json:"usdx_minting_claims" yaml:"usdx_minting_claims"`
 | 
				
			||||||
 | 
							DelegatorClaims   types.DelegatorClaims             `json:"delegator_claims" yaml:"delegator_claims"`
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	res := rewardResult{
 | 
						res := rewardResult{
 | 
				
			||||||
		HardClaims:        hardClaims,
 | 
							HardClaims:        hardClaims,
 | 
				
			||||||
		UsdxMintingClaims: usdxMintingClaims,
 | 
							UsdxMintingClaims: usdxMintingClaims,
 | 
				
			||||||
 | 
							DelegatorClaims:   delegatorClaims,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	resBz, err := cliCtx.Codec.MarshalJSON(res)
 | 
						resBz, err := cliCtx.Codec.MarshalJSON(res)
 | 
				
			||||||
 | 
				
			|||||||
@ -20,7 +20,8 @@ func registerTxRoutes(cliCtx context.CLIContext, r *mux.Router) {
 | 
				
			|||||||
	r.HandleFunc("/incentive/claim-cdp-vesting", postClaimCdpVVestingHandlerFn(cliCtx)).Methods("POST")
 | 
						r.HandleFunc("/incentive/claim-cdp-vesting", postClaimCdpVVestingHandlerFn(cliCtx)).Methods("POST")
 | 
				
			||||||
	r.HandleFunc("/incentive/claim-hard", postClaimHardHandlerFn(cliCtx)).Methods("POST")
 | 
						r.HandleFunc("/incentive/claim-hard", postClaimHardHandlerFn(cliCtx)).Methods("POST")
 | 
				
			||||||
	r.HandleFunc("/incentive/claim-hard-vesting", postClaimHardVVestingHandlerFn(cliCtx)).Methods("POST")
 | 
						r.HandleFunc("/incentive/claim-hard-vesting", postClaimHardVVestingHandlerFn(cliCtx)).Methods("POST")
 | 
				
			||||||
 | 
						r.HandleFunc("/incentive/claim-delegator", postClaimDelegatorHandlerFn(cliCtx)).Methods("POST")
 | 
				
			||||||
 | 
						r.HandleFunc("/incentive/claim-delegator-vesting", postClaimDelegatorVVestingHandlerFn(cliCtx)).Methods("POST")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func postClaimCdpHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
 | 
					func postClaimCdpHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
 | 
				
			||||||
@ -154,3 +155,69 @@ func postClaimHardVVestingHandlerFn(cliCtx context.CLIContext) http.HandlerFunc
 | 
				
			|||||||
		utils.WriteGenerateStdTxResponse(w, cliCtx, requestBody.BaseReq, []sdk.Msg{msg})
 | 
							utils.WriteGenerateStdTxResponse(w, cliCtx, requestBody.BaseReq, []sdk.Msg{msg})
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func postClaimDelegatorHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
 | 
				
			||||||
 | 
						return func(w http.ResponseWriter, r *http.Request) {
 | 
				
			||||||
 | 
							var requestBody PostClaimReq
 | 
				
			||||||
 | 
							if !rest.ReadRESTReq(w, r, cliCtx.Codec, &requestBody) {
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							requestBody.BaseReq = requestBody.BaseReq.Sanitize()
 | 
				
			||||||
 | 
							if !requestBody.BaseReq.ValidateBasic(w) {
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							fromAddr, err := sdk.AccAddressFromBech32(requestBody.BaseReq.From)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error())
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if !bytes.Equal(fromAddr, requestBody.Sender) {
 | 
				
			||||||
 | 
								rest.WriteErrorResponse(w, http.StatusUnauthorized, fmt.Sprintf("expected: %s, got: %s", fromAddr, requestBody.Sender))
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							msg := types.NewMsgClaimDelegatorReward(requestBody.Sender, requestBody.MultiplierName)
 | 
				
			||||||
 | 
							if err := msg.ValidateBasic(); err != nil {
 | 
				
			||||||
 | 
								rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error())
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							utils.WriteGenerateStdTxResponse(w, cliCtx, requestBody.BaseReq, []sdk.Msg{msg})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func postClaimDelegatorVVestingHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
 | 
				
			||||||
 | 
						return func(w http.ResponseWriter, r *http.Request) {
 | 
				
			||||||
 | 
							var requestBody PostClaimVVestingReq
 | 
				
			||||||
 | 
							if !rest.ReadRESTReq(w, r, cliCtx.Codec, &requestBody) {
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							requestBody.BaseReq = requestBody.BaseReq.Sanitize()
 | 
				
			||||||
 | 
							if !requestBody.BaseReq.ValidateBasic(w) {
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							fromAddr, err := sdk.AccAddressFromBech32(requestBody.BaseReq.From)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error())
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if !bytes.Equal(fromAddr, requestBody.Sender) {
 | 
				
			||||||
 | 
								rest.WriteErrorResponse(w, http.StatusUnauthorized, fmt.Sprintf("expected: %s, got: %s", fromAddr, requestBody.Sender))
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							msg := types.NewMsgClaimDelegatorRewardVVesting(requestBody.Sender, requestBody.Receiver, requestBody.MultiplierName)
 | 
				
			||||||
 | 
							if err := msg.ValidateBasic(); err != nil {
 | 
				
			||||||
 | 
								rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error())
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							utils.WriteGenerateStdTxResponse(w, cliCtx, requestBody.BaseReq, []sdk.Msg{msg})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -48,13 +48,13 @@ func InitGenesis(ctx sdk.Context, k keeper.Keeper, supplyKeeper types.SupplyKeep
 | 
				
			|||||||
		k.SetHardBorrowRewardIndexes(ctx, mrp.CollateralType, newRewardIndexes)
 | 
							k.SetHardBorrowRewardIndexes(ctx, mrp.CollateralType, newRewardIndexes)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, drp := range gs.Params.HardDelegatorRewardPeriods {
 | 
						for _, drp := range gs.Params.DelegatorRewardPeriods {
 | 
				
			||||||
		newRewardIndexes := types.RewardIndexes{}
 | 
							newRewardIndexes := types.RewardIndexes{}
 | 
				
			||||||
		for _, rc := range drp.RewardsPerSecond {
 | 
							for _, rc := range drp.RewardsPerSecond {
 | 
				
			||||||
			ri := types.NewRewardIndex(rc.Denom, sdk.ZeroDec())
 | 
								ri := types.NewRewardIndex(rc.Denom, sdk.ZeroDec())
 | 
				
			||||||
			newRewardIndexes = append(newRewardIndexes, ri)
 | 
								newRewardIndexes = append(newRewardIndexes, ri)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		k.SetHardDelegatorRewardIndexes(ctx, drp.CollateralType, newRewardIndexes)
 | 
							k.SetDelegatorRewardIndexes(ctx, drp.CollateralType, newRewardIndexes)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	k.SetParams(ctx, gs.Params)
 | 
						k.SetParams(ctx, gs.Params)
 | 
				
			||||||
@ -71,8 +71,8 @@ func InitGenesis(ctx sdk.Context, k keeper.Keeper, supplyKeeper types.SupplyKeep
 | 
				
			|||||||
		k.SetPreviousHardBorrowRewardAccrualTime(ctx, gat.CollateralType, gat.PreviousAccumulationTime)
 | 
							k.SetPreviousHardBorrowRewardAccrualTime(ctx, gat.CollateralType, gat.PreviousAccumulationTime)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, gat := range gs.HardDelegatorAccumulationTimes {
 | 
						for _, gat := range gs.DelegatorAccumulationTimes {
 | 
				
			||||||
		k.SetPreviousHardDelegatorRewardAccrualTime(ctx, gat.CollateralType, gat.PreviousAccumulationTime)
 | 
							k.SetPreviousDelegatorRewardAccrualTime(ctx, gat.CollateralType, gat.PreviousAccumulationTime)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	for _, gat := range gs.SwapAccumulationTimes {
 | 
						for _, gat := range gs.SwapAccumulationTimes {
 | 
				
			||||||
		k.SetSwapRewardAccrualTime(ctx, gat.CollateralType, gat.PreviousAccumulationTime)
 | 
							k.SetSwapRewardAccrualTime(ctx, gat.CollateralType, gat.PreviousAccumulationTime)
 | 
				
			||||||
@ -102,14 +102,18 @@ func InitGenesis(ctx sdk.Context, k keeper.Keeper, supplyKeeper types.SupplyKeep
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		for j, dri := range claim.DelegatorRewardIndexes {
 | 
							k.SetHardLiquidityProviderClaim(ctx, claim)
 | 
				
			||||||
			for k, ri := range dri.RewardIndexes {
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for i, claim := range gs.DelegatorClaims {
 | 
				
			||||||
 | 
							for j, mri := range claim.RewardIndexes {
 | 
				
			||||||
 | 
								for k, ri := range mri.RewardIndexes {
 | 
				
			||||||
				if ri.RewardFactor != sdk.ZeroDec() {
 | 
									if ri.RewardFactor != sdk.ZeroDec() {
 | 
				
			||||||
					gs.HardLiquidityProviderClaims[i].DelegatorRewardIndexes[j].RewardIndexes[k].RewardFactor = sdk.ZeroDec()
 | 
										gs.DelegatorClaims[i].RewardIndexes[j].RewardIndexes[k].RewardFactor = sdk.ZeroDec()
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		k.SetHardLiquidityProviderClaim(ctx, claim)
 | 
							k.SetDelegatorClaim(ctx, claim)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -119,9 +123,11 @@ func ExportGenesis(ctx sdk.Context, k keeper.Keeper) types.GenesisState {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	usdxClaims := k.GetAllUSDXMintingClaims(ctx)
 | 
						usdxClaims := k.GetAllUSDXMintingClaims(ctx)
 | 
				
			||||||
	hardClaims := k.GetAllHardLiquidityProviderClaims(ctx)
 | 
						hardClaims := k.GetAllHardLiquidityProviderClaims(ctx)
 | 
				
			||||||
 | 
						delegatorClaims := k.GetAllDelegatorClaims(ctx)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	synchronizedUsdxClaims := types.USDXMintingClaims{}
 | 
						synchronizedUsdxClaims := types.USDXMintingClaims{}
 | 
				
			||||||
	synchronizedHardClaims := types.HardLiquidityProviderClaims{}
 | 
						synchronizedHardClaims := types.HardLiquidityProviderClaims{}
 | 
				
			||||||
 | 
						synchronizedDelegatorClaims := types.DelegatorClaims{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, usdxClaim := range usdxClaims {
 | 
						for _, usdxClaim := range usdxClaims {
 | 
				
			||||||
		claim, err := k.SynchronizeUSDXMintingClaim(ctx, usdxClaim)
 | 
							claim, err := k.SynchronizeUSDXMintingClaim(ctx, usdxClaim)
 | 
				
			||||||
@ -150,12 +156,20 @@ func ExportGenesis(ctx sdk.Context, k keeper.Keeper) types.GenesisState {
 | 
				
			|||||||
				claim.SupplyRewardIndexes[i].RewardIndexes[j].RewardFactor = sdk.ZeroDec()
 | 
									claim.SupplyRewardIndexes[i].RewardIndexes[j].RewardFactor = sdk.ZeroDec()
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		for i, dri := range claim.DelegatorRewardIndexes {
 | 
							synchronizedHardClaims = append(synchronizedHardClaims, claim)
 | 
				
			||||||
			for j := range dri.RewardIndexes {
 | 
						}
 | 
				
			||||||
				claim.DelegatorRewardIndexes[i].RewardIndexes[j].RewardFactor = sdk.ZeroDec()
 | 
					
 | 
				
			||||||
 | 
						for _, delegatorClaim := range delegatorClaims {
 | 
				
			||||||
 | 
							claim, err := k.SynchronizeDelegatorClaim(ctx, delegatorClaim)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								panic(err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							for i, ri := range claim.RewardIndexes {
 | 
				
			||||||
 | 
								for j := range ri.RewardIndexes {
 | 
				
			||||||
 | 
									claim.RewardIndexes[i].RewardIndexes[j].RewardFactor = sdk.ZeroDec()
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		synchronizedHardClaims = append(synchronizedHardClaims, claim)
 | 
							synchronizedDelegatorClaims = append(synchronizedDelegatorClaims, delegatorClaim)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var usdxMintingGats GenesisAccumulationTimes
 | 
						var usdxMintingGats GenesisAccumulationTimes
 | 
				
			||||||
@ -188,14 +202,14 @@ func ExportGenesis(ctx sdk.Context, k keeper.Keeper) types.GenesisState {
 | 
				
			|||||||
		hardBorrowGats = append(hardBorrowGats, gat)
 | 
							hardBorrowGats = append(hardBorrowGats, gat)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var hardDelegatorGats GenesisAccumulationTimes
 | 
						var delegatorGats GenesisAccumulationTimes
 | 
				
			||||||
	for _, rp := range params.HardDelegatorRewardPeriods {
 | 
						for _, rp := range params.DelegatorRewardPeriods {
 | 
				
			||||||
		pat, found := k.GetPreviousHardDelegatorRewardAccrualTime(ctx, rp.CollateralType)
 | 
							pat, found := k.GetPreviousDelegatorRewardAccrualTime(ctx, rp.CollateralType)
 | 
				
			||||||
		if !found {
 | 
							if !found {
 | 
				
			||||||
			panic(fmt.Sprintf("expected previous hard delegator reward accrual time to be set in state for %s", rp.CollateralType))
 | 
								panic(fmt.Sprintf("expected previous delegator reward accrual time to be set in state for %s", rp.CollateralType))
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		gat := types.NewGenesisAccumulationTime(rp.CollateralType, pat)
 | 
							gat := types.NewGenesisAccumulationTime(rp.CollateralType, pat)
 | 
				
			||||||
		hardDelegatorGats = append(hardDelegatorGats, gat)
 | 
							delegatorGats = append(delegatorGats, gat)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var swapGats GenesisAccumulationTimes
 | 
						var swapGats GenesisAccumulationTimes
 | 
				
			||||||
@ -209,5 +223,6 @@ func ExportGenesis(ctx sdk.Context, k keeper.Keeper) types.GenesisState {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return types.NewGenesisState(params, usdxMintingGats, hardSupplyGats,
 | 
						return types.NewGenesisState(params, usdxMintingGats, hardSupplyGats,
 | 
				
			||||||
		hardBorrowGats, hardDelegatorGats, swapGats, synchronizedUsdxClaims, synchronizedHardClaims)
 | 
							hardBorrowGats, delegatorGats, swapGats, synchronizedUsdxClaims,
 | 
				
			||||||
 | 
							synchronizedHardClaims, synchronizedDelegatorClaims)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -76,6 +76,7 @@ func (suite *GenesisTestSuite) SetupTest() {
 | 
				
			|||||||
		incentive.DefaultGenesisAccumulationTimes,
 | 
							incentive.DefaultGenesisAccumulationTimes,
 | 
				
			||||||
		incentive.DefaultUSDXClaims,
 | 
							incentive.DefaultUSDXClaims,
 | 
				
			||||||
		incentive.DefaultHardClaims,
 | 
							incentive.DefaultHardClaims,
 | 
				
			||||||
 | 
							incentive.DefaultDelegatorClaims,
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
	tApp.InitializeFromGenesisStatesWithTime(
 | 
						tApp.InitializeFromGenesisStatesWithTime(
 | 
				
			||||||
		suite.genesisTime,
 | 
							suite.genesisTime,
 | 
				
			||||||
 | 
				
			|||||||
@ -21,6 +21,10 @@ func NewHandler(k keeper.Keeper) sdk.Handler {
 | 
				
			|||||||
			return handleMsgClaimHardReward(ctx, k, msg)
 | 
								return handleMsgClaimHardReward(ctx, k, msg)
 | 
				
			||||||
		case types.MsgClaimHardRewardVVesting:
 | 
							case types.MsgClaimHardRewardVVesting:
 | 
				
			||||||
			return handleMsgClaimHardRewardVVesting(ctx, k, msg)
 | 
								return handleMsgClaimHardRewardVVesting(ctx, k, msg)
 | 
				
			||||||
 | 
							case types.MsgClaimDelegatorReward:
 | 
				
			||||||
 | 
								return handleMsgClaimDelegatorReward(ctx, k, msg)
 | 
				
			||||||
 | 
							case types.MsgClaimDelegatorRewardVVesting:
 | 
				
			||||||
 | 
								return handleMsgClaimDelegatorRewardVVesting(ctx, k, msg)
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			return nil, sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "unrecognized %s message type: %T", ModuleName, msg)
 | 
								return nil, sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "unrecognized %s message type: %T", ModuleName, msg)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@ -69,3 +73,25 @@ func handleMsgClaimHardRewardVVesting(ctx sdk.Context, k keeper.Keeper, msg type
 | 
				
			|||||||
		Events: ctx.EventManager().Events(),
 | 
							Events: ctx.EventManager().Events(),
 | 
				
			||||||
	}, nil
 | 
						}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func handleMsgClaimDelegatorReward(ctx sdk.Context, k keeper.Keeper, msg types.MsgClaimDelegatorReward) (*sdk.Result, error) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err := k.ClaimDelegatorReward(ctx, msg.Sender, types.MultiplierName(msg.MultiplierName))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return &sdk.Result{
 | 
				
			||||||
 | 
							Events: ctx.EventManager().Events(),
 | 
				
			||||||
 | 
						}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func handleMsgClaimDelegatorRewardVVesting(ctx sdk.Context, k keeper.Keeper, msg types.MsgClaimDelegatorRewardVVesting) (*sdk.Result, error) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err := k.ClaimDelegatorRewardVVesting(ctx, msg.Sender, msg.Receiver, types.MultiplierName(msg.MultiplierName))
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return &sdk.Result{
 | 
				
			||||||
 | 
							Events: ctx.EventManager().Events(),
 | 
				
			||||||
 | 
						}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -59,6 +59,7 @@ func (suite *HandlerTestSuite) SetupTest() {
 | 
				
			|||||||
		incentive.DefaultGenesisAccumulationTimes,
 | 
							incentive.DefaultGenesisAccumulationTimes,
 | 
				
			||||||
		incentive.DefaultUSDXClaims,
 | 
							incentive.DefaultUSDXClaims,
 | 
				
			||||||
		incentive.DefaultHardClaims,
 | 
							incentive.DefaultHardClaims,
 | 
				
			||||||
 | 
							incentive.DefaultDelegatorClaims,
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
	tApp.InitializeFromGenesisStates(authGS, app.GenesisState{incentive.ModuleName: incentive.ModuleCdc.MustMarshalJSON(incentiveGS)}, NewCDPGenStateMulti(), NewPricefeedGenStateMulti())
 | 
						tApp.InitializeFromGenesisStates(authGS, app.GenesisState{incentive.ModuleName: incentive.ModuleCdc.MustMarshalJSON(incentiveGS)}, NewCDPGenStateMulti(), NewPricefeedGenStateMulti())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -92,7 +93,7 @@ func (suite *HandlerTestSuite) addHardLiquidityProviderClaim() {
 | 
				
			|||||||
	rewardPeriod := types.RewardIndexes{types.NewRewardIndex("bnb-s", sdk.ZeroDec())}
 | 
						rewardPeriod := types.RewardIndexes{types.NewRewardIndex("bnb-s", sdk.ZeroDec())}
 | 
				
			||||||
	multiRewardIndex := types.NewMultiRewardIndex("bnb-s", rewardPeriod)
 | 
						multiRewardIndex := types.NewMultiRewardIndex("bnb-s", rewardPeriod)
 | 
				
			||||||
	multiRewardIndexes := types.MultiRewardIndexes{multiRewardIndex}
 | 
						multiRewardIndexes := types.MultiRewardIndexes{multiRewardIndex}
 | 
				
			||||||
	c1 := incentive.NewHardLiquidityProviderClaim(suite.addrs[0], cs(c("ukava", 1000000)), multiRewardIndexes, multiRewardIndexes, multiRewardIndexes)
 | 
						c1 := incentive.NewHardLiquidityProviderClaim(suite.addrs[0], cs(c("ukava", 1000000)), multiRewardIndexes, multiRewardIndexes)
 | 
				
			||||||
	suite.NotPanics(func() {
 | 
						suite.NotPanics(func() {
 | 
				
			||||||
		suite.keeper.SetHardLiquidityProviderClaim(suite.ctx, c1)
 | 
							suite.keeper.SetHardLiquidityProviderClaim(suite.ctx, c1)
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
@ -108,6 +109,8 @@ func (suite *HandlerTestSuite) addUSDXMintingClaim() {
 | 
				
			|||||||
	})
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO: add tests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestHandlerTestSuite(t *testing.T) {
 | 
					func TestHandlerTestSuite(t *testing.T) {
 | 
				
			||||||
	suite.Run(t, new(HandlerTestSuite))
 | 
						suite.Run(t, new(HandlerTestSuite))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -89,13 +89,13 @@ When delegated tokens (to bonded validators) are changed:
 | 
				
			|||||||
// BeforeDelegationCreated runs before a delegation is created
 | 
					// BeforeDelegationCreated runs before a delegation is created
 | 
				
			||||||
func (h Hooks) BeforeDelegationCreated(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) {
 | 
					func (h Hooks) BeforeDelegationCreated(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) {
 | 
				
			||||||
	// Add a claim if one doesn't exist, otherwise sync the existing.
 | 
						// Add a claim if one doesn't exist, otherwise sync the existing.
 | 
				
			||||||
	h.k.InitializeHardDelegatorReward(ctx, delAddr)
 | 
						h.k.InitializeDelegatorReward(ctx, delAddr)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// BeforeDelegationSharesModified runs before an existing delegation is modified
 | 
					// BeforeDelegationSharesModified runs before an existing delegation is modified
 | 
				
			||||||
func (h Hooks) BeforeDelegationSharesModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) {
 | 
					func (h Hooks) BeforeDelegationSharesModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) {
 | 
				
			||||||
	// Sync rewards based on total delegated to bonded validators.
 | 
						// Sync rewards based on total delegated to bonded validators.
 | 
				
			||||||
	h.k.SynchronizeHardDelegatorRewards(ctx, delAddr, nil, false)
 | 
						h.k.SynchronizeDelegatorRewards(ctx, delAddr, nil, false)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// BeforeValidatorSlashed is called before a validator is slashed
 | 
					// BeforeValidatorSlashed is called before a validator is slashed
 | 
				
			||||||
@ -104,7 +104,7 @@ func (h Hooks) BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.ValAddress, f
 | 
				
			|||||||
	// Sync all claims for users delegated to this validator.
 | 
						// Sync all claims for users delegated to this validator.
 | 
				
			||||||
	// For each claim, sync based on the total delegated to bonded validators.
 | 
						// For each claim, sync based on the total delegated to bonded validators.
 | 
				
			||||||
	for _, delegation := range h.k.stakingKeeper.GetValidatorDelegations(ctx, valAddr) {
 | 
						for _, delegation := range h.k.stakingKeeper.GetValidatorDelegations(ctx, valAddr) {
 | 
				
			||||||
		h.k.SynchronizeHardDelegatorRewards(ctx, delegation.DelegatorAddress, nil, false)
 | 
							h.k.SynchronizeDelegatorRewards(ctx, delegation.DelegatorAddress, nil, false)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -115,7 +115,7 @@ func (h Hooks) AfterValidatorBeginUnbonding(ctx sdk.Context, consAddr sdk.ConsAd
 | 
				
			|||||||
	// For each claim, sync based on the total delegated to bonded validators, and also delegations to valAddr.
 | 
						// For each claim, sync based on the total delegated to bonded validators, and also delegations to valAddr.
 | 
				
			||||||
	// valAddr's status has just been set to Unbonding, but we want to include delegations to it in the sync.
 | 
						// valAddr's status has just been set to Unbonding, but we want to include delegations to it in the sync.
 | 
				
			||||||
	for _, delegation := range h.k.stakingKeeper.GetValidatorDelegations(ctx, valAddr) {
 | 
						for _, delegation := range h.k.stakingKeeper.GetValidatorDelegations(ctx, valAddr) {
 | 
				
			||||||
		h.k.SynchronizeHardDelegatorRewards(ctx, delegation.DelegatorAddress, valAddr, true)
 | 
							h.k.SynchronizeDelegatorRewards(ctx, delegation.DelegatorAddress, valAddr, true)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -126,7 +126,7 @@ func (h Hooks) AfterValidatorBonded(ctx sdk.Context, consAddr sdk.ConsAddress, v
 | 
				
			|||||||
	// For each claim, sync based on the total delegated to bonded validators, except for delegations to valAddr.
 | 
						// For each claim, sync based on the total delegated to bonded validators, except for delegations to valAddr.
 | 
				
			||||||
	// valAddr's status has just been set to Bonded, but we don't want to include delegations to it in the sync
 | 
						// valAddr's status has just been set to Bonded, but we don't want to include delegations to it in the sync
 | 
				
			||||||
	for _, delegation := range h.k.stakingKeeper.GetValidatorDelegations(ctx, valAddr) {
 | 
						for _, delegation := range h.k.stakingKeeper.GetValidatorDelegations(ctx, valAddr) {
 | 
				
			||||||
		h.k.SynchronizeHardDelegatorRewards(ctx, delegation.DelegatorAddress, valAddr, false)
 | 
							h.k.SynchronizeDelegatorRewards(ctx, delegation.DelegatorAddress, valAddr, false)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -279,10 +279,10 @@ func (builder IncentiveGenesisBuilder) WithSimpleSupplyRewardPeriod(ctype string
 | 
				
			|||||||
	))
 | 
						))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func (builder IncentiveGenesisBuilder) WithInitializedDelegatorRewardPeriod(period types.MultiRewardPeriod) IncentiveGenesisBuilder {
 | 
					func (builder IncentiveGenesisBuilder) WithInitializedDelegatorRewardPeriod(period types.MultiRewardPeriod) IncentiveGenesisBuilder {
 | 
				
			||||||
	builder.Params.HardDelegatorRewardPeriods = append(builder.Params.HardDelegatorRewardPeriods, period)
 | 
						builder.Params.DelegatorRewardPeriods = append(builder.Params.DelegatorRewardPeriods, period)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	accumulationTimeForPeriod := types.NewGenesisAccumulationTime(period.CollateralType, builder.genesisTime)
 | 
						accumulationTimeForPeriod := types.NewGenesisAccumulationTime(period.CollateralType, builder.genesisTime)
 | 
				
			||||||
	builder.HardDelegatorAccumulationTimes = append(builder.HardDelegatorAccumulationTimes, accumulationTimeForPeriod)
 | 
						builder.DelegatorAccumulationTimes = append(builder.DelegatorAccumulationTimes, accumulationTimeForPeriod)
 | 
				
			||||||
	return builder
 | 
						return builder
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -210,6 +210,55 @@ func (k Keeper) GetAllHardLiquidityProviderClaims(ctx sdk.Context) types.HardLiq
 | 
				
			|||||||
	return cs
 | 
						return cs
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetDelegatorClaim returns the claim in the store corresponding the the input address collateral type and id and a boolean for if the claim was found
 | 
				
			||||||
 | 
					func (k Keeper) GetDelegatorClaim(ctx sdk.Context, addr sdk.AccAddress) (types.DelegatorClaim, bool) {
 | 
				
			||||||
 | 
						store := prefix.NewStore(ctx.KVStore(k.key), types.DelegatorClaimKeyPrefix)
 | 
				
			||||||
 | 
						bz := store.Get(addr)
 | 
				
			||||||
 | 
						if bz == nil {
 | 
				
			||||||
 | 
							return types.DelegatorClaim{}, false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var c types.DelegatorClaim
 | 
				
			||||||
 | 
						k.cdc.MustUnmarshalBinaryBare(bz, &c)
 | 
				
			||||||
 | 
						return c, true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SetDelegatorClaim sets the claim in the store corresponding to the input address, collateral type, and id
 | 
				
			||||||
 | 
					func (k Keeper) SetDelegatorClaim(ctx sdk.Context, c types.DelegatorClaim) {
 | 
				
			||||||
 | 
						store := prefix.NewStore(ctx.KVStore(k.key), types.DelegatorClaimKeyPrefix)
 | 
				
			||||||
 | 
						bz := k.cdc.MustMarshalBinaryBare(c)
 | 
				
			||||||
 | 
						store.Set(c.Owner, bz)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// DeleteDelegatorClaim deletes the claim in the store corresponding to the input address, collateral type, and id
 | 
				
			||||||
 | 
					func (k Keeper) DeleteDelegatorClaim(ctx sdk.Context, owner sdk.AccAddress) {
 | 
				
			||||||
 | 
						store := prefix.NewStore(ctx.KVStore(k.key), types.DelegatorClaimKeyPrefix)
 | 
				
			||||||
 | 
						store.Delete(owner)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IterateDelegatorClaims iterates over all claim  objects in the store and preforms a callback function
 | 
				
			||||||
 | 
					func (k Keeper) IterateDelegatorClaims(ctx sdk.Context, cb func(c types.DelegatorClaim) (stop bool)) {
 | 
				
			||||||
 | 
						store := prefix.NewStore(ctx.KVStore(k.key), types.DelegatorClaimKeyPrefix)
 | 
				
			||||||
 | 
						iterator := sdk.KVStorePrefixIterator(store, []byte{})
 | 
				
			||||||
 | 
						defer iterator.Close()
 | 
				
			||||||
 | 
						for ; iterator.Valid(); iterator.Next() {
 | 
				
			||||||
 | 
							var c types.DelegatorClaim
 | 
				
			||||||
 | 
							k.cdc.MustUnmarshalBinaryBare(iterator.Value(), &c)
 | 
				
			||||||
 | 
							if cb(c) {
 | 
				
			||||||
 | 
								break
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetAllDelegatorClaims returns all DelegatorClaim objects in the store
 | 
				
			||||||
 | 
					func (k Keeper) GetAllDelegatorClaims(ctx sdk.Context) types.DelegatorClaims {
 | 
				
			||||||
 | 
						cs := types.DelegatorClaims{}
 | 
				
			||||||
 | 
						k.IterateDelegatorClaims(ctx, func(c types.DelegatorClaim) (stop bool) {
 | 
				
			||||||
 | 
							cs = append(cs, c)
 | 
				
			||||||
 | 
							return false
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						return cs
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SetHardSupplyRewardIndexes sets the current reward indexes for an individual denom
 | 
					// SetHardSupplyRewardIndexes sets the current reward indexes for an individual denom
 | 
				
			||||||
func (k Keeper) SetHardSupplyRewardIndexes(ctx sdk.Context, denom string, indexes types.RewardIndexes) {
 | 
					func (k Keeper) SetHardSupplyRewardIndexes(ctx sdk.Context, denom string, indexes types.RewardIndexes) {
 | 
				
			||||||
	store := prefix.NewStore(ctx.KVStore(k.key), types.HardSupplyRewardIndexesKeyPrefix)
 | 
						store := prefix.NewStore(ctx.KVStore(k.key), types.HardSupplyRewardIndexesKeyPrefix)
 | 
				
			||||||
@ -276,9 +325,9 @@ func (k Keeper) IterateHardBorrowRewardIndexes(ctx sdk.Context, cb func(denom st
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetHardDelegatorRewardIndexes gets the current reward indexes for an individual denom
 | 
					// GetDelegatorRewardIndexes gets the current reward indexes for an individual denom
 | 
				
			||||||
func (k Keeper) GetHardDelegatorRewardIndexes(ctx sdk.Context, denom string) (types.RewardIndexes, bool) {
 | 
					func (k Keeper) GetDelegatorRewardIndexes(ctx sdk.Context, denom string) (types.RewardIndexes, bool) {
 | 
				
			||||||
	store := prefix.NewStore(ctx.KVStore(k.key), types.HardDelegatorRewardIndexesKeyPrefix)
 | 
						store := prefix.NewStore(ctx.KVStore(k.key), types.DelegatorRewardIndexesKeyPrefix)
 | 
				
			||||||
	bz := store.Get([]byte(denom))
 | 
						bz := store.Get([]byte(denom))
 | 
				
			||||||
	if bz == nil {
 | 
						if bz == nil {
 | 
				
			||||||
		return types.RewardIndexes{}, false
 | 
							return types.RewardIndexes{}, false
 | 
				
			||||||
@ -288,16 +337,16 @@ func (k Keeper) GetHardDelegatorRewardIndexes(ctx sdk.Context, denom string) (ty
 | 
				
			|||||||
	return rewardIndexes, true
 | 
						return rewardIndexes, true
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SetHardDelegatorRewardIndexes sets the current reward indexes for an individual denom
 | 
					// SetDelegatorRewardIndexes sets the current reward indexes for an individual denom
 | 
				
			||||||
func (k Keeper) SetHardDelegatorRewardIndexes(ctx sdk.Context, denom string, indexes types.RewardIndexes) {
 | 
					func (k Keeper) SetDelegatorRewardIndexes(ctx sdk.Context, denom string, indexes types.RewardIndexes) {
 | 
				
			||||||
	store := prefix.NewStore(ctx.KVStore(k.key), types.HardDelegatorRewardIndexesKeyPrefix)
 | 
						store := prefix.NewStore(ctx.KVStore(k.key), types.DelegatorRewardIndexesKeyPrefix)
 | 
				
			||||||
	bz := k.cdc.MustMarshalBinaryBare(indexes)
 | 
						bz := k.cdc.MustMarshalBinaryBare(indexes)
 | 
				
			||||||
	store.Set([]byte(denom), bz)
 | 
						store.Set([]byte(denom), bz)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// IterateHardDelegatorRewardIndexes iterates over all Delegator reward index objects in the store and preforms a callback function
 | 
					// IterateDelegatorRewardIndexes iterates over all delegator reward index objects in the store and preforms a callback function
 | 
				
			||||||
func (k Keeper) IterateHardDelegatorRewardIndexes(ctx sdk.Context, cb func(denom string, indexes types.RewardIndexes) (stop bool)) {
 | 
					func (k Keeper) IterateDelegatorRewardIndexes(ctx sdk.Context, cb func(denom string, indexes types.RewardIndexes) (stop bool)) {
 | 
				
			||||||
	store := prefix.NewStore(ctx.KVStore(k.key), types.HardDelegatorRewardIndexesKeyPrefix)
 | 
						store := prefix.NewStore(ctx.KVStore(k.key), types.DelegatorRewardIndexesKeyPrefix)
 | 
				
			||||||
	iterator := sdk.KVStorePrefixIterator(store, []byte{})
 | 
						iterator := sdk.KVStorePrefixIterator(store, []byte{})
 | 
				
			||||||
	defer iterator.Close()
 | 
						defer iterator.Close()
 | 
				
			||||||
	for ; iterator.Valid(); iterator.Next() {
 | 
						for ; iterator.Valid(); iterator.Next() {
 | 
				
			||||||
@ -343,9 +392,9 @@ func (k Keeper) SetPreviousHardBorrowRewardAccrualTime(ctx sdk.Context, denom st
 | 
				
			|||||||
	store.Set([]byte(denom), k.cdc.MustMarshalBinaryBare(blockTime))
 | 
						store.Set([]byte(denom), k.cdc.MustMarshalBinaryBare(blockTime))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetPreviousHardDelegatorRewardAccrualTime returns the last time a denom accrued Hard protocol delegator rewards
 | 
					// GetPreviousDelegatorRewardAccrualTime returns the last time a denom accrued protocol delegator rewards
 | 
				
			||||||
func (k Keeper) GetPreviousHardDelegatorRewardAccrualTime(ctx sdk.Context, denom string) (blockTime time.Time, found bool) {
 | 
					func (k Keeper) GetPreviousDelegatorRewardAccrualTime(ctx sdk.Context, denom string) (blockTime time.Time, found bool) {
 | 
				
			||||||
	store := prefix.NewStore(ctx.KVStore(k.key), types.PreviousHardDelegatorRewardAccrualTimeKeyPrefix)
 | 
						store := prefix.NewStore(ctx.KVStore(k.key), types.PreviousDelegatorRewardAccrualTimeKeyPrefix)
 | 
				
			||||||
	bz := store.Get([]byte(denom))
 | 
						bz := store.Get([]byte(denom))
 | 
				
			||||||
	if bz == nil {
 | 
						if bz == nil {
 | 
				
			||||||
		return time.Time{}, false
 | 
							return time.Time{}, false
 | 
				
			||||||
@ -354,9 +403,9 @@ func (k Keeper) GetPreviousHardDelegatorRewardAccrualTime(ctx sdk.Context, denom
 | 
				
			|||||||
	return blockTime, true
 | 
						return blockTime, true
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SetPreviousHardDelegatorRewardAccrualTime sets the last time a denom accrued Hard protocol delegator rewards
 | 
					// SetPreviousDelegatorRewardAccrualTime sets the last time a denom accrued protocol delegator rewards
 | 
				
			||||||
func (k Keeper) SetPreviousHardDelegatorRewardAccrualTime(ctx sdk.Context, denom string, blockTime time.Time) {
 | 
					func (k Keeper) SetPreviousDelegatorRewardAccrualTime(ctx sdk.Context, denom string, blockTime time.Time) {
 | 
				
			||||||
	store := prefix.NewStore(ctx.KVStore(k.key), types.PreviousHardDelegatorRewardAccrualTimeKeyPrefix)
 | 
						store := prefix.NewStore(ctx.KVStore(k.key), types.PreviousDelegatorRewardAccrualTimeKeyPrefix)
 | 
				
			||||||
	store.Set([]byte(denom), k.cdc.MustMarshalBinaryBare(blockTime))
 | 
						store.Set([]byte(denom), k.cdc.MustMarshalBinaryBare(blockTime))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -53,10 +53,10 @@ func (k Keeper) GetHardBorrowRewardPeriods(ctx sdk.Context, denom string) (types
 | 
				
			|||||||
	return types.MultiRewardPeriod{}, false
 | 
						return types.MultiRewardPeriod{}, false
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// GetHardDelegatorRewardPeriod returns the reward period with the specified collateral type if it's found in the params
 | 
					// GetDelegatorRewardPeriods returns the reward period with the specified collateral type if it's found in the params
 | 
				
			||||||
func (k Keeper) GetHardDelegatorRewardPeriods(ctx sdk.Context, denom string) (types.MultiRewardPeriod, bool) {
 | 
					func (k Keeper) GetDelegatorRewardPeriods(ctx sdk.Context, denom string) (types.MultiRewardPeriod, bool) {
 | 
				
			||||||
	params := k.GetParams(ctx)
 | 
						params := k.GetParams(ctx)
 | 
				
			||||||
	for _, rp := range params.HardDelegatorRewardPeriods {
 | 
						for _, rp := range params.DelegatorRewardPeriods {
 | 
				
			||||||
		if rp.CollateralType == denom {
 | 
							if rp.CollateralType == denom {
 | 
				
			||||||
			return rp, true
 | 
								return rp, true
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
				
			|||||||
@ -193,7 +193,7 @@ func (k Keeper) ClaimHardReward(ctx sdk.Context, addr sdk.AccAddress, multiplier
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ClaimHardReward sends the reward amount to the input address and zero's out the claim in the store
 | 
					// ClaimHardRewardVVesting sends the reward amount to the input address and zero's out the claim in the store
 | 
				
			||||||
func (k Keeper) ClaimHardRewardVVesting(ctx sdk.Context, owner, receiver sdk.AccAddress, multiplierName types.MultiplierName) error {
 | 
					func (k Keeper) ClaimHardRewardVVesting(ctx sdk.Context, owner, receiver sdk.AccAddress, multiplierName types.MultiplierName) error {
 | 
				
			||||||
	_, found := k.GetHardLiquidityProviderClaim(ctx, owner)
 | 
						_, found := k.GetHardLiquidityProviderClaim(ctx, owner)
 | 
				
			||||||
	if !found {
 | 
						if !found {
 | 
				
			||||||
@ -261,6 +261,129 @@ func (k Keeper) ClaimHardRewardVVesting(ctx sdk.Context, owner, receiver sdk.Acc
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ClaimDelegatorReward sends the reward amount to the input address and zero's out the delegator claim in the store
 | 
				
			||||||
 | 
					func (k Keeper) ClaimDelegatorReward(ctx sdk.Context, addr sdk.AccAddress, multiplierName types.MultiplierName) error {
 | 
				
			||||||
 | 
						claim, found := k.GetDelegatorClaim(ctx, addr)
 | 
				
			||||||
 | 
						if !found {
 | 
				
			||||||
 | 
							return sdkerrors.Wrapf(types.ErrClaimNotFound, "address: %s", addr)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						multiplier, found := k.GetMultiplier(ctx, multiplierName)
 | 
				
			||||||
 | 
						if !found {
 | 
				
			||||||
 | 
							return sdkerrors.Wrapf(types.ErrInvalidMultiplier, string(multiplierName))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						claimEnd := k.GetClaimEnd(ctx)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ctx.BlockTime().After(claimEnd) {
 | 
				
			||||||
 | 
							return sdkerrors.Wrapf(types.ErrClaimExpired, "block time %s > claim end time %s", ctx.BlockTime(), claimEnd)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						syncedClaim, err := k.SynchronizeDelegatorClaim(ctx, claim)
 | 
				
			||||||
 | 
						if !found {
 | 
				
			||||||
 | 
							return sdkerrors.Wrapf(types.ErrClaimNotFound, "address: %s", addr)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var rewardCoins sdk.Coins
 | 
				
			||||||
 | 
						for _, coin := range syncedClaim.Reward {
 | 
				
			||||||
 | 
							rewardAmount := coin.Amount.ToDec().Mul(multiplier.Factor).RoundInt()
 | 
				
			||||||
 | 
							if rewardAmount.IsZero() {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							rewardCoins = append(rewardCoins, sdk.NewCoin(coin.Denom, rewardAmount))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if rewardCoins.IsZero() {
 | 
				
			||||||
 | 
							return types.ErrZeroClaim
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						length, err := k.GetPeriodLength(ctx, multiplier)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = k.SendTimeLockedCoinsToAccount(ctx, types.IncentiveMacc, addr, rewardCoins, length)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						k.ZeroDelegatorClaim(ctx, syncedClaim)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ctx.EventManager().EmitEvent(
 | 
				
			||||||
 | 
							sdk.NewEvent(
 | 
				
			||||||
 | 
								types.EventTypeClaim,
 | 
				
			||||||
 | 
								sdk.NewAttribute(types.AttributeKeyClaimedBy, syncedClaim.GetOwner().String()),
 | 
				
			||||||
 | 
								sdk.NewAttribute(types.AttributeKeyClaimAmount, syncedClaim.GetReward().String()),
 | 
				
			||||||
 | 
								sdk.NewAttribute(types.AttributeKeyClaimType, syncedClaim.GetType()),
 | 
				
			||||||
 | 
							),
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ClaimDelegatorRewardVVesting sends the reward amount to the input address and zero's out the claim in the store
 | 
				
			||||||
 | 
					func (k Keeper) ClaimDelegatorRewardVVesting(ctx sdk.Context, owner, receiver sdk.AccAddress, multiplierName types.MultiplierName) error {
 | 
				
			||||||
 | 
						claim, found := k.GetDelegatorClaim(ctx, owner)
 | 
				
			||||||
 | 
						if !found {
 | 
				
			||||||
 | 
							return sdkerrors.Wrapf(types.ErrClaimNotFound, "address: %s", owner)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						acc := k.accountKeeper.GetAccount(ctx, owner)
 | 
				
			||||||
 | 
						if acc == nil {
 | 
				
			||||||
 | 
							return sdkerrors.Wrapf(types.ErrAccountNotFound, "address not found: %s", owner)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_, ok := acc.(*validatorvesting.ValidatorVestingAccount)
 | 
				
			||||||
 | 
						if !ok {
 | 
				
			||||||
 | 
							return sdkerrors.Wrapf(types.ErrInvalidAccountType, "owner account must be validator vesting account %s", owner)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						multiplier, found := k.GetMultiplier(ctx, multiplierName)
 | 
				
			||||||
 | 
						if !found {
 | 
				
			||||||
 | 
							return sdkerrors.Wrapf(types.ErrInvalidMultiplier, string(multiplierName))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						claimEnd := k.GetClaimEnd(ctx)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ctx.BlockTime().After(claimEnd) {
 | 
				
			||||||
 | 
							return sdkerrors.Wrapf(types.ErrClaimExpired, "block time %s > claim end time %s", ctx.BlockTime(), claimEnd)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						syncedClaim, err := k.SynchronizeDelegatorClaim(ctx, claim)
 | 
				
			||||||
 | 
						if !found {
 | 
				
			||||||
 | 
							return sdkerrors.Wrapf(types.ErrClaimNotFound, "address: %s", owner)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var rewardCoins sdk.Coins
 | 
				
			||||||
 | 
						for _, coin := range syncedClaim.Reward {
 | 
				
			||||||
 | 
							rewardAmount := coin.Amount.ToDec().Mul(multiplier.Factor).RoundInt()
 | 
				
			||||||
 | 
							if rewardAmount.IsZero() {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							rewardCoins = append(rewardCoins, sdk.NewCoin(coin.Denom, rewardAmount))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if rewardCoins.IsZero() {
 | 
				
			||||||
 | 
							return types.ErrZeroClaim
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						length, err := k.GetPeriodLength(ctx, multiplier)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = k.SendTimeLockedCoinsToAccount(ctx, types.IncentiveMacc, receiver, rewardCoins, length)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						k.ZeroDelegatorClaim(ctx, syncedClaim)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ctx.EventManager().EmitEvent(
 | 
				
			||||||
 | 
							sdk.NewEvent(
 | 
				
			||||||
 | 
								types.EventTypeClaim,
 | 
				
			||||||
 | 
								sdk.NewAttribute(types.AttributeKeyClaimedBy, syncedClaim.GetOwner().String()),
 | 
				
			||||||
 | 
								sdk.NewAttribute(types.AttributeKeyClaimAmount, syncedClaim.GetReward().String()),
 | 
				
			||||||
 | 
								sdk.NewAttribute(types.AttributeKeyClaimType, syncedClaim.GetType()),
 | 
				
			||||||
 | 
							),
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SendTimeLockedCoinsToAccount sends time-locked coins from the input module account to the recipient. If the recipients account is not a vesting account and the input length is greater than zero, the recipient account is converted to a periodic vesting account and the coins are added to the vesting balance as a vesting period with the input length.
 | 
					// SendTimeLockedCoinsToAccount sends time-locked coins from the input module account to the recipient. If the recipients account is not a vesting account and the input length is greater than zero, the recipient account is converted to a periodic vesting account and the coins are added to the vesting balance as a vesting period with the input length.
 | 
				
			||||||
func (k Keeper) SendTimeLockedCoinsToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins, length int64) error {
 | 
					func (k Keeper) SendTimeLockedCoinsToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins, length int64) error {
 | 
				
			||||||
	macc := k.supplyKeeper.GetModuleAccount(ctx, senderModule)
 | 
						macc := k.supplyKeeper.GetModuleAccount(ctx, senderModule)
 | 
				
			||||||
 | 
				
			|||||||
@ -25,6 +25,10 @@ func NewQuerier(k Keeper) sdk.Querier {
 | 
				
			|||||||
			return queryGetUSDXMintingRewards(ctx, req, k)
 | 
								return queryGetUSDXMintingRewards(ctx, req, k)
 | 
				
			||||||
		case types.QueryGetUSDXMintingRewardsUnsynced:
 | 
							case types.QueryGetUSDXMintingRewardsUnsynced:
 | 
				
			||||||
			return queryGetUSDXMintingRewardsUnsynced(ctx, req, k)
 | 
								return queryGetUSDXMintingRewardsUnsynced(ctx, req, k)
 | 
				
			||||||
 | 
							case types.QueryGetDelegatorRewards:
 | 
				
			||||||
 | 
								return queryGetDelegatorRewards(ctx, req, k)
 | 
				
			||||||
 | 
							case types.QueryGetDelegatorRewardsUnsynced:
 | 
				
			||||||
 | 
								return queryGetDelegatorRewardsUnsynced(ctx, req, k)
 | 
				
			||||||
		case types.QueryGetRewardFactors:
 | 
							case types.QueryGetRewardFactors:
 | 
				
			||||||
			return queryGetRewardFactors(ctx, req, k)
 | 
								return queryGetRewardFactors(ctx, req, k)
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
@ -198,6 +202,82 @@ func queryGetUSDXMintingRewardsUnsynced(ctx sdk.Context, req abci.RequestQuery,
 | 
				
			|||||||
	return bz, nil
 | 
						return bz, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func queryGetDelegatorRewards(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) {
 | 
				
			||||||
 | 
						var params types.QueryDelegatorRewardsParams
 | 
				
			||||||
 | 
						err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						owner := len(params.Owner) > 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var delegatorClaims types.DelegatorClaims
 | 
				
			||||||
 | 
						switch {
 | 
				
			||||||
 | 
						case owner:
 | 
				
			||||||
 | 
							delegatorClaim, foundDelegatorClaim := k.GetDelegatorClaim(ctx, params.Owner)
 | 
				
			||||||
 | 
							if foundDelegatorClaim {
 | 
				
			||||||
 | 
								delegatorClaims = append(delegatorClaims, delegatorClaim)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							delegatorClaims = k.GetAllDelegatorClaims(ctx)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var paginatedDelegatorClaims types.DelegatorClaims
 | 
				
			||||||
 | 
						startH, endH := client.Paginate(len(delegatorClaims), params.Page, params.Limit, 100)
 | 
				
			||||||
 | 
						if startH < 0 || endH < 0 {
 | 
				
			||||||
 | 
							paginatedDelegatorClaims = types.DelegatorClaims{}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							paginatedDelegatorClaims = delegatorClaims[startH:endH]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var augmentedDelegatorClaims types.DelegatorClaims
 | 
				
			||||||
 | 
						for _, claim := range paginatedDelegatorClaims {
 | 
				
			||||||
 | 
							augmentedClaim := k.SimulateDelegatorSynchronization(ctx, claim)
 | 
				
			||||||
 | 
							augmentedDelegatorClaims = append(augmentedDelegatorClaims, augmentedClaim)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Marshal Hard claims
 | 
				
			||||||
 | 
						bz, err := codec.MarshalJSONIndent(k.cdc, augmentedDelegatorClaims)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return bz, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func queryGetDelegatorRewardsUnsynced(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) {
 | 
				
			||||||
 | 
						var params types.QueryDelegatorRewardsUnsyncedParams
 | 
				
			||||||
 | 
						err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						owner := len(params.Owner) > 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var delegatorClaims types.DelegatorClaims
 | 
				
			||||||
 | 
						switch {
 | 
				
			||||||
 | 
						case owner:
 | 
				
			||||||
 | 
							delegatorClaim, foundHardClaim := k.GetDelegatorClaim(ctx, params.Owner)
 | 
				
			||||||
 | 
							if foundHardClaim {
 | 
				
			||||||
 | 
								delegatorClaims = append(delegatorClaims, delegatorClaim)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							delegatorClaims = k.GetAllDelegatorClaims(ctx)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var paginatedDelegatorClaims types.DelegatorClaims
 | 
				
			||||||
 | 
						startH, endH := client.Paginate(len(delegatorClaims), params.Page, params.Limit, 100)
 | 
				
			||||||
 | 
						if startH < 0 || endH < 0 {
 | 
				
			||||||
 | 
							paginatedDelegatorClaims = types.DelegatorClaims{}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							paginatedDelegatorClaims = delegatorClaims[startH:endH]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Marshal Hard claims
 | 
				
			||||||
 | 
						bz, err := codec.MarshalJSONIndent(k.cdc, paginatedDelegatorClaims)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return bz, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func queryGetRewardFactors(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) {
 | 
					func queryGetRewardFactors(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) {
 | 
				
			||||||
	var params types.QueryRewardFactorsParams
 | 
						var params types.QueryRewardFactorsParams
 | 
				
			||||||
	err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms)
 | 
						err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms)
 | 
				
			||||||
@ -223,9 +303,9 @@ func queryGetRewardFactors(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]
 | 
				
			|||||||
		if found {
 | 
							if found {
 | 
				
			||||||
			rewardFactor.HardBorrowRewardFactors = hardBorrowRewardIndexes
 | 
								rewardFactor.HardBorrowRewardFactors = hardBorrowRewardIndexes
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		hardDelegatorRewardIndexes, found := k.GetHardDelegatorRewardIndexes(ctx, params.Denom)
 | 
							delegatorRewardIndexes, found := k.GetDelegatorRewardIndexes(ctx, params.Denom)
 | 
				
			||||||
		if found {
 | 
							if found {
 | 
				
			||||||
			rewardFactor.HardDelegatorRewardFactors = hardDelegatorRewardIndexes
 | 
								rewardFactor.DelegatorRewardFactors = delegatorRewardIndexes
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		rewardFactors = append(rewardFactors, rewardFactor)
 | 
							rewardFactors = append(rewardFactors, rewardFactor)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
@ -262,13 +342,13 @@ func queryGetRewardFactors(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]
 | 
				
			|||||||
			return false
 | 
								return false
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Populate mapping with Hard delegator reward factors
 | 
							// Populate mapping with delegator reward factors
 | 
				
			||||||
		k.IterateHardDelegatorRewardIndexes(ctx, func(denom string, indexes types.RewardIndexes) (stop bool) {
 | 
							k.IterateDelegatorRewardIndexes(ctx, func(denom string, indexes types.RewardIndexes) (stop bool) {
 | 
				
			||||||
			rewardFactor, ok := rewardFactorMap[denom]
 | 
								rewardFactor, ok := rewardFactorMap[denom]
 | 
				
			||||||
			if !ok {
 | 
								if !ok {
 | 
				
			||||||
				rewardFactor = types.RewardFactor{Denom: denom, HardDelegatorRewardFactors: indexes}
 | 
									rewardFactor = types.RewardFactor{Denom: denom, DelegatorRewardFactors: indexes}
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				rewardFactor.HardDelegatorRewardFactors = indexes
 | 
									rewardFactor.DelegatorRewardFactors = indexes
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			rewardFactorMap[denom] = rewardFactor
 | 
								rewardFactorMap[denom] = rewardFactor
 | 
				
			||||||
			return false
 | 
								return false
 | 
				
			||||||
 | 
				
			|||||||
@ -81,7 +81,7 @@ func (k Keeper) AccumulateHardBorrowRewards(ctx sdk.Context, rewardPeriod types.
 | 
				
			|||||||
func (k Keeper) InitializeHardBorrowReward(ctx sdk.Context, borrow hardtypes.Borrow) {
 | 
					func (k Keeper) InitializeHardBorrowReward(ctx sdk.Context, borrow hardtypes.Borrow) {
 | 
				
			||||||
	claim, found := k.GetHardLiquidityProviderClaim(ctx, borrow.Borrower)
 | 
						claim, found := k.GetHardLiquidityProviderClaim(ctx, borrow.Borrower)
 | 
				
			||||||
	if !found {
 | 
						if !found {
 | 
				
			||||||
		claim = types.NewHardLiquidityProviderClaim(borrow.Borrower, sdk.Coins{}, nil, nil, nil)
 | 
							claim = types.NewHardLiquidityProviderClaim(borrow.Borrower, sdk.Coins{}, nil, nil)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var borrowRewardIndexes types.MultiRewardIndexes
 | 
						var borrowRewardIndexes types.MultiRewardIndexes
 | 
				
			||||||
@ -142,7 +142,7 @@ func (k Keeper) SynchronizeHardBorrowReward(ctx sdk.Context, borrow hardtypes.Bo
 | 
				
			|||||||
func (k Keeper) UpdateHardBorrowIndexDenoms(ctx sdk.Context, borrow hardtypes.Borrow) {
 | 
					func (k Keeper) UpdateHardBorrowIndexDenoms(ctx sdk.Context, borrow hardtypes.Borrow) {
 | 
				
			||||||
	claim, found := k.GetHardLiquidityProviderClaim(ctx, borrow.Borrower)
 | 
						claim, found := k.GetHardLiquidityProviderClaim(ctx, borrow.Borrower)
 | 
				
			||||||
	if !found {
 | 
						if !found {
 | 
				
			||||||
		claim = types.NewHardLiquidityProviderClaim(borrow.Borrower, sdk.Coins{}, nil, nil, nil)
 | 
							claim = types.NewHardLiquidityProviderClaim(borrow.Borrower, sdk.Coins{}, nil, nil)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	borrowDenoms := getDenoms(borrow.Amount)
 | 
						borrowDenoms := getDenoms(borrow.Amount)
 | 
				
			||||||
 | 
				
			|||||||
@ -36,7 +36,7 @@ func (suite *InitializeHardBorrowRewardTests) TestClaimIndexesAreSetWhenClaimExi
 | 
				
			|||||||
		// which means UpdateHardBorrowIndexDenoms was called and should have remove indexes.
 | 
							// which means UpdateHardBorrowIndexDenoms was called and should have remove indexes.
 | 
				
			||||||
		BorrowRewardIndexes: types.MultiRewardIndexes{},
 | 
							BorrowRewardIndexes: types.MultiRewardIndexes{},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeHardClaim(claim)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	globalIndexes := nonEmptyMultiRewardIndexes
 | 
						globalIndexes := nonEmptyMultiRewardIndexes
 | 
				
			||||||
	suite.storeGlobalBorrowIndexes(globalIndexes)
 | 
						suite.storeGlobalBorrowIndexes(globalIndexes)
 | 
				
			||||||
 | 
				
			|||||||
@ -39,7 +39,7 @@ func (suite *SynchronizeHardBorrowRewardTests) TestClaimIndexesAreUpdatedWhenGlo
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		BorrowRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
							BorrowRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeHardClaim(claim)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	globalIndexes := increaseAllRewardFactors(nonEmptyMultiRewardIndexes)
 | 
						globalIndexes := increaseAllRewardFactors(nonEmptyMultiRewardIndexes)
 | 
				
			||||||
	suite.storeGlobalBorrowIndexes(globalIndexes)
 | 
						suite.storeGlobalBorrowIndexes(globalIndexes)
 | 
				
			||||||
@ -64,7 +64,7 @@ func (suite *SynchronizeHardBorrowRewardTests) TestClaimIndexesAreUnchangedWhenG
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		BorrowRewardIndexes: unchangingIndexes,
 | 
							BorrowRewardIndexes: unchangingIndexes,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeHardClaim(claim)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	suite.storeGlobalBorrowIndexes(unchangingIndexes)
 | 
						suite.storeGlobalBorrowIndexes(unchangingIndexes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -88,7 +88,7 @@ func (suite *SynchronizeHardBorrowRewardTests) TestClaimIndexesAreUpdatedWhenNew
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		BorrowRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
							BorrowRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeHardClaim(claim)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	globalIndexes := appendUniqueMultiRewardIndex(nonEmptyMultiRewardIndexes)
 | 
						globalIndexes := appendUniqueMultiRewardIndex(nonEmptyMultiRewardIndexes)
 | 
				
			||||||
	suite.storeGlobalBorrowIndexes(globalIndexes)
 | 
						suite.storeGlobalBorrowIndexes(globalIndexes)
 | 
				
			||||||
@ -114,7 +114,7 @@ func (suite *SynchronizeHardBorrowRewardTests) TestClaimIndexesAreUpdatedWhenNew
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		BorrowRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
							BorrowRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeHardClaim(claim)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	globalIndexes := appendUniqueRewardIndexToFirstItem(nonEmptyMultiRewardIndexes)
 | 
						globalIndexes := appendUniqueRewardIndexToFirstItem(nonEmptyMultiRewardIndexes)
 | 
				
			||||||
	suite.storeGlobalBorrowIndexes(globalIndexes)
 | 
						suite.storeGlobalBorrowIndexes(globalIndexes)
 | 
				
			||||||
@ -155,7 +155,7 @@ func (suite *SynchronizeHardBorrowRewardTests) TestRewardIsIncrementedWhenGlobal
 | 
				
			|||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeHardClaim(claim)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	suite.storeGlobalBorrowIndexes(types.MultiRewardIndexes{
 | 
						suite.storeGlobalBorrowIndexes(types.MultiRewardIndexes{
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
@ -206,7 +206,7 @@ func (suite *SynchronizeHardBorrowRewardTests) TestRewardIsIncrementedWhenNewRew
 | 
				
			|||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeHardClaim(claim)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	globalIndexes := types.MultiRewardIndexes{
 | 
						globalIndexes := types.MultiRewardIndexes{
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
@ -269,7 +269,7 @@ func (suite *SynchronizeHardBorrowRewardTests) TestRewardIsIncrementedWhenNewRew
 | 
				
			|||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeHardClaim(claim)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	globalIndexes := types.MultiRewardIndexes{
 | 
						globalIndexes := types.MultiRewardIndexes{
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
 | 
				
			|||||||
@ -33,7 +33,7 @@ func (suite *UpdateHardBorrowIndexDenomsTests) TestClaimIndexesAreRemovedForDeno
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		BorrowRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
							BorrowRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeHardClaim(claim)
 | 
				
			||||||
	suite.storeGlobalBorrowIndexes(claim.BorrowRewardIndexes)
 | 
						suite.storeGlobalBorrowIndexes(claim.BorrowRewardIndexes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// remove one denom from the indexes already in the borrow
 | 
						// remove one denom from the indexes already in the borrow
 | 
				
			||||||
@ -56,7 +56,7 @@ func (suite *UpdateHardBorrowIndexDenomsTests) TestClaimIndexesAreAddedForNewlyB
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		BorrowRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
							BorrowRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeHardClaim(claim)
 | 
				
			||||||
	globalIndexes := appendUniqueMultiRewardIndex(claim.BorrowRewardIndexes)
 | 
						globalIndexes := appendUniqueMultiRewardIndex(claim.BorrowRewardIndexes)
 | 
				
			||||||
	suite.storeGlobalBorrowIndexes(globalIndexes)
 | 
						suite.storeGlobalBorrowIndexes(globalIndexes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -78,7 +78,7 @@ func (suite *UpdateHardBorrowIndexDenomsTests) TestClaimIndexesAreUnchangedWhenB
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		BorrowRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
							BorrowRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeHardClaim(claim)
 | 
				
			||||||
	// Set global indexes with same denoms but different values.
 | 
						// Set global indexes with same denoms but different values.
 | 
				
			||||||
	// UpdateHardBorrowIndexDenoms should ignore the new values.
 | 
						// UpdateHardBorrowIndexDenoms should ignore the new values.
 | 
				
			||||||
	suite.storeGlobalBorrowIndexes(increaseAllRewardFactors(claim.BorrowRewardIndexes))
 | 
						suite.storeGlobalBorrowIndexes(increaseAllRewardFactors(claim.BorrowRewardIndexes))
 | 
				
			||||||
@ -101,7 +101,7 @@ func (suite *UpdateHardBorrowIndexDenomsTests) TestEmptyClaimIndexesAreAddedForN
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		BorrowRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
							BorrowRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeHardClaim(claim)
 | 
				
			||||||
	suite.storeGlobalBorrowIndexes(claim.BorrowRewardIndexes)
 | 
						suite.storeGlobalBorrowIndexes(claim.BorrowRewardIndexes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// add a denom to the borrowed amount that is not in the global or claim's indexes
 | 
						// add a denom to the borrowed amount that is not in the global or claim's indexes
 | 
				
			||||||
 | 
				
			|||||||
@ -8,11 +8,11 @@ import (
 | 
				
			|||||||
	"github.com/kava-labs/kava/x/incentive/types"
 | 
						"github.com/kava-labs/kava/x/incentive/types"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// AccumulateHardDelegatorRewards updates the rewards accumulated for the input reward period
 | 
					// AccumulateDelegatorRewards updates the rewards accumulated for the input reward period
 | 
				
			||||||
func (k Keeper) AccumulateHardDelegatorRewards(ctx sdk.Context, rewardPeriods types.MultiRewardPeriod) error {
 | 
					func (k Keeper) AccumulateDelegatorRewards(ctx sdk.Context, rewardPeriods types.MultiRewardPeriod) error {
 | 
				
			||||||
	previousAccrualTime, found := k.GetPreviousHardDelegatorRewardAccrualTime(ctx, rewardPeriods.CollateralType)
 | 
						previousAccrualTime, found := k.GetPreviousDelegatorRewardAccrualTime(ctx, rewardPeriods.CollateralType)
 | 
				
			||||||
	if !found {
 | 
						if !found {
 | 
				
			||||||
		k.SetPreviousHardDelegatorRewardAccrualTime(ctx, rewardPeriods.CollateralType, ctx.BlockTime())
 | 
							k.SetPreviousDelegatorRewardAccrualTime(ctx, rewardPeriods.CollateralType, ctx.BlockTime())
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	timeElapsed := CalculateTimeElapsed(rewardPeriods.Start, rewardPeriods.End, ctx.BlockTime(), previousAccrualTime)
 | 
						timeElapsed := CalculateTimeElapsed(rewardPeriods.Start, rewardPeriods.End, ctx.BlockTime(), previousAccrualTime)
 | 
				
			||||||
@ -20,23 +20,23 @@ func (k Keeper) AccumulateHardDelegatorRewards(ctx sdk.Context, rewardPeriods ty
 | 
				
			|||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if rewardPeriods.RewardsPerSecond.IsZero() {
 | 
						if rewardPeriods.RewardsPerSecond.IsZero() {
 | 
				
			||||||
		k.SetPreviousHardDelegatorRewardAccrualTime(ctx, rewardPeriods.CollateralType, ctx.BlockTime())
 | 
							k.SetPreviousDelegatorRewardAccrualTime(ctx, rewardPeriods.CollateralType, ctx.BlockTime())
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	totalBonded := k.stakingKeeper.TotalBondedTokens(ctx).ToDec()
 | 
						totalBonded := k.stakingKeeper.TotalBondedTokens(ctx).ToDec()
 | 
				
			||||||
	if totalBonded.IsZero() {
 | 
						if totalBonded.IsZero() {
 | 
				
			||||||
		k.SetPreviousHardDelegatorRewardAccrualTime(ctx, rewardPeriods.CollateralType, ctx.BlockTime())
 | 
							k.SetPreviousDelegatorRewardAccrualTime(ctx, rewardPeriods.CollateralType, ctx.BlockTime())
 | 
				
			||||||
		return nil
 | 
							return nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	previousRewardIndexes, found := k.GetHardDelegatorRewardIndexes(ctx, rewardPeriods.CollateralType)
 | 
						previousRewardIndexes, found := k.GetDelegatorRewardIndexes(ctx, rewardPeriods.CollateralType)
 | 
				
			||||||
	if !found {
 | 
						if !found {
 | 
				
			||||||
		for _, rewardCoin := range rewardPeriods.RewardsPerSecond {
 | 
							for _, rewardCoin := range rewardPeriods.RewardsPerSecond {
 | 
				
			||||||
			rewardIndex := types.NewRewardIndex(rewardCoin.Denom, sdk.ZeroDec())
 | 
								rewardIndex := types.NewRewardIndex(rewardCoin.Denom, sdk.ZeroDec())
 | 
				
			||||||
			previousRewardIndexes = append(previousRewardIndexes, rewardIndex)
 | 
								previousRewardIndexes = append(previousRewardIndexes, rewardIndex)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		k.SetHardDelegatorRewardIndexes(ctx, rewardPeriods.CollateralType, previousRewardIndexes)
 | 
							k.SetDelegatorRewardIndexes(ctx, rewardPeriods.CollateralType, previousRewardIndexes)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	newRewardIndexes := previousRewardIndexes
 | 
						newRewardIndexes := previousRewardIndexes
 | 
				
			||||||
@ -58,42 +58,53 @@ func (k Keeper) AccumulateHardDelegatorRewards(ctx sdk.Context, rewardPeriods ty
 | 
				
			|||||||
			newRewardIndexes = append(newRewardIndexes, newRewardIndex)
 | 
								newRewardIndexes = append(newRewardIndexes, newRewardIndex)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	k.SetHardDelegatorRewardIndexes(ctx, rewardPeriods.CollateralType, newRewardIndexes)
 | 
						k.SetDelegatorRewardIndexes(ctx, rewardPeriods.CollateralType, newRewardIndexes)
 | 
				
			||||||
	k.SetPreviousHardDelegatorRewardAccrualTime(ctx, rewardPeriods.CollateralType, ctx.BlockTime())
 | 
						k.SetPreviousDelegatorRewardAccrualTime(ctx, rewardPeriods.CollateralType, ctx.BlockTime())
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// InitializeHardDelegatorReward initializes the delegator reward index of a hard claim
 | 
					// InitializeDelegatorReward initializes the reward index of a delegator claim
 | 
				
			||||||
func (k Keeper) InitializeHardDelegatorReward(ctx sdk.Context, delegator sdk.AccAddress) {
 | 
					func (k Keeper) InitializeDelegatorReward(ctx sdk.Context, delegator sdk.AccAddress) {
 | 
				
			||||||
	claim, found := k.GetHardLiquidityProviderClaim(ctx, delegator)
 | 
						claim, found := k.GetDelegatorClaim(ctx, delegator)
 | 
				
			||||||
	if !found {
 | 
						if !found {
 | 
				
			||||||
		claim = types.NewHardLiquidityProviderClaim(delegator, sdk.Coins{}, nil, nil, nil)
 | 
							claim = types.NewDelegatorClaim(delegator, sdk.Coins{}, nil)
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		k.SynchronizeHardDelegatorRewards(ctx, delegator, nil, false)
 | 
							k.SynchronizeDelegatorRewards(ctx, delegator, nil, false)
 | 
				
			||||||
		claim, _ = k.GetHardLiquidityProviderClaim(ctx, delegator)
 | 
							claim, _ = k.GetDelegatorClaim(ctx, delegator)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var delegatorRewardIndexes types.MultiRewardIndexes
 | 
						var rewardIndexes types.MultiRewardIndexes
 | 
				
			||||||
	globalRewardIndexes, found := k.GetHardDelegatorRewardIndexes(ctx, types.BondDenom)
 | 
						globalRewardIndexes, found := k.GetDelegatorRewardIndexes(ctx, types.BondDenom)
 | 
				
			||||||
	if !found {
 | 
						if !found {
 | 
				
			||||||
		globalRewardIndexes = types.RewardIndexes{}
 | 
							globalRewardIndexes = types.RewardIndexes{}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	delegatorRewardIndexes = delegatorRewardIndexes.With(types.BondDenom, globalRewardIndexes)
 | 
						rewardIndexes = rewardIndexes.With(types.BondDenom, globalRewardIndexes)
 | 
				
			||||||
 | 
						claim.RewardIndexes = rewardIndexes
 | 
				
			||||||
	claim.DelegatorRewardIndexes = delegatorRewardIndexes
 | 
						k.SetDelegatorClaim(ctx, claim)
 | 
				
			||||||
	k.SetHardLiquidityProviderClaim(ctx, claim)
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SynchronizeHardDelegatorRewards updates the claim object by adding any accumulated rewards, and setting the reward indexes to the global values.
 | 
					// SynchronizeDelegatorClaim is a wrapper around SynchronizeDelegatorRewards that returns the synced claim
 | 
				
			||||||
 | 
					func (k Keeper) SynchronizeDelegatorClaim(ctx sdk.Context, claim types.DelegatorClaim) (types.DelegatorClaim, error) {
 | 
				
			||||||
 | 
						k.SynchronizeDelegatorRewards(ctx, claim.Owner, nil, false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						claim, found := k.GetDelegatorClaim(ctx, claim.Owner)
 | 
				
			||||||
 | 
						if !found {
 | 
				
			||||||
 | 
							return claim, types.ErrClaimNotFound
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return claim, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SynchronizeDelegatorRewards updates the claim object by adding any accumulated rewards, and setting the reward indexes to the global values.
 | 
				
			||||||
// valAddr and shouldIncludeValidator are used to ignore or include delegations to a particular validator when summing up the total delegation.
 | 
					// valAddr and shouldIncludeValidator are used to ignore or include delegations to a particular validator when summing up the total delegation.
 | 
				
			||||||
// Normally only delegations to Bonded validators are included in the total. This is needed as staking hooks are sometimes called on the wrong side of a validator's state update (from this module's perspective).
 | 
					// Normally only delegations to Bonded validators are included in the total. This is needed as staking hooks are sometimes called on the wrong
 | 
				
			||||||
func (k Keeper) SynchronizeHardDelegatorRewards(ctx sdk.Context, delegator sdk.AccAddress, valAddr sdk.ValAddress, shouldIncludeValidator bool) {
 | 
					// side of a validator's state update (from this module's perspective).
 | 
				
			||||||
	claim, found := k.GetHardLiquidityProviderClaim(ctx, delegator)
 | 
					func (k Keeper) SynchronizeDelegatorRewards(ctx sdk.Context, delegator sdk.AccAddress, valAddr sdk.ValAddress, shouldIncludeValidator bool) {
 | 
				
			||||||
 | 
						claim, found := k.GetDelegatorClaim(ctx, delegator)
 | 
				
			||||||
	if !found {
 | 
						if !found {
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	globalRewardIndexes, found := k.GetHardDelegatorRewardIndexes(ctx, types.BondDenom)
 | 
						globalRewardIndexes, found := k.GetDelegatorRewardIndexes(ctx, types.BondDenom)
 | 
				
			||||||
	if !found {
 | 
						if !found {
 | 
				
			||||||
		// The global factor is only not found if
 | 
							// The global factor is only not found if
 | 
				
			||||||
		// - the bond denom has not started accumulating rewards yet (either there is no reward specified in params, or the reward start time hasn't been hit)
 | 
							// - the bond denom has not started accumulating rewards yet (either there is no reward specified in params, or the reward start time hasn't been hit)
 | 
				
			||||||
@ -104,7 +115,7 @@ func (k Keeper) SynchronizeHardDelegatorRewards(ctx sdk.Context, delegator sdk.A
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	userRewardIndexes, found := claim.DelegatorRewardIndexes.Get(types.BondDenom)
 | 
						userRewardIndexes, found := claim.RewardIndexes.Get(types.BondDenom)
 | 
				
			||||||
	if !found {
 | 
						if !found {
 | 
				
			||||||
		// Normally the reward indexes should always be found.
 | 
							// Normally the reward indexes should always be found.
 | 
				
			||||||
		// However if there were no delegator rewards (ie no reward period in params) then a reward period is added, existing claims will not have the factor.
 | 
							// However if there were no delegator rewards (ie no reward period in params) then a reward period is added, existing claims will not have the factor.
 | 
				
			||||||
@ -122,8 +133,8 @@ func (k Keeper) SynchronizeHardDelegatorRewards(ctx sdk.Context, delegator sdk.A
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	claim.Reward = claim.Reward.Add(rewardsEarned...)
 | 
						claim.Reward = claim.Reward.Add(rewardsEarned...)
 | 
				
			||||||
	claim.DelegatorRewardIndexes = claim.DelegatorRewardIndexes.With(types.BondDenom, globalRewardIndexes)
 | 
						claim.RewardIndexes = claim.RewardIndexes.With(types.BondDenom, globalRewardIndexes)
 | 
				
			||||||
	k.SetHardLiquidityProviderClaim(ctx, claim)
 | 
						k.SetDelegatorClaim(ctx, claim)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (k Keeper) GetTotalDelegated(ctx sdk.Context, delegator sdk.AccAddress, valAddr sdk.ValAddress, shouldIncludeValidator bool) sdk.Dec {
 | 
					func (k Keeper) GetTotalDelegated(ctx sdk.Context, delegator sdk.AccAddress, valAddr sdk.ValAddress, shouldIncludeValidator bool) sdk.Dec {
 | 
				
			||||||
@ -162,3 +173,63 @@ func (k Keeper) GetTotalDelegated(ctx sdk.Context, delegator sdk.AccAddress, val
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	return totalDelegated
 | 
						return totalDelegated
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ZeroDelegatorClaim zeroes out the claim object's rewards and returns the updated claim object
 | 
				
			||||||
 | 
					func (k Keeper) ZeroDelegatorClaim(ctx sdk.Context, claim types.DelegatorClaim) types.DelegatorClaim {
 | 
				
			||||||
 | 
						claim.Reward = sdk.NewCoins()
 | 
				
			||||||
 | 
						k.SetDelegatorClaim(ctx, claim)
 | 
				
			||||||
 | 
						return claim
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SimulateDelegatorSynchronization calculates a user's outstanding delegator rewards by simulating reward synchronization
 | 
				
			||||||
 | 
					func (k Keeper) SimulateDelegatorSynchronization(ctx sdk.Context, claim types.DelegatorClaim) types.DelegatorClaim {
 | 
				
			||||||
 | 
						for _, ri := range claim.RewardIndexes {
 | 
				
			||||||
 | 
							// For each Delegator reward index (there's only one: the bond denom 'ukava')
 | 
				
			||||||
 | 
							globalRewardIndexes, foundGlobalRewardIndexes := k.GetDelegatorRewardIndexes(ctx, ri.CollateralType)
 | 
				
			||||||
 | 
							if !foundGlobalRewardIndexes {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							userRewardIndexes, foundUserRewardIndexes := claim.RewardIndexes.GetRewardIndex(ri.CollateralType)
 | 
				
			||||||
 | 
							if !foundUserRewardIndexes {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							userRewardIndexIndex, foundUserRewardIndexIndex := claim.RewardIndexes.GetRewardIndexIndex(ri.CollateralType)
 | 
				
			||||||
 | 
							if !foundUserRewardIndexIndex {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							amtDelegated := k.GetTotalDelegated(ctx, claim.GetOwner(), sdk.ValAddress(claim.Owner.String()), true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for _, globalRewardIndex := range globalRewardIndexes {
 | 
				
			||||||
 | 
								userRewardIndex, foundUserRewardIndex := userRewardIndexes.RewardIndexes.GetRewardIndex(globalRewardIndex.CollateralType)
 | 
				
			||||||
 | 
								if !foundUserRewardIndex {
 | 
				
			||||||
 | 
									userRewardIndex = types.NewRewardIndex(globalRewardIndex.CollateralType, sdk.ZeroDec())
 | 
				
			||||||
 | 
									userRewardIndexes.RewardIndexes = append(userRewardIndexes.RewardIndexes, userRewardIndex)
 | 
				
			||||||
 | 
									claim.RewardIndexes[userRewardIndexIndex].RewardIndexes = append(claim.RewardIndexes[userRewardIndexIndex].RewardIndexes, userRewardIndex)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								globalRewardFactor := globalRewardIndex.RewardFactor
 | 
				
			||||||
 | 
								userRewardFactor := userRewardIndex.RewardFactor
 | 
				
			||||||
 | 
								rewardsAccumulatedFactor := globalRewardFactor.Sub(userRewardFactor)
 | 
				
			||||||
 | 
								if rewardsAccumulatedFactor.IsZero() {
 | 
				
			||||||
 | 
									continue
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								rewardsEarned := rewardsAccumulatedFactor.Mul(amtDelegated).RoundInt()
 | 
				
			||||||
 | 
								if rewardsEarned.IsZero() || rewardsEarned.IsNegative() {
 | 
				
			||||||
 | 
									continue
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								factorIndex, foundFactorIndex := userRewardIndexes.RewardIndexes.GetFactorIndex(globalRewardIndex.CollateralType)
 | 
				
			||||||
 | 
								if !foundFactorIndex {
 | 
				
			||||||
 | 
									continue
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								claim.RewardIndexes[userRewardIndexIndex].RewardIndexes[factorIndex].RewardFactor = globalRewardIndex.RewardFactor
 | 
				
			||||||
 | 
								newRewardsCoin := sdk.NewCoin(userRewardIndex.CollateralType, rewardsEarned)
 | 
				
			||||||
 | 
								claim.Reward = claim.Reward.Add(newRewardsCoin)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return claim
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -10,7 +10,7 @@ import (
 | 
				
			|||||||
	"github.com/kava-labs/kava/x/incentive/types"
 | 
						"github.com/kava-labs/kava/x/incentive/types"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// InitializeHardDelegatorRewardTests runs unit tests for the keeper.InitializeHardDelegatorReward method
 | 
					// InitializeDelegatorRewardTests runs unit tests for the keeper.InitializeDelegatorReward method
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// inputs
 | 
					// inputs
 | 
				
			||||||
// - claim in store if it exists (only claim.DelegatorRewardIndexes)
 | 
					// - claim in store if it exists (only claim.DelegatorRewardIndexes)
 | 
				
			||||||
@ -19,27 +19,33 @@ import (
 | 
				
			|||||||
//
 | 
					//
 | 
				
			||||||
// outputs
 | 
					// outputs
 | 
				
			||||||
// - sets or creates a claim
 | 
					// - sets or creates a claim
 | 
				
			||||||
type InitializeHardDelegatorRewardTests struct {
 | 
					type InitializeDelegatorRewardTests struct {
 | 
				
			||||||
	unitTester
 | 
						unitTester
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestInitializeHardDelegatorReward(t *testing.T) {
 | 
					func TestInitializeDelegatorReward(t *testing.T) {
 | 
				
			||||||
	suite.Run(t, new(InitializeHardDelegatorRewardTests))
 | 
						suite.Run(t, new(InitializeDelegatorRewardTests))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (suite *InitializeHardDelegatorRewardTests) TestClaimIndexesAreSetWhenClaimDoesNotExist() {
 | 
					// Hardcoded to use bond denom
 | 
				
			||||||
 | 
					func (suite *InitializeDelegatorRewardTests) storeGlobalDelegatorFactor(multiRewardIndexes types.MultiRewardIndexes) {
 | 
				
			||||||
 | 
						multiRewardIndex, _ := multiRewardIndexes.GetRewardIndex(types.BondDenom)
 | 
				
			||||||
 | 
						suite.keeper.SetDelegatorRewardIndexes(suite.ctx, types.BondDenom, multiRewardIndex.RewardIndexes)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (suite *InitializeDelegatorRewardTests) TestClaimIndexesAreSetWhenClaimDoesNotExist() {
 | 
				
			||||||
	globalIndex := arbitraryDelegatorRewardIndexes
 | 
						globalIndex := arbitraryDelegatorRewardIndexes
 | 
				
			||||||
	suite.storeGlobalDelegatorIndexes(globalIndex)
 | 
						suite.storeGlobalDelegatorIndexes(globalIndex)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	delegator := arbitraryAddress()
 | 
						delegator := arbitraryAddress()
 | 
				
			||||||
	suite.keeper.InitializeHardDelegatorReward(suite.ctx, delegator)
 | 
						suite.keeper.InitializeDelegatorReward(suite.ctx, delegator)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	syncedClaim, f := suite.keeper.GetHardLiquidityProviderClaim(suite.ctx, delegator)
 | 
						syncedClaim, f := suite.keeper.GetDelegatorClaim(suite.ctx, delegator)
 | 
				
			||||||
	suite.True(f)
 | 
						suite.True(f)
 | 
				
			||||||
	suite.Equal(globalIndex, syncedClaim.DelegatorRewardIndexes)
 | 
						suite.Equal(globalIndex, syncedClaim.RewardIndexes)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (suite *InitializeHardDelegatorRewardTests) TestClaimIsSyncedAndIndexesAreSetWhenClaimDoesExist() {
 | 
					func (suite *InitializeDelegatorRewardTests) TestClaimIsSyncedAndIndexesAreSetWhenClaimDoesExist() {
 | 
				
			||||||
	validatorAddress := arbitraryValidatorAddress()
 | 
						validatorAddress := arbitraryValidatorAddress()
 | 
				
			||||||
	sk := fakeStakingKeeper{
 | 
						sk := fakeStakingKeeper{
 | 
				
			||||||
		delegations: stakingtypes.Delegations{{
 | 
							delegations: stakingtypes.Delegations{{
 | 
				
			||||||
@ -55,28 +61,28 @@ func (suite *InitializeHardDelegatorRewardTests) TestClaimIsSyncedAndIndexesAreS
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	suite.keeper = suite.NewKeeper(&fakeParamSubspace{}, nil, nil, nil, nil, sk, nil)
 | 
						suite.keeper = suite.NewKeeper(&fakeParamSubspace{}, nil, nil, nil, nil, sk, nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	claim := types.HardLiquidityProviderClaim{
 | 
						claim := types.DelegatorClaim{
 | 
				
			||||||
		BaseMultiClaim: types.BaseMultiClaim{
 | 
							BaseMultiClaim: types.BaseMultiClaim{
 | 
				
			||||||
			Owner: arbitraryAddress(),
 | 
								Owner: arbitraryAddress(),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		DelegatorRewardIndexes: arbitraryDelegatorRewardIndexes,
 | 
							RewardIndexes: arbitraryDelegatorRewardIndexes,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeDelegatorClaim(claim)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Set the global factor to a value different to one in claim so
 | 
						// Set the global factor to a value different to one in claim so
 | 
				
			||||||
	// we can detect if it is overwritten.
 | 
						// we can detect if it is overwritten.
 | 
				
			||||||
	rewardIndexes, _ := claim.DelegatorRewardIndexes.Get(types.BondDenom)
 | 
						rewardIndexes, _ := claim.RewardIndexes.Get(types.BondDenom)
 | 
				
			||||||
	globalIndexes := increaseRewardFactors(rewardIndexes)
 | 
						globalIndexes := increaseRewardFactors(rewardIndexes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Update the claim object with the new global factor
 | 
						// Update the claim object with the new global factor
 | 
				
			||||||
	bondIndex, _ := claim.DelegatorRewardIndexes.GetRewardIndexIndex(types.BondDenom)
 | 
						bondIndex, _ := claim.RewardIndexes.GetRewardIndexIndex(types.BondDenom)
 | 
				
			||||||
	claim.DelegatorRewardIndexes[bondIndex].RewardIndexes = globalIndexes
 | 
						claim.RewardIndexes[bondIndex].RewardIndexes = globalIndexes
 | 
				
			||||||
	suite.storeGlobalDelegatorIndexes(claim.DelegatorRewardIndexes)
 | 
						suite.storeGlobalDelegatorFactor(claim.RewardIndexes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	suite.keeper.InitializeHardDelegatorReward(suite.ctx, claim.Owner)
 | 
						suite.keeper.InitializeDelegatorReward(suite.ctx, claim.Owner)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	syncedClaim, _ := suite.keeper.GetHardLiquidityProviderClaim(suite.ctx, claim.Owner)
 | 
						syncedClaim, _ := suite.keeper.GetDelegatorClaim(suite.ctx, claim.Owner)
 | 
				
			||||||
	suite.Equal(globalIndexes, syncedClaim.DelegatorRewardIndexes[bondIndex].RewardIndexes)
 | 
						suite.Equal(globalIndexes, syncedClaim.RewardIndexes[bondIndex].RewardIndexes)
 | 
				
			||||||
	suite.Truef(syncedClaim.Reward.IsAllGT(claim.Reward), "'%s' not greater than '%s'", syncedClaim.Reward, claim.Reward)
 | 
						suite.Truef(syncedClaim.Reward.IsAllGT(claim.Reward), "'%s' not greater than '%s'", syncedClaim.Reward, claim.Reward)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -10,7 +10,7 @@ import (
 | 
				
			|||||||
	"github.com/kava-labs/kava/x/incentive/types"
 | 
						"github.com/kava-labs/kava/x/incentive/types"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SynchronizeHardDelegatorRewardTests runs unit tests for the keeper.SynchronizeHardDelegatorReward method
 | 
					// SynchronizeDelegatorRewardTests runs unit tests for the keeper.SynchronizeDelegatorReward method
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// inputs
 | 
					// inputs
 | 
				
			||||||
// - claim in store if it exists (only claim.DelegatorRewardIndexes and claim.Reward)
 | 
					// - claim in store if it exists (only claim.DelegatorRewardIndexes and claim.Reward)
 | 
				
			||||||
@ -20,64 +20,69 @@ import (
 | 
				
			|||||||
//
 | 
					//
 | 
				
			||||||
// outputs
 | 
					// outputs
 | 
				
			||||||
// - sets or creates a claim
 | 
					// - sets or creates a claim
 | 
				
			||||||
type SynchronizeHardDelegatorRewardTests struct {
 | 
					type SynchronizeDelegatorRewardTests struct {
 | 
				
			||||||
	unitTester
 | 
						unitTester
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestSynchronizeHardDelegatorReward(t *testing.T) {
 | 
					func TestSynchronizeDelegatorReward(t *testing.T) {
 | 
				
			||||||
	suite.Run(t, new(SynchronizeHardDelegatorRewardTests))
 | 
						suite.Run(t, new(SynchronizeDelegatorRewardTests))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (suite *SynchronizeHardDelegatorRewardTests) TestClaimIndexesAreUnchangedWhenGlobalFactorUnchanged() {
 | 
					func (suite *SynchronizeDelegatorRewardTests) storeGlobalDelegatorFactor(multiRewardIndexes types.MultiRewardIndexes) {
 | 
				
			||||||
 | 
						multiRewardIndex, _ := multiRewardIndexes.GetRewardIndex(types.BondDenom)
 | 
				
			||||||
 | 
						suite.keeper.SetDelegatorRewardIndexes(suite.ctx, types.BondDenom, multiRewardIndex.RewardIndexes)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (suite *SynchronizeDelegatorRewardTests) TestClaimIndexesAreUnchangedWhenGlobalFactorUnchanged() {
 | 
				
			||||||
	delegator := arbitraryAddress()
 | 
						delegator := arbitraryAddress()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	stakingKeeper := fakeStakingKeeper{} // use an empty staking keeper that returns no delegations
 | 
						stakingKeeper := fakeStakingKeeper{} // use an empty staking keeper that returns no delegations
 | 
				
			||||||
	suite.keeper = suite.NewKeeper(&fakeParamSubspace{}, nil, nil, nil, nil, stakingKeeper, nil)
 | 
						suite.keeper = suite.NewKeeper(&fakeParamSubspace{}, nil, nil, nil, nil, stakingKeeper, nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	claim := types.HardLiquidityProviderClaim{
 | 
						claim := types.DelegatorClaim{
 | 
				
			||||||
		BaseMultiClaim: types.BaseMultiClaim{
 | 
							BaseMultiClaim: types.BaseMultiClaim{
 | 
				
			||||||
			Owner: delegator,
 | 
								Owner: delegator,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		DelegatorRewardIndexes: arbitraryDelegatorRewardIndexes,
 | 
							RewardIndexes: arbitraryDelegatorRewardIndexes,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeDelegatorClaim(claim)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	suite.storeGlobalDelegatorIndexes(claim.DelegatorRewardIndexes)
 | 
						suite.storeGlobalDelegatorFactor(claim.RewardIndexes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	suite.keeper.SynchronizeHardDelegatorRewards(suite.ctx, claim.Owner, nil, false)
 | 
						suite.keeper.SynchronizeDelegatorRewards(suite.ctx, claim.Owner, nil, false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	syncedClaim, _ := suite.keeper.GetHardLiquidityProviderClaim(suite.ctx, claim.Owner)
 | 
						syncedClaim, _ := suite.keeper.GetDelegatorClaim(suite.ctx, claim.Owner)
 | 
				
			||||||
	suite.Equal(claim.DelegatorRewardIndexes, syncedClaim.DelegatorRewardIndexes)
 | 
						suite.Equal(claim.RewardIndexes, syncedClaim.RewardIndexes)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (suite *SynchronizeHardDelegatorRewardTests) TestClaimIndexesAreUpdatedWhenGlobalFactorIncreased() {
 | 
					func (suite *SynchronizeDelegatorRewardTests) TestClaimIndexesAreUpdatedWhenGlobalFactorIncreased() {
 | 
				
			||||||
	delegator := arbitraryAddress()
 | 
						delegator := arbitraryAddress()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	suite.keeper = suite.NewKeeper(&fakeParamSubspace{}, nil, nil, nil, nil, fakeStakingKeeper{}, nil)
 | 
						suite.keeper = suite.NewKeeper(&fakeParamSubspace{}, nil, nil, nil, nil, fakeStakingKeeper{}, nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	claim := types.HardLiquidityProviderClaim{
 | 
						claim := types.DelegatorClaim{
 | 
				
			||||||
		BaseMultiClaim: types.BaseMultiClaim{
 | 
							BaseMultiClaim: types.BaseMultiClaim{
 | 
				
			||||||
			Owner: delegator,
 | 
								Owner: delegator,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		DelegatorRewardIndexes: arbitraryDelegatorRewardIndexes,
 | 
							RewardIndexes: arbitraryDelegatorRewardIndexes,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeDelegatorClaim(claim)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rewardIndexes, _ := claim.DelegatorRewardIndexes.Get(types.BondDenom)
 | 
						rewardIndexes, _ := claim.RewardIndexes.Get(types.BondDenom)
 | 
				
			||||||
	globalIndexes := increaseRewardFactors(rewardIndexes)
 | 
						globalIndexes := increaseRewardFactors(rewardIndexes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Update the claim object with the new global factor
 | 
						// Update the claim object with the new global factor
 | 
				
			||||||
	bondIndex, _ := claim.DelegatorRewardIndexes.GetRewardIndexIndex(types.BondDenom)
 | 
						bondIndex, _ := claim.RewardIndexes.GetRewardIndexIndex(types.BondDenom)
 | 
				
			||||||
	claim.DelegatorRewardIndexes[bondIndex].RewardIndexes = globalIndexes
 | 
						claim.RewardIndexes[bondIndex].RewardIndexes = globalIndexes
 | 
				
			||||||
	suite.storeGlobalDelegatorIndexes(claim.DelegatorRewardIndexes)
 | 
						suite.storeGlobalDelegatorFactor(claim.RewardIndexes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	suite.keeper.SynchronizeHardDelegatorRewards(suite.ctx, claim.Owner, nil, false)
 | 
						suite.keeper.SynchronizeDelegatorRewards(suite.ctx, claim.Owner, nil, false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	syncedClaim, _ := suite.keeper.GetHardLiquidityProviderClaim(suite.ctx, claim.Owner)
 | 
						syncedClaim, _ := suite.keeper.GetDelegatorClaim(suite.ctx, claim.Owner)
 | 
				
			||||||
	suite.Equal(globalIndexes, syncedClaim.DelegatorRewardIndexes[bondIndex].RewardIndexes)
 | 
						suite.Equal(globalIndexes, syncedClaim.RewardIndexes[bondIndex].RewardIndexes)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (suite *SynchronizeHardDelegatorRewardTests) TestRewardIsUnchangedWhenGlobalFactorUnchanged() {
 | 
					func (suite *SynchronizeDelegatorRewardTests) TestRewardIsUnchangedWhenGlobalFactorUnchanged() {
 | 
				
			||||||
	delegator := arbitraryAddress()
 | 
						delegator := arbitraryAddress()
 | 
				
			||||||
	validatorAddress := arbitraryValidatorAddress()
 | 
						validatorAddress := arbitraryValidatorAddress()
 | 
				
			||||||
	stakingKeeper := fakeStakingKeeper{
 | 
						stakingKeeper := fakeStakingKeeper{
 | 
				
			||||||
@ -94,12 +99,12 @@ func (suite *SynchronizeHardDelegatorRewardTests) TestRewardIsUnchangedWhenGloba
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	suite.keeper = suite.NewKeeper(&fakeParamSubspace{}, nil, nil, nil, nil, stakingKeeper, nil)
 | 
						suite.keeper = suite.NewKeeper(&fakeParamSubspace{}, nil, nil, nil, nil, stakingKeeper, nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	claim := types.HardLiquidityProviderClaim{
 | 
						claim := types.DelegatorClaim{
 | 
				
			||||||
		BaseMultiClaim: types.BaseMultiClaim{
 | 
							BaseMultiClaim: types.BaseMultiClaim{
 | 
				
			||||||
			Owner:  delegator,
 | 
								Owner:  delegator,
 | 
				
			||||||
			Reward: arbitraryCoins(),
 | 
								Reward: arbitraryCoins(),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		DelegatorRewardIndexes: types.MultiRewardIndexes{{
 | 
							RewardIndexes: types.MultiRewardIndexes{{
 | 
				
			||||||
			CollateralType: types.BondDenom,
 | 
								CollateralType: types.BondDenom,
 | 
				
			||||||
			RewardIndexes: types.RewardIndexes{
 | 
								RewardIndexes: types.RewardIndexes{
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
@ -111,18 +116,18 @@ func (suite *SynchronizeHardDelegatorRewardTests) TestRewardIsUnchangedWhenGloba
 | 
				
			|||||||
			},
 | 
								},
 | 
				
			||||||
		}},
 | 
							}},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeDelegatorClaim(claim)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	suite.storeGlobalDelegatorIndexes(claim.DelegatorRewardIndexes)
 | 
						suite.storeGlobalDelegatorFactor(claim.RewardIndexes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	suite.keeper.SynchronizeHardDelegatorRewards(suite.ctx, claim.Owner, nil, false)
 | 
						suite.keeper.SynchronizeDelegatorRewards(suite.ctx, claim.Owner, nil, false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	syncedClaim, _ := suite.keeper.GetHardLiquidityProviderClaim(suite.ctx, claim.Owner)
 | 
						syncedClaim, _ := suite.keeper.GetDelegatorClaim(suite.ctx, claim.Owner)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	suite.Equal(claim.Reward, syncedClaim.Reward)
 | 
						suite.Equal(claim.Reward, syncedClaim.Reward)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (suite *SynchronizeHardDelegatorRewardTests) TestRewardIsIncreasedWhenNewRewardAdded() {
 | 
					func (suite *SynchronizeDelegatorRewardTests) TestRewardIsIncreasedWhenNewRewardAdded() {
 | 
				
			||||||
	delegator := arbitraryAddress()
 | 
						delegator := arbitraryAddress()
 | 
				
			||||||
	validatorAddress := arbitraryValidatorAddress()
 | 
						validatorAddress := arbitraryValidatorAddress()
 | 
				
			||||||
	stakingKeeper := fakeStakingKeeper{
 | 
						stakingKeeper := fakeStakingKeeper{
 | 
				
			||||||
@ -139,14 +144,14 @@ func (suite *SynchronizeHardDelegatorRewardTests) TestRewardIsIncreasedWhenNewRe
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	suite.keeper = suite.NewKeeper(&fakeParamSubspace{}, nil, nil, nil, nil, stakingKeeper, nil)
 | 
						suite.keeper = suite.NewKeeper(&fakeParamSubspace{}, nil, nil, nil, nil, stakingKeeper, nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	claim := types.HardLiquidityProviderClaim{
 | 
						claim := types.DelegatorClaim{
 | 
				
			||||||
		BaseMultiClaim: types.BaseMultiClaim{
 | 
							BaseMultiClaim: types.BaseMultiClaim{
 | 
				
			||||||
			Owner:  delegator,
 | 
								Owner:  delegator,
 | 
				
			||||||
			Reward: arbitraryCoins(),
 | 
								Reward: arbitraryCoins(),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		DelegatorRewardIndexes: types.MultiRewardIndexes{},
 | 
							RewardIndexes: types.MultiRewardIndexes{},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeDelegatorClaim(claim)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	newGlobalIndexes := types.MultiRewardIndexes{{
 | 
						newGlobalIndexes := types.MultiRewardIndexes{{
 | 
				
			||||||
		CollateralType: types.BondDenom,
 | 
							CollateralType: types.BondDenom,
 | 
				
			||||||
@ -161,11 +166,11 @@ func (suite *SynchronizeHardDelegatorRewardTests) TestRewardIsIncreasedWhenNewRe
 | 
				
			|||||||
	}}
 | 
						}}
 | 
				
			||||||
	suite.storeGlobalDelegatorIndexes(newGlobalIndexes)
 | 
						suite.storeGlobalDelegatorIndexes(newGlobalIndexes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	suite.keeper.SynchronizeHardDelegatorRewards(suite.ctx, claim.Owner, nil, false)
 | 
						suite.keeper.SynchronizeDelegatorRewards(suite.ctx, claim.Owner, nil, false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	syncedClaim, _ := suite.keeper.GetHardLiquidityProviderClaim(suite.ctx, claim.Owner)
 | 
						syncedClaim, _ := suite.keeper.GetDelegatorClaim(suite.ctx, claim.Owner)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	suite.Equal(newGlobalIndexes, syncedClaim.DelegatorRewardIndexes)
 | 
						suite.Equal(newGlobalIndexes, syncedClaim.RewardIndexes)
 | 
				
			||||||
	suite.Equal(
 | 
						suite.Equal(
 | 
				
			||||||
		cs(
 | 
							cs(
 | 
				
			||||||
			c(types.HardLiquidityRewardDenom, 100),
 | 
								c(types.HardLiquidityRewardDenom, 100),
 | 
				
			||||||
@ -175,7 +180,7 @@ func (suite *SynchronizeHardDelegatorRewardTests) TestRewardIsIncreasedWhenNewRe
 | 
				
			|||||||
	)
 | 
						)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (suite *SynchronizeHardDelegatorRewardTests) TestRewardIsIncreasedWhenGlobalFactorIncreased() {
 | 
					func (suite *SynchronizeDelegatorRewardTests) TestRewardIsIncreasedWhenGlobalFactorIncreased() {
 | 
				
			||||||
	delegator := arbitraryAddress()
 | 
						delegator := arbitraryAddress()
 | 
				
			||||||
	validatorAddress := arbitraryValidatorAddress()
 | 
						validatorAddress := arbitraryValidatorAddress()
 | 
				
			||||||
	stakingKeeper := fakeStakingKeeper{
 | 
						stakingKeeper := fakeStakingKeeper{
 | 
				
			||||||
@ -192,12 +197,12 @@ func (suite *SynchronizeHardDelegatorRewardTests) TestRewardIsIncreasedWhenGloba
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	suite.keeper = suite.NewKeeper(&fakeParamSubspace{}, nil, nil, nil, nil, stakingKeeper, nil)
 | 
						suite.keeper = suite.NewKeeper(&fakeParamSubspace{}, nil, nil, nil, nil, stakingKeeper, nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	claim := types.HardLiquidityProviderClaim{
 | 
						claim := types.DelegatorClaim{
 | 
				
			||||||
		BaseMultiClaim: types.BaseMultiClaim{
 | 
							BaseMultiClaim: types.BaseMultiClaim{
 | 
				
			||||||
			Owner:  delegator,
 | 
								Owner:  delegator,
 | 
				
			||||||
			Reward: arbitraryCoins(),
 | 
								Reward: arbitraryCoins(),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		DelegatorRewardIndexes: types.MultiRewardIndexes{{
 | 
							RewardIndexes: types.MultiRewardIndexes{{
 | 
				
			||||||
			CollateralType: types.BondDenom,
 | 
								CollateralType: types.BondDenom,
 | 
				
			||||||
			RewardIndexes: types.RewardIndexes{
 | 
								RewardIndexes: types.RewardIndexes{
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
@ -209,7 +214,7 @@ func (suite *SynchronizeHardDelegatorRewardTests) TestRewardIsIncreasedWhenGloba
 | 
				
			|||||||
			},
 | 
								},
 | 
				
			||||||
		}},
 | 
							}},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeDelegatorClaim(claim)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	suite.storeGlobalDelegatorIndexes(
 | 
						suite.storeGlobalDelegatorIndexes(
 | 
				
			||||||
		types.MultiRewardIndexes{
 | 
							types.MultiRewardIndexes{
 | 
				
			||||||
@ -227,9 +232,9 @@ func (suite *SynchronizeHardDelegatorRewardTests) TestRewardIsIncreasedWhenGloba
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	suite.keeper.SynchronizeHardDelegatorRewards(suite.ctx, claim.Owner, nil, false)
 | 
						suite.keeper.SynchronizeDelegatorRewards(suite.ctx, claim.Owner, nil, false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	syncedClaim, _ := suite.keeper.GetHardLiquidityProviderClaim(suite.ctx, claim.Owner)
 | 
						syncedClaim, _ := suite.keeper.GetDelegatorClaim(suite.ctx, claim.Owner)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	suite.Equal(
 | 
						suite.Equal(
 | 
				
			||||||
		cs(
 | 
							cs(
 | 
				
			||||||
@ -263,7 +268,7 @@ func unslashedNotBondedValidator(address sdk.ValAddress) stakingtypes.Validator
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (suite *SynchronizeHardDelegatorRewardTests) TestGetDelegatedWhenValAddrIsNil() {
 | 
					func (suite *SynchronizeDelegatorRewardTests) TestGetDelegatedWhenValAddrIsNil() {
 | 
				
			||||||
	// when valAddr is nil, get total delegated to bonded validators
 | 
						// when valAddr is nil, get total delegated to bonded validators
 | 
				
			||||||
	delegator := arbitraryAddress()
 | 
						delegator := arbitraryAddress()
 | 
				
			||||||
	validatorAddresses := generateValidatorAddresses(4)
 | 
						validatorAddresses := generateValidatorAddresses(4)
 | 
				
			||||||
@ -306,7 +311,7 @@ func (suite *SynchronizeHardDelegatorRewardTests) TestGetDelegatedWhenValAddrIsN
 | 
				
			|||||||
		suite.keeper.GetTotalDelegated(suite.ctx, delegator, nil, false),
 | 
							suite.keeper.GetTotalDelegated(suite.ctx, delegator, nil, false),
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func (suite *SynchronizeHardDelegatorRewardTests) TestGetDelegatedWhenExcludingAValidator() {
 | 
					func (suite *SynchronizeDelegatorRewardTests) TestGetDelegatedWhenExcludingAValidator() {
 | 
				
			||||||
	// when valAddr is x, get total delegated to bonded validators excluding those to x
 | 
						// when valAddr is x, get total delegated to bonded validators excluding those to x
 | 
				
			||||||
	delegator := arbitraryAddress()
 | 
						delegator := arbitraryAddress()
 | 
				
			||||||
	validatorAddresses := generateValidatorAddresses(4)
 | 
						validatorAddresses := generateValidatorAddresses(4)
 | 
				
			||||||
@ -349,7 +354,7 @@ func (suite *SynchronizeHardDelegatorRewardTests) TestGetDelegatedWhenExcludingA
 | 
				
			|||||||
		suite.keeper.GetTotalDelegated(suite.ctx, delegator, validatorAddresses[0], false),
 | 
							suite.keeper.GetTotalDelegated(suite.ctx, delegator, validatorAddresses[0], false),
 | 
				
			||||||
	)
 | 
						)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func (suite *SynchronizeHardDelegatorRewardTests) TestGetDelegatedWhenIncludingAValidator() {
 | 
					func (suite *SynchronizeDelegatorRewardTests) TestGetDelegatedWhenIncludingAValidator() {
 | 
				
			||||||
	// when valAddr is x, get total delegated to bonded validators including those to x
 | 
						// when valAddr is x, get total delegated to bonded validators including those to x
 | 
				
			||||||
	delegator := arbitraryAddress()
 | 
						delegator := arbitraryAddress()
 | 
				
			||||||
	validatorAddresses := generateValidatorAddresses(4)
 | 
						validatorAddresses := generateValidatorAddresses(4)
 | 
				
			||||||
 | 
				
			|||||||
@ -64,7 +64,7 @@ func (suite *DelegatorRewardsTestSuite) SetupWithGenState(authBuilder app.AuthGe
 | 
				
			|||||||
	)
 | 
						)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (suite *DelegatorRewardsTestSuite) TestAccumulateHardDelegatorRewards() {
 | 
					func (suite *DelegatorRewardsTestSuite) TestAccumulateDelegatorRewards() {
 | 
				
			||||||
	type args struct {
 | 
						type args struct {
 | 
				
			||||||
		delegation            sdk.Coin
 | 
							delegation            sdk.Coin
 | 
				
			||||||
		rewardsPerSecond      sdk.Coins
 | 
							rewardsPerSecond      sdk.Coins
 | 
				
			||||||
@ -145,18 +145,18 @@ func (suite *DelegatorRewardsTestSuite) TestAccumulateHardDelegatorRewards() {
 | 
				
			|||||||
			runAtTime := suite.ctx.BlockTime().Add(time.Duration(int(time.Second) * tc.args.timeElapsed))
 | 
								runAtTime := suite.ctx.BlockTime().Add(time.Duration(int(time.Second) * tc.args.timeElapsed))
 | 
				
			||||||
			runCtx := suite.ctx.WithBlockTime(runAtTime)
 | 
								runCtx := suite.ctx.WithBlockTime(runAtTime)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			rewardPeriods, found := suite.keeper.GetHardDelegatorRewardPeriods(runCtx, tc.args.delegation.Denom)
 | 
								rewardPeriods, found := suite.keeper.GetDelegatorRewardPeriods(runCtx, tc.args.delegation.Denom)
 | 
				
			||||||
			suite.Require().True(found)
 | 
								suite.Require().True(found)
 | 
				
			||||||
			err = suite.keeper.AccumulateHardDelegatorRewards(runCtx, rewardPeriods)
 | 
								err = suite.keeper.AccumulateDelegatorRewards(runCtx, rewardPeriods)
 | 
				
			||||||
			suite.Require().NoError(err)
 | 
								suite.Require().NoError(err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			rewardIndexes, _ := suite.keeper.GetHardDelegatorRewardIndexes(runCtx, tc.args.delegation.Denom)
 | 
								rewardIndexes, _ := suite.keeper.GetDelegatorRewardIndexes(runCtx, tc.args.delegation.Denom)
 | 
				
			||||||
			suite.Require().Equal(tc.args.expectedRewardIndexes, rewardIndexes)
 | 
								suite.Require().Equal(tc.args.expectedRewardIndexes, rewardIndexes)
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (suite *DelegatorRewardsTestSuite) TestSynchronizeHardDelegatorReward() {
 | 
					func (suite *DelegatorRewardsTestSuite) TestSynchronizeDelegatorReward() {
 | 
				
			||||||
	type args struct {
 | 
						type args struct {
 | 
				
			||||||
		delegation            sdk.Coin
 | 
							delegation            sdk.Coin
 | 
				
			||||||
		rewardsPerSecond      sdk.Coins
 | 
							rewardsPerSecond      sdk.Coins
 | 
				
			||||||
@ -249,10 +249,10 @@ func (suite *DelegatorRewardsTestSuite) TestSynchronizeHardDelegatorReward() {
 | 
				
			|||||||
			suite.Require().Equal(valAcc.Status, sdk.Bonded)
 | 
								suite.Require().Equal(valAcc.Status, sdk.Bonded)
 | 
				
			||||||
			suite.Require().Equal(valAcc.Tokens, tc.args.delegation.Amount.Add(selfDelegationCoins.Amount))
 | 
								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 DelegatorClaim
 | 
				
			||||||
			claim, found := suite.keeper.GetHardLiquidityProviderClaim(suite.ctx, suite.addrs[0])
 | 
								claim, found := suite.keeper.GetDelegatorClaim(suite.ctx, suite.addrs[0])
 | 
				
			||||||
			suite.Require().True(found)
 | 
								suite.Require().True(found)
 | 
				
			||||||
			for _, rewardIndex := range claim.DelegatorRewardIndexes[0].RewardIndexes {
 | 
								for _, rewardIndex := range claim.RewardIndexes[0].RewardIndexes {
 | 
				
			||||||
				suite.Require().Equal(sdk.ZeroDec(), rewardIndex.RewardFactor)
 | 
									suite.Require().Equal(sdk.ZeroDec(), rewardIndex.RewardFactor)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -265,10 +265,10 @@ func (suite *DelegatorRewardsTestSuite) TestSynchronizeHardDelegatorReward() {
 | 
				
			|||||||
				previousBlockTime = updatedBlockTime
 | 
									previousBlockTime = updatedBlockTime
 | 
				
			||||||
				blockCtx := suite.ctx.WithBlockTime(updatedBlockTime)
 | 
									blockCtx := suite.ctx.WithBlockTime(updatedBlockTime)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				rewardPeriods, found := suite.keeper.GetHardDelegatorRewardPeriods(blockCtx, tc.args.delegation.Denom)
 | 
									rewardPeriods, found := suite.keeper.GetDelegatorRewardPeriods(blockCtx, tc.args.delegation.Denom)
 | 
				
			||||||
				suite.Require().True(found)
 | 
									suite.Require().True(found)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				err := suite.keeper.AccumulateHardDelegatorRewards(blockCtx, rewardPeriods)
 | 
									err := suite.keeper.AccumulateDelegatorRewards(blockCtx, rewardPeriods)
 | 
				
			||||||
				suite.Require().NoError(err)
 | 
									suite.Require().NoError(err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			updatedBlockTime := suite.ctx.BlockTime().Add(time.Duration(int(time.Second) * timeElapsed))
 | 
								updatedBlockTime := suite.ctx.BlockTime().Add(time.Duration(int(time.Second) * timeElapsed))
 | 
				
			||||||
@ -276,19 +276,19 @@ func (suite *DelegatorRewardsTestSuite) TestSynchronizeHardDelegatorReward() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			// After we've accumulated, run synchronize
 | 
								// After we've accumulated, run synchronize
 | 
				
			||||||
			suite.Require().NotPanics(func() {
 | 
								suite.Require().NotPanics(func() {
 | 
				
			||||||
				suite.keeper.SynchronizeHardDelegatorRewards(suite.ctx, suite.addrs[0], nil, false)
 | 
									suite.keeper.SynchronizeDelegatorRewards(suite.ctx, suite.addrs[0], nil, false)
 | 
				
			||||||
			})
 | 
								})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Check that reward factor and claim have been updated as expected
 | 
								// Check that reward factor and claim have been updated as expected
 | 
				
			||||||
			rewardIndexes, _ := suite.keeper.GetHardDelegatorRewardIndexes(suite.ctx, tc.args.delegation.Denom)
 | 
								rewardIndexes, _ := suite.keeper.GetDelegatorRewardIndexes(suite.ctx, tc.args.delegation.Denom)
 | 
				
			||||||
			for i, rewardPerSecond := range tc.args.rewardsPerSecond {
 | 
								for i, rewardPerSecond := range tc.args.rewardsPerSecond {
 | 
				
			||||||
				rewardFactor, _ := rewardIndexes.Get(rewardPerSecond.Denom)
 | 
									rewardFactor, _ := rewardIndexes.Get(rewardPerSecond.Denom)
 | 
				
			||||||
				suite.Require().Equal(tc.args.expectedRewardIndexes[i].RewardFactor, rewardFactor)
 | 
									suite.Require().Equal(tc.args.expectedRewardIndexes[i].RewardFactor, rewardFactor)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			claim, found = suite.keeper.GetHardLiquidityProviderClaim(suite.ctx, suite.addrs[0])
 | 
								claim, found = suite.keeper.GetDelegatorClaim(suite.ctx, suite.addrs[0])
 | 
				
			||||||
			suite.Require().True(found)
 | 
								suite.Require().True(found)
 | 
				
			||||||
			for i, delegatorRewardIndex := range claim.DelegatorRewardIndexes[0].RewardIndexes {
 | 
								for i, delegatorRewardIndex := range claim.RewardIndexes[0].RewardIndexes {
 | 
				
			||||||
				suite.Require().Equal(tc.args.expectedRewardIndexes[i].RewardFactor, delegatorRewardIndex.RewardFactor)
 | 
									suite.Require().Equal(tc.args.expectedRewardIndexes[i].RewardFactor, delegatorRewardIndex.RewardFactor)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			suite.Require().Equal(tc.args.expectedRewards, claim.Reward)
 | 
								suite.Require().Equal(tc.args.expectedRewards, claim.Reward)
 | 
				
			||||||
@ -296,7 +296,7 @@ func (suite *DelegatorRewardsTestSuite) TestSynchronizeHardDelegatorReward() {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (suite *DelegatorRewardsTestSuite) TestSimulateHardDelegatorRewardSynchronization() {
 | 
					func (suite *DelegatorRewardsTestSuite) TestSimulateDelegatorRewardSynchronization() {
 | 
				
			||||||
	type args struct {
 | 
						type args struct {
 | 
				
			||||||
		delegation            sdk.Coin
 | 
							delegation            sdk.Coin
 | 
				
			||||||
		rewardsPerSecond      sdk.Coins
 | 
							rewardsPerSecond      sdk.Coins
 | 
				
			||||||
@ -365,10 +365,10 @@ func (suite *DelegatorRewardsTestSuite) TestSimulateHardDelegatorRewardSynchroni
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			staking.EndBlocker(suite.ctx, suite.stakingKeeper)
 | 
								staking.EndBlocker(suite.ctx, suite.stakingKeeper)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Check that Staking hooks initialized a HardLiquidityProviderClaim
 | 
								// Check that Staking hooks initialized a DelegatorClaim
 | 
				
			||||||
			claim, found := suite.keeper.GetHardLiquidityProviderClaim(suite.ctx, suite.addrs[0])
 | 
								claim, found := suite.keeper.GetDelegatorClaim(suite.ctx, suite.addrs[0])
 | 
				
			||||||
			suite.Require().True(found)
 | 
								suite.Require().True(found)
 | 
				
			||||||
			for _, rewardIndex := range claim.DelegatorRewardIndexes[0].RewardIndexes {
 | 
								for _, rewardIndex := range claim.RewardIndexes[0].RewardIndexes {
 | 
				
			||||||
				suite.Require().Equal(sdk.ZeroDec(), rewardIndex.RewardFactor)
 | 
									suite.Require().Equal(sdk.ZeroDec(), rewardIndex.RewardFactor)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -381,21 +381,21 @@ func (suite *DelegatorRewardsTestSuite) TestSimulateHardDelegatorRewardSynchroni
 | 
				
			|||||||
				previousBlockTime = updatedBlockTime
 | 
									previousBlockTime = updatedBlockTime
 | 
				
			||||||
				blockCtx := suite.ctx.WithBlockTime(updatedBlockTime)
 | 
									blockCtx := suite.ctx.WithBlockTime(updatedBlockTime)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				// Accumulate hard delegator rewards
 | 
									// Accumulate delegator rewards
 | 
				
			||||||
				rewardPeriods, found := suite.keeper.GetHardDelegatorRewardPeriods(blockCtx, tc.args.delegation.Denom)
 | 
									rewardPeriods, found := suite.keeper.GetDelegatorRewardPeriods(blockCtx, tc.args.delegation.Denom)
 | 
				
			||||||
				suite.Require().True(found)
 | 
									suite.Require().True(found)
 | 
				
			||||||
				err := suite.keeper.AccumulateHardDelegatorRewards(blockCtx, rewardPeriods)
 | 
									err := suite.keeper.AccumulateDelegatorRewards(blockCtx, rewardPeriods)
 | 
				
			||||||
				suite.Require().NoError(err)
 | 
									suite.Require().NoError(err)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			updatedBlockTime := suite.ctx.BlockTime().Add(time.Duration(int(time.Second) * timeElapsed))
 | 
								updatedBlockTime := suite.ctx.BlockTime().Add(time.Duration(int(time.Second) * timeElapsed))
 | 
				
			||||||
			suite.ctx = suite.ctx.WithBlockTime(updatedBlockTime)
 | 
								suite.ctx = suite.ctx.WithBlockTime(updatedBlockTime)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Check that the synced claim held in memory has properly simulated syncing
 | 
								// Check that the synced claim held in memory has properly simulated syncing
 | 
				
			||||||
			syncedClaim := suite.keeper.SimulateHardSynchronization(suite.ctx, claim)
 | 
								syncedClaim := suite.keeper.SimulateDelegatorSynchronization(suite.ctx, claim)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			for i, expectedRewardIndex := range tc.args.expectedRewardIndexes {
 | 
								for i, expectedRewardIndex := range tc.args.expectedRewardIndexes {
 | 
				
			||||||
				// Check that the user's claim's reward index matches the expected reward index
 | 
									// Check that the user's claim's reward index matches the expected reward index
 | 
				
			||||||
				multiRewardIndex, found := syncedClaim.DelegatorRewardIndexes.Get(types.BondDenom)
 | 
									multiRewardIndex, found := syncedClaim.RewardIndexes.Get(types.BondDenom)
 | 
				
			||||||
				suite.Require().True(found)
 | 
									suite.Require().True(found)
 | 
				
			||||||
				suite.Require().Equal(expectedRewardIndex, multiRewardIndex[i])
 | 
									suite.Require().Equal(expectedRewardIndex, multiRewardIndex[i])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -503,14 +503,14 @@ func (suite *DelegatorRewardsTestSuite) TestUnbondingValidatorSyncsClaim() {
 | 
				
			|||||||
	// but don't start the next block as it will accumulate delegator rewards and we won't be able to tell if the user's reward was synced.
 | 
						// but don't start the next block as it will accumulate delegator rewards and we won't be able to tell if the user's reward was synced.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Check that the user's claim has been synced. ie rewards added, index updated
 | 
						// Check that the user's claim has been synced. ie rewards added, index updated
 | 
				
			||||||
	claim, found := suite.keeper.GetHardLiquidityProviderClaim(suite.ctx, suite.addrs[0])
 | 
						claim, found := suite.keeper.GetDelegatorClaim(suite.ctx, suite.addrs[0])
 | 
				
			||||||
	suite.Require().True(found)
 | 
						suite.Require().True(found)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rewardIndexes, found := suite.keeper.GetHardDelegatorRewardIndexes(suite.ctx, bondDenom)
 | 
						rewardIndexes, found := suite.keeper.GetDelegatorRewardIndexes(suite.ctx, bondDenom)
 | 
				
			||||||
	suite.Require().True(found)
 | 
						suite.Require().True(found)
 | 
				
			||||||
	globalIndex, found := rewardIndexes.Get(rewardsPerSecond[0].Denom)
 | 
						globalIndex, found := rewardIndexes.Get(rewardsPerSecond[0].Denom)
 | 
				
			||||||
	suite.Require().True(found)
 | 
						suite.Require().True(found)
 | 
				
			||||||
	claimIndex, found := claim.DelegatorRewardIndexes.GetRewardIndex(bondDenom)
 | 
						claimIndex, found := claim.RewardIndexes.GetRewardIndex(bondDenom)
 | 
				
			||||||
	suite.Require().True(found)
 | 
						suite.Require().True(found)
 | 
				
			||||||
	suite.Require().Equal(globalIndex, claimIndex.RewardIndexes[0].RewardFactor)
 | 
						suite.Require().Equal(globalIndex, claimIndex.RewardIndexes[0].RewardFactor)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -523,17 +523,17 @@ func (suite *DelegatorRewardsTestSuite) TestUnbondingValidatorSyncsClaim() {
 | 
				
			|||||||
	suite.ctx = suite.ctx.WithBlockTime(suite.genesisTime.Add(3 * blockDuration))
 | 
						suite.ctx = suite.ctx.WithBlockTime(suite.genesisTime.Add(3 * blockDuration))
 | 
				
			||||||
	_ = suite.app.BeginBlocker(suite.ctx, abci.RequestBeginBlock{})
 | 
						_ = suite.app.BeginBlocker(suite.ctx, abci.RequestBeginBlock{})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	suite.keeper.SynchronizeHardDelegatorRewards(suite.ctx, suite.addrs[0], nil, false)
 | 
						suite.keeper.SynchronizeDelegatorRewards(suite.ctx, suite.addrs[0], nil, false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// rewards are the same as before
 | 
						// rewards are the same as before
 | 
				
			||||||
	laterClaim, found := suite.keeper.GetHardLiquidityProviderClaim(suite.ctx, suite.addrs[0])
 | 
						laterClaim, found := suite.keeper.GetDelegatorClaim(suite.ctx, suite.addrs[0])
 | 
				
			||||||
	suite.Require().True(found)
 | 
						suite.Require().True(found)
 | 
				
			||||||
	suite.Require().Equal(claim.Reward, laterClaim.Reward)
 | 
						suite.Require().Equal(claim.Reward, laterClaim.Reward)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// claim index has been updated to latest global value
 | 
						// claim index has been updated to latest global value
 | 
				
			||||||
	laterClaimIndex, found := laterClaim.DelegatorRewardIndexes.GetRewardIndex(bondDenom)
 | 
						laterClaimIndex, found := laterClaim.RewardIndexes.GetRewardIndex(bondDenom)
 | 
				
			||||||
	suite.Require().True(found)
 | 
						suite.Require().True(found)
 | 
				
			||||||
	rewardIndexes, found = suite.keeper.GetHardDelegatorRewardIndexes(suite.ctx, bondDenom)
 | 
						rewardIndexes, found = suite.keeper.GetDelegatorRewardIndexes(suite.ctx, bondDenom)
 | 
				
			||||||
	suite.Require().True(found)
 | 
						suite.Require().True(found)
 | 
				
			||||||
	globalIndex, found = rewardIndexes.Get(rewardsPerSecond[0].Denom)
 | 
						globalIndex, found = rewardIndexes.Get(rewardsPerSecond[0].Denom)
 | 
				
			||||||
	suite.Require().True(found)
 | 
						suite.Require().True(found)
 | 
				
			||||||
@ -597,14 +597,14 @@ func (suite *DelegatorRewardsTestSuite) TestBondingValidatorSyncsClaim() {
 | 
				
			|||||||
	// but don't start the next block as it will accumulate delegator rewards and we won't be able to tell if the user's reward was synced.
 | 
						// but don't start the next block as it will accumulate delegator rewards and we won't be able to tell if the user's reward was synced.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Check that the user's claim has been synced. ie rewards added, index updated
 | 
						// Check that the user's claim has been synced. ie rewards added, index updated
 | 
				
			||||||
	claim, found := suite.keeper.GetHardLiquidityProviderClaim(suite.ctx, suite.addrs[0])
 | 
						claim, found := suite.keeper.GetDelegatorClaim(suite.ctx, suite.addrs[0])
 | 
				
			||||||
	suite.Require().True(found)
 | 
						suite.Require().True(found)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rewardIndexes, found := suite.keeper.GetHardDelegatorRewardIndexes(suite.ctx, bondDenom)
 | 
						rewardIndexes, found := suite.keeper.GetDelegatorRewardIndexes(suite.ctx, bondDenom)
 | 
				
			||||||
	suite.Require().True(found)
 | 
						suite.Require().True(found)
 | 
				
			||||||
	globalIndex, found := rewardIndexes.Get(rewardsPerSecond[0].Denom)
 | 
						globalIndex, found := rewardIndexes.Get(rewardsPerSecond[0].Denom)
 | 
				
			||||||
	suite.Require().True(found)
 | 
						suite.Require().True(found)
 | 
				
			||||||
	claimIndex, found := claim.DelegatorRewardIndexes.GetRewardIndex(bondDenom)
 | 
						claimIndex, found := claim.RewardIndexes.GetRewardIndex(bondDenom)
 | 
				
			||||||
	suite.Require().True(found)
 | 
						suite.Require().True(found)
 | 
				
			||||||
	suite.Require().Equal(globalIndex, claimIndex.RewardIndexes[0].RewardFactor)
 | 
						suite.Require().Equal(globalIndex, claimIndex.RewardIndexes[0].RewardFactor)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -617,17 +617,17 @@ func (suite *DelegatorRewardsTestSuite) TestBondingValidatorSyncsClaim() {
 | 
				
			|||||||
	suite.ctx = suite.ctx.WithBlockTime(suite.genesisTime.Add(3 * blockDuration))
 | 
						suite.ctx = suite.ctx.WithBlockTime(suite.genesisTime.Add(3 * blockDuration))
 | 
				
			||||||
	_ = suite.app.BeginBlocker(suite.ctx, abci.RequestBeginBlock{})
 | 
						_ = suite.app.BeginBlocker(suite.ctx, abci.RequestBeginBlock{})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	suite.keeper.SynchronizeHardDelegatorRewards(suite.ctx, suite.addrs[0], nil, false)
 | 
						suite.keeper.SynchronizeDelegatorRewards(suite.ctx, suite.addrs[0], nil, false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// rewards are greater than before
 | 
						// rewards are greater than before
 | 
				
			||||||
	laterClaim, found := suite.keeper.GetHardLiquidityProviderClaim(suite.ctx, suite.addrs[0])
 | 
						laterClaim, found := suite.keeper.GetDelegatorClaim(suite.ctx, suite.addrs[0])
 | 
				
			||||||
	suite.Require().True(found)
 | 
						suite.Require().True(found)
 | 
				
			||||||
	suite.Require().True(laterClaim.Reward.IsAllGT(claim.Reward))
 | 
						suite.Require().True(laterClaim.Reward.IsAllGT(claim.Reward))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// claim index has been updated to latest global value
 | 
						// claim index has been updated to latest global value
 | 
				
			||||||
	laterClaimIndex, found := laterClaim.DelegatorRewardIndexes.GetRewardIndex(bondDenom)
 | 
						laterClaimIndex, found := laterClaim.RewardIndexes.GetRewardIndex(bondDenom)
 | 
				
			||||||
	suite.Require().True(found)
 | 
						suite.Require().True(found)
 | 
				
			||||||
	rewardIndexes, found = suite.keeper.GetHardDelegatorRewardIndexes(suite.ctx, bondDenom)
 | 
						rewardIndexes, found = suite.keeper.GetDelegatorRewardIndexes(suite.ctx, bondDenom)
 | 
				
			||||||
	suite.Require().True(found)
 | 
						suite.Require().True(found)
 | 
				
			||||||
	globalIndex, found = rewardIndexes.Get(rewardsPerSecond[0].Denom)
 | 
						globalIndex, found = rewardIndexes.Get(rewardsPerSecond[0].Denom)
 | 
				
			||||||
	suite.Require().True(found)
 | 
						suite.Require().True(found)
 | 
				
			||||||
@ -674,11 +674,11 @@ func (suite *DelegatorRewardsTestSuite) TestSlashingValidatorSyncsClaim() {
 | 
				
			|||||||
	suite.Require().NoError(err)
 | 
						suite.Require().NoError(err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Check that claim has been created with synced reward index but no reward coins
 | 
						// Check that claim has been created with synced reward index but no reward coins
 | 
				
			||||||
	initialClaim, found := suite.keeper.GetHardLiquidityProviderClaim(suite.ctx, suite.addrs[0])
 | 
						initialClaim, found := suite.keeper.GetDelegatorClaim(suite.ctx, suite.addrs[0])
 | 
				
			||||||
	suite.True(found)
 | 
						suite.True(found)
 | 
				
			||||||
	initialGlobalIndex, found := suite.keeper.GetHardDelegatorRewardIndexes(suite.ctx, bondDenom)
 | 
						initialGlobalIndex, found := suite.keeper.GetDelegatorRewardIndexes(suite.ctx, bondDenom)
 | 
				
			||||||
	suite.True(found)
 | 
						suite.True(found)
 | 
				
			||||||
	initialClaimIndex, found := initialClaim.DelegatorRewardIndexes.GetRewardIndex(bondDenom)
 | 
						initialClaimIndex, found := initialClaim.RewardIndexes.GetRewardIndex(bondDenom)
 | 
				
			||||||
	suite.True(found)
 | 
						suite.True(found)
 | 
				
			||||||
	suite.Require().Equal(initialGlobalIndex, initialClaimIndex.RewardIndexes)
 | 
						suite.Require().Equal(initialGlobalIndex, initialClaimIndex.RewardIndexes)
 | 
				
			||||||
	suite.True(initialClaim.Reward.Empty()) // Initial claim should not have any rewards
 | 
						suite.True(initialClaim.Reward.Empty()) // Initial claim should not have any rewards
 | 
				
			||||||
@ -697,11 +697,11 @@ func (suite *DelegatorRewardsTestSuite) TestSlashingValidatorSyncsClaim() {
 | 
				
			|||||||
	stakingKeeper.Slash(suite.ctx, validator.ConsAddress(), suite.ctx.BlockHeight(), 10, fraction)
 | 
						stakingKeeper.Slash(suite.ctx, validator.ConsAddress(), suite.ctx.BlockHeight(), 10, fraction)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Check that the user's claim has been synced. ie rewards added, index updated
 | 
						// Check that the user's claim has been synced. ie rewards added, index updated
 | 
				
			||||||
	claim, found := suite.keeper.GetHardLiquidityProviderClaim(suite.ctx, suite.addrs[0])
 | 
						claim, found := suite.keeper.GetDelegatorClaim(suite.ctx, suite.addrs[0])
 | 
				
			||||||
	suite.Require().True(found)
 | 
						suite.Require().True(found)
 | 
				
			||||||
	globalIndex, found := suite.keeper.GetHardDelegatorRewardIndexes(suite.ctx, bondDenom)
 | 
						globalIndex, found := suite.keeper.GetDelegatorRewardIndexes(suite.ctx, bondDenom)
 | 
				
			||||||
	suite.Require().True(found)
 | 
						suite.Require().True(found)
 | 
				
			||||||
	claimIndex, found := claim.DelegatorRewardIndexes.GetRewardIndex(bondDenom)
 | 
						claimIndex, found := claim.RewardIndexes.GetRewardIndex(bondDenom)
 | 
				
			||||||
	suite.Require().True(found)
 | 
						suite.Require().True(found)
 | 
				
			||||||
	suite.Require().Equal(globalIndex, claimIndex.RewardIndexes)
 | 
						suite.Require().Equal(globalIndex, claimIndex.RewardIndexes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -754,12 +754,12 @@ func (suite *DelegatorRewardsTestSuite) TestRedelegationSyncsClaim() {
 | 
				
			|||||||
	suite.Require().NoError(err)
 | 
						suite.Require().NoError(err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Check that the user's claim has been synced. ie rewards added, index updated
 | 
						// Check that the user's claim has been synced. ie rewards added, index updated
 | 
				
			||||||
	claim, found := suite.keeper.GetHardLiquidityProviderClaim(suite.ctx, suite.addrs[0])
 | 
						claim, found := suite.keeper.GetDelegatorClaim(suite.ctx, suite.addrs[0])
 | 
				
			||||||
	suite.Require().True(found)
 | 
						suite.Require().True(found)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	globalIndex, found := suite.keeper.GetHardDelegatorRewardIndexes(suite.ctx, bondDenom)
 | 
						globalIndex, found := suite.keeper.GetDelegatorRewardIndexes(suite.ctx, bondDenom)
 | 
				
			||||||
	suite.Require().True(found)
 | 
						suite.Require().True(found)
 | 
				
			||||||
	claimIndex, found := claim.DelegatorRewardIndexes.GetRewardIndex(bondDenom)
 | 
						claimIndex, found := claim.RewardIndexes.GetRewardIndex(bondDenom)
 | 
				
			||||||
	suite.Require().True(found)
 | 
						suite.Require().True(found)
 | 
				
			||||||
	suite.Require().Equal(globalIndex, claimIndex.RewardIndexes)
 | 
						suite.Require().Equal(globalIndex, claimIndex.RewardIndexes)
 | 
				
			||||||
	suite.Require().Equal(
 | 
						suite.Require().Equal(
 | 
				
			||||||
 | 
				
			|||||||
@ -82,7 +82,7 @@ func (k Keeper) AccumulateHardSupplyRewards(ctx sdk.Context, rewardPeriod types.
 | 
				
			|||||||
func (k Keeper) InitializeHardSupplyReward(ctx sdk.Context, deposit hardtypes.Deposit) {
 | 
					func (k Keeper) InitializeHardSupplyReward(ctx sdk.Context, deposit hardtypes.Deposit) {
 | 
				
			||||||
	claim, found := k.GetHardLiquidityProviderClaim(ctx, deposit.Depositor)
 | 
						claim, found := k.GetHardLiquidityProviderClaim(ctx, deposit.Depositor)
 | 
				
			||||||
	if !found {
 | 
						if !found {
 | 
				
			||||||
		claim = types.NewHardLiquidityProviderClaim(deposit.Depositor, sdk.Coins{}, nil, nil, nil)
 | 
							claim = types.NewHardLiquidityProviderClaim(deposit.Depositor, sdk.Coins{}, nil, nil)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var supplyRewardIndexes types.MultiRewardIndexes
 | 
						var supplyRewardIndexes types.MultiRewardIndexes
 | 
				
			||||||
@ -143,7 +143,7 @@ func (k Keeper) SynchronizeHardSupplyReward(ctx sdk.Context, deposit hardtypes.D
 | 
				
			|||||||
func (k Keeper) UpdateHardSupplyIndexDenoms(ctx sdk.Context, deposit hardtypes.Deposit) {
 | 
					func (k Keeper) UpdateHardSupplyIndexDenoms(ctx sdk.Context, deposit hardtypes.Deposit) {
 | 
				
			||||||
	claim, found := k.GetHardLiquidityProviderClaim(ctx, deposit.Depositor)
 | 
						claim, found := k.GetHardLiquidityProviderClaim(ctx, deposit.Depositor)
 | 
				
			||||||
	if !found {
 | 
						if !found {
 | 
				
			||||||
		claim = types.NewHardLiquidityProviderClaim(deposit.Depositor, sdk.Coins{}, nil, nil, nil)
 | 
							claim = types.NewHardLiquidityProviderClaim(deposit.Depositor, sdk.Coins{}, nil, nil)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	depositDenoms := getDenoms(deposit.Amount)
 | 
						depositDenoms := getDenoms(deposit.Amount)
 | 
				
			||||||
@ -186,9 +186,6 @@ func (k Keeper) SynchronizeHardLiquidityProviderClaim(ctx sdk.Context, owner sdk
 | 
				
			|||||||
	if foundBorrow {
 | 
						if foundBorrow {
 | 
				
			||||||
		k.SynchronizeHardBorrowReward(ctx, borrow)
 | 
							k.SynchronizeHardBorrowReward(ctx, borrow)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Synchronize any hard delegator rewards
 | 
					 | 
				
			||||||
	k.SynchronizeHardDelegatorRewards(ctx, owner, nil, false)
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ZeroHardLiquidityProviderClaim zeroes out the claim object's rewards and returns the updated claim object
 | 
					// ZeroHardLiquidityProviderClaim zeroes out the claim object's rewards and returns the updated claim object
 | 
				
			||||||
@ -300,56 +297,6 @@ func (k Keeper) SimulateHardSynchronization(ctx sdk.Context, claim types.HardLiq
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 3. Simulate delegator rewards
 | 
					 | 
				
			||||||
	for _, ri := range claim.DelegatorRewardIndexes {
 | 
					 | 
				
			||||||
		// For each Delegator reward index (there's only one: the bond denom 'ukava')
 | 
					 | 
				
			||||||
		globalRewardIndexes, foundGlobalRewardIndexes := k.GetHardDelegatorRewardIndexes(ctx, ri.CollateralType)
 | 
					 | 
				
			||||||
		if !foundGlobalRewardIndexes {
 | 
					 | 
				
			||||||
			continue
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		userRewardIndexes, foundUserRewardIndexes := claim.DelegatorRewardIndexes.GetRewardIndex(ri.CollateralType)
 | 
					 | 
				
			||||||
		if !foundUserRewardIndexes {
 | 
					 | 
				
			||||||
			continue
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		userRewardIndexIndex, foundUserRewardIndexIndex := claim.DelegatorRewardIndexes.GetRewardIndexIndex(ri.CollateralType)
 | 
					 | 
				
			||||||
		if !foundUserRewardIndexIndex {
 | 
					 | 
				
			||||||
			continue
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		amtDelegated := k.GetTotalDelegated(ctx, claim.GetOwner(), sdk.ValAddress(claim.Owner.String()), true)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		for _, globalRewardIndex := range globalRewardIndexes {
 | 
					 | 
				
			||||||
			userRewardIndex, foundUserRewardIndex := userRewardIndexes.RewardIndexes.GetRewardIndex(globalRewardIndex.CollateralType)
 | 
					 | 
				
			||||||
			if !foundUserRewardIndex {
 | 
					 | 
				
			||||||
				userRewardIndex = types.NewRewardIndex(globalRewardIndex.CollateralType, sdk.ZeroDec())
 | 
					 | 
				
			||||||
				userRewardIndexes.RewardIndexes = append(userRewardIndexes.RewardIndexes, userRewardIndex)
 | 
					 | 
				
			||||||
				claim.DelegatorRewardIndexes[userRewardIndexIndex].RewardIndexes = append(claim.DelegatorRewardIndexes[userRewardIndexIndex].RewardIndexes, userRewardIndex)
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			globalRewardFactor := globalRewardIndex.RewardFactor
 | 
					 | 
				
			||||||
			userRewardFactor := userRewardIndex.RewardFactor
 | 
					 | 
				
			||||||
			rewardsAccumulatedFactor := globalRewardFactor.Sub(userRewardFactor)
 | 
					 | 
				
			||||||
			if rewardsAccumulatedFactor.IsZero() {
 | 
					 | 
				
			||||||
				continue
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			rewardsEarned := rewardsAccumulatedFactor.Mul(amtDelegated).RoundInt()
 | 
					 | 
				
			||||||
			if rewardsEarned.IsZero() || rewardsEarned.IsNegative() {
 | 
					 | 
				
			||||||
				continue
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			factorIndex, foundFactorIndex := userRewardIndexes.RewardIndexes.GetFactorIndex(globalRewardIndex.CollateralType)
 | 
					 | 
				
			||||||
			if !foundFactorIndex {
 | 
					 | 
				
			||||||
				continue
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			claim.DelegatorRewardIndexes[userRewardIndexIndex].RewardIndexes[factorIndex].RewardFactor = globalRewardIndex.RewardFactor
 | 
					 | 
				
			||||||
			newRewardsCoin := sdk.NewCoin(userRewardIndex.CollateralType, rewardsEarned)
 | 
					 | 
				
			||||||
			claim.Reward = claim.Reward.Add(newRewardsCoin)
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return claim
 | 
						return claim
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -36,7 +36,7 @@ func (suite *InitializeHardSupplyRewardTests) TestClaimIndexesAreSetWhenClaimExi
 | 
				
			|||||||
		// which means UpdateHardSupplyIndexDenoms was called and should have remove indexes.
 | 
							// which means UpdateHardSupplyIndexDenoms was called and should have remove indexes.
 | 
				
			||||||
		SupplyRewardIndexes: types.MultiRewardIndexes{},
 | 
							SupplyRewardIndexes: types.MultiRewardIndexes{},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeHardClaim(claim)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	globalIndexes := nonEmptyMultiRewardIndexes
 | 
						globalIndexes := nonEmptyMultiRewardIndexes
 | 
				
			||||||
	suite.storeGlobalSupplyIndexes(globalIndexes)
 | 
						suite.storeGlobalSupplyIndexes(globalIndexes)
 | 
				
			||||||
 | 
				
			|||||||
@ -35,7 +35,7 @@ func (suite *SynchronizeHardSupplyRewardTests) TestClaimIndexesAreUpdatedWhenGlo
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		SupplyRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
							SupplyRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeHardClaim(claim)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	globalIndexes := increaseAllRewardFactors(nonEmptyMultiRewardIndexes)
 | 
						globalIndexes := increaseAllRewardFactors(nonEmptyMultiRewardIndexes)
 | 
				
			||||||
	suite.storeGlobalSupplyIndexes(globalIndexes)
 | 
						suite.storeGlobalSupplyIndexes(globalIndexes)
 | 
				
			||||||
@ -60,7 +60,7 @@ func (suite *SynchronizeHardSupplyRewardTests) TestClaimIndexesAreUnchangedWhenG
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		SupplyRewardIndexes: unchangingIndexes,
 | 
							SupplyRewardIndexes: unchangingIndexes,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeHardClaim(claim)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	suite.storeGlobalSupplyIndexes(unchangingIndexes)
 | 
						suite.storeGlobalSupplyIndexes(unchangingIndexes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -84,7 +84,7 @@ func (suite *SynchronizeHardSupplyRewardTests) TestClaimIndexesAreUpdatedWhenNew
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		SupplyRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
							SupplyRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeHardClaim(claim)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	globalIndexes := appendUniqueMultiRewardIndex(nonEmptyMultiRewardIndexes)
 | 
						globalIndexes := appendUniqueMultiRewardIndex(nonEmptyMultiRewardIndexes)
 | 
				
			||||||
	suite.storeGlobalSupplyIndexes(globalIndexes)
 | 
						suite.storeGlobalSupplyIndexes(globalIndexes)
 | 
				
			||||||
@ -110,7 +110,7 @@ func (suite *SynchronizeHardSupplyRewardTests) TestClaimIndexesAreUpdatedWhenNew
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		SupplyRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
							SupplyRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeHardClaim(claim)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	globalIndexes := appendUniqueRewardIndexToFirstItem(nonEmptyMultiRewardIndexes)
 | 
						globalIndexes := appendUniqueRewardIndexToFirstItem(nonEmptyMultiRewardIndexes)
 | 
				
			||||||
	suite.storeGlobalSupplyIndexes(globalIndexes)
 | 
						suite.storeGlobalSupplyIndexes(globalIndexes)
 | 
				
			||||||
@ -151,7 +151,7 @@ func (suite *SynchronizeHardSupplyRewardTests) TestRewardIsIncrementedWhenGlobal
 | 
				
			|||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeHardClaim(claim)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	suite.storeGlobalSupplyIndexes(types.MultiRewardIndexes{
 | 
						suite.storeGlobalSupplyIndexes(types.MultiRewardIndexes{
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
@ -202,7 +202,7 @@ func (suite *SynchronizeHardSupplyRewardTests) TestRewardIsIncrementedWhenNewRew
 | 
				
			|||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeHardClaim(claim)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	globalIndexes := types.MultiRewardIndexes{
 | 
						globalIndexes := types.MultiRewardIndexes{
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
@ -265,7 +265,7 @@ func (suite *SynchronizeHardSupplyRewardTests) TestRewardIsIncrementedWhenNewRew
 | 
				
			|||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeHardClaim(claim)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	globalIndexes := types.MultiRewardIndexes{
 | 
						globalIndexes := types.MultiRewardIndexes{
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
 | 
				
			|||||||
@ -33,7 +33,7 @@ func (suite *UpdateHardSupplyIndexDenomsTests) TestClaimIndexesAreRemovedForDeno
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		SupplyRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
							SupplyRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeHardClaim(claim)
 | 
				
			||||||
	suite.storeGlobalSupplyIndexes(claim.SupplyRewardIndexes)
 | 
						suite.storeGlobalSupplyIndexes(claim.SupplyRewardIndexes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// remove one denom from the indexes already in the deposit
 | 
						// remove one denom from the indexes already in the deposit
 | 
				
			||||||
@ -56,7 +56,7 @@ func (suite *UpdateHardSupplyIndexDenomsTests) TestClaimIndexesAreAddedForNewlyS
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		SupplyRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
							SupplyRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeHardClaim(claim)
 | 
				
			||||||
	globalIndexes := appendUniqueMultiRewardIndex(claim.SupplyRewardIndexes)
 | 
						globalIndexes := appendUniqueMultiRewardIndex(claim.SupplyRewardIndexes)
 | 
				
			||||||
	suite.storeGlobalSupplyIndexes(globalIndexes)
 | 
						suite.storeGlobalSupplyIndexes(globalIndexes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -78,7 +78,7 @@ func (suite *UpdateHardSupplyIndexDenomsTests) TestClaimIndexesAreUnchangedWhenS
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		SupplyRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
							SupplyRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeHardClaim(claim)
 | 
				
			||||||
	// Set global indexes with same denoms but different values.
 | 
						// Set global indexes with same denoms but different values.
 | 
				
			||||||
	// UpdateHardSupplyIndexDenoms should ignore the new values.
 | 
						// UpdateHardSupplyIndexDenoms should ignore the new values.
 | 
				
			||||||
	suite.storeGlobalSupplyIndexes(increaseAllRewardFactors(claim.SupplyRewardIndexes))
 | 
						suite.storeGlobalSupplyIndexes(increaseAllRewardFactors(claim.SupplyRewardIndexes))
 | 
				
			||||||
@ -101,7 +101,7 @@ func (suite *UpdateHardSupplyIndexDenomsTests) TestEmptyClaimIndexesAreAddedForN
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		SupplyRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
							SupplyRewardIndexes: nonEmptyMultiRewardIndexes,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	suite.storeClaim(claim)
 | 
						suite.storeHardClaim(claim)
 | 
				
			||||||
	suite.storeGlobalSupplyIndexes(claim.SupplyRewardIndexes)
 | 
						suite.storeGlobalSupplyIndexes(claim.SupplyRewardIndexes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// add a denom to the deposited amount that is not in the global or claim's indexes
 | 
						// add a denom to the deposited amount that is not in the global or claim's indexes
 | 
				
			||||||
 | 
				
			|||||||
@ -76,7 +76,7 @@ func (suite *unitTester) storeGlobalSupplyIndexes(indexes types.MultiRewardIndex
 | 
				
			|||||||
func (suite *unitTester) storeGlobalDelegatorIndexes(multiRewardIndexes types.MultiRewardIndexes) {
 | 
					func (suite *unitTester) storeGlobalDelegatorIndexes(multiRewardIndexes types.MultiRewardIndexes) {
 | 
				
			||||||
	// Hardcoded to use bond denom
 | 
						// Hardcoded to use bond denom
 | 
				
			||||||
	multiRewardIndex, _ := multiRewardIndexes.GetRewardIndex(types.BondDenom)
 | 
						multiRewardIndex, _ := multiRewardIndexes.GetRewardIndex(types.BondDenom)
 | 
				
			||||||
	suite.keeper.SetHardDelegatorRewardIndexes(suite.ctx, types.BondDenom, multiRewardIndex.RewardIndexes)
 | 
						suite.keeper.SetDelegatorRewardIndexes(suite.ctx, types.BondDenom, multiRewardIndex.RewardIndexes)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
func (suite *unitTester) storeGlobalSwapIndexes(indexes types.MultiRewardIndexes) {
 | 
					func (suite *unitTester) storeGlobalSwapIndexes(indexes types.MultiRewardIndexes) {
 | 
				
			||||||
	for _, i := range indexes {
 | 
						for _, i := range indexes {
 | 
				
			||||||
@ -84,10 +84,14 @@ func (suite *unitTester) storeGlobalSwapIndexes(indexes types.MultiRewardIndexes
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (suite *unitTester) storeClaim(claim types.HardLiquidityProviderClaim) {
 | 
					func (suite *unitTester) storeHardClaim(claim types.HardLiquidityProviderClaim) {
 | 
				
			||||||
	suite.keeper.SetHardLiquidityProviderClaim(suite.ctx, claim)
 | 
						suite.keeper.SetHardLiquidityProviderClaim(suite.ctx, claim)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (suite *unitTester) storeDelegatorClaim(claim types.DelegatorClaim) {
 | 
				
			||||||
 | 
						suite.keeper.SetDelegatorClaim(suite.ctx, claim)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type fakeParamSubspace struct {
 | 
					type fakeParamSubspace struct {
 | 
				
			||||||
	params types.Params
 | 
						params types.Params
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -11,6 +11,7 @@ import (
 | 
				
			|||||||
const (
 | 
					const (
 | 
				
			||||||
	USDXMintingClaimType           = "usdx_minting"
 | 
						USDXMintingClaimType           = "usdx_minting"
 | 
				
			||||||
	HardLiquidityProviderClaimType = "hard_liquidity_provider"
 | 
						HardLiquidityProviderClaimType = "hard_liquidity_provider"
 | 
				
			||||||
 | 
						DelegatorClaimType             = "delegator_claim"
 | 
				
			||||||
	BondDenom                      = "ukava"
 | 
						BondDenom                      = "ukava"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -163,23 +164,21 @@ func (cs USDXMintingClaims) Validate() error {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// HardLiquidityProviderClaim stores the hard liquidity provider rewards that can be claimed by owner
 | 
					// HardLiquidityProviderClaim stores the hard liquidity provider rewards that can be claimed by owner
 | 
				
			||||||
type HardLiquidityProviderClaim struct {
 | 
					type HardLiquidityProviderClaim struct {
 | 
				
			||||||
	BaseMultiClaim         `json:"base_claim" yaml:"base_claim"`
 | 
						BaseMultiClaim      `json:"base_claim" yaml:"base_claim"`
 | 
				
			||||||
	SupplyRewardIndexes    MultiRewardIndexes `json:"supply_reward_indexes" yaml:"supply_reward_indexes"`
 | 
						SupplyRewardIndexes MultiRewardIndexes `json:"supply_reward_indexes" yaml:"supply_reward_indexes"`
 | 
				
			||||||
	BorrowRewardIndexes    MultiRewardIndexes `json:"borrow_reward_indexes" yaml:"borrow_reward_indexes"`
 | 
						BorrowRewardIndexes MultiRewardIndexes `json:"borrow_reward_indexes" yaml:"borrow_reward_indexes"`
 | 
				
			||||||
	DelegatorRewardIndexes MultiRewardIndexes `json:"delegator_reward_indexes" yaml:"delegator_reward_indexes"`
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewHardLiquidityProviderClaim returns a new HardLiquidityProviderClaim
 | 
					// NewHardLiquidityProviderClaim returns a new HardLiquidityProviderClaim
 | 
				
			||||||
func NewHardLiquidityProviderClaim(owner sdk.AccAddress, rewards sdk.Coins, supplyRewardIndexes,
 | 
					func NewHardLiquidityProviderClaim(owner sdk.AccAddress, rewards sdk.Coins,
 | 
				
			||||||
	borrowRewardIndexes, delegatorRewardIndexes MultiRewardIndexes) HardLiquidityProviderClaim {
 | 
						supplyRewardIndexes, borrowRewardIndexes MultiRewardIndexes) HardLiquidityProviderClaim {
 | 
				
			||||||
	return HardLiquidityProviderClaim{
 | 
						return HardLiquidityProviderClaim{
 | 
				
			||||||
		BaseMultiClaim: BaseMultiClaim{
 | 
							BaseMultiClaim: BaseMultiClaim{
 | 
				
			||||||
			Owner:  owner,
 | 
								Owner:  owner,
 | 
				
			||||||
			Reward: rewards,
 | 
								Reward: rewards,
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		SupplyRewardIndexes:    supplyRewardIndexes,
 | 
							SupplyRewardIndexes: supplyRewardIndexes,
 | 
				
			||||||
		BorrowRewardIndexes:    borrowRewardIndexes,
 | 
							BorrowRewardIndexes: borrowRewardIndexes,
 | 
				
			||||||
		DelegatorRewardIndexes: delegatorRewardIndexes,
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -202,10 +201,6 @@ func (c HardLiquidityProviderClaim) Validate() error {
 | 
				
			|||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err := c.DelegatorRewardIndexes.Validate(); err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return c.BaseMultiClaim.Validate()
 | 
						return c.BaseMultiClaim.Validate()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -214,8 +209,7 @@ func (c HardLiquidityProviderClaim) String() string {
 | 
				
			|||||||
	return fmt.Sprintf(`%s
 | 
						return fmt.Sprintf(`%s
 | 
				
			||||||
	Supply Reward Indexes: %s,
 | 
						Supply Reward Indexes: %s,
 | 
				
			||||||
	Borrow Reward Indexes: %s,
 | 
						Borrow Reward Indexes: %s,
 | 
				
			||||||
	Delegator Reward Indexes: %s,
 | 
						`, c.BaseMultiClaim, c.SupplyRewardIndexes, c.BorrowRewardIndexes)
 | 
				
			||||||
	`, c.BaseMultiClaim, c.SupplyRewardIndexes, c.BorrowRewardIndexes, c.DelegatorRewardIndexes)
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// HasSupplyRewardIndex check if a claim has a supply reward index for the input collateral type
 | 
					// HasSupplyRewardIndex check if a claim has a supply reward index for the input collateral type
 | 
				
			||||||
@ -238,9 +232,66 @@ func (c HardLiquidityProviderClaim) HasBorrowRewardIndex(denom string) (int64, b
 | 
				
			|||||||
	return 0, false
 | 
						return 0, false
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// HasDelegatorRewardIndex check if a claim has a delegator reward index for the input collateral type
 | 
					// HardLiquidityProviderClaims slice of HardLiquidityProviderClaim
 | 
				
			||||||
func (c HardLiquidityProviderClaim) HasDelegatorRewardIndex(collateralType string) (int64, bool) {
 | 
					type HardLiquidityProviderClaims []HardLiquidityProviderClaim
 | 
				
			||||||
	for index, ri := range c.DelegatorRewardIndexes {
 | 
					
 | 
				
			||||||
 | 
					// Validate checks if all the claims are valid and there are no duplicated
 | 
				
			||||||
 | 
					// entries.
 | 
				
			||||||
 | 
					func (cs HardLiquidityProviderClaims) Validate() error {
 | 
				
			||||||
 | 
						for _, c := range cs {
 | 
				
			||||||
 | 
							if err := c.Validate(); err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// DelegatorClaim stores delegation rewards that can be claimed by owner
 | 
				
			||||||
 | 
					type DelegatorClaim struct {
 | 
				
			||||||
 | 
						BaseMultiClaim `json:"base_claim" yaml:"base_claim"`
 | 
				
			||||||
 | 
						RewardIndexes  MultiRewardIndexes `json:"reward_indexes" yaml:"reward_indexes"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewDelegatorClaim returns a new DelegatorClaim
 | 
				
			||||||
 | 
					func NewDelegatorClaim(owner sdk.AccAddress, rewards sdk.Coins, rewardIndexes MultiRewardIndexes) DelegatorClaim {
 | 
				
			||||||
 | 
						return DelegatorClaim{
 | 
				
			||||||
 | 
							BaseMultiClaim: BaseMultiClaim{
 | 
				
			||||||
 | 
								Owner:  owner,
 | 
				
			||||||
 | 
								Reward: rewards,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							RewardIndexes: rewardIndexes,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetType returns the claim's type
 | 
				
			||||||
 | 
					func (c DelegatorClaim) GetType() string { return DelegatorClaimType }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetReward returns the claim's reward coin
 | 
				
			||||||
 | 
					func (c DelegatorClaim) GetReward() sdk.Coins { return c.Reward }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetOwner returns the claim's owner
 | 
				
			||||||
 | 
					func (c DelegatorClaim) GetOwner() sdk.AccAddress { return c.Owner }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Validate performs a basic check of a DelegatorClaim fields
 | 
				
			||||||
 | 
					func (c DelegatorClaim) Validate() error {
 | 
				
			||||||
 | 
						if err := c.RewardIndexes.Validate(); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return c.BaseMultiClaim.Validate()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// String implements fmt.Stringer
 | 
				
			||||||
 | 
					func (c DelegatorClaim) String() string {
 | 
				
			||||||
 | 
						return fmt.Sprintf(`%s
 | 
				
			||||||
 | 
						Reward Indexes: %s,
 | 
				
			||||||
 | 
						`, c.BaseMultiClaim, c.RewardIndexes)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// HasRewardIndex checks if a DelegatorClaim has a reward index for the input collateral type
 | 
				
			||||||
 | 
					func (c DelegatorClaim) HasRewardIndex(collateralType string) (int64, bool) {
 | 
				
			||||||
 | 
						for index, ri := range c.RewardIndexes {
 | 
				
			||||||
		if ri.CollateralType == collateralType {
 | 
							if ri.CollateralType == collateralType {
 | 
				
			||||||
			return int64(index), true
 | 
								return int64(index), true
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@ -248,12 +299,12 @@ func (c HardLiquidityProviderClaim) HasDelegatorRewardIndex(collateralType strin
 | 
				
			|||||||
	return 0, false
 | 
						return 0, false
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// HardLiquidityProviderClaims slice of HardLiquidityProviderClaim
 | 
					// DelegatorClaim slice of DelegatorClaim
 | 
				
			||||||
type HardLiquidityProviderClaims []HardLiquidityProviderClaim
 | 
					type DelegatorClaims []DelegatorClaim
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Validate checks if all the claims are valid and there are no duplicated
 | 
					// Validate checks if all the claims are valid and there are no duplicated
 | 
				
			||||||
// entries.
 | 
					// entries.
 | 
				
			||||||
func (cs HardLiquidityProviderClaims) Validate() error {
 | 
					func (cs DelegatorClaims) Validate() error {
 | 
				
			||||||
	for _, c := range cs {
 | 
						for _, c := range cs {
 | 
				
			||||||
		if err := c.Validate(); err != nil {
 | 
							if err := c.Validate(); err != nil {
 | 
				
			||||||
			return err
 | 
								return err
 | 
				
			||||||
 | 
				
			|||||||
@ -17,10 +17,13 @@ func RegisterCodec(cdc *codec.Codec) {
 | 
				
			|||||||
	cdc.RegisterInterface((*Claim)(nil), nil)
 | 
						cdc.RegisterInterface((*Claim)(nil), nil)
 | 
				
			||||||
	cdc.RegisterConcrete(USDXMintingClaim{}, "incentive/USDXMintingClaim", nil)
 | 
						cdc.RegisterConcrete(USDXMintingClaim{}, "incentive/USDXMintingClaim", nil)
 | 
				
			||||||
	cdc.RegisterConcrete(HardLiquidityProviderClaim{}, "incentive/HardLiquidityProviderClaim", nil)
 | 
						cdc.RegisterConcrete(HardLiquidityProviderClaim{}, "incentive/HardLiquidityProviderClaim", nil)
 | 
				
			||||||
 | 
						cdc.RegisterConcrete(DelegatorClaim{}, "incentive/DelegatorClaim", nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Register msgs
 | 
						// Register msgs
 | 
				
			||||||
	cdc.RegisterConcrete(MsgClaimUSDXMintingReward{}, "incentive/MsgClaimUSDXMintingReward", nil)
 | 
						cdc.RegisterConcrete(MsgClaimUSDXMintingReward{}, "incentive/MsgClaimUSDXMintingReward", nil)
 | 
				
			||||||
	cdc.RegisterConcrete(MsgClaimHardReward{}, "incentive/MsgClaimHardReward", nil)
 | 
						cdc.RegisterConcrete(MsgClaimHardReward{}, "incentive/MsgClaimHardReward", nil)
 | 
				
			||||||
 | 
						cdc.RegisterConcrete(MsgClaimDelegatorReward{}, "incentive/MsgClaimDelegatorReward", nil)
 | 
				
			||||||
	cdc.RegisterConcrete(MsgClaimUSDXMintingRewardVVesting{}, "incentive/MsgClaimUSDXRewardVVesting", nil)
 | 
						cdc.RegisterConcrete(MsgClaimUSDXMintingRewardVVesting{}, "incentive/MsgClaimUSDXRewardVVesting", nil)
 | 
				
			||||||
	cdc.RegisterConcrete(MsgClaimHardRewardVVesting{}, "incentive/MsgClaimHardRewardVVesting", nil)
 | 
						cdc.RegisterConcrete(MsgClaimHardRewardVVesting{}, "incentive/MsgClaimHardRewardVVesting", nil)
 | 
				
			||||||
 | 
						cdc.RegisterConcrete(MsgClaimDelegatorRewardVVesting{}, "incentive/MsgClaimDelegatorRewardVVesting", nil)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -8,41 +8,45 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// GenesisState is the state that must be provided at genesis.
 | 
					// GenesisState is the state that must be provided at genesis.
 | 
				
			||||||
type GenesisState struct {
 | 
					type GenesisState struct {
 | 
				
			||||||
	Params                         Params                      `json:"params" yaml:"params"`
 | 
						Params                      Params                      `json:"params" yaml:"params"`
 | 
				
			||||||
	USDXAccumulationTimes          GenesisAccumulationTimes    `json:"usdx_accumulation_times" yaml:"usdx_accumulation_times"`
 | 
						USDXAccumulationTimes       GenesisAccumulationTimes    `json:"usdx_accumulation_times" yaml:"usdx_accumulation_times"`
 | 
				
			||||||
	HardSupplyAccumulationTimes    GenesisAccumulationTimes    `json:"hard_supply_accumulation_times" yaml:"hard_supply_accumulation_times"`
 | 
						HardSupplyAccumulationTimes GenesisAccumulationTimes    `json:"hard_supply_accumulation_times" yaml:"hard_supply_accumulation_times"`
 | 
				
			||||||
	HardBorrowAccumulationTimes    GenesisAccumulationTimes    `json:"hard_borrow_accumulation_times" yaml:"hard_borrow_accumulation_times"`
 | 
						HardBorrowAccumulationTimes GenesisAccumulationTimes    `json:"hard_borrow_accumulation_times" yaml:"hard_borrow_accumulation_times"`
 | 
				
			||||||
	HardDelegatorAccumulationTimes GenesisAccumulationTimes    `json:"hard_delegator_accumulation_times" yaml:"hard_delegator_accumulation_times"`
 | 
						DelegatorAccumulationTimes  GenesisAccumulationTimes    `json:"delegator_accumulation_times" yaml:"delegator_accumulation_times"`
 | 
				
			||||||
	SwapAccumulationTimes          GenesisAccumulationTimes    `json:"swap_accumulation_times" yaml:"swap_accumulation_times"`
 | 
						SwapAccumulationTimes       GenesisAccumulationTimes    `json:"swap_accumulation_times" yaml:"swap_accumulation_times"`
 | 
				
			||||||
	USDXMintingClaims              USDXMintingClaims           `json:"usdx_minting_claims" yaml:"usdx_minting_claims"`
 | 
						USDXMintingClaims           USDXMintingClaims           `json:"usdx_minting_claims" yaml:"usdx_minting_claims"`
 | 
				
			||||||
	HardLiquidityProviderClaims    HardLiquidityProviderClaims `json:"hard_liquidity_provider_claims" yaml:"hard_liquidity_provider_claims"`
 | 
						HardLiquidityProviderClaims HardLiquidityProviderClaims `json:"hard_liquidity_provider_claims" yaml:"hard_liquidity_provider_claims"`
 | 
				
			||||||
 | 
						DelegatorClaims             DelegatorClaims             `json:"delegator_claims" yaml:"delegator_claims"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewGenesisState returns a new genesis state
 | 
					// NewGenesisState returns a new genesis state
 | 
				
			||||||
func NewGenesisState(params Params, usdxAccumTimes, hardSupplyAccumTimes, hardBorrowAccumTimes, hardDelegatorAccumTimes, swapAccumTimes GenesisAccumulationTimes, c USDXMintingClaims, hc HardLiquidityProviderClaims) GenesisState {
 | 
					func NewGenesisState(params Params, usdxAccumTimes, hardSupplyAccumTimes, hardBorrowAccumTimes, delegatorAccumTimes,
 | 
				
			||||||
 | 
						swapAccumTimes GenesisAccumulationTimes, c USDXMintingClaims, hc HardLiquidityProviderClaims, dc DelegatorClaims) GenesisState {
 | 
				
			||||||
	return GenesisState{
 | 
						return GenesisState{
 | 
				
			||||||
		Params:                         params,
 | 
							Params:                      params,
 | 
				
			||||||
		USDXAccumulationTimes:          usdxAccumTimes,
 | 
							USDXAccumulationTimes:       usdxAccumTimes,
 | 
				
			||||||
		HardSupplyAccumulationTimes:    hardSupplyAccumTimes,
 | 
							HardSupplyAccumulationTimes: hardSupplyAccumTimes,
 | 
				
			||||||
		HardBorrowAccumulationTimes:    hardBorrowAccumTimes,
 | 
							HardBorrowAccumulationTimes: hardBorrowAccumTimes,
 | 
				
			||||||
		HardDelegatorAccumulationTimes: hardDelegatorAccumTimes,
 | 
							DelegatorAccumulationTimes:  delegatorAccumTimes,
 | 
				
			||||||
		SwapAccumulationTimes:          swapAccumTimes,
 | 
							SwapAccumulationTimes:       swapAccumTimes,
 | 
				
			||||||
		USDXMintingClaims:              c,
 | 
							USDXMintingClaims:           c,
 | 
				
			||||||
		HardLiquidityProviderClaims:    hc,
 | 
							HardLiquidityProviderClaims: hc,
 | 
				
			||||||
 | 
							DelegatorClaims:             dc,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// DefaultGenesisState returns a default genesis state
 | 
					// DefaultGenesisState returns a default genesis state
 | 
				
			||||||
func DefaultGenesisState() GenesisState {
 | 
					func DefaultGenesisState() GenesisState {
 | 
				
			||||||
	return GenesisState{
 | 
						return GenesisState{
 | 
				
			||||||
		Params:                         DefaultParams(),
 | 
							Params:                      DefaultParams(),
 | 
				
			||||||
		USDXAccumulationTimes:          GenesisAccumulationTimes{},
 | 
							USDXAccumulationTimes:       GenesisAccumulationTimes{},
 | 
				
			||||||
		HardSupplyAccumulationTimes:    GenesisAccumulationTimes{},
 | 
							HardSupplyAccumulationTimes: GenesisAccumulationTimes{},
 | 
				
			||||||
		HardBorrowAccumulationTimes:    GenesisAccumulationTimes{},
 | 
							HardBorrowAccumulationTimes: GenesisAccumulationTimes{},
 | 
				
			||||||
		HardDelegatorAccumulationTimes: GenesisAccumulationTimes{},
 | 
							DelegatorAccumulationTimes:  GenesisAccumulationTimes{},
 | 
				
			||||||
		SwapAccumulationTimes:          GenesisAccumulationTimes{},
 | 
							SwapAccumulationTimes:       GenesisAccumulationTimes{},
 | 
				
			||||||
		USDXMintingClaims:              DefaultUSDXClaims,
 | 
							USDXMintingClaims:           DefaultUSDXClaims,
 | 
				
			||||||
		HardLiquidityProviderClaims:    DefaultHardClaims,
 | 
							HardLiquidityProviderClaims: DefaultHardClaims,
 | 
				
			||||||
 | 
							DelegatorClaims:             DefaultDelegatorClaims,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -61,7 +65,7 @@ func (gs GenesisState) Validate() error {
 | 
				
			|||||||
	if err := gs.HardBorrowAccumulationTimes.Validate(); err != nil {
 | 
						if err := gs.HardBorrowAccumulationTimes.Validate(); err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if err := gs.HardDelegatorAccumulationTimes.Validate(); err != nil {
 | 
						if err := gs.DelegatorAccumulationTimes.Validate(); err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if err := gs.SwapAccumulationTimes.Validate(); err != nil {
 | 
						if err := gs.SwapAccumulationTimes.Validate(); err != nil {
 | 
				
			||||||
@ -71,7 +75,10 @@ func (gs GenesisState) Validate() error {
 | 
				
			|||||||
	if err := gs.HardLiquidityProviderClaims.Validate(); err != nil {
 | 
						if err := gs.HardLiquidityProviderClaims.Validate(); err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return gs.USDXMintingClaims.Validate()
 | 
						if err := gs.USDXMintingClaims.Validate(); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return gs.DelegatorClaims.Validate()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Equal checks whether two gov GenesisState structs are equivalent
 | 
					// Equal checks whether two gov GenesisState structs are equivalent
 | 
				
			||||||
 | 
				
			|||||||
@ -140,6 +140,7 @@ func TestGenesisStateValidate(t *testing.T) {
 | 
				
			|||||||
				tc.args.genAccTimes,
 | 
									tc.args.genAccTimes,
 | 
				
			||||||
				tc.args.claims,
 | 
									tc.args.claims,
 | 
				
			||||||
				DefaultHardClaims,
 | 
									DefaultHardClaims,
 | 
				
			||||||
 | 
									DefaultDelegatorClaims,
 | 
				
			||||||
			)
 | 
								)
 | 
				
			||||||
			err := gs.Validate()
 | 
								err := gs.Validate()
 | 
				
			||||||
			if tc.errArgs.expectPass {
 | 
								if tc.errArgs.expectPass {
 | 
				
			||||||
 | 
				
			|||||||
@ -23,18 +23,19 @@ const (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Key Prefixes
 | 
					// Key Prefixes
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	USDXMintingClaimKeyPrefix                       = []byte{0x01} // prefix for keys that store USDX minting claims
 | 
						USDXMintingClaimKeyPrefix                     = []byte{0x01} // prefix for keys that store USDX minting claims
 | 
				
			||||||
	USDXMintingRewardFactorKeyPrefix                = []byte{0x02} // prefix for key that stores USDX minting reward factors
 | 
						USDXMintingRewardFactorKeyPrefix              = []byte{0x02} // prefix for key that stores USDX minting reward factors
 | 
				
			||||||
	PreviousUSDXMintingRewardAccrualTimeKeyPrefix   = []byte{0x03} // prefix for key that stores the blocktime
 | 
						PreviousUSDXMintingRewardAccrualTimeKeyPrefix = []byte{0x03} // prefix for key that stores the blocktime
 | 
				
			||||||
	HardLiquidityClaimKeyPrefix                     = []byte{0x04} // prefix for keys that store Hard liquidity claims
 | 
						HardLiquidityClaimKeyPrefix                   = []byte{0x04} // prefix for keys that store Hard liquidity claims
 | 
				
			||||||
	HardSupplyRewardIndexesKeyPrefix                = []byte{0x05} // prefix for key that stores Hard supply reward indexes
 | 
						HardSupplyRewardIndexesKeyPrefix              = []byte{0x05} // prefix for key that stores Hard supply reward indexes
 | 
				
			||||||
	PreviousHardSupplyRewardAccrualTimeKeyPrefix    = []byte{0x06} // prefix for key that stores the previous time Hard supply rewards accrued
 | 
						PreviousHardSupplyRewardAccrualTimeKeyPrefix  = []byte{0x06} // prefix for key that stores the previous time Hard supply rewards accrued
 | 
				
			||||||
	HardBorrowRewardIndexesKeyPrefix                = []byte{0x07} // prefix for key that stores Hard borrow reward indexes
 | 
						HardBorrowRewardIndexesKeyPrefix              = []byte{0x07} // prefix for key that stores Hard borrow reward indexes
 | 
				
			||||||
	PreviousHardBorrowRewardAccrualTimeKeyPrefix    = []byte{0x08} // prefix for key that stores the previous time Hard borrow rewards accrued
 | 
						PreviousHardBorrowRewardAccrualTimeKeyPrefix  = []byte{0x08} // prefix for key that stores the previous time Hard borrow rewards accrued
 | 
				
			||||||
	HardDelegatorRewardIndexesKeyPrefix             = []byte{0x09} // prefix for key that stores Hard delegator reward indexes
 | 
						DelegatorClaimKeyPrefix                       = []byte{0x09} // prefix for keys that store delegator claims
 | 
				
			||||||
	PreviousHardDelegatorRewardAccrualTimeKeyPrefix = []byte{0x10} // prefix for key that stores the previous time Hard delegator rewards accrued
 | 
						DelegatorRewardIndexesKeyPrefix               = []byte{0x10} // prefix for key that stores delegator reward indexes
 | 
				
			||||||
	SwapRewardIndexesKeyPrefix                      = []byte{0x11} // prefix for key that stores swap reward indexes
 | 
						PreviousDelegatorRewardAccrualTimeKeyPrefix   = []byte{0x11} // prefix for key that stores the previous time delegator rewards accrued
 | 
				
			||||||
	PreviousSwapRewardAccrualTimeKeyPrefix          = []byte{0x12} // prefix for key that stores the previous time swap rewards accrued
 | 
						SwapRewardIndexesKeyPrefix                    = []byte{0x12} // prefix for key that stores swap reward indexes
 | 
				
			||||||
 | 
						PreviousSwapRewardAccrualTimeKeyPrefix        = []byte{0x13} // prefix for key that stores the previous time swap rewards accrued
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	USDXMintingRewardDenom   = "ukava"
 | 
						USDXMintingRewardDenom   = "ukava"
 | 
				
			||||||
	HardLiquidityRewardDenom = "hard"
 | 
						HardLiquidityRewardDenom = "hard"
 | 
				
			||||||
 | 
				
			|||||||
@ -146,7 +146,7 @@ type MsgClaimHardRewardVVesting struct {
 | 
				
			|||||||
	MultiplierName string         `json:"multiplier_name" yaml:"multiplier_name"`
 | 
						MultiplierName string         `json:"multiplier_name" yaml:"multiplier_name"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewMsgClaimHardRewardVVesting returns a new MsgClaimHardReward.
 | 
					// NewMsgClaimHardRewardVVesting returns a new MsgClaimHardRewardVVesting.
 | 
				
			||||||
func NewMsgClaimHardRewardVVesting(sender, receiver sdk.AccAddress, multiplierName string) MsgClaimHardRewardVVesting {
 | 
					func NewMsgClaimHardRewardVVesting(sender, receiver sdk.AccAddress, multiplierName string) MsgClaimHardRewardVVesting {
 | 
				
			||||||
	return MsgClaimHardRewardVVesting{
 | 
						return MsgClaimHardRewardVVesting{
 | 
				
			||||||
		Sender:         sender,
 | 
							Sender:         sender,
 | 
				
			||||||
@ -184,3 +184,90 @@ func (msg MsgClaimHardRewardVVesting) GetSignBytes() []byte {
 | 
				
			|||||||
func (msg MsgClaimHardRewardVVesting) GetSigners() []sdk.AccAddress {
 | 
					func (msg MsgClaimHardRewardVVesting) GetSigners() []sdk.AccAddress {
 | 
				
			||||||
	return []sdk.AccAddress{msg.Sender}
 | 
						return []sdk.AccAddress{msg.Sender}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MsgClaimDelegatorReward message type used to claim delegator rewards
 | 
				
			||||||
 | 
					type MsgClaimDelegatorReward struct {
 | 
				
			||||||
 | 
						Sender         sdk.AccAddress `json:"sender" yaml:"sender"`
 | 
				
			||||||
 | 
						MultiplierName string         `json:"multiplier_name" yaml:"multiplier_name"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewMsgClaimDelegatorReward returns a new MsgClaimDelegatorReward.
 | 
				
			||||||
 | 
					func NewMsgClaimDelegatorReward(sender sdk.AccAddress, multiplierName string) MsgClaimDelegatorReward {
 | 
				
			||||||
 | 
						return MsgClaimDelegatorReward{
 | 
				
			||||||
 | 
							Sender:         sender,
 | 
				
			||||||
 | 
							MultiplierName: multiplierName,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Route return the message type used for routing the message.
 | 
				
			||||||
 | 
					func (msg MsgClaimDelegatorReward) Route() string { return RouterKey }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Type returns a human-readable string for the message, intended for utilization within tags.
 | 
				
			||||||
 | 
					func (msg MsgClaimDelegatorReward) Type() string {
 | 
				
			||||||
 | 
						return "claim_delegator_reward"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ValidateBasic does a simple validation check that doesn't require access to state.
 | 
				
			||||||
 | 
					func (msg MsgClaimDelegatorReward) ValidateBasic() error {
 | 
				
			||||||
 | 
						if msg.Sender.Empty() {
 | 
				
			||||||
 | 
							return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "sender address cannot be empty")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return MultiplierName(strings.ToLower(msg.MultiplierName)).IsValid()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetSignBytes gets the canonical byte representation of the Msg.
 | 
				
			||||||
 | 
					func (msg MsgClaimDelegatorReward) GetSignBytes() []byte {
 | 
				
			||||||
 | 
						bz := ModuleCdc.MustMarshalJSON(msg)
 | 
				
			||||||
 | 
						return sdk.MustSortJSON(bz)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetSigners returns the addresses of signers that must sign.
 | 
				
			||||||
 | 
					func (msg MsgClaimDelegatorReward) GetSigners() []sdk.AccAddress {
 | 
				
			||||||
 | 
						return []sdk.AccAddress{msg.Sender}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MsgClaimDelegatorRewardVVesting message type used to claim delegator rewards for validator vesting accounts
 | 
				
			||||||
 | 
					type MsgClaimDelegatorRewardVVesting struct {
 | 
				
			||||||
 | 
						Sender         sdk.AccAddress `json:"sender" yaml:"sender"`
 | 
				
			||||||
 | 
						Receiver       sdk.AccAddress `json:"receiver" yaml:"receiver"`
 | 
				
			||||||
 | 
						MultiplierName string         `json:"multiplier_name" yaml:"multiplier_name"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MsgClaimDelegatorRewardVVesting returns a new MsgClaimDelegatorRewardVVesting.
 | 
				
			||||||
 | 
					func NewMsgClaimDelegatorRewardVVesting(sender, receiver sdk.AccAddress, multiplierName string) MsgClaimDelegatorRewardVVesting {
 | 
				
			||||||
 | 
						return MsgClaimDelegatorRewardVVesting{
 | 
				
			||||||
 | 
							Sender:         sender,
 | 
				
			||||||
 | 
							Receiver:       receiver,
 | 
				
			||||||
 | 
							MultiplierName: multiplierName,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Route return the message type used for routing the message.
 | 
				
			||||||
 | 
					func (msg MsgClaimDelegatorRewardVVesting) Route() string { return RouterKey }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Type returns a human-readable string for the message, intended for utilization within tags.
 | 
				
			||||||
 | 
					func (msg MsgClaimDelegatorRewardVVesting) Type() string {
 | 
				
			||||||
 | 
						return "claim_delegator_reward_vvesting"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ValidateBasic does a simple validation check that doesn't require access to state.
 | 
				
			||||||
 | 
					func (msg MsgClaimDelegatorRewardVVesting) ValidateBasic() error {
 | 
				
			||||||
 | 
						if msg.Sender.Empty() {
 | 
				
			||||||
 | 
							return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "sender address cannot be empty")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if msg.Receiver.Empty() {
 | 
				
			||||||
 | 
							return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, "receiver address cannot be empty")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return MultiplierName(strings.ToLower(msg.MultiplierName)).IsValid()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetSignBytes gets the canonical byte representation of the Msg.
 | 
				
			||||||
 | 
					func (msg MsgClaimDelegatorRewardVVesting) GetSignBytes() []byte {
 | 
				
			||||||
 | 
						bz := ModuleCdc.MustMarshalJSON(msg)
 | 
				
			||||||
 | 
						return sdk.MustSortJSON(bz)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetSigners returns the addresses of signers that must sign.
 | 
				
			||||||
 | 
					func (msg MsgClaimDelegatorRewardVVesting) GetSigners() []sdk.AccAddress {
 | 
				
			||||||
 | 
						return []sdk.AccAddress{msg.Sender}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -27,7 +27,7 @@ var (
 | 
				
			|||||||
	KeyUSDXMintingRewardPeriods     = []byte("USDXMintingRewardPeriods")
 | 
						KeyUSDXMintingRewardPeriods     = []byte("USDXMintingRewardPeriods")
 | 
				
			||||||
	KeyHardSupplyRewardPeriods      = []byte("HardSupplyRewardPeriods")
 | 
						KeyHardSupplyRewardPeriods      = []byte("HardSupplyRewardPeriods")
 | 
				
			||||||
	KeyHardBorrowRewardPeriods      = []byte("HardBorrowRewardPeriods")
 | 
						KeyHardBorrowRewardPeriods      = []byte("HardBorrowRewardPeriods")
 | 
				
			||||||
	KeyHardDelegatorRewardPeriods   = []byte("HardDelegatorRewardPeriods")
 | 
						KeyDelegatorRewardPeriods       = []byte("DelegatorRewardPeriods")
 | 
				
			||||||
	KeySwapRewardPeriods            = []byte("SwapRewardPeriods")
 | 
						KeySwapRewardPeriods            = []byte("SwapRewardPeriods")
 | 
				
			||||||
	KeyClaimEnd                     = []byte("ClaimEnd")
 | 
						KeyClaimEnd                     = []byte("ClaimEnd")
 | 
				
			||||||
	KeyMultipliers                  = []byte("ClaimMultipliers")
 | 
						KeyMultipliers                  = []byte("ClaimMultipliers")
 | 
				
			||||||
@ -37,6 +37,7 @@ var (
 | 
				
			|||||||
	DefaultMultipliers              = Multipliers{}
 | 
						DefaultMultipliers              = Multipliers{}
 | 
				
			||||||
	DefaultUSDXClaims               = USDXMintingClaims{}
 | 
						DefaultUSDXClaims               = USDXMintingClaims{}
 | 
				
			||||||
	DefaultHardClaims               = HardLiquidityProviderClaims{}
 | 
						DefaultHardClaims               = HardLiquidityProviderClaims{}
 | 
				
			||||||
 | 
						DefaultDelegatorClaims          = DelegatorClaims{}
 | 
				
			||||||
	DefaultGenesisAccumulationTimes = GenesisAccumulationTimes{}
 | 
						DefaultGenesisAccumulationTimes = GenesisAccumulationTimes{}
 | 
				
			||||||
	DefaultClaimEnd                 = tmtime.Canonical(time.Unix(1, 0))
 | 
						DefaultClaimEnd                 = tmtime.Canonical(time.Unix(1, 0))
 | 
				
			||||||
	GovDenom                        = cdptypes.DefaultGovDenom
 | 
						GovDenom                        = cdptypes.DefaultGovDenom
 | 
				
			||||||
@ -46,26 +47,26 @@ var (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Params governance parameters for the incentive module
 | 
					// Params governance parameters for the incentive module
 | 
				
			||||||
type Params struct {
 | 
					type Params struct {
 | 
				
			||||||
	USDXMintingRewardPeriods   RewardPeriods      `json:"usdx_minting_reward_periods" yaml:"usdx_minting_reward_periods"`
 | 
						USDXMintingRewardPeriods RewardPeriods      `json:"usdx_minting_reward_periods" yaml:"usdx_minting_reward_periods"`
 | 
				
			||||||
	HardSupplyRewardPeriods    MultiRewardPeriods `json:"hard_supply_reward_periods" yaml:"hard_supply_reward_periods"`
 | 
						HardSupplyRewardPeriods  MultiRewardPeriods `json:"hard_supply_reward_periods" yaml:"hard_supply_reward_periods"`
 | 
				
			||||||
	HardBorrowRewardPeriods    MultiRewardPeriods `json:"hard_borrow_reward_periods" yaml:"hard_borrow_reward_periods"`
 | 
						HardBorrowRewardPeriods  MultiRewardPeriods `json:"hard_borrow_reward_periods" yaml:"hard_borrow_reward_periods"`
 | 
				
			||||||
	HardDelegatorRewardPeriods MultiRewardPeriods `json:"hard_delegator_reward_periods" yaml:"hard_delegator_reward_periods"`
 | 
						DelegatorRewardPeriods   MultiRewardPeriods `json:"delegator_reward_periods" yaml:"delegator_reward_periods"`
 | 
				
			||||||
	SwapRewardPeriods          MultiRewardPeriods `json:"swap_reward_periods" json:"swap_reward_periods"`
 | 
						SwapRewardPeriods        MultiRewardPeriods `json:"swap_reward_periods" json:"swap_reward_periods"`
 | 
				
			||||||
	ClaimMultipliers           Multipliers        `json:"claim_multipliers" yaml:"claim_multipliers"`
 | 
						ClaimMultipliers         Multipliers        `json:"claim_multipliers" yaml:"claim_multipliers"`
 | 
				
			||||||
	ClaimEnd                   time.Time          `json:"claim_end" yaml:"claim_end"`
 | 
						ClaimEnd                 time.Time          `json:"claim_end" yaml:"claim_end"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewParams returns a new params object
 | 
					// NewParams returns a new params object
 | 
				
			||||||
func NewParams(usdxMinting RewardPeriods, hardSupply, hardBorrow, hardDelegator, swap MultiRewardPeriods,
 | 
					func NewParams(usdxMinting RewardPeriods, hardSupply, hardBorrow, delegator, swap MultiRewardPeriods,
 | 
				
			||||||
	multipliers Multipliers, claimEnd time.Time) Params {
 | 
						multipliers Multipliers, claimEnd time.Time) Params {
 | 
				
			||||||
	return Params{
 | 
						return Params{
 | 
				
			||||||
		USDXMintingRewardPeriods:   usdxMinting,
 | 
							USDXMintingRewardPeriods: usdxMinting,
 | 
				
			||||||
		HardSupplyRewardPeriods:    hardSupply,
 | 
							HardSupplyRewardPeriods:  hardSupply,
 | 
				
			||||||
		HardBorrowRewardPeriods:    hardBorrow,
 | 
							HardBorrowRewardPeriods:  hardBorrow,
 | 
				
			||||||
		HardDelegatorRewardPeriods: hardDelegator,
 | 
							DelegatorRewardPeriods:   delegator,
 | 
				
			||||||
		SwapRewardPeriods:          swap,
 | 
							SwapRewardPeriods:        swap,
 | 
				
			||||||
		ClaimMultipliers:           multipliers,
 | 
							ClaimMultipliers:         multipliers,
 | 
				
			||||||
		ClaimEnd:                   claimEnd,
 | 
							ClaimEnd:                 claimEnd,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -88,12 +89,12 @@ func (p Params) String() string {
 | 
				
			|||||||
	USDX Minting Reward Periods: %s
 | 
						USDX Minting Reward Periods: %s
 | 
				
			||||||
	Hard Supply Reward Periods: %s
 | 
						Hard Supply Reward Periods: %s
 | 
				
			||||||
	Hard Borrow Reward Periods: %s
 | 
						Hard Borrow Reward Periods: %s
 | 
				
			||||||
	Hard Delegator Reward Periods: %s
 | 
						Delegator Reward Periods: %s
 | 
				
			||||||
	Swap Reward Periods: %s
 | 
						Swap Reward Periods: %s
 | 
				
			||||||
	Claim Multipliers :%s
 | 
						Claim Multipliers :%s
 | 
				
			||||||
	Claim End Time: %s
 | 
						Claim End Time: %s
 | 
				
			||||||
	`, p.USDXMintingRewardPeriods, p.HardSupplyRewardPeriods, p.HardBorrowRewardPeriods,
 | 
						`, p.USDXMintingRewardPeriods, p.HardSupplyRewardPeriods, p.HardBorrowRewardPeriods,
 | 
				
			||||||
		p.HardDelegatorRewardPeriods, p.SwapRewardPeriods, p.ClaimMultipliers, p.ClaimEnd)
 | 
							p.DelegatorRewardPeriods, p.SwapRewardPeriods, p.ClaimMultipliers, p.ClaimEnd)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ParamKeyTable Key declaration for parameters
 | 
					// ParamKeyTable Key declaration for parameters
 | 
				
			||||||
@ -107,7 +108,7 @@ func (p *Params) ParamSetPairs() params.ParamSetPairs {
 | 
				
			|||||||
		params.NewParamSetPair(KeyUSDXMintingRewardPeriods, &p.USDXMintingRewardPeriods, validateRewardPeriodsParam),
 | 
							params.NewParamSetPair(KeyUSDXMintingRewardPeriods, &p.USDXMintingRewardPeriods, validateRewardPeriodsParam),
 | 
				
			||||||
		params.NewParamSetPair(KeyHardSupplyRewardPeriods, &p.HardSupplyRewardPeriods, validateMultiRewardPeriodsParam),
 | 
							params.NewParamSetPair(KeyHardSupplyRewardPeriods, &p.HardSupplyRewardPeriods, validateMultiRewardPeriodsParam),
 | 
				
			||||||
		params.NewParamSetPair(KeyHardBorrowRewardPeriods, &p.HardBorrowRewardPeriods, validateMultiRewardPeriodsParam),
 | 
							params.NewParamSetPair(KeyHardBorrowRewardPeriods, &p.HardBorrowRewardPeriods, validateMultiRewardPeriodsParam),
 | 
				
			||||||
		params.NewParamSetPair(KeyHardDelegatorRewardPeriods, &p.HardDelegatorRewardPeriods, validateMultiRewardPeriodsParam),
 | 
							params.NewParamSetPair(KeyDelegatorRewardPeriods, &p.DelegatorRewardPeriods, validateMultiRewardPeriodsParam),
 | 
				
			||||||
		params.NewParamSetPair(KeySwapRewardPeriods, &p.SwapRewardPeriods, validateMultiRewardPeriodsParam),
 | 
							params.NewParamSetPair(KeySwapRewardPeriods, &p.SwapRewardPeriods, validateMultiRewardPeriodsParam),
 | 
				
			||||||
		params.NewParamSetPair(KeyClaimEnd, &p.ClaimEnd, validateClaimEndParam),
 | 
							params.NewParamSetPair(KeyClaimEnd, &p.ClaimEnd, validateClaimEndParam),
 | 
				
			||||||
		params.NewParamSetPair(KeyMultipliers, &p.ClaimMultipliers, validateMultipliersParam),
 | 
							params.NewParamSetPair(KeyMultipliers, &p.ClaimMultipliers, validateMultipliersParam),
 | 
				
			||||||
@ -133,7 +134,7 @@ func (p Params) Validate() error {
 | 
				
			|||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err := validateMultiRewardPeriodsParam(p.HardDelegatorRewardPeriods); err != nil {
 | 
						if err := validateMultiRewardPeriodsParam(p.DelegatorRewardPeriods); err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -70,11 +70,11 @@ func (suite *ParamTestSuite) TestParamValidation() {
 | 
				
			|||||||
						types.Large, 1, sdk.MustNewDecFromStr("1.0"),
 | 
											types.Large, 1, sdk.MustNewDecFromStr("1.0"),
 | 
				
			||||||
					),
 | 
										),
 | 
				
			||||||
				},
 | 
									},
 | 
				
			||||||
				HardSupplyRewardPeriods:    types.DefaultMultiRewardPeriods,
 | 
									HardSupplyRewardPeriods: types.DefaultMultiRewardPeriods,
 | 
				
			||||||
				HardBorrowRewardPeriods:    types.DefaultMultiRewardPeriods,
 | 
									HardBorrowRewardPeriods: types.DefaultMultiRewardPeriods,
 | 
				
			||||||
				HardDelegatorRewardPeriods: types.DefaultMultiRewardPeriods,
 | 
									DelegatorRewardPeriods:  types.DefaultMultiRewardPeriods,
 | 
				
			||||||
				SwapRewardPeriods:          types.DefaultMultiRewardPeriods,
 | 
									SwapRewardPeriods:       types.DefaultMultiRewardPeriods,
 | 
				
			||||||
				ClaimEnd:                   time.Date(2025, 10, 15, 14, 0, 0, 0, time.UTC),
 | 
									ClaimEnd:                time.Date(2025, 10, 15, 14, 0, 0, 0, time.UTC),
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			errArgs{
 | 
								errArgs{
 | 
				
			||||||
				expectPass: true,
 | 
									expectPass: true,
 | 
				
			||||||
@ -83,13 +83,13 @@ func (suite *ParamTestSuite) TestParamValidation() {
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
			"invalid usdx minting period makes params invalid",
 | 
								"invalid usdx minting period makes params invalid",
 | 
				
			||||||
			types.Params{
 | 
								types.Params{
 | 
				
			||||||
				USDXMintingRewardPeriods:   types.RewardPeriods{rewardPeriodWithInvalidRewardsPerSecond},
 | 
									USDXMintingRewardPeriods: types.RewardPeriods{rewardPeriodWithInvalidRewardsPerSecond},
 | 
				
			||||||
				HardSupplyRewardPeriods:    types.DefaultMultiRewardPeriods,
 | 
									HardSupplyRewardPeriods:  types.DefaultMultiRewardPeriods,
 | 
				
			||||||
				HardBorrowRewardPeriods:    types.DefaultMultiRewardPeriods,
 | 
									HardBorrowRewardPeriods:  types.DefaultMultiRewardPeriods,
 | 
				
			||||||
				HardDelegatorRewardPeriods: types.DefaultMultiRewardPeriods,
 | 
									DelegatorRewardPeriods:   types.DefaultMultiRewardPeriods,
 | 
				
			||||||
				SwapRewardPeriods:          types.DefaultMultiRewardPeriods,
 | 
									SwapRewardPeriods:        types.DefaultMultiRewardPeriods,
 | 
				
			||||||
				ClaimMultipliers:           types.DefaultMultipliers,
 | 
									ClaimMultipliers:         types.DefaultMultipliers,
 | 
				
			||||||
				ClaimEnd:                   time.Date(2025, 10, 15, 14, 0, 0, 0, time.UTC),
 | 
									ClaimEnd:                 time.Date(2025, 10, 15, 14, 0, 0, 0, time.UTC),
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			errArgs{
 | 
								errArgs{
 | 
				
			||||||
				expectPass: false,
 | 
									expectPass: false,
 | 
				
			||||||
@ -99,13 +99,13 @@ func (suite *ParamTestSuite) TestParamValidation() {
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
			"invalid hard supply periods makes params invalid",
 | 
								"invalid hard supply periods makes params invalid",
 | 
				
			||||||
			types.Params{
 | 
								types.Params{
 | 
				
			||||||
				USDXMintingRewardPeriods:   types.DefaultRewardPeriods,
 | 
									USDXMintingRewardPeriods: types.DefaultRewardPeriods,
 | 
				
			||||||
				HardSupplyRewardPeriods:    types.MultiRewardPeriods{rewardMultiPeriodWithInvalidRewardsPerSecond},
 | 
									HardSupplyRewardPeriods:  types.MultiRewardPeriods{rewardMultiPeriodWithInvalidRewardsPerSecond},
 | 
				
			||||||
				HardBorrowRewardPeriods:    types.DefaultMultiRewardPeriods,
 | 
									HardBorrowRewardPeriods:  types.DefaultMultiRewardPeriods,
 | 
				
			||||||
				HardDelegatorRewardPeriods: types.DefaultMultiRewardPeriods,
 | 
									DelegatorRewardPeriods:   types.DefaultMultiRewardPeriods,
 | 
				
			||||||
				SwapRewardPeriods:          types.DefaultMultiRewardPeriods,
 | 
									SwapRewardPeriods:        types.DefaultMultiRewardPeriods,
 | 
				
			||||||
				ClaimMultipliers:           types.DefaultMultipliers,
 | 
									ClaimMultipliers:         types.DefaultMultipliers,
 | 
				
			||||||
				ClaimEnd:                   time.Date(2025, 10, 15, 14, 0, 0, 0, time.UTC),
 | 
									ClaimEnd:                 time.Date(2025, 10, 15, 14, 0, 0, 0, time.UTC),
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			errArgs{
 | 
								errArgs{
 | 
				
			||||||
				expectPass: false,
 | 
									expectPass: false,
 | 
				
			||||||
@ -115,13 +115,13 @@ func (suite *ParamTestSuite) TestParamValidation() {
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
			"invalid hard borrow periods makes params invalid",
 | 
								"invalid hard borrow periods makes params invalid",
 | 
				
			||||||
			types.Params{
 | 
								types.Params{
 | 
				
			||||||
				USDXMintingRewardPeriods:   types.DefaultRewardPeriods,
 | 
									USDXMintingRewardPeriods: types.DefaultRewardPeriods,
 | 
				
			||||||
				HardSupplyRewardPeriods:    types.DefaultMultiRewardPeriods,
 | 
									HardSupplyRewardPeriods:  types.DefaultMultiRewardPeriods,
 | 
				
			||||||
				HardBorrowRewardPeriods:    types.MultiRewardPeriods{rewardMultiPeriodWithInvalidRewardsPerSecond},
 | 
									HardBorrowRewardPeriods:  types.MultiRewardPeriods{rewardMultiPeriodWithInvalidRewardsPerSecond},
 | 
				
			||||||
				HardDelegatorRewardPeriods: types.DefaultMultiRewardPeriods,
 | 
									DelegatorRewardPeriods:   types.DefaultMultiRewardPeriods,
 | 
				
			||||||
				SwapRewardPeriods:          types.DefaultMultiRewardPeriods,
 | 
									SwapRewardPeriods:        types.DefaultMultiRewardPeriods,
 | 
				
			||||||
				ClaimMultipliers:           types.DefaultMultipliers,
 | 
									ClaimMultipliers:         types.DefaultMultipliers,
 | 
				
			||||||
				ClaimEnd:                   time.Date(2025, 10, 15, 14, 0, 0, 0, time.UTC),
 | 
									ClaimEnd:                 time.Date(2025, 10, 15, 14, 0, 0, 0, time.UTC),
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			errArgs{
 | 
								errArgs{
 | 
				
			||||||
				expectPass: false,
 | 
									expectPass: false,
 | 
				
			||||||
@ -131,13 +131,13 @@ func (suite *ParamTestSuite) TestParamValidation() {
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
			"invalid delegator periods makes params invalid",
 | 
								"invalid delegator periods makes params invalid",
 | 
				
			||||||
			types.Params{
 | 
								types.Params{
 | 
				
			||||||
				USDXMintingRewardPeriods:   types.DefaultRewardPeriods,
 | 
									USDXMintingRewardPeriods: types.DefaultRewardPeriods,
 | 
				
			||||||
				HardSupplyRewardPeriods:    types.DefaultMultiRewardPeriods,
 | 
									HardSupplyRewardPeriods:  types.DefaultMultiRewardPeriods,
 | 
				
			||||||
				HardBorrowRewardPeriods:    types.DefaultMultiRewardPeriods,
 | 
									HardBorrowRewardPeriods:  types.DefaultMultiRewardPeriods,
 | 
				
			||||||
				HardDelegatorRewardPeriods: types.MultiRewardPeriods{rewardMultiPeriodWithInvalidRewardsPerSecond},
 | 
									DelegatorRewardPeriods:   types.MultiRewardPeriods{rewardMultiPeriodWithInvalidRewardsPerSecond},
 | 
				
			||||||
				SwapRewardPeriods:          types.DefaultMultiRewardPeriods,
 | 
									SwapRewardPeriods:        types.DefaultMultiRewardPeriods,
 | 
				
			||||||
				ClaimMultipliers:           types.DefaultMultipliers,
 | 
									ClaimMultipliers:         types.DefaultMultipliers,
 | 
				
			||||||
				ClaimEnd:                   time.Date(2025, 10, 15, 14, 0, 0, 0, time.UTC),
 | 
									ClaimEnd:                 time.Date(2025, 10, 15, 14, 0, 0, 0, time.UTC),
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			errArgs{
 | 
								errArgs{
 | 
				
			||||||
				expectPass: false,
 | 
									expectPass: false,
 | 
				
			||||||
@ -147,13 +147,13 @@ func (suite *ParamTestSuite) TestParamValidation() {
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
			"invalid swap periods makes params invalid",
 | 
								"invalid swap periods makes params invalid",
 | 
				
			||||||
			types.Params{
 | 
								types.Params{
 | 
				
			||||||
				USDXMintingRewardPeriods:   types.DefaultRewardPeriods,
 | 
									USDXMintingRewardPeriods: types.DefaultRewardPeriods,
 | 
				
			||||||
				HardSupplyRewardPeriods:    types.DefaultMultiRewardPeriods,
 | 
									HardSupplyRewardPeriods:  types.DefaultMultiRewardPeriods,
 | 
				
			||||||
				HardBorrowRewardPeriods:    types.DefaultMultiRewardPeriods,
 | 
									HardBorrowRewardPeriods:  types.DefaultMultiRewardPeriods,
 | 
				
			||||||
				HardDelegatorRewardPeriods: types.DefaultMultiRewardPeriods,
 | 
									DelegatorRewardPeriods:   types.DefaultMultiRewardPeriods,
 | 
				
			||||||
				SwapRewardPeriods:          types.MultiRewardPeriods{rewardMultiPeriodWithInvalidRewardsPerSecond},
 | 
									SwapRewardPeriods:        types.MultiRewardPeriods{rewardMultiPeriodWithInvalidRewardsPerSecond},
 | 
				
			||||||
				ClaimMultipliers:           types.DefaultMultipliers,
 | 
									ClaimMultipliers:         types.DefaultMultipliers,
 | 
				
			||||||
				ClaimEnd:                   time.Date(2025, 10, 15, 14, 0, 0, 0, time.UTC),
 | 
									ClaimEnd:                 time.Date(2025, 10, 15, 14, 0, 0, 0, time.UTC),
 | 
				
			||||||
			},
 | 
								},
 | 
				
			||||||
			errArgs{
 | 
								errArgs{
 | 
				
			||||||
				expectPass: false,
 | 
									expectPass: false,
 | 
				
			||||||
 | 
				
			|||||||
@ -11,6 +11,8 @@ const (
 | 
				
			|||||||
	QueryGetHardRewardsUnsynced        = "hard-rewards-unsynced"
 | 
						QueryGetHardRewardsUnsynced        = "hard-rewards-unsynced"
 | 
				
			||||||
	QueryGetUSDXMintingRewards         = "usdx-minting-rewards"
 | 
						QueryGetUSDXMintingRewards         = "usdx-minting-rewards"
 | 
				
			||||||
	QueryGetUSDXMintingRewardsUnsynced = "usdx-minting-rewards-unsynced"
 | 
						QueryGetUSDXMintingRewardsUnsynced = "usdx-minting-rewards-unsynced"
 | 
				
			||||||
 | 
						QueryGetDelegatorRewards           = "delegator-rewards"
 | 
				
			||||||
 | 
						QueryGetDelegatorRewardsUnsynced   = "delegator-rewards-unsynced"
 | 
				
			||||||
	QueryGetRewardFactors              = "reward-factors"
 | 
						QueryGetRewardFactors              = "reward-factors"
 | 
				
			||||||
	QueryGetParams                     = "parameters"
 | 
						QueryGetParams                     = "parameters"
 | 
				
			||||||
	QueryGetRewardPeriods              = "reward-periods"
 | 
						QueryGetRewardPeriods              = "reward-periods"
 | 
				
			||||||
@ -115,24 +117,56 @@ func NewQueryRewardFactorsParams(denom string) QueryRewardFactorsParams {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// QueryDelegatorRewardsParams params for query /incentive/rewards type delegator
 | 
				
			||||||
 | 
					type QueryDelegatorRewardsParams struct {
 | 
				
			||||||
 | 
						Page  int `json:"page" yaml:"page"`
 | 
				
			||||||
 | 
						Limit int `json:"limit" yaml:"limit"`
 | 
				
			||||||
 | 
						Owner sdk.AccAddress
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewQueryDelegatorRewardsParams returns QueryDelegatorRewardsParams
 | 
				
			||||||
 | 
					func NewQueryDelegatorRewardsParams(page, limit int, owner sdk.AccAddress) QueryDelegatorRewardsParams {
 | 
				
			||||||
 | 
						return QueryDelegatorRewardsParams{
 | 
				
			||||||
 | 
							Page:  page,
 | 
				
			||||||
 | 
							Limit: limit,
 | 
				
			||||||
 | 
							Owner: owner,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// QueryDelegatorRewardsUnsyncedParams params for query unsynced /incentive/rewards type delegator
 | 
				
			||||||
 | 
					type QueryDelegatorRewardsUnsyncedParams struct {
 | 
				
			||||||
 | 
						Page  int `json:"page" yaml:"page"`
 | 
				
			||||||
 | 
						Limit int `json:"limit" yaml:"limit"`
 | 
				
			||||||
 | 
						Owner sdk.AccAddress
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewQueryDelegatorRewardsUnsyncedParams returns QueryDelegatorRewardsUnsyncedParams
 | 
				
			||||||
 | 
					func NewQueryDelegatorRewardsUnsyncedParams(page, limit int, owner sdk.AccAddress) QueryDelegatorRewardsUnsyncedParams {
 | 
				
			||||||
 | 
						return QueryDelegatorRewardsUnsyncedParams{
 | 
				
			||||||
 | 
							Page:  page,
 | 
				
			||||||
 | 
							Limit: limit,
 | 
				
			||||||
 | 
							Owner: owner,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// RewardFactor is a unique type returned by reward factor queries
 | 
					// RewardFactor is a unique type returned by reward factor queries
 | 
				
			||||||
type RewardFactor struct {
 | 
					type RewardFactor struct {
 | 
				
			||||||
	Denom                      string        `json:"denom" yaml:"denom"`
 | 
						Denom                   string        `json:"denom" yaml:"denom"`
 | 
				
			||||||
	USDXMintingRewardFactor    sdk.Dec       `json:"usdx_minting_reward_factor" yaml:"usdx_minting_reward_factor"`
 | 
						USDXMintingRewardFactor sdk.Dec       `json:"usdx_minting_reward_factor" yaml:"usdx_minting_reward_factor"`
 | 
				
			||||||
	HardSupplyRewardFactors    RewardIndexes `json:"hard_supply_reward_factors" yaml:"hard_supply_reward_factors"`
 | 
						HardSupplyRewardFactors RewardIndexes `json:"hard_supply_reward_factors" yaml:"hard_supply_reward_factors"`
 | 
				
			||||||
	HardBorrowRewardFactors    RewardIndexes `json:"hard_borrow_reward_factors" yaml:"hard_borrow_reward_factors"`
 | 
						HardBorrowRewardFactors RewardIndexes `json:"hard_borrow_reward_factors" yaml:"hard_borrow_reward_factors"`
 | 
				
			||||||
	HardDelegatorRewardFactors RewardIndexes `json:"hard_delegator_reward_factors" yaml:"hard_delegator_reward_factors"`
 | 
						DelegatorRewardFactors  RewardIndexes `json:"delegator_reward_factors" yaml:"delegator_reward_factors"`
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewRewardFactor returns a new instance of RewardFactor
 | 
					// NewRewardFactor returns a new instance of RewardFactor
 | 
				
			||||||
func NewRewardFactor(denom string, usdxMintingRewardFactor sdk.Dec, hardSupplyRewardFactors,
 | 
					func NewRewardFactor(denom string, usdxMintingRewardFactor sdk.Dec, hardSupplyRewardFactors,
 | 
				
			||||||
	hardBorrowRewardFactors, hardDelegatorRewardFactors RewardIndexes) RewardFactor {
 | 
						hardBorrowRewardFactors, delegatorRewardFactors RewardIndexes) RewardFactor {
 | 
				
			||||||
	return RewardFactor{
 | 
						return RewardFactor{
 | 
				
			||||||
		Denom:                      denom,
 | 
							Denom:                   denom,
 | 
				
			||||||
		USDXMintingRewardFactor:    usdxMintingRewardFactor,
 | 
							USDXMintingRewardFactor: usdxMintingRewardFactor,
 | 
				
			||||||
		HardSupplyRewardFactors:    hardSupplyRewardFactors,
 | 
							HardSupplyRewardFactors: hardSupplyRewardFactors,
 | 
				
			||||||
		HardBorrowRewardFactors:    hardBorrowRewardFactors,
 | 
							HardBorrowRewardFactors: hardBorrowRewardFactors,
 | 
				
			||||||
		HardDelegatorRewardFactors: hardDelegatorRewardFactors,
 | 
							DelegatorRewardFactors:  delegatorRewardFactors,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user