Skip to content

Commit

Permalink
feat: additional leverage queries (#617)
Browse files Browse the repository at this point in the history
  • Loading branch information
toteki committed Mar 7, 2022
1 parent 6b2a099 commit c0935d0
Show file tree
Hide file tree
Showing 18 changed files with 3,249 additions and 381 deletions.
92 changes: 85 additions & 7 deletions proto/umee/leverage/v1beta1/query.proto
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,27 @@ service Query {
option (google.api.http).get = "/umee/leverage/v1beta1/borrowed";
}

// BorrowedValue queries for the usd value of the borrowed amount of a user
// by token denomination. If the denomination is not supplied, the sum across
// all borrowed tokens is returned.
rpc BorrowedValue(QueryBorrowedValueRequest) returns (QueryBorrowedValueResponse) {
option (google.api.http).get = "/umee/leverage/v1beta1/borrowed_value";
}

// Loaned queries for the amount of tokens loaned by a user by denomination.
// If the denomination is not supplied, the total for each loaned token is
// returned.
rpc Loaned(QueryLoanedRequest) returns (QueryLoanedResponse) {
option (google.api.http).get = "/umee/leverage/v1beta1/loaned";
}

// LoanedValue queries for the USD value loaned by a user by token
// denomination. If the denomination is not supplied, the sum across all
// loaned tokens is returned.
rpc LoanedValue(QueryLoanedValueRequest) returns (QueryLoanedValueResponse) {
option (google.api.http).get = "/umee/leverage/v1beta1/loaned_value";
}

// AvailableBorrow queries for the available amount to borrow of a specified denomination.
rpc AvailableBorrow(QueryAvailableBorrowRequest) returns (QueryAvailableBorrowResponse) {
option (google.api.http).get = "/umee/leverage/v1beta1/available_borrow";
Expand All @@ -42,26 +63,34 @@ service Query {
option (google.api.http).get = "/umee/leverage/v1beta1/lend_apy";
}

// MarketSize queries for the Market Size in USD of a specified denomination.
// MarketSize queries for the Market Size in USD of a specified denomination, which
// is the USD value of total tokens loaned by all users plus borrow interest owed
// by all users.
rpc MarketSize(QueryMarketSizeRequest) returns (QueryMarketSizeResponse) {
option (google.api.http).get = "/umee/leverage/v1beta1/market_size";
}

// TokenMarketSize queries for the Market Size in base tokens of a specified denomination,
// which is the total tokens loaned by all users plus borrow interest owed by all users.
rpc TokenMarketSize(QueryTokenMarketSizeRequest) returns (QueryTokenMarketSizeResponse) {
option (google.api.http).get = "/umee/leverage/v1beta1/token_market_size";
}

// ReserveAmount queries for the amount reserved of a specified denomination.
// If the token is not valid, the reserved amount is zero.
rpc ReserveAmount(QueryReserveAmountRequest) returns (QueryReserveAmountResponse) {
option (google.api.http).get = "/umee/leverage/v1beta1/reserve_amount";
}

// CollateralSetting queries a borrower's collateral setting of a specified
// uToken denomination.
// CollateralSetting queries a borrower's collateral setting (enabled or disabled)
// for a specified uToken denomination.
rpc CollateralSetting(QueryCollateralSettingRequest) returns (QueryCollateralSettingResponse) {
option (google.api.http).get = "/umee/leverage/v1beta1/collateral_setting";
}

// Collateral queries the collateral amount of a user by token denomination.
// If the denomination is not supplied, the total for each collateral token is
// returned.
// If the denomination is not supplied, all of the user's collateral tokens
// are returned.
rpc Collateral(QueryCollateralRequest) returns (QueryCollateralResponse) {
option (google.api.http).get = "/umee/leverage/v1beta1/collateral";
}
Expand All @@ -71,12 +100,12 @@ service Query {
option (google.api.http).get = "/umee/leverage/v1beta1/exchange_rate";
}

// BorrowLimit queries the borrow limit in USD of a given borrower
// BorrowLimit queries the borrow limit in USD of a given borrower.
rpc BorrowLimit(QueryBorrowLimitRequest) returns (QueryBorrowLimitResponse) {
option (google.api.http).get = "/umee/leverage/v1beta1/borrow_limit";
}

// LiquidationTargets queries a list of all borrowers eligible for liquidation
// LiquidationTargets queries a list of all borrower addresses eligible for liquidation.
rpc LiquidationTargets(QueryLiquidationTargetsRequest) returns (QueryLiquidationTargetsResponse) {
option (google.api.http).get = "/umee/leverage/v1beta1/liquidation_targets";
}
Expand Down Expand Up @@ -138,6 +167,19 @@ message QueryMarketSizeResponse {
[(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = false];
}

// QueryTokenMarketSizeRequest defines the request structure for the Token Market Size
// gRPC service handler.
message QueryTokenMarketSizeRequest {
string denom = 1;
}

// QueryTokenMarketSizeResponse defines the response structure for the Token Market Size
// gRPC service handler.
message QueryTokenMarketSizeResponse {
string market_size = 1
[(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", (gogoproto.nullable) = false];
}

// QueryRegisteredTokensResponse defines the response structure for the
// RegisteredTokens gRPC service handler.
message QueryRegisteredTokensResponse {
Expand Down Expand Up @@ -168,6 +210,42 @@ message QueryBorrowedResponse {
[(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"];
}

// QueryBorrowedValueRequest defines the request structure for the BorrowedValue gRPC service handler.
message QueryBorrowedValueRequest {
string address = 1;
string denom = 2;
}

// QueryBorrowedValueResponse defines the response structure for the BorrowedValue gRPC service handler.
message QueryBorrowedValueResponse {
string borrowed_value = 1
[(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = false];
}

// QueryLoanedRequest defines the request structure for the Loaned gRPC service handler.
message QueryLoanedRequest {
string address = 1;
string denom = 2;
}

// QueryLoanedResponse defines the response structure for the Loaned gRPC service handler.
message QueryLoanedResponse {
repeated cosmos.base.v1beta1.Coin loaned = 1
[(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"];
}

// QueryLoanedValueRequest defines the request structure for the LoanedValue gRPC service handler.
message QueryLoanedValueRequest {
string address = 1;
string denom = 2;
}

// QueryLoanedValueResponse defines the response structure for the LoanedValue gRPC service handler.
message QueryLoanedValueResponse {
string loaned_value = 1
[(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = false];
}

// QueryReserveAmountRequest defines the request structure for the ReserveAmount
// gRPC service handler.
message QueryReserveAmountRequest {
Expand Down
4 changes: 2 additions & 2 deletions proto/umee/leverage/v1beta1/tx.proto
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ service Msg {
// LendAsset defines a method for lending coins to the capital facility.
rpc LendAsset(MsgLendAsset) returns (MsgLendAssetResponse);

// WithdrawAsset defines a method for withdrawing previously lent coins from
// WithdrawAsset defines a method for withdrawing previously loaned coins from
// the capital facility.
rpc WithdrawAsset(MsgWithdrawAsset) returns (MsgWithdrawAssetResponse);

Expand All @@ -37,7 +37,7 @@ message MsgLendAsset {
cosmos.base.v1beta1.Coin amount = 2 [(gogoproto.nullable) = false];
}

// MsgWithdrawAsset represents a lender's request to withdraw a previously lent
// MsgWithdrawAsset represents a lender's request to withdraw a previously loaned
// base asset type from the module
message MsgWithdrawAsset {
string lender = 1;
Expand Down
148 changes: 148 additions & 0 deletions x/leverage/client/cli/query.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,17 @@ func GetQueryCmd(queryRoute string) *cobra.Command {
GetCmdQueryAllRegisteredTokens(),
GetCmdQueryParams(),
GetCmdQueryBorrowed(),
GetCmdQueryBorrowedValue(),
GetCmdQueryLoaned(),
GetCmdQueryLoanedValue(),
GetCmdQueryReserveAmount(),
GetCmdQueryCollateral(),
GetCmdQueryCollateralSetting(),
GetCmdQueryExchangeRate(),
GetCmdQueryLendAPY(),
GetCmdQueryBorrowAPY(),
GetCmdQueryMarketSize(),
GetCmdQueryTokenMarketSize(),
GetCmdQueryBorrowLimit(),
GetCmdQueryLiquidationTargets(),
)
Expand Down Expand Up @@ -138,6 +142,117 @@ func GetCmdQueryBorrowed() *cobra.Command {
return cmd
}

// GetCmdQueryBorrowedValue returns a CLI command handler to query for the USD
// value of total borrowed tokens for a given address.
func GetCmdQueryBorrowedValue() *cobra.Command {
cmd := &cobra.Command{
Use: "borrowed-value [addr]",
Args: cobra.ExactArgs(1),
Short: "Query for the total USD value of borrowed tokens for an address",
RunE: func(cmd *cobra.Command, args []string) error {
clientCtx, err := client.GetClientQueryContext(cmd)
if err != nil {
return err
}

queryClient := types.NewQueryClient(clientCtx)

req := &types.QueryBorrowedValueRequest{
Address: args[0],
}
if d, err := cmd.Flags().GetString(FlagDenom); len(d) > 0 && err == nil {
req.Denom = d
}

resp, err := queryClient.BorrowedValue(cmd.Context(), req)
if err != nil {
return err
}

return clientCtx.PrintProto(resp)
},
}

cmd.Flags().String(FlagDenom, "", "Query for value of only a specific denomination")
flags.AddQueryFlagsToCmd(cmd)

return cmd
}

// GetCmdQueryLoaned returns a CLI command handler to query for the amount of
// tokens loaned by a given address.
func GetCmdQueryLoaned() *cobra.Command {
cmd := &cobra.Command{
Use: "loaned [addr]",
Args: cobra.ExactArgs(1),
Short: "Query for the total amount of tokens loaned by an address",
RunE: func(cmd *cobra.Command, args []string) error {
clientCtx, err := client.GetClientQueryContext(cmd)
if err != nil {
return err
}

queryClient := types.NewQueryClient(clientCtx)

req := &types.QueryLoanedRequest{
Address: args[0],
}
if d, err := cmd.Flags().GetString(FlagDenom); len(d) > 0 && err == nil {
req.Denom = d
}

resp, err := queryClient.Loaned(cmd.Context(), req)
if err != nil {
return err
}

return clientCtx.PrintProto(resp)
},
}

cmd.Flags().String(FlagDenom, "", "Query for a specific denomination")
flags.AddQueryFlagsToCmd(cmd)

return cmd
}

// GetCmdQueryLoanedValue returns a CLI command handler to query for the USD value of
// total tokens loaned by a given address.
func GetCmdQueryLoanedValue() *cobra.Command {
cmd := &cobra.Command{
Use: "loaned-value [addr]",
Args: cobra.ExactArgs(1),
Short: "Query for the USD value of tokens loaned by an address",
RunE: func(cmd *cobra.Command, args []string) error {
clientCtx, err := client.GetClientQueryContext(cmd)
if err != nil {
return err
}

queryClient := types.NewQueryClient(clientCtx)

req := &types.QueryLoanedValueRequest{
Address: args[0],
}
if d, err := cmd.Flags().GetString(FlagDenom); len(d) > 0 && err == nil {
req.Denom = d
}

resp, err := queryClient.LoanedValue(cmd.Context(), req)
if err != nil {
return err
}

return clientCtx.PrintProto(resp)
},
}

cmd.Flags().String(FlagDenom, "", "Query for value of only a specific denomination")
flags.AddQueryFlagsToCmd(cmd)

return cmd
}

// GetCmdQueryReserveAmount returns a CLI command handler to query for the
// reserved amount of a specific token.
func GetCmdQueryReserveAmount() *cobra.Command {
Expand Down Expand Up @@ -407,6 +522,39 @@ func GetCmdQueryMarketSize() *cobra.Command {
return cmd
}

// GetCmdQueryTokenMarketSize returns a CLI command handler to query for the
// Market Size of a specific token, in token denomination instead of USD.
func GetCmdQueryTokenMarketSize() *cobra.Command {
cmd := &cobra.Command{
Use: "token-market-size [denom]",
Args: cobra.ExactArgs(1),
Short: "Query for the market size of a specified denomination measured in base tokens",
RunE: func(cmd *cobra.Command, args []string) error {
clientCtx, err := client.GetClientQueryContext(cmd)
if err != nil {
return err
}

queryClient := types.NewQueryClient(clientCtx)

req := &types.QueryTokenMarketSizeRequest{
Denom: args[0],
}

resp, err := queryClient.TokenMarketSize(cmd.Context(), req)
if err != nil {
return err
}

return clientCtx.PrintProto(resp)
},
}

flags.AddQueryFlagsToCmd(cmd)

return cmd
}

// GetCmdQueryBorrowLimit returns a CLI command handler to query for the
// borrow limit of a specific borrower.
func GetCmdQueryBorrowLimit() *cobra.Command {
Expand Down

0 comments on commit c0935d0

Please sign in to comment.