mirror of
https://github.com/0glabs/0g-chain.git
synced 2024-12-24 23:35:19 +00:00
Update hard genesis state (#777)
* feat: update hard genesis state and init/export methods * address review comments
This commit is contained in:
parent
f89b8797ed
commit
dc330d02bf
132
x/hard/alias.go
132
x/hard/alias.go
@ -9,86 +9,172 @@ import (
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
AttributeKeyBlockHeight = types.AttributeKeyBlockHeight
|
AttributeKeyBlockHeight = types.AttributeKeyBlockHeight
|
||||||
|
AttributeKeyBorrow = types.AttributeKeyBorrow
|
||||||
|
AttributeKeyBorrowCoins = types.AttributeKeyBorrowCoins
|
||||||
|
AttributeKeyBorrower = types.AttributeKeyBorrower
|
||||||
AttributeKeyDeposit = types.AttributeKeyDeposit
|
AttributeKeyDeposit = types.AttributeKeyDeposit
|
||||||
|
AttributeKeyDepositCoins = types.AttributeKeyDepositCoins
|
||||||
AttributeKeyDepositDenom = types.AttributeKeyDepositDenom
|
AttributeKeyDepositDenom = types.AttributeKeyDepositDenom
|
||||||
AttributeKeyDepositor = types.AttributeKeyDepositor
|
AttributeKeyDepositor = types.AttributeKeyDepositor
|
||||||
|
AttributeKeyRepayCoins = types.AttributeKeyRepayCoins
|
||||||
AttributeKeyRewardsDistribution = types.AttributeKeyRewardsDistribution
|
AttributeKeyRewardsDistribution = types.AttributeKeyRewardsDistribution
|
||||||
|
AttributeKeySender = types.AttributeKeySender
|
||||||
AttributeValueCategory = types.AttributeValueCategory
|
AttributeValueCategory = types.AttributeValueCategory
|
||||||
DefaultParamspace = types.DefaultParamspace
|
DefaultParamspace = types.DefaultParamspace
|
||||||
DelegatorAccount = types.DelegatorAccount
|
DelegatorAccount = types.DelegatorAccount
|
||||||
EventTypeDeleteHardDeposit = types.EventTypeDeleteHardDeposit
|
EventTypeDeleteHardDeposit = types.EventTypeDeleteHardDeposit
|
||||||
|
EventTypeDepositLiquidation = types.EventTypeDepositLiquidation
|
||||||
|
EventTypeHardBorrow = types.EventTypeHardBorrow
|
||||||
EventTypeHardDelegatorDistribution = types.EventTypeHardDelegatorDistribution
|
EventTypeHardDelegatorDistribution = types.EventTypeHardDelegatorDistribution
|
||||||
EventTypeHardDeposit = types.EventTypeHardDeposit
|
EventTypeHardDeposit = types.EventTypeHardDeposit
|
||||||
EventTypeHardLPDistribution = types.EventTypeHardLPDistribution
|
EventTypeHardLPDistribution = types.EventTypeHardLPDistribution
|
||||||
|
EventTypeHardRepay = types.EventTypeHardRepay
|
||||||
EventTypeHardWithdrawal = types.EventTypeHardWithdrawal
|
EventTypeHardWithdrawal = types.EventTypeHardWithdrawal
|
||||||
LPAccount = types.LPAccount
|
LPAccount = types.LPAccount
|
||||||
LiquidatorAccount = types.LiquidatorAccount
|
LiquidatorAccount = types.LiquidatorAccount
|
||||||
ModuleAccountName = types.ModuleAccountName
|
ModuleAccountName = types.ModuleAccountName
|
||||||
ModuleName = types.ModuleName
|
ModuleName = types.ModuleName
|
||||||
QuerierRoute = types.QuerierRoute
|
QuerierRoute = types.QuerierRoute
|
||||||
|
QueryGetBorrows = types.QueryGetBorrows
|
||||||
QueryGetDeposits = types.QueryGetDeposits
|
QueryGetDeposits = types.QueryGetDeposits
|
||||||
QueryGetModuleAccounts = types.QueryGetModuleAccounts
|
QueryGetModuleAccounts = types.QueryGetModuleAccounts
|
||||||
QueryGetParams = types.QueryGetParams
|
QueryGetParams = types.QueryGetParams
|
||||||
|
QueryGetTotalBorrowed = types.QueryGetTotalBorrowed
|
||||||
|
QueryGetTotalDeposited = types.QueryGetTotalDeposited
|
||||||
RouterKey = types.RouterKey
|
RouterKey = types.RouterKey
|
||||||
StoreKey = types.StoreKey
|
StoreKey = types.StoreKey
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// function aliases
|
// function aliases
|
||||||
|
APYToSPY = keeper.APYToSPY
|
||||||
|
CalculateBorrowInterestFactor = keeper.CalculateBorrowInterestFactor
|
||||||
|
CalculateBorrowRate = keeper.CalculateBorrowRate
|
||||||
|
CalculateSupplyInterestFactor = keeper.CalculateSupplyInterestFactor
|
||||||
|
CalculateUtilizationRatio = keeper.CalculateUtilizationRatio
|
||||||
NewKeeper = keeper.NewKeeper
|
NewKeeper = keeper.NewKeeper
|
||||||
NewQuerier = keeper.NewQuerier
|
NewQuerier = keeper.NewQuerier
|
||||||
CalculateUtilizationRatio = keeper.CalculateUtilizationRatio
|
|
||||||
CalculateBorrowRate = keeper.CalculateBorrowRate
|
|
||||||
CalculateBorrowInterestFactor = keeper.CalculateBorrowInterestFactor
|
|
||||||
CalculateSupplyInterestFactor = keeper.CalculateSupplyInterestFactor
|
|
||||||
APYToSPY = keeper.APYToSPY
|
|
||||||
DefaultGenesisState = types.DefaultGenesisState
|
DefaultGenesisState = types.DefaultGenesisState
|
||||||
DefaultParams = types.DefaultParams
|
DefaultParams = types.DefaultParams
|
||||||
DepositTypeIteratorKey = types.DepositTypeIteratorKey
|
DepositTypeIteratorKey = types.DepositTypeIteratorKey
|
||||||
|
GetBorrowByLtvKey = types.GetBorrowByLtvKey
|
||||||
GetTotalVestingPeriodLength = types.GetTotalVestingPeriodLength
|
GetTotalVestingPeriodLength = types.GetTotalVestingPeriodLength
|
||||||
|
NewBorrow = types.NewBorrow
|
||||||
|
NewBorrowInterestFactor = types.NewBorrowInterestFactor
|
||||||
NewBorrowLimit = types.NewBorrowLimit
|
NewBorrowLimit = types.NewBorrowLimit
|
||||||
NewInterestRateModel = types.NewInterestRateModel
|
|
||||||
NewDeposit = types.NewDeposit
|
NewDeposit = types.NewDeposit
|
||||||
|
NewGenesisAccumulationTime = types.NewGenesisAccumulationTime
|
||||||
NewGenesisState = types.NewGenesisState
|
NewGenesisState = types.NewGenesisState
|
||||||
|
NewInterestRateModel = types.NewInterestRateModel
|
||||||
|
NewMoneyMarket = types.NewMoneyMarket
|
||||||
|
NewMsgBorrow = types.NewMsgBorrow
|
||||||
NewMsgDeposit = types.NewMsgDeposit
|
NewMsgDeposit = types.NewMsgDeposit
|
||||||
|
NewMsgLiquidate = types.NewMsgLiquidate
|
||||||
|
NewMsgRepay = types.NewMsgRepay
|
||||||
NewMsgWithdraw = types.NewMsgWithdraw
|
NewMsgWithdraw = types.NewMsgWithdraw
|
||||||
NewMultiHARDHooks = types.NewMultiHARDHooks
|
NewMultiHARDHooks = types.NewMultiHARDHooks
|
||||||
NewParams = types.NewParams
|
NewParams = types.NewParams
|
||||||
NewPeriod = types.NewPeriod
|
NewPeriod = types.NewPeriod
|
||||||
NewMoneyMarket = types.NewMoneyMarket
|
|
||||||
NewQueryAccountParams = types.NewQueryAccountParams
|
NewQueryAccountParams = types.NewQueryAccountParams
|
||||||
|
NewQueryBorrowsParams = types.NewQueryBorrowsParams
|
||||||
|
NewQueryDepositsParams = types.NewQueryDepositsParams
|
||||||
|
NewQueryTotalBorrowedParams = types.NewQueryTotalBorrowedParams
|
||||||
|
NewQueryTotalDepositedParams = types.NewQueryTotalDepositedParams
|
||||||
|
NewSupplyInterestFactor = types.NewSupplyInterestFactor
|
||||||
|
NewValuationMap = types.NewValuationMap
|
||||||
ParamKeyTable = types.ParamKeyTable
|
ParamKeyTable = types.ParamKeyTable
|
||||||
RegisterCodec = types.RegisterCodec
|
RegisterCodec = types.RegisterCodec
|
||||||
|
|
||||||
// variable aliases
|
// variable aliases
|
||||||
|
BorrowInterestFactorPrefix = types.BorrowInterestFactorPrefix
|
||||||
|
BorrowedCoinsPrefix = types.BorrowedCoinsPrefix
|
||||||
BorrowsKeyPrefix = types.BorrowsKeyPrefix
|
BorrowsKeyPrefix = types.BorrowsKeyPrefix
|
||||||
DefaultActive = types.DefaultActive
|
DefaultAccumulationTimes = types.DefaultAccumulationTimes
|
||||||
|
DefaultBorrows = types.DefaultBorrows
|
||||||
|
DefaultCheckLtvIndexCount = types.DefaultCheckLtvIndexCount
|
||||||
|
DefaultDeposits = types.DefaultDeposits
|
||||||
|
DefaultMoneyMarkets = types.DefaultMoneyMarkets
|
||||||
DefaultPreviousBlockTime = types.DefaultPreviousBlockTime
|
DefaultPreviousBlockTime = types.DefaultPreviousBlockTime
|
||||||
|
DefaultTotalBorrowed = types.DefaultTotalBorrowed
|
||||||
|
DefaultTotalReserves = types.DefaultTotalReserves
|
||||||
|
DefaultTotalSupplied = types.DefaultTotalSupplied
|
||||||
DepositsKeyPrefix = types.DepositsKeyPrefix
|
DepositsKeyPrefix = types.DepositsKeyPrefix
|
||||||
ErrAccountNotFound = types.ErrAccountNotFound
|
ErrAccountNotFound = types.ErrAccountNotFound
|
||||||
|
ErrBorrowEmptyCoins = types.ErrBorrowEmptyCoins
|
||||||
|
ErrBorrowExceedsAvailableBalance = types.ErrBorrowExceedsAvailableBalance
|
||||||
|
ErrBorrowNotFound = types.ErrBorrowNotFound
|
||||||
|
ErrBorrowNotLiquidatable = types.ErrBorrowNotLiquidatable
|
||||||
|
ErrBorrowedCoinsNotFound = types.ErrBorrowedCoinsNotFound
|
||||||
ErrDepositNotFound = types.ErrDepositNotFound
|
ErrDepositNotFound = types.ErrDepositNotFound
|
||||||
|
ErrDepositsNotFound = types.ErrDepositsNotFound
|
||||||
|
ErrGreaterThanAssetBorrowLimit = types.ErrGreaterThanAssetBorrowLimit
|
||||||
|
ErrInsufficientBalanceForBorrow = types.ErrInsufficientBalanceForBorrow
|
||||||
|
ErrInsufficientBalanceForRepay = types.ErrInsufficientBalanceForRepay
|
||||||
|
ErrInsufficientCoins = types.ErrInsufficientCoins
|
||||||
|
ErrInsufficientLoanToValue = types.ErrInsufficientLoanToValue
|
||||||
ErrInsufficientModAccountBalance = types.ErrInsufficientModAccountBalance
|
ErrInsufficientModAccountBalance = types.ErrInsufficientModAccountBalance
|
||||||
ErrInvaliWithdrawAmount = types.ErrInvalidWithdrawAmount
|
|
||||||
ErrInvalidAccountType = types.ErrInvalidAccountType
|
ErrInvalidAccountType = types.ErrInvalidAccountType
|
||||||
ErrInvalidDepositDenom = types.ErrInvalidDepositDenom
|
ErrInvalidDepositDenom = types.ErrInvalidDepositDenom
|
||||||
|
ErrInvalidReceiver = types.ErrInvalidReceiver
|
||||||
|
ErrInvalidRepaymentDenom = types.ErrInvalidRepaymentDenom
|
||||||
|
ErrInvalidWithdrawAmount = types.ErrInvalidWithdrawAmount
|
||||||
|
ErrInvalidWithdrawDenom = types.ErrInvalidWithdrawDenom
|
||||||
|
ErrMarketNotFound = types.ErrMarketNotFound
|
||||||
|
ErrMoneyMarketNotFound = types.ErrMoneyMarketNotFound
|
||||||
|
ErrNegativeBorrowedCoins = types.ErrNegativeBorrowedCoins
|
||||||
|
ErrNegativeSuppliedCoins = types.ErrNegativeSuppliedCoins
|
||||||
|
ErrPreviousAccrualTimeNotFound = types.ErrPreviousAccrualTimeNotFound
|
||||||
|
ErrPriceNotFound = types.ErrPriceNotFound
|
||||||
|
ErrSuppliedCoinsNotFound = types.ErrSuppliedCoinsNotFound
|
||||||
GovDenom = types.GovDenom
|
GovDenom = types.GovDenom
|
||||||
KeyActive = types.KeyActive
|
KeyCheckLtvIndexCount = types.KeyCheckLtvIndexCount
|
||||||
|
KeyMoneyMarkets = types.KeyMoneyMarkets
|
||||||
|
LtvIndexPrefix = types.LtvIndexPrefix
|
||||||
ModuleCdc = types.ModuleCdc
|
ModuleCdc = types.ModuleCdc
|
||||||
|
MoneyMarketsPrefix = types.MoneyMarketsPrefix
|
||||||
|
PreviousAccrualTimePrefix = types.PreviousAccrualTimePrefix
|
||||||
PreviousBlockTimeKey = types.PreviousBlockTimeKey
|
PreviousBlockTimeKey = types.PreviousBlockTimeKey
|
||||||
|
SuppliedCoinsPrefix = types.SuppliedCoinsPrefix
|
||||||
|
SupplyInterestFactorPrefix = types.SupplyInterestFactorPrefix
|
||||||
|
TotalReservesPrefix = types.TotalReservesPrefix
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
Keeper = keeper.Keeper
|
Keeper = keeper.Keeper
|
||||||
AccountKeeper = types.AccountKeeper
|
LiqData = keeper.LiqData
|
||||||
Borrow = types.Borrow
|
AccountKeeper = types.AccountKeeper
|
||||||
MoneyMarket = types.MoneyMarket
|
AuctionKeeper = types.AuctionKeeper
|
||||||
MoneyMarkets = types.MoneyMarkets
|
Borrow = types.Borrow
|
||||||
Deposit = types.Deposit
|
BorrowInterestFactor = types.BorrowInterestFactor
|
||||||
GenesisState = types.GenesisState
|
BorrowInterestFactors = types.BorrowInterestFactors
|
||||||
MsgDeposit = types.MsgDeposit
|
BorrowLimit = types.BorrowLimit
|
||||||
MsgWithdraw = types.MsgWithdraw
|
Borrows = types.Borrows
|
||||||
Params = types.Params
|
Deposit = types.Deposit
|
||||||
QueryAccountParams = types.QueryAccountParams
|
Deposits = types.Deposits
|
||||||
StakingKeeper = types.StakingKeeper
|
GenesisAccumulationTime = types.GenesisAccumulationTime
|
||||||
SupplyKeeper = types.SupplyKeeper
|
GenesisAccumulationTimes = types.GenesisAccumulationTimes
|
||||||
|
GenesisState = types.GenesisState
|
||||||
|
HARDHooks = types.HARDHooks
|
||||||
|
InterestRateModel = types.InterestRateModel
|
||||||
|
InterestRateModels = types.InterestRateModels
|
||||||
|
MoneyMarket = types.MoneyMarket
|
||||||
|
MoneyMarkets = types.MoneyMarkets
|
||||||
|
MsgBorrow = types.MsgBorrow
|
||||||
|
MsgDeposit = types.MsgDeposit
|
||||||
|
MsgLiquidate = types.MsgLiquidate
|
||||||
|
MsgRepay = types.MsgRepay
|
||||||
|
MsgWithdraw = types.MsgWithdraw
|
||||||
|
MultiHARDHooks = types.MultiHARDHooks
|
||||||
|
Params = types.Params
|
||||||
|
PricefeedKeeper = types.PricefeedKeeper
|
||||||
|
QueryAccountParams = types.QueryAccountParams
|
||||||
|
QueryBorrowsParams = types.QueryBorrowsParams
|
||||||
|
QueryDepositsParams = types.QueryDepositsParams
|
||||||
|
QueryTotalBorrowedParams = types.QueryTotalBorrowedParams
|
||||||
|
QueryTotalDepositedParams = types.QueryTotalDepositedParams
|
||||||
|
StakingKeeper = types.StakingKeeper
|
||||||
|
SupplyInterestFactor = types.SupplyInterestFactor
|
||||||
|
SupplyInterestFactors = types.SupplyInterestFactors
|
||||||
|
SupplyKeeper = types.SupplyKeeper
|
||||||
|
ValuationMap = types.ValuationMap
|
||||||
)
|
)
|
||||||
|
@ -16,15 +16,28 @@ func InitGenesis(ctx sdk.Context, k Keeper, supplyKeeper types.SupplyKeeper, gs
|
|||||||
|
|
||||||
k.SetParams(ctx, gs.Params)
|
k.SetParams(ctx, gs.Params)
|
||||||
|
|
||||||
// only set the previous block time if it's different than default
|
|
||||||
if !gs.PreviousBlockTime.Equal(DefaultPreviousBlockTime) {
|
|
||||||
k.SetPreviousBlockTime(ctx, gs.PreviousBlockTime)
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, mm := range gs.Params.MoneyMarkets {
|
for _, mm := range gs.Params.MoneyMarkets {
|
||||||
k.SetMoneyMarket(ctx, mm.Denom, mm)
|
k.SetMoneyMarket(ctx, mm.Denom, mm)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for _, gat := range gs.PreviousAccumulationTimes {
|
||||||
|
k.SetPreviousAccrualTime(ctx, gat.CollateralType, gat.PreviousAccumulationTime)
|
||||||
|
k.SetSupplyInterestFactor(ctx, gat.CollateralType, gat.SupplyInterestFactor)
|
||||||
|
k.SetBorrowInterestFactor(ctx, gat.CollateralType, gat.BorrowInterestFactor)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, deposit := range gs.Deposits {
|
||||||
|
k.SetDeposit(ctx, deposit)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, borrow := range gs.Borrows {
|
||||||
|
k.SetBorrow(ctx, borrow)
|
||||||
|
}
|
||||||
|
|
||||||
|
k.SetSuppliedCoins(ctx, gs.TotalSupplied)
|
||||||
|
k.SetBorrowedCoins(ctx, gs.TotalBorrowed)
|
||||||
|
k.SetTotalReserves(ctx, gs.TotalReserves)
|
||||||
|
|
||||||
// check if the module account exists
|
// check if the module account exists
|
||||||
LPModuleAcc := supplyKeeper.GetModuleAccount(ctx, LPAccount)
|
LPModuleAcc := supplyKeeper.GetModuleAccount(ctx, LPAccount)
|
||||||
if LPModuleAcc == nil {
|
if LPModuleAcc == nil {
|
||||||
@ -54,9 +67,53 @@ func InitGenesis(ctx sdk.Context, k Keeper, supplyKeeper types.SupplyKeeper, gs
|
|||||||
// ExportGenesis export genesis state for hard module
|
// ExportGenesis export genesis state for hard module
|
||||||
func ExportGenesis(ctx sdk.Context, k Keeper) GenesisState {
|
func ExportGenesis(ctx sdk.Context, k Keeper) GenesisState {
|
||||||
params := k.GetParams(ctx)
|
params := k.GetParams(ctx)
|
||||||
previousBlockTime, found := k.GetPreviousBlockTime(ctx)
|
|
||||||
|
gats := types.GenesisAccumulationTimes{}
|
||||||
|
deposits := types.Deposits{}
|
||||||
|
borrows := types.Borrows{}
|
||||||
|
|
||||||
|
k.IterateDeposits(ctx, func(d types.Deposit) bool {
|
||||||
|
deposits = append(deposits, d)
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
|
||||||
|
k.IterateBorrows(ctx, func(b types.Borrow) bool {
|
||||||
|
borrows = append(borrows, b)
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
|
||||||
|
totalSupplied, found := k.GetSuppliedCoins(ctx)
|
||||||
if !found {
|
if !found {
|
||||||
previousBlockTime = DefaultPreviousBlockTime
|
totalSupplied = DefaultTotalSupplied
|
||||||
}
|
}
|
||||||
return NewGenesisState(params, previousBlockTime)
|
totalBorrowed, found := k.GetBorrowedCoins(ctx)
|
||||||
|
if !found {
|
||||||
|
totalBorrowed = DefaultTotalBorrowed
|
||||||
|
}
|
||||||
|
totalReserves, found := k.GetTotalReserves(ctx)
|
||||||
|
if !found {
|
||||||
|
totalReserves = DefaultTotalReserves
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, mm := range params.MoneyMarkets {
|
||||||
|
supplyFactor, f := k.GetSupplyInterestFactor(ctx, mm.Denom)
|
||||||
|
if !f {
|
||||||
|
supplyFactor = sdk.ZeroDec()
|
||||||
|
}
|
||||||
|
borrowFactor, f := k.GetBorrowInterestFactor(ctx, mm.Denom)
|
||||||
|
if !f {
|
||||||
|
borrowFactor = sdk.ZeroDec()
|
||||||
|
}
|
||||||
|
previousAccrualTime, f := k.GetPreviousAccrualTime(ctx, mm.Denom)
|
||||||
|
if !f {
|
||||||
|
previousAccrualTime = ctx.BlockTime()
|
||||||
|
}
|
||||||
|
gat := types.NewGenesisAccumulationTime(mm.Denom, previousAccrualTime, supplyFactor, borrowFactor)
|
||||||
|
gats = append(gats, gat)
|
||||||
|
|
||||||
|
}
|
||||||
|
return NewGenesisState(
|
||||||
|
params, gats, deposits, borrows,
|
||||||
|
totalSupplied, totalBorrowed, totalReserves,
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
@ -261,7 +261,6 @@ func (suite *KeeperTestSuite) TestBorrow() {
|
|||||||
|
|
||||||
// hard module genesis state
|
// hard module genesis state
|
||||||
hardGS := types.NewGenesisState(types.NewParams(
|
hardGS := types.NewGenesisState(types.NewParams(
|
||||||
true,
|
|
||||||
types.MoneyMarkets{
|
types.MoneyMarkets{
|
||||||
types.NewMoneyMarket("usdx", types.NewBorrowLimit(true, tc.args.usdxBorrowLimit, sdk.MustNewDecFromStr("1")), "usdx:usd", sdk.NewInt(USDX_CF), sdk.NewInt(USDX_CF*1000), types.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
types.NewMoneyMarket("usdx", types.NewBorrowLimit(true, tc.args.usdxBorrowLimit, sdk.MustNewDecFromStr("1")), "usdx:usd", sdk.NewInt(USDX_CF), sdk.NewInt(USDX_CF*1000), types.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
||||||
types.NewMoneyMarket("busd", types.NewBorrowLimit(false, sdk.NewDec(100000000*BUSD_CF), sdk.MustNewDecFromStr("1")), "busd:usd", sdk.NewInt(BUSD_CF), sdk.NewInt(BUSD_CF*1000), types.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
types.NewMoneyMarket("busd", types.NewBorrowLimit(false, sdk.NewDec(100000000*BUSD_CF), sdk.MustNewDecFromStr("1")), "busd:usd", sdk.NewInt(BUSD_CF), sdk.NewInt(BUSD_CF*1000), types.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
||||||
@ -271,7 +270,9 @@ func (suite *KeeperTestSuite) TestBorrow() {
|
|||||||
types.NewMoneyMarket("xyz", types.NewBorrowLimit(false, sdk.NewDec(1), tc.args.loanToValueBNB), "xyz:usd", sdk.NewInt(1), sdk.NewInt(1), types.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
types.NewMoneyMarket("xyz", types.NewBorrowLimit(false, sdk.NewDec(1), tc.args.loanToValueBNB), "xyz:usd", sdk.NewInt(1), sdk.NewInt(1), types.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
||||||
},
|
},
|
||||||
0, // LTV counter
|
0, // LTV counter
|
||||||
), types.DefaultPreviousBlockTime)
|
), types.DefaultAccumulationTimes, types.DefaultDeposits, types.DefaultBorrows,
|
||||||
|
types.DefaultTotalSupplied, types.DefaultTotalBorrowed, types.DefaultTotalReserves,
|
||||||
|
)
|
||||||
|
|
||||||
// Pricefeed module genesis state
|
// Pricefeed module genesis state
|
||||||
pricefeedGS := pricefeed.GenesisState{
|
pricefeedGS := pricefeed.GenesisState{
|
||||||
|
@ -105,7 +105,6 @@ func (suite *KeeperTestSuite) TestDeposit() {
|
|||||||
authGS := app.NewAuthGenState([]sdk.AccAddress{tc.args.depositor}, []sdk.Coins{sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(1000)), sdk.NewCoin("btcb", sdk.NewInt(1000)))})
|
authGS := app.NewAuthGenState([]sdk.AccAddress{tc.args.depositor}, []sdk.Coins{sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(1000)), sdk.NewCoin("btcb", sdk.NewInt(1000)))})
|
||||||
loanToValue, _ := sdk.NewDecFromStr("0.6")
|
loanToValue, _ := sdk.NewDecFromStr("0.6")
|
||||||
hardGS := types.NewGenesisState(types.NewParams(
|
hardGS := types.NewGenesisState(types.NewParams(
|
||||||
true,
|
|
||||||
types.MoneyMarkets{
|
types.MoneyMarkets{
|
||||||
types.NewMoneyMarket("usdx", types.NewBorrowLimit(false, sdk.NewDec(1000000000000000), loanToValue), "usdx:usd", sdk.NewInt(1000000), sdk.NewInt(USDX_CF*1000), types.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
types.NewMoneyMarket("usdx", types.NewBorrowLimit(false, sdk.NewDec(1000000000000000), loanToValue), "usdx:usd", sdk.NewInt(1000000), sdk.NewInt(USDX_CF*1000), types.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
||||||
types.NewMoneyMarket("ukava", types.NewBorrowLimit(false, sdk.NewDec(1000000000000000), loanToValue), "kava:usd", sdk.NewInt(1000000), sdk.NewInt(KAVA_CF*1000), types.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
types.NewMoneyMarket("ukava", types.NewBorrowLimit(false, sdk.NewDec(1000000000000000), loanToValue), "kava:usd", sdk.NewInt(1000000), sdk.NewInt(KAVA_CF*1000), types.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
||||||
@ -113,7 +112,9 @@ func (suite *KeeperTestSuite) TestDeposit() {
|
|||||||
types.NewMoneyMarket("btcb", types.NewBorrowLimit(false, sdk.NewDec(1000000000000000), loanToValue), "btcb:usd", sdk.NewInt(1000000), sdk.NewInt(BTCB_CF*1000), types.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
types.NewMoneyMarket("btcb", types.NewBorrowLimit(false, sdk.NewDec(1000000000000000), loanToValue), "btcb:usd", sdk.NewInt(1000000), sdk.NewInt(BTCB_CF*1000), types.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
||||||
},
|
},
|
||||||
0, // LTV counter
|
0, // LTV counter
|
||||||
), types.DefaultPreviousBlockTime)
|
), types.DefaultAccumulationTimes, types.DefaultDeposits, types.DefaultBorrows,
|
||||||
|
types.DefaultTotalSupplied, types.DefaultTotalBorrowed, types.DefaultTotalReserves,
|
||||||
|
)
|
||||||
|
|
||||||
// Pricefeed module genesis state
|
// Pricefeed module genesis state
|
||||||
pricefeedGS := pricefeed.GenesisState{
|
pricefeedGS := pricefeed.GenesisState{
|
||||||
|
@ -78,10 +78,10 @@ func (k Keeper) AccrueInterest(ctx sdk.Context, denom string) error {
|
|||||||
borrowedPrior = sdk.NewCoin(denom, borrowedCoinsPrior.AmountOf(denom))
|
borrowedPrior = sdk.NewCoin(denom, borrowedCoinsPrior.AmountOf(denom))
|
||||||
}
|
}
|
||||||
|
|
||||||
reservesPrior, foundReservesPrior := k.GetTotalReserves(ctx, denom)
|
reservesPrior, foundReservesPrior := k.GetTotalReserves(ctx)
|
||||||
if !foundReservesPrior {
|
if !foundReservesPrior {
|
||||||
newReservesPrior := sdk.NewCoin(denom, sdk.ZeroInt())
|
newReservesPrior := sdk.NewCoins()
|
||||||
k.SetTotalReserves(ctx, denom, newReservesPrior)
|
k.SetTotalReserves(ctx, newReservesPrior)
|
||||||
reservesPrior = newReservesPrior
|
reservesPrior = newReservesPrior
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -106,7 +106,7 @@ func (k Keeper) AccrueInterest(ctx sdk.Context, denom string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetBorrowRate calculates the current interest rate based on utilization (the fraction of supply that has been borrowed)
|
// GetBorrowRate calculates the current interest rate based on utilization (the fraction of supply that has been borrowed)
|
||||||
borrowRateApy, err := CalculateBorrowRate(mm.InterestRateModel, sdk.NewDecFromInt(cashPrior), sdk.NewDecFromInt(borrowedPrior.Amount), sdk.NewDecFromInt(reservesPrior.Amount))
|
borrowRateApy, err := CalculateBorrowRate(mm.InterestRateModel, sdk.NewDecFromInt(cashPrior), sdk.NewDecFromInt(borrowedPrior.Amount), sdk.NewDecFromInt(reservesPrior.AmountOf(denom)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -127,14 +127,14 @@ func (k Keeper) AccrueInterest(ctx sdk.Context, denom string) error {
|
|||||||
|
|
||||||
// Calculate supply interest factor and update
|
// Calculate supply interest factor and update
|
||||||
supplyInterestNew := interestBorrowAccumulated.Sub(reservesNew)
|
supplyInterestNew := interestBorrowAccumulated.Sub(reservesNew)
|
||||||
supplyInterestFactor := CalculateSupplyInterestFactor(supplyInterestNew.ToDec(), cashPrior.ToDec(), borrowedPrior.Amount.ToDec(), reservesPrior.Amount.ToDec())
|
supplyInterestFactor := CalculateSupplyInterestFactor(supplyInterestNew.ToDec(), cashPrior.ToDec(), borrowedPrior.Amount.ToDec(), reservesPrior.AmountOf(denom).ToDec())
|
||||||
supplyInterestFactorNew := supplyInterestFactorPrior.Mul(supplyInterestFactor)
|
supplyInterestFactorNew := supplyInterestFactorPrior.Mul(supplyInterestFactor)
|
||||||
k.SetSupplyInterestFactor(ctx, denom, supplyInterestFactorNew)
|
k.SetSupplyInterestFactor(ctx, denom, supplyInterestFactorNew)
|
||||||
|
|
||||||
// Update accural keys in store
|
// Update accural keys in store
|
||||||
k.IncrementBorrowedCoins(ctx, totalBorrowInterestAccumulated)
|
k.IncrementBorrowedCoins(ctx, totalBorrowInterestAccumulated)
|
||||||
k.IncrementSuppliedCoins(ctx, sdk.NewCoins(sdk.NewCoin(denom, supplyInterestNew)))
|
k.IncrementSuppliedCoins(ctx, sdk.NewCoins(sdk.NewCoin(denom, supplyInterestNew)))
|
||||||
k.SetTotalReserves(ctx, denom, reservesPrior.Add(sdk.NewCoin(mm.Denom, reservesNew)))
|
k.SetTotalReserves(ctx, reservesPrior.Add(sdk.NewCoin(denom, reservesNew)))
|
||||||
k.SetPreviousAccrualTime(ctx, denom, ctx.BlockTime())
|
k.SetPreviousAccrualTime(ctx, denom, ctx.BlockTime())
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -711,7 +711,6 @@ func (suite *KeeperTestSuite) TestBorrowInterest() {
|
|||||||
|
|
||||||
// Hard module genesis state
|
// Hard module genesis state
|
||||||
hardGS := types.NewGenesisState(types.NewParams(
|
hardGS := types.NewGenesisState(types.NewParams(
|
||||||
true,
|
|
||||||
types.MoneyMarkets{
|
types.MoneyMarkets{
|
||||||
types.NewMoneyMarket("ukava",
|
types.NewMoneyMarket("ukava",
|
||||||
types.NewBorrowLimit(false, sdk.NewDec(100000000*KAVA_CF), sdk.MustNewDecFromStr("0.8")), // Borrow Limit
|
types.NewBorrowLimit(false, sdk.NewDec(100000000*KAVA_CF), sdk.MustNewDecFromStr("0.8")), // Borrow Limit
|
||||||
@ -723,7 +722,9 @@ func (suite *KeeperTestSuite) TestBorrowInterest() {
|
|||||||
sdk.ZeroDec()), // Keeper Reward Percentage
|
sdk.ZeroDec()), // Keeper Reward Percentage
|
||||||
},
|
},
|
||||||
0, // LTV counter
|
0, // LTV counter
|
||||||
), types.DefaultPreviousBlockTime)
|
), types.DefaultAccumulationTimes, types.DefaultDeposits, types.DefaultBorrows,
|
||||||
|
types.DefaultTotalSupplied, types.DefaultTotalBorrowed, types.DefaultTotalReserves,
|
||||||
|
)
|
||||||
|
|
||||||
// Pricefeed module genesis state
|
// Pricefeed module genesis state
|
||||||
pricefeedGS := pricefeed.GenesisState{
|
pricefeedGS := pricefeed.GenesisState{
|
||||||
@ -788,16 +789,16 @@ func (suite *KeeperTestSuite) TestBorrowInterest() {
|
|||||||
suite.Require().True(borrowCoinsPriorFound)
|
suite.Require().True(borrowCoinsPriorFound)
|
||||||
borrowCoinPriorAmount := borrowCoinsPrior.AmountOf(tc.args.borrowCoinDenom)
|
borrowCoinPriorAmount := borrowCoinsPrior.AmountOf(tc.args.borrowCoinDenom)
|
||||||
|
|
||||||
reservesPrior, foundReservesPrior := suite.keeper.GetTotalReserves(prevCtx, tc.args.borrowCoinDenom)
|
reservesPrior, foundReservesPrior := suite.keeper.GetTotalReserves(prevCtx)
|
||||||
if !foundReservesPrior {
|
if !foundReservesPrior {
|
||||||
reservesPrior = sdk.NewCoin(tc.args.borrowCoinDenom, sdk.ZeroInt())
|
reservesPrior = sdk.NewCoins(sdk.NewCoin(tc.args.borrowCoinDenom, sdk.ZeroInt()))
|
||||||
}
|
}
|
||||||
|
|
||||||
interestFactorPrior, foundInterestFactorPrior := suite.keeper.GetBorrowInterestFactor(prevCtx, tc.args.borrowCoinDenom)
|
interestFactorPrior, foundInterestFactorPrior := suite.keeper.GetBorrowInterestFactor(prevCtx, tc.args.borrowCoinDenom)
|
||||||
suite.Require().True(foundInterestFactorPrior)
|
suite.Require().True(foundInterestFactorPrior)
|
||||||
|
|
||||||
// 2. Calculate expected interest owed
|
// 2. Calculate expected interest owed
|
||||||
borrowRateApy, err := hard.CalculateBorrowRate(tc.args.interestRateModel, sdk.NewDecFromInt(cashPrior), sdk.NewDecFromInt(borrowCoinPriorAmount), sdk.NewDecFromInt(reservesPrior.Amount))
|
borrowRateApy, err := hard.CalculateBorrowRate(tc.args.interestRateModel, sdk.NewDecFromInt(cashPrior), sdk.NewDecFromInt(borrowCoinPriorAmount), sdk.NewDecFromInt(reservesPrior.AmountOf(tc.args.borrowCoinDenom)))
|
||||||
suite.Require().NoError(err)
|
suite.Require().NoError(err)
|
||||||
|
|
||||||
// Convert from APY to SPY, expressed as (1 + borrow rate)
|
// Convert from APY to SPY, expressed as (1 + borrow rate)
|
||||||
@ -821,7 +822,7 @@ func (suite *KeeperTestSuite) TestBorrowInterest() {
|
|||||||
suite.Require().Equal(expectedBorrowedCoins, currBorrowedCoins.AmountOf(tc.args.borrowCoinDenom))
|
suite.Require().Equal(expectedBorrowedCoins, currBorrowedCoins.AmountOf(tc.args.borrowCoinDenom))
|
||||||
|
|
||||||
// Check that the total reserves have changed as expected
|
// Check that the total reserves have changed as expected
|
||||||
currTotalReserves, _ := suite.keeper.GetTotalReserves(snapshotCtx, tc.args.borrowCoinDenom)
|
currTotalReserves, _ := suite.keeper.GetTotalReserves(snapshotCtx)
|
||||||
suite.Require().Equal(expectedReserves, currTotalReserves)
|
suite.Require().Equal(expectedReserves, currTotalReserves)
|
||||||
|
|
||||||
// Check that the borrow index has increased as expected
|
// Check that the borrow index has increased as expected
|
||||||
@ -1118,7 +1119,6 @@ func (suite *KeeperTestSuite) TestSupplyInterest() {
|
|||||||
|
|
||||||
// Hard module genesis state
|
// Hard module genesis state
|
||||||
hardGS := types.NewGenesisState(types.NewParams(
|
hardGS := types.NewGenesisState(types.NewParams(
|
||||||
true,
|
|
||||||
types.MoneyMarkets{
|
types.MoneyMarkets{
|
||||||
types.NewMoneyMarket("ukava",
|
types.NewMoneyMarket("ukava",
|
||||||
types.NewBorrowLimit(false, sdk.NewDec(100000000*KAVA_CF), sdk.MustNewDecFromStr("0.8")), // Borrow Limit
|
types.NewBorrowLimit(false, sdk.NewDec(100000000*KAVA_CF), sdk.MustNewDecFromStr("0.8")), // Borrow Limit
|
||||||
@ -1138,7 +1138,9 @@ func (suite *KeeperTestSuite) TestSupplyInterest() {
|
|||||||
sdk.ZeroDec()), // Keeper Reward Percentage
|
sdk.ZeroDec()), // Keeper Reward Percentage
|
||||||
},
|
},
|
||||||
0, // LTV counter
|
0, // LTV counter
|
||||||
), types.DefaultPreviousBlockTime)
|
), types.DefaultAccumulationTimes, types.DefaultDeposits, types.DefaultBorrows,
|
||||||
|
types.DefaultTotalSupplied, types.DefaultTotalBorrowed, types.DefaultTotalReserves,
|
||||||
|
)
|
||||||
|
|
||||||
// Pricefeed module genesis state
|
// Pricefeed module genesis state
|
||||||
pricefeedGS := pricefeed.GenesisState{
|
pricefeedGS := pricefeed.GenesisState{
|
||||||
@ -1210,9 +1212,9 @@ func (suite *KeeperTestSuite) TestSupplyInterest() {
|
|||||||
suite.Require().True(supplyCoinsPriorFound)
|
suite.Require().True(supplyCoinsPriorFound)
|
||||||
supplyCoinPriorAmount = supplyCoinsPrior.AmountOf(coinDenom)
|
supplyCoinPriorAmount = supplyCoinsPrior.AmountOf(coinDenom)
|
||||||
|
|
||||||
reservesPrior, foundReservesPrior := suite.keeper.GetTotalReserves(prevCtx, coinDenom)
|
reservesPrior, foundReservesPrior := suite.keeper.GetTotalReserves(prevCtx)
|
||||||
if !foundReservesPrior {
|
if !foundReservesPrior {
|
||||||
reservesPrior = sdk.NewCoin(coinDenom, sdk.ZeroInt())
|
reservesPrior = sdk.NewCoins(sdk.NewCoin(coinDenom, sdk.ZeroInt()))
|
||||||
}
|
}
|
||||||
|
|
||||||
borrowInterestFactorPrior, foundBorrowInterestFactorPrior := suite.keeper.GetBorrowInterestFactor(prevCtx, coinDenom)
|
borrowInterestFactorPrior, foundBorrowInterestFactorPrior := suite.keeper.GetBorrowInterestFactor(prevCtx, coinDenom)
|
||||||
@ -1222,7 +1224,7 @@ func (suite *KeeperTestSuite) TestSupplyInterest() {
|
|||||||
suite.Require().True(foundSupplyInterestFactorPrior)
|
suite.Require().True(foundSupplyInterestFactorPrior)
|
||||||
|
|
||||||
// 2. Calculate expected borrow interest owed
|
// 2. Calculate expected borrow interest owed
|
||||||
borrowRateApy, err := hard.CalculateBorrowRate(tc.args.interestRateModel, sdk.NewDecFromInt(cashPrior), sdk.NewDecFromInt(borrowCoinPriorAmount), sdk.NewDecFromInt(reservesPrior.Amount))
|
borrowRateApy, err := hard.CalculateBorrowRate(tc.args.interestRateModel, sdk.NewDecFromInt(cashPrior), sdk.NewDecFromInt(borrowCoinPriorAmount), sdk.NewDecFromInt(reservesPrior.AmountOf(coinDenom)))
|
||||||
suite.Require().NoError(err)
|
suite.Require().NoError(err)
|
||||||
|
|
||||||
// Convert from APY to SPY, expressed as (1 + borrow rate)
|
// Convert from APY to SPY, expressed as (1 + borrow rate)
|
||||||
@ -1232,12 +1234,12 @@ func (suite *KeeperTestSuite) TestSupplyInterest() {
|
|||||||
newBorrowInterestFactor := hard.CalculateBorrowInterestFactor(borrowRateSpy, sdk.NewInt(snapshot.elapsedTime))
|
newBorrowInterestFactor := hard.CalculateBorrowInterestFactor(borrowRateSpy, sdk.NewInt(snapshot.elapsedTime))
|
||||||
expectedBorrowInterest := (newBorrowInterestFactor.Mul(sdk.NewDecFromInt(borrowCoinPriorAmount)).TruncateInt()).Sub(borrowCoinPriorAmount)
|
expectedBorrowInterest := (newBorrowInterestFactor.Mul(sdk.NewDecFromInt(borrowCoinPriorAmount)).TruncateInt()).Sub(borrowCoinPriorAmount)
|
||||||
expectedReserves := reservesPrior.Add(sdk.NewCoin(coinDenom, sdk.NewDecFromInt(expectedBorrowInterest).Mul(tc.args.reserveFactor).TruncateInt())).Sub(reservesPrior)
|
expectedReserves := reservesPrior.Add(sdk.NewCoin(coinDenom, sdk.NewDecFromInt(expectedBorrowInterest).Mul(tc.args.reserveFactor).TruncateInt())).Sub(reservesPrior)
|
||||||
expectedTotalReserves := expectedReserves.Add(reservesPrior)
|
expectedTotalReserves := expectedReserves.Add(reservesPrior...)
|
||||||
|
|
||||||
expectedBorrowInterestFactor := borrowInterestFactorPrior.Mul(newBorrowInterestFactor)
|
expectedBorrowInterestFactor := borrowInterestFactorPrior.Mul(newBorrowInterestFactor)
|
||||||
expectedSupplyInterest := expectedBorrowInterest.Sub(expectedReserves.Amount)
|
expectedSupplyInterest := expectedBorrowInterest.Sub(expectedReserves.AmountOf(coinDenom))
|
||||||
|
|
||||||
newSupplyInterestFactor := hard.CalculateSupplyInterestFactor(expectedSupplyInterest.ToDec(), sdk.NewDecFromInt(cashPrior), sdk.NewDecFromInt(borrowCoinPriorAmount), sdk.NewDecFromInt(reservesPrior.Amount))
|
newSupplyInterestFactor := hard.CalculateSupplyInterestFactor(expectedSupplyInterest.ToDec(), sdk.NewDecFromInt(cashPrior), sdk.NewDecFromInt(borrowCoinPriorAmount), sdk.NewDecFromInt(reservesPrior.AmountOf(coinDenom)))
|
||||||
expectedSupplyInterestFactor := supplyInterestFactorPrior.Mul(newSupplyInterestFactor)
|
expectedSupplyInterestFactor := supplyInterestFactorPrior.Mul(newSupplyInterestFactor)
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -1248,7 +1250,7 @@ func (suite *KeeperTestSuite) TestSupplyInterest() {
|
|||||||
|
|
||||||
borrowInterestFactor, _ := suite.keeper.GetBorrowInterestFactor(ctx, coinDenom)
|
borrowInterestFactor, _ := suite.keeper.GetBorrowInterestFactor(ctx, coinDenom)
|
||||||
suite.Require().Equal(expectedBorrowInterestFactor, borrowInterestFactor)
|
suite.Require().Equal(expectedBorrowInterestFactor, borrowInterestFactor)
|
||||||
suite.Require().Equal(expectedBorrowInterest, expectedSupplyInterest.Add(expectedReserves.Amount))
|
suite.Require().Equal(expectedBorrowInterest, expectedSupplyInterest.Add(expectedReserves.AmountOf(coinDenom)))
|
||||||
|
|
||||||
// Check that the total amount of borrowed coins has increased by expected borrow interest amount
|
// Check that the total amount of borrowed coins has increased by expected borrow interest amount
|
||||||
borrowCoinsPost, _ := suite.keeper.GetBorrowedCoins(snapshotCtx)
|
borrowCoinsPost, _ := suite.keeper.GetBorrowedCoins(snapshotCtx)
|
||||||
@ -1261,8 +1263,11 @@ func (suite *KeeperTestSuite) TestSupplyInterest() {
|
|||||||
suite.Require().Equal(supplyCoinPostAmount, supplyCoinPriorAmount.Add(expectedSupplyInterest))
|
suite.Require().Equal(supplyCoinPostAmount, supplyCoinPriorAmount.Add(expectedSupplyInterest))
|
||||||
|
|
||||||
// Check current total reserves
|
// Check current total reserves
|
||||||
totalReserves, _ := suite.keeper.GetTotalReserves(snapshotCtx, coinDenom)
|
totalReserves, _ := suite.keeper.GetTotalReserves(snapshotCtx)
|
||||||
suite.Require().Equal(expectedTotalReserves, totalReserves)
|
suite.Require().Equal(
|
||||||
|
sdk.NewCoin(coinDenom, expectedTotalReserves.AmountOf(coinDenom)),
|
||||||
|
sdk.NewCoin(coinDenom, totalReserves.AmountOf(coinDenom)),
|
||||||
|
)
|
||||||
|
|
||||||
// Check that the supply index has increased as expected
|
// Check that the supply index has increased as expected
|
||||||
currSupplyIndexPrior, _ := suite.keeper.GetSupplyInterestFactor(snapshotCtx, coinDenom)
|
currSupplyIndexPrior, _ := suite.keeper.GetSupplyInterestFactor(snapshotCtx, coinDenom)
|
||||||
|
@ -272,22 +272,27 @@ func (k Keeper) SetPreviousAccrualTime(ctx sdk.Context, denom string, previousAc
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetTotalReserves returns the total reserves for an individual market
|
// GetTotalReserves returns the total reserves for an individual market
|
||||||
func (k Keeper) GetTotalReserves(ctx sdk.Context, denom string) (sdk.Coin, bool) {
|
func (k Keeper) GetTotalReserves(ctx sdk.Context) (sdk.Coins, bool) {
|
||||||
store := prefix.NewStore(ctx.KVStore(k.key), types.TotalReservesPrefix)
|
store := prefix.NewStore(ctx.KVStore(k.key), types.TotalReservesPrefix)
|
||||||
bz := store.Get([]byte(denom))
|
bz := store.Get([]byte{})
|
||||||
if bz == nil {
|
if bz == nil {
|
||||||
return sdk.Coin{}, false
|
return sdk.Coins{}, false
|
||||||
}
|
}
|
||||||
var totalReserves sdk.Coin
|
var totalReserves sdk.Coins
|
||||||
k.cdc.MustUnmarshalBinaryBare(bz, &totalReserves)
|
k.cdc.MustUnmarshalBinaryBare(bz, &totalReserves)
|
||||||
return totalReserves, true
|
return totalReserves, true
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetTotalReserves sets the total reserves for an individual market
|
// SetTotalReserves sets the total reserves for an individual market
|
||||||
func (k Keeper) SetTotalReserves(ctx sdk.Context, denom string, coin sdk.Coin) {
|
func (k Keeper) SetTotalReserves(ctx sdk.Context, coins sdk.Coins) {
|
||||||
|
|
||||||
store := prefix.NewStore(ctx.KVStore(k.key), types.TotalReservesPrefix)
|
store := prefix.NewStore(ctx.KVStore(k.key), types.TotalReservesPrefix)
|
||||||
bz := k.cdc.MustMarshalBinaryBare(coin)
|
if coins.Empty() {
|
||||||
store.Set([]byte(denom), bz)
|
store.Set([]byte{}, []byte{})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
bz := k.cdc.MustMarshalBinaryBare(coins)
|
||||||
|
store.Set([]byte{}, bz)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetBorrowInterestFactor returns the current borrow interest factor for an individual market
|
// GetBorrowInterestFactor returns the current borrow interest factor for an individual market
|
||||||
|
@ -122,7 +122,6 @@ func (suite *KeeperTestSuite) TestIndexLiquidation() {
|
|||||||
|
|
||||||
// Hard module genesis state
|
// Hard module genesis state
|
||||||
hardGS := types.NewGenesisState(types.NewParams(
|
hardGS := types.NewGenesisState(types.NewParams(
|
||||||
true,
|
|
||||||
types.MoneyMarkets{
|
types.MoneyMarkets{
|
||||||
types.NewMoneyMarket("usdx",
|
types.NewMoneyMarket("usdx",
|
||||||
types.NewBorrowLimit(false, sdk.NewDec(100000000*KAVA_CF), sdk.MustNewDecFromStr("0.9")), // Borrow Limit
|
types.NewBorrowLimit(false, sdk.NewDec(100000000*KAVA_CF), sdk.MustNewDecFromStr("0.9")), // Borrow Limit
|
||||||
@ -182,7 +181,9 @@ func (suite *KeeperTestSuite) TestIndexLiquidation() {
|
|||||||
sdk.MustNewDecFromStr("0.05")), // Keeper Reward Percent
|
sdk.MustNewDecFromStr("0.05")), // Keeper Reward Percent
|
||||||
},
|
},
|
||||||
tc.args.ltvIndexCount, // LTV counter
|
tc.args.ltvIndexCount, // LTV counter
|
||||||
), types.DefaultPreviousBlockTime)
|
), types.DefaultAccumulationTimes, types.DefaultDeposits, types.DefaultBorrows,
|
||||||
|
types.DefaultTotalSupplied, types.DefaultTotalBorrowed, types.DefaultTotalReserves,
|
||||||
|
)
|
||||||
|
|
||||||
// Pricefeed module genesis state
|
// Pricefeed module genesis state
|
||||||
pricefeedGS := pricefeed.GenesisState{
|
pricefeedGS := pricefeed.GenesisState{
|
||||||
@ -534,7 +535,6 @@ func (suite *KeeperTestSuite) TestFullIndexLiquidation() {
|
|||||||
|
|
||||||
// Hard module genesis state
|
// Hard module genesis state
|
||||||
hardGS := types.NewGenesisState(types.NewParams(
|
hardGS := types.NewGenesisState(types.NewParams(
|
||||||
true,
|
|
||||||
types.MoneyMarkets{
|
types.MoneyMarkets{
|
||||||
types.NewMoneyMarket("usdx",
|
types.NewMoneyMarket("usdx",
|
||||||
types.NewBorrowLimit(false, sdk.NewDec(100000000*KAVA_CF), sdk.MustNewDecFromStr("0.9")), // Borrow Limit
|
types.NewBorrowLimit(false, sdk.NewDec(100000000*KAVA_CF), sdk.MustNewDecFromStr("0.9")), // Borrow Limit
|
||||||
@ -554,7 +554,9 @@ func (suite *KeeperTestSuite) TestFullIndexLiquidation() {
|
|||||||
sdk.MustNewDecFromStr("0.05")), // Keeper Reward Percent
|
sdk.MustNewDecFromStr("0.05")), // Keeper Reward Percent
|
||||||
},
|
},
|
||||||
tc.args.ltvIndexCount, // LTV counter
|
tc.args.ltvIndexCount, // LTV counter
|
||||||
), types.DefaultPreviousBlockTime)
|
), types.DefaultAccumulationTimes, types.DefaultDeposits, types.DefaultBorrows,
|
||||||
|
types.DefaultTotalSupplied, types.DefaultTotalBorrowed, types.DefaultTotalReserves,
|
||||||
|
)
|
||||||
|
|
||||||
// Pricefeed module genesis state
|
// Pricefeed module genesis state
|
||||||
pricefeedGS := pricefeed.GenesisState{
|
pricefeedGS := pricefeed.GenesisState{
|
||||||
@ -1157,7 +1159,6 @@ func (suite *KeeperTestSuite) TestKeeperLiquidation() {
|
|||||||
|
|
||||||
// Hard module genesis state
|
// Hard module genesis state
|
||||||
hardGS := types.NewGenesisState(types.NewParams(
|
hardGS := types.NewGenesisState(types.NewParams(
|
||||||
true,
|
|
||||||
types.MoneyMarkets{
|
types.MoneyMarkets{
|
||||||
types.NewMoneyMarket("usdx",
|
types.NewMoneyMarket("usdx",
|
||||||
types.NewBorrowLimit(false, sdk.NewDec(100000000*KAVA_CF), sdk.MustNewDecFromStr("0.9")), // Borrow Limit
|
types.NewBorrowLimit(false, sdk.NewDec(100000000*KAVA_CF), sdk.MustNewDecFromStr("0.9")), // Borrow Limit
|
||||||
@ -1217,7 +1218,9 @@ func (suite *KeeperTestSuite) TestKeeperLiquidation() {
|
|||||||
tc.args.keeperRewardPercent), // Keeper Reward Percent
|
tc.args.keeperRewardPercent), // Keeper Reward Percent
|
||||||
},
|
},
|
||||||
0, // LTV counter
|
0, // LTV counter
|
||||||
), types.DefaultPreviousBlockTime)
|
), types.DefaultAccumulationTimes, types.DefaultDeposits, types.DefaultBorrows,
|
||||||
|
types.DefaultTotalSupplied, types.DefaultTotalBorrowed, types.DefaultTotalReserves,
|
||||||
|
)
|
||||||
|
|
||||||
// Pricefeed module genesis state
|
// Pricefeed module genesis state
|
||||||
pricefeedGS := pricefeed.GenesisState{
|
pricefeedGS := pricefeed.GenesisState{
|
||||||
|
@ -137,7 +137,6 @@ func (suite *KeeperTestSuite) TestRepay() {
|
|||||||
|
|
||||||
// Hard module genesis state
|
// Hard module genesis state
|
||||||
hardGS := types.NewGenesisState(types.NewParams(
|
hardGS := types.NewGenesisState(types.NewParams(
|
||||||
true,
|
|
||||||
types.MoneyMarkets{
|
types.MoneyMarkets{
|
||||||
types.NewMoneyMarket("usdx",
|
types.NewMoneyMarket("usdx",
|
||||||
types.NewBorrowLimit(false, sdk.NewDec(100000000*USDX_CF), sdk.MustNewDecFromStr("1")), // Borrow Limit
|
types.NewBorrowLimit(false, sdk.NewDec(100000000*USDX_CF), sdk.MustNewDecFromStr("1")), // Borrow Limit
|
||||||
@ -157,7 +156,9 @@ func (suite *KeeperTestSuite) TestRepay() {
|
|||||||
sdk.MustNewDecFromStr("0.05")), // Keeper Reward Percent
|
sdk.MustNewDecFromStr("0.05")), // Keeper Reward Percent
|
||||||
},
|
},
|
||||||
0, // LTV counter
|
0, // LTV counter
|
||||||
), types.DefaultPreviousBlockTime)
|
), types.DefaultAccumulationTimes, types.DefaultDeposits, types.DefaultBorrows,
|
||||||
|
types.DefaultTotalSupplied, types.DefaultTotalBorrowed, types.DefaultTotalReserves,
|
||||||
|
)
|
||||||
|
|
||||||
// Pricefeed module genesis state
|
// Pricefeed module genesis state
|
||||||
pricefeedGS := pricefeed.GenesisState{
|
pricefeedGS := pricefeed.GenesisState{
|
||||||
|
@ -281,13 +281,14 @@ func (suite *KeeperTestSuite) TestSendTimeLockedCoinsToAccount() {
|
|||||||
authGS := app.NewAuthGenState([]sdk.AccAddress{tc.args.accArgs.addr}, []sdk.Coins{tc.args.accArgs.coins})
|
authGS := app.NewAuthGenState([]sdk.AccAddress{tc.args.accArgs.addr}, []sdk.Coins{tc.args.accArgs.coins})
|
||||||
loanToValue := sdk.MustNewDecFromStr("0.6")
|
loanToValue := sdk.MustNewDecFromStr("0.6")
|
||||||
hardGS := types.NewGenesisState(types.NewParams(
|
hardGS := types.NewGenesisState(types.NewParams(
|
||||||
true,
|
|
||||||
types.MoneyMarkets{
|
types.MoneyMarkets{
|
||||||
types.NewMoneyMarket("usdx", types.NewBorrowLimit(false, sdk.NewDec(1000000000000000), loanToValue), "usdx:usd", sdk.NewInt(1000000), sdk.NewInt(USDX_CF*1000), types.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
types.NewMoneyMarket("usdx", types.NewBorrowLimit(false, sdk.NewDec(1000000000000000), loanToValue), "usdx:usd", sdk.NewInt(1000000), sdk.NewInt(USDX_CF*1000), types.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
||||||
types.NewMoneyMarket("ukava", types.NewBorrowLimit(false, sdk.NewDec(1000000000000000), loanToValue), "kava:usd", sdk.NewInt(1000000), sdk.NewInt(KAVA_CF*1000), types.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
types.NewMoneyMarket("ukava", types.NewBorrowLimit(false, sdk.NewDec(1000000000000000), loanToValue), "kava:usd", sdk.NewInt(1000000), sdk.NewInt(KAVA_CF*1000), types.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
||||||
},
|
},
|
||||||
0, // LTV counter
|
0, // LTV counter
|
||||||
), types.DefaultPreviousBlockTime)
|
), types.DefaultAccumulationTimes, types.DefaultDeposits, types.DefaultBorrows,
|
||||||
|
types.DefaultTotalSupplied, types.DefaultTotalBorrowed, types.DefaultTotalReserves,
|
||||||
|
)
|
||||||
tApp.InitializeFromGenesisStates(authGS, app.GenesisState{types.ModuleName: types.ModuleCdc.MustMarshalJSON(hardGS)})
|
tApp.InitializeFromGenesisStates(authGS, app.GenesisState{types.ModuleName: types.ModuleCdc.MustMarshalJSON(hardGS)})
|
||||||
if tc.args.accArgs.vestingAccountBefore {
|
if tc.args.accArgs.vestingAccountBefore {
|
||||||
ak := tApp.GetAccountKeeper()
|
ak := tApp.GetAccountKeeper()
|
||||||
|
@ -124,14 +124,15 @@ func (suite *KeeperTestSuite) TestWithdraw() {
|
|||||||
|
|
||||||
loanToValue := sdk.MustNewDecFromStr("0.6")
|
loanToValue := sdk.MustNewDecFromStr("0.6")
|
||||||
hardGS := types.NewGenesisState(types.NewParams(
|
hardGS := types.NewGenesisState(types.NewParams(
|
||||||
true,
|
|
||||||
types.MoneyMarkets{
|
types.MoneyMarkets{
|
||||||
types.NewMoneyMarket("usdx", types.NewBorrowLimit(false, sdk.NewDec(1000000000000000), loanToValue), "usdx:usd", sdk.NewInt(1000000), sdk.NewInt(USDX_CF*1000), types.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
types.NewMoneyMarket("usdx", types.NewBorrowLimit(false, sdk.NewDec(1000000000000000), loanToValue), "usdx:usd", sdk.NewInt(1000000), sdk.NewInt(USDX_CF*1000), types.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
||||||
types.NewMoneyMarket("ukava", types.NewBorrowLimit(false, sdk.NewDec(1000000000000000), loanToValue), "kava:usd", sdk.NewInt(1000000), sdk.NewInt(KAVA_CF*1000), types.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
types.NewMoneyMarket("ukava", types.NewBorrowLimit(false, sdk.NewDec(1000000000000000), loanToValue), "kava:usd", sdk.NewInt(1000000), sdk.NewInt(KAVA_CF*1000), types.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
||||||
types.NewMoneyMarket("bnb", types.NewBorrowLimit(false, sdk.NewDec(1000000000000000), loanToValue), "bnb:usd", sdk.NewInt(100000000), sdk.NewInt(BNB_CF*1000), types.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
types.NewMoneyMarket("bnb", types.NewBorrowLimit(false, sdk.NewDec(1000000000000000), loanToValue), "bnb:usd", sdk.NewInt(100000000), sdk.NewInt(BNB_CF*1000), types.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
||||||
},
|
},
|
||||||
0, // LTV counter
|
0, // LTV counter
|
||||||
), types.DefaultPreviousBlockTime)
|
), types.DefaultAccumulationTimes, types.DefaultDeposits, types.DefaultBorrows,
|
||||||
|
types.DefaultTotalSupplied, types.DefaultTotalBorrowed, types.DefaultTotalReserves,
|
||||||
|
)
|
||||||
|
|
||||||
// Pricefeed module genesis state
|
// Pricefeed module genesis state
|
||||||
pricefeedGS := pricefeed.GenesisState{
|
pricefeedGS := pricefeed.GenesisState{
|
||||||
@ -264,7 +265,6 @@ func (suite *KeeperTestSuite) TestLtvWithdraw() {
|
|||||||
|
|
||||||
// Harvest module genesis state
|
// Harvest module genesis state
|
||||||
harvestGS := types.NewGenesisState(types.NewParams(
|
harvestGS := types.NewGenesisState(types.NewParams(
|
||||||
true,
|
|
||||||
types.MoneyMarkets{
|
types.MoneyMarkets{
|
||||||
types.NewMoneyMarket("ukava",
|
types.NewMoneyMarket("ukava",
|
||||||
types.NewBorrowLimit(false, sdk.NewDec(100000000*KAVA_CF), sdk.MustNewDecFromStr("0.8")), // Borrow Limit
|
types.NewBorrowLimit(false, sdk.NewDec(100000000*KAVA_CF), sdk.MustNewDecFromStr("0.8")), // Borrow Limit
|
||||||
@ -284,7 +284,9 @@ func (suite *KeeperTestSuite) TestLtvWithdraw() {
|
|||||||
sdk.MustNewDecFromStr("0.05")), // Keeper Reward Percent
|
sdk.MustNewDecFromStr("0.05")), // Keeper Reward Percent
|
||||||
},
|
},
|
||||||
0, // LTV counter
|
0, // LTV counter
|
||||||
), types.DefaultPreviousBlockTime)
|
), types.DefaultAccumulationTimes, types.DefaultDeposits, types.DefaultBorrows,
|
||||||
|
types.DefaultTotalSupplied, types.DefaultTotalBorrowed, types.DefaultTotalReserves,
|
||||||
|
)
|
||||||
|
|
||||||
// Pricefeed module genesis state
|
// Pricefeed module genesis state
|
||||||
pricefeedGS := pricefeed.GenesisState{
|
pricefeedGS := pricefeed.GenesisState{
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
package types
|
package types
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -20,9 +23,49 @@ func NewBorrow(borrower sdk.AccAddress, amount sdk.Coins, index BorrowInterestFa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Validate deposit validation
|
||||||
|
func (b Borrow) Validate() error {
|
||||||
|
if b.Borrower.Empty() {
|
||||||
|
return fmt.Errorf("Depositor cannot be empty")
|
||||||
|
}
|
||||||
|
if !b.Amount.IsValid() {
|
||||||
|
return fmt.Errorf("Invalid deposit coins: %s", b.Amount)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := b.Index.Validate(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b Borrow) String() string {
|
||||||
|
return fmt.Sprintf(`Deposit:
|
||||||
|
Borrower: %s
|
||||||
|
Amount: %s
|
||||||
|
Index: %s
|
||||||
|
`, b.Borrower, b.Amount, b.Index)
|
||||||
|
}
|
||||||
|
|
||||||
// Borrows is a slice of Borrow
|
// Borrows is a slice of Borrow
|
||||||
type Borrows []Borrow
|
type Borrows []Borrow
|
||||||
|
|
||||||
|
// Validate validates Borrows
|
||||||
|
func (bs Borrows) Validate() error {
|
||||||
|
borrowDupMap := make(map[string]Borrow)
|
||||||
|
for _, b := range bs {
|
||||||
|
if err := b.Validate(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
dup, ok := borrowDupMap[b.Borrower.String()]
|
||||||
|
if ok {
|
||||||
|
return fmt.Errorf("duplicate borrower: %s\n%s", b, dup)
|
||||||
|
}
|
||||||
|
borrowDupMap[b.Borrower.String()] = b
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// BorrowInterestFactor defines an individual borrow interest factor
|
// BorrowInterestFactor defines an individual borrow interest factor
|
||||||
type BorrowInterestFactor struct {
|
type BorrowInterestFactor struct {
|
||||||
Denom string `json:"denom" yaml:"denom"`
|
Denom string `json:"denom" yaml:"denom"`
|
||||||
@ -37,5 +80,40 @@ func NewBorrowInterestFactor(denom string, value sdk.Dec) BorrowInterestFactor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Validate validates BorrowInterestFactor values
|
||||||
|
func (bif BorrowInterestFactor) Validate() error {
|
||||||
|
if strings.TrimSpace(bif.Denom) == "" {
|
||||||
|
return fmt.Errorf("borrow interest factor denom cannot be empty")
|
||||||
|
}
|
||||||
|
if bif.Value.IsNegative() {
|
||||||
|
return fmt.Errorf("borrow interest factor value cannot be negative: %s", bif)
|
||||||
|
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bif BorrowInterestFactor) String() string {
|
||||||
|
return fmt.Sprintf(`[%s,%s]
|
||||||
|
`, bif.Denom, bif.Value)
|
||||||
|
}
|
||||||
|
|
||||||
// BorrowInterestFactors is a slice of BorrowInterestFactor, because Amino won't marshal maps
|
// BorrowInterestFactors is a slice of BorrowInterestFactor, because Amino won't marshal maps
|
||||||
type BorrowInterestFactors []BorrowInterestFactor
|
type BorrowInterestFactors []BorrowInterestFactor
|
||||||
|
|
||||||
|
// Validate validates BorrowInterestFactors
|
||||||
|
func (bifs BorrowInterestFactors) Validate() error {
|
||||||
|
for _, bif := range bifs {
|
||||||
|
if err := bif.Validate(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bifs BorrowInterestFactors) String() string {
|
||||||
|
out := ""
|
||||||
|
for _, bif := range bifs {
|
||||||
|
out += bif.String()
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
package types
|
package types
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -20,9 +23,49 @@ func NewDeposit(depositor sdk.AccAddress, amount sdk.Coins, indexes SupplyIntere
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Validate deposit validation
|
||||||
|
func (d Deposit) Validate() error {
|
||||||
|
if d.Depositor.Empty() {
|
||||||
|
return fmt.Errorf("Depositor cannot be empty")
|
||||||
|
}
|
||||||
|
if !d.Amount.IsValid() {
|
||||||
|
return fmt.Errorf("Invalid deposit coins: %s", d.Amount)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := d.Index.Validate(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d Deposit) String() string {
|
||||||
|
return fmt.Sprintf(`Deposit:
|
||||||
|
Depositor: %s
|
||||||
|
Amount: %s
|
||||||
|
Index: %s
|
||||||
|
`, d.Depositor, d.Amount, d.Index)
|
||||||
|
}
|
||||||
|
|
||||||
// Deposits is a slice of Deposit
|
// Deposits is a slice of Deposit
|
||||||
type Deposits []Deposit
|
type Deposits []Deposit
|
||||||
|
|
||||||
|
// Validate validates Deposits
|
||||||
|
func (ds Deposits) Validate() error {
|
||||||
|
depositDupMap := make(map[string]Deposit)
|
||||||
|
for _, d := range ds {
|
||||||
|
if err := d.Validate(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
dup, ok := depositDupMap[d.Depositor.String()]
|
||||||
|
if ok {
|
||||||
|
return fmt.Errorf("duplicate depositor: %s\n%s", d, dup)
|
||||||
|
}
|
||||||
|
depositDupMap[d.Depositor.String()] = d
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// SupplyInterestFactor defines an individual borrow interest factor
|
// SupplyInterestFactor defines an individual borrow interest factor
|
||||||
type SupplyInterestFactor struct {
|
type SupplyInterestFactor struct {
|
||||||
Denom string `json:"denom" yaml:"denom"`
|
Denom string `json:"denom" yaml:"denom"`
|
||||||
@ -37,5 +80,40 @@ func NewSupplyInterestFactor(denom string, value sdk.Dec) SupplyInterestFactor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Validate validates SupplyInterestFactor values
|
||||||
|
func (sif SupplyInterestFactor) Validate() error {
|
||||||
|
if strings.TrimSpace(sif.Denom) == "" {
|
||||||
|
return fmt.Errorf("supply interest factor denom cannot be empty")
|
||||||
|
}
|
||||||
|
if sif.Value.IsNegative() {
|
||||||
|
return fmt.Errorf("supply interest factor value cannot be negative: %s", sif)
|
||||||
|
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sif SupplyInterestFactor) String() string {
|
||||||
|
return fmt.Sprintf(`[%s,%s]
|
||||||
|
`, sif.Denom, sif.Value)
|
||||||
|
}
|
||||||
|
|
||||||
// SupplyInterestFactors is a slice of SupplyInterestFactor, because Amino won't marshal maps
|
// SupplyInterestFactors is a slice of SupplyInterestFactor, because Amino won't marshal maps
|
||||||
type SupplyInterestFactors []SupplyInterestFactor
|
type SupplyInterestFactors []SupplyInterestFactor
|
||||||
|
|
||||||
|
// Validate validates SupplyInterestFactors
|
||||||
|
func (sifs SupplyInterestFactors) Validate() error {
|
||||||
|
for _, sif := range sifs {
|
||||||
|
if err := sif.Validate(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sifs SupplyInterestFactors) String() string {
|
||||||
|
out := ""
|
||||||
|
for _, sif := range sifs {
|
||||||
|
out += sif.String()
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
@ -5,6 +5,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
tmtime "github.com/tendermint/tendermint/types/time"
|
tmtime "github.com/tendermint/tendermint/types/time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -15,23 +16,40 @@ var (
|
|||||||
|
|
||||||
// GenesisState is the state that must be provided at genesis.
|
// GenesisState is the state that must be provided at genesis.
|
||||||
type GenesisState struct {
|
type GenesisState struct {
|
||||||
Params Params `json:"params" yaml:"params"`
|
Params Params `json:"params" yaml:"params"`
|
||||||
PreviousBlockTime time.Time `json:"previous_block_time" yaml:"previous_block_time"`
|
PreviousAccumulationTimes GenesisAccumulationTimes `json:"previous_accumulation_times" yaml:"previous_accumulation_times"`
|
||||||
|
Deposits Deposits `json:"deposits" yaml:"deposits"`
|
||||||
|
Borrows Borrows `json:"borrows" yaml:"borrows"`
|
||||||
|
TotalSupplied sdk.Coins `json:"total_supplied" yaml:"total_supplied"`
|
||||||
|
TotalBorrowed sdk.Coins `json:"total_borrowed" yaml:"total_borrowed"`
|
||||||
|
TotalReserves sdk.Coins `json:"total_reserves" yaml:"total_reserves"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewGenesisState returns a new genesis state
|
// NewGenesisState returns a new genesis state
|
||||||
func NewGenesisState(params Params, previousBlockTime time.Time) GenesisState {
|
func NewGenesisState(
|
||||||
|
params Params, prevAccumulationTimes GenesisAccumulationTimes, deposits Deposits,
|
||||||
|
borrows Borrows, totalSupplied, totalBorrowed, totalReserves sdk.Coins) GenesisState {
|
||||||
return GenesisState{
|
return GenesisState{
|
||||||
Params: params,
|
Params: params,
|
||||||
PreviousBlockTime: previousBlockTime,
|
PreviousAccumulationTimes: prevAccumulationTimes,
|
||||||
|
Deposits: deposits,
|
||||||
|
Borrows: borrows,
|
||||||
|
TotalSupplied: totalSupplied,
|
||||||
|
TotalBorrowed: totalBorrowed,
|
||||||
|
TotalReserves: totalReserves,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// DefaultGenesisState returns a default genesis state
|
// DefaultGenesisState returns a default genesis state
|
||||||
func DefaultGenesisState() GenesisState {
|
func DefaultGenesisState() GenesisState {
|
||||||
return GenesisState{
|
return GenesisState{
|
||||||
Params: DefaultParams(),
|
Params: DefaultParams(),
|
||||||
PreviousBlockTime: DefaultPreviousBlockTime,
|
PreviousAccumulationTimes: DefaultAccumulationTimes,
|
||||||
|
Deposits: DefaultDeposits,
|
||||||
|
Borrows: DefaultBorrows,
|
||||||
|
TotalSupplied: DefaultTotalSupplied,
|
||||||
|
TotalBorrowed: DefaultTotalBorrowed,
|
||||||
|
TotalReserves: DefaultTotalReserves,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42,8 +60,24 @@ func (gs GenesisState) Validate() error {
|
|||||||
if err := gs.Params.Validate(); err != nil {
|
if err := gs.Params.Validate(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if gs.PreviousBlockTime.Equal(time.Time{}) {
|
if err := gs.PreviousAccumulationTimes.Validate(); err != nil {
|
||||||
return fmt.Errorf("previous block time not set")
|
return err
|
||||||
|
}
|
||||||
|
if err := gs.Deposits.Validate(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := gs.Borrows.Validate(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if !gs.TotalSupplied.IsValid() {
|
||||||
|
return fmt.Errorf("invalid total supplied coins: %s", gs.TotalSupplied)
|
||||||
|
}
|
||||||
|
if !gs.TotalBorrowed.IsValid() {
|
||||||
|
return fmt.Errorf("invalid total borrowed coins: %s", gs.TotalBorrowed)
|
||||||
|
}
|
||||||
|
if !gs.TotalReserves.IsValid() {
|
||||||
|
return fmt.Errorf("invalid total reserves coins: %s", gs.TotalReserves)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -59,3 +93,45 @@ func (gs GenesisState) Equal(gs2 GenesisState) bool {
|
|||||||
func (gs GenesisState) IsEmpty() bool {
|
func (gs GenesisState) IsEmpty() bool {
|
||||||
return gs.Equal(GenesisState{})
|
return gs.Equal(GenesisState{})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GenesisAccumulationTime stores the previous distribution time and its corresponding denom
|
||||||
|
type GenesisAccumulationTime struct {
|
||||||
|
CollateralType string `json:"collateral_type" yaml:"collateral_type"`
|
||||||
|
PreviousAccumulationTime time.Time `json:"previous_accumulation_time" yaml:"previous_accumulation_time"`
|
||||||
|
SupplyInterestFactor sdk.Dec `json:"supply_interest_factor" yaml:"supply_interest_factor"`
|
||||||
|
BorrowInterestFactor sdk.Dec `json:"borrow_interest_factor" yaml:"borrow_interest_factor"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewGenesisAccumulationTime returns a new GenesisAccumulationTime
|
||||||
|
func NewGenesisAccumulationTime(ctype string, prevTime time.Time, supplyFactor, borrowFactor sdk.Dec) GenesisAccumulationTime {
|
||||||
|
return GenesisAccumulationTime{
|
||||||
|
CollateralType: ctype,
|
||||||
|
PreviousAccumulationTime: prevTime,
|
||||||
|
SupplyInterestFactor: supplyFactor,
|
||||||
|
BorrowInterestFactor: borrowFactor,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GenesisAccumulationTimes slice of GenesisAccumulationTime
|
||||||
|
type GenesisAccumulationTimes []GenesisAccumulationTime
|
||||||
|
|
||||||
|
// Validate performs validation of GenesisAccumulationTimes
|
||||||
|
func (gats GenesisAccumulationTimes) Validate() error {
|
||||||
|
for _, gat := range gats {
|
||||||
|
if err := gat.Validate(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate performs validation of GenesisAccumulationTime
|
||||||
|
func (gat GenesisAccumulationTime) Validate() error {
|
||||||
|
if gat.SupplyInterestFactor.LT(sdk.OneDec()) {
|
||||||
|
return fmt.Errorf("supply interest factor should be ≥ 1.0, is %s for %s", gat.SupplyInterestFactor, gat.CollateralType)
|
||||||
|
}
|
||||||
|
if gat.BorrowInterestFactor.LT(sdk.OneDec()) {
|
||||||
|
return fmt.Errorf("borrow interest factor should be ≥ 1.0, is %s for %s", gat.BorrowInterestFactor, gat.CollateralType)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
@ -7,9 +7,19 @@ import (
|
|||||||
|
|
||||||
"github.com/stretchr/testify/suite"
|
"github.com/stretchr/testify/suite"
|
||||||
|
|
||||||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
|
||||||
"github.com/kava-labs/kava/x/hard/types"
|
"github.com/kava-labs/kava/x/hard/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
USDX_CF = 1000000
|
||||||
|
KAVA_CF = 1000000
|
||||||
|
BTCB_CF = 100000000
|
||||||
|
BNB_CF = 100000000
|
||||||
|
BUSD_CF = 100000000
|
||||||
|
)
|
||||||
|
|
||||||
type GenesisTestSuite struct {
|
type GenesisTestSuite struct {
|
||||||
suite.Suite
|
suite.Suite
|
||||||
}
|
}
|
||||||
@ -17,7 +27,12 @@ type GenesisTestSuite struct {
|
|||||||
func (suite *GenesisTestSuite) TestGenesisValidation() {
|
func (suite *GenesisTestSuite) TestGenesisValidation() {
|
||||||
type args struct {
|
type args struct {
|
||||||
params types.Params
|
params types.Params
|
||||||
pbt time.Time
|
gats types.GenesisAccumulationTimes
|
||||||
|
deps types.Deposits
|
||||||
|
brws types.Borrows
|
||||||
|
ts sdk.Coins
|
||||||
|
tb sdk.Coins
|
||||||
|
tr sdk.Coins
|
||||||
}
|
}
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
name string
|
name string
|
||||||
@ -29,7 +44,12 @@ func (suite *GenesisTestSuite) TestGenesisValidation() {
|
|||||||
name: "default",
|
name: "default",
|
||||||
args: args{
|
args: args{
|
||||||
params: types.DefaultParams(),
|
params: types.DefaultParams(),
|
||||||
pbt: types.DefaultPreviousBlockTime,
|
gats: types.DefaultAccumulationTimes,
|
||||||
|
deps: types.DefaultDeposits,
|
||||||
|
brws: types.DefaultBorrows,
|
||||||
|
ts: types.DefaultTotalSupplied,
|
||||||
|
tb: types.DefaultTotalBorrowed,
|
||||||
|
tr: types.DefaultTotalReserves,
|
||||||
},
|
},
|
||||||
expectPass: true,
|
expectPass: true,
|
||||||
expectedErr: "",
|
expectedErr: "",
|
||||||
@ -37,25 +57,28 @@ func (suite *GenesisTestSuite) TestGenesisValidation() {
|
|||||||
{
|
{
|
||||||
name: "valid",
|
name: "valid",
|
||||||
args: args{
|
args: args{
|
||||||
params: types.NewParams(true, types.DefaultMoneyMarkets, types.DefaultCheckLtvIndexCount),
|
params: types.NewParams(
|
||||||
pbt: time.Date(2020, 10, 8, 12, 0, 0, 0, time.UTC),
|
types.MoneyMarkets{
|
||||||
|
types.NewMoneyMarket("usdx", types.NewBorrowLimit(true, sdk.MustNewDecFromStr("100000000000"), sdk.MustNewDecFromStr("1")), "usdx:usd", sdk.NewInt(USDX_CF), sdk.NewInt(USDX_CF*1000), types.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
||||||
|
},
|
||||||
|
10,
|
||||||
|
),
|
||||||
|
gats: types.GenesisAccumulationTimes{
|
||||||
|
types.NewGenesisAccumulationTime("usdx", time.Date(2020, 12, 15, 14, 0, 0, 0, time.UTC), sdk.OneDec(), sdk.OneDec()),
|
||||||
|
},
|
||||||
|
deps: types.DefaultDeposits,
|
||||||
|
brws: types.DefaultBorrows,
|
||||||
|
ts: sdk.Coins{},
|
||||||
|
tb: sdk.Coins{},
|
||||||
|
tr: sdk.Coins{},
|
||||||
},
|
},
|
||||||
expectPass: true,
|
expectPass: true,
|
||||||
expectedErr: "",
|
expectedErr: "",
|
||||||
},
|
},
|
||||||
{
|
|
||||||
name: "invalid previous blocktime",
|
|
||||||
args: args{
|
|
||||||
params: types.NewParams(true, types.DefaultMoneyMarkets, types.DefaultCheckLtvIndexCount),
|
|
||||||
pbt: time.Time{},
|
|
||||||
},
|
|
||||||
expectPass: false,
|
|
||||||
expectedErr: "previous block time not set",
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
suite.Run(tc.name, func() {
|
suite.Run(tc.name, func() {
|
||||||
gs := types.NewGenesisState(tc.args.params, tc.args.pbt)
|
gs := types.NewGenesisState(tc.args.params, tc.args.gats, tc.args.deps, tc.args.brws, tc.args.ts, tc.args.tb, tc.args.tr)
|
||||||
err := gs.Validate()
|
err := gs.Validate()
|
||||||
if tc.expectPass {
|
if tc.expectPass {
|
||||||
suite.NoError(err)
|
suite.NoError(err)
|
||||||
|
@ -11,18 +11,21 @@ import (
|
|||||||
|
|
||||||
// Parameter keys and default values
|
// Parameter keys and default values
|
||||||
var (
|
var (
|
||||||
KeyActive = []byte("Active")
|
|
||||||
KeyMoneyMarkets = []byte("MoneyMarkets")
|
KeyMoneyMarkets = []byte("MoneyMarkets")
|
||||||
KeyCheckLtvIndexCount = []byte("CheckLtvIndexCount")
|
KeyCheckLtvIndexCount = []byte("CheckLtvIndexCount")
|
||||||
DefaultActive = true
|
|
||||||
DefaultMoneyMarkets = MoneyMarkets{}
|
DefaultMoneyMarkets = MoneyMarkets{}
|
||||||
DefaultCheckLtvIndexCount = 10
|
DefaultCheckLtvIndexCount = 10
|
||||||
GovDenom = cdptypes.DefaultGovDenom
|
GovDenom = cdptypes.DefaultGovDenom
|
||||||
|
DefaultAccumulationTimes = GenesisAccumulationTimes{}
|
||||||
|
DefaultTotalSupplied = sdk.Coins{}
|
||||||
|
DefaultTotalBorrowed = sdk.Coins{}
|
||||||
|
DefaultTotalReserves = sdk.Coins{}
|
||||||
|
DefaultDeposits = Deposits{}
|
||||||
|
DefaultBorrows = Borrows{}
|
||||||
)
|
)
|
||||||
|
|
||||||
// Params governance parameters for hard module
|
// Params governance parameters for hard module
|
||||||
type Params struct {
|
type Params struct {
|
||||||
Active bool `json:"active" yaml:"active"`
|
|
||||||
MoneyMarkets MoneyMarkets `json:"money_markets" yaml:"money_markets"`
|
MoneyMarkets MoneyMarkets `json:"money_markets" yaml:"money_markets"`
|
||||||
CheckLtvIndexCount int `json:"check_ltv_index_count" yaml:"check_ltv_index_count"`
|
CheckLtvIndexCount int `json:"check_ltv_index_count" yaml:"check_ltv_index_count"`
|
||||||
}
|
}
|
||||||
@ -229,9 +232,8 @@ func (irm InterestRateModel) Equal(irmCompareTo InterestRateModel) bool {
|
|||||||
type InterestRateModels []InterestRateModel
|
type InterestRateModels []InterestRateModel
|
||||||
|
|
||||||
// NewParams returns a new params object
|
// NewParams returns a new params object
|
||||||
func NewParams(active bool, moneyMarkets MoneyMarkets, checkLtvIndexCount int) Params {
|
func NewParams(moneyMarkets MoneyMarkets, checkLtvIndexCount int) Params {
|
||||||
return Params{
|
return Params{
|
||||||
Active: active,
|
|
||||||
MoneyMarkets: moneyMarkets,
|
MoneyMarkets: moneyMarkets,
|
||||||
CheckLtvIndexCount: checkLtvIndexCount,
|
CheckLtvIndexCount: checkLtvIndexCount,
|
||||||
}
|
}
|
||||||
@ -239,16 +241,15 @@ func NewParams(active bool, moneyMarkets MoneyMarkets, checkLtvIndexCount int) P
|
|||||||
|
|
||||||
// DefaultParams returns default params for hard module
|
// DefaultParams returns default params for hard module
|
||||||
func DefaultParams() Params {
|
func DefaultParams() Params {
|
||||||
return NewParams(DefaultActive, DefaultMoneyMarkets, DefaultCheckLtvIndexCount)
|
return NewParams(DefaultMoneyMarkets, DefaultCheckLtvIndexCount)
|
||||||
}
|
}
|
||||||
|
|
||||||
// String implements fmt.Stringer
|
// String implements fmt.Stringer
|
||||||
func (p Params) String() string {
|
func (p Params) String() string {
|
||||||
return fmt.Sprintf(`Params:
|
return fmt.Sprintf(`Params:
|
||||||
Active: %t
|
|
||||||
Money Markets %v
|
Money Markets %v
|
||||||
Check LTV Index Count: %v`,
|
Check LTV Index Count: %v`,
|
||||||
p.Active, p.MoneyMarkets, p.CheckLtvIndexCount)
|
p.MoneyMarkets, p.CheckLtvIndexCount)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ParamKeyTable Key declaration for parameters
|
// ParamKeyTable Key declaration for parameters
|
||||||
@ -259,7 +260,6 @@ func ParamKeyTable() params.KeyTable {
|
|||||||
// ParamSetPairs implements the ParamSet interface and returns all the key/value pairs
|
// ParamSetPairs implements the ParamSet interface and returns all the key/value pairs
|
||||||
func (p *Params) ParamSetPairs() params.ParamSetPairs {
|
func (p *Params) ParamSetPairs() params.ParamSetPairs {
|
||||||
return params.ParamSetPairs{
|
return params.ParamSetPairs{
|
||||||
params.NewParamSetPair(KeyActive, &p.Active, validateActiveParam),
|
|
||||||
params.NewParamSetPair(KeyMoneyMarkets, &p.MoneyMarkets, validateMoneyMarketParams),
|
params.NewParamSetPair(KeyMoneyMarkets, &p.MoneyMarkets, validateMoneyMarketParams),
|
||||||
params.NewParamSetPair(KeyCheckLtvIndexCount, &p.CheckLtvIndexCount, validateCheckLtvIndexCount),
|
params.NewParamSetPair(KeyCheckLtvIndexCount, &p.CheckLtvIndexCount, validateCheckLtvIndexCount),
|
||||||
}
|
}
|
||||||
@ -267,9 +267,6 @@ func (p *Params) ParamSetPairs() params.ParamSetPairs {
|
|||||||
|
|
||||||
// Validate checks that the parameters have valid values.
|
// Validate checks that the parameters have valid values.
|
||||||
func (p Params) Validate() error {
|
func (p Params) Validate() error {
|
||||||
if err := validateActiveParam(p.Active); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := validateMoneyMarketParams(p.MoneyMarkets); err != nil {
|
if err := validateMoneyMarketParams(p.MoneyMarkets); err != nil {
|
||||||
return err
|
return err
|
||||||
@ -278,15 +275,6 @@ func (p Params) Validate() error {
|
|||||||
return validateCheckLtvIndexCount(p.CheckLtvIndexCount)
|
return validateCheckLtvIndexCount(p.CheckLtvIndexCount)
|
||||||
}
|
}
|
||||||
|
|
||||||
func validateActiveParam(i interface{}) error {
|
|
||||||
_, ok := i.(bool)
|
|
||||||
if !ok {
|
|
||||||
return fmt.Errorf("invalid parameter type: %T", i)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func validateMoneyMarketParams(i interface{}) error {
|
func validateMoneyMarketParams(i interface{}) error {
|
||||||
mm, ok := i.(MoneyMarkets)
|
mm, ok := i.(MoneyMarkets)
|
||||||
if !ok {
|
if !ok {
|
||||||
|
@ -17,7 +17,6 @@ func (suite *ParamTestSuite) TestParamValidation() {
|
|||||||
type args struct {
|
type args struct {
|
||||||
mms types.MoneyMarkets
|
mms types.MoneyMarkets
|
||||||
ltvCounter int
|
ltvCounter int
|
||||||
active bool
|
|
||||||
}
|
}
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
name string
|
name string
|
||||||
@ -27,18 +26,9 @@ func (suite *ParamTestSuite) TestParamValidation() {
|
|||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "default",
|
name: "default",
|
||||||
args: args{
|
|
||||||
active: types.DefaultActive,
|
|
||||||
},
|
|
||||||
expectPass: true,
|
|
||||||
expectedErr: "",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "valid",
|
|
||||||
args: args{
|
args: args{
|
||||||
mms: types.DefaultMoneyMarkets,
|
mms: types.DefaultMoneyMarkets,
|
||||||
ltvCounter: 10,
|
ltvCounter: types.DefaultCheckLtvIndexCount,
|
||||||
active: true,
|
|
||||||
},
|
},
|
||||||
expectPass: true,
|
expectPass: true,
|
||||||
expectedErr: "",
|
expectedErr: "",
|
||||||
@ -46,7 +36,7 @@ func (suite *ParamTestSuite) TestParamValidation() {
|
|||||||
}
|
}
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
suite.Run(tc.name, func() {
|
suite.Run(tc.name, func() {
|
||||||
params := types.NewParams(tc.args.active, tc.args.mms, tc.args.ltvCounter)
|
params := types.NewParams(tc.args.mms, tc.args.ltvCounter)
|
||||||
err := params.Validate()
|
err := params.Validate()
|
||||||
if tc.expectPass {
|
if tc.expectPass {
|
||||||
suite.NoError(err)
|
suite.NoError(err)
|
||||||
|
@ -157,7 +157,6 @@ func NewHardGenStateMulti() app.GenesisState {
|
|||||||
borrowLimit := sdk.NewDec(1000000000000000)
|
borrowLimit := sdk.NewDec(1000000000000000)
|
||||||
|
|
||||||
hardGS := hard.NewGenesisState(hard.NewParams(
|
hardGS := hard.NewGenesisState(hard.NewParams(
|
||||||
true,
|
|
||||||
hard.MoneyMarkets{
|
hard.MoneyMarkets{
|
||||||
hard.NewMoneyMarket("usdx", hard.NewBorrowLimit(false, borrowLimit, loanToValue), "usdx:usd", sdk.NewInt(1000000), sdk.NewInt(USDX_CF*1000), hard.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
hard.NewMoneyMarket("usdx", hard.NewBorrowLimit(false, borrowLimit, loanToValue), "usdx:usd", sdk.NewInt(1000000), sdk.NewInt(USDX_CF*1000), hard.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
||||||
hard.NewMoneyMarket("ukava", hard.NewBorrowLimit(false, borrowLimit, loanToValue), "kava:usd", sdk.NewInt(1000000), sdk.NewInt(KAVA_CF*1000), hard.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
hard.NewMoneyMarket("ukava", hard.NewBorrowLimit(false, borrowLimit, loanToValue), "kava:usd", sdk.NewInt(1000000), sdk.NewInt(KAVA_CF*1000), hard.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
||||||
@ -166,7 +165,9 @@ func NewHardGenStateMulti() app.GenesisState {
|
|||||||
hard.NewMoneyMarket("xrp", hard.NewBorrowLimit(false, borrowLimit, loanToValue), "xrp:usd", sdk.NewInt(1000000), sdk.NewInt(BTCB_CF*1000), hard.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
hard.NewMoneyMarket("xrp", hard.NewBorrowLimit(false, borrowLimit, loanToValue), "xrp:usd", sdk.NewInt(1000000), sdk.NewInt(BTCB_CF*1000), hard.NewInterestRateModel(sdk.MustNewDecFromStr("0.05"), sdk.MustNewDecFromStr("2"), sdk.MustNewDecFromStr("0.8"), sdk.MustNewDecFromStr("10")), sdk.MustNewDecFromStr("0.05"), sdk.ZeroDec()),
|
||||||
},
|
},
|
||||||
0, // LTV counter
|
0, // LTV counter
|
||||||
), hard.DefaultPreviousBlockTime)
|
), hard.DefaultAccumulationTimes, hard.DefaultDeposits, hard.DefaultBorrows,
|
||||||
|
hard.DefaultTotalSupplied, hard.DefaultTotalBorrowed, hard.DefaultTotalReserves,
|
||||||
|
)
|
||||||
|
|
||||||
return app.GenesisState{hard.ModuleName: hard.ModuleCdc.MustMarshalJSON(hardGS)}
|
return app.GenesisState{hard.ModuleName: hard.ModuleCdc.MustMarshalJSON(hardGS)}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user