mirror of
				https://github.com/0glabs/0g-chain.git
				synced 2025-10-31 10:27:27 +00:00 
			
		
		
		
	Swap users accumulate rewards (#950)
* add swap claim type * add store methods for swap claims * add swap claims to genesis state * tidy up cdp and hard hook doc comments * add uncalled hooks to the swap keeper * add swap rewards sync method * add swap rewards init method * connect swap rewards via swap hooks * Update querier and client for swap claims (#951) * refactor querier to dedupe code * add swap claims querier endpoint * add swap claim querying to rest * add swap claim querying to cli * add keeper method to iterate swap reward indexes * simplify reward-factors query endpoint, add swap * update swap hook to match latest swap branch * rename func to not collide with latest swap branch * Squash merge swap-acceptance branch (#956) * add failing acceptance test for a user depositing into a pool * implement GetAccount test helper * implement swap.MsgDeposit for creating and adding liquidity to a pool * update aliases, add event types, and fix typo/compiler errors in handler test * use only aliases names in handler test (don't use swap types -- ensures we have run aliasgen), add assertion for even type message * implement account and module account balance checks in handler test * fill out handler assertions for testing keeper state and events * update signed json representation and register swap/MsgDeposit for proper encoding * fill out boilerplate to get handler test to compile * alias gen for pool * add handling of message type; fill in deposit keeper method for succesful compile; noop but test assertions now run up to module acc not nil check * add module account permissions for swap module -- fixes module account creation; pass account keeper and supply keeper into swap keeper to allow the ability to work with user and module accounts * implement create pool logic for msg deposit; allows creation of a of new pool, checking params to see if it is allowed. Initi shares are set, and senders number of shares are stored * Swap migrations scaffolding (#925) * swap module scaffolding * global swap fee * can't think of a reason for begin blocker; removing for abci.go for now; * test pair types; refactor pair name logic; simplify pairs validation and fix stack overflow error * check comparison * use test package * init swap module genesis * add basic marshall tests * remove reward apy from pairs * fix integration helpers * use max swap fee constant; fix validation of swap fee; add tests to cover param validation and param set setup * use noerror over nil * start genesis tests * test param set validation mirrors param validation * add genesis tests * remove print statement * add subtests for genesis test cases; add extra querier test for unknown route; add keeper params testing * add spec * update swagger * find replace hard -> swap in comments * remove unused method * rename pairs to allowed pools; pool is more commonly used, and allowedPool makes it more clear what swap parameter is for. In addition, we won't conflict with Pool data structure for storing a created pool in the store. * remove generated link * missed spec rename * validate token order for allowed pools * fix swagger * json should be snakecase; change allowedPools to allowed_pools * add legacy types * add swap genesis to v0_15 migration * add legacy types * add swap genesis to v0_15 migration * migration revisions Co-authored-by: Nick DeLuca <nickdeluca08@gmail.com> * keeper todos * update keeper tests * type todos * update types tests * tx deposit cli cmd * tx deposit rest * Swap module simulation scaffolding (#924) * sims scaffolding * add noop operation * genesis revisions * add param changes * mvoe persistance methods to main keeper file, consolidate tests * make helper methods private. they are tested via deposit method, and unit testing them would make test suite brittle and refactoring difficult * use more clear coin variables * code 1 is reserved, use code 2 and sequence all errors * remove todo * Implement deadline for swap module module message. This is implemented in handler with a interface to easily apply to it to all messages, and separate msg validation concerns from the keeper * move allowed pools to params -- let pool and pool_test focus on pool domain logic, not parameter & governance concerns * update alias * add unitless implementatin of constant product liquidity pool to isolate and enapsulate liquidity logic. Swap methods interfaces are added, but implementation not yet added * nits and todos * add ErrInvalidPool * add tests for edge cases around pool depletion; add explicit panic for edge case that results in a pool reserve being zero; handle pool reinitialization if it is empty * touch up comments and flush out the rest of assertions * add data structures for keeper state storage separate from pool domain objects, and improve structure for easier querying * rename pool name to pool key for events * add support for a denominated pool that uses sdk.Coins and sdk.Coin arguments, keeping tracking of the units in the base pool. This gives nice separation between pool logic, and coin/denom logic * refactor keeper to use new records for storage, and implement pool deposit using the denominated pool * address previous PR comment - reminder for migration if changing account permissions * msg deposit should validate that denoms are not equal * add godoc comments * golint and some poolName -> poolID cleanup * implement adding liquidity to an existing pool * hardcode pools in sims * touch up comment * withdraw keeper logic * withdraw type updates * add withdraw msg tx handler * initial withdraw test * fix panic * use new denominated pool with existing shares * fix: check args on deposit cmd * add slippage limit check for depositing to an existing pool * send coins just before event emission * check liquidity returned is greater than zero for both coins; ensure returned number of shares are greater than zero * add deadline to msgwithdraw * register msgwithdraw * scaffold msgwithdraw types test * register the correct msg * modify swap functions to also return the amount paid for the pool swap fee. This will be used to calculate slippage and for event tracking * add slippage types * add expected withdrawal coins * calculate slippage against expected coins * update withdraw keeper tests * spelling, improve comments on add liquidity math * typo * typo * grammer * typo / grammer * remove pool_id from withdraw msg * add slippage to tx cmd * TestWithdraw_Partial * nit * add withdraw no pool, no deposit record tests * drop event check on partial withdraw test * fix broken link * fix broken link * resolve merge conflicts * ensure swap fee can not be equal to 1; add full implementation of swap pool methods; these implementation ensure that the pool invariant is always greater or equal to the previous invariant * refactor duplicated code into private swap methods * add runtime assertion to always ensure invariant is greater or equal to the previous invariant sub fee on swaps * improve comments for base pool swap functions * add swap exact input and output methods to denominated pool that wrap the base pool interface for swapping * comment touch ups * more comment touchups * fix msg deposit struct tag (#943) * use better name for swap calculation private methods * nits: golint * fix misspelling in method name * Add HARD token governance committee for Hard module (#941) * add hard gov token committee * revisions: update migration * revisions: update test/data file * initial revisions * add TokenCommittee JSONMarshal test * fix SetPermissions method * remove BaseCommittee Type field * add incentive params to allowed params * Add SWP token governance committee for Swap module (#946) * add swp token commitee to migration * update test, add gen export utility method * final revisions: add TODO * remove slippage from withdraw to use min values for coins; add additional validation test cases * update alias for swap module * add withdraw tests to handler for increased coverage; note: first pass, improvements still yet to be made here * refact withdraw keeper to use min amounts; panic for cases that do not happen in normal situations * lint fixes * use total shares to track if pool should be deleted; add more in depth withdraw comment * add exact args for withdraw cmd * extract record update methods * update depositor share record if it exists -- do not overwrite an existing record; ensures no loss of shares if the same address deposits more than once * Swap queries: deposit, pool, pools (#949) * query deposits types * implement deposit querier keeper methods * query deposits CLI * query deposits REST * query types for pool/pools * pool/pools querier keeper methods * pool/pools CLI * pool/pools REST * basic pool/pools query tests * basic deposit querier test * iterate share records via owner bytes * nit: add example for querying deposits by owner only Co-authored-by: karzak <kjydavis3@gmail.com> * feat: add REST tx handler for swap LP withdrawals Co-authored-by: Nick DeLuca <nickdeluca08@gmail.com> Co-authored-by: Denali Marsh <denali@kava.io> Co-authored-by: denalimarsh <denalimarsh@gmail.com> Co-authored-by: karzak <kjydavis3@gmail.com> * expand incentive cli query docs Co-authored-by: Nick DeLuca <nickdeluca08@gmail.com> Co-authored-by: Denali Marsh <denali@kava.io> Co-authored-by: denalimarsh <denalimarsh@gmail.com> Co-authored-by: karzak <kjydavis3@gmail.com> * minor update to godoc comment Co-authored-by: Nick DeLuca <nickdeluca08@gmail.com> Co-authored-by: Denali Marsh <denali@kava.io> Co-authored-by: denalimarsh <denalimarsh@gmail.com> Co-authored-by: karzak <kjydavis3@gmail.com>
This commit is contained in:
		
							parent
							
								
									65052ce31a
								
							
						
					
					
						commit
						4beaf0de54
					
				| @ -390,7 +390,7 @@ func NewApp(logger log.Logger, db dbm.DB, traceStore io.Writer, appOpts AppOptio | ||||
| 		app.accountKeeper, | ||||
| 		app.supplyKeeper, | ||||
| 	) | ||||
| 	app.swapKeeper = swap.NewKeeper( | ||||
| 	swapKeeper := swap.NewKeeper( | ||||
| 		app.cdc, | ||||
| 		keys[swap.StoreKey], | ||||
| 		swapSubspace, | ||||
| @ -406,11 +406,11 @@ func NewApp(logger log.Logger, db dbm.DB, traceStore io.Writer, appOpts AppOptio | ||||
| 		&hardKeeper, | ||||
| 		app.accountKeeper, | ||||
| 		&stakingKeeper, | ||||
| 		app.swapKeeper, | ||||
| 		&swapKeeper, | ||||
| 	) | ||||
| 
 | ||||
| 	// register the staking hooks
 | ||||
| 	// NOTE: stakingKeeper above is passed by reference, so that it will contain these hooks
 | ||||
| 	// NOTE: These keepers are passed by reference above, so they will contain these hooks.
 | ||||
| 	app.stakingKeeper = *stakingKeeper.SetHooks( | ||||
| 		staking.NewMultiStakingHooks(app.distrKeeper.Hooks(), app.slashingKeeper.Hooks(), app.incentiveKeeper.Hooks())) | ||||
| 
 | ||||
| @ -418,6 +418,8 @@ func NewApp(logger log.Logger, db dbm.DB, traceStore io.Writer, appOpts AppOptio | ||||
| 
 | ||||
| 	app.hardKeeper = *hardKeeper.SetHooks(hard.NewMultiHARDHooks(app.incentiveKeeper.Hooks())) | ||||
| 
 | ||||
| 	app.swapKeeper = *swapKeeper.SetHooks(app.incentiveKeeper.Hooks()) | ||||
| 
 | ||||
| 	// create the module manager (Note: Any module instantiated in the module manager that is later modified
 | ||||
| 	// must be passed by reference here.)
 | ||||
| 	app.mm = module.NewManager( | ||||
|  | ||||
| @ -448,9 +448,10 @@ func Incentive(incentiveGS v0_14incentive.GenesisState) v0_15incentive.GenesisSt | ||||
| 		hardSupplyAccumulationTimes, | ||||
| 		hardBorrowAccumulationTimes, | ||||
| 		hardDelegatorAccumulationTimes, | ||||
| 		v0_15incentive.DefaultGenesisAccumulationTimes, // There is no previous swap rewards to accumulation starts at genesis time.
 | ||||
| 		v0_15incentive.DefaultGenesisAccumulationTimes, // There is no previous swap rewards so accumulation starts at genesis time.
 | ||||
| 		usdxMintingClaims, | ||||
| 		hardClaims, | ||||
| 		delegatorClaims, | ||||
| 		v0_15incentive.DefaultSwapClaims, | ||||
| 	) | ||||
| } | ||||
|  | ||||
| @ -45,10 +45,10 @@ func NewKeeper(cdc *codec.Codec, key sdk.StoreKey, paramstore subspace.Subspace, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // SetHooks sets the cdp keeper hooks
 | ||||
| // SetHooks adds hooks to the keeper.
 | ||||
| func (k *Keeper) SetHooks(hooks types.CDPHooks) *Keeper { | ||||
| 	if k.hooks != nil { | ||||
| 		panic("cannot set validator hooks twice") | ||||
| 		panic("cannot set cdp hooks twice") | ||||
| 	} | ||||
| 	k.hooks = hooks | ||||
| 	return k | ||||
|  | ||||
| @ -45,10 +45,10 @@ func NewKeeper(cdc *codec.Codec, key sdk.StoreKey, paramstore subspace.Subspace, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // SetHooks sets the cdp keeper hooks
 | ||||
| // SetHooks adds hooks to the keeper.
 | ||||
| func (k *Keeper) SetHooks(hooks types.HARDHooks) *Keeper { | ||||
| 	if k.hooks != nil { | ||||
| 		panic("cannot set validator hooks twice") | ||||
| 		panic("cannot set hard hooks twice") | ||||
| 	} | ||||
| 	k.hooks = hooks | ||||
| 	return k | ||||
|  | ||||
| @ -1,8 +1,5 @@ | ||||
| // nolint
 | ||||
| // autogenerated code using github.com/rigelrozanski/multitool
 | ||||
| // aliases generated for the following subdirectories:
 | ||||
| // ALIASGEN: github.com/kava-labs/kava/x/incentive/types
 | ||||
| // ALIASGEN: github.com/kava-labs/kava/x/incentive/keeper
 | ||||
| // Code generated by aliasgen tool (github.com/rhuairahrighairidh/aliasgen) DO NOT EDIT.
 | ||||
| 
 | ||||
| package incentive | ||||
| 
 | ||||
| import ( | ||||
| @ -11,166 +8,175 @@ import ( | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	USDXMintingClaimType               = types.USDXMintingClaimType | ||||
| 	HardLiquidityProviderClaimType     = types.HardLiquidityProviderClaimType | ||||
| 	BondDenom                          = types.BondDenom | ||||
| 	EventTypeClaim                     = types.EventTypeClaim | ||||
| 	EventTypeRewardPeriod              = types.EventTypeRewardPeriod | ||||
| 	EventTypeClaimPeriod               = types.EventTypeClaimPeriod | ||||
| 	EventTypeClaimPeriodExpiry         = types.EventTypeClaimPeriodExpiry | ||||
| 	AttributeValueCategory             = types.AttributeValueCategory | ||||
| 	AttributeKeyClaimedBy              = types.AttributeKeyClaimedBy | ||||
| 	AttributeKeyClaimAmount            = types.AttributeKeyClaimAmount | ||||
| 	AttributeKeyClaimType              = types.AttributeKeyClaimType | ||||
| 	AttributeKeyRewardPeriod           = types.AttributeKeyRewardPeriod | ||||
| 	AttributeKeyClaimPeriod            = types.AttributeKeyClaimPeriod | ||||
| 	ModuleName                         = types.ModuleName | ||||
| 	StoreKey                           = types.StoreKey | ||||
| 	RouterKey                          = types.RouterKey | ||||
| 	DefaultParamspace                  = types.DefaultParamspace | ||||
| 	QuerierRoute                       = types.QuerierRoute | ||||
| 	Small                              = types.Small | ||||
| 	Medium                             = types.Medium | ||||
| 	Large                              = types.Large | ||||
| 	QueryGetRewards                    = types.QueryGetRewards | ||||
| 	QueryGetHardRewards                = types.QueryGetHardRewards | ||||
| 	QueryGetHardRewardsUnsynced        = types.QueryGetHardRewardsUnsynced | ||||
| 	QueryGetUSDXMintingRewards         = types.QueryGetUSDXMintingRewards | ||||
| 	QueryGetUSDXMintingRewardsUnsynced = types.QueryGetUSDXMintingRewardsUnsynced | ||||
| 	QueryGetRewardFactors              = types.QueryGetRewardFactors | ||||
| 	QueryGetParams                     = types.QueryGetParams | ||||
| 	QueryGetRewardPeriods              = types.QueryGetRewardPeriods | ||||
| 	QueryGetClaimPeriods               = types.QueryGetClaimPeriods | ||||
| 	RestClaimCollateralType            = types.RestClaimCollateralType | ||||
| 	RestClaimOwner                     = types.RestClaimOwner | ||||
| 	RestClaimType                      = types.RestClaimType | ||||
| 	RestUnsynced                       = types.RestUnsynced | ||||
| 	BeginningOfMonth                   = keeper.BeginningOfMonth | ||||
| 	MidMonth                           = keeper.MidMonth | ||||
| 	PaymentHour                        = keeper.PaymentHour | ||||
| 	BeginningOfMonth               = keeper.BeginningOfMonth | ||||
| 	MidMonth                       = keeper.MidMonth | ||||
| 	PaymentHour                    = keeper.PaymentHour | ||||
| 	AttributeKeyClaimAmount        = types.AttributeKeyClaimAmount | ||||
| 	AttributeKeyClaimPeriod        = types.AttributeKeyClaimPeriod | ||||
| 	AttributeKeyClaimType          = types.AttributeKeyClaimType | ||||
| 	AttributeKeyClaimedBy          = types.AttributeKeyClaimedBy | ||||
| 	AttributeKeyRewardPeriod       = types.AttributeKeyRewardPeriod | ||||
| 	AttributeValueCategory         = types.AttributeValueCategory | ||||
| 	BondDenom                      = types.BondDenom | ||||
| 	DefaultParamspace              = types.DefaultParamspace | ||||
| 	DelegatorClaimType             = types.DelegatorClaimType | ||||
| 	EventTypeClaim                 = types.EventTypeClaim | ||||
| 	EventTypeClaimPeriod           = types.EventTypeClaimPeriod | ||||
| 	EventTypeClaimPeriodExpiry     = types.EventTypeClaimPeriodExpiry | ||||
| 	EventTypeRewardPeriod          = types.EventTypeRewardPeriod | ||||
| 	HardLiquidityProviderClaimType = types.HardLiquidityProviderClaimType | ||||
| 	Large                          = types.Large | ||||
| 	Medium                         = types.Medium | ||||
| 	ModuleName                     = types.ModuleName | ||||
| 	QuerierRoute                   = types.QuerierRoute | ||||
| 	QueryGetDelegatorRewards       = types.QueryGetDelegatorRewards | ||||
| 	QueryGetHardRewards            = types.QueryGetHardRewards | ||||
| 	QueryGetParams                 = types.QueryGetParams | ||||
| 	QueryGetRewardFactors          = types.QueryGetRewardFactors | ||||
| 	QueryGetSwapRewards            = types.QueryGetSwapRewards | ||||
| 	QueryGetUSDXMintingRewards     = types.QueryGetUSDXMintingRewards | ||||
| 	RestClaimCollateralType        = types.RestClaimCollateralType | ||||
| 	RestClaimOwner                 = types.RestClaimOwner | ||||
| 	RestClaimType                  = types.RestClaimType | ||||
| 	RestUnsynced                   = types.RestUnsynced | ||||
| 	RouterKey                      = types.RouterKey | ||||
| 	Small                          = types.Small | ||||
| 	StoreKey                       = types.StoreKey | ||||
| 	SwapClaimType                  = types.SwapClaimType | ||||
| 	USDXMintingClaimType           = types.USDXMintingClaimType | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	// functions aliases
 | ||||
| 	GetTotalVestingPeriodLength              = types.GetTotalVestingPeriodLength | ||||
| 	NewUSDXMintingClaim                      = types.NewUSDXMintingClaim | ||||
| 	NewHardLiquidityProviderClaim            = types.NewHardLiquidityProviderClaim | ||||
| 	NewMultiRewardPeriod                     = types.NewMultiRewardPeriod | ||||
| 	NewRewardIndex                           = types.NewRewardIndex | ||||
| 	NewMultiRewardIndex                      = types.NewMultiRewardIndex | ||||
| 	RegisterCodec                            = types.RegisterCodec | ||||
| 	NewGenesisState                          = types.NewGenesisState | ||||
| 	DefaultGenesisState                      = types.DefaultGenesisState | ||||
| 	NewGenesisAccumulationTime               = types.NewGenesisAccumulationTime | ||||
| 	NewMsgClaimUSDXMintingReward             = types.NewMsgClaimUSDXMintingReward | ||||
| 	NewMsgClaimUSDXMintingRewardVVesting     = types.NewMsgClaimUSDXMintingRewardVVesting | ||||
| 	NewMsgClaimHardReward                    = types.NewMsgClaimHardReward | ||||
| 	NewMsgClaimHardRewardVVesting            = types.NewMsgClaimHardRewardVVesting | ||||
| 	NewParams                                = types.NewParams | ||||
| 	DefaultParams                            = types.DefaultParams | ||||
| 	ParamKeyTable                            = types.ParamKeyTable | ||||
| 	NewRewardPeriod                          = types.NewRewardPeriod | ||||
| 	NewMultiplier                            = types.NewMultiplier | ||||
| 	NewPeriod                                = types.NewPeriod | ||||
| 	NewQueryRewardsParams                    = types.NewQueryRewardsParams | ||||
| 	NewQueryUSDXMintingRewardsParams         = types.NewQueryUSDXMintingRewardsParams | ||||
| 	NewQueryUSDXMintingRewardsUnsyncedParams = types.NewQueryUSDXMintingRewardsUnsyncedParams | ||||
| 	NewQueryHardRewardsParams                = types.NewQueryHardRewardsParams | ||||
| 	NewQueryHardRewardsUnsyncedParams        = types.NewQueryHardRewardsUnsyncedParams | ||||
| 	NewQueryRewardFactorsParams              = types.NewQueryRewardFactorsParams | ||||
| 	NewRewardFactor                          = types.NewRewardFactor | ||||
| 	NewKeeper                                = keeper.NewKeeper | ||||
| 	NewQuerier                               = keeper.NewQuerier | ||||
| 	CalculateTimeElapsed                     = keeper.CalculateTimeElapsed | ||||
| 	// function aliases
 | ||||
| 	CalculateTimeElapsed                 = keeper.CalculateTimeElapsed | ||||
| 	NewKeeper                            = keeper.NewKeeper | ||||
| 	NewQuerier                           = keeper.NewQuerier | ||||
| 	DefaultGenesisState                  = types.DefaultGenesisState | ||||
| 	DefaultParams                        = types.DefaultParams | ||||
| 	GetTotalVestingPeriodLength          = types.GetTotalVestingPeriodLength | ||||
| 	NewAccumulator                       = types.NewAccumulator | ||||
| 	NewDelegatorClaim                    = types.NewDelegatorClaim | ||||
| 	NewGenesisAccumulationTime           = types.NewGenesisAccumulationTime | ||||
| 	NewGenesisState                      = types.NewGenesisState | ||||
| 	NewHardLiquidityProviderClaim        = types.NewHardLiquidityProviderClaim | ||||
| 	NewMsgClaimDelegatorReward           = types.NewMsgClaimDelegatorReward | ||||
| 	NewMsgClaimDelegatorRewardVVesting   = types.NewMsgClaimDelegatorRewardVVesting | ||||
| 	NewMsgClaimHardReward                = types.NewMsgClaimHardReward | ||||
| 	NewMsgClaimHardRewardVVesting        = types.NewMsgClaimHardRewardVVesting | ||||
| 	NewMsgClaimUSDXMintingReward         = types.NewMsgClaimUSDXMintingReward | ||||
| 	NewMsgClaimUSDXMintingRewardVVesting = types.NewMsgClaimUSDXMintingRewardVVesting | ||||
| 	NewMultiRewardIndex                  = types.NewMultiRewardIndex | ||||
| 	NewMultiRewardPeriod                 = types.NewMultiRewardPeriod | ||||
| 	NewMultiplier                        = types.NewMultiplier | ||||
| 	NewParams                            = types.NewParams | ||||
| 	NewPeriod                            = types.NewPeriod | ||||
| 	NewQueryGetRewardFactorsResponse     = types.NewQueryGetRewardFactorsResponse | ||||
| 	NewQueryRewardsParams                = types.NewQueryRewardsParams | ||||
| 	NewRewardIndex                       = types.NewRewardIndex | ||||
| 	NewRewardPeriod                      = types.NewRewardPeriod | ||||
| 	NewSwapClaim                         = types.NewSwapClaim | ||||
| 	NewUSDXMintingClaim                  = types.NewUSDXMintingClaim | ||||
| 	ParamKeyTable                        = types.ParamKeyTable | ||||
| 	RegisterCodec                        = types.RegisterCodec | ||||
| 
 | ||||
| 	// variable aliases
 | ||||
| 	ModuleCdc                                     = types.ModuleCdc | ||||
| 	ErrClaimNotFound                              = types.ErrClaimNotFound | ||||
| 	ErrRewardPeriodNotFound                       = types.ErrRewardPeriodNotFound | ||||
| 	ErrInvalidAccountType                         = types.ErrInvalidAccountType | ||||
| 	ErrNoClaimsFound                              = types.ErrNoClaimsFound | ||||
| 	ErrInsufficientModAccountBalance              = types.ErrInsufficientModAccountBalance | ||||
| 	ErrAccountNotFound                            = types.ErrAccountNotFound | ||||
| 	ErrInvalidMultiplier                          = types.ErrInvalidMultiplier | ||||
| 	ErrZeroClaim                                  = types.ErrZeroClaim | ||||
| 	ErrClaimExpired                               = types.ErrClaimExpired | ||||
| 	ErrInvalidClaimType                           = types.ErrInvalidClaimType | ||||
| 	ErrInvalidClaimOwner                          = types.ErrInvalidClaimOwner | ||||
| 	USDXMintingClaimKeyPrefix                     = types.USDXMintingClaimKeyPrefix | ||||
| 	USDXMintingRewardFactorKeyPrefix              = types.USDXMintingRewardFactorKeyPrefix | ||||
| 	PreviousUSDXMintingRewardAccrualTimeKeyPrefix = types.PreviousUSDXMintingRewardAccrualTimeKeyPrefix | ||||
| 	HardLiquidityClaimKeyPrefix                   = types.HardLiquidityClaimKeyPrefix | ||||
| 	HardSupplyRewardIndexesKeyPrefix              = types.HardSupplyRewardIndexesKeyPrefix | ||||
| 	PreviousHardSupplyRewardAccrualTimeKeyPrefix  = types.PreviousHardSupplyRewardAccrualTimeKeyPrefix | ||||
| 	HardBorrowRewardIndexesKeyPrefix              = types.HardBorrowRewardIndexesKeyPrefix | ||||
| 	PreviousHardBorrowRewardAccrualTimeKeyPrefix  = types.PreviousHardBorrowRewardAccrualTimeKeyPrefix | ||||
| 	DelegatorRewardIndexesKeyPrefix               = types.DelegatorRewardIndexesKeyPrefix | ||||
| 	PreviousDelegatorRewardAccrualTimeKeyPrefix   = types.PreviousDelegatorRewardAccrualTimeKeyPrefix | ||||
| 	USDXMintingRewardDenom                        = types.USDXMintingRewardDenom | ||||
| 	HardLiquidityRewardDenom                      = types.HardLiquidityRewardDenom | ||||
| 	KeyUSDXMintingRewardPeriods                   = types.KeyUSDXMintingRewardPeriods | ||||
| 	KeyHardSupplyRewardPeriods                    = types.KeyHardSupplyRewardPeriods | ||||
| 	KeyHardBorrowRewardPeriods                    = types.KeyHardBorrowRewardPeriods | ||||
| 	KeyDelegatorRewardPeriods                     = types.KeyDelegatorRewardPeriods | ||||
| 	KeyClaimEnd                                   = types.KeyClaimEnd | ||||
| 	KeyMultipliers                                = types.KeyMultipliers | ||||
| 	DefaultActive                                 = types.DefaultActive | ||||
| 	DefaultRewardPeriods                          = types.DefaultRewardPeriods | ||||
| 	DefaultClaimEnd                               = types.DefaultClaimEnd | ||||
| 	DefaultDelegatorClaims                        = types.DefaultDelegatorClaims | ||||
| 	DefaultGenesisAccumulationTimes               = types.DefaultGenesisAccumulationTimes | ||||
| 	DefaultHardClaims                             = types.DefaultHardClaims | ||||
| 	DefaultMultiRewardPeriods                     = types.DefaultMultiRewardPeriods | ||||
| 	DefaultMultipliers                            = types.DefaultMultipliers | ||||
| 	DefaultDelegatorClaims                        = types.DefaultDelegatorClaims | ||||
| 	DefaultRewardPeriods                          = types.DefaultRewardPeriods | ||||
| 	DefaultSwapClaims                             = types.DefaultSwapClaims | ||||
| 	DefaultUSDXClaims                             = types.DefaultUSDXClaims | ||||
| 	DefaultHardClaims                             = types.DefaultHardClaims | ||||
| 	DefaultGenesisAccumulationTimes               = types.DefaultGenesisAccumulationTimes | ||||
| 	DefaultClaimEnd                               = types.DefaultClaimEnd | ||||
| 	DelegatorClaimKeyPrefix                       = types.DelegatorClaimKeyPrefix | ||||
| 	DelegatorRewardIndexesKeyPrefix               = types.DelegatorRewardIndexesKeyPrefix | ||||
| 	ErrAccountNotFound                            = types.ErrAccountNotFound | ||||
| 	ErrClaimExpired                               = types.ErrClaimExpired | ||||
| 	ErrClaimNotFound                              = types.ErrClaimNotFound | ||||
| 	ErrDecreasingRewardFactor                     = types.ErrDecreasingRewardFactor | ||||
| 	ErrInsufficientModAccountBalance              = types.ErrInsufficientModAccountBalance | ||||
| 	ErrInvalidAccountType                         = types.ErrInvalidAccountType | ||||
| 	ErrInvalidClaimOwner                          = types.ErrInvalidClaimOwner | ||||
| 	ErrInvalidClaimType                           = types.ErrInvalidClaimType | ||||
| 	ErrInvalidMultiplier                          = types.ErrInvalidMultiplier | ||||
| 	ErrNoClaimsFound                              = types.ErrNoClaimsFound | ||||
| 	ErrRewardPeriodNotFound                       = types.ErrRewardPeriodNotFound | ||||
| 	ErrZeroClaim                                  = types.ErrZeroClaim | ||||
| 	GovDenom                                      = types.GovDenom | ||||
| 	PrincipalDenom                                = types.PrincipalDenom | ||||
| 	HardBorrowRewardIndexesKeyPrefix              = types.HardBorrowRewardIndexesKeyPrefix | ||||
| 	HardLiquidityClaimKeyPrefix                   = types.HardLiquidityClaimKeyPrefix | ||||
| 	HardLiquidityRewardDenom                      = types.HardLiquidityRewardDenom | ||||
| 	HardSupplyRewardIndexesKeyPrefix              = types.HardSupplyRewardIndexesKeyPrefix | ||||
| 	IncentiveMacc                                 = types.IncentiveMacc | ||||
| 	KeyClaimEnd                                   = types.KeyClaimEnd | ||||
| 	KeyDelegatorRewardPeriods                     = types.KeyDelegatorRewardPeriods | ||||
| 	KeyHardBorrowRewardPeriods                    = types.KeyHardBorrowRewardPeriods | ||||
| 	KeyHardSupplyRewardPeriods                    = types.KeyHardSupplyRewardPeriods | ||||
| 	KeyMultipliers                                = types.KeyMultipliers | ||||
| 	KeySwapRewardPeriods                          = types.KeySwapRewardPeriods | ||||
| 	KeyUSDXMintingRewardPeriods                   = types.KeyUSDXMintingRewardPeriods | ||||
| 	ModuleCdc                                     = types.ModuleCdc | ||||
| 	PreviousDelegatorRewardAccrualTimeKeyPrefix   = types.PreviousDelegatorRewardAccrualTimeKeyPrefix | ||||
| 	PreviousHardBorrowRewardAccrualTimeKeyPrefix  = types.PreviousHardBorrowRewardAccrualTimeKeyPrefix | ||||
| 	PreviousHardSupplyRewardAccrualTimeKeyPrefix  = types.PreviousHardSupplyRewardAccrualTimeKeyPrefix | ||||
| 	PreviousSwapRewardAccrualTimeKeyPrefix        = types.PreviousSwapRewardAccrualTimeKeyPrefix | ||||
| 	PreviousUSDXMintingRewardAccrualTimeKeyPrefix = types.PreviousUSDXMintingRewardAccrualTimeKeyPrefix | ||||
| 	PrincipalDenom                                = types.PrincipalDenom | ||||
| 	SwapClaimKeyPrefix                            = types.SwapClaimKeyPrefix | ||||
| 	SwapRewardIndexesKeyPrefix                    = types.SwapRewardIndexesKeyPrefix | ||||
| 	USDXMintingClaimKeyPrefix                     = types.USDXMintingClaimKeyPrefix | ||||
| 	USDXMintingRewardDenom                        = types.USDXMintingRewardDenom | ||||
| 	USDXMintingRewardFactorKeyPrefix              = types.USDXMintingRewardFactorKeyPrefix | ||||
| ) | ||||
| 
 | ||||
| type ( | ||||
| 	Claim                                 = types.Claim | ||||
| 	Claims                                = types.Claims | ||||
| 	BaseClaim                             = types.BaseClaim | ||||
| 	BaseMultiClaim                        = types.BaseMultiClaim | ||||
| 	USDXMintingClaim                      = types.USDXMintingClaim | ||||
| 	USDXMintingClaims                     = types.USDXMintingClaims | ||||
| 	HardLiquidityProviderClaim            = types.HardLiquidityProviderClaim | ||||
| 	HardLiquidityProviderClaims           = types.HardLiquidityProviderClaims | ||||
| 	MultiRewardPeriod                     = types.MultiRewardPeriod | ||||
| 	MultiRewardPeriods                    = types.MultiRewardPeriods | ||||
| 	RewardIndex                           = types.RewardIndex | ||||
| 	RewardIndexes                         = types.RewardIndexes | ||||
| 	MultiRewardIndex                      = types.MultiRewardIndex | ||||
| 	MultiRewardIndexes                    = types.MultiRewardIndexes | ||||
| 	SupplyKeeper                          = types.SupplyKeeper | ||||
| 	StakingKeeper                         = types.StakingKeeper | ||||
| 	CdpKeeper                             = types.CdpKeeper | ||||
| 	HardKeeper                            = types.HardKeeper | ||||
| 	AccountKeeper                         = types.AccountKeeper | ||||
| 	CDPHooks                              = types.CDPHooks | ||||
| 	HARDHooks                             = types.HARDHooks | ||||
| 	GenesisState                          = types.GenesisState | ||||
| 	GenesisAccumulationTime               = types.GenesisAccumulationTime | ||||
| 	GenesisAccumulationTimes              = types.GenesisAccumulationTimes | ||||
| 	MsgClaimUSDXMintingReward             = types.MsgClaimUSDXMintingReward | ||||
| 	MsgClaimUSDXMintingRewardVVesting     = types.MsgClaimUSDXMintingRewardVVesting | ||||
| 	MsgClaimHardReward                    = types.MsgClaimHardReward | ||||
| 	MsgClaimHardRewardVVesting            = types.MsgClaimHardRewardVVesting | ||||
| 	Params                                = types.Params | ||||
| 	RewardPeriod                          = types.RewardPeriod | ||||
| 	RewardPeriods                         = types.RewardPeriods | ||||
| 	Multiplier                            = types.Multiplier | ||||
| 	Multipliers                           = types.Multipliers | ||||
| 	MultiplierName                        = types.MultiplierName | ||||
| 	QueryRewardsParams                    = types.QueryRewardsParams | ||||
| 	QueryUSDXMintingRewardsParams         = types.QueryUSDXMintingRewardsParams | ||||
| 	QueryUSDXMintingRewardsUnsyncedParams = types.QueryUSDXMintingRewardsUnsyncedParams | ||||
| 	QueryHardRewardsParams                = types.QueryHardRewardsParams | ||||
| 	QueryHardRewardsUnsyncedParams        = types.QueryHardRewardsUnsyncedParams | ||||
| 	QueryRewardFactorsParams              = types.QueryRewardFactorsParams | ||||
| 	RewardFactor                          = types.RewardFactor | ||||
| 	RewardFactors                         = types.RewardFactors | ||||
| 	Hooks                                 = keeper.Hooks | ||||
| 	Keeper                                = keeper.Keeper | ||||
| 	Hooks                             = keeper.Hooks | ||||
| 	Keeper                            = keeper.Keeper | ||||
| 	AccountKeeper                     = types.AccountKeeper | ||||
| 	Accumulator                       = types.Accumulator | ||||
| 	BaseClaim                         = types.BaseClaim | ||||
| 	BaseMultiClaim                    = types.BaseMultiClaim | ||||
| 	CDPHooks                          = types.CDPHooks | ||||
| 	CdpKeeper                         = types.CdpKeeper | ||||
| 	Claim                             = types.Claim | ||||
| 	Claims                            = types.Claims | ||||
| 	DelegatorClaim                    = types.DelegatorClaim | ||||
| 	DelegatorClaims                   = types.DelegatorClaims | ||||
| 	GenesisAccumulationTime           = types.GenesisAccumulationTime | ||||
| 	GenesisAccumulationTimes          = types.GenesisAccumulationTimes | ||||
| 	GenesisState                      = types.GenesisState | ||||
| 	HARDHooks                         = types.HARDHooks | ||||
| 	HardKeeper                        = types.HardKeeper | ||||
| 	HardLiquidityProviderClaim        = types.HardLiquidityProviderClaim | ||||
| 	HardLiquidityProviderClaims       = types.HardLiquidityProviderClaims | ||||
| 	MsgClaimDelegatorReward           = types.MsgClaimDelegatorReward | ||||
| 	MsgClaimDelegatorRewardVVesting   = types.MsgClaimDelegatorRewardVVesting | ||||
| 	MsgClaimHardReward                = types.MsgClaimHardReward | ||||
| 	MsgClaimHardRewardVVesting        = types.MsgClaimHardRewardVVesting | ||||
| 	MsgClaimUSDXMintingReward         = types.MsgClaimUSDXMintingReward | ||||
| 	MsgClaimUSDXMintingRewardVVesting = types.MsgClaimUSDXMintingRewardVVesting | ||||
| 	MultiRewardIndex                  = types.MultiRewardIndex | ||||
| 	MultiRewardIndexes                = types.MultiRewardIndexes | ||||
| 	MultiRewardPeriod                 = types.MultiRewardPeriod | ||||
| 	MultiRewardPeriods                = types.MultiRewardPeriods | ||||
| 	Multiplier                        = types.Multiplier | ||||
| 	MultiplierName                    = types.MultiplierName | ||||
| 	Multipliers                       = types.Multipliers | ||||
| 	ParamSubspace                     = types.ParamSubspace | ||||
| 	Params                            = types.Params | ||||
| 	QueryGetRewardFactorsResponse     = types.QueryGetRewardFactorsResponse | ||||
| 	QueryRewardsParams                = types.QueryRewardsParams | ||||
| 	RewardIndex                       = types.RewardIndex | ||||
| 	RewardIndexes                     = types.RewardIndexes | ||||
| 	RewardPeriod                      = types.RewardPeriod | ||||
| 	RewardPeriods                     = types.RewardPeriods | ||||
| 	StakingKeeper                     = types.StakingKeeper | ||||
| 	SupplyKeeper                      = types.SupplyKeeper | ||||
| 	SwapClaim                         = types.SwapClaim | ||||
| 	SwapClaims                        = types.SwapClaims | ||||
| 	SwapKeeper                        = types.SwapKeeper | ||||
| 	USDXMintingClaim                  = types.USDXMintingClaim | ||||
| 	USDXMintingClaims                 = types.USDXMintingClaims | ||||
| ) | ||||
|  | ||||
| @ -21,8 +21,15 @@ const ( | ||||
| 	flagType     = "type" | ||||
| 	flagUnsynced = "unsynced" | ||||
| 	flagDenom    = "denom" | ||||
| 
 | ||||
| 	typeDelegator   = "delegator" | ||||
| 	typeHard        = "hard" | ||||
| 	typeUSDXMinting = "usdx-minting" | ||||
| 	typeSwap        = "swap" | ||||
| ) | ||||
| 
 | ||||
| var rewardTypes = []string{typeDelegator, typeHard, typeUSDXMinting, typeSwap} | ||||
| 
 | ||||
| // GetQueryCmd returns the cli query commands for the incentive module
 | ||||
| func GetQueryCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | ||||
| 	incentiveQueryCmd := &cobra.Command{ | ||||
| @ -52,13 +59,14 @@ func queryRewardsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | ||||
| 			$ %s query %s rewards --type hard | ||||
| 			$ %s query %s rewards --type usdx-minting | ||||
| 			$ %s query %s rewards --type delegator | ||||
| 			$ %s query %s rewards --type swap | ||||
| 			$ %s query %s rewards --type hard --owner kava15qdefkmwswysgg4qxgqpqr35k3m49pkx2jdfnw | ||||
| 			$ %s query %s rewards --type hard --unsynced true | ||||
| 			$ %s query %s rewards --type hard --unsynced | ||||
| 			`, | ||||
| 				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, | ||||
| 		RunE: func(cmd *cobra.Command, args []string) error { | ||||
| 			cliCtx := context.NewCLIContext().WithCodec(cdc) | ||||
| @ -76,90 +84,52 @@ func queryRewardsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | ||||
| 			} | ||||
| 
 | ||||
| 			switch strings.ToLower(strType) { | ||||
| 			case "hard": | ||||
| 				var claims types.HardLiquidityProviderClaims | ||||
| 				if boolUnsynced { | ||||
| 					params := types.NewQueryHardRewardsUnsyncedParams(page, limit, owner) | ||||
| 					claims, err = executeHardRewardsUnsyncedQuery(queryRoute, cdc, cliCtx, params) | ||||
| 					if err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 				} else { | ||||
| 					params := types.NewQueryHardRewardsParams(page, limit, owner) | ||||
| 					claims, err = executeHardRewardsQuery(queryRoute, cdc, cliCtx, params) | ||||
| 					if err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 			case typeHard: | ||||
| 				params := types.NewQueryRewardsParams(page, limit, owner, boolUnsynced) | ||||
| 				claims, err := executeHardRewardsQuery(queryRoute, cdc, cliCtx, params) | ||||
| 				if err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				return cliCtx.PrintOutput(claims) | ||||
| 			case "usdx-minting": | ||||
| 				var claims types.USDXMintingClaims | ||||
| 				if boolUnsynced { | ||||
| 					params := types.NewQueryUSDXMintingRewardsUnsyncedParams(page, limit, owner) | ||||
| 					claims, err = executeUSDXMintingRewardsUnsyncedQuery(queryRoute, cdc, cliCtx, params) | ||||
| 					if err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 				} else { | ||||
| 					params := types.NewQueryUSDXMintingRewardsParams(page, limit, owner) | ||||
| 					claims, err = executeUSDXMintingRewardsQuery(queryRoute, cdc, cliCtx, params) | ||||
| 					if err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 			case typeUSDXMinting: | ||||
| 				params := types.NewQueryRewardsParams(page, limit, owner, boolUnsynced) | ||||
| 				claims, err := executeUSDXMintingRewardsQuery(queryRoute, cdc, cliCtx, params) | ||||
| 				if err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				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 | ||||
| 					} | ||||
| 			case typeDelegator: | ||||
| 				params := types.NewQueryRewardsParams(page, limit, owner, boolUnsynced) | ||||
| 				claims, err := executeDelegatorRewardsQuery(queryRoute, cdc, cliCtx, params) | ||||
| 				if err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				return cliCtx.PrintOutput(claims) | ||||
| 			case typeSwap: | ||||
| 				params := types.NewQueryRewardsParams(page, limit, owner, boolUnsynced) | ||||
| 				claims, err := executeSwapRewardsQuery(queryRoute, cdc, cliCtx, params) | ||||
| 				if err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				return cliCtx.PrintOutput(claims) | ||||
| 			default: | ||||
| 				var hardClaims types.HardLiquidityProviderClaims | ||||
| 				var usdxMintingClaims types.USDXMintingClaims | ||||
| 				var delegatorClaims types.DelegatorClaims | ||||
| 				if boolUnsynced { | ||||
| 					paramsHard := types.NewQueryHardRewardsUnsyncedParams(page, limit, owner) | ||||
| 					hardClaims, err = executeHardRewardsUnsyncedQuery(queryRoute, cdc, cliCtx, paramsHard) | ||||
| 					if err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 					paramsUSDXMinting := types.NewQueryUSDXMintingRewardsUnsyncedParams(page, limit, owner) | ||||
| 					usdxMintingClaims, err = executeUSDXMintingRewardsUnsyncedQuery(queryRoute, cdc, cliCtx, paramsUSDXMinting) | ||||
| 					if err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 					paramsDelegator := types.NewQueryDelegatorRewardsUnsyncedParams(page, limit, owner) | ||||
| 					delegatorClaims, err = executeDelegatorRewardsUnsyncedQuery(queryRoute, cdc, cliCtx, paramsDelegator) | ||||
| 					if err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 				} else { | ||||
| 					paramsHard := types.NewQueryHardRewardsParams(page, limit, owner) | ||||
| 					hardClaims, err = executeHardRewardsQuery(queryRoute, cdc, cliCtx, paramsHard) | ||||
| 					if err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 					paramsUSDXMinting := types.NewQueryUSDXMintingRewardsParams(page, limit, owner) | ||||
| 					usdxMintingClaims, err = executeUSDXMintingRewardsQuery(queryRoute, cdc, cliCtx, paramsUSDXMinting) | ||||
| 					if err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 					paramsDelegator := types.NewQueryDelegatorRewardsParams(page, limit, owner) | ||||
| 					delegatorClaims, err = executeDelegatorRewardsQuery(queryRoute, cdc, cliCtx, paramsDelegator) | ||||
| 					if err != nil { | ||||
| 						return err | ||||
| 					} | ||||
| 				params := types.NewQueryRewardsParams(page, limit, owner, boolUnsynced) | ||||
| 
 | ||||
| 				hardClaims, err := executeHardRewardsQuery(queryRoute, cdc, cliCtx, params) | ||||
| 				if err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				usdxMintingClaims, err := executeUSDXMintingRewardsQuery(queryRoute, cdc, cliCtx, params) | ||||
| 				if err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				delegatorClaims, err := executeDelegatorRewardsQuery(queryRoute, cdc, cliCtx, params) | ||||
| 				if err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				swapClaims, err := executeSwapRewardsQuery(queryRoute, cdc, cliCtx, params) | ||||
| 				if err != nil { | ||||
| 					return err | ||||
| 				} | ||||
| 				if len(hardClaims) > 0 { | ||||
| 					cliCtx.PrintOutput(hardClaims) | ||||
| @ -170,13 +140,16 @@ func queryRewardsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | ||||
| 				if len(delegatorClaims) > 0 { | ||||
| 					cliCtx.PrintOutput(delegatorClaims) | ||||
| 				} | ||||
| 				if len(swapClaims) > 0 { | ||||
| 					cliCtx.PrintOutput(swapClaims) | ||||
| 				} | ||||
| 			} | ||||
| 			return nil | ||||
| 		}, | ||||
| 	} | ||||
| 	cmd.Flags().String(flagOwner, "", "(optional) filter by owner address") | ||||
| 	cmd.Flags().String(flagType, "", "(optional) filter by reward type") | ||||
| 	cmd.Flags().String(flagUnsynced, "", "(optional) get unsynced claims") | ||||
| 	cmd.Flags().String(flagType, "", fmt.Sprintf("(optional) filter by a reward type: %s", strings.Join(rewardTypes, "|"))) | ||||
| 	cmd.Flags().Bool(flagUnsynced, false, "(optional) get unsynced claims") | ||||
| 	cmd.Flags().Int(flags.FlagPage, 1, "pagination page rewards of to to query for") | ||||
| 	cmd.Flags().Int(flags.FlagLimit, 100, "pagination limit of rewards to query for") | ||||
| 	return cmd | ||||
| @ -213,47 +186,32 @@ func queryRewardFactorsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | ||||
| 	cmd := &cobra.Command{ | ||||
| 		Use:   "reward-factors", | ||||
| 		Short: "get current global reward factors", | ||||
| 		Long: strings.TrimSpace(`get current global reward factors: | ||||
| 
 | ||||
| 		Example: | ||||
| 		$ kvcli q hard reward-factors | ||||
| 		$ kvcli q hard reward-factors --denom bnb`, | ||||
| 		), | ||||
| 		Args: cobra.NoArgs, | ||||
| 		Long:  `Get current global reward factors for all reward types.`, | ||||
| 		Args:  cobra.NoArgs, | ||||
| 		RunE: func(cmd *cobra.Command, args []string) error { | ||||
| 			cliCtx := context.NewCLIContext().WithCodec(cdc) | ||||
| 
 | ||||
| 			denom := viper.GetString(flagDenom) | ||||
| 
 | ||||
| 			// Construct query with params
 | ||||
| 			params := types.NewQueryRewardFactorsParams(denom) | ||||
| 			bz, err := cdc.MarshalJSON(params) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 
 | ||||
| 			// Execute query
 | ||||
| 			route := fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryGetRewardFactors) | ||||
| 			res, height, err := cliCtx.QueryWithData(route, bz) | ||||
| 			res, height, err := cliCtx.QueryWithData(route, nil) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			cliCtx = cliCtx.WithHeight(height) | ||||
| 
 | ||||
| 			// Decode and print results
 | ||||
| 			var rewardFactors types.RewardFactors | ||||
| 			if err := cdc.UnmarshalJSON(res, &rewardFactors); err != nil { | ||||
| 			var response types.QueryGetRewardFactorsResponse | ||||
| 			if err := cdc.UnmarshalJSON(res, &response); err != nil { | ||||
| 				return fmt.Errorf("failed to unmarshal reward factors: %w", err) | ||||
| 			} | ||||
| 			return cliCtx.PrintOutput(rewardFactors) | ||||
| 			return cliCtx.PrintOutput(response) | ||||
| 		}, | ||||
| 	} | ||||
| 	cmd.Flags().String(flagDenom, "", "(optional) filter reward factors by denom") | ||||
| 	return cmd | ||||
| } | ||||
| 
 | ||||
| func executeHardRewardsQuery(queryRoute string, cdc *codec.Codec, cliCtx context.CLIContext, | ||||
| 	params types.QueryHardRewardsParams) (types.HardLiquidityProviderClaims, error) { | ||||
| func executeHardRewardsQuery(queryRoute string, cdc *codec.Codec, cliCtx context.CLIContext, params types.QueryRewardsParams) (types.HardLiquidityProviderClaims, error) { | ||||
| 	bz, err := cdc.MarshalJSON(params) | ||||
| 	if err != nil { | ||||
| 		return types.HardLiquidityProviderClaims{}, err | ||||
| @ -275,31 +233,7 @@ func executeHardRewardsQuery(queryRoute string, cdc *codec.Codec, cliCtx context | ||||
| 	return claims, nil | ||||
| } | ||||
| 
 | ||||
| func executeHardRewardsUnsyncedQuery(queryRoute string, cdc *codec.Codec, cliCtx context.CLIContext, | ||||
| 	params types.QueryHardRewardsUnsyncedParams) (types.HardLiquidityProviderClaims, error) { | ||||
| 	bz, err := cdc.MarshalJSON(params) | ||||
| 	if err != nil { | ||||
| 		return types.HardLiquidityProviderClaims{}, err | ||||
| 	} | ||||
| 
 | ||||
| 	route := fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryGetHardRewardsUnsynced) | ||||
| 	res, height, err := cliCtx.QueryWithData(route, bz) | ||||
| 	if err != nil { | ||||
| 		return types.HardLiquidityProviderClaims{}, err | ||||
| 	} | ||||
| 
 | ||||
| 	cliCtx = cliCtx.WithHeight(height) | ||||
| 
 | ||||
| 	var claims types.HardLiquidityProviderClaims | ||||
| 	if err := cdc.UnmarshalJSON(res, &claims); err != nil { | ||||
| 		return types.HardLiquidityProviderClaims{}, fmt.Errorf("failed to unmarshal claims: %w", err) | ||||
| 	} | ||||
| 
 | ||||
| 	return claims, nil | ||||
| } | ||||
| 
 | ||||
| func executeUSDXMintingRewardsQuery(queryRoute string, cdc *codec.Codec, cliCtx context.CLIContext, | ||||
| 	params types.QueryUSDXMintingRewardsParams) (types.USDXMintingClaims, error) { | ||||
| func executeUSDXMintingRewardsQuery(queryRoute string, cdc *codec.Codec, cliCtx context.CLIContext, params types.QueryRewardsParams) (types.USDXMintingClaims, error) { | ||||
| 	bz, err := cdc.MarshalJSON(params) | ||||
| 	if err != nil { | ||||
| 		return types.USDXMintingClaims{}, err | ||||
| @ -321,31 +255,7 @@ func executeUSDXMintingRewardsQuery(queryRoute string, cdc *codec.Codec, cliCtx | ||||
| 	return claims, nil | ||||
| } | ||||
| 
 | ||||
| func executeUSDXMintingRewardsUnsyncedQuery(queryRoute string, cdc *codec.Codec, cliCtx context.CLIContext, | ||||
| 	params types.QueryUSDXMintingRewardsUnsyncedParams) (types.USDXMintingClaims, error) { | ||||
| 	bz, err := cdc.MarshalJSON(params) | ||||
| 	if err != nil { | ||||
| 		return types.USDXMintingClaims{}, err | ||||
| 	} | ||||
| 
 | ||||
| 	route := fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryGetUSDXMintingRewardsUnsynced) | ||||
| 	res, height, err := cliCtx.QueryWithData(route, bz) | ||||
| 	if err != nil { | ||||
| 		return types.USDXMintingClaims{}, err | ||||
| 	} | ||||
| 
 | ||||
| 	cliCtx = cliCtx.WithHeight(height) | ||||
| 
 | ||||
| 	var claims types.USDXMintingClaims | ||||
| 	if err := cdc.UnmarshalJSON(res, &claims); err != nil { | ||||
| 		return types.USDXMintingClaims{}, fmt.Errorf("failed to unmarshal claims: %w", err) | ||||
| 	} | ||||
| 
 | ||||
| 	return claims, nil | ||||
| } | ||||
| 
 | ||||
| func executeDelegatorRewardsQuery(queryRoute string, cdc *codec.Codec, cliCtx context.CLIContext, | ||||
| 	params types.QueryDelegatorRewardsParams) (types.DelegatorClaims, error) { | ||||
| func executeDelegatorRewardsQuery(queryRoute string, cdc *codec.Codec, cliCtx context.CLIContext, params types.QueryRewardsParams) (types.DelegatorClaims, error) { | ||||
| 	bz, err := cdc.MarshalJSON(params) | ||||
| 	if err != nil { | ||||
| 		return types.DelegatorClaims{}, err | ||||
| @ -367,24 +277,23 @@ func executeDelegatorRewardsQuery(queryRoute string, cdc *codec.Codec, cliCtx co | ||||
| 	return claims, nil | ||||
| } | ||||
| 
 | ||||
| func executeDelegatorRewardsUnsyncedQuery(queryRoute string, cdc *codec.Codec, cliCtx context.CLIContext, | ||||
| 	params types.QueryDelegatorRewardsUnsyncedParams) (types.DelegatorClaims, error) { | ||||
| func executeSwapRewardsQuery(queryRoute string, cdc *codec.Codec, cliCtx context.CLIContext, params types.QueryRewardsParams) (types.SwapClaims, error) { | ||||
| 	bz, err := cdc.MarshalJSON(params) | ||||
| 	if err != nil { | ||||
| 		return types.DelegatorClaims{}, err | ||||
| 		return types.SwapClaims{}, err | ||||
| 	} | ||||
| 
 | ||||
| 	route := fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryGetDelegatorRewardsUnsynced) | ||||
| 	route := fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryGetSwapRewards) | ||||
| 	res, height, err := cliCtx.QueryWithData(route, bz) | ||||
| 	if err != nil { | ||||
| 		return types.DelegatorClaims{}, err | ||||
| 		return types.SwapClaims{}, err | ||||
| 	} | ||||
| 
 | ||||
| 	cliCtx = cliCtx.WithHeight(height) | ||||
| 
 | ||||
| 	var claims types.DelegatorClaims | ||||
| 	var claims types.SwapClaims | ||||
| 	if err := cdc.UnmarshalJSON(res, &claims); err != nil { | ||||
| 		return types.DelegatorClaims{}, fmt.Errorf("failed to unmarshal claims: %w", err) | ||||
| 		return types.SwapClaims{}, fmt.Errorf("failed to unmarshal claims: %w", err) | ||||
| 	} | ||||
| 
 | ||||
| 	return claims, nil | ||||
|  | ||||
| @ -58,40 +58,18 @@ func queryRewardsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc { | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if unsynced { | ||||
| 			switch strings.ToLower(rewardType) { | ||||
| 			case "hard": | ||||
| 				params := types.NewQueryHardRewardsUnsyncedParams(page, limit, owner) | ||||
| 				executeHardRewardsUnsyncedQuery(w, cliCtx, params) | ||||
| 			case "usdx_minting": | ||||
| 				params := types.NewQueryUSDXMintingRewardsUnsyncedParams(page, limit, owner) | ||||
| 				executeUSDXMintingRewardsUnsyncedQuery(w, cliCtx, params) | ||||
| 			case "delegator": | ||||
| 				params := types.NewQueryDelegatorRewardsUnsyncedParams(page, limit, owner) | ||||
| 				executeDelegatorRewardsUnsyncedQuery(w, cliCtx, params) | ||||
| 			default: | ||||
| 				hardParams := types.NewQueryHardRewardsUnsyncedParams(page, limit, owner) | ||||
| 				usdxMintingParams := types.NewQueryUSDXMintingRewardsUnsyncedParams(page, limit, owner) | ||||
| 				delegatorParams := types.NewQueryDelegatorRewardsUnsyncedParams(page, limit, owner) | ||||
| 				executeAllUnsyncedRewardQueries(w, cliCtx, hardParams, usdxMintingParams, delegatorParams) | ||||
| 			} | ||||
| 		} else { | ||||
| 			switch strings.ToLower(rewardType) { | ||||
| 			case "hard": | ||||
| 				params := types.NewQueryHardRewardsParams(page, limit, owner) | ||||
| 				executeHardRewardsQuery(w, cliCtx, params) | ||||
| 			case "usdx_minting": | ||||
| 				params := types.NewQueryUSDXMintingRewardsParams(page, limit, owner) | ||||
| 				executeUSDXMintingRewardsQuery(w, cliCtx, params) | ||||
| 			case "delegator": | ||||
| 				params := types.NewQueryDelegatorRewardsParams(page, limit, owner) | ||||
| 				executeDelegatorRewardsQuery(w, cliCtx, params) | ||||
| 			default: | ||||
| 				hardParams := types.NewQueryHardRewardsParams(page, limit, owner) | ||||
| 				usdxMintingParams := types.NewQueryUSDXMintingRewardsParams(page, limit, owner) | ||||
| 				delegatorParams := types.NewQueryDelegatorRewardsParams(page, limit, owner) | ||||
| 				executeAllRewardQueries(w, cliCtx, hardParams, usdxMintingParams, delegatorParams) | ||||
| 			} | ||||
| 		params := types.NewQueryRewardsParams(page, limit, owner, unsynced) | ||||
| 		switch strings.ToLower(rewardType) { | ||||
| 		case "hard": | ||||
| 			executeHardRewardsQuery(w, cliCtx, params) | ||||
| 		case "usdx_minting": | ||||
| 			executeUSDXMintingRewardsQuery(w, cliCtx, params) | ||||
| 		case "delegator": | ||||
| 			executeDelegatorRewardsQuery(w, cliCtx, params) | ||||
| 		case "swap": | ||||
| 			executeSwapRewardsQuery(w, cliCtx, params) | ||||
| 		default: | ||||
| 			executeAllRewardQueries(w, cliCtx, params) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @ -118,43 +96,25 @@ func queryParamsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc { | ||||
| 
 | ||||
| func queryRewardFactorsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc { | ||||
| 	return func(w http.ResponseWriter, r *http.Request) { | ||||
| 		_, _, _, err := rest.ParseHTTPArgsWithLimit(r, 0) | ||||
| 		if err != nil { | ||||
| 			rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) | ||||
| 			return | ||||
| 		} | ||||
| 		// Parse the query height
 | ||||
| 		cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r) | ||||
| 		if !ok { | ||||
| 			return | ||||
| 		} | ||||
| 
 | ||||
| 		var denom string | ||||
| 
 | ||||
| 		if x := r.URL.Query().Get(RestDenom); len(x) != 0 { | ||||
| 			denom = strings.TrimSpace(x) | ||||
| 		} | ||||
| 
 | ||||
| 		params := types.NewQueryRewardFactorsParams(denom) | ||||
| 
 | ||||
| 		bz, err := cliCtx.Codec.MarshalJSON(params) | ||||
| 		if err != nil { | ||||
| 			rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) | ||||
| 			return | ||||
| 		} | ||||
| 
 | ||||
| 		route := fmt.Sprintf("custom/%s/%s", types.ModuleName, types.QueryGetRewardFactors) | ||||
| 		res, height, err := cliCtx.QueryWithData(route, bz) | ||||
| 		cliCtx = cliCtx.WithHeight(height) | ||||
| 
 | ||||
| 		res, height, err := cliCtx.QueryWithData(route, nil) | ||||
| 		if err != nil { | ||||
| 			rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) | ||||
| 			return | ||||
| 		} | ||||
| 
 | ||||
| 		cliCtx = cliCtx.WithHeight(height) | ||||
| 		rest.PostProcessResponse(w, cliCtx, res) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func executeHardRewardsQuery(w http.ResponseWriter, cliCtx context.CLIContext, params types.QueryHardRewardsParams) { | ||||
| func executeHardRewardsQuery(w http.ResponseWriter, cliCtx context.CLIContext, params types.QueryRewardsParams) { | ||||
| 	bz, err := cliCtx.Codec.MarshalJSON(params) | ||||
| 	if err != nil { | ||||
| 		rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("failed to marshal query params: %s", err)) | ||||
| @ -171,24 +131,7 @@ func executeHardRewardsQuery(w http.ResponseWriter, cliCtx context.CLIContext, p | ||||
| 	rest.PostProcessResponse(w, cliCtx, res) | ||||
| } | ||||
| 
 | ||||
| func executeHardRewardsUnsyncedQuery(w http.ResponseWriter, cliCtx context.CLIContext, params types.QueryHardRewardsUnsyncedParams) { | ||||
| 	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.QueryGetHardRewardsUnsynced), bz) | ||||
| 	if err != nil { | ||||
| 		rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	cliCtx = cliCtx.WithHeight(height) | ||||
| 	rest.PostProcessResponse(w, cliCtx, res) | ||||
| } | ||||
| 
 | ||||
| func executeUSDXMintingRewardsQuery(w http.ResponseWriter, cliCtx context.CLIContext, params types.QueryUSDXMintingRewardsParams) { | ||||
| func executeUSDXMintingRewardsQuery(w http.ResponseWriter, cliCtx context.CLIContext, params types.QueryRewardsParams) { | ||||
| 	bz, err := cliCtx.Codec.MarshalJSON(params) | ||||
| 	if err != nil { | ||||
| 		rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("failed to marshal query params: %s", err)) | ||||
| @ -205,24 +148,7 @@ func executeUSDXMintingRewardsQuery(w http.ResponseWriter, cliCtx context.CLICon | ||||
| 	rest.PostProcessResponse(w, cliCtx, res) | ||||
| } | ||||
| 
 | ||||
| func executeUSDXMintingRewardsUnsyncedQuery(w http.ResponseWriter, cliCtx context.CLIContext, params types.QueryUSDXMintingRewardsUnsyncedParams) { | ||||
| 	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.QueryGetUSDXMintingRewardsUnsynced), bz) | ||||
| 	if err != nil { | ||||
| 		rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	cliCtx = cliCtx.WithHeight(height) | ||||
| 	rest.PostProcessResponse(w, cliCtx, res) | ||||
| } | ||||
| 
 | ||||
| func executeDelegatorRewardsQuery(w http.ResponseWriter, cliCtx context.CLIContext, params types.QueryDelegatorRewardsParams) { | ||||
| func executeDelegatorRewardsQuery(w http.ResponseWriter, cliCtx context.CLIContext, params types.QueryRewardsParams) { | ||||
| 	bz, err := cliCtx.Codec.MarshalJSON(params) | ||||
| 	if err != nil { | ||||
| 		rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("failed to marshal query params: %s", err)) | ||||
| @ -239,14 +165,14 @@ func executeDelegatorRewardsQuery(w http.ResponseWriter, cliCtx context.CLIConte | ||||
| 	rest.PostProcessResponse(w, cliCtx, res) | ||||
| } | ||||
| 
 | ||||
| func executeDelegatorRewardsUnsyncedQuery(w http.ResponseWriter, cliCtx context.CLIContext, params types.QueryDelegatorRewardsUnsyncedParams) { | ||||
| func executeSwapRewardsQuery(w http.ResponseWriter, cliCtx context.CLIContext, params types.QueryRewardsParams) { | ||||
| 	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) | ||||
| 	res, height, err := cliCtx.QueryWithData(fmt.Sprintf("custom/incentive/%s", types.QueryGetSwapRewards), bz) | ||||
| 	if err != nil { | ||||
| 		rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) | ||||
| 		return | ||||
| @ -256,16 +182,14 @@ func executeDelegatorRewardsUnsyncedQuery(w http.ResponseWriter, cliCtx context. | ||||
| 	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) | ||||
| func executeAllRewardQueries(w http.ResponseWriter, cliCtx context.CLIContext, params types.QueryRewardsParams) { | ||||
| 
 | ||||
| 	paramsBz, err := cliCtx.Codec.MarshalJSON(params) | ||||
| 	if err != nil { | ||||
| 		rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("failed to marshal query params: %s", err)) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	hardRes, height, err := cliCtx.QueryWithData(fmt.Sprintf("custom/incentive/%s", types.QueryGetHardRewards), hardBz) | ||||
| 	hardRes, _, err := cliCtx.QueryWithData(fmt.Sprintf("custom/incentive/%s", types.QueryGetHardRewards), paramsBz) | ||||
| 	if err != nil { | ||||
| 		rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) | ||||
| 		return | ||||
| @ -273,13 +197,7 @@ func executeAllRewardQueries(w http.ResponseWriter, cliCtx context.CLIContext, | ||||
| 	var hardClaims types.HardLiquidityProviderClaims | ||||
| 	cliCtx.Codec.MustUnmarshalJSON(hardRes, &hardClaims) | ||||
| 
 | ||||
| 	usdxMintingBz, err := cliCtx.Codec.MarshalJSON(usdxMintingParams) | ||||
| 	if err != nil { | ||||
| 		rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("failed to marshal query params: %s", err)) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	usdxMintingRes, height, err := cliCtx.QueryWithData(fmt.Sprintf("custom/incentive/%s", types.QueryGetUSDXMintingRewards), usdxMintingBz) | ||||
| 	usdxMintingRes, _, err := cliCtx.QueryWithData(fmt.Sprintf("custom/incentive/%s", types.QueryGetUSDXMintingRewards), paramsBz) | ||||
| 	if err != nil { | ||||
| 		rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) | ||||
| 		return | ||||
| @ -287,81 +205,7 @@ func executeAllRewardQueries(w http.ResponseWriter, cliCtx context.CLIContext, | ||||
| 	var usdxMintingClaims types.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) | ||||
| 
 | ||||
| 	type rewardResult struct { | ||||
| 		HardClaims        types.HardLiquidityProviderClaims `json:"hard_claims" yaml:"hard_claims"` | ||||
| 		UsdxMintingClaims types.USDXMintingClaims           `json:"usdx_minting_claims" yaml:"usdx_minting_claims"` | ||||
| 		DelegatorClaims   types.DelegatorClaims             `json:"delegator_claims" yaml:"delegator_claims"` | ||||
| 	} | ||||
| 
 | ||||
| 	res := rewardResult{ | ||||
| 		HardClaims:        hardClaims, | ||||
| 		UsdxMintingClaims: usdxMintingClaims, | ||||
| 		DelegatorClaims:   delegatorClaims, | ||||
| 	} | ||||
| 
 | ||||
| 	resBz, err := cliCtx.Codec.MarshalJSON(res) | ||||
| 	if err != nil { | ||||
| 		rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("failed to marshal result: %s", err)) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	rest.PostProcessResponse(w, cliCtx, resBz) | ||||
| } | ||||
| 
 | ||||
| func executeAllUnsyncedRewardQueries(w http.ResponseWriter, cliCtx context.CLIContext, | ||||
| 	hardParams types.QueryHardRewardsUnsyncedParams, usdxMintingParams types.QueryUSDXMintingRewardsUnsyncedParams, | ||||
| 	delegatorParams types.QueryDelegatorRewardsUnsyncedParams) { | ||||
| 	hardBz, err := cliCtx.Codec.MarshalJSON(hardParams) | ||||
| 	if err != nil { | ||||
| 		rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("failed to marshal query params: %s", err)) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	hardRes, height, err := cliCtx.QueryWithData(fmt.Sprintf("custom/incentive/%s", types.QueryGetHardRewardsUnsynced), hardBz) | ||||
| 	if err != nil { | ||||
| 		rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) | ||||
| 		return | ||||
| 	} | ||||
| 	var hardClaims types.HardLiquidityProviderClaims | ||||
| 	cliCtx.Codec.MustUnmarshalJSON(hardRes, &hardClaims) | ||||
| 
 | ||||
| 	usdxMintingBz, err := cliCtx.Codec.MarshalJSON(usdxMintingParams) | ||||
| 	if err != nil { | ||||
| 		rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("failed to marshal query params: %s", err)) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	usdxMintingRes, height, err := cliCtx.QueryWithData(fmt.Sprintf("custom/incentive/%s", types.QueryGetUSDXMintingRewardsUnsynced), usdxMintingBz) | ||||
| 	if err != nil { | ||||
| 		rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) | ||||
| 		return | ||||
| 	} | ||||
| 	var usdxMintingClaims types.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) | ||||
| 	delegatorRes, _, err := cliCtx.QueryWithData(fmt.Sprintf("custom/incentive/%s", types.QueryGetDelegatorRewards), paramsBz) | ||||
| 	if err != nil { | ||||
| 		rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) | ||||
| 		return | ||||
| @ -369,18 +213,28 @@ func executeAllUnsyncedRewardQueries(w http.ResponseWriter, cliCtx context.CLICo | ||||
| 	var delegatorClaims types.DelegatorClaims | ||||
| 	cliCtx.Codec.MustUnmarshalJSON(delegatorRes, &delegatorClaims) | ||||
| 
 | ||||
| 	swapRes, height, err := cliCtx.QueryWithData(fmt.Sprintf("custom/incentive/%s", types.QueryGetSwapRewards), paramsBz) | ||||
| 	if err != nil { | ||||
| 		rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) | ||||
| 		return | ||||
| 	} | ||||
| 	var swapClaims types.SwapClaims | ||||
| 	cliCtx.Codec.MustUnmarshalJSON(swapRes, &swapClaims) | ||||
| 
 | ||||
| 	cliCtx = cliCtx.WithHeight(height) | ||||
| 
 | ||||
| 	type rewardResult struct { | ||||
| 		HardClaims        types.HardLiquidityProviderClaims `json:"hard_claims" yaml:"hard_claims"` | ||||
| 		UsdxMintingClaims types.USDXMintingClaims           `json:"usdx_minting_claims" yaml:"usdx_minting_claims"` | ||||
| 		DelegatorClaims   types.DelegatorClaims             `json:"delegator_claims" yaml:"delegator_claims"` | ||||
| 		SwapClaims        types.SwapClaims                  `json:"swap_claims" yaml:"swap_claims"` | ||||
| 	} | ||||
| 
 | ||||
| 	res := rewardResult{ | ||||
| 		HardClaims:        hardClaims, | ||||
| 		UsdxMintingClaims: usdxMintingClaims, | ||||
| 		DelegatorClaims:   delegatorClaims, | ||||
| 		SwapClaims:        swapClaims, | ||||
| 	} | ||||
| 
 | ||||
| 	resBz, err := cliCtx.Codec.MarshalJSON(res) | ||||
|  | ||||
| @ -115,6 +115,11 @@ func InitGenesis(ctx sdk.Context, k keeper.Keeper, supplyKeeper types.SupplyKeep | ||||
| 		} | ||||
| 		k.SetDelegatorClaim(ctx, claim) | ||||
| 	} | ||||
| 
 | ||||
| 	// TODO no synchronization of swap claims as it is about to be removed in a subsequent PR
 | ||||
| 	for _, claim := range gs.SwapClaims { | ||||
| 		k.SetSwapClaim(ctx, claim) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // ExportGenesis export genesis state for incentive module
 | ||||
| @ -124,10 +129,12 @@ func ExportGenesis(ctx sdk.Context, k keeper.Keeper) types.GenesisState { | ||||
| 	usdxClaims := k.GetAllUSDXMintingClaims(ctx) | ||||
| 	hardClaims := k.GetAllHardLiquidityProviderClaims(ctx) | ||||
| 	delegatorClaims := k.GetAllDelegatorClaims(ctx) | ||||
| 	swapClaims := k.GetAllSwapClaims(ctx) | ||||
| 
 | ||||
| 	synchronizedUsdxClaims := types.USDXMintingClaims{} | ||||
| 	synchronizedHardClaims := types.HardLiquidityProviderClaims{} | ||||
| 	synchronizedDelegatorClaims := types.DelegatorClaims{} | ||||
| 	// TODO no synchronization of swap claims as it is about to be removed in a subsequent PR
 | ||||
| 
 | ||||
| 	for _, usdxClaim := range usdxClaims { | ||||
| 		claim, err := k.SynchronizeUSDXMintingClaim(ctx, usdxClaim) | ||||
| @ -222,7 +229,9 @@ func ExportGenesis(ctx sdk.Context, k keeper.Keeper) types.GenesisState { | ||||
| 		swapGats = append(swapGats, gat) | ||||
| 	} | ||||
| 
 | ||||
| 	return types.NewGenesisState(params, usdxMintingGats, hardSupplyGats, | ||||
| 		hardBorrowGats, delegatorGats, swapGats, synchronizedUsdxClaims, | ||||
| 		synchronizedHardClaims, synchronizedDelegatorClaims) | ||||
| 	return types.NewGenesisState( | ||||
| 		params, | ||||
| 		usdxMintingGats, hardSupplyGats, hardBorrowGats, delegatorGats, swapGats, | ||||
| 		synchronizedUsdxClaims, synchronizedHardClaims, synchronizedDelegatorClaims, swapClaims, | ||||
| 	) | ||||
| } | ||||
|  | ||||
| @ -77,6 +77,7 @@ func (suite *GenesisTestSuite) SetupTest() { | ||||
| 		incentive.DefaultUSDXClaims, | ||||
| 		incentive.DefaultHardClaims, | ||||
| 		incentive.DefaultDelegatorClaims, | ||||
| 		incentive.DefaultSwapClaims, | ||||
| 	) | ||||
| 	tApp.InitializeFromGenesisStatesWithTime( | ||||
| 		suite.genesisTime, | ||||
|  | ||||
| @ -60,6 +60,7 @@ func (suite *HandlerTestSuite) SetupTest() { | ||||
| 		incentive.DefaultUSDXClaims, | ||||
| 		incentive.DefaultHardClaims, | ||||
| 		incentive.DefaultDelegatorClaims, | ||||
| 		incentive.DefaultSwapClaims, | ||||
| 	) | ||||
| 	tApp.InitializeFromGenesisStates(authGS, app.GenesisState{incentive.ModuleName: incentive.ModuleCdc.MustMarshalJSON(incentiveGS)}, NewCDPGenStateMulti(), NewPricefeedGenStateMulti()) | ||||
| 
 | ||||
|  | ||||
| @ -6,6 +6,7 @@ import ( | ||||
| 
 | ||||
| 	cdptypes "github.com/kava-labs/kava/x/cdp/types" | ||||
| 	hardtypes "github.com/kava-labs/kava/x/hard/types" | ||||
| 	swaptypes "github.com/kava-labs/kava/x/swap/types" | ||||
| ) | ||||
| 
 | ||||
| // Hooks wrapper struct for hooks
 | ||||
| @ -16,6 +17,7 @@ type Hooks struct { | ||||
| var _ cdptypes.CDPHooks = Hooks{} | ||||
| var _ hardtypes.HARDHooks = Hooks{} | ||||
| var _ stakingtypes.StakingHooks = Hooks{} | ||||
| var _ swaptypes.SwapHooks = Hooks{} | ||||
| 
 | ||||
| // Hooks create new incentive hooks
 | ||||
| func (k Keeper) Hooks() Hooks { return Hooks{k} } | ||||
| @ -149,3 +151,13 @@ func (h Hooks) BeforeValidatorModified(ctx sdk.Context, valAddr sdk.ValAddress) | ||||
| // AfterValidatorRemoved runs after a validator is removed
 | ||||
| func (h Hooks) AfterValidatorRemoved(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) { | ||||
| } | ||||
| 
 | ||||
| // ------------------- Swap Module Hooks -------------------
 | ||||
| 
 | ||||
| func (h Hooks) AfterPoolDepositCreated(ctx sdk.Context, poolID string, depositor sdk.AccAddress, _ sdk.Int) { | ||||
| 	h.k.InitializeSwapReward(ctx, poolID, depositor) | ||||
| } | ||||
| 
 | ||||
| func (h Hooks) BeforePoolDepositModified(ctx sdk.Context, poolID string, depositor sdk.AccAddress, sharesOwned sdk.Int) { | ||||
| 	h.k.SynchronizeSwapReward(ctx, poolID, depositor, sharesOwned) | ||||
| } | ||||
|  | ||||
| @ -259,6 +259,55 @@ func (k Keeper) GetAllDelegatorClaims(ctx sdk.Context) types.DelegatorClaims { | ||||
| 	return cs | ||||
| } | ||||
| 
 | ||||
| // GetSwapClaim returns the claim in the store corresponding the the input address.
 | ||||
| func (k Keeper) GetSwapClaim(ctx sdk.Context, addr sdk.AccAddress) (types.SwapClaim, bool) { | ||||
| 	store := prefix.NewStore(ctx.KVStore(k.key), types.SwapClaimKeyPrefix) | ||||
| 	bz := store.Get(addr) | ||||
| 	if bz == nil { | ||||
| 		return types.SwapClaim{}, false | ||||
| 	} | ||||
| 	var c types.SwapClaim | ||||
| 	k.cdc.MustUnmarshalBinaryBare(bz, &c) | ||||
| 	return c, true | ||||
| } | ||||
| 
 | ||||
| // SetSwapClaim sets the claim in the store corresponding to the input address.
 | ||||
| func (k Keeper) SetSwapClaim(ctx sdk.Context, c types.SwapClaim) { | ||||
| 	store := prefix.NewStore(ctx.KVStore(k.key), types.SwapClaimKeyPrefix) | ||||
| 	bz := k.cdc.MustMarshalBinaryBare(c) | ||||
| 	store.Set(c.Owner, bz) | ||||
| } | ||||
| 
 | ||||
| // DeleteSwapClaim deletes the claim in the store corresponding to the input address.
 | ||||
| func (k Keeper) DeleteSwapClaim(ctx sdk.Context, owner sdk.AccAddress) { | ||||
| 	store := prefix.NewStore(ctx.KVStore(k.key), types.SwapClaimKeyPrefix) | ||||
| 	store.Delete(owner) | ||||
| } | ||||
| 
 | ||||
| // IterateSwapClaims iterates over all claim  objects in the store and preforms a callback function
 | ||||
| func (k Keeper) IterateSwapClaims(ctx sdk.Context, cb func(c types.SwapClaim) (stop bool)) { | ||||
| 	store := prefix.NewStore(ctx.KVStore(k.key), types.SwapClaimKeyPrefix) | ||||
| 	iterator := sdk.KVStorePrefixIterator(store, []byte{}) | ||||
| 	defer iterator.Close() | ||||
| 	for ; iterator.Valid(); iterator.Next() { | ||||
| 		var c types.SwapClaim | ||||
| 		k.cdc.MustUnmarshalBinaryBare(iterator.Value(), &c) | ||||
| 		if cb(c) { | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // GetAllSwapClaims returns all Claim objects in the store
 | ||||
| func (k Keeper) GetAllSwapClaims(ctx sdk.Context) types.SwapClaims { | ||||
| 	cs := types.SwapClaims{} | ||||
| 	k.IterateSwapClaims(ctx, func(c types.SwapClaim) (stop bool) { | ||||
| 		cs = append(cs, c) | ||||
| 		return false | ||||
| 	}) | ||||
| 	return cs | ||||
| } | ||||
| 
 | ||||
| // SetHardSupplyRewardIndexes sets the current reward indexes for an individual denom
 | ||||
| func (k Keeper) SetHardSupplyRewardIndexes(ctx sdk.Context, denom string, indexes types.RewardIndexes) { | ||||
| 	store := prefix.NewStore(ctx.KVStore(k.key), types.HardSupplyRewardIndexesKeyPrefix) | ||||
| @ -428,6 +477,20 @@ func (k Keeper) GetSwapRewardIndexes(ctx sdk.Context, poolID string) (types.Rewa | ||||
| 	return rewardIndexes, true | ||||
| } | ||||
| 
 | ||||
| // IterateSwapRewardIndexes iterates over all swap reward index objects in the store and preforms a callback function
 | ||||
| func (k Keeper) IterateSwapRewardIndexes(ctx sdk.Context, cb func(poolID string, indexes types.RewardIndexes) (stop bool)) { | ||||
| 	store := prefix.NewStore(ctx.KVStore(k.key), types.SwapRewardIndexesKeyPrefix) | ||||
| 	iterator := sdk.KVStorePrefixIterator(store, []byte{}) | ||||
| 	defer iterator.Close() | ||||
| 	for ; iterator.Valid(); iterator.Next() { | ||||
| 		var indexes types.RewardIndexes | ||||
| 		k.cdc.MustUnmarshalBinaryBare(iterator.Value(), &indexes) | ||||
| 		if cb(string(iterator.Key()), indexes) { | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // GetSwapRewardAccrualTime fetches the last time rewards were accrued for a swap pool.
 | ||||
| func (k Keeper) GetSwapRewardAccrualTime(ctx sdk.Context, poolID string) (blockTime time.Time, found bool) { | ||||
| 	store := prefix.NewStore(ctx.KVStore(k.key), types.PreviousSwapRewardAccrualTimeKeyPrefix) | ||||
|  | ||||
| @ -82,6 +82,46 @@ func (suite *KeeperTestSuite) TestIterateUSDXMintingClaims() { | ||||
| 	suite.Require().Equal(len(suite.addrs), len(claims)) | ||||
| } | ||||
| 
 | ||||
| func (suite *KeeperTestSuite) TestGetSetDeleteSwapClaims() { | ||||
| 	suite.SetupApp() | ||||
| 	c := types.NewSwapClaim(suite.addrs[0], arbitraryCoins(), nonEmptyMultiRewardIndexes) | ||||
| 
 | ||||
| 	_, found := suite.keeper.GetSwapClaim(suite.ctx, suite.addrs[0]) | ||||
| 	suite.Require().False(found) | ||||
| 
 | ||||
| 	suite.Require().NotPanics(func() { | ||||
| 		suite.keeper.SetSwapClaim(suite.ctx, c) | ||||
| 	}) | ||||
| 	testC, found := suite.keeper.GetSwapClaim(suite.ctx, suite.addrs[0]) | ||||
| 	suite.Require().True(found) | ||||
| 	suite.Require().Equal(c, testC) | ||||
| 
 | ||||
| 	suite.Require().NotPanics(func() { | ||||
| 		suite.keeper.DeleteSwapClaim(suite.ctx, suite.addrs[0]) | ||||
| 	}) | ||||
| 	_, found = suite.keeper.GetSwapClaim(suite.ctx, suite.addrs[0]) | ||||
| 	suite.Require().False(found) | ||||
| } | ||||
| 
 | ||||
| func (suite *KeeperTestSuite) TestIterateSwapClaims() { | ||||
| 	suite.SetupApp() | ||||
| 	claims := types.SwapClaims{ | ||||
| 		types.NewSwapClaim(suite.addrs[0], arbitraryCoins(), nonEmptyMultiRewardIndexes), | ||||
| 		types.NewSwapClaim(suite.addrs[1], nil, nil), // different claim to the first
 | ||||
| 	} | ||||
| 	for _, claim := range claims { | ||||
| 		suite.keeper.SetSwapClaim(suite.ctx, claim) | ||||
| 	} | ||||
| 
 | ||||
| 	var actualClaims types.SwapClaims | ||||
| 	suite.keeper.IterateSwapClaims(suite.ctx, func(c types.SwapClaim) bool { | ||||
| 		actualClaims = append(actualClaims, c) | ||||
| 		return false | ||||
| 	}) | ||||
| 
 | ||||
| 	suite.Require().Equal(claims, actualClaims) | ||||
| } | ||||
| 
 | ||||
| func (suite *KeeperTestSuite) TestGetSetSwapRewardIndexes() { | ||||
| 	testCases := []struct { | ||||
| 		name     string | ||||
| @ -155,6 +195,45 @@ func (suite *KeeperTestSuite) TestGetSetSwapRewardIndexes() { | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (suite *KeeperTestSuite) TestIterateSwapRewardIndexes() { | ||||
| 	suite.SetupApp() | ||||
| 	multiIndexes := types.MultiRewardIndexes{ | ||||
| 		{ | ||||
| 			CollateralType: "bnb/usdx", | ||||
| 			RewardIndexes: types.RewardIndexes{ | ||||
| 				{ | ||||
| 					CollateralType: "swap", | ||||
| 					RewardFactor:   d("0.0000002"), | ||||
| 				}, | ||||
| 				{ | ||||
| 					CollateralType: "ukava", | ||||
| 					RewardFactor:   d("0.04"), | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| 		{ | ||||
| 			CollateralType: "btcb/usdx", | ||||
| 			RewardIndexes: types.RewardIndexes{ | ||||
| 				{ | ||||
| 					CollateralType: "hard", | ||||
| 					RewardFactor:   d("0.02"), | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 	for _, mi := range multiIndexes { | ||||
| 		suite.keeper.SetSwapRewardIndexes(suite.ctx, mi.CollateralType, mi.RewardIndexes) | ||||
| 	} | ||||
| 
 | ||||
| 	var actualMultiIndexes types.MultiRewardIndexes | ||||
| 	suite.keeper.IterateSwapRewardIndexes(suite.ctx, func(poolID string, i types.RewardIndexes) bool { | ||||
| 		actualMultiIndexes = actualMultiIndexes.With(poolID, i) | ||||
| 		return false | ||||
| 	}) | ||||
| 
 | ||||
| 	suite.Require().Equal(multiIndexes, actualMultiIndexes) | ||||
| } | ||||
| 
 | ||||
| func (suite *KeeperTestSuite) TestGetSetSwapRewardAccrualTimes() { | ||||
| 	testCases := []struct { | ||||
| 		name        string | ||||
|  | ||||
| @ -17,18 +17,16 @@ func NewQuerier(k Keeper) sdk.Querier { | ||||
| 		switch path[0] { | ||||
| 		case types.QueryGetParams: | ||||
| 			return queryGetParams(ctx, req, k) | ||||
| 
 | ||||
| 		case types.QueryGetHardRewards: | ||||
| 			return queryGetHardRewards(ctx, req, k) | ||||
| 		case types.QueryGetHardRewardsUnsynced: | ||||
| 			return queryGetHardRewardsUnsynced(ctx, req, k) | ||||
| 		case types.QueryGetUSDXMintingRewards: | ||||
| 			return queryGetUSDXMintingRewards(ctx, req, k) | ||||
| 		case types.QueryGetUSDXMintingRewardsUnsynced: | ||||
| 			return queryGetUSDXMintingRewardsUnsynced(ctx, req, k) | ||||
| 		case types.QueryGetDelegatorRewards: | ||||
| 			return queryGetDelegatorRewards(ctx, req, k) | ||||
| 		case types.QueryGetDelegatorRewardsUnsynced: | ||||
| 			return queryGetDelegatorRewardsUnsynced(ctx, req, k) | ||||
| 		case types.QueryGetSwapRewards: | ||||
| 			return queryGetSwapRewards(ctx, req, k) | ||||
| 
 | ||||
| 		case types.QueryGetRewardFactors: | ||||
| 			return queryGetRewardFactors(ctx, req, k) | ||||
| 		default: | ||||
| @ -51,7 +49,7 @@ func queryGetParams(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, e | ||||
| } | ||||
| 
 | ||||
| func queryGetHardRewards(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { | ||||
| 	var params types.QueryHardRewardsParams | ||||
| 	var params types.QueryRewardsParams | ||||
| 	err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms) | ||||
| 	if err != nil { | ||||
| 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) | ||||
| @ -77,45 +75,10 @@ func queryGetHardRewards(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]by | ||||
| 		paginatedHardClaims = hardClaims[startH:endH] | ||||
| 	} | ||||
| 
 | ||||
| 	var augmentedHardClaims types.HardLiquidityProviderClaims | ||||
| 	for _, claim := range paginatedHardClaims { | ||||
| 		augmentedClaim := k.SimulateHardSynchronization(ctx, claim) | ||||
| 		augmentedHardClaims = append(augmentedHardClaims, augmentedClaim) | ||||
| 	} | ||||
| 
 | ||||
| 	// Marshal Hard claims
 | ||||
| 	bz, err := codec.MarshalJSONIndent(k.cdc, augmentedHardClaims) | ||||
| 	if err != nil { | ||||
| 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) | ||||
| 	} | ||||
| 	return bz, nil | ||||
| } | ||||
| 
 | ||||
| func queryGetHardRewardsUnsynced(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { | ||||
| 	var params types.QueryHardRewardsUnsyncedParams | ||||
| 	err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms) | ||||
| 	if err != nil { | ||||
| 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) | ||||
| 	} | ||||
| 	owner := len(params.Owner) > 0 | ||||
| 
 | ||||
| 	var hardClaims types.HardLiquidityProviderClaims | ||||
| 	switch { | ||||
| 	case owner: | ||||
| 		hardClaim, foundHardClaim := k.GetHardLiquidityProviderClaim(ctx, params.Owner) | ||||
| 		if foundHardClaim { | ||||
| 			hardClaims = append(hardClaims, hardClaim) | ||||
| 	if !params.Unsynchronized { | ||||
| 		for i, claim := range paginatedHardClaims { | ||||
| 			paginatedHardClaims[i] = k.SimulateHardSynchronization(ctx, claim) | ||||
| 		} | ||||
| 	default: | ||||
| 		hardClaims = k.GetAllHardLiquidityProviderClaims(ctx) | ||||
| 	} | ||||
| 
 | ||||
| 	var paginatedHardClaims types.HardLiquidityProviderClaims | ||||
| 	startH, endH := client.Paginate(len(hardClaims), params.Page, params.Limit, 100) | ||||
| 	if startH < 0 || endH < 0 { | ||||
| 		paginatedHardClaims = types.HardLiquidityProviderClaims{} | ||||
| 	} else { | ||||
| 		paginatedHardClaims = hardClaims[startH:endH] | ||||
| 	} | ||||
| 
 | ||||
| 	// Marshal Hard claims
 | ||||
| @ -127,7 +90,7 @@ func queryGetHardRewardsUnsynced(ctx sdk.Context, req abci.RequestQuery, k Keepe | ||||
| } | ||||
| 
 | ||||
| func queryGetUSDXMintingRewards(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { | ||||
| 	var params types.QueryUSDXMintingRewardsParams | ||||
| 	var params types.QueryRewardsParams | ||||
| 	err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms) | ||||
| 	if err != nil { | ||||
| 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) | ||||
| @ -153,45 +116,10 @@ func queryGetUSDXMintingRewards(ctx sdk.Context, req abci.RequestQuery, k Keeper | ||||
| 		paginatedUsdxMintingClaims = usdxMintingClaims[startU:endU] | ||||
| 	} | ||||
| 
 | ||||
| 	var augmentedUsdxMintingClaims types.USDXMintingClaims | ||||
| 	for _, claim := range paginatedUsdxMintingClaims { | ||||
| 		augmentedClaim := k.SimulateUSDXMintingSynchronization(ctx, claim) | ||||
| 		augmentedUsdxMintingClaims = append(augmentedUsdxMintingClaims, augmentedClaim) | ||||
| 	} | ||||
| 
 | ||||
| 	// Marshal USDX minting claims
 | ||||
| 	bz, err := codec.MarshalJSONIndent(k.cdc, augmentedUsdxMintingClaims) | ||||
| 	if err != nil { | ||||
| 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) | ||||
| 	} | ||||
| 	return bz, nil | ||||
| } | ||||
| 
 | ||||
| func queryGetUSDXMintingRewardsUnsynced(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { | ||||
| 	var params types.QueryUSDXMintingRewardsUnsyncedParams | ||||
| 	err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms) | ||||
| 	if err != nil { | ||||
| 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) | ||||
| 	} | ||||
| 	owner := len(params.Owner) > 0 | ||||
| 
 | ||||
| 	var usdxMintingClaims types.USDXMintingClaims | ||||
| 	switch { | ||||
| 	case owner: | ||||
| 		usdxMintingClaim, foundUsdxMintingClaim := k.GetUSDXMintingClaim(ctx, params.Owner) | ||||
| 		if foundUsdxMintingClaim { | ||||
| 			usdxMintingClaims = append(usdxMintingClaims, usdxMintingClaim) | ||||
| 	if !params.Unsynchronized { | ||||
| 		for i, claim := range paginatedUsdxMintingClaims { | ||||
| 			paginatedUsdxMintingClaims[i] = k.SimulateUSDXMintingSynchronization(ctx, claim) | ||||
| 		} | ||||
| 	default: | ||||
| 		usdxMintingClaims = k.GetAllUSDXMintingClaims(ctx) | ||||
| 	} | ||||
| 
 | ||||
| 	var paginatedUsdxMintingClaims types.USDXMintingClaims | ||||
| 	startU, endU := client.Paginate(len(usdxMintingClaims), params.Page, params.Limit, 100) | ||||
| 	if startU < 0 || endU < 0 { | ||||
| 		paginatedUsdxMintingClaims = types.USDXMintingClaims{} | ||||
| 	} else { | ||||
| 		paginatedUsdxMintingClaims = usdxMintingClaims[startU:endU] | ||||
| 	} | ||||
| 
 | ||||
| 	// Marshal USDX minting claims
 | ||||
| @ -203,7 +131,7 @@ func queryGetUSDXMintingRewardsUnsynced(ctx sdk.Context, req abci.RequestQuery, | ||||
| } | ||||
| 
 | ||||
| func queryGetDelegatorRewards(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { | ||||
| 	var params types.QueryDelegatorRewardsParams | ||||
| 	var params types.QueryRewardsParams | ||||
| 	err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms) | ||||
| 	if err != nil { | ||||
| 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) | ||||
| @ -229,45 +157,10 @@ func queryGetDelegatorRewards(ctx sdk.Context, req abci.RequestQuery, k Keeper) | ||||
| 		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) | ||||
| 	if !params.Unsynchronized { | ||||
| 		for i, claim := range paginatedDelegatorClaims { | ||||
| 			paginatedDelegatorClaims[i] = k.SimulateDelegatorSynchronization(ctx, claim) | ||||
| 		} | ||||
| 	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
 | ||||
| @ -278,89 +171,92 @@ func queryGetDelegatorRewardsUnsynced(ctx sdk.Context, req abci.RequestQuery, k | ||||
| 	return bz, nil | ||||
| } | ||||
| 
 | ||||
| func queryGetRewardFactors(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { | ||||
| 	var params types.QueryRewardFactorsParams | ||||
| func queryGetSwapRewards(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) { | ||||
| 	var params types.QueryRewardsParams | ||||
| 	err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms) | ||||
| 	if err != nil { | ||||
| 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error()) | ||||
| 	} | ||||
| 	owner := len(params.Owner) > 0 | ||||
| 
 | ||||
| 	var rewardFactors types.RewardFactors | ||||
| 	if len(params.Denom) > 0 { | ||||
| 		// Fetch reward factors for a single denom
 | ||||
| 		rewardFactor := types.RewardFactor{} | ||||
| 		rewardFactor.Denom = params.Denom | ||||
| 	var claims types.SwapClaims | ||||
| 	switch { | ||||
| 	case owner: | ||||
| 		claim, found := k.GetSwapClaim(ctx, params.Owner) | ||||
| 		if found { | ||||
| 			claims = append(claims, claim) | ||||
| 		} | ||||
| 	default: | ||||
| 		claims = k.GetAllSwapClaims(ctx) | ||||
| 	} | ||||
| 
 | ||||
| 		usdxMintingRewardFactor, found := k.GetUSDXMintingRewardFactor(ctx, params.Denom) | ||||
| 		if found { | ||||
| 			rewardFactor.USDXMintingRewardFactor = usdxMintingRewardFactor | ||||
| 		} | ||||
| 		hardSupplyRewardIndexes, found := k.GetHardSupplyRewardIndexes(ctx, params.Denom) | ||||
| 		if found { | ||||
| 			rewardFactor.HardSupplyRewardFactors = hardSupplyRewardIndexes | ||||
| 		} | ||||
| 		hardBorrowRewardIndexes, found := k.GetHardBorrowRewardIndexes(ctx, params.Denom) | ||||
| 		if found { | ||||
| 			rewardFactor.HardBorrowRewardFactors = hardBorrowRewardIndexes | ||||
| 		} | ||||
| 		delegatorRewardIndexes, found := k.GetDelegatorRewardIndexes(ctx, params.Denom) | ||||
| 		if found { | ||||
| 			rewardFactor.DelegatorRewardFactors = delegatorRewardIndexes | ||||
| 		} | ||||
| 		rewardFactors = append(rewardFactors, rewardFactor) | ||||
| 	var paginatedClaims types.SwapClaims | ||||
| 	startH, endH := client.Paginate(len(claims), params.Page, params.Limit, 100) | ||||
| 	if startH < 0 || endH < 0 { | ||||
| 		paginatedClaims = types.SwapClaims{} | ||||
| 	} else { | ||||
| 		rewardFactorMap := make(map[string]types.RewardFactor) | ||||
| 		paginatedClaims = claims[startH:endH] | ||||
| 	} | ||||
| 
 | ||||
| 		// Populate mapping with usdx minting reward factors
 | ||||
| 		k.IterateUSDXMintingRewardFactors(ctx, func(denom string, factor sdk.Dec) (stop bool) { | ||||
| 			rewardFactor := types.RewardFactor{Denom: denom, USDXMintingRewardFactor: factor} | ||||
| 			rewardFactorMap[denom] = rewardFactor | ||||
| 			return false | ||||
| 		}) | ||||
| 
 | ||||
| 		// Populate mapping with Hard supply reward factors
 | ||||
| 		k.IterateHardSupplyRewardIndexes(ctx, func(denom string, indexes types.RewardIndexes) (stop bool) { | ||||
| 			rewardFactor, ok := rewardFactorMap[denom] | ||||
| 			if !ok { | ||||
| 				rewardFactor = types.RewardFactor{Denom: denom, HardSupplyRewardFactors: indexes} | ||||
| 			} else { | ||||
| 				rewardFactor.HardSupplyRewardFactors = indexes | ||||
| 	if !params.Unsynchronized { | ||||
| 		for i, claim := range paginatedClaims { | ||||
| 			syncedClaim, found := k.GetSynchronizedSwapClaim(ctx, claim.Owner) | ||||
| 			if !found { | ||||
| 				panic("previously found claim should still be found") | ||||
| 			} | ||||
| 			rewardFactorMap[denom] = rewardFactor | ||||
| 			return false | ||||
| 		}) | ||||
| 
 | ||||
| 		// Populate mapping with Hard borrow reward factors
 | ||||
| 		k.IterateHardBorrowRewardIndexes(ctx, func(denom string, indexes types.RewardIndexes) (stop bool) { | ||||
| 			rewardFactor, ok := rewardFactorMap[denom] | ||||
| 			if !ok { | ||||
| 				rewardFactor = types.RewardFactor{Denom: denom, HardBorrowRewardFactors: indexes} | ||||
| 			} else { | ||||
| 				rewardFactor.HardBorrowRewardFactors = indexes | ||||
| 			} | ||||
| 			rewardFactorMap[denom] = rewardFactor | ||||
| 			return false | ||||
| 		}) | ||||
| 
 | ||||
| 		// Populate mapping with delegator reward factors
 | ||||
| 		k.IterateDelegatorRewardIndexes(ctx, func(denom string, indexes types.RewardIndexes) (stop bool) { | ||||
| 			rewardFactor, ok := rewardFactorMap[denom] | ||||
| 			if !ok { | ||||
| 				rewardFactor = types.RewardFactor{Denom: denom, DelegatorRewardFactors: indexes} | ||||
| 			} else { | ||||
| 				rewardFactor.DelegatorRewardFactors = indexes | ||||
| 			} | ||||
| 			rewardFactorMap[denom] = rewardFactor | ||||
| 			return false | ||||
| 		}) | ||||
| 
 | ||||
| 		// Translate mapping to slice
 | ||||
| 		for _, val := range rewardFactorMap { | ||||
| 			rewardFactors = append(rewardFactors, val) | ||||
| 			paginatedClaims[i] = syncedClaim | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	bz, err := codec.MarshalJSONIndent(types.ModuleCdc, rewardFactors) | ||||
| 	// Marshal claims
 | ||||
| 	bz, err := codec.MarshalJSONIndent(k.cdc, paginatedClaims) | ||||
| 	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) { | ||||
| 
 | ||||
| 	var usdxFactors types.RewardIndexes | ||||
| 	k.IterateUSDXMintingRewardFactors(ctx, func(collateralType string, factor sdk.Dec) (stop bool) { | ||||
| 		usdxFactors = usdxFactors.With(collateralType, factor) | ||||
| 		return false | ||||
| 	}) | ||||
| 
 | ||||
| 	var supplyFactors types.MultiRewardIndexes | ||||
| 	k.IterateHardSupplyRewardIndexes(ctx, func(denom string, indexes types.RewardIndexes) (stop bool) { | ||||
| 		supplyFactors = supplyFactors.With(denom, indexes) | ||||
| 		return false | ||||
| 	}) | ||||
| 
 | ||||
| 	var borrowFactors types.MultiRewardIndexes | ||||
| 	k.IterateHardBorrowRewardIndexes(ctx, func(denom string, indexes types.RewardIndexes) (stop bool) { | ||||
| 		borrowFactors = borrowFactors.With(denom, indexes) | ||||
| 		return false | ||||
| 	}) | ||||
| 
 | ||||
| 	var delegatorFactors types.MultiRewardIndexes | ||||
| 	k.IterateDelegatorRewardIndexes(ctx, func(denom string, indexes types.RewardIndexes) (stop bool) { | ||||
| 		delegatorFactors = delegatorFactors.With(denom, indexes) | ||||
| 		return false | ||||
| 	}) | ||||
| 
 | ||||
| 	var swapFactors types.MultiRewardIndexes | ||||
| 	k.IterateSwapRewardIndexes(ctx, func(poolID string, indexes types.RewardIndexes) (stop bool) { | ||||
| 		swapFactors = swapFactors.With(poolID, indexes) | ||||
| 		return false | ||||
| 	}) | ||||
| 
 | ||||
| 	response := types.NewQueryGetRewardFactorsResponse( | ||||
| 		usdxFactors, | ||||
| 		supplyFactors, | ||||
| 		borrowFactors, | ||||
| 		delegatorFactors, | ||||
| 		swapFactors, | ||||
| 	) | ||||
| 
 | ||||
| 	bz, err := codec.MarshalJSONIndent(types.ModuleCdc, response) | ||||
| 	if err != nil { | ||||
| 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) | ||||
| 	} | ||||
|  | ||||
| @ -1,6 +1,8 @@ | ||||
| package keeper | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 
 | ||||
| 	sdk "github.com/cosmos/cosmos-sdk/types" | ||||
| 
 | ||||
| 	"github.com/kava-labs/kava/x/incentive/types" | ||||
| @ -24,10 +26,10 @@ func (k Keeper) AccumulateSwapRewards(ctx sdk.Context, rewardPeriod types.MultiR | ||||
| 
 | ||||
| 	totalShares, found := k.swapKeeper.GetPoolShares(ctx, rewardPeriod.CollateralType) | ||||
| 	if !found { | ||||
| 		totalShares = sdk.ZeroDec() | ||||
| 		totalShares = sdk.ZeroInt() | ||||
| 	} | ||||
| 
 | ||||
| 	acc.Accumulate(rewardPeriod, totalShares, ctx.BlockTime()) | ||||
| 	acc.Accumulate(rewardPeriod, totalShares.ToDec(), ctx.BlockTime()) | ||||
| 
 | ||||
| 	k.SetSwapRewardAccrualTime(ctx, rewardPeriod.CollateralType, acc.PreviousAccumulationTime) | ||||
| 	if len(acc.Indexes) > 0 { | ||||
| @ -35,3 +37,85 @@ func (k Keeper) AccumulateSwapRewards(ctx sdk.Context, rewardPeriod types.MultiR | ||||
| 		k.SetSwapRewardIndexes(ctx, rewardPeriod.CollateralType, acc.Indexes) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // InitializeSwapReward creates a new claim with zero rewards and indexes matching the global indexes.
 | ||||
| // If the claim already exists it just updates the indexes.
 | ||||
| func (k Keeper) InitializeSwapReward(ctx sdk.Context, poolID string, owner sdk.AccAddress) { | ||||
| 	claim, found := k.GetSwapClaim(ctx, owner) | ||||
| 	if !found { | ||||
| 		claim = types.NewSwapClaim(owner, sdk.Coins{}, nil) | ||||
| 	} | ||||
| 
 | ||||
| 	globalRewardIndexes, found := k.GetSwapRewardIndexes(ctx, poolID) | ||||
| 	if !found { | ||||
| 		globalRewardIndexes = types.RewardIndexes{} | ||||
| 	} | ||||
| 	claim.RewardIndexes = claim.RewardIndexes.With(poolID, globalRewardIndexes) | ||||
| 
 | ||||
| 	k.SetSwapClaim(ctx, claim) | ||||
| } | ||||
| 
 | ||||
| // SynchronizeSwapReward updates the claim object by adding any accumulated rewards
 | ||||
| // and updating the reward index value.
 | ||||
| func (k Keeper) SynchronizeSwapReward(ctx sdk.Context, poolID string, owner sdk.AccAddress, shares sdk.Int) { | ||||
| 	claim, found := k.GetSwapClaim(ctx, owner) | ||||
| 	if !found { | ||||
| 		return | ||||
| 	} | ||||
| 	claim = k.synchronizeSwapReward(ctx, claim, poolID, owner, shares) | ||||
| 
 | ||||
| 	k.SetSwapClaim(ctx, claim) | ||||
| } | ||||
| 
 | ||||
| // synchronizeSwapReward updates the reward in a swap claim for one pool.
 | ||||
| func (k *Keeper) synchronizeSwapReward(ctx sdk.Context, claim types.SwapClaim, poolID string, owner sdk.AccAddress, shares sdk.Int) types.SwapClaim { | ||||
| 	globalRewardIndexes, found := k.GetSwapRewardIndexes(ctx, poolID) | ||||
| 	if !found { | ||||
| 		// The global factor is only not found if
 | ||||
| 		// - the pool has not started accumulating rewards yet (either there is no reward specified in params, or the reward start time hasn't been hit)
 | ||||
| 		// - OR it was wrongly deleted from state (factors should never be removed while unsynced claims exist)
 | ||||
| 		// If not found we could either skip this sync, or assume the global factor is zero.
 | ||||
| 		// Skipping will avoid storing unnecessary factors in the claim for non rewarded pools.
 | ||||
| 		// And in the event a global factor is wrongly deleted, it will avoid this function panicking when calculating rewards.
 | ||||
| 		return claim | ||||
| 	} | ||||
| 
 | ||||
| 	userRewardIndexes, found := claim.RewardIndexes.Get(poolID) | ||||
| 	if !found { | ||||
| 		// Normally the reward indexes should always be found.
 | ||||
| 		// But if a pool was not rewarded then becomes rewarded (ie a reward period is added to params), then the indexes will be missing from claims for that pool.
 | ||||
| 		// So given the reward period was just added, assume the starting value for any global reward indexes, which is an empty slice.
 | ||||
| 		userRewardIndexes = types.RewardIndexes{} | ||||
| 	} | ||||
| 
 | ||||
| 	newRewards, err := k.CalculateRewards(userRewardIndexes, globalRewardIndexes, shares.ToDec()) | ||||
| 	if err != nil { | ||||
| 		// Global reward factors should never decrease, as it would lead to a negative update to claim.Rewards.
 | ||||
| 		// This panics if a global reward factor decreases or disappears between the old and new indexes.
 | ||||
| 		panic(fmt.Sprintf("corrupted global reward indexes found: %v", err)) | ||||
| 	} | ||||
| 
 | ||||
| 	claim.Reward = claim.Reward.Add(newRewards...) | ||||
| 	claim.RewardIndexes = claim.RewardIndexes.With(poolID, globalRewardIndexes) | ||||
| 
 | ||||
| 	return claim | ||||
| } | ||||
| 
 | ||||
| // GetSynchronizedSwapClaim fetches a swap claim from the store and syncs rewards for all pools.
 | ||||
| func (k Keeper) GetSynchronizedSwapClaim(ctx sdk.Context, owner sdk.AccAddress) (types.SwapClaim, bool) { | ||||
| 	claim, found := k.GetSwapClaim(ctx, owner) | ||||
| 	if !found { | ||||
| 		return types.SwapClaim{}, false | ||||
| 	} | ||||
| 	for _, indexes := range claim.RewardIndexes { | ||||
| 		poolID := indexes.CollateralType | ||||
| 
 | ||||
| 		shares, found := k.swapKeeper.GetDepositorSharesInPool(ctx, owner, poolID) | ||||
| 		if !found { | ||||
| 			shares = sdk.ZeroInt() | ||||
| 		} | ||||
| 
 | ||||
| 		claim = k.synchronizeSwapReward(ctx, claim, poolID, owner, shares) | ||||
| 	} | ||||
| 	return claim, true | ||||
| } | ||||
|  | ||||
							
								
								
									
										195
									
								
								x/incentive/keeper/rewards_swap_init_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										195
									
								
								x/incentive/keeper/rewards_swap_init_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,195 @@ | ||||
| package keeper_test | ||||
| 
 | ||||
| import ( | ||||
| 	"testing" | ||||
| 
 | ||||
| 	sdk "github.com/cosmos/cosmos-sdk/types" | ||||
| 	"github.com/stretchr/testify/suite" | ||||
| 
 | ||||
| 	"github.com/kava-labs/kava/x/incentive/types" | ||||
| ) | ||||
| 
 | ||||
| // InitializeSwapRewardTests runs unit tests for the keeper.InitializeSwapReward method
 | ||||
| //
 | ||||
| // inputs
 | ||||
| // - claim in store if it exists
 | ||||
| // - global indexes in store
 | ||||
| //
 | ||||
| // outputs
 | ||||
| // - sets or creates a claim
 | ||||
| type InitializeSwapRewardTests struct { | ||||
| 	unitTester | ||||
| } | ||||
| 
 | ||||
| func TestInitializeSwapReward(t *testing.T) { | ||||
| 	suite.Run(t, new(InitializeSwapRewardTests)) | ||||
| } | ||||
| 
 | ||||
| func (suite *InitializeSwapRewardTests) TestClaimAddedWhenClaimDoesNotExistAndNoRewards() { | ||||
| 	// When a claim doesn't exist, and a user deposits to a non-rewarded pool;
 | ||||
| 	// then a claim is added with no rewards and no indexes
 | ||||
| 
 | ||||
| 	poolID := "base/quote" | ||||
| 
 | ||||
| 	// no global indexes stored as this pool is not rewarded
 | ||||
| 
 | ||||
| 	owner := arbitraryAddress() | ||||
| 
 | ||||
| 	suite.keeper.InitializeSwapReward(suite.ctx, poolID, owner) | ||||
| 
 | ||||
| 	syncedClaim, found := suite.keeper.GetSwapClaim(suite.ctx, owner) | ||||
| 	suite.True(found) | ||||
| 	// A new claim should have empty indexes. It doesn't strictly need the poolID either.
 | ||||
| 	expectedIndexes := types.MultiRewardIndexes{{ | ||||
| 		CollateralType: poolID, | ||||
| 		RewardIndexes:  nil, | ||||
| 	}} | ||||
| 	suite.Equal(expectedIndexes, syncedClaim.RewardIndexes) | ||||
| 	// a new claim should start with 0 rewards
 | ||||
| 	suite.Equal(sdk.Coins(nil), syncedClaim.Reward) | ||||
| } | ||||
| 
 | ||||
| func (suite *InitializeSwapRewardTests) TestClaimAddedWhenClaimDoesNotExistAndRewardsExist() { | ||||
| 	// When a claim doesn't exist, and a user deposits to a rewarded pool;
 | ||||
| 	// then a claim is added with no rewards and indexes matching the global indexes
 | ||||
| 
 | ||||
| 	poolID := "base/quote" | ||||
| 
 | ||||
| 	globalIndexes := types.MultiRewardIndexes{ | ||||
| 		{ | ||||
| 			CollateralType: poolID, | ||||
| 			RewardIndexes: types.RewardIndexes{ | ||||
| 				{ | ||||
| 					CollateralType: "rewarddenom", | ||||
| 					RewardFactor:   d("1000.001"), | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 	suite.storeGlobalSwapIndexes(globalIndexes) | ||||
| 
 | ||||
| 	owner := arbitraryAddress() | ||||
| 
 | ||||
| 	suite.keeper.InitializeSwapReward(suite.ctx, poolID, owner) | ||||
| 
 | ||||
| 	syncedClaim, found := suite.keeper.GetSwapClaim(suite.ctx, owner) | ||||
| 	suite.True(found) | ||||
| 	// a new claim should start with the current global indexes
 | ||||
| 	suite.Equal(globalIndexes, syncedClaim.RewardIndexes) | ||||
| 	// a new claim should start with 0 rewards
 | ||||
| 	suite.Equal(sdk.Coins(nil), syncedClaim.Reward) | ||||
| } | ||||
| 
 | ||||
| func (suite *InitializeSwapRewardTests) TestClaimUpdatedWhenClaimExistsAndNoRewards() { | ||||
| 	// When a claim exists, and a user deposits to a new non-rewarded pool;
 | ||||
| 	// then the claim's rewards don't change
 | ||||
| 
 | ||||
| 	preexistingPoolID := "preexisting" | ||||
| 	preexistingIndexes := types.RewardIndexes{ | ||||
| 		{ | ||||
| 			CollateralType: "rewarddenom", | ||||
| 			RewardFactor:   d("1000.001"), | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	newPoolID := "btcb/usdx" | ||||
| 
 | ||||
| 	claim := types.SwapClaim{ | ||||
| 		BaseMultiClaim: types.BaseMultiClaim{ | ||||
| 			Owner:  arbitraryAddress(), | ||||
| 			Reward: arbitraryCoins(), | ||||
| 		}, | ||||
| 		RewardIndexes: types.MultiRewardIndexes{ | ||||
| 			{ | ||||
| 				CollateralType: preexistingPoolID, | ||||
| 				RewardIndexes:  preexistingIndexes, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 	suite.storeSwapClaim(claim) | ||||
| 
 | ||||
| 	// no global indexes stored as the new pool is not rewarded
 | ||||
| 
 | ||||
| 	suite.keeper.InitializeSwapReward(suite.ctx, newPoolID, claim.Owner) | ||||
| 
 | ||||
| 	syncedClaim, _ := suite.keeper.GetSwapClaim(suite.ctx, claim.Owner) | ||||
| 	// The preexisting indexes shouldn't be changed. It doesn't strictly need the new poolID either.
 | ||||
| 	expectedIndexes := types.MultiRewardIndexes{ | ||||
| 		{ | ||||
| 			CollateralType: preexistingPoolID, | ||||
| 			RewardIndexes:  preexistingIndexes, | ||||
| 		}, | ||||
| 		{ | ||||
| 			CollateralType: newPoolID, | ||||
| 			RewardIndexes:  nil, | ||||
| 		}, | ||||
| 	} | ||||
| 	suite.Equal(expectedIndexes, syncedClaim.RewardIndexes) | ||||
| 	// init should never alter the rewards
 | ||||
| 	suite.Equal(claim.Reward, syncedClaim.Reward) | ||||
| } | ||||
| 
 | ||||
| func (suite *InitializeSwapRewardTests) TestClaimUpdatedWhenClaimExistsAndRewardsExist() { | ||||
| 	// When a claim exists, and a user deposits to a new rewarded pool;
 | ||||
| 	// then the claim's rewards don't change and the indexes are updated to match the global indexes
 | ||||
| 
 | ||||
| 	preexistingPoolID := "preexisting" | ||||
| 	preexistingIndexes := types.RewardIndexes{ | ||||
| 		{ | ||||
| 			CollateralType: "rewarddenom", | ||||
| 			RewardFactor:   d("1000.001"), | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	newPoolID := "btcb/usdx" | ||||
| 	newIndexes := types.RewardIndexes{ | ||||
| 		{ | ||||
| 			CollateralType: "otherrewarddenom", | ||||
| 			RewardFactor:   d("1000.001"), | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	claim := types.SwapClaim{ | ||||
| 		BaseMultiClaim: types.BaseMultiClaim{ | ||||
| 			Owner:  arbitraryAddress(), | ||||
| 			Reward: arbitraryCoins(), | ||||
| 		}, | ||||
| 		RewardIndexes: types.MultiRewardIndexes{ | ||||
| 			{ | ||||
| 				CollateralType: preexistingPoolID, | ||||
| 				RewardIndexes:  preexistingIndexes, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 	suite.storeSwapClaim(claim) | ||||
| 
 | ||||
| 	globalIndexes := types.MultiRewardIndexes{ | ||||
| 		{ | ||||
| 			CollateralType: preexistingPoolID, | ||||
| 			RewardIndexes:  increaseRewardFactors(preexistingIndexes), | ||||
| 		}, | ||||
| 		{ | ||||
| 			CollateralType: newPoolID, | ||||
| 			RewardIndexes:  newIndexes, | ||||
| 		}, | ||||
| 	} | ||||
| 	suite.storeGlobalSwapIndexes(globalIndexes) | ||||
| 
 | ||||
| 	suite.keeper.InitializeSwapReward(suite.ctx, newPoolID, claim.Owner) | ||||
| 
 | ||||
| 	syncedClaim, _ := suite.keeper.GetSwapClaim(suite.ctx, claim.Owner) | ||||
| 	// only the indexes for the new pool should be updated
 | ||||
| 	expectedIndexes := types.MultiRewardIndexes{ | ||||
| 		{ | ||||
| 			CollateralType: preexistingPoolID, | ||||
| 			RewardIndexes:  preexistingIndexes, | ||||
| 		}, | ||||
| 		{ | ||||
| 			CollateralType: newPoolID, | ||||
| 			RewardIndexes:  newIndexes, | ||||
| 		}, | ||||
| 	} | ||||
| 	suite.Equal(expectedIndexes, syncedClaim.RewardIndexes) | ||||
| 	// init should never alter the rewards
 | ||||
| 	suite.Equal(claim.Reward, syncedClaim.Reward) | ||||
| } | ||||
							
								
								
									
										317
									
								
								x/incentive/keeper/rewards_swap_sync_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										317
									
								
								x/incentive/keeper/rewards_swap_sync_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,317 @@ | ||||
| package keeper_test | ||||
| 
 | ||||
| import ( | ||||
| 	"testing" | ||||
| 
 | ||||
| 	"github.com/stretchr/testify/suite" | ||||
| 
 | ||||
| 	"github.com/kava-labs/kava/x/incentive/types" | ||||
| ) | ||||
| 
 | ||||
| // SynchronizeSwapRewardTests runs unit tests for the keeper.SynchronizeSwapReward method
 | ||||
| //
 | ||||
| // inputs
 | ||||
| // - claim in store (only claim.RewardIndexes, claim.Reward)
 | ||||
| // - global indexes in store
 | ||||
| // - shares function arg
 | ||||
| //
 | ||||
| // outputs
 | ||||
| // - sets a claim
 | ||||
| type SynchronizeSwapRewardTests struct { | ||||
| 	unitTester | ||||
| } | ||||
| 
 | ||||
| func TestSynchronizeSwapReward(t *testing.T) { | ||||
| 	suite.Run(t, new(SynchronizeSwapRewardTests)) | ||||
| } | ||||
| 
 | ||||
| func (suite *SynchronizeSwapRewardTests) TestClaimUpdatedWhenGlobalIndexesHaveIncreased() { | ||||
| 	// This is the normal case
 | ||||
| 	// Given some time has passed (meaning the global indexes have increased)
 | ||||
| 	// When the claim is synced
 | ||||
| 	// The user earns rewards for the time passed, and the claim indexes are updated
 | ||||
| 
 | ||||
| 	originalReward := arbitraryCoins() | ||||
| 	poolID := "base/quote" | ||||
| 
 | ||||
| 	claim := types.SwapClaim{ | ||||
| 		BaseMultiClaim: types.BaseMultiClaim{ | ||||
| 			Owner:  arbitraryAddress(), | ||||
| 			Reward: originalReward, | ||||
| 		}, | ||||
| 		RewardIndexes: types.MultiRewardIndexes{ | ||||
| 			{ | ||||
| 				CollateralType: poolID, | ||||
| 				RewardIndexes: types.RewardIndexes{ | ||||
| 					{ | ||||
| 						CollateralType: "rewarddenom", | ||||
| 						RewardFactor:   d("1000.001"), | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 	suite.storeSwapClaim(claim) | ||||
| 
 | ||||
| 	globalIndexes := types.MultiRewardIndexes{ | ||||
| 		{ | ||||
| 			CollateralType: poolID, | ||||
| 			RewardIndexes: types.RewardIndexes{ | ||||
| 				{ | ||||
| 					CollateralType: "rewarddenom", | ||||
| 					RewardFactor:   d("2000.002"), | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 	suite.storeGlobalSwapIndexes(globalIndexes) | ||||
| 
 | ||||
| 	userShares := i(1e9) | ||||
| 
 | ||||
| 	suite.keeper.SynchronizeSwapReward(suite.ctx, poolID, claim.Owner, userShares) | ||||
| 
 | ||||
| 	syncedClaim, _ := suite.keeper.GetSwapClaim(suite.ctx, claim.Owner) | ||||
| 	// indexes updated from global
 | ||||
| 	suite.Equal(globalIndexes, syncedClaim.RewardIndexes) | ||||
| 	// new reward is (new index - old index) * user shares
 | ||||
| 	suite.Equal( | ||||
| 		cs(c("rewarddenom", 1_000_001_000_000)).Add(originalReward...), | ||||
| 		syncedClaim.Reward, | ||||
| 	) | ||||
| } | ||||
| 
 | ||||
| func (suite *SynchronizeSwapRewardTests) TestClaimUnchangedWhenGlobalIndexesUnchanged() { | ||||
| 	// It should be safe to call SynchronizeSwapReward multiple times
 | ||||
| 
 | ||||
| 	poolID := "base/quote" | ||||
| 	unchangingIndexes := types.MultiRewardIndexes{ | ||||
| 		{ | ||||
| 			CollateralType: poolID, | ||||
| 			RewardIndexes: types.RewardIndexes{ | ||||
| 				{ | ||||
| 					CollateralType: "rewarddenom", | ||||
| 					RewardFactor:   d("1000.001"), | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 
 | ||||
| 	claim := types.SwapClaim{ | ||||
| 		BaseMultiClaim: types.BaseMultiClaim{ | ||||
| 			Owner:  arbitraryAddress(), | ||||
| 			Reward: arbitraryCoins(), | ||||
| 		}, | ||||
| 		RewardIndexes: unchangingIndexes, | ||||
| 	} | ||||
| 	suite.storeSwapClaim(claim) | ||||
| 
 | ||||
| 	suite.storeGlobalSwapIndexes(unchangingIndexes) | ||||
| 
 | ||||
| 	userShares := i(1e9) | ||||
| 
 | ||||
| 	suite.keeper.SynchronizeSwapReward(suite.ctx, poolID, claim.Owner, userShares) | ||||
| 
 | ||||
| 	syncedClaim, _ := suite.keeper.GetSwapClaim(suite.ctx, claim.Owner) | ||||
| 	// claim should have the same rewards and indexes as before
 | ||||
| 	suite.Equal(claim, syncedClaim) | ||||
| } | ||||
| func (suite *SynchronizeSwapRewardTests) TestClaimUpdatedWhenNewRewardAdded() { | ||||
| 	// When a new reward is added (via gov) for a pool the user has already deposited to, and the claim is synced;
 | ||||
| 	// Then the user earns rewards for the time since the reward was added, and the indexes are added to the claim.
 | ||||
| 
 | ||||
| 	originalReward := arbitraryCoins() | ||||
| 	newlyRewardPoolID := "newlyRewardedPool" | ||||
| 
 | ||||
| 	claim := types.SwapClaim{ | ||||
| 		BaseMultiClaim: types.BaseMultiClaim{ | ||||
| 			Owner:  arbitraryAddress(), | ||||
| 			Reward: originalReward, | ||||
| 		}, | ||||
| 		RewardIndexes: types.MultiRewardIndexes{ | ||||
| 			{ | ||||
| 				CollateralType: "currentlyRewardedPool", | ||||
| 				RewardIndexes: types.RewardIndexes{ | ||||
| 					{ | ||||
| 						CollateralType: "reward", | ||||
| 						RewardFactor:   d("1000.001"), | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 	suite.storeSwapClaim(claim) | ||||
| 
 | ||||
| 	globalIndexes := types.MultiRewardIndexes{ | ||||
| 		{ | ||||
| 			CollateralType: "currentlyRewardedPool", | ||||
| 			RewardIndexes: types.RewardIndexes{ | ||||
| 				{ | ||||
| 					CollateralType: "reward", | ||||
| 					RewardFactor:   d("2000.002"), | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| 		{ | ||||
| 			CollateralType: newlyRewardPoolID, | ||||
| 			RewardIndexes: types.RewardIndexes{ | ||||
| 				{ | ||||
| 					CollateralType: "otherreward", | ||||
| 					// Indexes start at 0 when the reward is added by gov,
 | ||||
| 					// so this represents the syncing happening some time later.
 | ||||
| 					RewardFactor: d("1000.001"), | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 	suite.storeGlobalSwapIndexes(globalIndexes) | ||||
| 
 | ||||
| 	userShares := i(1e9) | ||||
| 
 | ||||
| 	suite.keeper.SynchronizeSwapReward(suite.ctx, newlyRewardPoolID, claim.Owner, userShares) | ||||
| 
 | ||||
| 	syncedClaim, _ := suite.keeper.GetSwapClaim(suite.ctx, claim.Owner) | ||||
| 	// the new indexes should be added to the claim, but the old ones should be unchanged
 | ||||
| 	newlyRewrdedIndexes, _ := globalIndexes.Get(newlyRewardPoolID) | ||||
| 	expectedIndexes := claim.RewardIndexes.With(newlyRewardPoolID, newlyRewrdedIndexes) | ||||
| 	suite.Equal(expectedIndexes, syncedClaim.RewardIndexes) | ||||
| 	// new reward is (new index - old index) * shares for the synced pool
 | ||||
| 	// The old index for `newlyrewarded` isn't in the claim, so it's added starting at 0 for calculating the reward.
 | ||||
| 	suite.Equal( | ||||
| 		cs(c("otherreward", 1_000_001_000_000)).Add(originalReward...), | ||||
| 		syncedClaim.Reward, | ||||
| 	) | ||||
| } | ||||
| 
 | ||||
| func (suite *SynchronizeSwapRewardTests) TestClaimUnchangedWhenNoReward() { | ||||
| 	// When a pool is not rewarded but the user has deposited to that pool, and the claim is synced;
 | ||||
| 	// Then the claim should be the same.
 | ||||
| 
 | ||||
| 	claim := types.SwapClaim{ | ||||
| 		BaseMultiClaim: types.BaseMultiClaim{ | ||||
| 			Owner:  arbitraryAddress(), | ||||
| 			Reward: arbitraryCoins(), | ||||
| 		}, | ||||
| 		RewardIndexes: nonEmptyMultiRewardIndexes, | ||||
| 	} | ||||
| 	suite.storeSwapClaim(claim) | ||||
| 
 | ||||
| 	poolID := "nonRewardPool" | ||||
| 	// No global indexes stored as this pool is not rewarded
 | ||||
| 
 | ||||
| 	userShares := i(1e9) | ||||
| 
 | ||||
| 	suite.keeper.SynchronizeSwapReward(suite.ctx, poolID, claim.Owner, userShares) | ||||
| 
 | ||||
| 	syncedClaim, _ := suite.keeper.GetSwapClaim(suite.ctx, claim.Owner) | ||||
| 	suite.Equal(claim, syncedClaim) | ||||
| } | ||||
| 
 | ||||
| func (suite *SynchronizeSwapRewardTests) TestClaimUpdatedWhenNewRewardDenomAdded() { | ||||
| 	// When a new reward coin is added (via gov) to an already rewarded pool (that the user has already deposited to), and the claim is synced;
 | ||||
| 	// Then the user earns rewards for the time since the reward was added, and the new indexes are added.
 | ||||
| 
 | ||||
| 	originalReward := arbitraryCoins() | ||||
| 	poolID := "base/quote" | ||||
| 
 | ||||
| 	claim := types.SwapClaim{ | ||||
| 		BaseMultiClaim: types.BaseMultiClaim{ | ||||
| 			Owner:  arbitraryAddress(), | ||||
| 			Reward: originalReward, | ||||
| 		}, | ||||
| 		RewardIndexes: types.MultiRewardIndexes{ | ||||
| 			{ | ||||
| 				CollateralType: poolID, | ||||
| 				RewardIndexes: types.RewardIndexes{ | ||||
| 					{ | ||||
| 						CollateralType: "reward", | ||||
| 						RewardFactor:   d("1000.001"), | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 	suite.storeSwapClaim(claim) | ||||
| 
 | ||||
| 	globalIndexes := types.MultiRewardIndexes{ | ||||
| 		{ | ||||
| 			CollateralType: poolID, | ||||
| 			RewardIndexes: types.RewardIndexes{ | ||||
| 				{ | ||||
| 					CollateralType: "reward", | ||||
| 					RewardFactor:   d("2000.002"), | ||||
| 				}, | ||||
| 				{ | ||||
| 					CollateralType: "otherreward", | ||||
| 					// Indexes start at 0 when the reward is added by gov,
 | ||||
| 					// so this represents the syncing happening some time later.
 | ||||
| 					RewardFactor: d("1000.001"), | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 	suite.storeGlobalSwapIndexes(globalIndexes) | ||||
| 
 | ||||
| 	userShares := i(1e9) | ||||
| 
 | ||||
| 	suite.keeper.SynchronizeSwapReward(suite.ctx, poolID, claim.Owner, userShares) | ||||
| 
 | ||||
| 	syncedClaim, _ := suite.keeper.GetSwapClaim(suite.ctx, claim.Owner) | ||||
| 	// indexes should have the new reward denom added
 | ||||
| 	suite.Equal(globalIndexes, syncedClaim.RewardIndexes) | ||||
| 	// new reward is (new index - old index) * shares
 | ||||
| 	// The old index for `otherreward` isn't in the claim, so it's added starting at 0 for calculating the reward.
 | ||||
| 	suite.Equal( | ||||
| 		cs(c("reward", 1_000_001_000_000), c("otherreward", 1_000_001_000_000)).Add(originalReward...), | ||||
| 		syncedClaim.Reward, | ||||
| 	) | ||||
| } | ||||
| 
 | ||||
| func (suite *SynchronizeSwapRewardTests) TestClaimUpdatedWhenGlobalIndexesIncreasedAndSourceIsZero() { | ||||
| 	// Given some time has passed (meaning the global indexes have increased)
 | ||||
| 	// When the claim is synced, but the user has no shares
 | ||||
| 	// The user earns no rewards for the time passed, but the claim indexes are updated
 | ||||
| 
 | ||||
| 	poolID := "base/quote" | ||||
| 
 | ||||
| 	claim := types.SwapClaim{ | ||||
| 		BaseMultiClaim: types.BaseMultiClaim{ | ||||
| 			Owner:  arbitraryAddress(), | ||||
| 			Reward: arbitraryCoins(), | ||||
| 		}, | ||||
| 		RewardIndexes: types.MultiRewardIndexes{ | ||||
| 			{ | ||||
| 				CollateralType: poolID, | ||||
| 				RewardIndexes: types.RewardIndexes{ | ||||
| 					{ | ||||
| 						CollateralType: "rewarddenom", | ||||
| 						RewardFactor:   d("1000.001"), | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 	suite.storeSwapClaim(claim) | ||||
| 
 | ||||
| 	globalIndexes := types.MultiRewardIndexes{ | ||||
| 		{ | ||||
| 			CollateralType: poolID, | ||||
| 			RewardIndexes: types.RewardIndexes{ | ||||
| 				{ | ||||
| 					CollateralType: "rewarddenom", | ||||
| 					RewardFactor:   d("2000.002"), | ||||
| 				}, | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
| 	suite.storeGlobalSwapIndexes(globalIndexes) | ||||
| 
 | ||||
| 	userShares := i(0) | ||||
| 
 | ||||
| 	suite.keeper.SynchronizeSwapReward(suite.ctx, poolID, claim.Owner, userShares) | ||||
| 
 | ||||
| 	syncedClaim, _ := suite.keeper.GetSwapClaim(suite.ctx, claim.Owner) | ||||
| 	// indexes updated from global
 | ||||
| 	suite.Equal(globalIndexes, syncedClaim.RewardIndexes) | ||||
| 	// reward is unchanged
 | ||||
| 	suite.Equal(claim.Reward, syncedClaim.Reward) | ||||
| } | ||||
| @ -31,7 +31,7 @@ func TestAccumulateSwapRewards(t *testing.T) { | ||||
| } | ||||
| 
 | ||||
| func (suite *AccumulateSwapRewardsTests) TestStateUpdatedWhenBlockTimeHasIncreased() { | ||||
| 	swapKeeper := &fakeSwapKeeper{d("1000000")} | ||||
| 	swapKeeper := &fakeSwapKeeper{i(1e6)} | ||||
| 	suite.keeper = suite.NewKeeper(&fakeParamSubspace{}, nil, nil, nil, nil, nil, swapKeeper) | ||||
| 
 | ||||
| 	pool := "btc/usdx" | ||||
| @ -84,7 +84,7 @@ func (suite *AccumulateSwapRewardsTests) TestStateUpdatedWhenBlockTimeHasIncreas | ||||
| } | ||||
| 
 | ||||
| func (suite *AccumulateSwapRewardsTests) TestLimitsOfAccumulationPrecision() { | ||||
| 	swapKeeper := &fakeSwapKeeper{d("100000000000000000")} // approximate shares in a $1B pool of 10^8 precision assets
 | ||||
| 	swapKeeper := &fakeSwapKeeper{i(1e17)} // approximate shares in a $1B pool of 10^8 precision ~$1 asset
 | ||||
| 	suite.keeper = suite.NewKeeper(&fakeParamSubspace{}, nil, nil, nil, nil, nil, swapKeeper) | ||||
| 
 | ||||
| 	pool := "btc/usdx" | ||||
| @ -130,7 +130,7 @@ func (suite *AccumulateSwapRewardsTests) TestLimitsOfAccumulationPrecision() { | ||||
| } | ||||
| 
 | ||||
| func (suite *AccumulateSwapRewardsTests) TestStateUnchangedWhenBlockTimeHasNotIncreased() { | ||||
| 	swapKeeper := &fakeSwapKeeper{d("1000000")} | ||||
| 	swapKeeper := &fakeSwapKeeper{i(1e6)} | ||||
| 	suite.keeper = suite.NewKeeper(&fakeParamSubspace{}, nil, nil, nil, nil, nil, swapKeeper) | ||||
| 
 | ||||
| 	pool := "btc/usdx" | ||||
| @ -182,7 +182,7 @@ func (suite *AccumulateSwapRewardsTests) TestStateUnchangedWhenBlockTimeHasNotIn | ||||
| } | ||||
| 
 | ||||
| func (suite *AccumulateSwapRewardsTests) TestStateAddedWhenStateDoesNotExist() { | ||||
| 	swapKeeper := &fakeSwapKeeper{d("1000000")} | ||||
| 	swapKeeper := &fakeSwapKeeper{i(1e6)} | ||||
| 	suite.keeper = suite.NewKeeper(&fakeParamSubspace{}, nil, nil, nil, nil, nil, swapKeeper) | ||||
| 
 | ||||
| 	pool := "btc/usdx" | ||||
| @ -225,7 +225,7 @@ func (suite *AccumulateSwapRewardsTests) TestStateAddedWhenStateDoesNotExist() { | ||||
| 	suite.checkStoredIndexesEqual(pool, expectedIndexes) | ||||
| } | ||||
| func (suite *AccumulateSwapRewardsTests) TestNoPanicWhenStateDoesNotExist() { | ||||
| 	swapKeeper := &fakeSwapKeeper{d("0")} | ||||
| 	swapKeeper := &fakeSwapKeeper{i(0)} | ||||
| 	suite.keeper = suite.NewKeeper(&fakeParamSubspace{}, nil, nil, nil, nil, nil, swapKeeper) | ||||
| 
 | ||||
| 	pool := "btc/usdx" | ||||
| @ -252,12 +252,16 @@ func (suite *AccumulateSwapRewardsTests) TestNoPanicWhenStateDoesNotExist() { | ||||
| } | ||||
| 
 | ||||
| type fakeSwapKeeper struct { | ||||
| 	poolShares sdk.Dec | ||||
| 	poolShares sdk.Int | ||||
| } | ||||
| 
 | ||||
| func (k fakeSwapKeeper) GetPoolShares(ctx sdk.Context, poolID string) (sdk.Dec, bool) { | ||||
| func (k fakeSwapKeeper) GetPoolShares(ctx sdk.Context, poolID string) (sdk.Int, bool) { | ||||
| 	return k.poolShares, true | ||||
| } | ||||
| func (k fakeSwapKeeper) GetDepositorSharesInPool(ctx sdk.Context, depositor sdk.AccAddress, poolID string) (sdk.Int, bool) { | ||||
| 	// This is just to implement the swap keeper interface.
 | ||||
| 	return sdk.Int{}, false | ||||
| } | ||||
| 
 | ||||
| // note: amino panics when encoding times ≥ the start of year 10000.
 | ||||
| var distantFuture = time.Date(9000, 1, 1, 0, 0, 0, 0, time.UTC) | ||||
|  | ||||
| @ -87,10 +87,12 @@ func (suite *unitTester) storeGlobalSwapIndexes(indexes types.MultiRewardIndexes | ||||
| func (suite *unitTester) storeHardClaim(claim types.HardLiquidityProviderClaim) { | ||||
| 	suite.keeper.SetHardLiquidityProviderClaim(suite.ctx, claim) | ||||
| } | ||||
| 
 | ||||
| func (suite *unitTester) storeDelegatorClaim(claim types.DelegatorClaim) { | ||||
| 	suite.keeper.SetDelegatorClaim(suite.ctx, claim) | ||||
| } | ||||
| func (suite *unitTester) storeSwapClaim(claim types.SwapClaim) { | ||||
| 	suite.keeper.SetSwapClaim(suite.ctx, claim) | ||||
| } | ||||
| 
 | ||||
| type fakeParamSubspace struct { | ||||
| 	params types.Params | ||||
|  | ||||
| @ -12,6 +12,7 @@ const ( | ||||
| 	USDXMintingClaimType           = "usdx_minting" | ||||
| 	HardLiquidityProviderClaimType = "hard_liquidity_provider" | ||||
| 	DelegatorClaimType             = "delegator_claim" | ||||
| 	SwapClaimType                  = "swap" | ||||
| 	BondDenom                      = "ukava" | ||||
| ) | ||||
| 
 | ||||
| @ -314,6 +315,71 @@ func (cs DelegatorClaims) Validate() error { | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // SwapClaim stores the swap rewards that can be claimed by owner
 | ||||
| type SwapClaim struct { | ||||
| 	BaseMultiClaim `json:"base_claim" yaml:"base_claim"` | ||||
| 	RewardIndexes  MultiRewardIndexes `json:"reward_indexes" yaml:"reward_indexes"` | ||||
| } | ||||
| 
 | ||||
| // NewSwapClaim returns a new SwapClaim
 | ||||
| func NewSwapClaim(owner sdk.AccAddress, rewards sdk.Coins, rewardIndexes MultiRewardIndexes) SwapClaim { | ||||
| 	return SwapClaim{ | ||||
| 		BaseMultiClaim: BaseMultiClaim{ | ||||
| 			Owner:  owner, | ||||
| 			Reward: rewards, | ||||
| 		}, | ||||
| 		RewardIndexes: rewardIndexes, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // GetType returns the claim's type
 | ||||
| func (c SwapClaim) GetType() string { return SwapClaimType } | ||||
| 
 | ||||
| // GetReward returns the claim's reward coin
 | ||||
| func (c SwapClaim) GetReward() sdk.Coins { return c.Reward } | ||||
| 
 | ||||
| // GetOwner returns the claim's owner
 | ||||
| func (c SwapClaim) GetOwner() sdk.AccAddress { return c.Owner } | ||||
| 
 | ||||
| // Validate performs a basic check of a SwapClaim fields
 | ||||
| func (c SwapClaim) Validate() error { | ||||
| 	if err := c.RewardIndexes.Validate(); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return c.BaseMultiClaim.Validate() | ||||
| } | ||||
| 
 | ||||
| // String implements fmt.Stringer
 | ||||
| func (c SwapClaim) String() string { | ||||
| 	return fmt.Sprintf(`%s | ||||
| 	Reward Indexes: %s, | ||||
| 	`, c.BaseMultiClaim, c.RewardIndexes) | ||||
| } | ||||
| 
 | ||||
| // HasRewardIndex check if a claim has a reward index for the input pool ID.
 | ||||
| func (c SwapClaim) HasRewardIndex(poolID string) (int64, bool) { | ||||
| 	for index, ri := range c.RewardIndexes { | ||||
| 		if ri.CollateralType == poolID { | ||||
| 			return int64(index), true | ||||
| 		} | ||||
| 	} | ||||
| 	return 0, false | ||||
| } | ||||
| 
 | ||||
| // SwapClaims slice of SwapClaim
 | ||||
| type SwapClaims []SwapClaim | ||||
| 
 | ||||
| // Validate checks if all the claims are valid.
 | ||||
| func (cs SwapClaims) Validate() error { | ||||
| 	for _, c := range cs { | ||||
| 		if err := c.Validate(); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // ---------------------- Reward indexes are used internally in the store ----------------------
 | ||||
| 
 | ||||
| // RewardIndex stores reward accumulation information
 | ||||
|  | ||||
| @ -18,67 +18,125 @@ func c(denom string, amount int64) sdk.Coin { return sdk.NewInt64Coin(denom, amo | ||||
| // c is a helper function for created sdk.Coins types in tests
 | ||||
| func cs(coins ...sdk.Coin) sdk.Coins { return sdk.NewCoins(coins...) } | ||||
| 
 | ||||
| func TestClaimsValidate(t *testing.T) { | ||||
| func TestClaims_Validate(t *testing.T) { | ||||
| 	owner := sdk.AccAddress(crypto.AddressHash([]byte("KavaTestUser1"))) | ||||
| 
 | ||||
| 	testCases := []struct { | ||||
| 		msg     string | ||||
| 		claims  USDXMintingClaims | ||||
| 		expPass bool | ||||
| 	}{ | ||||
| 		{ | ||||
| 			"valid", | ||||
| 			USDXMintingClaims{ | ||||
| 				NewUSDXMintingClaim(owner, sdk.NewCoin("bnb", sdk.OneInt()), RewardIndexes{NewRewardIndex("bnb-a", sdk.ZeroDec())}), | ||||
| 			}, | ||||
| 			true, | ||||
| 		}, | ||||
| 		{ | ||||
| 			"invalid owner", | ||||
| 			USDXMintingClaims{ | ||||
| 				USDXMintingClaim{ | ||||
| 					BaseClaim: BaseClaim{ | ||||
| 						Owner: nil, | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
| 			false, | ||||
| 		}, | ||||
| 		{ | ||||
| 			"invalid reward", | ||||
| 			USDXMintingClaims{ | ||||
| 				{ | ||||
| 					BaseClaim: BaseClaim{ | ||||
| 						Owner:  owner, | ||||
| 						Reward: sdk.Coin{Denom: "", Amount: sdk.ZeroInt()}, | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
| 			false, | ||||
| 		}, | ||||
| 		{ | ||||
| 			"invalid collateral type", | ||||
| 			USDXMintingClaims{ | ||||
| 				{ | ||||
| 					BaseClaim: BaseClaim{ | ||||
| 						Owner:  owner, | ||||
| 						Reward: sdk.NewCoin("bnb", sdk.OneInt()), | ||||
| 					}, | ||||
| 					RewardIndexes: []RewardIndex{{"", sdk.ZeroDec()}}, | ||||
| 				}, | ||||
| 			}, | ||||
| 			false, | ||||
| 		}, | ||||
| 	} | ||||
| 	t.Run("USDXMintingClaims", func(t *testing.T) { | ||||
| 
 | ||||
| 	for _, tc := range testCases { | ||||
| 		err := tc.claims.Validate() | ||||
| 		if tc.expPass { | ||||
| 			require.NoError(t, err, tc.msg) | ||||
| 		} else { | ||||
| 			require.Error(t, err, tc.msg) | ||||
| 		testCases := []struct { | ||||
| 			name    string | ||||
| 			claims  USDXMintingClaims | ||||
| 			expPass bool | ||||
| 		}{ | ||||
| 			{ | ||||
| 				"valid", | ||||
| 				USDXMintingClaims{ | ||||
| 					NewUSDXMintingClaim(owner, sdk.NewCoin("bnb", sdk.OneInt()), RewardIndexes{NewRewardIndex("bnb-a", sdk.ZeroDec())}), | ||||
| 				}, | ||||
| 				true, | ||||
| 			}, | ||||
| 			{ | ||||
| 				"invalid owner", | ||||
| 				USDXMintingClaims{ | ||||
| 					USDXMintingClaim{ | ||||
| 						BaseClaim: BaseClaim{ | ||||
| 							Owner: nil, | ||||
| 						}, | ||||
| 					}, | ||||
| 				}, | ||||
| 				false, | ||||
| 			}, | ||||
| 			{ | ||||
| 				"invalid reward", | ||||
| 				USDXMintingClaims{ | ||||
| 					{ | ||||
| 						BaseClaim: BaseClaim{ | ||||
| 							Owner:  owner, | ||||
| 							Reward: sdk.Coin{Denom: "", Amount: sdk.ZeroInt()}, | ||||
| 						}, | ||||
| 					}, | ||||
| 				}, | ||||
| 				false, | ||||
| 			}, | ||||
| 			{ | ||||
| 				"invalid collateral type", | ||||
| 				USDXMintingClaims{ | ||||
| 					{ | ||||
| 						BaseClaim: BaseClaim{ | ||||
| 							Owner:  owner, | ||||
| 							Reward: sdk.NewCoin("bnb", sdk.OneInt()), | ||||
| 						}, | ||||
| 						RewardIndexes: []RewardIndex{{"", sdk.ZeroDec()}}, | ||||
| 					}, | ||||
| 				}, | ||||
| 				false, | ||||
| 			}, | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 		for _, tc := range testCases { | ||||
| 			t.Run(tc.name, func(t *testing.T) { | ||||
| 				err := tc.claims.Validate() | ||||
| 				if tc.expPass { | ||||
| 					require.NoError(t, err) | ||||
| 				} else { | ||||
| 					require.Error(t, err) | ||||
| 				} | ||||
| 			}) | ||||
| 		} | ||||
| 	}) | ||||
| 	t.Run("SwapClaims", func(t *testing.T) { | ||||
| 
 | ||||
| 		validRewardIndexes := RewardIndexes{}.With("swap", d("0.002")) | ||||
| 		validMultiRewardIndexes := MultiRewardIndexes{}.With("btcb/usdx", validRewardIndexes) | ||||
| 		invalidRewardIndexes := RewardIndexes{}.With("swap", d("-0.002")) | ||||
| 		invalidMultiRewardIndexes := MultiRewardIndexes{}.With("btcb/usdx", invalidRewardIndexes) | ||||
| 
 | ||||
| 		testCases := []struct { | ||||
| 			name    string | ||||
| 			claims  SwapClaims | ||||
| 			expPass bool | ||||
| 		}{ | ||||
| 			{ | ||||
| 				name: "valid", | ||||
| 				claims: SwapClaims{ | ||||
| 					NewSwapClaim(owner, cs(c("bnb", 1)), validMultiRewardIndexes), | ||||
| 				}, | ||||
| 				expPass: true, | ||||
| 			}, | ||||
| 			{ | ||||
| 				name: "invalid owner", | ||||
| 				claims: SwapClaims{ | ||||
| 					NewSwapClaim(nil, cs(c("bnb", 1)), validMultiRewardIndexes), | ||||
| 				}, | ||||
| 				expPass: false, | ||||
| 			}, | ||||
| 			{ | ||||
| 				name: "invalid reward", | ||||
| 				claims: SwapClaims{ | ||||
| 					NewSwapClaim(owner, sdk.Coins{sdk.Coin{Denom: "invalid😫"}}, validMultiRewardIndexes), | ||||
| 				}, | ||||
| 				expPass: false, | ||||
| 			}, | ||||
| 			{ | ||||
| 				name: "invalid indexes", | ||||
| 				claims: SwapClaims{ | ||||
| 					NewSwapClaim(nil, cs(c("bnb", 1)), invalidMultiRewardIndexes), | ||||
| 				}, | ||||
| 				expPass: false, | ||||
| 			}, | ||||
| 		} | ||||
| 
 | ||||
| 		for _, tc := range testCases { | ||||
| 			t.Run(tc.name, func(t *testing.T) { | ||||
| 				err := tc.claims.Validate() | ||||
| 				if tc.expPass { | ||||
| 					require.NoError(t, err) | ||||
| 				} else { | ||||
| 					require.Error(t, err) | ||||
| 				} | ||||
| 			}) | ||||
| 		} | ||||
| 	}) | ||||
| } | ||||
| 
 | ||||
| func TestRewardIndexes(t *testing.T) { | ||||
|  | ||||
| @ -53,7 +53,8 @@ type HardKeeper interface { | ||||
| 
 | ||||
| // SwapKeeper defines the required methods needed by this modules keeper
 | ||||
| type SwapKeeper interface { | ||||
| 	GetPoolShares(ctx sdk.Context, poolID string) (shares sdk.Dec, found bool) | ||||
| 	GetPoolShares(ctx sdk.Context, poolID string) (shares sdk.Int, found bool) | ||||
| 	GetDepositorSharesInPool(ctx sdk.Context, depositor sdk.AccAddress, poolID string) (shares sdk.Int, found bool) | ||||
| } | ||||
| 
 | ||||
| // AccountKeeper defines the expected keeper interface for interacting with account
 | ||||
|  | ||||
| @ -17,11 +17,12 @@ type GenesisState struct { | ||||
| 	USDXMintingClaims           USDXMintingClaims           `json:"usdx_minting_claims" yaml:"usdx_minting_claims"` | ||||
| 	HardLiquidityProviderClaims HardLiquidityProviderClaims `json:"hard_liquidity_provider_claims" yaml:"hard_liquidity_provider_claims"` | ||||
| 	DelegatorClaims             DelegatorClaims             `json:"delegator_claims" yaml:"delegator_claims"` | ||||
| 	SwapClaims                  SwapClaims                  `json:"swap_claims" yaml:"swap_claims"` | ||||
| } | ||||
| 
 | ||||
| // NewGenesisState returns a new genesis state
 | ||||
| func NewGenesisState(params Params, usdxAccumTimes, hardSupplyAccumTimes, hardBorrowAccumTimes, delegatorAccumTimes, | ||||
| 	swapAccumTimes GenesisAccumulationTimes, c USDXMintingClaims, hc HardLiquidityProviderClaims, dc DelegatorClaims) GenesisState { | ||||
| 	swapAccumTimes GenesisAccumulationTimes, c USDXMintingClaims, hc HardLiquidityProviderClaims, dc DelegatorClaims, sc SwapClaims) GenesisState { | ||||
| 	return GenesisState{ | ||||
| 		Params:                      params, | ||||
| 		USDXAccumulationTimes:       usdxAccumTimes, | ||||
| @ -32,6 +33,7 @@ func NewGenesisState(params Params, usdxAccumTimes, hardSupplyAccumTimes, hardBo | ||||
| 		USDXMintingClaims:           c, | ||||
| 		HardLiquidityProviderClaims: hc, | ||||
| 		DelegatorClaims:             dc, | ||||
| 		SwapClaims:                  sc, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @ -47,6 +49,7 @@ func DefaultGenesisState() GenesisState { | ||||
| 		USDXMintingClaims:           DefaultUSDXClaims, | ||||
| 		HardLiquidityProviderClaims: DefaultHardClaims, | ||||
| 		DelegatorClaims:             DefaultDelegatorClaims, | ||||
| 		SwapClaims:                  DefaultSwapClaims, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @ -72,13 +75,16 @@ func (gs GenesisState) Validate() error { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	if err := gs.HardLiquidityProviderClaims.Validate(); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if err := gs.USDXMintingClaims.Validate(); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return gs.DelegatorClaims.Validate() | ||||
| 	if err := gs.HardLiquidityProviderClaims.Validate(); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if err := gs.DelegatorClaims.Validate(); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return gs.SwapClaims.Validate() | ||||
| } | ||||
| 
 | ||||
| // Equal checks whether two gov GenesisState structs are equivalent
 | ||||
|  | ||||
| @ -141,6 +141,7 @@ func TestGenesisStateValidate(t *testing.T) { | ||||
| 				tc.args.claims, | ||||
| 				DefaultHardClaims, | ||||
| 				DefaultDelegatorClaims, | ||||
| 				DefaultSwapClaims, | ||||
| 			) | ||||
| 			err := gs.Validate() | ||||
| 			if tc.errArgs.expectPass { | ||||
|  | ||||
| @ -34,8 +34,9 @@ var ( | ||||
| 	DelegatorClaimKeyPrefix                       = []byte{0x09} // prefix for keys that store delegator claims
 | ||||
| 	DelegatorRewardIndexesKeyPrefix               = []byte{0x10} // prefix for key that stores delegator reward indexes
 | ||||
| 	PreviousDelegatorRewardAccrualTimeKeyPrefix   = []byte{0x11} // prefix for key that stores the previous time delegator 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
 | ||||
| 	SwapClaimKeyPrefix                            = []byte{0x12} // prefix for keys that store swap claims
 | ||||
| 	SwapRewardIndexesKeyPrefix                    = []byte{0x13} // prefix for key that stores swap reward indexes
 | ||||
| 	PreviousSwapRewardAccrualTimeKeyPrefix        = []byte{0x14} // prefix for key that stores the previous time swap rewards accrued
 | ||||
| 
 | ||||
| 	USDXMintingRewardDenom   = "ukava" | ||||
| 	HardLiquidityRewardDenom = "hard" | ||||
|  | ||||
| @ -38,6 +38,7 @@ var ( | ||||
| 	DefaultUSDXClaims               = USDXMintingClaims{} | ||||
| 	DefaultHardClaims               = HardLiquidityProviderClaims{} | ||||
| 	DefaultDelegatorClaims          = DelegatorClaims{} | ||||
| 	DefaultSwapClaims               = SwapClaims{} | ||||
| 	DefaultGenesisAccumulationTimes = GenesisAccumulationTimes{} | ||||
| 	DefaultClaimEnd                 = tmtime.Canonical(time.Unix(1, 0)) | ||||
| 	GovDenom                        = cdptypes.DefaultGovDenom | ||||
|  | ||||
| @ -6,169 +6,54 @@ import ( | ||||
| 
 | ||||
| // Querier routes for the incentive module
 | ||||
| const ( | ||||
| 	QueryGetRewards                    = "rewards" | ||||
| 	QueryGetHardRewards                = "hard-rewards" | ||||
| 	QueryGetHardRewardsUnsynced        = "hard-rewards-unsynced" | ||||
| 	QueryGetUSDXMintingRewards         = "usdx-minting-rewards" | ||||
| 	QueryGetUSDXMintingRewardsUnsynced = "usdx-minting-rewards-unsynced" | ||||
| 	QueryGetDelegatorRewards           = "delegator-rewards" | ||||
| 	QueryGetDelegatorRewardsUnsynced   = "delegator-rewards-unsynced" | ||||
| 	QueryGetRewardFactors              = "reward-factors" | ||||
| 	QueryGetParams                     = "parameters" | ||||
| 	QueryGetRewardPeriods              = "reward-periods" | ||||
| 	QueryGetClaimPeriods               = "claim-periods" | ||||
| 	RestClaimCollateralType            = "collateral_type" | ||||
| 	RestClaimOwner                     = "owner" | ||||
| 	RestClaimType                      = "type" | ||||
| 	RestUnsynced                       = "unsynced" | ||||
| 	QueryGetHardRewards        = "hard-rewards" | ||||
| 	QueryGetUSDXMintingRewards = "usdx-minting-rewards" | ||||
| 	QueryGetDelegatorRewards   = "delegator-rewards" | ||||
| 	QueryGetSwapRewards        = "swap-rewards" | ||||
| 	QueryGetRewardFactors      = "reward-factors" | ||||
| 	QueryGetParams             = "parameters" | ||||
| 
 | ||||
| 	RestClaimCollateralType = "collateral_type" | ||||
| 	RestClaimOwner          = "owner" | ||||
| 	RestClaimType           = "type" | ||||
| 	RestUnsynced            = "unsynced" | ||||
| ) | ||||
| 
 | ||||
| // QueryRewardsParams params for query /incentive/rewards
 | ||||
| // QueryRewardsParams params for query /incentive/rewards/<claim type>
 | ||||
| type QueryRewardsParams struct { | ||||
| 	Page  int `json:"page" yaml:"page"` | ||||
| 	Limit int `json:"limit" yaml:"limit"` | ||||
| 	Owner sdk.AccAddress | ||||
| 	Type  string | ||||
| 	Page           int            `json:"page" yaml:"page"` | ||||
| 	Limit          int            `json:"limit" yaml:"limit"` | ||||
| 	Owner          sdk.AccAddress `json:"owner" yaml:"owner"` | ||||
| 	Unsynchronized bool           `json:"unsynchronized" yaml:"unsynchronized"` | ||||
| } | ||||
| 
 | ||||
| // NewQueryRewardsParams returns QueryRewardsParams
 | ||||
| func NewQueryRewardsParams(page, limit int, owner sdk.AccAddress, rewardType string) QueryRewardsParams { | ||||
| func NewQueryRewardsParams(page, limit int, owner sdk.AccAddress, unsynchronized bool) QueryRewardsParams { | ||||
| 	return QueryRewardsParams{ | ||||
| 		Page:  page, | ||||
| 		Limit: limit, | ||||
| 		Owner: owner, | ||||
| 		Type:  rewardType, | ||||
| 		Page:           page, | ||||
| 		Limit:          limit, | ||||
| 		Owner:          owner, | ||||
| 		Unsynchronized: unsynchronized, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // QueryUSDXMintingRewardsParams params for query /incentive/rewards type usdx-minting
 | ||||
| type QueryUSDXMintingRewardsParams struct { | ||||
| 	Page  int `json:"page" yaml:"page"` | ||||
| 	Limit int `json:"limit" yaml:"limit"` | ||||
| 	Owner sdk.AccAddress | ||||
| // QueryGetRewardFactorsResponse holds the response to a reward factor query
 | ||||
| type QueryGetRewardFactorsResponse struct { | ||||
| 	USDXMintingRewardFactors RewardIndexes      `json:"usdx_minting_reward_factors" yaml:"usdx_minting_reward_factors"` | ||||
| 	HardSupplyRewardFactors  MultiRewardIndexes `json:"hard_supply_reward_factors" yaml:"hard_supply_reward_factors"` | ||||
| 	HardBorrowRewardFactors  MultiRewardIndexes `json:"hard_borrow_reward_factors" yaml:"hard_borrow_reward_factors"` | ||||
| 	DelegatorRewardFactors   MultiRewardIndexes `json:"delegator_reward_factors" yaml:"delegator_reward_factors"` | ||||
| 	SwapRewardFactors        MultiRewardIndexes `json:"swap_reward_factors" yaml:"swap_reward_factors"` | ||||
| } | ||||
| 
 | ||||
| // NewQueryUSDXMintingRewardsParams returns QueryUSDXMintingRewardsParams
 | ||||
| func NewQueryUSDXMintingRewardsParams(page, limit int, owner sdk.AccAddress) QueryUSDXMintingRewardsParams { | ||||
| 	return QueryUSDXMintingRewardsParams{ | ||||
| 		Page:  page, | ||||
| 		Limit: limit, | ||||
| 		Owner: owner, | ||||
| // NewQueryGetRewardFactorsResponse returns a new instance of QueryAllRewardFactorsResponse
 | ||||
| func NewQueryGetRewardFactorsResponse(usdxMintingFactors RewardIndexes, supplyFactors, | ||||
| 	hardBorrowFactors, delegatorFactors, swapFactors MultiRewardIndexes) QueryGetRewardFactorsResponse { | ||||
| 	return QueryGetRewardFactorsResponse{ | ||||
| 		USDXMintingRewardFactors: usdxMintingFactors, | ||||
| 		HardSupplyRewardFactors:  supplyFactors, | ||||
| 		HardBorrowRewardFactors:  hardBorrowFactors, | ||||
| 		DelegatorRewardFactors:   delegatorFactors, | ||||
| 		SwapRewardFactors:        swapFactors, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // QueryUSDXMintingRewardsUnsyncedParams params for query unsynced /incentive/rewards type usdx-minting
 | ||||
| type QueryUSDXMintingRewardsUnsyncedParams struct { | ||||
| 	Page  int `json:"page" yaml:"page"` | ||||
| 	Limit int `json:"limit" yaml:"limit"` | ||||
| 	Owner sdk.AccAddress | ||||
| } | ||||
| 
 | ||||
| // NewQueryUSDXMintingRewardsUnsyncedParams returns QueryUSDXMintingRewardsUnsyncedParams
 | ||||
| func NewQueryUSDXMintingRewardsUnsyncedParams(page, limit int, owner sdk.AccAddress) QueryUSDXMintingRewardsUnsyncedParams { | ||||
| 	return QueryUSDXMintingRewardsUnsyncedParams{ | ||||
| 		Page:  page, | ||||
| 		Limit: limit, | ||||
| 		Owner: owner, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // QueryHardRewardsParams params for query /incentive/rewards type hard
 | ||||
| type QueryHardRewardsParams struct { | ||||
| 	Page  int `json:"page" yaml:"page"` | ||||
| 	Limit int `json:"limit" yaml:"limit"` | ||||
| 	Owner sdk.AccAddress | ||||
| } | ||||
| 
 | ||||
| // NewQueryHardRewardsParams returns QueryHardRewardsParams
 | ||||
| func NewQueryHardRewardsParams(page, limit int, owner sdk.AccAddress) QueryHardRewardsParams { | ||||
| 	return QueryHardRewardsParams{ | ||||
| 		Page:  page, | ||||
| 		Limit: limit, | ||||
| 		Owner: owner, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // QueryHardRewardsUnsyncedParams params for query unsynced /incentive/rewards type hard
 | ||||
| type QueryHardRewardsUnsyncedParams struct { | ||||
| 	Page  int `json:"page" yaml:"page"` | ||||
| 	Limit int `json:"limit" yaml:"limit"` | ||||
| 	Owner sdk.AccAddress | ||||
| } | ||||
| 
 | ||||
| // NewQueryHardRewardsUnsyncedParams returns QueryHardRewardsUnsyncedParams
 | ||||
| func NewQueryHardRewardsUnsyncedParams(page, limit int, owner sdk.AccAddress) QueryHardRewardsUnsyncedParams { | ||||
| 	return QueryHardRewardsUnsyncedParams{ | ||||
| 		Page:  page, | ||||
| 		Limit: limit, | ||||
| 		Owner: owner, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // QueryRewardFactorsParams is the params for a filtered reward factors query
 | ||||
| type QueryRewardFactorsParams struct { | ||||
| 	Denom string `json:"denom" yaml:"denom"` | ||||
| } | ||||
| 
 | ||||
| // NewQueryRewardFactorsParams creates a new QueryRewardFactorsParams
 | ||||
| func NewQueryRewardFactorsParams(denom string) QueryRewardFactorsParams { | ||||
| 	return QueryRewardFactorsParams{ | ||||
| 		Denom: denom, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // 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
 | ||||
| type RewardFactor struct { | ||||
| 	Denom                   string        `json:"denom" yaml:"denom"` | ||||
| 	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"` | ||||
| 	HardBorrowRewardFactors RewardIndexes `json:"hard_borrow_reward_factors" yaml:"hard_borrow_reward_factors"` | ||||
| 	DelegatorRewardFactors  RewardIndexes `json:"delegator_reward_factors" yaml:"delegator_reward_factors"` | ||||
| } | ||||
| 
 | ||||
| // NewRewardFactor returns a new instance of RewardFactor
 | ||||
| func NewRewardFactor(denom string, usdxMintingRewardFactor sdk.Dec, hardSupplyRewardFactors, | ||||
| 	hardBorrowRewardFactors, delegatorRewardFactors RewardIndexes) RewardFactor { | ||||
| 	return RewardFactor{ | ||||
| 		Denom:                   denom, | ||||
| 		USDXMintingRewardFactor: usdxMintingRewardFactor, | ||||
| 		HardSupplyRewardFactors: hardSupplyRewardFactors, | ||||
| 		HardBorrowRewardFactors: hardBorrowRewardFactors, | ||||
| 		DelegatorRewardFactors:  delegatorRewardFactors, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // RewardFactors is a slice of RewardFactor
 | ||||
| type RewardFactors = []RewardFactor | ||||
|  | ||||
| @ -2,9 +2,35 @@ package keeper | ||||
| 
 | ||||
| import ( | ||||
| 	sdk "github.com/cosmos/cosmos-sdk/types" | ||||
| 
 | ||||
| 	"github.com/kava-labs/kava/x/swap/types" | ||||
| ) | ||||
| 
 | ||||
| func (k Keeper) GetPoolShares(ctx sdk.Context, poolID string) (sdk.Dec, bool) { | ||||
| func (k Keeper) GetPoolShares(ctx sdk.Context, poolID string) (sdk.Int, bool) { | ||||
| 	// FIXME return pool shares once merged with acceptance branch
 | ||||
| 	return sdk.Dec{}, false | ||||
| 	return sdk.Int{}, false | ||||
| } | ||||
| 
 | ||||
| func (k *Keeper) GetDepositorSharesInPool(ctx sdk.Context, depositor sdk.AccAddress, poolID string) (sdk.Int, bool) { | ||||
| 	// FIXME return depositor shares once merged with acceptance branch
 | ||||
| 	return sdk.Int{}, false | ||||
| } | ||||
| 
 | ||||
| // Implements SwapHooks interface
 | ||||
| var _ types.SwapHooks = Keeper{} | ||||
| 
 | ||||
| // FIXME call hooks within pool logic
 | ||||
| 
 | ||||
| // AfterPoolDepositCreated - call hook if registered
 | ||||
| func (k Keeper) AfterPoolDepositCreated(ctx sdk.Context, poolID string, depositor sdk.AccAddress, sharesOwned sdk.Int) { | ||||
| 	if k.hooks != nil { | ||||
| 		k.hooks.AfterPoolDepositCreated(ctx, poolID, depositor, sharesOwned) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // BeforePoolDepositModified - call hook if registered
 | ||||
| func (k Keeper) BeforePoolDepositModified(ctx sdk.Context, poolID string, depositor sdk.AccAddress, sharesOwned sdk.Int) { | ||||
| 	if k.hooks != nil { | ||||
| 		k.hooks.BeforePoolDepositModified(ctx, poolID, depositor, sharesOwned) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -14,6 +14,7 @@ type Keeper struct { | ||||
| 	key           sdk.StoreKey | ||||
| 	cdc           *codec.Codec | ||||
| 	paramSubspace subspace.Subspace | ||||
| 	hooks         types.SwapHooks | ||||
| 	accountKeeper types.AccountKeeper | ||||
| 	supplyKeeper  types.SupplyKeeper | ||||
| } | ||||
| @ -39,6 +40,15 @@ func NewKeeper( | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // SetHooks adds hooks to the keeper.
 | ||||
| func (k *Keeper) SetHooks(sh types.SwapHooks) *Keeper { | ||||
| 	if k.hooks != nil { | ||||
| 		panic("cannot set swap hooks twice") | ||||
| 	} | ||||
| 	k.hooks = sh | ||||
| 	return k | ||||
| } | ||||
| 
 | ||||
| // GetParams returns the params from the store
 | ||||
| func (k Keeper) GetParams(ctx sdk.Context) types.Params { | ||||
| 	var p types.Params | ||||
|  | ||||
| @ -1,4 +1,4 @@ | ||||
| package types // noalias
 | ||||
| package types | ||||
| 
 | ||||
| import ( | ||||
| 	sdk "github.com/cosmos/cosmos-sdk/types" | ||||
| @ -20,3 +20,9 @@ type AccountKeeper interface { | ||||
| 	GetAccount(ctx sdk.Context, addr sdk.AccAddress) authexported.Account | ||||
| 	SetAccount(ctx sdk.Context, acc authexported.Account) | ||||
| } | ||||
| 
 | ||||
| // SwapHooks are event hooks called when a user's deposit to a swap pool changes.
 | ||||
| type SwapHooks interface { | ||||
| 	AfterPoolDepositCreated(ctx sdk.Context, poolID string, depositor sdk.AccAddress, sharedOwned sdk.Int) | ||||
| 	BeforePoolDepositModified(ctx sdk.Context, poolID string, depositor sdk.AccAddress, sharedOwned sdk.Int) | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Ruaridh
						Ruaridh