2020-04-24 15:20:34 +00:00
package keeper
import (
"time"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/store/prefix"
sdk "github.com/cosmos/cosmos-sdk/types"
2020-04-30 14:13:31 +00:00
2020-04-24 15:20:34 +00:00
"github.com/kava-labs/kava/x/incentive/types"
)
// Keeper keeper for the incentive module
type Keeper struct {
accountKeeper types . AccountKeeper
cdc * codec . Codec
cdpKeeper types . CdpKeeper
2021-01-21 13:52:09 +00:00
hardKeeper types . HardKeeper
2020-04-24 15:20:34 +00:00
key sdk . StoreKey
2021-06-21 21:05:17 +00:00
paramSubspace types . ParamSubspace
2020-04-24 15:20:34 +00:00
supplyKeeper types . SupplyKeeper
2021-01-25 12:58:12 +00:00
stakingKeeper types . StakingKeeper
2020-04-24 15:20:34 +00:00
}
// NewKeeper creates a new keeper
func NewKeeper (
2021-06-21 21:05:17 +00:00
cdc * codec . Codec , key sdk . StoreKey , paramstore types . ParamSubspace , sk types . SupplyKeeper ,
2021-01-25 12:58:12 +00:00
cdpk types . CdpKeeper , hk types . HardKeeper , ak types . AccountKeeper , stk types . StakingKeeper ,
2020-04-24 15:20:34 +00:00
) Keeper {
2021-06-21 21:05:17 +00:00
if ! paramstore . HasKeyTable ( ) {
paramstore = paramstore . WithKeyTable ( types . ParamKeyTable ( ) )
}
2020-04-24 15:20:34 +00:00
return Keeper {
accountKeeper : ak ,
cdc : cdc ,
cdpKeeper : cdpk ,
2021-01-21 13:52:09 +00:00
hardKeeper : hk ,
2020-04-24 15:20:34 +00:00
key : key ,
2021-06-21 21:05:17 +00:00
paramSubspace : paramstore ,
2020-04-24 15:20:34 +00:00
supplyKeeper : sk ,
2021-01-25 12:58:12 +00:00
stakingKeeper : stk ,
2020-04-24 15:20:34 +00:00
}
}
2021-01-21 13:52:09 +00:00
// GetUSDXMintingClaim returns the claim in the store corresponding the the input address collateral type and id and a boolean for if the claim was found
func ( k Keeper ) GetUSDXMintingClaim ( ctx sdk . Context , addr sdk . AccAddress ) ( types . USDXMintingClaim , bool ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . USDXMintingClaimKeyPrefix )
2021-01-18 19:12:37 +00:00
bz := store . Get ( addr )
2020-04-24 15:20:34 +00:00
if bz == nil {
2021-01-18 19:12:37 +00:00
return types . USDXMintingClaim { } , false
2020-04-24 15:20:34 +00:00
}
2021-01-18 19:12:37 +00:00
var c types . USDXMintingClaim
2020-04-24 15:20:34 +00:00
k . cdc . MustUnmarshalBinaryBare ( bz , & c )
return c , true
}
2021-01-21 13:52:09 +00:00
// SetUSDXMintingClaim sets the claim in the store corresponding to the input address, collateral type, and id
func ( k Keeper ) SetUSDXMintingClaim ( ctx sdk . Context , c types . USDXMintingClaim ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . USDXMintingClaimKeyPrefix )
2020-04-24 15:20:34 +00:00
bz := k . cdc . MustMarshalBinaryBare ( c )
2021-01-18 19:12:37 +00:00
store . Set ( c . Owner , bz )
2020-04-24 15:20:34 +00:00
}
2021-01-21 13:52:09 +00:00
// DeleteUSDXMintingClaim deletes the claim in the store corresponding to the input address, collateral type, and id
func ( k Keeper ) DeleteUSDXMintingClaim ( ctx sdk . Context , owner sdk . AccAddress ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . USDXMintingClaimKeyPrefix )
2021-01-18 19:12:37 +00:00
store . Delete ( owner )
2020-04-24 15:20:34 +00:00
}
2021-01-21 13:52:09 +00:00
// IterateUSDXMintingClaims iterates over all claim objects in the store and preforms a callback function
func ( k Keeper ) IterateUSDXMintingClaims ( ctx sdk . Context , cb func ( c types . USDXMintingClaim ) ( stop bool ) ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . USDXMintingClaimKeyPrefix )
2020-04-24 15:20:34 +00:00
iterator := sdk . KVStorePrefixIterator ( store , [ ] byte { } )
defer iterator . Close ( )
for ; iterator . Valid ( ) ; iterator . Next ( ) {
2021-01-18 19:12:37 +00:00
var c types . USDXMintingClaim
2020-04-24 15:20:34 +00:00
k . cdc . MustUnmarshalBinaryBare ( iterator . Value ( ) , & c )
if cb ( c ) {
break
}
}
}
2021-01-21 13:52:09 +00:00
// GetAllUSDXMintingClaims returns all Claim objects in the store
func ( k Keeper ) GetAllUSDXMintingClaims ( ctx sdk . Context ) types . USDXMintingClaims {
2021-01-18 19:12:37 +00:00
cs := types . USDXMintingClaims { }
2021-01-21 13:52:09 +00:00
k . IterateUSDXMintingClaims ( ctx , func ( c types . USDXMintingClaim ) ( stop bool ) {
2020-04-24 15:20:34 +00:00
cs = append ( cs , c )
return false
} )
return cs
}
2021-01-21 13:52:09 +00:00
// GetPreviousUSDXMintingAccrualTime returns the last time a collateral type accrued USDX minting rewards
func ( k Keeper ) GetPreviousUSDXMintingAccrualTime ( ctx sdk . Context , ctype string ) ( blockTime time . Time , found bool ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . PreviousUSDXMintingRewardAccrualTimeKeyPrefix )
2021-01-18 19:12:37 +00:00
bz := store . Get ( [ ] byte ( ctype ) )
if bz == nil {
2020-04-24 15:20:34 +00:00
return time . Time { } , false
}
2021-01-18 19:12:37 +00:00
k . cdc . MustUnmarshalBinaryBare ( bz , & blockTime )
2020-04-24 15:20:34 +00:00
return blockTime , true
}
2021-01-21 13:52:09 +00:00
// SetPreviousUSDXMintingAccrualTime sets the last time a collateral type accrued USDX minting rewards
func ( k Keeper ) SetPreviousUSDXMintingAccrualTime ( ctx sdk . Context , ctype string , blockTime time . Time ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . PreviousUSDXMintingRewardAccrualTimeKeyPrefix )
2021-01-18 19:12:37 +00:00
store . Set ( [ ] byte ( ctype ) , k . cdc . MustMarshalBinaryBare ( blockTime ) )
}
2021-01-21 13:52:09 +00:00
// IterateUSDXMintingAccrualTimes iterates over all previous USDX minting accrual times and preforms a callback function
func ( k Keeper ) IterateUSDXMintingAccrualTimes ( ctx sdk . Context , cb func ( string , time . Time ) ( stop bool ) ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . PreviousUSDXMintingRewardAccrualTimeKeyPrefix )
2021-01-18 19:12:37 +00:00
iterator := sdk . KVStorePrefixIterator ( store , [ ] byte { } )
defer iterator . Close ( )
for ; iterator . Valid ( ) ; iterator . Next ( ) {
var accrualTime time . Time
var collateralType string
k . cdc . MustUnmarshalBinaryBare ( iterator . Value ( ) , & collateralType )
k . cdc . MustUnmarshalBinaryBare ( iterator . Value ( ) , & accrualTime )
if cb ( collateralType , accrualTime ) {
break
}
}
}
2021-01-21 13:52:09 +00:00
// GetUSDXMintingRewardFactor returns the current reward factor for an individual collateral type
func ( k Keeper ) GetUSDXMintingRewardFactor ( ctx sdk . Context , ctype string ) ( factor sdk . Dec , found bool ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . USDXMintingRewardFactorKeyPrefix )
2021-01-18 19:12:37 +00:00
bz := store . Get ( [ ] byte ( ctype ) )
if bz == nil {
return sdk . ZeroDec ( ) , false
}
k . cdc . MustUnmarshalBinaryBare ( bz , & factor )
return factor , true
}
2021-01-21 13:52:09 +00:00
// SetUSDXMintingRewardFactor sets the current reward factor for an individual collateral type
func ( k Keeper ) SetUSDXMintingRewardFactor ( ctx sdk . Context , ctype string , factor sdk . Dec ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . USDXMintingRewardFactorKeyPrefix )
2021-01-18 19:12:37 +00:00
store . Set ( [ ] byte ( ctype ) , k . cdc . MustMarshalBinaryBare ( factor ) )
2020-04-24 15:20:34 +00:00
}
2021-01-21 13:52:09 +00:00
2021-04-02 21:34:42 +00:00
// IterateUSDXMintingRewardFactors iterates over all USDX Minting reward factor objects in the store and preforms a callback function
func ( k Keeper ) IterateUSDXMintingRewardFactors ( ctx sdk . Context , cb func ( denom string , factor sdk . Dec ) ( stop bool ) ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . USDXMintingRewardFactorKeyPrefix )
iterator := sdk . KVStorePrefixIterator ( store , [ ] byte { } )
defer iterator . Close ( )
for ; iterator . Valid ( ) ; iterator . Next ( ) {
var factor sdk . Dec
k . cdc . MustUnmarshalBinaryBare ( iterator . Value ( ) , & factor )
if cb ( string ( iterator . Key ( ) ) , factor ) {
break
}
}
}
2021-01-21 13:52:09 +00:00
// GetHardLiquidityProviderClaim returns the claim in the store corresponding the the input address collateral type and id and a boolean for if the claim was found
func ( k Keeper ) GetHardLiquidityProviderClaim ( ctx sdk . Context , addr sdk . AccAddress ) ( types . HardLiquidityProviderClaim , bool ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . HardLiquidityClaimKeyPrefix )
bz := store . Get ( addr )
if bz == nil {
return types . HardLiquidityProviderClaim { } , false
}
var c types . HardLiquidityProviderClaim
k . cdc . MustUnmarshalBinaryBare ( bz , & c )
return c , true
}
// SetHardLiquidityProviderClaim sets the claim in the store corresponding to the input address, collateral type, and id
func ( k Keeper ) SetHardLiquidityProviderClaim ( ctx sdk . Context , c types . HardLiquidityProviderClaim ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . HardLiquidityClaimKeyPrefix )
bz := k . cdc . MustMarshalBinaryBare ( c )
store . Set ( c . Owner , bz )
}
// DeleteHardLiquidityProviderClaim deletes the claim in the store corresponding to the input address, collateral type, and id
func ( k Keeper ) DeleteHardLiquidityProviderClaim ( ctx sdk . Context , owner sdk . AccAddress ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . HardLiquidityClaimKeyPrefix )
store . Delete ( owner )
}
// IterateHardLiquidityProviderClaims iterates over all claim objects in the store and preforms a callback function
func ( k Keeper ) IterateHardLiquidityProviderClaims ( ctx sdk . Context , cb func ( c types . HardLiquidityProviderClaim ) ( stop bool ) ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . HardLiquidityClaimKeyPrefix )
iterator := sdk . KVStorePrefixIterator ( store , [ ] byte { } )
defer iterator . Close ( )
for ; iterator . Valid ( ) ; iterator . Next ( ) {
var c types . HardLiquidityProviderClaim
k . cdc . MustUnmarshalBinaryBare ( iterator . Value ( ) , & c )
if cb ( c ) {
break
}
}
}
// GetAllHardLiquidityProviderClaims returns all Claim objects in the store
func ( k Keeper ) GetAllHardLiquidityProviderClaims ( ctx sdk . Context ) types . HardLiquidityProviderClaims {
cs := types . HardLiquidityProviderClaims { }
k . IterateHardLiquidityProviderClaims ( ctx , func ( c types . HardLiquidityProviderClaim ) ( stop bool ) {
cs = append ( cs , c )
return false
} )
return cs
}
2021-02-02 16:17:46 +00:00
// 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 )
bz := k . cdc . MustMarshalBinaryBare ( indexes )
2021-01-21 13:52:09 +00:00
store . Set ( [ ] byte ( denom ) , bz )
}
2021-02-02 16:17:46 +00:00
// GetHardSupplyRewardIndexes gets the current reward indexes for an individual denom
func ( k Keeper ) GetHardSupplyRewardIndexes ( ctx sdk . Context , denom string ) ( types . RewardIndexes , bool ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . HardSupplyRewardIndexesKeyPrefix )
2021-01-21 13:52:09 +00:00
bz := store . Get ( [ ] byte ( denom ) )
if bz == nil {
2021-02-02 16:17:46 +00:00
return types . RewardIndexes { } , false
2021-01-21 13:52:09 +00:00
}
2021-02-02 16:17:46 +00:00
var rewardIndexes types . RewardIndexes
k . cdc . MustUnmarshalBinaryBare ( bz , & rewardIndexes )
return rewardIndexes , true
2021-01-21 13:52:09 +00:00
}
2021-04-02 21:34:42 +00:00
// IterateHardSupplyRewardIndexes iterates over all Hard supply reward index objects in the store and preforms a callback function
func ( k Keeper ) IterateHardSupplyRewardIndexes ( ctx sdk . Context , cb func ( denom string , indexes types . RewardIndexes ) ( stop bool ) ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . HardSupplyRewardIndexesKeyPrefix )
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
}
}
}
2021-02-02 16:17:46 +00:00
// SetHardBorrowRewardIndexes sets the current reward indexes for an individual denom
func ( k Keeper ) SetHardBorrowRewardIndexes ( ctx sdk . Context , denom string , indexes types . RewardIndexes ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . HardBorrowRewardIndexesKeyPrefix )
bz := k . cdc . MustMarshalBinaryBare ( indexes )
2021-01-21 13:52:09 +00:00
store . Set ( [ ] byte ( denom ) , bz )
}
2021-02-02 16:17:46 +00:00
// GetHardBorrowRewardIndexes gets the current reward indexes for an individual denom
func ( k Keeper ) GetHardBorrowRewardIndexes ( ctx sdk . Context , denom string ) ( types . RewardIndexes , bool ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . HardBorrowRewardIndexesKeyPrefix )
2021-01-21 13:52:09 +00:00
bz := store . Get ( [ ] byte ( denom ) )
if bz == nil {
2021-02-02 16:17:46 +00:00
return types . RewardIndexes { } , false
2021-01-21 13:52:09 +00:00
}
2021-02-02 16:17:46 +00:00
var rewardIndexes types . RewardIndexes
k . cdc . MustUnmarshalBinaryBare ( bz , & rewardIndexes )
return rewardIndexes , true
2021-01-21 13:52:09 +00:00
}
2021-04-02 21:34:42 +00:00
// IterateHardBorrowRewardIndexes iterates over all Hard borrow reward index objects in the store and preforms a callback function
func ( k Keeper ) IterateHardBorrowRewardIndexes ( ctx sdk . Context , cb func ( denom string , indexes types . RewardIndexes ) ( stop bool ) ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . HardBorrowRewardIndexesKeyPrefix )
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
}
}
}
2021-07-05 22:01:25 +00:00
// GetHardDelegatorRewardIndexes gets the current reward indexes for an individual denom
func ( k Keeper ) GetHardDelegatorRewardIndexes ( ctx sdk . Context , denom string ) ( types . RewardIndexes , bool ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . HardDelegatorRewardIndexesKeyPrefix )
bz := store . Get ( [ ] byte ( denom ) )
2021-01-21 13:52:09 +00:00
if bz == nil {
2021-07-05 22:01:25 +00:00
return types . RewardIndexes { } , false
2021-01-21 13:52:09 +00:00
}
2021-07-05 22:01:25 +00:00
var rewardIndexes types . RewardIndexes
k . cdc . MustUnmarshalBinaryBare ( bz , & rewardIndexes )
return rewardIndexes , true
2021-01-21 13:52:09 +00:00
}
2021-07-05 22:01:25 +00:00
// SetHardDelegatorRewardIndexes sets the current reward indexes for an individual denom
func ( k Keeper ) SetHardDelegatorRewardIndexes ( ctx sdk . Context , denom string , indexes types . RewardIndexes ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . HardDelegatorRewardIndexesKeyPrefix )
bz := k . cdc . MustMarshalBinaryBare ( indexes )
store . Set ( [ ] byte ( denom ) , bz )
2021-01-21 13:52:09 +00:00
}
2021-07-05 22:01:25 +00:00
// IterateHardDelegatorRewardIndexes iterates over all Delegator reward index objects in the store and preforms a callback function
func ( k Keeper ) IterateHardDelegatorRewardIndexes ( ctx sdk . Context , cb func ( denom string , indexes types . RewardIndexes ) ( stop bool ) ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . HardDelegatorRewardIndexesKeyPrefix )
2021-04-02 21:34:42 +00:00
iterator := sdk . KVStorePrefixIterator ( store , [ ] byte { } )
defer iterator . Close ( )
for ; iterator . Valid ( ) ; iterator . Next ( ) {
2021-07-05 22:01:25 +00:00
var indexes types . RewardIndexes
k . cdc . MustUnmarshalBinaryBare ( iterator . Value ( ) , & indexes )
if cb ( string ( iterator . Key ( ) ) , indexes ) {
2021-04-02 21:34:42 +00:00
break
}
}
}
2021-01-21 13:52:09 +00:00
// GetPreviousHardSupplyRewardAccrualTime returns the last time a denom accrued Hard protocol supply-side rewards
func ( k Keeper ) GetPreviousHardSupplyRewardAccrualTime ( ctx sdk . Context , denom string ) ( blockTime time . Time , found bool ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . PreviousHardSupplyRewardAccrualTimeKeyPrefix )
bz := store . Get ( [ ] byte ( denom ) )
if bz == nil {
return time . Time { } , false
}
k . cdc . MustUnmarshalBinaryBare ( bz , & blockTime )
return blockTime , true
}
// SetPreviousHardSupplyRewardAccrualTime sets the last time a denom accrued Hard protocol supply-side rewards
func ( k Keeper ) SetPreviousHardSupplyRewardAccrualTime ( ctx sdk . Context , denom string , blockTime time . Time ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . PreviousHardSupplyRewardAccrualTimeKeyPrefix )
store . Set ( [ ] byte ( denom ) , k . cdc . MustMarshalBinaryBare ( blockTime ) )
}
// GetPreviousHardBorrowRewardAccrualTime returns the last time a denom accrued Hard protocol borrow-side rewards
func ( k Keeper ) GetPreviousHardBorrowRewardAccrualTime ( ctx sdk . Context , denom string ) ( blockTime time . Time , found bool ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . PreviousHardBorrowRewardAccrualTimeKeyPrefix )
bz := store . Get ( [ ] byte ( denom ) )
if bz == nil {
return time . Time { } , false
}
k . cdc . MustUnmarshalBinaryBare ( bz , & blockTime )
return blockTime , true
}
// SetPreviousHardBorrowRewardAccrualTime sets the last time a denom accrued Hard protocol borrow-side rewards
func ( k Keeper ) SetPreviousHardBorrowRewardAccrualTime ( ctx sdk . Context , denom string , blockTime time . Time ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . PreviousHardBorrowRewardAccrualTimeKeyPrefix )
store . Set ( [ ] byte ( denom ) , k . cdc . MustMarshalBinaryBare ( blockTime ) )
}
2021-01-25 12:58:12 +00:00
// GetPreviousHardDelegatorRewardAccrualTime returns the last time a denom accrued Hard protocol delegator rewards
func ( k Keeper ) GetPreviousHardDelegatorRewardAccrualTime ( ctx sdk . Context , denom string ) ( blockTime time . Time , found bool ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . PreviousHardDelegatorRewardAccrualTimeKeyPrefix )
bz := store . Get ( [ ] byte ( denom ) )
if bz == nil {
return time . Time { } , false
}
k . cdc . MustUnmarshalBinaryBare ( bz , & blockTime )
return blockTime , true
}
// SetPreviousHardDelegatorRewardAccrualTime sets the last time a denom accrued Hard protocol delegator rewards
func ( k Keeper ) SetPreviousHardDelegatorRewardAccrualTime ( ctx sdk . Context , denom string , blockTime time . Time ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . PreviousHardDelegatorRewardAccrualTimeKeyPrefix )
store . Set ( [ ] byte ( denom ) , k . cdc . MustMarshalBinaryBare ( blockTime ) )
}