mirror of
https://github.com/0glabs/0g-chain.git
synced 2024-12-24 23:35:19 +00:00
add deposit balance query (#759)
This commit is contained in:
parent
f7a73c9245
commit
38306e5465
@ -39,6 +39,7 @@ func GetQueryCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
|
|||||||
queryParamsCmd(queryRoute, cdc),
|
queryParamsCmd(queryRoute, cdc),
|
||||||
queryModAccountsCmd(queryRoute, cdc),
|
queryModAccountsCmd(queryRoute, cdc),
|
||||||
queryDepositsCmd(queryRoute, cdc),
|
queryDepositsCmd(queryRoute, cdc),
|
||||||
|
queryDepositCmd(queryRoute, cdc),
|
||||||
queryClaimsCmd(queryRoute, cdc),
|
queryClaimsCmd(queryRoute, cdc),
|
||||||
queryBorrowsCmd(queryRoute, cdc),
|
queryBorrowsCmd(queryRoute, cdc),
|
||||||
queryBorrowCmd(queryRoute, cdc),
|
queryBorrowCmd(queryRoute, cdc),
|
||||||
@ -147,7 +148,7 @@ func queryDepositsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
|
|||||||
page := viper.GetInt(flags.FlagPage)
|
page := viper.GetInt(flags.FlagPage)
|
||||||
limit := viper.GetInt(flags.FlagLimit)
|
limit := viper.GetInt(flags.FlagLimit)
|
||||||
|
|
||||||
params := types.NewQueryDepositParams(page, limit, depositDenom, owner)
|
params := types.NewQueryDepositsParams(page, limit, depositDenom, owner)
|
||||||
bz, err := cdc.MarshalJSON(params)
|
bz, err := cdc.MarshalJSON(params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -373,3 +374,50 @@ func queryBorrowCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
|
|||||||
cmd.Flags().String(flagOwner, "", "filter for borrows by owner address")
|
cmd.Flags().String(flagOwner, "", "filter for borrows by owner address")
|
||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func queryDepositCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
|
||||||
|
cmd := &cobra.Command{
|
||||||
|
Use: "deposit",
|
||||||
|
Short: "query outstanding deposit balance for a user",
|
||||||
|
Long: strings.TrimSpace(`query outstanding deposit balance for a user:
|
||||||
|
Example:
|
||||||
|
$ kvcli q hard deposit --owner kava1l0xsq2z7gqd7yly0g40y5836g0appumark77ny`,
|
||||||
|
),
|
||||||
|
Args: cobra.NoArgs,
|
||||||
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
|
cliCtx := context.NewCLIContext().WithCodec(cdc)
|
||||||
|
|
||||||
|
var owner sdk.AccAddress
|
||||||
|
|
||||||
|
ownerBech := viper.GetString(flagOwner)
|
||||||
|
if len(ownerBech) != 0 {
|
||||||
|
borrowOwner, err := sdk.AccAddressFromBech32(ownerBech)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
owner = borrowOwner
|
||||||
|
}
|
||||||
|
|
||||||
|
params := types.NewQueryDepositParams(owner)
|
||||||
|
bz, err := cdc.MarshalJSON(params)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
route := fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryGetDeposit)
|
||||||
|
res, height, err := cliCtx.QueryWithData(route, bz)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
cliCtx = cliCtx.WithHeight(height)
|
||||||
|
|
||||||
|
var balance sdk.Coins
|
||||||
|
if err := cdc.UnmarshalJSON(res, &balance); err != nil {
|
||||||
|
return fmt.Errorf("failed to unmarshal borrow balance: %w", err)
|
||||||
|
}
|
||||||
|
return cliCtx.PrintOutput(balance)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
cmd.Flags().String(flagOwner, "", "filter for borrows by owner address")
|
||||||
|
return cmd
|
||||||
|
}
|
||||||
|
@ -73,7 +73,7 @@ func queryDepositsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
params := types.NewQueryDepositParams(page, limit, depositDenom, depositOwner)
|
params := types.NewQueryDepositsParams(page, limit, depositDenom, depositOwner)
|
||||||
|
|
||||||
bz, err := cliCtx.Codec.MarshalJSON(params)
|
bz, err := cliCtx.Codec.MarshalJSON(params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -161,3 +161,36 @@ func (k Keeper) DecrementSuppliedCoins(ctx sdk.Context, coins sdk.Coins) error {
|
|||||||
k.SetSuppliedCoins(ctx, updatedSuppliedCoins)
|
k.SetSuppliedCoins(ctx, updatedSuppliedCoins)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetSupplyBalance gets the user's total supply balance (supply balance + pending interest)
|
||||||
|
func (k Keeper) GetSupplyBalance(ctx sdk.Context, depositor sdk.AccAddress) sdk.Coins {
|
||||||
|
supplyBalance := sdk.Coins{}
|
||||||
|
deposit, found := k.GetDeposit(ctx, depositor)
|
||||||
|
if !found {
|
||||||
|
return supplyBalance
|
||||||
|
}
|
||||||
|
|
||||||
|
totalNewInterest := sdk.Coins{}
|
||||||
|
for _, coin := range deposit.Amount {
|
||||||
|
interestFactorValue, foundInterestFactorValue := k.GetSupplyInterestFactor(ctx, coin.Denom)
|
||||||
|
if foundInterestFactorValue {
|
||||||
|
// Locate the interest factor by coin denom in the user's list of interest factors
|
||||||
|
foundAtIndex := -1
|
||||||
|
for i := range deposit.Index {
|
||||||
|
if deposit.Index[i].Denom == coin.Denom {
|
||||||
|
foundAtIndex = i
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Calculate interest owed by user for this asset
|
||||||
|
if foundAtIndex != -1 {
|
||||||
|
storedAmount := sdk.NewDecFromInt(deposit.Amount.AmountOf(coin.Denom))
|
||||||
|
userLastInterestFactor := deposit.Index[foundAtIndex].Value
|
||||||
|
coinInterest := (storedAmount.Quo(userLastInterestFactor).Mul(interestFactorValue)).Sub(storedAmount)
|
||||||
|
totalNewInterest = totalNewInterest.Add(sdk.NewCoin(coin.Denom, coinInterest.TruncateInt()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return deposit.Amount.Add(totalNewInterest...)
|
||||||
|
}
|
||||||
|
@ -22,6 +22,8 @@ func NewQuerier(k Keeper) sdk.Querier {
|
|||||||
return queryGetModAccounts(ctx, req, k)
|
return queryGetModAccounts(ctx, req, k)
|
||||||
case types.QueryGetDeposits:
|
case types.QueryGetDeposits:
|
||||||
return queryGetDeposits(ctx, req, k)
|
return queryGetDeposits(ctx, req, k)
|
||||||
|
case types.QueryGetDeposit:
|
||||||
|
return queryGetDeposit(ctx, req, k)
|
||||||
case types.QueryGetClaims:
|
case types.QueryGetClaims:
|
||||||
return queryGetClaims(ctx, req, k)
|
return queryGetClaims(ctx, req, k)
|
||||||
case types.QueryGetBorrows:
|
case types.QueryGetBorrows:
|
||||||
@ -79,7 +81,7 @@ func queryGetModAccounts(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]by
|
|||||||
|
|
||||||
func queryGetDeposits(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) {
|
func queryGetDeposits(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) {
|
||||||
|
|
||||||
var params types.QueryDepositParams
|
var params types.QueryDepositsParams
|
||||||
err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms)
|
err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error())
|
return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error())
|
||||||
@ -239,7 +241,6 @@ func queryGetClaims(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, e
|
|||||||
}
|
}
|
||||||
|
|
||||||
func queryGetBorrows(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) {
|
func queryGetBorrows(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) {
|
||||||
|
|
||||||
var params types.QueryBorrowsParams
|
var params types.QueryBorrowsParams
|
||||||
err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms)
|
err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -315,3 +316,23 @@ func queryGetBorrow(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, e
|
|||||||
|
|
||||||
return bz, nil
|
return bz, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func queryGetDeposit(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) {
|
||||||
|
var params types.QueryDepositParams
|
||||||
|
err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms)
|
||||||
|
if err != nil {
|
||||||
|
return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
var supplyBalance sdk.Coins
|
||||||
|
if len(params.Owner) > 0 {
|
||||||
|
supplyBalance = k.GetSupplyBalance(ctx, params.Owner)
|
||||||
|
}
|
||||||
|
|
||||||
|
bz, err := codec.MarshalJSONIndent(types.ModuleCdc, supplyBalance)
|
||||||
|
if err != nil {
|
||||||
|
return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return bz, nil
|
||||||
|
}
|
||||||
|
@ -9,6 +9,7 @@ const (
|
|||||||
QueryGetParams = "params"
|
QueryGetParams = "params"
|
||||||
QueryGetModuleAccounts = "accounts"
|
QueryGetModuleAccounts = "accounts"
|
||||||
QueryGetDeposits = "deposits"
|
QueryGetDeposits = "deposits"
|
||||||
|
QueryGetDeposit = "deposit"
|
||||||
QueryGetClaims = "claims"
|
QueryGetClaims = "claims"
|
||||||
QueryGetBorrows = "borrows"
|
QueryGetBorrows = "borrows"
|
||||||
QueryGetBorrowed = "borrowed"
|
QueryGetBorrowed = "borrowed"
|
||||||
@ -17,15 +18,27 @@ const (
|
|||||||
|
|
||||||
// QueryDepositParams is the params for a filtered deposit query
|
// QueryDepositParams is the params for a filtered deposit query
|
||||||
type QueryDepositParams struct {
|
type QueryDepositParams struct {
|
||||||
|
Owner sdk.AccAddress `json:"owner" yaml:"owner"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewQueryDepositParams creates a new QueryDepositParams
|
||||||
|
func NewQueryDepositParams(owner sdk.AccAddress) QueryDepositParams {
|
||||||
|
return QueryDepositParams{
|
||||||
|
Owner: owner,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// QueryDepositsParams is the params for a filtered deposit query
|
||||||
|
type QueryDepositsParams struct {
|
||||||
Page int `json:"page" yaml:"page"`
|
Page int `json:"page" yaml:"page"`
|
||||||
Limit int `json:"limit" yaml:"limit"`
|
Limit int `json:"limit" yaml:"limit"`
|
||||||
DepositDenom string `json:"deposit_denom" yaml:"deposit_denom"`
|
DepositDenom string `json:"deposit_denom" yaml:"deposit_denom"`
|
||||||
Owner sdk.AccAddress `json:"owner" yaml:"owner"`
|
Owner sdk.AccAddress `json:"owner" yaml:"owner"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewQueryDepositParams creates a new QueryDepositParams
|
// NewQueryDepositsParams creates a new QueryDepositsParams
|
||||||
func NewQueryDepositParams(page, limit int, depositDenom string, owner sdk.AccAddress) QueryDepositParams {
|
func NewQueryDepositsParams(page, limit int, depositDenom string, owner sdk.AccAddress) QueryDepositsParams {
|
||||||
return QueryDepositParams{
|
return QueryDepositsParams{
|
||||||
Page: page,
|
Page: page,
|
||||||
Limit: limit,
|
Limit: limit,
|
||||||
DepositDenom: depositDenom,
|
DepositDenom: depositDenom,
|
||||||
|
Loading…
Reference in New Issue
Block a user