mirror of
https://github.com/0glabs/0g-chain.git
synced 2024-12-26 16:25:21 +00:00
[hard] Update deposit type to use sdk.Coins (#744)
* update deposits to use sdk.Coins * update tests * update liquidation tests
This commit is contained in:
parent
83a5f51c11
commit
06fd215de1
@ -58,7 +58,6 @@ var (
|
|||||||
ClaimKey = types.ClaimKey
|
ClaimKey = types.ClaimKey
|
||||||
DefaultGenesisState = types.DefaultGenesisState
|
DefaultGenesisState = types.DefaultGenesisState
|
||||||
DefaultParams = types.DefaultParams
|
DefaultParams = types.DefaultParams
|
||||||
DepositKey = types.DepositKey
|
|
||||||
DepositTypeIteratorKey = types.DepositTypeIteratorKey
|
DepositTypeIteratorKey = types.DepositTypeIteratorKey
|
||||||
GetTotalVestingPeriodLength = types.GetTotalVestingPeriodLength
|
GetTotalVestingPeriodLength = types.GetTotalVestingPeriodLength
|
||||||
NewClaim = types.NewClaim
|
NewClaim = types.NewClaim
|
||||||
|
@ -52,7 +52,7 @@ func getCmdDeposit(cdc *codec.Codec) *cobra.Command {
|
|||||||
inBuf := bufio.NewReader(cmd.InOrStdin())
|
inBuf := bufio.NewReader(cmd.InOrStdin())
|
||||||
cliCtx := context.NewCLIContext().WithCodec(cdc)
|
cliCtx := context.NewCLIContext().WithCodec(cdc)
|
||||||
txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc))
|
txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc))
|
||||||
amount, err := sdk.ParseCoin(args[0])
|
amount, err := sdk.ParseCoins(args[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -77,7 +77,7 @@ func getCmdWithdraw(cdc *codec.Codec) *cobra.Command {
|
|||||||
inBuf := bufio.NewReader(cmd.InOrStdin())
|
inBuf := bufio.NewReader(cmd.InOrStdin())
|
||||||
cliCtx := context.NewCLIContext().WithCodec(cdc)
|
cliCtx := context.NewCLIContext().WithCodec(cdc)
|
||||||
txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc))
|
txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc))
|
||||||
amount, err := sdk.ParseCoin(args[0])
|
amount, err := sdk.ParseCoins(args[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ func RegisterRoutes(cliCtx context.CLIContext, r *mux.Router) {
|
|||||||
type PostCreateDepositReq struct {
|
type PostCreateDepositReq struct {
|
||||||
BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"`
|
BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"`
|
||||||
From sdk.AccAddress `json:"from" yaml:"from"`
|
From sdk.AccAddress `json:"from" yaml:"from"`
|
||||||
Amount sdk.Coin `json:"amount" yaml:"amount"`
|
Amount sdk.Coins `json:"amount" yaml:"amount"`
|
||||||
DepositType string `json:"deposit_type" yaml:"deposit_type"`
|
DepositType string `json:"deposit_type" yaml:"deposit_type"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,7 +35,7 @@ type PostCreateDepositReq struct {
|
|||||||
type PostCreateWithdrawReq struct {
|
type PostCreateWithdrawReq struct {
|
||||||
BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"`
|
BaseReq rest.BaseReq `json:"base_req" yaml:"base_req"`
|
||||||
From sdk.AccAddress `json:"from" yaml:"from"`
|
From sdk.AccAddress `json:"from" yaml:"from"`
|
||||||
Amount sdk.Coin `json:"amount" yaml:"amount"`
|
Amount sdk.Coins `json:"amount" yaml:"amount"`
|
||||||
DepositType string `json:"deposit_type" yaml:"deposit_type"`
|
DepositType string `json:"deposit_type" yaml:"deposit_type"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -180,20 +180,20 @@ func (k Keeper) ValidateBorrow(ctx sdk.Context, borrower sdk.AccAddress, amount
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get the total borrowable USD amount at user's existing deposits
|
// Get the total borrowable USD amount at user's existing deposits
|
||||||
deposits := k.GetDepositsByUser(ctx, borrower)
|
deposit, found := k.GetDeposit(ctx, borrower)
|
||||||
if len(deposits) == 0 {
|
if !found {
|
||||||
return sdkerrors.Wrapf(types.ErrDepositsNotFound, "no deposits found for %s", borrower)
|
return sdkerrors.Wrapf(types.ErrDepositsNotFound, "no deposits found for %s", borrower)
|
||||||
}
|
}
|
||||||
totalBorrowableAmount := sdk.ZeroDec()
|
totalBorrowableAmount := sdk.ZeroDec()
|
||||||
for _, deposit := range deposits {
|
for _, depCoin := range deposit.Amount {
|
||||||
moneyMarket, ok := moneyMarketCache[deposit.Amount.Denom]
|
moneyMarket, ok := moneyMarketCache[depCoin.Denom]
|
||||||
// Fetch money market and store in local cache
|
// Fetch money market and store in local cache
|
||||||
if !ok {
|
if !ok {
|
||||||
newMoneyMarket, found := k.GetMoneyMarketParam(ctx, deposit.Amount.Denom)
|
newMoneyMarket, found := k.GetMoneyMarketParam(ctx, depCoin.Denom)
|
||||||
if !found {
|
if !found {
|
||||||
return sdkerrors.Wrapf(types.ErrMarketNotFound, "no market found for denom %s", deposit.Amount.Denom)
|
return sdkerrors.Wrapf(types.ErrMarketNotFound, "no market found for denom %s", depCoin.Denom)
|
||||||
}
|
}
|
||||||
moneyMarketCache[deposit.Amount.Denom] = newMoneyMarket
|
moneyMarketCache[depCoin.Denom] = newMoneyMarket
|
||||||
moneyMarket = newMoneyMarket
|
moneyMarket = newMoneyMarket
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,7 +202,7 @@ func (k Keeper) ValidateBorrow(ctx sdk.Context, borrower sdk.AccAddress, amount
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
sdkerrors.Wrapf(types.ErrPriceNotFound, "no price found for market %s", moneyMarket.SpotMarketID)
|
sdkerrors.Wrapf(types.ErrPriceNotFound, "no price found for market %s", moneyMarket.SpotMarketID)
|
||||||
}
|
}
|
||||||
depositUSDValue := sdk.NewDecFromInt(deposit.Amount.Amount).Quo(sdk.NewDecFromInt(moneyMarket.ConversionFactor)).Mul(assetPriceInfo.Price)
|
depositUSDValue := sdk.NewDecFromInt(depCoin.Amount).Quo(sdk.NewDecFromInt(moneyMarket.ConversionFactor)).Mul(assetPriceInfo.Price)
|
||||||
borrowableAmountForDeposit := depositUSDValue.Mul(moneyMarket.BorrowLimit.LoanToValue)
|
borrowableAmountForDeposit := depositUSDValue.Mul(moneyMarket.BorrowLimit.LoanToValue)
|
||||||
totalBorrowableAmount = totalBorrowableAmount.Add(borrowableAmountForDeposit)
|
totalBorrowableAmount = totalBorrowableAmount.Add(borrowableAmountForDeposit)
|
||||||
}
|
}
|
||||||
|
@ -104,7 +104,7 @@ func (suite *KeeperTestSuite) TestBorrow() {
|
|||||||
priceBNB: sdk.MustNewDecFromStr("0.00"),
|
priceBNB: sdk.MustNewDecFromStr("0.00"),
|
||||||
loanToValueBNB: sdk.MustNewDecFromStr("0.01"),
|
loanToValueBNB: sdk.MustNewDecFromStr("0.01"),
|
||||||
borrower: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
borrower: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||||
depositCoins: []sdk.Coin{sdk.NewCoin("ukava", sdk.NewInt(50*KAVA_CF)), sdk.NewCoin("btcb", sdk.NewInt(0.1*BTCB_CF))},
|
depositCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(50*KAVA_CF)), sdk.NewCoin("btcb", sdk.NewInt(0.1*BTCB_CF))),
|
||||||
borrowCoins: sdk.NewCoins(sdk.NewCoin("usdx", sdk.NewInt(180*USDX_CF))),
|
borrowCoins: sdk.NewCoins(sdk.NewCoin("usdx", sdk.NewInt(180*USDX_CF))),
|
||||||
expectedAccountBalance: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(50*KAVA_CF)), sdk.NewCoin("btcb", sdk.NewInt(99.9*BTCB_CF)), sdk.NewCoin("usdx", sdk.NewInt(180*USDX_CF)), sdk.NewCoin("bnb", sdk.NewInt(100*BNB_CF)), sdk.NewCoin("xyz", sdk.NewInt(1))),
|
expectedAccountBalance: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(50*KAVA_CF)), sdk.NewCoin("btcb", sdk.NewInt(99.9*BTCB_CF)), sdk.NewCoin("usdx", sdk.NewInt(180*USDX_CF)), sdk.NewCoin("bnb", sdk.NewInt(100*BNB_CF)), sdk.NewCoin("xyz", sdk.NewInt(1))),
|
||||||
expectedModAccountBalance: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1050*KAVA_CF)), sdk.NewCoin("usdx", sdk.NewInt(20*USDX_CF)), sdk.NewCoin("btcb", sdk.NewInt(0.1*BTCB_CF)), sdk.NewCoin("busd", sdk.NewInt(100*BUSD_CF))),
|
expectedModAccountBalance: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1050*KAVA_CF)), sdk.NewCoin("usdx", sdk.NewInt(20*USDX_CF)), sdk.NewCoin("btcb", sdk.NewInt(0.1*BTCB_CF)), sdk.NewCoin("busd", sdk.NewInt(100*BUSD_CF))),
|
||||||
@ -125,7 +125,7 @@ func (suite *KeeperTestSuite) TestBorrow() {
|
|||||||
priceBNB: sdk.MustNewDecFromStr("0.00"),
|
priceBNB: sdk.MustNewDecFromStr("0.00"),
|
||||||
loanToValueBNB: sdk.MustNewDecFromStr("0.01"),
|
loanToValueBNB: sdk.MustNewDecFromStr("0.01"),
|
||||||
borrower: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
borrower: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||||
depositCoins: []sdk.Coin{sdk.NewCoin("ukava", sdk.NewInt(50*KAVA_CF)), sdk.NewCoin("btcb", sdk.NewInt(0.1*BTCB_CF))},
|
depositCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(50*KAVA_CF)), sdk.NewCoin("btcb", sdk.NewInt(0.1*BTCB_CF))),
|
||||||
borrowCoins: sdk.NewCoins(sdk.NewCoin("usdx", sdk.NewInt(181*USDX_CF))),
|
borrowCoins: sdk.NewCoins(sdk.NewCoin("usdx", sdk.NewInt(181*USDX_CF))),
|
||||||
expectedAccountBalance: sdk.NewCoins(),
|
expectedAccountBalance: sdk.NewCoins(),
|
||||||
expectedModAccountBalance: sdk.NewCoins(),
|
expectedModAccountBalance: sdk.NewCoins(),
|
||||||
@ -146,7 +146,7 @@ func (suite *KeeperTestSuite) TestBorrow() {
|
|||||||
priceBNB: sdk.MustNewDecFromStr("5.00"),
|
priceBNB: sdk.MustNewDecFromStr("5.00"),
|
||||||
loanToValueBNB: sdk.MustNewDecFromStr("0.8"),
|
loanToValueBNB: sdk.MustNewDecFromStr("0.8"),
|
||||||
borrower: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
borrower: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||||
depositCoins: []sdk.Coin{sdk.NewCoin("bnb", sdk.NewInt(30*BNB_CF)), sdk.NewCoin("ukava", sdk.NewInt(50*KAVA_CF))}, // (50 KAVA x $2.00 price = $100) + (30 BNB x $5.00 price = $150) = $250
|
depositCoins: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(30*BNB_CF)), sdk.NewCoin("ukava", sdk.NewInt(50*KAVA_CF))), // (50 KAVA x $2.00 price = $100) + (30 BNB x $5.00 price = $150) = $250
|
||||||
previousBorrowCoins: sdk.NewCoins(sdk.NewCoin("usdx", sdk.NewInt(99*USDX_CF)), sdk.NewCoin("busd", sdk.NewInt(100*BUSD_CF))),
|
previousBorrowCoins: sdk.NewCoins(sdk.NewCoin("usdx", sdk.NewInt(99*USDX_CF)), sdk.NewCoin("busd", sdk.NewInt(100*BUSD_CF))),
|
||||||
borrowCoins: sdk.NewCoins(sdk.NewCoin("usdx", sdk.NewInt(1*USDX_CF))),
|
borrowCoins: sdk.NewCoins(sdk.NewCoin("usdx", sdk.NewInt(1*USDX_CF))),
|
||||||
expectedAccountBalance: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(50*KAVA_CF)), sdk.NewCoin("btcb", sdk.NewInt(100*BTCB_CF)), sdk.NewCoin("usdx", sdk.NewInt(100*USDX_CF)), sdk.NewCoin("busd", sdk.NewInt(100*BUSD_CF)), sdk.NewCoin("bnb", sdk.NewInt(70*BNB_CF)), sdk.NewCoin("xyz", sdk.NewInt(1))),
|
expectedAccountBalance: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(50*KAVA_CF)), sdk.NewCoin("btcb", sdk.NewInt(100*BTCB_CF)), sdk.NewCoin("usdx", sdk.NewInt(100*USDX_CF)), sdk.NewCoin("busd", sdk.NewInt(100*BUSD_CF)), sdk.NewCoin("bnb", sdk.NewInt(70*BNB_CF)), sdk.NewCoin("xyz", sdk.NewInt(1))),
|
||||||
@ -168,7 +168,7 @@ func (suite *KeeperTestSuite) TestBorrow() {
|
|||||||
priceBNB: sdk.MustNewDecFromStr("5.00"),
|
priceBNB: sdk.MustNewDecFromStr("5.00"),
|
||||||
loanToValueBNB: sdk.MustNewDecFromStr("0.8"),
|
loanToValueBNB: sdk.MustNewDecFromStr("0.8"),
|
||||||
borrower: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
borrower: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||||
depositCoins: []sdk.Coin{sdk.NewCoin("bnb", sdk.NewInt(30*BNB_CF)), sdk.NewCoin("ukava", sdk.NewInt(50*KAVA_CF))}, // (50 KAVA x $2.00 price = $100) + (30 BNB x $5.00 price = $150) = $250
|
depositCoins: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(30*BNB_CF)), sdk.NewCoin("ukava", sdk.NewInt(50*KAVA_CF))), // (50 KAVA x $2.00 price = $100) + (30 BNB x $5.00 price = $150) = $250
|
||||||
previousBorrowCoins: sdk.NewCoins(sdk.NewCoin("usdx", sdk.NewInt(100*USDX_CF)), sdk.NewCoin("busd", sdk.NewInt(100*BUSD_CF))),
|
previousBorrowCoins: sdk.NewCoins(sdk.NewCoin("usdx", sdk.NewInt(100*USDX_CF)), sdk.NewCoin("busd", sdk.NewInt(100*BUSD_CF))),
|
||||||
borrowCoins: sdk.NewCoins(sdk.NewCoin("usdx", sdk.NewInt(1*USDX_CF))),
|
borrowCoins: sdk.NewCoins(sdk.NewCoin("usdx", sdk.NewInt(1*USDX_CF))),
|
||||||
expectedAccountBalance: sdk.NewCoins(),
|
expectedAccountBalance: sdk.NewCoins(),
|
||||||
@ -190,7 +190,7 @@ func (suite *KeeperTestSuite) TestBorrow() {
|
|||||||
priceBNB: sdk.MustNewDecFromStr("0.00"),
|
priceBNB: sdk.MustNewDecFromStr("0.00"),
|
||||||
loanToValueBNB: sdk.MustNewDecFromStr("0.01"),
|
loanToValueBNB: sdk.MustNewDecFromStr("0.01"),
|
||||||
borrower: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
borrower: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||||
depositCoins: []sdk.Coin{sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF))},
|
depositCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF))),
|
||||||
previousBorrowCoins: sdk.NewCoins(),
|
previousBorrowCoins: sdk.NewCoins(),
|
||||||
borrowCoins: sdk.NewCoins(sdk.NewCoin("xyz", sdk.NewInt(1))),
|
borrowCoins: sdk.NewCoins(sdk.NewCoin("xyz", sdk.NewInt(1))),
|
||||||
expectedAccountBalance: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(20*KAVA_CF)), sdk.NewCoin("btcb", sdk.NewInt(100*BTCB_CF)), sdk.NewCoin("bnb", sdk.NewInt(100*BNB_CF)), sdk.NewCoin("xyz", sdk.NewInt(1))),
|
expectedAccountBalance: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(20*KAVA_CF)), sdk.NewCoin("btcb", sdk.NewInt(100*BTCB_CF)), sdk.NewCoin("bnb", sdk.NewInt(100*BNB_CF)), sdk.NewCoin("xyz", sdk.NewInt(1))),
|
||||||
@ -212,7 +212,7 @@ func (suite *KeeperTestSuite) TestBorrow() {
|
|||||||
priceBNB: sdk.MustNewDecFromStr("0.00"),
|
priceBNB: sdk.MustNewDecFromStr("0.00"),
|
||||||
loanToValueBNB: sdk.MustNewDecFromStr("0.01"),
|
loanToValueBNB: sdk.MustNewDecFromStr("0.01"),
|
||||||
borrower: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
borrower: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||||
depositCoins: []sdk.Coin{sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF))},
|
depositCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF))),
|
||||||
previousBorrowCoins: sdk.NewCoins(),
|
previousBorrowCoins: sdk.NewCoins(),
|
||||||
borrowCoins: sdk.NewCoins(sdk.NewCoin("busd", sdk.NewInt(101*BUSD_CF))),
|
borrowCoins: sdk.NewCoins(sdk.NewCoin("busd", sdk.NewInt(101*BUSD_CF))),
|
||||||
expectedAccountBalance: sdk.NewCoins(),
|
expectedAccountBalance: sdk.NewCoins(),
|
||||||
@ -234,7 +234,7 @@ func (suite *KeeperTestSuite) TestBorrow() {
|
|||||||
priceBNB: sdk.MustNewDecFromStr("0.00"),
|
priceBNB: sdk.MustNewDecFromStr("0.00"),
|
||||||
loanToValueBNB: sdk.MustNewDecFromStr("0.01"),
|
loanToValueBNB: sdk.MustNewDecFromStr("0.01"),
|
||||||
borrower: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
borrower: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||||
depositCoins: []sdk.Coin{sdk.NewCoin("ukava", sdk.NewInt(50*KAVA_CF))},
|
depositCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(50*KAVA_CF))),
|
||||||
previousBorrowCoins: sdk.NewCoins(),
|
previousBorrowCoins: sdk.NewCoins(),
|
||||||
borrowCoins: sdk.NewCoins(sdk.NewCoin("usdx", sdk.NewInt(25*USDX_CF))),
|
borrowCoins: sdk.NewCoins(sdk.NewCoin("usdx", sdk.NewInt(25*USDX_CF))),
|
||||||
expectedAccountBalance: sdk.NewCoins(),
|
expectedAccountBalance: sdk.NewCoins(),
|
||||||
@ -353,13 +353,8 @@ func (suite *KeeperTestSuite) TestBorrow() {
|
|||||||
// Run BeginBlocker once to transition MoneyMarkets
|
// Run BeginBlocker once to transition MoneyMarkets
|
||||||
harvest.BeginBlocker(suite.ctx, suite.keeper)
|
harvest.BeginBlocker(suite.ctx, suite.keeper)
|
||||||
|
|
||||||
// Deposit coins to harvest
|
err = suite.keeper.Deposit(suite.ctx, tc.args.borrower, tc.args.depositCoins)
|
||||||
depositedCoins := sdk.NewCoins()
|
|
||||||
for _, depositCoin := range tc.args.depositCoins {
|
|
||||||
err = suite.keeper.Deposit(suite.ctx, tc.args.borrower, depositCoin)
|
|
||||||
suite.Require().NoError(err)
|
suite.Require().NoError(err)
|
||||||
depositedCoins.Add(depositCoin)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Execute user's previous borrows
|
// Execute user's previous borrows
|
||||||
err = suite.keeper.Borrow(suite.ctx, tc.args.borrower, tc.args.previousBorrowCoins)
|
err = suite.keeper.Borrow(suite.ctx, tc.args.borrower, tc.args.previousBorrowCoins)
|
||||||
@ -377,11 +372,11 @@ func (suite *KeeperTestSuite) TestBorrow() {
|
|||||||
|
|
||||||
// Check borrower balance
|
// Check borrower balance
|
||||||
acc := suite.getAccount(tc.args.borrower)
|
acc := suite.getAccount(tc.args.borrower)
|
||||||
suite.Require().Equal(tc.args.expectedAccountBalance.Sub(depositedCoins), acc.GetCoins())
|
suite.Require().Equal(tc.args.expectedAccountBalance, acc.GetCoins())
|
||||||
|
|
||||||
// Check module account balance
|
// Check module account balance
|
||||||
mAcc := suite.getModuleAccount(types.ModuleAccountName)
|
mAcc := suite.getModuleAccount(types.ModuleAccountName)
|
||||||
suite.Require().Equal(tc.args.expectedModAccountBalance.Add(depositedCoins...), mAcc.GetCoins())
|
suite.Require().Equal(tc.args.expectedModAccountBalance, mAcc.GetCoins())
|
||||||
|
|
||||||
// Check that borrow struct is in store
|
// Check that borrow struct is in store
|
||||||
_, f := suite.keeper.GetBorrow(suite.ctx, tc.args.borrower)
|
_, f := suite.keeper.GetBorrow(suite.ctx, tc.args.borrower)
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package keeper
|
package keeper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
||||||
supplyExported "github.com/cosmos/cosmos-sdk/x/supply/exported"
|
supplyExported "github.com/cosmos/cosmos-sdk/x/supply/exported"
|
||||||
@ -9,7 +11,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Deposit deposit
|
// Deposit deposit
|
||||||
func (k Keeper) Deposit(ctx sdk.Context, depositor sdk.AccAddress, amount sdk.Coin) error {
|
func (k Keeper) Deposit(ctx sdk.Context, depositor sdk.AccAddress, coins sdk.Coins) error {
|
||||||
// Get current stored LTV based on stored borrows/deposits
|
// Get current stored LTV based on stored borrows/deposits
|
||||||
prevLtv, shouldRemoveIndex, err := k.GetStoreLTV(ctx, depositor)
|
prevLtv, shouldRemoveIndex, err := k.GetStoreLTV(ctx, depositor)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -18,21 +20,35 @@ func (k Keeper) Deposit(ctx sdk.Context, depositor sdk.AccAddress, amount sdk.Co
|
|||||||
|
|
||||||
k.SyncOutstandingInterest(ctx, depositor)
|
k.SyncOutstandingInterest(ctx, depositor)
|
||||||
|
|
||||||
err = k.ValidateDeposit(ctx, amount)
|
err = k.ValidateDeposit(ctx, coins)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
err = k.supplyKeeper.SendCoinsFromAccountToModule(ctx, depositor, types.ModuleAccountName, sdk.NewCoins(amount))
|
err = k.supplyKeeper.SendCoinsFromAccountToModule(ctx, depositor, types.ModuleAccountName, coins)
|
||||||
|
if err != nil {
|
||||||
|
if strings.Contains(err.Error(), "insufficient account funds") {
|
||||||
|
accCoins := k.accountKeeper.GetAccount(ctx, depositor).SpendableCoins(ctx.BlockTime())
|
||||||
|
for _, coin := range coins {
|
||||||
|
_, isNegative := accCoins.SafeSub(sdk.NewCoins(coin))
|
||||||
|
if isNegative {
|
||||||
|
return sdkerrors.Wrapf(types.ErrBorrowExceedsAvailableBalance,
|
||||||
|
"insufficient funds: the requested deposit amount of %s exceeds the total available account funds of %s%s",
|
||||||
|
coin, accCoins.AmountOf(coin.Denom), coin.Denom,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
deposit, found := k.GetDeposit(ctx, depositor, amount.Denom)
|
deposit, found := k.GetDeposit(ctx, depositor)
|
||||||
if !found {
|
if !found {
|
||||||
deposit = types.NewDeposit(depositor, amount)
|
deposit = types.NewDeposit(depositor, coins)
|
||||||
} else {
|
} else {
|
||||||
deposit.Amount = deposit.Amount.Add(amount)
|
deposit.Amount = deposit.Amount.Add(coins...)
|
||||||
}
|
}
|
||||||
|
|
||||||
k.SetDeposit(ctx, deposit)
|
k.SetDeposit(ctx, deposit)
|
||||||
@ -42,9 +58,8 @@ func (k Keeper) Deposit(ctx sdk.Context, depositor sdk.AccAddress, amount sdk.Co
|
|||||||
ctx.EventManager().EmitEvent(
|
ctx.EventManager().EmitEvent(
|
||||||
sdk.NewEvent(
|
sdk.NewEvent(
|
||||||
types.EventTypeHarvestDeposit,
|
types.EventTypeHarvestDeposit,
|
||||||
sdk.NewAttribute(sdk.AttributeKeyAmount, amount.String()),
|
sdk.NewAttribute(sdk.AttributeKeyAmount, coins.String()),
|
||||||
sdk.NewAttribute(types.AttributeKeyDepositor, deposit.Depositor.String()),
|
sdk.NewAttribute(types.AttributeKeyDepositor, deposit.Depositor.String()),
|
||||||
sdk.NewAttribute(types.AttributeKeyDepositDenom, deposit.Amount.Denom),
|
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -52,28 +67,35 @@ func (k Keeper) Deposit(ctx sdk.Context, depositor sdk.AccAddress, amount sdk.Co
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ValidateDeposit validates a deposit
|
// ValidateDeposit validates a deposit
|
||||||
func (k Keeper) ValidateDeposit(ctx sdk.Context, amount sdk.Coin) error {
|
func (k Keeper) ValidateDeposit(ctx sdk.Context, coins sdk.Coins) error {
|
||||||
params := k.GetParams(ctx)
|
params := k.GetParams(ctx)
|
||||||
|
for _, depCoin := range coins {
|
||||||
|
found := false
|
||||||
for _, lps := range params.LiquidityProviderSchedules {
|
for _, lps := range params.LiquidityProviderSchedules {
|
||||||
if lps.DepositDenom == amount.Denom {
|
if lps.DepositDenom == depCoin.Denom {
|
||||||
|
found = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !found {
|
||||||
|
return sdkerrors.Wrapf(types.ErrInvalidDepositDenom, "liquidity provider denom %s not found", depCoin.Denom)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
|
||||||
}
|
|
||||||
return sdkerrors.Wrapf(types.ErrInvalidDepositDenom, "liquidity provider denom %s not found", amount.Denom)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Withdraw returns some or all of a deposit back to original depositor
|
// Withdraw returns some or all of a deposit back to original depositor
|
||||||
func (k Keeper) Withdraw(ctx sdk.Context, depositor sdk.AccAddress, amount sdk.Coin) error {
|
func (k Keeper) Withdraw(ctx sdk.Context, depositor sdk.AccAddress, coins sdk.Coins) error {
|
||||||
deposit, found := k.GetDeposit(ctx, depositor, amount.Denom)
|
deposit, found := k.GetDeposit(ctx, depositor)
|
||||||
if !found {
|
if !found {
|
||||||
return sdkerrors.Wrapf(types.ErrDepositNotFound, "no %s deposit found for %s", amount.Denom, depositor)
|
return sdkerrors.Wrapf(types.ErrDepositNotFound, "no deposit found for %s", depositor)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !deposit.Amount.IsGTE(amount) {
|
if !deposit.Amount.IsAllGTE(coins) { // TODO test that this works how I think it does
|
||||||
return sdkerrors.Wrapf(types.ErrInvalidWithdrawAmount, "%s>%s", amount, deposit.Amount)
|
return sdkerrors.Wrapf(types.ErrInvalidWithdrawAmount, "%s>%s", coins, deposit.Amount)
|
||||||
}
|
}
|
||||||
|
|
||||||
err := k.supplyKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleAccountName, depositor, sdk.NewCoins(amount))
|
err := k.supplyKeeper.SendCoinsFromModuleToAccount(ctx, types.ModuleAccountName, depositor, coins)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -81,25 +103,23 @@ func (k Keeper) Withdraw(ctx sdk.Context, depositor sdk.AccAddress, amount sdk.C
|
|||||||
ctx.EventManager().EmitEvent(
|
ctx.EventManager().EmitEvent(
|
||||||
sdk.NewEvent(
|
sdk.NewEvent(
|
||||||
types.EventTypeHarvestWithdrawal,
|
types.EventTypeHarvestWithdrawal,
|
||||||
sdk.NewAttribute(sdk.AttributeKeyAmount, amount.String()),
|
sdk.NewAttribute(sdk.AttributeKeyAmount, coins.String()),
|
||||||
sdk.NewAttribute(types.AttributeKeyDepositor, depositor.String()),
|
sdk.NewAttribute(types.AttributeKeyDepositor, depositor.String()),
|
||||||
sdk.NewAttribute(types.AttributeKeyDepositDenom, amount.Denom),
|
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
if deposit.Amount.IsEqual(amount) {
|
if deposit.Amount.IsEqual(coins) {
|
||||||
ctx.EventManager().EmitEvent(
|
ctx.EventManager().EmitEvent(
|
||||||
sdk.NewEvent(
|
sdk.NewEvent(
|
||||||
types.EventTypeDeleteHarvestDeposit,
|
types.EventTypeDeleteHarvestDeposit,
|
||||||
sdk.NewAttribute(types.AttributeKeyDepositor, depositor.String()),
|
sdk.NewAttribute(types.AttributeKeyDepositor, depositor.String()),
|
||||||
sdk.NewAttribute(types.AttributeKeyDepositDenom, amount.Denom),
|
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
k.DeleteDeposit(ctx, deposit)
|
k.DeleteDeposit(ctx, deposit)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
deposit.Amount = deposit.Amount.Sub(amount)
|
deposit.Amount = deposit.Amount.Sub(coins)
|
||||||
k.SetDeposit(ctx, deposit)
|
k.SetDeposit(ctx, deposit)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package keeper_test
|
package keeper_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -18,10 +19,11 @@ import (
|
|||||||
func (suite *KeeperTestSuite) TestDeposit() {
|
func (suite *KeeperTestSuite) TestDeposit() {
|
||||||
type args struct {
|
type args struct {
|
||||||
depositor sdk.AccAddress
|
depositor sdk.AccAddress
|
||||||
amount sdk.Coin
|
amount sdk.Coins
|
||||||
numberDeposits int
|
numberDeposits int
|
||||||
expectedAccountBalance sdk.Coins
|
expectedAccountBalance sdk.Coins
|
||||||
expectedModAccountBalance sdk.Coins
|
expectedModAccountBalance sdk.Coins
|
||||||
|
expectedDepositCoins sdk.Coins
|
||||||
}
|
}
|
||||||
type errArgs struct {
|
type errArgs struct {
|
||||||
expectPass bool
|
expectPass bool
|
||||||
@ -37,10 +39,11 @@ func (suite *KeeperTestSuite) TestDeposit() {
|
|||||||
"valid",
|
"valid",
|
||||||
args{
|
args{
|
||||||
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||||
amount: sdk.NewCoin("bnb", sdk.NewInt(100)),
|
amount: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(100))),
|
||||||
numberDeposits: 1,
|
numberDeposits: 1,
|
||||||
expectedAccountBalance: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(900)), sdk.NewCoin("btcb", sdk.NewInt(1000))),
|
expectedAccountBalance: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(900)), sdk.NewCoin("btcb", sdk.NewInt(1000))),
|
||||||
expectedModAccountBalance: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(100))),
|
expectedModAccountBalance: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(100))),
|
||||||
|
expectedDepositCoins: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(100))),
|
||||||
},
|
},
|
||||||
errArgs{
|
errArgs{
|
||||||
expectPass: true,
|
expectPass: true,
|
||||||
@ -51,10 +54,11 @@ func (suite *KeeperTestSuite) TestDeposit() {
|
|||||||
"valid multi deposit",
|
"valid multi deposit",
|
||||||
args{
|
args{
|
||||||
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||||
amount: sdk.NewCoin("bnb", sdk.NewInt(100)),
|
amount: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(100))),
|
||||||
numberDeposits: 2,
|
numberDeposits: 2,
|
||||||
expectedAccountBalance: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(800)), sdk.NewCoin("btcb", sdk.NewInt(1000))),
|
expectedAccountBalance: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(800)), sdk.NewCoin("btcb", sdk.NewInt(1000))),
|
||||||
expectedModAccountBalance: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(200))),
|
expectedModAccountBalance: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(200))),
|
||||||
|
expectedDepositCoins: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(200))),
|
||||||
},
|
},
|
||||||
errArgs{
|
errArgs{
|
||||||
expectPass: true,
|
expectPass: true,
|
||||||
@ -65,10 +69,11 @@ func (suite *KeeperTestSuite) TestDeposit() {
|
|||||||
"invalid deposit denom",
|
"invalid deposit denom",
|
||||||
args{
|
args{
|
||||||
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||||
amount: sdk.NewCoin("btcb", sdk.NewInt(100)),
|
amount: sdk.NewCoins(sdk.NewCoin("btcb", sdk.NewInt(100))),
|
||||||
numberDeposits: 1,
|
numberDeposits: 1,
|
||||||
expectedAccountBalance: sdk.Coins{},
|
expectedAccountBalance: sdk.Coins{},
|
||||||
expectedModAccountBalance: sdk.Coins{},
|
expectedModAccountBalance: sdk.Coins{},
|
||||||
|
expectedDepositCoins: sdk.Coins{},
|
||||||
},
|
},
|
||||||
errArgs{
|
errArgs{
|
||||||
expectPass: false,
|
expectPass: false,
|
||||||
@ -79,10 +84,11 @@ func (suite *KeeperTestSuite) TestDeposit() {
|
|||||||
"insufficient funds",
|
"insufficient funds",
|
||||||
args{
|
args{
|
||||||
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||||
amount: sdk.NewCoin("bnb", sdk.NewInt(10000)),
|
amount: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(10000))),
|
||||||
numberDeposits: 1,
|
numberDeposits: 1,
|
||||||
expectedAccountBalance: sdk.Coins{},
|
expectedAccountBalance: sdk.Coins{},
|
||||||
expectedModAccountBalance: sdk.Coins{},
|
expectedModAccountBalance: sdk.Coins{},
|
||||||
|
expectedDepositCoins: sdk.Coins{},
|
||||||
},
|
},
|
||||||
errArgs{
|
errArgs{
|
||||||
expectPass: false,
|
expectPass: false,
|
||||||
@ -181,8 +187,9 @@ func (suite *KeeperTestSuite) TestDeposit() {
|
|||||||
suite.Require().Equal(tc.args.expectedAccountBalance, acc.GetCoins())
|
suite.Require().Equal(tc.args.expectedAccountBalance, acc.GetCoins())
|
||||||
mAcc := suite.getModuleAccount(types.ModuleAccountName)
|
mAcc := suite.getModuleAccount(types.ModuleAccountName)
|
||||||
suite.Require().Equal(tc.args.expectedModAccountBalance, mAcc.GetCoins())
|
suite.Require().Equal(tc.args.expectedModAccountBalance, mAcc.GetCoins())
|
||||||
_, f := suite.keeper.GetDeposit(suite.ctx, tc.args.depositor, tc.args.amount.Denom)
|
dep, f := suite.keeper.GetDeposit(suite.ctx, tc.args.depositor)
|
||||||
suite.Require().True(f)
|
suite.Require().True(f)
|
||||||
|
suite.Require().Equal(tc.args.expectedDepositCoins, dep.Amount)
|
||||||
} else {
|
} else {
|
||||||
suite.Require().Error(err)
|
suite.Require().Error(err)
|
||||||
suite.Require().True(strings.Contains(err.Error(), tc.errArgs.contains))
|
suite.Require().True(strings.Contains(err.Error(), tc.errArgs.contains))
|
||||||
@ -194,13 +201,13 @@ func (suite *KeeperTestSuite) TestDeposit() {
|
|||||||
func (suite *KeeperTestSuite) TestWithdraw() {
|
func (suite *KeeperTestSuite) TestWithdraw() {
|
||||||
type args struct {
|
type args struct {
|
||||||
depositor sdk.AccAddress
|
depositor sdk.AccAddress
|
||||||
depositAmount sdk.Coin
|
depositAmount sdk.Coins
|
||||||
withdrawAmount sdk.Coin
|
withdrawAmount sdk.Coins
|
||||||
createDeposit bool
|
createDeposit bool
|
||||||
expectedAccountBalance sdk.Coins
|
expectedAccountBalance sdk.Coins
|
||||||
expectedModAccountBalance sdk.Coins
|
expectedModAccountBalance sdk.Coins
|
||||||
depositExists bool
|
depositExists bool
|
||||||
finalDepositAmount sdk.Coin
|
finalDepositAmount sdk.Coins
|
||||||
}
|
}
|
||||||
type errArgs struct {
|
type errArgs struct {
|
||||||
expectPass bool
|
expectPass bool
|
||||||
@ -216,13 +223,13 @@ func (suite *KeeperTestSuite) TestWithdraw() {
|
|||||||
"valid partial withdraw",
|
"valid partial withdraw",
|
||||||
args{
|
args{
|
||||||
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||||
depositAmount: sdk.NewCoin("bnb", sdk.NewInt(200)),
|
depositAmount: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(200))),
|
||||||
withdrawAmount: sdk.NewCoin("bnb", sdk.NewInt(100)),
|
withdrawAmount: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(100))),
|
||||||
createDeposit: true,
|
createDeposit: true,
|
||||||
expectedAccountBalance: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(900)), sdk.NewCoin("btcb", sdk.NewInt(1000))),
|
expectedAccountBalance: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(900)), sdk.NewCoin("btcb", sdk.NewInt(1000))),
|
||||||
expectedModAccountBalance: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(100))),
|
expectedModAccountBalance: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(100))),
|
||||||
depositExists: true,
|
depositExists: true,
|
||||||
finalDepositAmount: sdk.NewCoin("bnb", sdk.NewInt(100)),
|
finalDepositAmount: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(100))),
|
||||||
},
|
},
|
||||||
errArgs{
|
errArgs{
|
||||||
expectPass: true,
|
expectPass: true,
|
||||||
@ -233,13 +240,13 @@ func (suite *KeeperTestSuite) TestWithdraw() {
|
|||||||
"valid full withdraw",
|
"valid full withdraw",
|
||||||
args{
|
args{
|
||||||
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||||
depositAmount: sdk.NewCoin("bnb", sdk.NewInt(200)),
|
depositAmount: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(200))),
|
||||||
withdrawAmount: sdk.NewCoin("bnb", sdk.NewInt(200)),
|
withdrawAmount: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(200))),
|
||||||
createDeposit: true,
|
createDeposit: true,
|
||||||
expectedAccountBalance: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(1000)), sdk.NewCoin("btcb", sdk.NewInt(1000))),
|
expectedAccountBalance: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(1000)), sdk.NewCoin("btcb", sdk.NewInt(1000))),
|
||||||
expectedModAccountBalance: sdk.Coins(nil),
|
expectedModAccountBalance: sdk.Coins(nil),
|
||||||
depositExists: false,
|
depositExists: false,
|
||||||
finalDepositAmount: sdk.Coin{},
|
finalDepositAmount: sdk.Coins{},
|
||||||
},
|
},
|
||||||
errArgs{
|
errArgs{
|
||||||
expectPass: true,
|
expectPass: true,
|
||||||
@ -247,37 +254,37 @@ func (suite *KeeperTestSuite) TestWithdraw() {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"deposit not found invalid denom",
|
"withdraw invalid, denom not found",
|
||||||
args{
|
args{
|
||||||
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||||
depositAmount: sdk.NewCoin("bnb", sdk.NewInt(200)),
|
depositAmount: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(200))),
|
||||||
withdrawAmount: sdk.NewCoin("btcb", sdk.NewInt(200)),
|
withdrawAmount: sdk.NewCoins(sdk.NewCoin("btcb", sdk.NewInt(200))),
|
||||||
createDeposit: true,
|
createDeposit: true,
|
||||||
expectedAccountBalance: sdk.Coins{},
|
expectedAccountBalance: sdk.Coins{},
|
||||||
expectedModAccountBalance: sdk.Coins{},
|
expectedModAccountBalance: sdk.Coins{},
|
||||||
depositExists: false,
|
depositExists: false,
|
||||||
finalDepositAmount: sdk.Coin{},
|
finalDepositAmount: sdk.Coins{},
|
||||||
},
|
},
|
||||||
errArgs{
|
errArgs{
|
||||||
expectPass: false,
|
expectPass: false,
|
||||||
contains: "deposit not found",
|
contains: "invalid withdrawal amount",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"withdraw exceeds deposit",
|
"withdraw exceeds deposit",
|
||||||
args{
|
args{
|
||||||
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||||
depositAmount: sdk.NewCoin("bnb", sdk.NewInt(200)),
|
depositAmount: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(200))),
|
||||||
withdrawAmount: sdk.NewCoin("bnb", sdk.NewInt(300)),
|
withdrawAmount: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(300))),
|
||||||
createDeposit: true,
|
createDeposit: true,
|
||||||
expectedAccountBalance: sdk.Coins{},
|
expectedAccountBalance: sdk.Coins{},
|
||||||
expectedModAccountBalance: sdk.Coins{},
|
expectedModAccountBalance: sdk.Coins{},
|
||||||
depositExists: false,
|
depositExists: false,
|
||||||
finalDepositAmount: sdk.Coin{},
|
finalDepositAmount: sdk.Coins{},
|
||||||
},
|
},
|
||||||
errArgs{
|
errArgs{
|
||||||
expectPass: false,
|
expectPass: false,
|
||||||
contains: "withdrawal amount exceeds deposit amount",
|
contains: "invalid withdrawal amount",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -325,7 +332,7 @@ func (suite *KeeperTestSuite) TestWithdraw() {
|
|||||||
suite.Require().Equal(tc.args.expectedAccountBalance, acc.GetCoins())
|
suite.Require().Equal(tc.args.expectedAccountBalance, acc.GetCoins())
|
||||||
mAcc := suite.getModuleAccount(types.ModuleAccountName)
|
mAcc := suite.getModuleAccount(types.ModuleAccountName)
|
||||||
suite.Require().Equal(tc.args.expectedModAccountBalance, mAcc.GetCoins())
|
suite.Require().Equal(tc.args.expectedModAccountBalance, mAcc.GetCoins())
|
||||||
testDeposit, f := suite.keeper.GetDeposit(suite.ctx, tc.args.depositor, tc.args.depositAmount.Denom)
|
testDeposit, f := suite.keeper.GetDeposit(suite.ctx, tc.args.depositor)
|
||||||
if tc.args.depositExists {
|
if tc.args.depositExists {
|
||||||
suite.Require().True(f)
|
suite.Require().True(f)
|
||||||
suite.Require().Equal(tc.args.finalDepositAmount, testDeposit.Amount)
|
suite.Require().Equal(tc.args.finalDepositAmount, testDeposit.Amount)
|
||||||
@ -334,6 +341,7 @@ func (suite *KeeperTestSuite) TestWithdraw() {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
suite.Require().Error(err)
|
suite.Require().Error(err)
|
||||||
|
fmt.Printf("%s\n", err.Error())
|
||||||
suite.Require().True(strings.Contains(err.Error(), tc.errArgs.contains))
|
suite.Require().True(strings.Contains(err.Error(), tc.errArgs.contains))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -706,10 +706,12 @@ func (suite *KeeperTestSuite) TestInterest() {
|
|||||||
harvest.BeginBlocker(suite.ctx, suite.keeper)
|
harvest.BeginBlocker(suite.ctx, suite.keeper)
|
||||||
|
|
||||||
// Deposit 2x as many coins for each coin we intend to borrow
|
// Deposit 2x as many coins for each coin we intend to borrow
|
||||||
for _, coin := range tc.args.borrowCoins {
|
depositCoins := sdk.NewCoins()
|
||||||
err = suite.keeper.Deposit(suite.ctx, tc.args.user, sdk.NewCoin(coin.Denom, coin.Amount.Mul(sdk.NewInt(2))))
|
for _, borrowCoin := range tc.args.borrowCoins {
|
||||||
suite.Require().NoError(err)
|
depositCoins = depositCoins.Add(sdk.NewCoin(borrowCoin.Denom, borrowCoin.Amount.Mul(sdk.NewInt(2))))
|
||||||
}
|
}
|
||||||
|
err = suite.keeper.Deposit(suite.ctx, tc.args.user, depositCoins)
|
||||||
|
suite.Require().NoError(err)
|
||||||
|
|
||||||
// Borrow coins
|
// Borrow coins
|
||||||
err = suite.keeper.Borrow(suite.ctx, tc.args.user, tc.args.borrowCoins)
|
err = suite.keeper.Borrow(suite.ctx, tc.args.user, tc.args.borrowCoins)
|
||||||
|
@ -78,9 +78,9 @@ func (k Keeper) SetPreviousDelegationDistribution(ctx sdk.Context, distTime time
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetDeposit returns a deposit from the store for a particular depositor address, deposit denom
|
// GetDeposit returns a deposit from the store for a particular depositor address, deposit denom
|
||||||
func (k Keeper) GetDeposit(ctx sdk.Context, depositor sdk.AccAddress, denom string) (types.Deposit, bool) {
|
func (k Keeper) GetDeposit(ctx sdk.Context, depositor sdk.AccAddress) (types.Deposit, bool) {
|
||||||
store := prefix.NewStore(ctx.KVStore(k.key), types.DepositsKeyPrefix)
|
store := prefix.NewStore(ctx.KVStore(k.key), types.DepositsKeyPrefix)
|
||||||
bz := store.Get(types.DepositKey(denom, depositor))
|
bz := store.Get(depositor.Bytes())
|
||||||
if bz == nil {
|
if bz == nil {
|
||||||
return types.Deposit{}, false
|
return types.Deposit{}, false
|
||||||
}
|
}
|
||||||
@ -93,13 +93,13 @@ func (k Keeper) GetDeposit(ctx sdk.Context, depositor sdk.AccAddress, denom stri
|
|||||||
func (k Keeper) SetDeposit(ctx sdk.Context, deposit types.Deposit) {
|
func (k Keeper) SetDeposit(ctx sdk.Context, deposit types.Deposit) {
|
||||||
store := prefix.NewStore(ctx.KVStore(k.key), types.DepositsKeyPrefix)
|
store := prefix.NewStore(ctx.KVStore(k.key), types.DepositsKeyPrefix)
|
||||||
bz := k.cdc.MustMarshalBinaryBare(deposit)
|
bz := k.cdc.MustMarshalBinaryBare(deposit)
|
||||||
store.Set(types.DepositKey(deposit.Amount.Denom, deposit.Depositor), bz)
|
store.Set(deposit.Depositor.Bytes(), bz)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DeleteDeposit deletes a deposit from the store
|
// DeleteDeposit deletes a deposit from the store
|
||||||
func (k Keeper) DeleteDeposit(ctx sdk.Context, deposit types.Deposit) {
|
func (k Keeper) DeleteDeposit(ctx sdk.Context, deposit types.Deposit) {
|
||||||
store := prefix.NewStore(ctx.KVStore(k.key), types.DepositsKeyPrefix)
|
store := prefix.NewStore(ctx.KVStore(k.key), types.DepositsKeyPrefix)
|
||||||
store.Delete(types.DepositKey(deposit.Amount.Denom, deposit.Depositor))
|
store.Delete(deposit.Depositor.Bytes())
|
||||||
}
|
}
|
||||||
|
|
||||||
// IterateDeposits iterates over all deposit objects in the store and performs a callback function
|
// IterateDeposits iterates over all deposit objects in the store and performs a callback function
|
||||||
@ -116,20 +116,6 @@ func (k Keeper) IterateDeposits(ctx sdk.Context, cb func(deposit types.Deposit)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// IterateDepositsByDenom iterates over all deposit objects in the store with the matching deposit denom and performs a callback function
|
|
||||||
func (k Keeper) IterateDepositsByDenom(ctx sdk.Context, depositDenom string, cb func(deposit types.Deposit) (stop bool)) {
|
|
||||||
store := prefix.NewStore(ctx.KVStore(k.key), types.DepositsKeyPrefix)
|
|
||||||
iterator := sdk.KVStorePrefixIterator(store, types.DepositTypeIteratorKey(depositDenom))
|
|
||||||
defer iterator.Close()
|
|
||||||
for ; iterator.Valid(); iterator.Next() {
|
|
||||||
var deposit types.Deposit
|
|
||||||
k.cdc.MustUnmarshalBinaryBare(iterator.Value(), &deposit)
|
|
||||||
if cb(deposit) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetClaim returns a claim from the store for a particular claim owner, deposit denom, and claim type
|
// GetClaim returns a claim from the store for a particular claim owner, deposit denom, and claim type
|
||||||
func (k Keeper) GetClaim(ctx sdk.Context, owner sdk.AccAddress, depositDenom string, claimType types.ClaimType) (types.Claim, bool) {
|
func (k Keeper) GetClaim(ctx sdk.Context, owner sdk.AccAddress, depositDenom string, claimType types.ClaimType) (types.Claim, bool) {
|
||||||
store := prefix.NewStore(ctx.KVStore(k.key), types.ClaimsKeyPrefix)
|
store := prefix.NewStore(ctx.KVStore(k.key), types.ClaimsKeyPrefix)
|
||||||
|
@ -76,27 +76,27 @@ func (suite *KeeperTestSuite) TestGetSetPreviousDelegatorDistribution() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (suite *KeeperTestSuite) TestGetSetDeleteDeposit() {
|
func (suite *KeeperTestSuite) TestGetSetDeleteDeposit() {
|
||||||
dep := types.NewDeposit(sdk.AccAddress("test"), sdk.NewCoin("bnb", sdk.NewInt(100)))
|
dep := types.NewDeposit(sdk.AccAddress("test"), sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(100))))
|
||||||
|
|
||||||
_, f := suite.keeper.GetDeposit(suite.ctx, sdk.AccAddress("test"), "bnb")
|
_, f := suite.keeper.GetDeposit(suite.ctx, sdk.AccAddress("test"))
|
||||||
suite.Require().False(f)
|
suite.Require().False(f)
|
||||||
|
|
||||||
suite.keeper.SetDeposit(suite.ctx, dep)
|
suite.keeper.SetDeposit(suite.ctx, dep)
|
||||||
|
|
||||||
testDeposit, f := suite.keeper.GetDeposit(suite.ctx, sdk.AccAddress("test"), "bnb")
|
testDeposit, f := suite.keeper.GetDeposit(suite.ctx, sdk.AccAddress("test"))
|
||||||
suite.Require().True(f)
|
suite.Require().True(f)
|
||||||
suite.Require().Equal(dep, testDeposit)
|
suite.Require().Equal(dep, testDeposit)
|
||||||
|
|
||||||
suite.Require().NotPanics(func() { suite.keeper.DeleteDeposit(suite.ctx, dep) })
|
suite.Require().NotPanics(func() { suite.keeper.DeleteDeposit(suite.ctx, dep) })
|
||||||
|
|
||||||
_, f = suite.keeper.GetDeposit(suite.ctx, sdk.AccAddress("test"), "bnb")
|
_, f = suite.keeper.GetDeposit(suite.ctx, sdk.AccAddress("test"))
|
||||||
suite.Require().False(f)
|
suite.Require().False(f)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (suite *KeeperTestSuite) TestIterateDeposits() {
|
func (suite *KeeperTestSuite) TestIterateDeposits() {
|
||||||
for i := 0; i < 5; i++ {
|
for i := 0; i < 5; i++ {
|
||||||
dep := types.NewDeposit(sdk.AccAddress("test"+fmt.Sprint(i)), sdk.NewCoin("bnb", sdk.NewInt(100)))
|
dep := types.NewDeposit(sdk.AccAddress("test"+fmt.Sprint(i)), sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(100))))
|
||||||
suite.Require().NotPanics(func() { suite.keeper.SetDeposit(suite.ctx, dep) })
|
suite.Require().NotPanics(func() { suite.keeper.SetDeposit(suite.ctx, dep) })
|
||||||
}
|
}
|
||||||
var deposits []types.Deposit
|
var deposits []types.Deposit
|
||||||
@ -107,41 +107,6 @@ func (suite *KeeperTestSuite) TestIterateDeposits() {
|
|||||||
suite.Require().Equal(5, len(deposits))
|
suite.Require().Equal(5, len(deposits))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (suite *KeeperTestSuite) TestIterateDepositsByDenom() {
|
|
||||||
for i := 0; i < 5; i++ {
|
|
||||||
depA := types.NewDeposit(sdk.AccAddress("test"+fmt.Sprint(i)), sdk.NewCoin("bnb", sdk.NewInt(100)))
|
|
||||||
suite.Require().NotPanics(func() { suite.keeper.SetDeposit(suite.ctx, depA) })
|
|
||||||
depB := types.NewDeposit(sdk.AccAddress("test"+fmt.Sprint(i)), sdk.NewCoin("bnb", sdk.NewInt(100)))
|
|
||||||
suite.Require().NotPanics(func() { suite.keeper.SetDeposit(suite.ctx, depB) })
|
|
||||||
depC := types.NewDeposit(sdk.AccAddress("test"+fmt.Sprint(i)), sdk.NewCoin("btcb", sdk.NewInt(100)))
|
|
||||||
suite.Require().NotPanics(func() { suite.keeper.SetDeposit(suite.ctx, depC) })
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check BNB deposits
|
|
||||||
var bnbDeposits []types.Deposit
|
|
||||||
suite.keeper.IterateDepositsByDenom(suite.ctx, "bnb", func(d types.Deposit) bool {
|
|
||||||
bnbDeposits = append(bnbDeposits, d)
|
|
||||||
return false
|
|
||||||
})
|
|
||||||
suite.Require().Equal(5, len(bnbDeposits))
|
|
||||||
|
|
||||||
// Check BTCB deposits
|
|
||||||
var btcbDeposits []types.Deposit
|
|
||||||
suite.keeper.IterateDepositsByDenom(suite.ctx, "btcb", func(d types.Deposit) bool {
|
|
||||||
btcbDeposits = append(btcbDeposits, d)
|
|
||||||
return false
|
|
||||||
})
|
|
||||||
suite.Require().Equal(5, len(btcbDeposits))
|
|
||||||
|
|
||||||
// Fetch all deposits
|
|
||||||
var deposits []types.Deposit
|
|
||||||
suite.keeper.IterateDeposits(suite.ctx, func(d types.Deposit) bool {
|
|
||||||
deposits = append(deposits, d)
|
|
||||||
return false
|
|
||||||
})
|
|
||||||
suite.Require().Equal(len(bnbDeposits)+len(btcbDeposits), len(deposits))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (suite *KeeperTestSuite) TestGetSetDeleteClaim() {
|
func (suite *KeeperTestSuite) TestGetSetDeleteClaim() {
|
||||||
claim := types.NewClaim(sdk.AccAddress("test"), "bnb", sdk.NewCoin("hard", sdk.NewInt(100)), "lp")
|
claim := types.NewClaim(sdk.AccAddress("test"), "bnb", sdk.NewCoin("hard", sdk.NewInt(100)), "lp")
|
||||||
_, f := suite.keeper.GetClaim(suite.ctx, sdk.AccAddress("test"), "bnb", "lp")
|
_, f := suite.keeper.GetClaim(suite.ctx, sdk.AccAddress("test"), "bnb", "lp")
|
||||||
|
@ -44,10 +44,13 @@ func (k Keeper) AttemptKeeperLiquidation(ctx sdk.Context, keeper sdk.AccAddress,
|
|||||||
k.UpdateItemInLtvIndex(ctx, prevLtv, shouldInsertIndex, borrower)
|
k.UpdateItemInLtvIndex(ctx, prevLtv, shouldInsertIndex, borrower)
|
||||||
|
|
||||||
// Fetch deposits and parse coin denoms
|
// Fetch deposits and parse coin denoms
|
||||||
deposits := k.GetDepositsByUser(ctx, borrower)
|
deposit, found := k.GetDeposit(ctx, borrower)
|
||||||
|
if !found {
|
||||||
|
return false, sdkerrors.Wrapf(types.ErrDepositsNotFound, "no deposits found for %s", borrower)
|
||||||
|
}
|
||||||
depositDenoms := []string{}
|
depositDenoms := []string{}
|
||||||
for _, deposit := range deposits {
|
for _, depCoin := range deposit.Amount {
|
||||||
depositDenoms = append(depositDenoms, deposit.Amount.Denom)
|
depositDenoms = append(depositDenoms, depCoin.Denom)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fetch borrow balances and parse coin denoms
|
// Fetch borrow balances and parse coin denoms
|
||||||
@ -77,9 +80,9 @@ func (k Keeper) AttemptKeeperLiquidation(ctx sdk.Context, keeper sdk.AccAddress,
|
|||||||
|
|
||||||
totalBorrowableUSDAmount := sdk.ZeroDec()
|
totalBorrowableUSDAmount := sdk.ZeroDec()
|
||||||
totalDepositedUSDAmount := sdk.ZeroDec()
|
totalDepositedUSDAmount := sdk.ZeroDec()
|
||||||
for _, deposit := range deposits {
|
for _, depCoin := range deposit.Amount {
|
||||||
lData := liqMap[deposit.Amount.Denom]
|
lData := liqMap[depCoin.Denom]
|
||||||
usdValue := sdk.NewDecFromInt(deposit.Amount.Amount).Quo(sdk.NewDecFromInt(lData.conversionFactor)).Mul(lData.price)
|
usdValue := sdk.NewDecFromInt(depCoin.Amount).Quo(sdk.NewDecFromInt(lData.conversionFactor)).Mul(lData.price)
|
||||||
totalDepositedUSDAmount = totalDepositedUSDAmount.Add(usdValue)
|
totalDepositedUSDAmount = totalDepositedUSDAmount.Add(usdValue)
|
||||||
borrowableUSDAmountForDeposit := usdValue.Mul(lData.ltv)
|
borrowableUSDAmountForDeposit := usdValue.Mul(lData.ltv)
|
||||||
totalBorrowableUSDAmount = totalBorrowableUSDAmount.Add(borrowableUSDAmountForDeposit)
|
totalBorrowableUSDAmount = totalBorrowableUSDAmount.Add(borrowableUSDAmountForDeposit)
|
||||||
@ -97,8 +100,8 @@ func (k Keeper) AttemptKeeperLiquidation(ctx sdk.Context, keeper sdk.AccAddress,
|
|||||||
return false, sdkerrors.Wrapf(types.ErrBorrowNotLiquidatable, "borrowed %s <= borrowable %s", totalBorrowedUSDAmount, totalBorrowableUSDAmount)
|
return false, sdkerrors.Wrapf(types.ErrBorrowNotLiquidatable, "borrowed %s <= borrowable %s", totalBorrowedUSDAmount, totalBorrowableUSDAmount)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Seize deposits and auciton them off
|
// Sending coins to auction module with keeper address getting % of the profits
|
||||||
err = k.SeizeDeposits(ctx, keeper, liqMap, deposits, borrows.Amount, depositDenoms, borrowDenoms)
|
err = k.SeizeDeposits(ctx, keeper, liqMap, deposit, borrows.Amount, depositDenoms, borrowDenoms)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
@ -111,23 +114,20 @@ func (k Keeper) AttemptKeeperLiquidation(ctx sdk.Context, keeper sdk.AccAddress,
|
|||||||
|
|
||||||
borrow, _ := k.GetBorrow(ctx, borrower)
|
borrow, _ := k.GetBorrow(ctx, borrower)
|
||||||
k.DeleteBorrow(ctx, borrow)
|
k.DeleteBorrow(ctx, borrow)
|
||||||
|
k.DeleteDeposit(ctx, deposit)
|
||||||
for _, oldDeposit := range deposits {
|
|
||||||
k.DeleteDeposit(ctx, oldDeposit)
|
|
||||||
}
|
|
||||||
|
|
||||||
return true, err
|
return true, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// SeizeDeposits seizes a list of deposits and sends them to auction
|
// SeizeDeposits seizes a list of deposits and sends them to auction
|
||||||
func (k Keeper) SeizeDeposits(ctx sdk.Context, keeper sdk.AccAddress, liqMap map[string]LiqData,
|
func (k Keeper) SeizeDeposits(ctx sdk.Context, keeper sdk.AccAddress, liqMap map[string]LiqData,
|
||||||
deposits []types.Deposit, borrowBalances sdk.Coins, dDenoms, bDenoms []string) error {
|
deposit types.Deposit, borrowBalances sdk.Coins, dDenoms, bDenoms []string) error {
|
||||||
|
|
||||||
// Seize % of every deposit and send to the keeper
|
// Seize % of every deposit and send to the keeper
|
||||||
aucDeposits := sdk.Coins{}
|
aucDeposits := sdk.Coins{}
|
||||||
for _, deposit := range deposits {
|
for _, depCoin := range deposit.Amount {
|
||||||
denom := deposit.Amount.Denom
|
denom := depCoin.Denom
|
||||||
amount := deposit.Amount.Amount
|
amount := depCoin.Amount
|
||||||
mm, _ := k.GetMoneyMarket(ctx, denom)
|
mm, _ := k.GetMoneyMarket(ctx, denom)
|
||||||
|
|
||||||
// No rewards for anyone if liquidated by LTV index
|
// No rewards for anyone if liquidated by LTV index
|
||||||
@ -167,7 +167,7 @@ func (k Keeper) SeizeDeposits(ctx sdk.Context, keeper sdk.AccAddress, liqMap map
|
|||||||
// Loan-to-Value ratio after sending keeper their reward
|
// Loan-to-Value ratio after sending keeper their reward
|
||||||
ltv := borrowCoinValues.Sum().Quo(depositCoinValues.Sum())
|
ltv := borrowCoinValues.Sum().Quo(depositCoinValues.Sum())
|
||||||
|
|
||||||
err := k.StartAuctions(ctx, deposits[0].Depositor, borrowBalances, aucDeposits, depositCoinValues, borrowCoinValues, ltv, liqMap)
|
err := k.StartAuctions(ctx, deposit.Depositor, borrowBalances, aucDeposits, depositCoinValues, borrowCoinValues, ltv, liqMap)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -280,10 +280,13 @@ func (k Keeper) StartAuctions(ctx sdk.Context, borrower sdk.AccAddress, borrows,
|
|||||||
// and does not include any outsanding interest.
|
// and does not include any outsanding interest.
|
||||||
func (k Keeper) GetStoreLTV(ctx sdk.Context, addr sdk.AccAddress) (sdk.Dec, bool, error) {
|
func (k Keeper) GetStoreLTV(ctx sdk.Context, addr sdk.AccAddress) (sdk.Dec, bool, error) {
|
||||||
// Fetch deposits and parse coin denoms
|
// Fetch deposits and parse coin denoms
|
||||||
deposits := k.GetDepositsByUser(ctx, addr)
|
deposit, found := k.GetDeposit(ctx, addr)
|
||||||
|
if !found {
|
||||||
|
return sdk.ZeroDec(), false, nil
|
||||||
|
}
|
||||||
depositDenoms := []string{}
|
depositDenoms := []string{}
|
||||||
for _, deposit := range deposits {
|
for _, depCoin := range deposit.Amount {
|
||||||
depositDenoms = append(depositDenoms, deposit.Amount.Denom)
|
depositDenoms = append(depositDenoms, depCoin.Denom)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fetch borrow balances and parse coin denoms
|
// Fetch borrow balances and parse coin denoms
|
||||||
@ -313,10 +316,10 @@ func (k Keeper) GetStoreLTV(ctx sdk.Context, addr sdk.AccAddress) (sdk.Dec, bool
|
|||||||
|
|
||||||
// Build valuation map to hold deposit coin USD valuations
|
// Build valuation map to hold deposit coin USD valuations
|
||||||
depositCoinValues := types.NewValuationMap()
|
depositCoinValues := types.NewValuationMap()
|
||||||
for _, deposit := range deposits {
|
for _, depCoin := range deposit.Amount {
|
||||||
dData := liqMap[deposit.Amount.Denom]
|
dData := liqMap[depCoin.Denom]
|
||||||
dCoinUsdValue := sdk.NewDecFromInt(deposit.Amount.Amount).Quo(sdk.NewDecFromInt(dData.conversionFactor)).Mul(dData.price)
|
dCoinUsdValue := sdk.NewDecFromInt(depCoin.Amount).Quo(sdk.NewDecFromInt(dData.conversionFactor)).Mul(dData.price)
|
||||||
depositCoinValues.Increment(deposit.Amount.Denom, dCoinUsdValue)
|
depositCoinValues.Increment(depCoin.Denom, dCoinUsdValue)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build valuation map to hold borrow coin USD valuations
|
// Build valuation map to hold borrow coin USD valuations
|
||||||
|
@ -280,10 +280,8 @@ func (suite *KeeperTestSuite) TestIndexLiquidation() {
|
|||||||
harvest.BeginBlocker(suite.ctx, suite.keeper)
|
harvest.BeginBlocker(suite.ctx, suite.keeper)
|
||||||
|
|
||||||
// Deposit coins
|
// Deposit coins
|
||||||
for _, coin := range tc.args.depositCoins {
|
err = suite.keeper.Deposit(suite.ctx, tc.args.borrower, tc.args.depositCoins)
|
||||||
err = suite.keeper.Deposit(suite.ctx, tc.args.borrower, coin)
|
|
||||||
suite.Require().NoError(err)
|
suite.Require().NoError(err)
|
||||||
}
|
|
||||||
|
|
||||||
// Borrow coins
|
// Borrow coins
|
||||||
err = suite.keeper.Borrow(suite.ctx, tc.args.borrower, tc.args.borrowCoins)
|
err = suite.keeper.Borrow(suite.ctx, tc.args.borrower, tc.args.borrowCoins)
|
||||||
@ -294,10 +292,8 @@ func (suite *KeeperTestSuite) TestIndexLiquidation() {
|
|||||||
suite.Require().True(foundBorrowBefore)
|
suite.Require().True(foundBorrowBefore)
|
||||||
|
|
||||||
// Check that the user's deposits exist before liquidation
|
// Check that the user's deposits exist before liquidation
|
||||||
for _, coin := range tc.args.depositCoins {
|
_, foundDepositBefore := suite.keeper.GetDeposit(suite.ctx, tc.args.borrower)
|
||||||
_, foundDepositBefore := suite.keeper.GetDeposit(suite.ctx, tc.args.borrower, coin.Denom)
|
|
||||||
suite.Require().True(foundDepositBefore)
|
suite.Require().True(foundDepositBefore)
|
||||||
}
|
|
||||||
|
|
||||||
// Liquidate the borrow by running begin blocker
|
// Liquidate the borrow by running begin blocker
|
||||||
runAtTime := time.Unix(suite.ctx.BlockTime().Unix()+(tc.args.beginBlockerTime), 0)
|
runAtTime := time.Unix(suite.ctx.BlockTime().Unix()+(tc.args.beginBlockerTime), 0)
|
||||||
@ -309,10 +305,8 @@ func (suite *KeeperTestSuite) TestIndexLiquidation() {
|
|||||||
_, foundBorrowAfter := suite.keeper.GetBorrow(liqCtx, tc.args.borrower)
|
_, foundBorrowAfter := suite.keeper.GetBorrow(liqCtx, tc.args.borrower)
|
||||||
suite.Require().False(foundBorrowAfter)
|
suite.Require().False(foundBorrowAfter)
|
||||||
// Check deposits do not exist after liquidation
|
// Check deposits do not exist after liquidation
|
||||||
for _, coin := range tc.args.depositCoins {
|
_, foundDepositAfter := suite.keeper.GetDeposit(liqCtx, tc.args.borrower)
|
||||||
_, foundDepositAfter := suite.keeper.GetDeposit(liqCtx, tc.args.borrower, coin.Denom)
|
|
||||||
suite.Require().False(foundDepositAfter)
|
suite.Require().False(foundDepositAfter)
|
||||||
}
|
|
||||||
|
|
||||||
// Check that borrower's balance contains the expected coins
|
// Check that borrower's balance contains the expected coins
|
||||||
accBorrower := suite.getAccountAtCtx(tc.args.borrower, liqCtx)
|
accBorrower := suite.getAccountAtCtx(tc.args.borrower, liqCtx)
|
||||||
@ -327,10 +321,8 @@ func (suite *KeeperTestSuite) TestIndexLiquidation() {
|
|||||||
_, foundBorrowAfter := suite.keeper.GetBorrow(liqCtx, tc.args.borrower)
|
_, foundBorrowAfter := suite.keeper.GetBorrow(liqCtx, tc.args.borrower)
|
||||||
suite.Require().True(foundBorrowAfter)
|
suite.Require().True(foundBorrowAfter)
|
||||||
// Check that the user's deposits exist
|
// Check that the user's deposits exist
|
||||||
for _, coin := range tc.args.depositCoins {
|
_, foundDepositAfter := suite.keeper.GetDeposit(liqCtx, tc.args.borrower)
|
||||||
_, foundDepositAfter := suite.keeper.GetDeposit(liqCtx, tc.args.borrower, coin.Denom)
|
|
||||||
suite.Require().True(foundDepositAfter)
|
suite.Require().True(foundDepositAfter)
|
||||||
}
|
|
||||||
|
|
||||||
// Check that no auctions have been created
|
// Check that no auctions have been created
|
||||||
auctions := suite.auctionKeeper.GetAllAuctions(liqCtx)
|
auctions := suite.auctionKeeper.GetAllAuctions(liqCtx)
|
||||||
@ -637,20 +629,16 @@ func (suite *KeeperTestSuite) TestFullIndexLiquidation() {
|
|||||||
|
|
||||||
// Other borrowers take out positions by depositing and borrowing coins
|
// Other borrowers take out positions by depositing and borrowing coins
|
||||||
for _, otherBorrower := range tc.args.otherBorrowers {
|
for _, otherBorrower := range tc.args.otherBorrowers {
|
||||||
for _, coin := range tc.args.depositCoins {
|
err = suite.keeper.Deposit(suite.ctx, otherBorrower, tc.args.depositCoins)
|
||||||
err = suite.keeper.Deposit(suite.ctx, otherBorrower, coin)
|
|
||||||
suite.Require().NoError(err)
|
suite.Require().NoError(err)
|
||||||
}
|
|
||||||
|
|
||||||
err = suite.keeper.Borrow(suite.ctx, otherBorrower, tc.args.otherBorrowCoins)
|
err = suite.keeper.Borrow(suite.ctx, otherBorrower, tc.args.otherBorrowCoins)
|
||||||
suite.Require().NoError(err)
|
suite.Require().NoError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Primary borrower deposits and borrows
|
// Primary borrower deposits and borrows
|
||||||
for _, coin := range tc.args.depositCoins {
|
err = suite.keeper.Deposit(suite.ctx, tc.args.borrower, tc.args.depositCoins)
|
||||||
err = suite.keeper.Deposit(suite.ctx, tc.args.borrower, coin)
|
|
||||||
suite.Require().NoError(err)
|
suite.Require().NoError(err)
|
||||||
}
|
|
||||||
|
|
||||||
err = suite.keeper.Borrow(suite.ctx, tc.args.borrower, tc.args.borrowCoins)
|
err = suite.keeper.Borrow(suite.ctx, tc.args.borrower, tc.args.borrowCoins)
|
||||||
suite.Require().NoError(err)
|
suite.Require().NoError(err)
|
||||||
@ -661,20 +649,16 @@ func (suite *KeeperTestSuite) TestFullIndexLiquidation() {
|
|||||||
_, foundBorrowBefore := suite.keeper.GetBorrow(suite.ctx, otherBorrower)
|
_, foundBorrowBefore := suite.keeper.GetBorrow(suite.ctx, otherBorrower)
|
||||||
suite.Require().True(foundBorrowBefore)
|
suite.Require().True(foundBorrowBefore)
|
||||||
|
|
||||||
for _, coin := range tc.args.depositCoins {
|
_, foundDepositBefore := suite.keeper.GetDeposit(suite.ctx, otherBorrower)
|
||||||
_, foundDepositBefore := suite.keeper.GetDeposit(suite.ctx, otherBorrower, coin.Denom)
|
|
||||||
suite.Require().True(foundDepositBefore)
|
suite.Require().True(foundDepositBefore)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Primary borrower
|
// Primary borrower
|
||||||
_, foundBorrowBefore := suite.keeper.GetBorrow(suite.ctx, tc.args.borrower)
|
_, foundBorrowBefore := suite.keeper.GetBorrow(suite.ctx, tc.args.borrower)
|
||||||
suite.Require().True(foundBorrowBefore)
|
suite.Require().True(foundBorrowBefore)
|
||||||
|
|
||||||
for _, coin := range tc.args.depositCoins {
|
_, foundDepositBefore := suite.keeper.GetDeposit(suite.ctx, tc.args.borrower)
|
||||||
_, foundDepositBefore := suite.keeper.GetDeposit(suite.ctx, tc.args.borrower, coin.Denom)
|
|
||||||
suite.Require().True(foundDepositBefore)
|
suite.Require().True(foundDepositBefore)
|
||||||
}
|
|
||||||
|
|
||||||
// ----------- Liquidate and check state -----------
|
// ----------- Liquidate and check state -----------
|
||||||
// Liquidate the borrow by running begin blocker
|
// Liquidate the borrow by running begin blocker
|
||||||
@ -687,10 +671,8 @@ func (suite *KeeperTestSuite) TestFullIndexLiquidation() {
|
|||||||
_, foundBorrowAfter := suite.keeper.GetBorrow(liqCtx, tc.args.borrower)
|
_, foundBorrowAfter := suite.keeper.GetBorrow(liqCtx, tc.args.borrower)
|
||||||
suite.Require().False(foundBorrowAfter)
|
suite.Require().False(foundBorrowAfter)
|
||||||
// Check deposits do not exist after liquidation
|
// Check deposits do not exist after liquidation
|
||||||
for _, coin := range tc.args.depositCoins {
|
_, foundDepositAfter := suite.keeper.GetDeposit(liqCtx, tc.args.borrower)
|
||||||
_, foundDepositAfter := suite.keeper.GetDeposit(liqCtx, tc.args.borrower, coin.Denom)
|
|
||||||
suite.Require().False(foundDepositAfter)
|
suite.Require().False(foundDepositAfter)
|
||||||
}
|
|
||||||
|
|
||||||
// Check that borrower's balance contains the expected coins
|
// Check that borrower's balance contains the expected coins
|
||||||
accBorrower := suite.getAccountAtCtx(tc.args.borrower, liqCtx)
|
accBorrower := suite.getAccountAtCtx(tc.args.borrower, liqCtx)
|
||||||
@ -705,10 +687,8 @@ func (suite *KeeperTestSuite) TestFullIndexLiquidation() {
|
|||||||
_, foundBorrowAfter := suite.keeper.GetBorrow(liqCtx, tc.args.borrower)
|
_, foundBorrowAfter := suite.keeper.GetBorrow(liqCtx, tc.args.borrower)
|
||||||
suite.Require().True(foundBorrowAfter)
|
suite.Require().True(foundBorrowAfter)
|
||||||
// Check that the user's deposits exist
|
// Check that the user's deposits exist
|
||||||
for _, coin := range tc.args.depositCoins {
|
_, foundDepositAfter := suite.keeper.GetDeposit(liqCtx, tc.args.borrower)
|
||||||
_, foundDepositAfter := suite.keeper.GetDeposit(liqCtx, tc.args.borrower, coin.Denom)
|
|
||||||
suite.Require().True(foundDepositAfter)
|
suite.Require().True(foundDepositAfter)
|
||||||
}
|
|
||||||
|
|
||||||
if !tc.errArgs.expectLiquidateOtherBorrowers {
|
if !tc.errArgs.expectLiquidateOtherBorrowers {
|
||||||
// Check that no auctions have been created
|
// Check that no auctions have been created
|
||||||
@ -725,11 +705,10 @@ func (suite *KeeperTestSuite) TestFullIndexLiquidation() {
|
|||||||
suite.Require().False(foundBorrowAfter)
|
suite.Require().False(foundBorrowAfter)
|
||||||
|
|
||||||
// Check deposits do not exist after liquidation
|
// Check deposits do not exist after liquidation
|
||||||
for _, coin := range tc.args.depositCoins {
|
|
||||||
_, foundDepositAfter := suite.keeper.GetDeposit(liqCtx, otherBorrower, coin.Denom)
|
_, foundDepositAfter := suite.keeper.GetDeposit(liqCtx, otherBorrower)
|
||||||
suite.Require().False(foundDepositAfter)
|
suite.Require().False(foundDepositAfter)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
var expectedLtvIndexItemCount int
|
var expectedLtvIndexItemCount int
|
||||||
if tc.errArgs.expectLiquidate {
|
if tc.errArgs.expectLiquidate {
|
||||||
@ -746,11 +725,10 @@ func (suite *KeeperTestSuite) TestFullIndexLiquidation() {
|
|||||||
suite.Require().True(foundBorrowAfter)
|
suite.Require().True(foundBorrowAfter)
|
||||||
|
|
||||||
// Check deposits do not exist after liquidation
|
// Check deposits do not exist after liquidation
|
||||||
for _, coin := range tc.args.depositCoins {
|
|
||||||
_, foundDepositAfter := suite.keeper.GetDeposit(liqCtx, otherBorrower, coin.Denom)
|
_, foundDepositAfter := suite.keeper.GetDeposit(liqCtx, otherBorrower)
|
||||||
suite.Require().True(foundDepositAfter)
|
suite.Require().True(foundDepositAfter)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
var expectedLtvIndexItemCount int
|
var expectedLtvIndexItemCount int
|
||||||
if tc.errArgs.expectLiquidate {
|
if tc.errArgs.expectLiquidate {
|
||||||
@ -817,7 +795,7 @@ func (suite *KeeperTestSuite) TestKeeperLiquidation() {
|
|||||||
initialModuleCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF))),
|
initialModuleCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF))),
|
||||||
initialBorrowerCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF))),
|
initialBorrowerCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF))),
|
||||||
initialKeeperCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF))),
|
initialKeeperCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF))),
|
||||||
depositCoins: []sdk.Coin{sdk.NewCoin("ukava", sdk.NewInt(10*KAVA_CF))},
|
depositCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(10*KAVA_CF))),
|
||||||
borrowCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(8*KAVA_CF))),
|
borrowCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(8*KAVA_CF))),
|
||||||
liquidateAfter: oneMonthInSeconds,
|
liquidateAfter: oneMonthInSeconds,
|
||||||
auctionSize: sdk.NewInt(KAVA_CF * 1000),
|
auctionSize: sdk.NewInt(KAVA_CF * 1000),
|
||||||
@ -855,7 +833,7 @@ func (suite *KeeperTestSuite) TestKeeperLiquidation() {
|
|||||||
initialModuleCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1000*KAVA_CF)), sdk.NewCoin("usdc", sdk.NewInt(1000*KAVA_CF)), sdk.NewCoin("bnb", sdk.NewInt(1000*BNB_CF)), sdk.NewCoin("btc", sdk.NewInt(1000*BTCB_CF))),
|
initialModuleCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1000*KAVA_CF)), sdk.NewCoin("usdc", sdk.NewInt(1000*KAVA_CF)), sdk.NewCoin("bnb", sdk.NewInt(1000*BNB_CF)), sdk.NewCoin("btc", sdk.NewInt(1000*BTCB_CF))),
|
||||||
initialBorrowerCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF))),
|
initialBorrowerCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF))),
|
||||||
initialKeeperCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF))),
|
initialKeeperCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF))),
|
||||||
depositCoins: []sdk.Coin{sdk.NewCoin("ukava", sdk.NewInt(50*KAVA_CF))}, // $100 * 0.8 = $80 borrowable
|
depositCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(50*KAVA_CF))), // $100 * 0.8 = $80 borrowable
|
||||||
borrowCoins: sdk.NewCoins(sdk.NewCoin("usdc", sdk.NewInt(20*KAVA_CF)), sdk.NewCoin("ukava", sdk.NewInt(10*KAVA_CF)), sdk.NewCoin("bnb", sdk.NewInt(2*BNB_CF)), sdk.NewCoin("btc", sdk.NewInt(0.2*BTCB_CF))), // $20+$20+$20 = $80 borrowed
|
borrowCoins: sdk.NewCoins(sdk.NewCoin("usdc", sdk.NewInt(20*KAVA_CF)), sdk.NewCoin("ukava", sdk.NewInt(10*KAVA_CF)), sdk.NewCoin("bnb", sdk.NewInt(2*BNB_CF)), sdk.NewCoin("btc", sdk.NewInt(0.2*BTCB_CF))), // $20+$20+$20 = $80 borrowed
|
||||||
liquidateAfter: oneMonthInSeconds,
|
liquidateAfter: oneMonthInSeconds,
|
||||||
auctionSize: sdk.NewInt(KAVA_CF * 1000),
|
auctionSize: sdk.NewInt(KAVA_CF * 1000),
|
||||||
@ -938,7 +916,7 @@ func (suite *KeeperTestSuite) TestKeeperLiquidation() {
|
|||||||
initialModuleCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1000*KAVA_CF))),
|
initialModuleCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1000*KAVA_CF))),
|
||||||
initialBorrowerCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF)), sdk.NewCoin("bnb", sdk.NewInt(100*BNB_CF)), sdk.NewCoin("btc", sdk.NewInt(100*BTCB_CF))),
|
initialBorrowerCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF)), sdk.NewCoin("bnb", sdk.NewInt(100*BNB_CF)), sdk.NewCoin("btc", sdk.NewInt(100*BTCB_CF))),
|
||||||
initialKeeperCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF))),
|
initialKeeperCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF))),
|
||||||
depositCoins: []sdk.Coin{sdk.NewCoin("ukava", sdk.NewInt(50*KAVA_CF)), sdk.NewCoin("bnb", sdk.NewInt(10*BNB_CF)), sdk.NewCoin("btc", sdk.NewInt(1*BTCB_CF))}, // $100 + $100 + $100 = $300 * 0.8 = $240 borrowable // $100 * 0.8 = $80 borrowable
|
depositCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(50*KAVA_CF)), sdk.NewCoin("bnb", sdk.NewInt(10*BNB_CF)), sdk.NewCoin("btc", sdk.NewInt(1*BTCB_CF))), // $100 + $100 + $100 = $300 * 0.8 = $240 borrowable // $100 * 0.8 = $80 borrowable
|
||||||
borrowCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(120*KAVA_CF))), // $240 borrowed
|
borrowCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(120*KAVA_CF))), // $240 borrowed
|
||||||
liquidateAfter: oneMonthInSeconds,
|
liquidateAfter: oneMonthInSeconds,
|
||||||
auctionSize: sdk.NewInt(KAVA_CF * 1000),
|
auctionSize: sdk.NewInt(KAVA_CF * 1000),
|
||||||
@ -1007,7 +985,7 @@ func (suite *KeeperTestSuite) TestKeeperLiquidation() {
|
|||||||
initialModuleCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1000*KAVA_CF)), sdk.NewCoin("bnb", sdk.NewInt(1000*BNB_CF)), sdk.NewCoin("btc", sdk.NewInt(1000*BTCB_CF))),
|
initialModuleCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1000*KAVA_CF)), sdk.NewCoin("bnb", sdk.NewInt(1000*BNB_CF)), sdk.NewCoin("btc", sdk.NewInt(1000*BTCB_CF))),
|
||||||
initialBorrowerCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF)), sdk.NewCoin("usdc", sdk.NewInt(100*KAVA_CF)), sdk.NewCoin("usdt", sdk.NewInt(100*KAVA_CF)), sdk.NewCoin("usdx", sdk.NewInt(100*KAVA_CF))),
|
initialBorrowerCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF)), sdk.NewCoin("usdc", sdk.NewInt(100*KAVA_CF)), sdk.NewCoin("usdt", sdk.NewInt(100*KAVA_CF)), sdk.NewCoin("usdx", sdk.NewInt(100*KAVA_CF))),
|
||||||
initialKeeperCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF))),
|
initialKeeperCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF))),
|
||||||
depositCoins: []sdk.Coin{sdk.NewCoin("usdc", sdk.NewInt(100*KAVA_CF)), sdk.NewCoin("usdt", sdk.NewInt(100*KAVA_CF)), sdk.NewCoin("usdx", sdk.NewInt(100*KAVA_CF))}, // $100 + $100 + $100 = $300 * 0.9 = $270 borrowable
|
depositCoins: sdk.NewCoins(sdk.NewCoin("usdc", sdk.NewInt(100*KAVA_CF)), sdk.NewCoin("usdt", sdk.NewInt(100*KAVA_CF)), sdk.NewCoin("usdx", sdk.NewInt(100*KAVA_CF))), // $100 + $100 + $100 = $300 * 0.9 = $270 borrowable
|
||||||
borrowCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(35*KAVA_CF)), sdk.NewCoin("bnb", sdk.NewInt(10*BNB_CF)), sdk.NewCoin("btc", sdk.NewInt(1*BTCB_CF))), // $270 borrowed
|
borrowCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(35*KAVA_CF)), sdk.NewCoin("bnb", sdk.NewInt(10*BNB_CF)), sdk.NewCoin("btc", sdk.NewInt(1*BTCB_CF))), // $270 borrowed
|
||||||
liquidateAfter: oneMonthInSeconds,
|
liquidateAfter: oneMonthInSeconds,
|
||||||
auctionSize: sdk.NewInt(KAVA_CF * 1000),
|
auctionSize: sdk.NewInt(KAVA_CF * 1000),
|
||||||
@ -1105,7 +1083,7 @@ func (suite *KeeperTestSuite) TestKeeperLiquidation() {
|
|||||||
initialModuleCoins: sdk.NewCoins(sdk.NewCoin("usdx", sdk.NewInt(1000*KAVA_CF)), sdk.NewCoin("usdt", sdk.NewInt(1000*KAVA_CF)), sdk.NewCoin("dai", sdk.NewInt(1000*KAVA_CF)), sdk.NewCoin("usdc", sdk.NewInt(1000*KAVA_CF))),
|
initialModuleCoins: sdk.NewCoins(sdk.NewCoin("usdx", sdk.NewInt(1000*KAVA_CF)), sdk.NewCoin("usdt", sdk.NewInt(1000*KAVA_CF)), sdk.NewCoin("dai", sdk.NewInt(1000*KAVA_CF)), sdk.NewCoin("usdc", sdk.NewInt(1000*KAVA_CF))),
|
||||||
initialBorrowerCoins: sdk.NewCoins(sdk.NewCoin("usdx", sdk.NewInt(1000*KAVA_CF)), sdk.NewCoin("usdt", sdk.NewInt(1000*KAVA_CF)), sdk.NewCoin("dai", sdk.NewInt(1000*KAVA_CF)), sdk.NewCoin("usdc", sdk.NewInt(1000*KAVA_CF))),
|
initialBorrowerCoins: sdk.NewCoins(sdk.NewCoin("usdx", sdk.NewInt(1000*KAVA_CF)), sdk.NewCoin("usdt", sdk.NewInt(1000*KAVA_CF)), sdk.NewCoin("dai", sdk.NewInt(1000*KAVA_CF)), sdk.NewCoin("usdc", sdk.NewInt(1000*KAVA_CF))),
|
||||||
initialKeeperCoins: sdk.NewCoins(sdk.NewCoin("usdx", sdk.NewInt(1000*KAVA_CF)), sdk.NewCoin("usdt", sdk.NewInt(1000*KAVA_CF)), sdk.NewCoin("dai", sdk.NewInt(1000*KAVA_CF)), sdk.NewCoin("usdc", sdk.NewInt(1000*KAVA_CF))),
|
initialKeeperCoins: sdk.NewCoins(sdk.NewCoin("usdx", sdk.NewInt(1000*KAVA_CF)), sdk.NewCoin("usdt", sdk.NewInt(1000*KAVA_CF)), sdk.NewCoin("dai", sdk.NewInt(1000*KAVA_CF)), sdk.NewCoin("usdc", sdk.NewInt(1000*KAVA_CF))),
|
||||||
depositCoins: []sdk.Coin{sdk.NewCoin("dai", sdk.NewInt(350*KAVA_CF)), sdk.NewCoin("usdc", sdk.NewInt(200*KAVA_CF))},
|
depositCoins: sdk.NewCoins(sdk.NewCoin("dai", sdk.NewInt(350*KAVA_CF)), sdk.NewCoin("usdc", sdk.NewInt(200*KAVA_CF))),
|
||||||
borrowCoins: sdk.NewCoins(sdk.NewCoin("usdt", sdk.NewInt(250*KAVA_CF)), sdk.NewCoin("usdx", sdk.NewInt(245*KAVA_CF))),
|
borrowCoins: sdk.NewCoins(sdk.NewCoin("usdt", sdk.NewInt(250*KAVA_CF)), sdk.NewCoin("usdx", sdk.NewInt(245*KAVA_CF))),
|
||||||
liquidateAfter: oneMonthInSeconds,
|
liquidateAfter: oneMonthInSeconds,
|
||||||
auctionSize: sdk.NewInt(KAVA_CF * 100000),
|
auctionSize: sdk.NewInt(KAVA_CF * 100000),
|
||||||
@ -1173,7 +1151,7 @@ func (suite *KeeperTestSuite) TestKeeperLiquidation() {
|
|||||||
initialModuleCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF))),
|
initialModuleCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF))),
|
||||||
initialBorrowerCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF))),
|
initialBorrowerCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF))),
|
||||||
initialKeeperCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF))),
|
initialKeeperCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(100*KAVA_CF))),
|
||||||
depositCoins: []sdk.Coin{sdk.NewCoin("ukava", sdk.NewInt(20*KAVA_CF))}, // Deposit 20 KAVA
|
depositCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(20*KAVA_CF))), // Deposit 20 KAVA
|
||||||
borrowCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(5*KAVA_CF))), // Borrow 5 KAVA
|
borrowCoins: sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(5*KAVA_CF))), // Borrow 5 KAVA
|
||||||
liquidateAfter: oneMonthInSeconds,
|
liquidateAfter: oneMonthInSeconds,
|
||||||
auctionSize: sdk.NewInt(KAVA_CF * 1000),
|
auctionSize: sdk.NewInt(KAVA_CF * 1000),
|
||||||
@ -1360,10 +1338,8 @@ func (suite *KeeperTestSuite) TestKeeperLiquidation() {
|
|||||||
harvest.BeginBlocker(suite.ctx, suite.keeper)
|
harvest.BeginBlocker(suite.ctx, suite.keeper)
|
||||||
|
|
||||||
// Deposit coins
|
// Deposit coins
|
||||||
for _, coin := range tc.args.depositCoins {
|
err = suite.keeper.Deposit(suite.ctx, tc.args.borrower, tc.args.depositCoins)
|
||||||
err = suite.keeper.Deposit(suite.ctx, tc.args.borrower, coin)
|
|
||||||
suite.Require().NoError(err)
|
suite.Require().NoError(err)
|
||||||
}
|
|
||||||
|
|
||||||
// Borrow coins
|
// Borrow coins
|
||||||
err = suite.keeper.Borrow(suite.ctx, tc.args.borrower, tc.args.borrowCoins)
|
err = suite.keeper.Borrow(suite.ctx, tc.args.borrower, tc.args.borrowCoins)
|
||||||
@ -1377,11 +1353,9 @@ func (suite *KeeperTestSuite) TestKeeperLiquidation() {
|
|||||||
// Check borrow exists before liquidation
|
// Check borrow exists before liquidation
|
||||||
_, foundBorrowBefore := suite.keeper.GetBorrow(liqCtx, tc.args.borrower)
|
_, foundBorrowBefore := suite.keeper.GetBorrow(liqCtx, tc.args.borrower)
|
||||||
suite.Require().True(foundBorrowBefore)
|
suite.Require().True(foundBorrowBefore)
|
||||||
// Check that the user's deposits exist before liquidation
|
// Check that the user's deposit exists before liquidation
|
||||||
for _, coin := range tc.args.depositCoins {
|
_, foundDepositBefore := suite.keeper.GetDeposit(liqCtx, tc.args.borrower)
|
||||||
_, foundDepositBefore := suite.keeper.GetDeposit(liqCtx, tc.args.borrower, coin.Denom)
|
|
||||||
suite.Require().True(foundDepositBefore)
|
suite.Require().True(foundDepositBefore)
|
||||||
}
|
|
||||||
|
|
||||||
// Attempt to liquidate
|
// Attempt to liquidate
|
||||||
liquidated, err := suite.keeper.AttemptKeeperLiquidation(liqCtx, tc.args.keeper, tc.args.borrower)
|
liquidated, err := suite.keeper.AttemptKeeperLiquidation(liqCtx, tc.args.keeper, tc.args.borrower)
|
||||||
@ -1393,10 +1367,8 @@ func (suite *KeeperTestSuite) TestKeeperLiquidation() {
|
|||||||
_, foundBorrowAfter := suite.keeper.GetBorrow(liqCtx, tc.args.borrower)
|
_, foundBorrowAfter := suite.keeper.GetBorrow(liqCtx, tc.args.borrower)
|
||||||
suite.Require().False(foundBorrowAfter)
|
suite.Require().False(foundBorrowAfter)
|
||||||
// Check deposits do not exist after liquidation
|
// Check deposits do not exist after liquidation
|
||||||
for _, coin := range tc.args.depositCoins {
|
_, foundDepositAfter := suite.keeper.GetDeposit(liqCtx, tc.args.borrower)
|
||||||
_, foundDepositAfter := suite.keeper.GetDeposit(liqCtx, tc.args.borrower, coin.Denom)
|
|
||||||
suite.Require().False(foundDepositAfter)
|
suite.Require().False(foundDepositAfter)
|
||||||
}
|
|
||||||
|
|
||||||
// Check that the keeper's balance increased by reward % of all the borrowed coins
|
// Check that the keeper's balance increased by reward % of all the borrowed coins
|
||||||
accKeeper := suite.getAccountAtCtx(tc.args.keeper, liqCtx)
|
accKeeper := suite.getAccountAtCtx(tc.args.keeper, liqCtx)
|
||||||
@ -1419,10 +1391,8 @@ func (suite *KeeperTestSuite) TestKeeperLiquidation() {
|
|||||||
_, foundBorrowAfter := suite.keeper.GetBorrow(liqCtx, tc.args.borrower)
|
_, foundBorrowAfter := suite.keeper.GetBorrow(liqCtx, tc.args.borrower)
|
||||||
suite.Require().True(foundBorrowAfter)
|
suite.Require().True(foundBorrowAfter)
|
||||||
// Check that the user's deposits exist
|
// Check that the user's deposits exist
|
||||||
for _, coin := range tc.args.depositCoins {
|
_, foundDepositAfter := suite.keeper.GetDeposit(liqCtx, tc.args.borrower)
|
||||||
_, foundDepositAfter := suite.keeper.GetDeposit(liqCtx, tc.args.borrower, coin.Denom)
|
|
||||||
suite.Require().True(foundDepositAfter)
|
suite.Require().True(foundDepositAfter)
|
||||||
}
|
|
||||||
|
|
||||||
// Check that no auctions have been created
|
// Check that no auctions have been created
|
||||||
auctions := suite.auctionKeeper.GetAllAuctions(liqCtx)
|
auctions := suite.auctionKeeper.GetAllAuctions(liqCtx)
|
||||||
|
@ -90,23 +90,27 @@ func queryGetDeposits(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte,
|
|||||||
var deposits []types.Deposit
|
var deposits []types.Deposit
|
||||||
switch {
|
switch {
|
||||||
case depositDenom && owner:
|
case depositDenom && owner:
|
||||||
deposit, found := k.GetDeposit(ctx, params.Owner, params.DepositDenom)
|
deposit, found := k.GetDeposit(ctx, params.Owner)
|
||||||
if found {
|
if found {
|
||||||
|
for _, depCoin := range deposit.Amount {
|
||||||
|
if depCoin.Denom == params.DepositDenom {
|
||||||
deposits = append(deposits, deposit)
|
deposits = append(deposits, deposit)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
case depositDenom:
|
case depositDenom:
|
||||||
k.IterateDepositsByDenom(ctx, params.DepositDenom, func(deposit types.Deposit) (stop bool) {
|
k.IterateDeposits(ctx, func(deposit types.Deposit) (stop bool) {
|
||||||
|
if deposit.Amount.AmountOf(params.DepositDenom).IsPositive() {
|
||||||
deposits = append(deposits, deposit)
|
deposits = append(deposits, deposit)
|
||||||
|
}
|
||||||
return false
|
return false
|
||||||
})
|
})
|
||||||
case owner:
|
case owner:
|
||||||
schedules := k.GetParams(ctx).LiquidityProviderSchedules
|
deposit, found := k.GetDeposit(ctx, params.Owner)
|
||||||
for _, lps := range schedules {
|
|
||||||
deposit, found := k.GetDeposit(ctx, params.Owner, lps.DepositDenom)
|
|
||||||
if found {
|
if found {
|
||||||
deposits = append(deposits, deposit)
|
deposits = append(deposits, deposit)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
k.IterateDeposits(ctx, func(deposit types.Deposit) (stop bool) {
|
k.IterateDeposits(ctx, func(deposit types.Deposit) (stop bool) {
|
||||||
deposits = append(deposits, deposit)
|
deposits = append(deposits, deposit)
|
||||||
|
@ -192,12 +192,8 @@ func (suite *KeeperTestSuite) TestRepay() {
|
|||||||
harvest.BeginBlocker(suite.ctx, suite.keeper)
|
harvest.BeginBlocker(suite.ctx, suite.keeper)
|
||||||
|
|
||||||
// Deposit coins to harvest
|
// Deposit coins to harvest
|
||||||
depositedCoins := sdk.NewCoins()
|
err = suite.keeper.Deposit(suite.ctx, tc.args.borrower, tc.args.depositCoins)
|
||||||
for _, depositCoin := range tc.args.depositCoins {
|
|
||||||
err = suite.keeper.Deposit(suite.ctx, tc.args.borrower, depositCoin)
|
|
||||||
suite.Require().NoError(err)
|
suite.Require().NoError(err)
|
||||||
depositedCoins.Add(depositCoin)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Borrow coins from harvest
|
// Borrow coins from harvest
|
||||||
err = suite.keeper.Borrow(suite.ctx, tc.args.borrower, tc.args.borrowCoins)
|
err = suite.keeper.Borrow(suite.ctx, tc.args.borrower, tc.args.borrowCoins)
|
||||||
|
@ -43,8 +43,8 @@ func (k Keeper) ApplyDepositRewards(ctx sdk.Context) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
rewardsDistributed := sdk.ZeroInt()
|
rewardsDistributed := sdk.ZeroInt()
|
||||||
k.IterateDepositsByDenom(ctx, lps.DepositDenom, func(dep types.Deposit) (stop bool) {
|
k.IterateDeposits(ctx, func(dep types.Deposit) (stop bool) {
|
||||||
rewardsShare := sdk.NewDecFromInt(dep.Amount.Amount).Quo(sdk.NewDecFromInt(totalDeposited))
|
rewardsShare := sdk.NewDecFromInt(dep.Amount.AmountOf(lps.DepositDenom)).Quo(sdk.NewDecFromInt(totalDeposited))
|
||||||
if rewardsShare.IsZero() {
|
if rewardsShare.IsZero() {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@ -52,7 +52,7 @@ func (k Keeper) ApplyDepositRewards(ctx sdk.Context) {
|
|||||||
if rewardsEarned.IsZero() {
|
if rewardsEarned.IsZero() {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
k.AddToClaim(ctx, dep.Depositor, dep.Amount.Denom, types.LP, sdk.NewCoin(lps.RewardsPerSecond.Denom, rewardsEarned))
|
k.AddToClaim(ctx, dep.Depositor, lps.DepositDenom, types.LP, sdk.NewCoin(lps.RewardsPerSecond.Denom, rewardsEarned))
|
||||||
rewardsDistributed = rewardsDistributed.Add(rewardsEarned)
|
rewardsDistributed = rewardsDistributed.Add(rewardsEarned)
|
||||||
return false
|
return false
|
||||||
})
|
})
|
||||||
|
@ -21,7 +21,7 @@ func (suite *KeeperTestSuite) TestApplyDepositRewards() {
|
|||||||
type args struct {
|
type args struct {
|
||||||
depositor sdk.AccAddress
|
depositor sdk.AccAddress
|
||||||
denom string
|
denom string
|
||||||
depositAmount sdk.Coin
|
depositAmount sdk.Coins
|
||||||
totalDeposits sdk.Coin
|
totalDeposits sdk.Coin
|
||||||
rewardRate sdk.Coin
|
rewardRate sdk.Coin
|
||||||
claimType types.ClaimType
|
claimType types.ClaimType
|
||||||
@ -45,7 +45,7 @@ func (suite *KeeperTestSuite) TestApplyDepositRewards() {
|
|||||||
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
depositor: sdk.AccAddress(crypto.AddressHash([]byte("test"))),
|
||||||
denom: "bnb",
|
denom: "bnb",
|
||||||
rewardRate: c("hard", 500),
|
rewardRate: c("hard", 500),
|
||||||
depositAmount: c("bnb", 100),
|
depositAmount: cs(c("bnb", 100)),
|
||||||
totalDeposits: c("bnb", 1000),
|
totalDeposits: c("bnb", 1000),
|
||||||
claimType: types.LP,
|
claimType: types.LP,
|
||||||
previousBlockTime: time.Date(2020, 11, 1, 13, 59, 50, 0, time.UTC),
|
previousBlockTime: time.Date(2020, 11, 1, 13, 59, 50, 0, time.UTC),
|
||||||
|
@ -27,7 +27,7 @@ func TestDecodeDistributionStore(t *testing.T) {
|
|||||||
cdc := makeTestCodec()
|
cdc := makeTestCodec()
|
||||||
|
|
||||||
prevBlockTime := time.Now().UTC()
|
prevBlockTime := time.Now().UTC()
|
||||||
deposit := types.NewDeposit(sdk.AccAddress("test"), sdk.NewCoin("bnb", sdk.NewInt(1)))
|
deposit := types.NewDeposit(sdk.AccAddress("test"), sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(1))))
|
||||||
claim := types.NewClaim(sdk.AccAddress("test"), "bnb", sdk.NewCoin("hard", sdk.NewInt(100)), "stake")
|
claim := types.NewClaim(sdk.AccAddress("test"), "bnb", sdk.NewCoin("hard", sdk.NewInt(100)), "stake")
|
||||||
|
|
||||||
kvPairs := kv.Pairs{
|
kvPairs := kv.Pairs{
|
||||||
|
@ -7,11 +7,11 @@ import (
|
|||||||
// Deposit defines an amount of coins deposited into a harvest module account
|
// Deposit defines an amount of coins deposited into a harvest module account
|
||||||
type Deposit struct {
|
type Deposit struct {
|
||||||
Depositor sdk.AccAddress `json:"depositor" yaml:"depositor"`
|
Depositor sdk.AccAddress `json:"depositor" yaml:"depositor"`
|
||||||
Amount sdk.Coin `json:"amount" yaml:"amount"`
|
Amount sdk.Coins `json:"amount" yaml:"amount"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDeposit returns a new deposit
|
// NewDeposit returns a new deposit
|
||||||
func NewDeposit(depositor sdk.AccAddress, amount sdk.Coin) Deposit {
|
func NewDeposit(depositor sdk.AccAddress, amount sdk.Coins) Deposit {
|
||||||
return Deposit{
|
return Deposit{
|
||||||
Depositor: depositor,
|
Depositor: depositor,
|
||||||
Amount: amount,
|
Amount: amount,
|
||||||
|
@ -12,7 +12,7 @@ var (
|
|||||||
// ErrDepositNotFound error for deposit not found
|
// ErrDepositNotFound error for deposit not found
|
||||||
ErrDepositNotFound = sdkerrors.Register(ModuleName, 3, "deposit not found")
|
ErrDepositNotFound = sdkerrors.Register(ModuleName, 3, "deposit not found")
|
||||||
// ErrInvalidWithdrawAmount error for invalid withdrawal amount
|
// ErrInvalidWithdrawAmount error for invalid withdrawal amount
|
||||||
ErrInvalidWithdrawAmount = sdkerrors.Register(ModuleName, 4, "withdrawal amount exceeds deposit amount")
|
ErrInvalidWithdrawAmount = sdkerrors.Register(ModuleName, 4, "invalid withdrawal amount")
|
||||||
// ErrInvalidClaimType error for invalid claim type
|
// ErrInvalidClaimType error for invalid claim type
|
||||||
ErrInvalidClaimType = sdkerrors.Register(ModuleName, 5, "invalid claim type")
|
ErrInvalidClaimType = sdkerrors.Register(ModuleName, 5, "invalid claim type")
|
||||||
// ErrClaimNotFound error for claim not found
|
// ErrClaimNotFound error for claim not found
|
||||||
|
@ -48,11 +48,6 @@ var (
|
|||||||
sep = []byte(":")
|
sep = []byte(":")
|
||||||
)
|
)
|
||||||
|
|
||||||
// DepositKey key of a specific deposit in the store
|
|
||||||
func DepositKey(denom string, depositor sdk.AccAddress) []byte {
|
|
||||||
return createKey([]byte(denom), sep, depositor)
|
|
||||||
}
|
|
||||||
|
|
||||||
// DepositTypeIteratorKey returns an interator prefix for interating over deposits by deposit denom
|
// DepositTypeIteratorKey returns an interator prefix for interating over deposits by deposit denom
|
||||||
func DepositTypeIteratorKey(denom string) []byte {
|
func DepositTypeIteratorKey(denom string) []byte {
|
||||||
return createKey([]byte(denom))
|
return createKey([]byte(denom))
|
||||||
|
@ -58,11 +58,11 @@ var (
|
|||||||
// MsgDeposit deposit collateral to the harvest module.
|
// MsgDeposit deposit collateral to the harvest module.
|
||||||
type MsgDeposit struct {
|
type MsgDeposit struct {
|
||||||
Depositor sdk.AccAddress `json:"depositor" yaml:"depositor"`
|
Depositor sdk.AccAddress `json:"depositor" yaml:"depositor"`
|
||||||
Amount sdk.Coin `json:"amount" yaml:"amount"`
|
Amount sdk.Coins `json:"amount" yaml:"amount"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMsgDeposit returns a new MsgDeposit
|
// NewMsgDeposit returns a new MsgDeposit
|
||||||
func NewMsgDeposit(depositor sdk.AccAddress, amount sdk.Coin) MsgDeposit {
|
func NewMsgDeposit(depositor sdk.AccAddress, amount sdk.Coins) MsgDeposit {
|
||||||
return MsgDeposit{
|
return MsgDeposit{
|
||||||
Depositor: depositor,
|
Depositor: depositor,
|
||||||
Amount: amount,
|
Amount: amount,
|
||||||
@ -108,11 +108,11 @@ func (msg MsgDeposit) String() string {
|
|||||||
// MsgWithdraw withdraw from the harvest module.
|
// MsgWithdraw withdraw from the harvest module.
|
||||||
type MsgWithdraw struct {
|
type MsgWithdraw struct {
|
||||||
Depositor sdk.AccAddress `json:"depositor" yaml:"depositor"`
|
Depositor sdk.AccAddress `json:"depositor" yaml:"depositor"`
|
||||||
Amount sdk.Coin `json:"amount" yaml:"amount"`
|
Amount sdk.Coins `json:"amount" yaml:"amount"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMsgWithdraw returns a new MsgWithdraw
|
// NewMsgWithdraw returns a new MsgWithdraw
|
||||||
func NewMsgWithdraw(depositor sdk.AccAddress, amount sdk.Coin) MsgWithdraw {
|
func NewMsgWithdraw(depositor sdk.AccAddress, amount sdk.Coins) MsgWithdraw {
|
||||||
return MsgWithdraw{
|
return MsgWithdraw{
|
||||||
Depositor: depositor,
|
Depositor: depositor,
|
||||||
Amount: amount,
|
Amount: amount,
|
||||||
|
@ -18,7 +18,7 @@ type MsgTestSuite struct {
|
|||||||
func (suite *MsgTestSuite) TestMsgDeposit() {
|
func (suite *MsgTestSuite) TestMsgDeposit() {
|
||||||
type args struct {
|
type args struct {
|
||||||
depositor sdk.AccAddress
|
depositor sdk.AccAddress
|
||||||
amount sdk.Coin
|
amount sdk.Coins
|
||||||
}
|
}
|
||||||
addrs := []sdk.AccAddress{
|
addrs := []sdk.AccAddress{
|
||||||
sdk.AccAddress("test1"),
|
sdk.AccAddress("test1"),
|
||||||
@ -34,7 +34,7 @@ func (suite *MsgTestSuite) TestMsgDeposit() {
|
|||||||
name: "valid",
|
name: "valid",
|
||||||
args: args{
|
args: args{
|
||||||
depositor: addrs[0],
|
depositor: addrs[0],
|
||||||
amount: sdk.NewCoin("bnb", sdk.NewInt(10000000)),
|
amount: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(10000000))),
|
||||||
},
|
},
|
||||||
expectPass: true,
|
expectPass: true,
|
||||||
expectedErr: "",
|
expectedErr: "",
|
||||||
@ -43,7 +43,7 @@ func (suite *MsgTestSuite) TestMsgDeposit() {
|
|||||||
name: "valid2",
|
name: "valid2",
|
||||||
args: args{
|
args: args{
|
||||||
depositor: addrs[0],
|
depositor: addrs[0],
|
||||||
amount: sdk.NewCoin("bnb", sdk.NewInt(10000000)),
|
amount: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(10000000))),
|
||||||
},
|
},
|
||||||
expectPass: true,
|
expectPass: true,
|
||||||
expectedErr: "",
|
expectedErr: "",
|
||||||
@ -66,7 +66,7 @@ func (suite *MsgTestSuite) TestMsgDeposit() {
|
|||||||
func (suite *MsgTestSuite) TestMsgWithdraw() {
|
func (suite *MsgTestSuite) TestMsgWithdraw() {
|
||||||
type args struct {
|
type args struct {
|
||||||
depositor sdk.AccAddress
|
depositor sdk.AccAddress
|
||||||
amount sdk.Coin
|
amount sdk.Coins
|
||||||
}
|
}
|
||||||
addrs := []sdk.AccAddress{
|
addrs := []sdk.AccAddress{
|
||||||
sdk.AccAddress("test1"),
|
sdk.AccAddress("test1"),
|
||||||
@ -82,7 +82,7 @@ func (suite *MsgTestSuite) TestMsgWithdraw() {
|
|||||||
name: "valid",
|
name: "valid",
|
||||||
args: args{
|
args: args{
|
||||||
depositor: addrs[0],
|
depositor: addrs[0],
|
||||||
amount: sdk.NewCoin("bnb", sdk.NewInt(10000000)),
|
amount: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(10000000))),
|
||||||
},
|
},
|
||||||
expectPass: true,
|
expectPass: true,
|
||||||
expectedErr: "",
|
expectedErr: "",
|
||||||
@ -91,7 +91,7 @@ func (suite *MsgTestSuite) TestMsgWithdraw() {
|
|||||||
name: "valid2",
|
name: "valid2",
|
||||||
args: args{
|
args: args{
|
||||||
depositor: addrs[0],
|
depositor: addrs[0],
|
||||||
amount: sdk.NewCoin("bnb", sdk.NewInt(10000000)),
|
amount: sdk.NewCoins(sdk.NewCoin("bnb", sdk.NewInt(10000000))),
|
||||||
},
|
},
|
||||||
expectPass: true,
|
expectPass: true,
|
||||||
expectedErr: "",
|
expectedErr: "",
|
||||||
|
Loading…
Reference in New Issue
Block a user