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 {
2022-01-08 00:39:27 +00:00
cdc codec . Codec
2020-04-24 15:20:34 +00:00
key sdk . StoreKey
2021-06-21 21:05:17 +00:00
paramSubspace types . ParamSubspace
2022-01-08 00:39:27 +00:00
accountKeeper types . AccountKeeper
bankKeeper types . BankKeeper
2021-07-07 13:23:06 +00:00
cdpKeeper types . CdpKeeper
hardKeeper types . HardKeeper
2021-01-25 12:58:12 +00:00
stakingKeeper types . StakingKeeper
2021-07-07 13:23:06 +00:00
swapKeeper types . SwapKeeper
2022-04-20 11:08:57 +00:00
savingsKeeper types . SavingsKeeper
2020-04-24 15:20:34 +00:00
}
// NewKeeper creates a new keeper
func NewKeeper (
2022-01-08 00:39:27 +00:00
cdc codec . Codec , key sdk . StoreKey , paramstore types . ParamSubspace , bk types . BankKeeper ,
2021-01-25 12:58:12 +00:00
cdpk types . CdpKeeper , hk types . HardKeeper , ak types . AccountKeeper , stk types . StakingKeeper ,
2022-04-20 11:08:57 +00:00
swpk types . SwapKeeper , svk types . SavingsKeeper ,
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 ,
key : key ,
2021-06-21 21:05:17 +00:00
paramSubspace : paramstore ,
2022-01-08 00:39:27 +00:00
bankKeeper : bk ,
2021-07-07 13:23:06 +00:00
cdpKeeper : cdpk ,
hardKeeper : hk ,
2021-01-25 12:58:12 +00:00
stakingKeeper : stk ,
2021-07-07 13:23:06 +00:00
swapKeeper : swpk ,
2022-04-20 11:08:57 +00:00
savingsKeeper : svk ,
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
2022-01-08 00:39:27 +00:00
k . cdc . MustUnmarshal ( bz , & c )
2020-04-24 15:20:34 +00:00
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 )
2022-01-08 00:39:27 +00:00
bz := k . cdc . MustMarshal ( & 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
2022-01-08 00:39:27 +00:00
k . cdc . MustUnmarshal ( iterator . Value ( ) , & c )
2020-04-24 15:20:34 +00:00
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 )
2022-01-08 00:39:27 +00:00
b := store . Get ( [ ] byte ( ctype ) )
if b == nil {
2020-04-24 15:20:34 +00:00
return time . Time { } , false
}
2022-01-08 00:39:27 +00:00
if err := blockTime . UnmarshalBinary ( b ) ; err != nil {
panic ( err )
}
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 )
2022-01-08 00:39:27 +00:00
bz , err := blockTime . MarshalBinary ( )
if err != nil {
panic ( err )
}
store . Set ( [ ] byte ( ctype ) , bz )
2021-01-18 19:12:37 +00:00
}
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
2022-01-08 00:39:27 +00:00
if err := accrualTime . UnmarshalBinary ( iterator . Value ( ) ) ; err != nil {
panic ( err )
}
denom := string ( iterator . Key ( ) )
2021-07-15 14:41:55 +00:00
if cb ( denom , accrualTime ) {
2021-01-18 19:12:37 +00:00
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
}
2022-01-08 00:39:27 +00:00
if err := factor . Unmarshal ( bz ) ; err != nil {
panic ( err )
}
2021-01-18 19:12:37 +00:00
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 )
2022-01-08 00:39:27 +00:00
bz , err := factor . Marshal ( )
if err != nil {
panic ( err )
}
store . Set ( [ ] byte ( ctype ) , bz )
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
2022-01-08 00:39:27 +00:00
if err := factor . Unmarshal ( iterator . Value ( ) ) ; err != nil {
panic ( err )
}
2021-04-02 21:34:42 +00:00
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
2022-01-08 00:39:27 +00:00
k . cdc . MustUnmarshal ( bz , & c )
2021-01-21 13:52:09 +00:00
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 )
2022-01-08 00:39:27 +00:00
bz := k . cdc . MustMarshal ( & c )
2021-01-21 13:52:09 +00:00
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
2022-01-08 00:39:27 +00:00
k . cdc . MustUnmarshal ( iterator . Value ( ) , & c )
2021-01-21 13:52:09 +00:00
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-07-07 16:50:14 +00:00
// GetDelegatorClaim returns the claim in the store corresponding the the input address collateral type and id and a boolean for if the claim was found
func ( k Keeper ) GetDelegatorClaim ( ctx sdk . Context , addr sdk . AccAddress ) ( types . DelegatorClaim , bool ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . DelegatorClaimKeyPrefix )
bz := store . Get ( addr )
if bz == nil {
return types . DelegatorClaim { } , false
}
var c types . DelegatorClaim
2022-01-08 00:39:27 +00:00
k . cdc . MustUnmarshal ( bz , & c )
2021-07-07 16:50:14 +00:00
return c , true
}
// SetDelegatorClaim sets the claim in the store corresponding to the input address, collateral type, and id
func ( k Keeper ) SetDelegatorClaim ( ctx sdk . Context , c types . DelegatorClaim ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . DelegatorClaimKeyPrefix )
2022-01-08 00:39:27 +00:00
bz := k . cdc . MustMarshal ( & c )
2021-07-07 16:50:14 +00:00
store . Set ( c . Owner , bz )
}
// DeleteDelegatorClaim deletes the claim in the store corresponding to the input address, collateral type, and id
func ( k Keeper ) DeleteDelegatorClaim ( ctx sdk . Context , owner sdk . AccAddress ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . DelegatorClaimKeyPrefix )
store . Delete ( owner )
}
// IterateDelegatorClaims iterates over all claim objects in the store and preforms a callback function
func ( k Keeper ) IterateDelegatorClaims ( ctx sdk . Context , cb func ( c types . DelegatorClaim ) ( stop bool ) ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . DelegatorClaimKeyPrefix )
iterator := sdk . KVStorePrefixIterator ( store , [ ] byte { } )
defer iterator . Close ( )
for ; iterator . Valid ( ) ; iterator . Next ( ) {
var c types . DelegatorClaim
2022-01-08 00:39:27 +00:00
k . cdc . MustUnmarshal ( iterator . Value ( ) , & c )
2021-07-07 16:50:14 +00:00
if cb ( c ) {
break
}
}
}
// GetAllDelegatorClaims returns all DelegatorClaim objects in the store
func ( k Keeper ) GetAllDelegatorClaims ( ctx sdk . Context ) types . DelegatorClaims {
cs := types . DelegatorClaims { }
k . IterateDelegatorClaims ( ctx , func ( c types . DelegatorClaim ) ( stop bool ) {
cs = append ( cs , c )
return false
} )
return cs
}
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>
2021-07-13 12:35:02 +00:00
// 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
2022-01-08 00:39:27 +00:00
k . cdc . MustUnmarshal ( bz , & c )
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>
2021-07-13 12:35:02 +00:00
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 )
2022-01-08 00:39:27 +00:00
bz := k . cdc . MustMarshal ( & c )
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>
2021-07-13 12:35:02 +00:00
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
2022-01-08 00:39:27 +00:00
k . cdc . MustUnmarshal ( iterator . Value ( ) , & c )
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>
2021-07-13 12:35:02 +00:00
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
}
2022-04-01 14:17:03 +00:00
// GetSavingsClaim returns the claim in the store corresponding the the input address.
func ( k Keeper ) GetSavingsClaim ( ctx sdk . Context , addr sdk . AccAddress ) ( types . SavingsClaim , bool ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . SavingsClaimKeyPrefix )
bz := store . Get ( addr )
if bz == nil {
return types . SavingsClaim { } , false
}
var c types . SavingsClaim
k . cdc . MustUnmarshal ( bz , & c )
return c , true
}
// SetSavingsClaim sets the claim in the store corresponding to the input address.
func ( k Keeper ) SetSavingsClaim ( ctx sdk . Context , c types . SavingsClaim ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . SavingsClaimKeyPrefix )
bz := k . cdc . MustMarshal ( & c )
store . Set ( c . Owner , bz )
}
// DeleteSavingsClaim deletes the claim in the store corresponding to the input address.
func ( k Keeper ) DeleteSavingsClaim ( ctx sdk . Context , owner sdk . AccAddress ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . SavingsClaimKeyPrefix )
store . Delete ( owner )
}
// IterateSavingsClaims iterates over all savings claim objects in the store and preforms a callback function
func ( k Keeper ) IterateSavingsClaims ( ctx sdk . Context , cb func ( c types . SavingsClaim ) ( stop bool ) ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . SavingsClaimKeyPrefix )
iterator := sdk . KVStorePrefixIterator ( store , [ ] byte { } )
defer iterator . Close ( )
for ; iterator . Valid ( ) ; iterator . Next ( ) {
var c types . SavingsClaim
k . cdc . MustUnmarshal ( iterator . Value ( ) , & c )
if cb ( c ) {
break
}
}
}
// GetAllSavingsClaims returns all savings claim objects in the store
func ( k Keeper ) GetAllSavingsClaims ( ctx sdk . Context ) types . SavingsClaims {
cs := types . SavingsClaims { }
k . IterateSavingsClaims ( ctx , func ( c types . SavingsClaim ) ( 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 )
2022-01-08 00:39:27 +00:00
bz := k . cdc . MustMarshal ( & types . RewardIndexesProto {
RewardIndexes : 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 {
2022-01-08 00:39:27 +00:00
return types . RewardIndexes { } , false
2021-01-21 13:52:09 +00:00
}
2022-01-08 00:39:27 +00:00
var proto types . RewardIndexesProto
k . cdc . MustUnmarshal ( bz , & proto )
return proto . 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 ( ) {
2022-01-08 00:39:27 +00:00
var proto types . RewardIndexesProto
k . cdc . MustUnmarshal ( iterator . Value ( ) , & proto )
if cb ( string ( iterator . Key ( ) ) , proto . RewardIndexes ) {
2021-04-02 21:34:42 +00:00
break
}
}
}
2021-07-15 14:41:55 +00:00
func ( k Keeper ) IterateHardSupplyRewardAccrualTimes ( ctx sdk . Context , cb func ( string , time . Time ) ( stop bool ) ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . PreviousHardSupplyRewardAccrualTimeKeyPrefix )
iterator := sdk . KVStorePrefixIterator ( store , [ ] byte { } )
defer iterator . Close ( )
for ; iterator . Valid ( ) ; iterator . Next ( ) {
var accrualTime time . Time
2022-01-08 00:39:27 +00:00
if err := accrualTime . UnmarshalBinary ( iterator . Value ( ) ) ; err != nil {
panic ( err )
}
denom := string ( iterator . Key ( ) )
2021-07-15 14:41:55 +00:00
if cb ( denom , accrualTime ) {
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 )
2022-01-08 00:39:27 +00:00
bz := k . cdc . MustMarshal ( & types . RewardIndexesProto {
RewardIndexes : 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 {
2022-01-08 00:39:27 +00:00
return types . RewardIndexes { } , false
2021-01-21 13:52:09 +00:00
}
2022-01-08 00:39:27 +00:00
var proto types . RewardIndexesProto
k . cdc . MustUnmarshal ( bz , & proto )
return proto . 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 ( ) {
2022-01-08 00:39:27 +00:00
var proto types . RewardIndexesProto
k . cdc . MustUnmarshal ( iterator . Value ( ) , & proto )
if cb ( string ( iterator . Key ( ) ) , proto . RewardIndexes ) {
2021-04-02 21:34:42 +00:00
break
}
}
}
2021-07-15 14:41:55 +00:00
func ( k Keeper ) IterateHardBorrowRewardAccrualTimes ( ctx sdk . Context , cb func ( string , time . Time ) ( stop bool ) ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . PreviousHardBorrowRewardAccrualTimeKeyPrefix )
iterator := sdk . KVStorePrefixIterator ( store , [ ] byte { } )
defer iterator . Close ( )
for ; iterator . Valid ( ) ; iterator . Next ( ) {
denom := string ( iterator . Key ( ) )
var accrualTime time . Time
2022-01-08 00:39:27 +00:00
if err := accrualTime . UnmarshalBinary ( iterator . Value ( ) ) ; err != nil {
panic ( err )
}
2021-07-15 14:41:55 +00:00
if cb ( denom , accrualTime ) {
break
}
}
}
2021-07-07 16:50:14 +00:00
// GetDelegatorRewardIndexes gets the current reward indexes for an individual denom
func ( k Keeper ) GetDelegatorRewardIndexes ( ctx sdk . Context , denom string ) ( types . RewardIndexes , bool ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . DelegatorRewardIndexesKeyPrefix )
2021-07-05 22:01:25 +00:00
bz := store . Get ( [ ] byte ( denom ) )
2021-01-21 13:52:09 +00:00
if bz == nil {
2022-01-08 00:39:27 +00:00
return types . RewardIndexes { } , false
2021-01-21 13:52:09 +00:00
}
2022-01-08 00:39:27 +00:00
var proto types . RewardIndexesProto
k . cdc . MustUnmarshal ( bz , & proto )
return proto . RewardIndexes , true
2021-01-21 13:52:09 +00:00
}
2021-07-07 16:50:14 +00:00
// SetDelegatorRewardIndexes sets the current reward indexes for an individual denom
func ( k Keeper ) SetDelegatorRewardIndexes ( ctx sdk . Context , denom string , indexes types . RewardIndexes ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . DelegatorRewardIndexesKeyPrefix )
2022-01-08 00:39:27 +00:00
bz := k . cdc . MustMarshal ( & types . RewardIndexesProto {
RewardIndexes : indexes ,
} )
2021-07-05 22:01:25 +00:00
store . Set ( [ ] byte ( denom ) , bz )
2021-01-21 13:52:09 +00:00
}
2021-07-07 16:50:14 +00:00
// IterateDelegatorRewardIndexes iterates over all delegator reward index objects in the store and preforms a callback function
func ( k Keeper ) IterateDelegatorRewardIndexes ( ctx sdk . Context , cb func ( denom string , indexes types . RewardIndexes ) ( stop bool ) ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . DelegatorRewardIndexesKeyPrefix )
2021-04-02 21:34:42 +00:00
iterator := sdk . KVStorePrefixIterator ( store , [ ] byte { } )
defer iterator . Close ( )
for ; iterator . Valid ( ) ; iterator . Next ( ) {
2022-01-08 00:39:27 +00:00
var proto types . RewardIndexesProto
k . cdc . MustUnmarshal ( iterator . Value ( ) , & proto )
if cb ( string ( iterator . Key ( ) ) , proto . RewardIndexes ) {
2021-04-02 21:34:42 +00:00
break
}
}
}
2021-07-15 14:41:55 +00:00
func ( k Keeper ) IterateDelegatorRewardAccrualTimes ( ctx sdk . Context , cb func ( string , time . Time ) ( stop bool ) ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . PreviousDelegatorRewardAccrualTimeKeyPrefix )
iterator := sdk . KVStorePrefixIterator ( store , [ ] byte { } )
defer iterator . Close ( )
for ; iterator . Valid ( ) ; iterator . Next ( ) {
denom := string ( iterator . Key ( ) )
var accrualTime time . Time
2022-01-08 00:39:27 +00:00
if err := accrualTime . UnmarshalBinary ( iterator . Value ( ) ) ; err != nil {
panic ( err )
}
2021-07-15 14:41:55 +00:00
if cb ( denom , accrualTime ) {
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
}
2022-01-08 00:39:27 +00:00
if err := blockTime . UnmarshalBinary ( bz ) ; err != nil {
panic ( err )
}
2021-01-21 13:52:09 +00:00
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 )
2022-01-08 00:39:27 +00:00
bz , err := blockTime . MarshalBinary ( )
if err != nil {
panic ( err )
}
store . Set ( [ ] byte ( denom ) , bz )
2021-01-21 13:52:09 +00:00
}
// 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 )
2022-01-08 00:39:27 +00:00
b := store . Get ( [ ] byte ( denom ) )
if b == nil {
2021-01-21 13:52:09 +00:00
return time . Time { } , false
}
2022-01-08 00:39:27 +00:00
if err := blockTime . UnmarshalBinary ( b ) ; err != nil {
panic ( err )
}
2021-01-21 13:52:09 +00:00
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 )
2022-01-08 00:39:27 +00:00
bz , err := blockTime . MarshalBinary ( )
if err != nil {
panic ( err )
}
store . Set ( [ ] byte ( denom ) , bz )
2021-01-21 13:52:09 +00:00
}
2021-01-25 12:58:12 +00:00
2021-07-07 16:50:14 +00:00
// GetPreviousDelegatorRewardAccrualTime returns the last time a denom accrued protocol delegator rewards
func ( k Keeper ) GetPreviousDelegatorRewardAccrualTime ( ctx sdk . Context , denom string ) ( blockTime time . Time , found bool ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . PreviousDelegatorRewardAccrualTimeKeyPrefix )
2021-01-25 12:58:12 +00:00
bz := store . Get ( [ ] byte ( denom ) )
if bz == nil {
return time . Time { } , false
}
2022-01-08 00:39:27 +00:00
if err := blockTime . UnmarshalBinary ( bz ) ; err != nil {
panic ( err )
}
2021-01-25 12:58:12 +00:00
return blockTime , true
}
2021-07-07 16:50:14 +00:00
// SetPreviousDelegatorRewardAccrualTime sets the last time a denom accrued protocol delegator rewards
func ( k Keeper ) SetPreviousDelegatorRewardAccrualTime ( ctx sdk . Context , denom string , blockTime time . Time ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . PreviousDelegatorRewardAccrualTimeKeyPrefix )
2022-01-08 00:39:27 +00:00
bz , err := blockTime . MarshalBinary ( )
if err != nil {
panic ( err )
}
store . Set ( [ ] byte ( denom ) , bz )
2021-01-25 12:58:12 +00:00
}
2021-07-07 13:23:06 +00:00
// SetSwapRewardIndexes stores the global reward indexes that track total rewards to a swap pool.
func ( k Keeper ) SetSwapRewardIndexes ( ctx sdk . Context , poolID string , indexes types . RewardIndexes ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . SwapRewardIndexesKeyPrefix )
2022-01-08 00:39:27 +00:00
bz := k . cdc . MustMarshal ( & types . RewardIndexesProto {
RewardIndexes : indexes ,
} )
2021-07-07 13:23:06 +00:00
store . Set ( [ ] byte ( poolID ) , bz )
}
// GetSwapRewardIndexes fetches the global reward indexes that track total rewards to a swap pool.
func ( k Keeper ) GetSwapRewardIndexes ( ctx sdk . Context , poolID string ) ( types . RewardIndexes , bool ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . SwapRewardIndexesKeyPrefix )
bz := store . Get ( [ ] byte ( poolID ) )
if bz == nil {
2022-01-08 00:39:27 +00:00
return types . RewardIndexes { } , false
2021-07-07 13:23:06 +00:00
}
2022-01-08 00:39:27 +00:00
var proto types . RewardIndexesProto
k . cdc . MustUnmarshal ( bz , & proto )
return proto . RewardIndexes , true
2021-07-07 13:23:06 +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>
2021-07-13 12:35:02 +00:00
// 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 ( ) {
2022-01-08 00:39:27 +00:00
var proto types . RewardIndexesProto
k . cdc . MustUnmarshal ( iterator . Value ( ) , & proto )
if cb ( string ( iterator . Key ( ) ) , proto . RewardIndexes ) {
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>
2021-07-13 12:35:02 +00:00
break
}
}
}
2021-07-07 13:23:06 +00:00
// 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 )
2022-01-08 00:39:27 +00:00
b := store . Get ( [ ] byte ( poolID ) )
if b == nil {
2021-07-07 13:23:06 +00:00
return time . Time { } , false
}
2022-01-08 00:39:27 +00:00
if err := blockTime . UnmarshalBinary ( b ) ; err != nil {
panic ( err )
}
2021-07-07 13:23:06 +00:00
return blockTime , true
}
// SetSwapRewardAccrualTime stores the last time rewards were accrued for a swap pool.
func ( k Keeper ) SetSwapRewardAccrualTime ( ctx sdk . Context , poolID string , blockTime time . Time ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . PreviousSwapRewardAccrualTimeKeyPrefix )
2022-01-08 00:39:27 +00:00
bz , err := blockTime . MarshalBinary ( )
if err != nil {
panic ( err )
}
store . Set ( [ ] byte ( poolID ) , bz )
2021-07-07 13:23:06 +00:00
}
2021-07-15 14:41:55 +00:00
func ( k Keeper ) IterateSwapRewardAccrualTimes ( ctx sdk . Context , cb func ( string , time . Time ) ( stop bool ) ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . PreviousSwapRewardAccrualTimeKeyPrefix )
iterator := sdk . KVStorePrefixIterator ( store , [ ] byte { } )
defer iterator . Close ( )
for ; iterator . Valid ( ) ; iterator . Next ( ) {
poolID := string ( iterator . Key ( ) )
var accrualTime time . Time
2022-01-08 00:39:27 +00:00
if err := accrualTime . UnmarshalBinary ( iterator . Value ( ) ) ; err != nil {
panic ( err )
}
2021-07-15 14:41:55 +00:00
if cb ( poolID , accrualTime ) {
break
}
}
}
2022-04-01 14:17:03 +00:00
// SetSavingsRewardIndexes stores the global reward indexes that rewards for an individual denom type
func ( k Keeper ) SetSavingsRewardIndexes ( ctx sdk . Context , denom string , indexes types . RewardIndexes ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . SavingsRewardIndexesKeyPrefix )
bz := k . cdc . MustMarshal ( & types . RewardIndexesProto {
RewardIndexes : indexes ,
} )
store . Set ( [ ] byte ( denom ) , bz )
}
// GetSavingsRewardIndexes fetches the global reward indexes that track rewards for an individual denom type
func ( k Keeper ) GetSavingsRewardIndexes ( ctx sdk . Context , denom string ) ( types . RewardIndexes , bool ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . SavingsRewardIndexesKeyPrefix )
bz := store . Get ( [ ] byte ( denom ) )
if bz == nil {
return types . RewardIndexes { } , false
}
var proto types . RewardIndexesProto
k . cdc . MustUnmarshal ( bz , & proto )
return proto . RewardIndexes , true
}
// IterateSavingsRewardIndexes iterates over all savings reward index objects in the store and preforms a callback function
func ( k Keeper ) IterateSavingsRewardIndexes ( ctx sdk . Context , cb func ( poolID string , indexes types . RewardIndexes ) ( stop bool ) ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . SavingsRewardIndexesKeyPrefix )
iterator := sdk . KVStorePrefixIterator ( store , [ ] byte { } )
defer iterator . Close ( )
for ; iterator . Valid ( ) ; iterator . Next ( ) {
var proto types . RewardIndexesProto
k . cdc . MustUnmarshal ( iterator . Value ( ) , & proto )
if cb ( string ( iterator . Key ( ) ) , proto . RewardIndexes ) {
break
}
}
}
// GetSavingsRewardAccrualTime fetches the last time rewards were accrued for an individual denom type
func ( k Keeper ) GetSavingsRewardAccrualTime ( ctx sdk . Context , poolID string ) ( blockTime time . Time , found bool ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . PreviousSavingsRewardAccrualTimeKeyPrefix )
b := store . Get ( [ ] byte ( poolID ) )
if b == nil {
return time . Time { } , false
}
if err := blockTime . UnmarshalBinary ( b ) ; err != nil {
panic ( err )
}
return blockTime , true
}
// SetSavingsRewardAccrualTime stores the last time rewards were accrued for a savings deposit denom type
func ( k Keeper ) SetSavingsRewardAccrualTime ( ctx sdk . Context , poolID string , blockTime time . Time ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . PreviousSavingsRewardAccrualTimeKeyPrefix )
bz , err := blockTime . MarshalBinary ( )
if err != nil {
panic ( err )
}
store . Set ( [ ] byte ( poolID ) , bz )
}
// IterateSavingsRewardAccrualTimesiterates over all the previous savings reward accrual times in the store
func ( k Keeper ) IterateSavingsRewardAccrualTimes ( ctx sdk . Context , cb func ( string , time . Time ) ( stop bool ) ) {
store := prefix . NewStore ( ctx . KVStore ( k . key ) , types . PreviousSavingsRewardAccrualTimeKeyPrefix )
iterator := sdk . KVStorePrefixIterator ( store , [ ] byte { } )
defer iterator . Close ( )
for ; iterator . Valid ( ) ; iterator . Next ( ) {
poolID := string ( iterator . Key ( ) )
var accrualTime time . Time
if err := accrualTime . UnmarshalBinary ( iterator . Value ( ) ) ; err != nil {
panic ( err )
}
if cb ( poolID , accrualTime ) {
break
}
}
}