From b68685af329437f6324852832b3669cd157baa55 Mon Sep 17 00:00:00 2001 From: Derrick Lee Date: Sun, 25 Sep 2022 15:26:46 -0700 Subject: [PATCH] Exclude non-bkava denoms from aggregate underlying ukava calculation (#1311) --- x/earn/keeper/grpc_query.go | 10 +++++++++- x/earn/keeper/grpc_query_test.go | 16 +++++++++++++++- x/earn/types/expected_keepers.go | 1 + 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/x/earn/keeper/grpc_query.go b/x/earn/keeper/grpc_query.go index c081547b..f0c245a1 100644 --- a/x/earn/keeper/grpc_query.go +++ b/x/earn/keeper/grpc_query.go @@ -343,8 +343,16 @@ func (s queryServer) getOneAccountBkavaVaultDeposit( return nil, err } + // Remove non-bkava coins, GetStakedTokensForDerivatives expects only bkava + totalBkavaValue := sdk.NewCoins() + for _, coin := range totalAccountValue { + if s.keeper.liquidKeeper.IsDerivativeDenom(ctx, coin.Denom) { + totalBkavaValue = totalBkavaValue.Add(coin) + } + } + // Use account value with only the aggregate bkava converted to underlying staked tokens - stakedValue, err := s.keeper.liquidKeeper.GetStakedTokensForDerivatives(ctx, totalAccountValue) + stakedValue, err := s.keeper.liquidKeeper.GetStakedTokensForDerivatives(ctx, totalBkavaValue) if err != nil { return nil, err } diff --git a/x/earn/keeper/grpc_query_test.go b/x/earn/keeper/grpc_query_test.go index 567396c8..395a5e41 100644 --- a/x/earn/keeper/grpc_query_test.go +++ b/x/earn/keeper/grpc_query_test.go @@ -417,13 +417,23 @@ func (suite *grpcQueryTestSuite) TestDeposits_bKava() { []sdk.AccAddress{}, ) + suite.CreateVault( + "ukava", + types.StrategyTypes{types.STRATEGY_TYPE_SAVINGS}, + false, + []sdk.AccAddress{}, + ) + address1, derivatives1, _ := suite.createAccountWithDerivatives(testutil.TestBkavaDenoms[0], sdk.NewInt(1e9)) address2, derivatives2, _ := suite.createAccountWithDerivatives(testutil.TestBkavaDenoms[1], sdk.NewInt(1e9)) + err := suite.App.FundAccount(suite.Ctx, address1, sdk.NewCoins(sdk.NewCoin("ukava", sdk.NewInt(1e9)))) + suite.Require().NoError(err) + // Slash the last validator to reduce the value of it's derivatives to test bkava to underlying token conversion. // First call end block to bond validator to enable slashing. staking.EndBlocker(suite.Ctx, suite.App.GetStakingKeeper()) - err := suite.slashValidator(sdk.ValAddress(address2), sdk.MustNewDecFromStr("0.5")) + err = suite.slashValidator(sdk.ValAddress(address2), sdk.MustNewDecFromStr("0.5")) suite.Require().NoError(err) suite.Run("no deposits", func() { @@ -458,6 +468,9 @@ func (suite *grpcQueryTestSuite) TestDeposits_bKava() { err = suite.Keeper.Deposit(suite.Ctx, address1, derivatives2, types.STRATEGY_TYPE_SAVINGS) suite.Require().NoError(err) + err = suite.Keeper.Deposit(suite.Ctx, address1, sdk.NewInt64Coin("ukava", 1e6), types.STRATEGY_TYPE_SAVINGS) + suite.Require().NoError(err) + suite.Run("multiple deposits", func() { // Query all deposits for account 1 res, err := suite.queryClient.Deposits( @@ -468,6 +481,7 @@ func (suite *grpcQueryTestSuite) TestDeposits_bKava() { suite.Require().Len(res.Deposits, 1) // first validator isn't slashed, so bkava units equal to underlying staked tokens // last validator slashed 50% so derivatives are worth half + // Excludes non-bkava deposits expectedValue := derivatives1.Amount.Add(derivatives2.Amount.QuoRaw(2)) suite.Require().ElementsMatchf( []types.DepositResponse{ diff --git a/x/earn/types/expected_keepers.go b/x/earn/types/expected_keepers.go index df654e60..99dd28da 100644 --- a/x/earn/types/expected_keepers.go +++ b/x/earn/types/expected_keepers.go @@ -28,6 +28,7 @@ type BankKeeper interface { // LiquidKeeper defines the expected interface needed for derivative to staked token conversions. type LiquidKeeper interface { GetStakedTokensForDerivatives(ctx sdk.Context, derivatives sdk.Coins) (sdk.Coin, error) + IsDerivativeDenom(ctx sdk.Context, denom string) bool } // HardKeeper defines the expected interface needed for the hard strategy.