Add Earn deposits value_in_staked_tokens query parameter (#1325)

* Add earn deposits query param to return individual vaults value as ukava

* Add value_in_staked_tokens param handler to specific vault query

* Use separate ukava coins when querying deposits in ukava

Avoid usd of sdk.Coins.Add() as those will aggregate ukava amounts
This commit is contained in:
Derrick Lee 2022-10-03 16:37:29 -07:00 committed by GitHub
parent c773d874ae
commit 4c879bc4fb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 614 additions and 95 deletions

View File

@ -7077,6 +7077,12 @@ paths:
in: query in: query
required: false required: false
type: string type: string
- name: value_in_staked_tokens
description: respond with vault value in ukava for bkava vaults.
in: query
required: false
type: boolean
format: boolean
- name: pagination.key - name: pagination.key
description: |- description: |-
key is a value returned in PageResponse.next_key to begin key is a value returned in PageResponse.next_key to begin
@ -10785,6 +10791,66 @@ paths:
representing the yearly APR of KAVA tokens that will be representing the yearly APR of KAVA tokens that will be
minted during that period minted during that period
infrastructure_params:
type: object
properties:
infrastructure_periods:
type: array
items:
type: object
properties:
start:
type: string
format: date-time
title: example "2020-03-01T15:20:00Z"
end:
type: string
format: date-time
title: example "2020-06-01T15:20:00Z"
inflation:
type: string
format: byte
title: example "1.000000003022265980" - 10% inflation
title: >-
Period stores the specified start and end dates, and
the inflation, expressed as a decimal
representing the yearly APR of KAVA tokens that will
be minted during that period
core_rewards:
type: array
items:
type: object
properties:
address:
type: string
format: byte
weight:
type: string
partner_rewards:
type: array
items:
type: object
properties:
address:
type: string
format: byte
rewards_per_second:
type: object
properties:
denom:
type: string
amount:
type: string
description: >-
Coin defines a token with a denomination and an
amount.
NOTE: The amount field is an Int which
implements the custom method
signatures required by gogoproto.
title: Params governance parameters for kavadist module title: Params governance parameters for kavadist module
description: >- description: >-
QueryParamsResponse defines the response type for querying QueryParamsResponse defines the response type for querying
@ -55834,6 +55900,73 @@ definitions:
time_period: time_period:
type: string type: string
title: RateLimit parameters for rate-limiting the supply of an issued asset title: RateLimit parameters for rate-limiting the supply of an issued asset
kava.kavadist.v1beta1.CoreReward:
type: object
properties:
address:
type: string
format: byte
weight:
type: string
kava.kavadist.v1beta1.InfrastructureParams:
type: object
properties:
infrastructure_periods:
type: array
items:
type: object
properties:
start:
type: string
format: date-time
title: example "2020-03-01T15:20:00Z"
end:
type: string
format: date-time
title: example "2020-06-01T15:20:00Z"
inflation:
type: string
format: byte
title: example "1.000000003022265980" - 10% inflation
title: >-
Period stores the specified start and end dates, and the inflation,
expressed as a decimal
representing the yearly APR of KAVA tokens that will be minted
during that period
core_rewards:
type: array
items:
type: object
properties:
address:
type: string
format: byte
weight:
type: string
partner_rewards:
type: array
items:
type: object
properties:
address:
type: string
format: byte
rewards_per_second:
type: object
properties:
denom:
type: string
amount:
type: string
description: >-
Coin defines a token with a denomination and an amount.
NOTE: The amount field is an Int which implements the custom
method
signatures required by gogoproto.
kava.kavadist.v1beta1.Params: kava.kavadist.v1beta1.Params:
type: object type: object
properties: properties:
@ -55863,7 +55996,84 @@ definitions:
representing the yearly APR of KAVA tokens that will be minted representing the yearly APR of KAVA tokens that will be minted
during that period during that period
infrastructure_params:
type: object
properties:
infrastructure_periods:
type: array
items:
type: object
properties:
start:
type: string
format: date-time
title: example "2020-03-01T15:20:00Z"
end:
type: string
format: date-time
title: example "2020-06-01T15:20:00Z"
inflation:
type: string
format: byte
title: example "1.000000003022265980" - 10% inflation
title: >-
Period stores the specified start and end dates, and the
inflation, expressed as a decimal
representing the yearly APR of KAVA tokens that will be minted
during that period
core_rewards:
type: array
items:
type: object
properties:
address:
type: string
format: byte
weight:
type: string
partner_rewards:
type: array
items:
type: object
properties:
address:
type: string
format: byte
rewards_per_second:
type: object
properties:
denom:
type: string
amount:
type: string
description: >-
Coin defines a token with a denomination and an amount.
NOTE: The amount field is an Int which implements the custom
method
signatures required by gogoproto.
title: Params governance parameters for kavadist module title: Params governance parameters for kavadist module
kava.kavadist.v1beta1.PartnerReward:
type: object
properties:
address:
type: string
format: byte
rewards_per_second:
type: object
properties:
denom:
type: string
amount:
type: string
description: |-
Coin defines a token with a denomination and an amount.
NOTE: The amount field is an Int which implements the custom method
signatures required by gogoproto.
kava.kavadist.v1beta1.Period: kava.kavadist.v1beta1.Period:
type: object type: object
properties: properties:
@ -55937,6 +56147,65 @@ definitions:
representing the yearly APR of KAVA tokens that will be minted representing the yearly APR of KAVA tokens that will be minted
during that period during that period
infrastructure_params:
type: object
properties:
infrastructure_periods:
type: array
items:
type: object
properties:
start:
type: string
format: date-time
title: example "2020-03-01T15:20:00Z"
end:
type: string
format: date-time
title: example "2020-06-01T15:20:00Z"
inflation:
type: string
format: byte
title: example "1.000000003022265980" - 10% inflation
title: >-
Period stores the specified start and end dates, and the
inflation, expressed as a decimal
representing the yearly APR of KAVA tokens that will be
minted during that period
core_rewards:
type: array
items:
type: object
properties:
address:
type: string
format: byte
weight:
type: string
partner_rewards:
type: array
items:
type: object
properties:
address:
type: string
format: byte
rewards_per_second:
type: object
properties:
denom:
type: string
amount:
type: string
description: >-
Coin defines a token with a denomination and an amount.
NOTE: The amount field is an Int which implements the
custom method
signatures required by gogoproto.
title: Params governance parameters for kavadist module title: Params governance parameters for kavadist module
description: >- description: >-
QueryParamsResponse defines the response type for querying x/kavadist QueryParamsResponse defines the response type for querying x/kavadist

View File

@ -3089,6 +3089,7 @@ QueryDepositsRequest is the request type for the Query/Deposits RPC method.
| ----- | ---- | ----- | ----------- | | ----- | ---- | ----- | ----------- |
| `depositor` | [string](#string) | | depositor optionally filters deposits by depositor | | `depositor` | [string](#string) | | depositor optionally filters deposits by depositor |
| `denom` | [string](#string) | | denom optionally filters deposits by vault denom | | `denom` | [string](#string) | | denom optionally filters deposits by vault denom |
| `value_in_staked_tokens` | [bool](#bool) | | respond with vault value in ukava for bkava vaults |
| `pagination` | [cosmos.base.query.v1beta1.PageRequest](#cosmos.base.query.v1beta1.PageRequest) | | pagination defines an optional pagination for the request. | | `pagination` | [cosmos.base.query.v1beta1.PageRequest](#cosmos.base.query.v1beta1.PageRequest) | | pagination defines an optional pagination for the request. |

View File

@ -104,8 +104,11 @@ message QueryDepositsRequest {
// denom optionally filters deposits by vault denom // denom optionally filters deposits by vault denom
string denom = 2; string denom = 2;
// respond with vault value in ukava for bkava vaults
bool value_in_staked_tokens = 3;
// pagination defines an optional pagination for the request. // pagination defines an optional pagination for the request.
cosmos.base.query.v1beta1.PageRequest pagination = 3; cosmos.base.query.v1beta1.PageRequest pagination = 4;
} }
// QueryDepositsResponse is the response type for the Query/Deposits RPC method. // QueryDepositsResponse is the response type for the Query/Deposits RPC method.

View File

@ -13,20 +13,21 @@ option (gogoproto.goproto_getters_all) = false;
// Params governance parameters for kavadist module // Params governance parameters for kavadist module
message Params { message Params {
bool active = 1 [(gogoproto.moretags) = "yaml:\"active\""]; bool active = 1 [(gogoproto.moretags) = "yaml:\"active\""];
repeated Period periods = 3 [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"periods\""]; repeated Period periods = 3 [(gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"periods\""];
InfrastructureParams infrastructure_params = 4 [(gogoproto.nullable) = false]; InfrastructureParams infrastructure_params = 4 [(gogoproto.nullable) = false];
} }
message InfrastructureParams { message InfrastructureParams {
repeated Period infrastructure_periods = 1 [(gogoproto.castrepeated) = "Periods", (gogoproto.nullable) = false]; repeated Period infrastructure_periods = 1 [(gogoproto.castrepeated) = "Periods", (gogoproto.nullable) = false];
repeated CoreReward core_rewards = 2 [(gogoproto.castrepeated) = "CoreRewards", (gogoproto.nullable) = false]; repeated CoreReward core_rewards = 2 [(gogoproto.castrepeated) = "CoreRewards", (gogoproto.nullable) = false];
repeated PartnerReward partner_rewards = 3 [(gogoproto.castrepeated) = "PartnerRewards", (gogoproto.nullable) = false]; repeated PartnerReward partner_rewards = 3
option (gogoproto.goproto_stringer) = true; [(gogoproto.castrepeated) = "PartnerRewards", (gogoproto.nullable) = false];
option (gogoproto.goproto_stringer) = true;
} }
message CoreReward { message CoreReward {
bytes address = 1 [ bytes address = 1 [
(cosmos_proto.scalar) = "cosmos.AddressBytes", (cosmos_proto.scalar) = "cosmos.AddressBytes",
(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.AccAddress" (gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.AccAddress"
]; ];
@ -35,16 +36,16 @@ message CoreReward {
(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec",
(gogoproto.nullable) = false (gogoproto.nullable) = false
]; ];
option (gogoproto.goproto_stringer) = true; option (gogoproto.goproto_stringer) = true;
} }
message PartnerReward { message PartnerReward {
bytes address = 1 [ bytes address = 1 [
(cosmos_proto.scalar) = "cosmos.AddressBytes", (cosmos_proto.scalar) = "cosmos.AddressBytes",
(gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.AccAddress" (gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.AccAddress"
]; ];
cosmos.base.v1beta1.Coin rewards_per_second = 2[(gogoproto.nullable) = false]; cosmos.base.v1beta1.Coin rewards_per_second = 2 [(gogoproto.nullable) = false];
option (gogoproto.goproto_stringer) = true; option (gogoproto.goproto_stringer) = true;
} }
// Period stores the specified start and end dates, and the inflation, expressed as a decimal // Period stores the specified start and end dates, and the inflation, expressed as a decimal
@ -67,4 +68,3 @@ message Period {
(gogoproto.moretags) = "yaml:\"inflation\"" (gogoproto.moretags) = "yaml:\"inflation\""
]; ];
} }

View File

@ -15,8 +15,9 @@ import (
// flags for cli queries // flags for cli queries
const ( const (
flagDenom = "denom" flagDenom = "denom"
flagOwner = "owner" flagOwner = "owner"
flagValueInStakedTokens = "value_in_staked_tokens"
) )
// GetQueryCmd returns the cli query commands for the earn module // GetQueryCmd returns the cli query commands for the earn module
@ -145,6 +146,10 @@ func queryDepositsCmd() *cobra.Command {
if err != nil { if err != nil {
return err return err
} }
valueInStakedTokens, err := cmd.Flags().GetBool(flagValueInStakedTokens)
if err != nil {
return err
}
pageReq, err := client.ReadPageRequest(cmd.Flags()) pageReq, err := client.ReadPageRequest(cmd.Flags())
if err != nil { if err != nil {
@ -156,6 +161,7 @@ func queryDepositsCmd() *cobra.Command {
req := types.NewQueryDepositsRequest( req := types.NewQueryDepositsRequest(
ownerBech, ownerBech,
denom, denom,
valueInStakedTokens,
pageReq, pageReq,
) )
res, err := queryClient.Deposits(context.Background(), req) res, err := queryClient.Deposits(context.Background(), req)
@ -171,6 +177,7 @@ func queryDepositsCmd() *cobra.Command {
cmd.Flags().String(flagOwner, "", "(optional) filter for deposits by owner address") cmd.Flags().String(flagOwner, "", "(optional) filter for deposits by owner address")
cmd.Flags().String(flagDenom, "", "(optional) filter for deposits by vault denom") cmd.Flags().String(flagDenom, "", "(optional) filter for deposits by vault denom")
cmd.Flags().Bool(flagValueInStakedTokens, false, "(optional) get underlying staked tokens for staking derivative vaults")
return cmd return cmd
} }

View File

@ -296,6 +296,19 @@ func (s queryServer) getOneAccountOneVaultDeposit(
return nil, status.Error(codes.NotFound, err.Error()) return nil, status.Error(codes.NotFound, err.Error())
} }
if req.ValueInStakedTokens {
// Get underlying ukava amount if denom is a derivative
if s.keeper.liquidKeeper.IsDerivativeDenom(ctx, req.Denom) {
ukavaValue, err := s.keeper.liquidKeeper.GetStakedTokensForDerivatives(ctx, sdk.NewCoins(value))
if err != nil {
// This should "never" happen if IsDerivativeDenom is true
panic("Error getting ukava value for " + req.Denom)
}
value = ukavaValue
}
}
return &types.QueryDepositsResponse{ return &types.QueryDepositsResponse{
Deposits: []types.DepositResponse{ Deposits: []types.DepositResponse{
{ {
@ -397,6 +410,31 @@ func (s queryServer) getOneAccountAllDeposits(
return nil, status.Error(codes.InvalidArgument, err.Error()) return nil, status.Error(codes.InvalidArgument, err.Error())
} }
if req.ValueInStakedTokens {
// Plain slice to not sum ukava amounts together. This is not a valid
// sdk.Coin due to multiple coins of the same denom, but we need them to
// be separate in the response to not be an aggregate amount.
var valueInStakedTokens []sdk.Coin
for _, coin := range value {
// Non-bkava coins are kept as is
if !s.keeper.liquidKeeper.IsDerivativeDenom(ctx, coin.Denom) {
valueInStakedTokens = append(valueInStakedTokens, coin)
continue
}
// Derivative coins are converted to underlying staked tokens
ukavaValue, err := s.keeper.liquidKeeper.GetStakedTokensForDerivatives(ctx, sdk.NewCoins(coin))
if err != nil {
// This should "never" happen if IsDerivativeDenom is true
panic("Error getting ukava value for " + coin.Denom)
}
valueInStakedTokens = append(valueInStakedTokens, ukavaValue)
}
value = valueInStakedTokens
}
deposits = append(deposits, types.DepositResponse{ deposits = append(deposits, types.DepositResponse{
Depositor: depositor.String(), Depositor: depositor.String(),
Shares: accountShare.Shares, Shares: accountShare.Shares,

View File

@ -2,6 +2,7 @@ package keeper_test
import ( import (
"context" "context"
"fmt"
"testing" "testing"
"github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/baseapp"
@ -14,6 +15,7 @@ import (
"google.golang.org/grpc/codes" "google.golang.org/grpc/codes"
"google.golang.org/grpc/status" "google.golang.org/grpc/status"
"github.com/kava-labs/kava/app"
"github.com/kava-labs/kava/x/earn/keeper" "github.com/kava-labs/kava/x/earn/keeper"
"github.com/kava-labs/kava/x/earn/testutil" "github.com/kava-labs/kava/x/earn/testutil"
"github.com/kava-labs/kava/x/earn/types" "github.com/kava-labs/kava/x/earn/types"
@ -217,32 +219,61 @@ func (suite *grpcQueryTestSuite) TestVault_NotFound() {
} }
func (suite *grpcQueryTestSuite) TestDeposits() { func (suite *grpcQueryTestSuite) TestDeposits() {
// Validator setup for bkava
_, addrs := app.GeneratePrivKeyAddressPairs(5)
valAccAddr1, valAccAddr2, delegator := addrs[0], addrs[1], addrs[2]
valAddr1 := sdk.ValAddress(valAccAddr1)
valAddr2 := sdk.ValAddress(valAccAddr2)
vault1Denom := "usdx" vault1Denom := "usdx"
vault2Denom := "busd" vault2Denom := "busd"
vault3Denom := testutil.TestBkavaDenoms[0] vault3Denom := fmt.Sprintf("bkava-%s", valAddr1.String())
vault4Denom := fmt.Sprintf("bkava-%s", valAddr2.String())
initialUkavaBalance := sdk.NewInt(1e9)
startBalance := sdk.NewCoins(
sdk.NewCoin("ukava", initialUkavaBalance),
sdk.NewInt64Coin(vault1Denom, 1000),
sdk.NewInt64Coin(vault2Denom, 1000),
// Bkava isn't actually minted via x/liquid
sdk.NewInt64Coin(vault3Denom, 1000),
sdk.NewInt64Coin(vault4Denom, 1000),
)
delegateAmount := sdk.NewInt(100e6)
suite.App.FundAccount(suite.Ctx, valAccAddr1, startBalance)
suite.App.FundAccount(suite.Ctx, valAccAddr2, startBalance)
suite.App.FundAccount(suite.Ctx, delegator, startBalance)
suite.CreateNewUnbondedValidator(valAddr1, initialUkavaBalance)
suite.CreateNewUnbondedValidator(valAddr2, initialUkavaBalance)
suite.CreateDelegation(valAddr1, delegator, delegateAmount)
suite.CreateDelegation(valAddr2, delegator, delegateAmount)
staking.EndBlocker(suite.Ctx, suite.App.GetStakingKeeper())
savingsParams := suite.SavingsKeeper.GetParams(suite.Ctx)
savingsParams.SupportedDenoms = append(savingsParams.SupportedDenoms, "bkava")
suite.SavingsKeeper.SetParams(suite.Ctx, savingsParams)
// Add vaults // Add vaults
suite.CreateVault(vault1Denom, types.StrategyTypes{types.STRATEGY_TYPE_HARD}, false, nil) suite.CreateVault(vault1Denom, types.StrategyTypes{types.STRATEGY_TYPE_HARD}, false, nil)
suite.CreateVault(vault2Denom, types.StrategyTypes{types.STRATEGY_TYPE_HARD}, false, nil) suite.CreateVault(vault2Denom, types.StrategyTypes{types.STRATEGY_TYPE_HARD}, false, nil)
suite.CreateVault("bkava", types.StrategyTypes{types.STRATEGY_TYPE_SAVINGS}, false, nil) suite.CreateVault("bkava", types.StrategyTypes{types.STRATEGY_TYPE_SAVINGS}, false, nil)
startBalance := sdk.NewCoins(
sdk.NewInt64Coin(vault1Denom, 1000),
sdk.NewInt64Coin(vault2Denom, 1000),
sdk.NewInt64Coin(vault3Denom, 1000),
)
deposit1Amount := sdk.NewInt64Coin(vault1Denom, 100) deposit1Amount := sdk.NewInt64Coin(vault1Denom, 100)
deposit2Amount := sdk.NewInt64Coin(vault2Denom, 200) deposit2Amount := sdk.NewInt64Coin(vault2Denom, 200)
deposit3Amount := sdk.NewInt64Coin(vault3Denom, 200) deposit3Amount := sdk.NewInt64Coin(vault3Denom, 200)
deposit4Amount := sdk.NewInt64Coin(vault4Denom, 300)
// Accounts // Accounts
acc1 := suite.CreateAccount(startBalance, 0).GetAddress() acc1 := suite.CreateAccount(startBalance, 0).GetAddress()
acc2 := suite.CreateAccount(startBalance, 1).GetAddress() acc2 := delegator
// Deposit into each vault from each account - 4 total deposits // Deposit into each vault from each account - 4 total deposits
// Acc 1: usdx + busd // Acc 1: usdx + busd
// Acc 2: usdx + bkava // Acc 2: usdx + bkava-1 + bkava-2
err := suite.Keeper.Deposit(suite.Ctx, acc1, deposit1Amount, types.STRATEGY_TYPE_HARD) err := suite.Keeper.Deposit(suite.Ctx, acc1, deposit1Amount, types.STRATEGY_TYPE_HARD)
suite.Require().NoError(err) suite.Require().NoError(err)
err = suite.Keeper.Deposit(suite.Ctx, acc1, deposit2Amount, types.STRATEGY_TYPE_HARD) err = suite.Keeper.Deposit(suite.Ctx, acc1, deposit2Amount, types.STRATEGY_TYPE_HARD)
@ -252,12 +283,14 @@ func (suite *grpcQueryTestSuite) TestDeposits() {
suite.Require().NoError(err) suite.Require().NoError(err)
err = suite.Keeper.Deposit(suite.Ctx, acc2, deposit3Amount, types.STRATEGY_TYPE_SAVINGS) err = suite.Keeper.Deposit(suite.Ctx, acc2, deposit3Amount, types.STRATEGY_TYPE_SAVINGS)
suite.Require().NoError(err) suite.Require().NoError(err)
err = suite.Keeper.Deposit(suite.Ctx, acc2, deposit4Amount, types.STRATEGY_TYPE_SAVINGS)
suite.Require().NoError(err)
suite.Run("specific vault", func() { suite.Run("specific vault", func() {
// Query all deposits for account 1 // Query all deposits for account 1
res, err := suite.queryClient.Deposits( res, err := suite.queryClient.Deposits(
context.Background(), context.Background(),
types.NewQueryDepositsRequest(acc1.String(), vault1Denom, nil), types.NewQueryDepositsRequest(acc1.String(), vault1Denom, false, nil),
) )
suite.Require().NoError(err) suite.Require().NoError(err)
suite.Require().Len(res.Deposits, 1) suite.Require().Len(res.Deposits, 1)
@ -282,7 +315,7 @@ func (suite *grpcQueryTestSuite) TestDeposits() {
suite.Run("specific bkava vault", func() { suite.Run("specific bkava vault", func() {
res, err := suite.queryClient.Deposits( res, err := suite.queryClient.Deposits(
context.Background(), context.Background(),
types.NewQueryDepositsRequest(acc2.String(), vault3Denom, nil), types.NewQueryDepositsRequest(acc2.String(), vault3Denom, false, nil),
) )
suite.Require().NoError(err) suite.Require().NoError(err)
suite.Require().Len(res.Deposits, 1) suite.Require().Len(res.Deposits, 1)
@ -304,10 +337,33 @@ func (suite *grpcQueryTestSuite) TestDeposits() {
) )
}) })
suite.Run("specific bkava vault in staked tokens", func() {
res, err := suite.queryClient.Deposits(
context.Background(),
types.NewQueryDepositsRequest(acc2.String(), vault3Denom, true, nil),
)
suite.Require().NoError(err)
suite.Require().Len(res.Deposits, 1)
suite.Require().Equal(
types.DepositResponse{
Depositor: acc2.String(),
// Only includes specified deposit shares
Shares: types.NewVaultShares(
types.NewVaultShare(deposit3Amount.Denom, deposit3Amount.Amount.ToDec()),
),
// Only the specified vault denom value
Value: sdk.NewCoins(
sdk.NewCoin("ukava", deposit3Amount.Amount),
),
},
res.Deposits[0],
)
})
suite.Run("invalid vault", func() { suite.Run("invalid vault", func() {
_, err := suite.queryClient.Deposits( _, err := suite.queryClient.Deposits(
context.Background(), context.Background(),
types.NewQueryDepositsRequest(acc1.String(), "notavaliddenom", nil), types.NewQueryDepositsRequest(acc1.String(), "notavaliddenom", false, nil),
) )
suite.Require().Error(err) suite.Require().Error(err)
suite.Require().ErrorIs(err, status.Errorf(codes.NotFound, "vault for notavaliddenom not found")) suite.Require().ErrorIs(err, status.Errorf(codes.NotFound, "vault for notavaliddenom not found"))
@ -317,7 +373,7 @@ func (suite *grpcQueryTestSuite) TestDeposits() {
// Query all deposits for account 1 // Query all deposits for account 1
res, err := suite.queryClient.Deposits( res, err := suite.queryClient.Deposits(
context.Background(), context.Background(),
types.NewQueryDepositsRequest(acc1.String(), "", nil), types.NewQueryDepositsRequest(acc1.String(), "", false, nil),
) )
suite.Require().NoError(err) suite.Require().NoError(err)
suite.Require().Len(res.Deposits, 1) suite.Require().Len(res.Deposits, 1)
@ -335,6 +391,40 @@ func (suite *grpcQueryTestSuite) TestDeposits() {
res.Deposits, res.Deposits,
) )
}) })
suite.Run("all vaults value in staked tokens", func() {
// Query all deposits for account 1 with value in staked tokens
res, err := suite.queryClient.Deposits(
context.Background(),
types.NewQueryDepositsRequest(acc2.String(), "", true, nil),
)
suite.Require().NoError(err)
suite.Require().Len(res.Deposits, 1)
suite.Require().Equal(
types.DepositResponse{
Depositor: acc2.String(),
Shares: types.VaultShares{
types.NewVaultShare(deposit4Amount.Denom, deposit4Amount.Amount.ToDec()),
types.NewVaultShare(deposit3Amount.Denom, deposit3Amount.Amount.ToDec()),
types.NewVaultShare(deposit1Amount.Denom, deposit1Amount.Amount.ToDec()),
},
Value: sdk.Coins{
sdk.NewCoin("ukava", deposit4Amount.Amount),
sdk.NewCoin("ukava", deposit3Amount.Amount),
// Deposit 1 is last as it's the same order as vault shares
deposit1Amount,
},
},
res.Deposits[0],
)
for i := range res.Deposits[0].Shares {
suite.Equal(
res.Deposits[0].Shares[i].Amount,
res.Deposits[0].Value[i].Amount.ToDec(),
"order of deposit value should match shares",
)
}
})
} }
func (suite *grpcQueryTestSuite) TestDeposits_NoDeposits() { func (suite *grpcQueryTestSuite) TestDeposits_NoDeposits() {
@ -353,7 +443,7 @@ func (suite *grpcQueryTestSuite) TestDeposits_NoDeposits() {
// Query all deposits for account 1 // Query all deposits for account 1
res, err := suite.queryClient.Deposits( res, err := suite.queryClient.Deposits(
context.Background(), context.Background(),
types.NewQueryDepositsRequest(acc1.String(), vault1Denom, nil), types.NewQueryDepositsRequest(acc1.String(), vault1Denom, false, nil),
) )
suite.Require().NoError(err) suite.Require().NoError(err)
suite.Require().Len(res.Deposits, 1) suite.Require().Len(res.Deposits, 1)
@ -376,7 +466,7 @@ func (suite *grpcQueryTestSuite) TestDeposits_NoDeposits() {
// Query all deposits for account 1 // Query all deposits for account 1
res, err := suite.queryClient.Deposits( res, err := suite.queryClient.Deposits(
context.Background(), context.Background(),
types.NewQueryDepositsRequest(acc1.String(), "", nil), types.NewQueryDepositsRequest(acc1.String(), "", false, nil),
) )
suite.Require().NoError(err) suite.Require().NoError(err)
suite.Require().Empty(res.Deposits) suite.Require().Empty(res.Deposits)
@ -386,7 +476,7 @@ func (suite *grpcQueryTestSuite) TestDeposits_NoDeposits() {
func (suite *grpcQueryTestSuite) TestDeposits_NoDepositor() { func (suite *grpcQueryTestSuite) TestDeposits_NoDepositor() {
_, err := suite.queryClient.Deposits( _, err := suite.queryClient.Deposits(
context.Background(), context.Background(),
types.NewQueryDepositsRequest("", "usdx", nil), types.NewQueryDepositsRequest("", "usdx", false, nil),
) )
suite.Require().Error(err) suite.Require().Error(err)
suite.Require().ErrorIs(err, status.Error(codes.InvalidArgument, "depositor is required")) suite.Require().ErrorIs(err, status.Error(codes.InvalidArgument, "depositor is required"))
@ -395,14 +485,14 @@ func (suite *grpcQueryTestSuite) TestDeposits_NoDepositor() {
func (suite *grpcQueryTestSuite) TestDeposits_InvalidAddress() { func (suite *grpcQueryTestSuite) TestDeposits_InvalidAddress() {
_, err := suite.queryClient.Deposits( _, err := suite.queryClient.Deposits(
context.Background(), context.Background(),
types.NewQueryDepositsRequest("asdf", "usdx", nil), types.NewQueryDepositsRequest("asdf", "usdx", false, nil),
) )
suite.Require().Error(err) suite.Require().Error(err)
suite.Require().ErrorIs(err, status.Error(codes.InvalidArgument, "Invalid address")) suite.Require().ErrorIs(err, status.Error(codes.InvalidArgument, "Invalid address"))
_, err = suite.queryClient.Deposits( _, err = suite.queryClient.Deposits(
context.Background(), context.Background(),
types.NewQueryDepositsRequest("asdf", "", nil), types.NewQueryDepositsRequest("asdf", "", false, nil),
) )
suite.Require().Error(err) suite.Require().Error(err)
suite.Require().ErrorIs(err, status.Error(codes.InvalidArgument, "Invalid address")) suite.Require().ErrorIs(err, status.Error(codes.InvalidArgument, "Invalid address"))
@ -440,7 +530,7 @@ func (suite *grpcQueryTestSuite) TestDeposits_bKava() {
// Query all deposits for account 1 // Query all deposits for account 1
res, err := suite.queryClient.Deposits( res, err := suite.queryClient.Deposits(
context.Background(), context.Background(),
types.NewQueryDepositsRequest(address1.String(), "bkava", nil), types.NewQueryDepositsRequest(address1.String(), "bkava", false, nil),
) )
suite.Require().NoError(err) suite.Require().NoError(err)
suite.Require().Len(res.Deposits, 1) suite.Require().Len(res.Deposits, 1)
@ -475,7 +565,7 @@ func (suite *grpcQueryTestSuite) TestDeposits_bKava() {
// Query all deposits for account 1 // Query all deposits for account 1
res, err := suite.queryClient.Deposits( res, err := suite.queryClient.Deposits(
context.Background(), context.Background(),
types.NewQueryDepositsRequest(address1.String(), "bkava", nil), types.NewQueryDepositsRequest(address1.String(), "bkava", false, nil),
) )
suite.Require().NoError(err) suite.Require().NoError(err)
suite.Require().Len(res.Deposits, 1) suite.Require().Len(res.Deposits, 1)

View File

@ -5,6 +5,7 @@ import (
"reflect" "reflect"
"time" "time"
"github.com/cosmos/cosmos-sdk/crypto/keys/ed25519"
"github.com/kava-labs/kava/app" "github.com/kava-labs/kava/app"
"github.com/kava-labs/kava/x/earn/keeper" "github.com/kava-labs/kava/x/earn/keeper"
"github.com/kava-labs/kava/x/earn/types" "github.com/kava-labs/kava/x/earn/types"
@ -22,6 +23,8 @@ import (
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper"
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
stakingkeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper"
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
"github.com/stretchr/testify/suite" "github.com/stretchr/testify/suite"
abci "github.com/tendermint/tendermint/abci/types" abci "github.com/tendermint/tendermint/abci/types"
tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
@ -160,6 +163,13 @@ func (suite *Suite) SetupTest() {
nil, nil,
) )
stakingParams := stakingtypes.DefaultParams()
stakingParams.BondDenom = "ukava"
stakingGs := stakingtypes.GenesisState{
Params: stakingParams,
}
tApp := app.NewTestApp() tApp := app.NewTestApp()
tApp.InitializeFromGenesisStates( tApp.InitializeFromGenesisStates(
@ -167,6 +177,7 @@ func (suite *Suite) SetupTest() {
pricefeedtypes.ModuleName: tApp.AppCodec().MustMarshalJSON(&pricefeedGS), pricefeedtypes.ModuleName: tApp.AppCodec().MustMarshalJSON(&pricefeedGS),
hardtypes.ModuleName: tApp.AppCodec().MustMarshalJSON(&hardGS), hardtypes.ModuleName: tApp.AppCodec().MustMarshalJSON(&hardGS),
savingstypes.ModuleName: tApp.AppCodec().MustMarshalJSON(&savingsGS), savingstypes.ModuleName: tApp.AppCodec().MustMarshalJSON(&savingsGS),
stakingtypes.ModuleName: tApp.AppCodec().MustMarshalJSON(&stakingGs),
}, },
) )
@ -357,6 +368,67 @@ func (suite *Suite) SavingsDepositAmountEqual(expected sdk.Coins) {
) )
} }
// ----------------------------------------------------------------------------
// Staking
// CreateNewUnbondedValidator creates a new validator in the staking module.
// New validators are unbonded until the end blocker is run.
func (suite *Suite) CreateNewUnbondedValidator(addr sdk.ValAddress, selfDelegation sdk.Int) stakingtypes.Validator {
// Create a validator
err := suite.deliverMsgCreateValidator(suite.Ctx, addr, suite.NewBondCoin(selfDelegation))
suite.Require().NoError(err)
// New validators are created in an unbonded state. Note if the end blocker is run later this validator could become bonded.
validator, found := suite.App.GetStakingKeeper().GetValidator(suite.Ctx, addr)
suite.Require().True(found)
return validator
}
// NewBondCoin creates a Coin with the current staking denom.
func (suite *Suite) NewBondCoin(amount sdk.Int) sdk.Coin {
stakingDenom := suite.App.GetStakingKeeper().BondDenom(suite.Ctx)
return sdk.NewCoin(stakingDenom, amount)
}
// CreateDelegation delegates tokens to a validator.
func (suite *Suite) CreateDelegation(valAddr sdk.ValAddress, delegator sdk.AccAddress, amount sdk.Int) sdk.Dec {
sk := suite.App.GetStakingKeeper()
stakingDenom := sk.BondDenom(suite.Ctx)
msg := stakingtypes.NewMsgDelegate(
delegator,
valAddr,
sdk.NewCoin(stakingDenom, amount),
)
msgServer := stakingkeeper.NewMsgServerImpl(sk)
_, err := msgServer.Delegate(sdk.WrapSDKContext(suite.Ctx), msg)
suite.Require().NoError(err)
del, found := sk.GetDelegation(suite.Ctx, delegator, valAddr)
suite.Require().True(found)
return del.Shares
}
func (suite *Suite) deliverMsgCreateValidator(ctx sdk.Context, address sdk.ValAddress, selfDelegation sdk.Coin) error {
msg, err := stakingtypes.NewMsgCreateValidator(
address,
ed25519.GenPrivKey().PubKey(),
selfDelegation,
stakingtypes.Description{},
stakingtypes.NewCommissionRates(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()),
sdk.NewInt(1e6),
)
if err != nil {
return err
}
msgServer := stakingkeeper.NewMsgServerImpl(suite.App.GetStakingKeeper())
_, err = msgServer.CreateValidator(sdk.WrapSDKContext(suite.Ctx), msg)
return err
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// EventsContains asserts that the expected event is in the provided events // EventsContains asserts that the expected event is in the provided events

View File

@ -23,11 +23,13 @@ func NewQueryVaultRequest(denom string) *QueryVaultRequest {
func NewQueryDepositsRequest( func NewQueryDepositsRequest(
depositor string, depositor string,
denom string, denom string,
ValueInStakedTokens bool,
pagination *query.PageRequest, pagination *query.PageRequest,
) *QueryDepositsRequest { ) *QueryDepositsRequest {
return &QueryDepositsRequest{ return &QueryDepositsRequest{
Depositor: depositor, Depositor: depositor,
Denom: denom, Denom: denom,
Pagination: pagination, ValueInStakedTokens: ValueInStakedTokens,
Pagination: pagination,
} }
} }

View File

@ -323,8 +323,10 @@ type QueryDepositsRequest struct {
Depositor string `protobuf:"bytes,1,opt,name=depositor,proto3" json:"depositor,omitempty"` Depositor string `protobuf:"bytes,1,opt,name=depositor,proto3" json:"depositor,omitempty"`
// denom optionally filters deposits by vault denom // denom optionally filters deposits by vault denom
Denom string `protobuf:"bytes,2,opt,name=denom,proto3" json:"denom,omitempty"` Denom string `protobuf:"bytes,2,opt,name=denom,proto3" json:"denom,omitempty"`
// respond with vault value in ukava for bkava vaults
ValueInStakedTokens bool `protobuf:"varint,3,opt,name=value_in_staked_tokens,json=valueInStakedTokens,proto3" json:"value_in_staked_tokens,omitempty"`
// pagination defines an optional pagination for the request. // pagination defines an optional pagination for the request.
Pagination *query.PageRequest `protobuf:"bytes,3,opt,name=pagination,proto3" json:"pagination,omitempty"` Pagination *query.PageRequest `protobuf:"bytes,4,opt,name=pagination,proto3" json:"pagination,omitempty"`
} }
func (m *QueryDepositsRequest) Reset() { *m = QueryDepositsRequest{} } func (m *QueryDepositsRequest) Reset() { *m = QueryDepositsRequest{} }
@ -462,61 +464,63 @@ func init() {
func init() { proto.RegisterFile("kava/earn/v1beta1/query.proto", fileDescriptor_63f8dee2f3192a6b) } func init() { proto.RegisterFile("kava/earn/v1beta1/query.proto", fileDescriptor_63f8dee2f3192a6b) }
var fileDescriptor_63f8dee2f3192a6b = []byte{ var fileDescriptor_63f8dee2f3192a6b = []byte{
// 855 bytes of a gzipped FileDescriptorProto // 883 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0xcd, 0x4f, 0x1b, 0x47, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0x4b, 0x6f, 0xeb, 0x44,
0x14, 0xf7, 0xda, 0xd8, 0x82, 0x71, 0xa1, 0xf5, 0xe0, 0x4a, 0xb6, 0x29, 0x6b, 0xb3, 0x14, 0x58, 0x14, 0x8e, 0xf3, 0x52, 0x3b, 0xe1, 0x5e, 0xc8, 0x34, 0xa0, 0x24, 0x97, 0x3a, 0xa9, 0x2f, 0xb7,
0x2a, 0x79, 0xb7, 0xb8, 0x52, 0x7b, 0x41, 0x95, 0xea, 0xa2, 0x22, 0x7a, 0xa8, 0xe8, 0xd2, 0x72, 0xd7, 0x45, 0x8a, 0x4d, 0x53, 0x09, 0x36, 0x15, 0x12, 0xa1, 0xa2, 0x2a, 0x0b, 0x54, 0x9c, 0xd2,
0xa8, 0x54, 0x59, 0x63, 0x3c, 0x5a, 0x56, 0xd8, 0x3b, 0x66, 0x67, 0xec, 0x96, 0x56, 0x51, 0x24, 0x05, 0x12, 0xb2, 0x26, 0xcd, 0xc8, 0xb5, 0x92, 0x78, 0x52, 0xcf, 0x24, 0x50, 0x10, 0x42, 0xaa,
0xa4, 0xdc, 0x23, 0xe5, 0x7f, 0xc8, 0x01, 0xe5, 0xc8, 0x1f, 0xc1, 0x11, 0x91, 0x4b, 0x94, 0x03, 0xc4, 0x1e, 0x89, 0xff, 0xc0, 0xa2, 0xeb, 0xfe, 0x88, 0x2e, 0xab, 0xb2, 0x41, 0x2c, 0x5a, 0xda,
0x24, 0x90, 0x73, 0xce, 0x39, 0x46, 0xf3, 0xb1, 0xfe, 0x36, 0x46, 0x39, 0xc1, 0xbe, 0x8f, 0xdf, 0xb2, 0x66, 0xcd, 0x12, 0xcd, 0xc3, 0x79, 0xa7, 0xa9, 0x58, 0x25, 0x73, 0x1e, 0xdf, 0xf7, 0x9d,
0xef, 0xf7, 0xde, 0xbc, 0xf7, 0x0c, 0x16, 0x8f, 0x50, 0x1b, 0xd9, 0x18, 0x05, 0xbe, 0xdd, 0xde, 0x99, 0x73, 0x8e, 0xc1, 0x6a, 0x0b, 0xf5, 0x91, 0x8d, 0x51, 0x18, 0xd8, 0xfd, 0xcd, 0x06, 0x66,
0xa8, 0x62, 0x86, 0x36, 0xec, 0xe3, 0x16, 0x0e, 0x4e, 0xac, 0x66, 0x40, 0x18, 0x81, 0x29, 0xee, 0x68, 0xd3, 0x3e, 0xe9, 0xe1, 0xf0, 0xd4, 0xea, 0x86, 0x84, 0x11, 0x98, 0xe5, 0x6e, 0x8b, 0xbb,
0xb6, 0xb8, 0xdb, 0x52, 0xee, 0x5c, 0xf6, 0x80, 0xd0, 0x06, 0xa1, 0x15, 0x11, 0x60, 0xcb, 0x0f, 0x2d, 0xe5, 0x2e, 0x16, 0x8e, 0x08, 0xed, 0x10, 0xea, 0x8a, 0x00, 0x5b, 0x1e, 0x64, 0x74, 0xf1,
0x19, 0x9d, 0xfb, 0x46, 0x7e, 0xd9, 0x55, 0x44, 0xb1, 0x84, 0xe9, 0x80, 0x36, 0x91, 0xeb, 0xf9, 0x7d, 0x79, 0xb2, 0x1b, 0x88, 0x62, 0x09, 0x33, 0x00, 0xed, 0x22, 0xcf, 0x0f, 0x10, 0xf3, 0x49,
0x88, 0x79, 0xc4, 0x57, 0xb1, 0x7a, 0x6f, 0x6c, 0x18, 0x75, 0x40, 0xbc, 0xd0, 0x9f, 0x76, 0x89, 0xa0, 0x62, 0xf5, 0xd1, 0xd8, 0x28, 0xea, 0x88, 0xf8, 0x91, 0x3f, 0xe7, 0x11, 0x8f, 0x48, 0x0e,
0x4b, 0x24, 0x07, 0xff, 0x4f, 0x59, 0xbf, 0x72, 0x09, 0x71, 0xeb, 0xd8, 0x46, 0x4d, 0xcf, 0x46, 0xfe, 0x4f, 0x59, 0xdf, 0xf5, 0x08, 0xf1, 0xda, 0xd8, 0x46, 0x5d, 0xdf, 0x46, 0x41, 0x40, 0x98,
0xbe, 0x4f, 0x98, 0x80, 0x0c, 0xf9, 0xf5, 0xe1, 0x62, 0x9a, 0x28, 0x40, 0x8d, 0xd0, 0x5f, 0x18, 0x80, 0x8c, 0xf8, 0xf5, 0xe9, 0x62, 0xba, 0x28, 0x44, 0x9d, 0xc8, 0x5f, 0x9e, 0xf6, 0x53, 0x16,
0xf6, 0x53, 0x16, 0x20, 0x86, 0x5d, 0x55, 0x6f, 0x6e, 0x44, 0x3b, 0xda, 0xa8, 0x55, 0x67, 0xd2, 0x22, 0x86, 0x3d, 0x55, 0x6f, 0x71, 0xc6, 0x75, 0xf4, 0x51, 0xaf, 0xcd, 0xa4, 0xdb, 0xc8, 0x01,
0x6d, 0xa4, 0x01, 0xfc, 0x9d, 0x97, 0xb5, 0x2b, 0x50, 0x1d, 0x7c, 0xdc, 0xc2, 0x94, 0x19, 0xbf, 0xf8, 0x25, 0x2f, 0x6b, 0x5f, 0xa0, 0x3a, 0xf8, 0xa4, 0x87, 0x29, 0x33, 0xbe, 0x00, 0x2b, 0x63,
0x81, 0xf9, 0x3e, 0x2b, 0x6d, 0x12, 0x9f, 0x62, 0xf8, 0x03, 0x48, 0x48, 0xf6, 0x8c, 0x56, 0xd0, 0x56, 0xda, 0x25, 0x01, 0xc5, 0xf0, 0x23, 0x90, 0x96, 0xec, 0x79, 0xad, 0xac, 0x99, 0x99, 0x6a,
0xcc, 0x64, 0x29, 0x6b, 0x0d, 0x35, 0xd3, 0x92, 0x29, 0xe5, 0xa9, 0x8b, 0xeb, 0x7c, 0xc4, 0x51, 0xc1, 0x9a, 0xba, 0x4c, 0x4b, 0xa6, 0xd4, 0x92, 0x97, 0x37, 0xa5, 0x98, 0xa3, 0xc2, 0x07, 0x2c,
0xe1, 0x1d, 0x96, 0x7d, 0xce, 0xdc, 0x61, 0xf9, 0x53, 0xb1, 0x84, 0x56, 0xc5, 0xf2, 0x23, 0x48, 0x87, 0x9c, 0x79, 0xc0, 0xf2, 0x95, 0x62, 0x89, 0xac, 0x8a, 0xe5, 0x63, 0x90, 0x16, 0x0a, 0x39,
0x08, 0x85, 0x9c, 0x25, 0x66, 0x26, 0x4b, 0x85, 0x11, 0x2c, 0x22, 0x25, 0xcc, 0x08, 0xc9, 0x64, 0x4b, 0xc2, 0xcc, 0x54, 0xcb, 0x33, 0x58, 0x44, 0x4a, 0x94, 0x11, 0x91, 0xc9, 0x2c, 0x63, 0x03,
0x96, 0xb1, 0x0e, 0x52, 0x5d, 0x58, 0xc5, 0x05, 0xd3, 0x20, 0x5e, 0xc3, 0x3e, 0x69, 0x08, 0xe5, 0x64, 0x87, 0xb0, 0x8a, 0x0b, 0xe6, 0x40, 0xaa, 0x89, 0x03, 0xd2, 0x11, 0xca, 0x97, 0x1d, 0x79,
0x33, 0x8e, 0xfc, 0x30, 0x9c, 0x5e, 0x5d, 0x1d, 0x01, 0x9b, 0x20, 0x2e, 0xa0, 0x54, 0x95, 0x0f, 0x30, 0x9c, 0x51, 0x5d, 0x03, 0x01, 0xdb, 0x20, 0x25, 0xa0, 0x54, 0x95, 0x4f, 0xe5, 0x97, 0x49,
0xe5, 0x97, 0x49, 0xc6, 0xfb, 0x28, 0x98, 0xed, 0xc7, 0x1b, 0xc9, 0x0d, 0x1d, 0x00, 0xd4, 0x53, 0xc6, 0x3f, 0x71, 0xf0, 0x6c, 0x1c, 0x6f, 0x26, 0x37, 0x74, 0x00, 0x50, 0x4f, 0xe5, 0x63, 0x9a,
0x79, 0x98, 0x66, 0xa2, 0x85, 0x98, 0x39, 0x57, 0xca, 0x8f, 0xa0, 0xda, 0x53, 0xef, 0xf9, 0xc7, 0x8f, 0x97, 0x13, 0xe6, 0xf3, 0x6a, 0x69, 0x06, 0x55, 0x5d, 0xbd, 0xe7, 0xc1, 0x69, 0x17, 0xd7,
0x49, 0x13, 0x97, 0x53, 0x67, 0x37, 0xf9, 0xd9, 0x5e, 0x0b, 0x75, 0x7a, 0x50, 0xa0, 0x09, 0xbe, 0xb2, 0xe7, 0xb7, 0xa5, 0x67, 0xa3, 0x16, 0xea, 0x8c, 0xa0, 0x40, 0x13, 0xbc, 0xe5, 0xf3, 0x3e,
0xf0, 0xf8, 0x1c, 0x7b, 0x6d, 0xc4, 0x70, 0x45, 0x16, 0x11, 0x2b, 0x68, 0xe6, 0xb4, 0x33, 0xe7, 0xf6, 0xfb, 0x88, 0x61, 0x57, 0x16, 0x91, 0x28, 0x6b, 0xe6, 0x92, 0xf3, 0xdc, 0xa7, 0xfb, 0xd2,
0xd1, 0x5d, 0x69, 0x16, 0xda, 0xe0, 0x36, 0x80, 0xa8, 0x5e, 0x27, 0xff, 0xe0, 0x5a, 0xa5, 0x86, 0x2c, 0xb4, 0xc1, 0x5d, 0x00, 0x51, 0xbb, 0x4d, 0xbe, 0xc5, 0x4d, 0xb7, 0x89, 0xbb, 0x84, 0xfa,
0x9b, 0x84, 0x7a, 0x8c, 0x04, 0x34, 0x33, 0x55, 0x88, 0x99, 0x33, 0xe5, 0xcc, 0xd5, 0x79, 0x31, 0x8c, 0x84, 0x34, 0x9f, 0x2c, 0x27, 0xcc, 0xe5, 0x5a, 0xfe, 0xfa, 0xa2, 0x92, 0x53, 0x63, 0xf0,
0xad, 0xd6, 0xe0, 0xa7, 0x5a, 0x2d, 0xc0, 0x94, 0xee, 0xb1, 0xc0, 0xf3, 0x5d, 0x27, 0xa5, 0x72, 0x49, 0xb3, 0x19, 0x62, 0x4a, 0xeb, 0x2c, 0xf4, 0x03, 0xcf, 0xc9, 0xaa, 0x9c, 0x9d, 0x41, 0x0a,
0xb6, 0x3a, 0x29, 0x70, 0x09, 0x7c, 0xc6, 0x08, 0x43, 0xf5, 0x0a, 0x3d, 0x44, 0x01, 0xa6, 0x99, 0x5c, 0x03, 0x6f, 0x30, 0xc2, 0x50, 0xdb, 0xa5, 0xc7, 0x28, 0xc4, 0x34, 0x9f, 0x12, 0x35, 0x66,
0xb8, 0xa8, 0x31, 0x29, 0x6c, 0x7b, 0xc2, 0x04, 0xff, 0x06, 0xf2, 0xb3, 0xd2, 0x46, 0xf5, 0x16, 0x84, 0xad, 0x2e, 0x4c, 0xf0, 0x1b, 0x20, 0x8f, 0x6e, 0x1f, 0xb5, 0x7b, 0x38, 0x9f, 0xe6, 0x11,
0xce, 0x24, 0x78, 0x44, 0x79, 0x93, 0xf7, 0xec, 0xf5, 0x75, 0x7e, 0xd5, 0xf5, 0xd8, 0x61, 0xab, 0xb5, 0x6d, 0x7e, 0x67, 0x7f, 0xde, 0x94, 0xd6, 0x3d, 0x9f, 0x1d, 0xf7, 0x1a, 0xd6, 0x11, 0xe9,
0x6a, 0x1d, 0x90, 0x86, 0x5a, 0x3d, 0xf5, 0xa7, 0x48, 0x6b, 0x47, 0x36, 0xe3, 0x25, 0x5a, 0x3b, 0xa8, 0xd1, 0x53, 0x3f, 0x15, 0xda, 0x6c, 0xd9, 0x8c, 0x97, 0x68, 0xed, 0x05, 0xec, 0xfa, 0xa2,
0x3e, 0xbb, 0x3a, 0x2f, 0x02, 0x25, 0x69, 0xc7, 0x67, 0x0e, 0x10, 0x80, 0xfb, 0x1c, 0xcf, 0x78, 0x02, 0x94, 0xa4, 0xbd, 0x80, 0x39, 0x40, 0x00, 0x1e, 0x72, 0x3c, 0xe3, 0x4e, 0x03, 0x39, 0xf1,
0xa1, 0x81, 0xb4, 0x78, 0x45, 0xa5, 0x2a, 0x9c, 0x2f, 0xf8, 0x3d, 0x98, 0xe9, 0xd4, 0x26, 0x7b, 0x8a, 0x4a, 0x55, 0xd4, 0x5f, 0xf0, 0x43, 0xb0, 0x3c, 0xa8, 0x4d, 0xde, 0xfd, 0x23, 0xa5, 0x0d,
0x7f, 0x4f, 0x69, 0xdd, 0xd0, 0xee, 0x7b, 0x45, 0x7b, 0xdf, 0xeb, 0x17, 0x00, 0xba, 0x2b, 0x2f, 0x43, 0x87, 0xef, 0x15, 0x1f, 0x7d, 0xaf, 0x2d, 0xf0, 0x8e, 0xd0, 0xef, 0xfa, 0x81, 0x4b, 0x19,
0xba, 0x9a, 0x2c, 0xad, 0x5a, 0x0a, 0x8b, 0xef, 0xbc, 0x25, 0xcf, 0x4c, 0x77, 0x11, 0x5c, 0xac, 0x6a, 0xe1, 0xa6, 0xcb, 0x48, 0x0b, 0x07, 0x54, 0xdd, 0xf0, 0x8a, 0xf0, 0xee, 0x05, 0x75, 0xe1,
0x94, 0x38, 0x3d, 0x99, 0xc6, 0x73, 0x0d, 0x7c, 0x39, 0x20, 0x57, 0xcd, 0xc9, 0x16, 0x98, 0x56, 0x3b, 0x10, 0x2e, 0xf8, 0x19, 0x00, 0xc3, 0x3d, 0x91, 0x4f, 0x8a, 0x7e, 0x5a, 0xb7, 0x94, 0x00,
0x22, 0xc2, 0xd1, 0x37, 0x46, 0xcc, 0x83, 0x4a, 0x1b, 0x18, 0xbe, 0x4e, 0x26, 0xdc, 0xee, 0xd3, 0xbe, 0x28, 0x2c, 0xb9, 0x9b, 0x86, 0xd3, 0xe3, 0x61, 0x25, 0xdf, 0x19, 0xc9, 0x34, 0x7e, 0xd3,
0x19, 0x15, 0x3a, 0xd7, 0x26, 0xea, 0x94, 0x60, 0x7d, 0x42, 0x3f, 0x68, 0xe0, 0xf3, 0x01, 0xb2, 0xc0, 0xdb, 0x13, 0x35, 0xaa, 0xe6, 0xda, 0x01, 0x4b, 0x4a, 0x79, 0x34, 0x2f, 0xc6, 0x8c, 0x26,
0x4f, 0x6e, 0xe9, 0xaf, 0x20, 0xa1, 0xe6, 0x23, 0x2a, 0x0a, 0x5b, 0x1c, 0xb7, 0x53, 0x62, 0x64, 0x52, 0x69, 0x13, 0x1d, 0x3b, 0xc8, 0x84, 0xbb, 0x63, 0x3a, 0xe3, 0x42, 0xe7, 0xeb, 0x85, 0x3a,
0xca, 0xf3, 0xbc, 0xa6, 0xb3, 0x9b, 0x7c, 0xb2, 0x6b, 0xa3, 0x8e, 0x42, 0x80, 0x88, 0xaf, 0x27, 0x25, 0xd8, 0x98, 0xd0, 0x7f, 0x35, 0xf0, 0xe6, 0x04, 0xd9, 0xff, 0x7e, 0x87, 0xcf, 0x41, 0x5a,
0x1f, 0xa4, 0x98, 0x80, 0xca, 0xf6, 0xd5, 0x16, 0x82, 0xfd, 0x4c, 0x3c, 0xbf, 0xfc, 0xad, 0x82, 0x35, 0x55, 0x5c, 0x14, 0xb6, 0x3a, 0x6f, 0x10, 0x45, 0x9f, 0xd5, 0x56, 0x78, 0x4d, 0xe7, 0xb7,
0x31, 0x1f, 0x30, 0x63, 0x3c, 0x81, 0x3a, 0x12, 0xb9, 0xf4, 0x64, 0x0a, 0xc4, 0xc5, 0x1b, 0xc1, 0xa5, 0xcc, 0xd0, 0x46, 0x1d, 0x85, 0x00, 0x11, 0x9f, 0x69, 0xde, 0x7d, 0x09, 0x01, 0x55, 0x18,
0xff, 0x40, 0x42, 0x5e, 0x34, 0xb8, 0x32, 0x42, 0xf2, 0xf0, 0xe9, 0xcc, 0xad, 0x4e, 0x0a, 0x93, 0xab, 0x2d, 0x02, 0xfb, 0x94, 0xf8, 0x41, 0xed, 0x03, 0x05, 0x63, 0x3e, 0xa1, 0x31, 0x79, 0x02,
0x9d, 0x34, 0x96, 0x4e, 0x5f, 0xbe, 0x7b, 0x16, 0x5d, 0x80, 0x59, 0x7b, 0xdc, 0x89, 0xe7, 0xdc, 0x75, 0x24, 0x72, 0xf5, 0xe7, 0x24, 0x48, 0x89, 0x37, 0x82, 0xdf, 0x83, 0xb4, 0x5c, 0x83, 0xf0,
0xf2, 0x34, 0x8e, 0xe7, 0xee, 0x3b, 0xa8, 0xe3, 0xb9, 0xfb, 0x2f, 0xec, 0xbd, 0xdc, 0xf2, 0x88, 0xd5, 0x0c, 0xc9, 0xd3, 0xfb, 0xb6, 0xb8, 0xbe, 0x28, 0x4c, 0xde, 0xa4, 0xb1, 0x76, 0xf6, 0xfb,
0xc2, 0xc7, 0x20, 0x2e, 0x0f, 0xc5, 0xd7, 0xf7, 0x62, 0x86, 0xcc, 0x2b, 0x13, 0xa2, 0x14, 0xf1, 0xdf, 0xbf, 0xc6, 0x5f, 0xc0, 0x82, 0x3d, 0xef, 0xbb, 0xc0, 0xb9, 0xe5, 0x3e, 0x9d, 0xcf, 0x3d,
0xba, 0x20, 0x5e, 0x86, 0x4b, 0x63, 0x89, 0xed, 0xff, 0xc5, 0xb6, 0x3d, 0x82, 0xa7, 0x1a, 0x98, 0xb6, 0x85, 0xe7, 0x73, 0x8f, 0xaf, 0xe5, 0x47, 0xb9, 0xe5, 0xe6, 0x85, 0x3f, 0x81, 0x94, 0xdc,
0x0e, 0x37, 0x04, 0xae, 0x8d, 0x83, 0x1f, 0x58, 0xf9, 0x9c, 0x39, 0x39, 0x50, 0x49, 0x59, 0x16, 0x2e, 0xef, 0x3d, 0x8a, 0x19, 0x31, 0xbf, 0x5a, 0x10, 0xa5, 0x88, 0x37, 0x04, 0xf1, 0x4b, 0xb8,
0x52, 0x16, 0xe1, 0xc2, 0x08, 0x29, 0xe1, 0x2e, 0x95, 0xb7, 0x2e, 0xde, 0xea, 0x91, 0x8b, 0x5b, 0x36, 0x97, 0xd8, 0xfe, 0x41, 0x8c, 0xe8, 0x8f, 0xf0, 0x4c, 0x03, 0x4b, 0xd1, 0x84, 0xc0, 0xd7,
0x5d, 0xbb, 0xbc, 0xd5, 0xb5, 0x37, 0xb7, 0xba, 0xf6, 0xf4, 0x4e, 0x8f, 0x5c, 0xde, 0xe9, 0x91, 0xf3, 0xe0, 0x27, 0xf6, 0x44, 0xd1, 0x5c, 0x1c, 0xa8, 0xa4, 0xbc, 0x14, 0x52, 0x56, 0xe1, 0x8b,
0x57, 0x77, 0x7a, 0xe4, 0xaf, 0xde, 0xd3, 0xc5, 0x41, 0x8a, 0x75, 0x54, 0xa5, 0x12, 0xee, 0x5f, 0x19, 0x52, 0xa2, 0x59, 0xaa, 0xed, 0x5c, 0xde, 0xe9, 0xb1, 0xcb, 0x7b, 0x5d, 0xbb, 0xba, 0xd7,
0x09, 0x28, 0x46, 0xab, 0x9a, 0x10, 0x3f, 0xb5, 0xdf, 0x7d, 0x0c, 0x00, 0x00, 0xff, 0xff, 0xf4, 0xb5, 0xbf, 0xee, 0x75, 0xed, 0x97, 0x07, 0x3d, 0x76, 0xf5, 0xa0, 0xc7, 0xfe, 0x78, 0xd0, 0x63,
0x79, 0x11, 0x40, 0x9a, 0x08, 0x00, 0x00, 0x5f, 0x8f, 0xee, 0x3b, 0x0e, 0x52, 0x69, 0xa3, 0x06, 0x95, 0x70, 0xdf, 0x49, 0x40, 0xd1, 0x5a,
0x8d, 0xb4, 0xf8, 0x3e, 0x6f, 0xfd, 0x17, 0x00, 0x00, 0xff, 0xff, 0xea, 0x07, 0xa4, 0x14, 0xcf,
0x08, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
@ -1008,7 +1012,17 @@ func (m *QueryDepositsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i = encodeVarintQuery(dAtA, i, uint64(size)) i = encodeVarintQuery(dAtA, i, uint64(size))
} }
i-- i--
dAtA[i] = 0x1a dAtA[i] = 0x22
}
if m.ValueInStakedTokens {
i--
if m.ValueInStakedTokens {
dAtA[i] = 1
} else {
dAtA[i] = 0
}
i--
dAtA[i] = 0x18
} }
if len(m.Denom) > 0 { if len(m.Denom) > 0 {
i -= len(m.Denom) i -= len(m.Denom)
@ -1262,6 +1276,9 @@ func (m *QueryDepositsRequest) Size() (n int) {
if l > 0 { if l > 0 {
n += 1 + l + sovQuery(uint64(l)) n += 1 + l + sovQuery(uint64(l))
} }
if m.ValueInStakedTokens {
n += 2
}
if m.Pagination != nil { if m.Pagination != nil {
l = m.Pagination.Size() l = m.Pagination.Size()
n += 1 + l + sovQuery(uint64(l)) n += 1 + l + sovQuery(uint64(l))
@ -2114,6 +2131,26 @@ func (m *QueryDepositsRequest) Unmarshal(dAtA []byte) error {
m.Denom = string(dAtA[iNdEx:postIndex]) m.Denom = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex iNdEx = postIndex
case 3: case 3:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field ValueInStakedTokens", wireType)
}
var v int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowQuery
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
v |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
m.ValueInStakedTokens = bool(v != 0)
case 4:
if wireType != 2 { if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType)
} }