mirror of
https://github.com/0glabs/0g-chain.git
synced 2024-12-26 00:05:18 +00:00
Add /cdp/totalPrincipal
and /cdp/totalCollateral
Endpoints (#1027)
* Add cdp/totals rest endpoint for aggregated principal and fees * Add total collateral to aggregated cdp * Add pagination * Update totalPrincipal endpoint to use keeper GetTotalPrincipal * Update documentation for queryGetTotalPrincipal Co-authored-by: Kevin Davis <karzak@users.noreply.github.com> * Remove unused AggregatedCDP types * Make CDP type optional, return all if not provided * add total collateral endpoint that efficient fetches collateral for a types, only iterating cdps for types b, etc * correctly and efficienlty filter for a single collateral type Co-authored-by: Kevin Davis <karzak@users.noreply.github.com> Co-authored-by: Nick DeLuca <nickdeluca08@gmail.com>
This commit is contained in:
parent
baab2b957c
commit
f84a8b0be0
@ -18,8 +18,10 @@ import (
|
|||||||
func registerQueryRoutes(cliCtx context.CLIContext, r *mux.Router) {
|
func registerQueryRoutes(cliCtx context.CLIContext, r *mux.Router) {
|
||||||
r.HandleFunc("/cdp/accounts", getAccountsHandlerFn(cliCtx)).Methods("GET")
|
r.HandleFunc("/cdp/accounts", getAccountsHandlerFn(cliCtx)).Methods("GET")
|
||||||
r.HandleFunc("/cdp/parameters", getParamsHandlerFn(cliCtx)).Methods("GET")
|
r.HandleFunc("/cdp/parameters", getParamsHandlerFn(cliCtx)).Methods("GET")
|
||||||
|
r.HandleFunc("/cdp/totalPrincipal", getTotalPrincipal(cliCtx)).Methods("GET")
|
||||||
|
r.HandleFunc("/cdp/totalCollateral", getTotalCollateral(cliCtx)).Methods("GET")
|
||||||
|
r.HandleFunc("/cdp/cdps", queryCdpsHandlerFn(cliCtx)).Methods("GET")
|
||||||
r.HandleFunc(fmt.Sprintf("/cdp/cdps/cdp/{%s}/{%s}", types.RestOwner, types.RestCollateralType), queryCdpHandlerFn(cliCtx)).Methods("GET")
|
r.HandleFunc(fmt.Sprintf("/cdp/cdps/cdp/{%s}/{%s}", types.RestOwner, types.RestCollateralType), queryCdpHandlerFn(cliCtx)).Methods("GET")
|
||||||
r.HandleFunc(fmt.Sprintf("/cdp/cdps"), queryCdpsHandlerFn(cliCtx)).Methods("GET")
|
|
||||||
r.HandleFunc(fmt.Sprintf("/cdp/cdps/collateralType/{%s}", types.RestCollateralType), queryCdpsByCollateralTypeHandlerFn(cliCtx)).Methods("GET") // legacy
|
r.HandleFunc(fmt.Sprintf("/cdp/cdps/collateralType/{%s}", types.RestCollateralType), queryCdpsByCollateralTypeHandlerFn(cliCtx)).Methods("GET") // legacy
|
||||||
r.HandleFunc(fmt.Sprintf("/cdp/cdps/ratio/{%s}/{%s}", types.RestCollateralType, types.RestRatio), queryCdpsByRatioHandlerFn(cliCtx)).Methods("GET") // legacy
|
r.HandleFunc(fmt.Sprintf("/cdp/cdps/ratio/{%s}/{%s}", types.RestCollateralType, types.RestRatio), queryCdpsByRatioHandlerFn(cliCtx)).Methods("GET") // legacy
|
||||||
r.HandleFunc(fmt.Sprintf("/cdp/cdps/cdp/deposits/{%s}/{%s}", types.RestOwner, types.RestCollateralType), queryCdpDepositsHandlerFn(cliCtx)).Methods("GET")
|
r.HandleFunc(fmt.Sprintf("/cdp/cdps/cdp/deposits/{%s}/{%s}", types.RestOwner, types.RestCollateralType), queryCdpDepositsHandlerFn(cliCtx)).Methods("GET")
|
||||||
@ -266,3 +268,69 @@ func queryCdpsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
|||||||
rest.PostProcessResponse(w, cliCtx, res)
|
rest.PostProcessResponse(w, cliCtx, res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getTotalPrincipal(cliCtx context.CLIContext) http.HandlerFunc {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
// Parse the query height
|
||||||
|
cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r)
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var cdpCollateralType string
|
||||||
|
|
||||||
|
if x := r.URL.Query().Get(RestCollateralType); len(x) != 0 {
|
||||||
|
cdpCollateralType = strings.TrimSpace(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
params := types.NewQueryGetTotalPrincipalParams(cdpCollateralType)
|
||||||
|
bz, err := cliCtx.Codec.MarshalJSON(params)
|
||||||
|
if err != nil {
|
||||||
|
rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
route := fmt.Sprintf("custom/%s/%s", types.ModuleName, types.QueryGetTotalPrincipal)
|
||||||
|
res, height, err := cliCtx.QueryWithData(route, bz)
|
||||||
|
cliCtx = cliCtx.WithHeight(height)
|
||||||
|
if err != nil {
|
||||||
|
rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
rest.PostProcessResponse(w, cliCtx, res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func getTotalCollateral(cliCtx context.CLIContext) http.HandlerFunc {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
// Parse the query height
|
||||||
|
cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r)
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var cdpCollateralType string
|
||||||
|
|
||||||
|
if x := r.URL.Query().Get(RestCollateralType); len(x) != 0 {
|
||||||
|
cdpCollateralType = strings.TrimSpace(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
params := types.NewQueryGetTotalCollateralParams(cdpCollateralType)
|
||||||
|
bz, err := cliCtx.Codec.MarshalJSON(params)
|
||||||
|
if err != nil {
|
||||||
|
rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
route := fmt.Sprintf("custom/%s/%s", types.ModuleName, types.QueryGetTotalCollateral)
|
||||||
|
res, height, err := cliCtx.QueryWithData(route, bz)
|
||||||
|
cliCtx = cliCtx.WithHeight(height)
|
||||||
|
if err != nil {
|
||||||
|
rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
rest.PostProcessResponse(w, cliCtx, res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package keeper
|
package keeper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"sort"
|
||||||
|
|
||||||
abci "github.com/tendermint/tendermint/abci/types"
|
abci "github.com/tendermint/tendermint/abci/types"
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/client"
|
"github.com/cosmos/cosmos-sdk/client"
|
||||||
@ -30,6 +32,10 @@ func NewQuerier(keeper Keeper) sdk.Querier {
|
|||||||
return queryGetParams(ctx, req, keeper)
|
return queryGetParams(ctx, req, keeper)
|
||||||
case types.QueryGetAccounts:
|
case types.QueryGetAccounts:
|
||||||
return queryGetAccounts(ctx, req, keeper)
|
return queryGetAccounts(ctx, req, keeper)
|
||||||
|
case types.QueryGetTotalPrincipal:
|
||||||
|
return queryGetTotalPrincipal(ctx, req, keeper)
|
||||||
|
case types.QueryGetTotalCollateral:
|
||||||
|
return queryGetTotalCollateral(ctx, req, keeper)
|
||||||
default:
|
default:
|
||||||
return nil, sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "unknown %s query endpoint %s", types.ModuleName, path[0])
|
return nil, sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "unknown %s query endpoint %s", types.ModuleName, path[0])
|
||||||
}
|
}
|
||||||
@ -199,6 +205,138 @@ func queryGetCdps(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) ([]byte
|
|||||||
return bz, nil
|
return bz, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// query total amount of principal (ie. usdx) that has been minted with a particular collateral type
|
||||||
|
func queryGetTotalPrincipal(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) ([]byte, error) {
|
||||||
|
var params types.QueryGetTotalPrincipalParams
|
||||||
|
err := types.ModuleCdc.UnmarshalJSON(req.Data, ¶ms)
|
||||||
|
if err != nil {
|
||||||
|
return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
var queryCollateralTypes []string
|
||||||
|
|
||||||
|
if params.CollateralType != "" {
|
||||||
|
// Single collateralType provided
|
||||||
|
queryCollateralTypes = append(queryCollateralTypes, params.CollateralType)
|
||||||
|
} else {
|
||||||
|
// No collateralType provided, respond with all of them
|
||||||
|
keeperParams := keeper.GetParams(ctx)
|
||||||
|
|
||||||
|
for _, collateral := range keeperParams.CollateralParams {
|
||||||
|
queryCollateralTypes = append(queryCollateralTypes, collateral.Type)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var collateralPrincipals []types.TotalCDPPrincipal
|
||||||
|
|
||||||
|
for _, queryType := range queryCollateralTypes {
|
||||||
|
// Hardcoded to default USDX
|
||||||
|
principalAmount := keeper.GetTotalPrincipal(ctx, queryType, types.DefaultStableDenom)
|
||||||
|
// Wrap it in an sdk.Coin
|
||||||
|
totalAmountCoin := sdk.NewCoin(types.DefaultStableDenom, principalAmount)
|
||||||
|
|
||||||
|
totalPrincipal := types.NewTotalCDPPrincipal(queryType, totalAmountCoin)
|
||||||
|
collateralPrincipals = append(collateralPrincipals, totalPrincipal)
|
||||||
|
}
|
||||||
|
|
||||||
|
bz, err := codec.MarshalJSONIndent(keeper.cdc, collateralPrincipals)
|
||||||
|
if err != nil {
|
||||||
|
return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return bz, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// query total amount of collateral (ie. btcb) that has been deposited with a particular collateral type
|
||||||
|
func queryGetTotalCollateral(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) ([]byte, error) {
|
||||||
|
var request types.QueryGetTotalCollateralParams
|
||||||
|
err := types.ModuleCdc.UnmarshalJSON(req.Data, &request)
|
||||||
|
if err != nil {
|
||||||
|
return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
params := keeper.GetParams(ctx)
|
||||||
|
denomCollateralTypes := make(map[string][]string)
|
||||||
|
|
||||||
|
// collect collateral types for each denom
|
||||||
|
for _, collateralParam := range params.CollateralParams {
|
||||||
|
denomCollateralTypes[collateralParam.Denom] =
|
||||||
|
append(denomCollateralTypes[collateralParam.Denom], collateralParam.Type)
|
||||||
|
}
|
||||||
|
|
||||||
|
// sort collateral types alphabetically
|
||||||
|
for _, collateralTypes := range denomCollateralTypes {
|
||||||
|
sort.Slice(collateralTypes, func(i int, j int) bool {
|
||||||
|
return collateralTypes[i] < collateralTypes[j]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// get total collateral in all cdps
|
||||||
|
cdpAccount := keeper.supplyKeeper.GetModuleAccount(ctx, types.ModuleName)
|
||||||
|
totalCdpCollateral := cdpAccount.GetCoins()
|
||||||
|
|
||||||
|
var response []types.TotalCDPCollateral
|
||||||
|
|
||||||
|
for denom, collateralTypes := range denomCollateralTypes {
|
||||||
|
// skip any denoms that do not match the requested collateral type
|
||||||
|
if request.CollateralType != "" {
|
||||||
|
match := false
|
||||||
|
for _, ctype := range collateralTypes {
|
||||||
|
if ctype == request.CollateralType {
|
||||||
|
match = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !match {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
totalCollateral := totalCdpCollateral.AmountOf(denom)
|
||||||
|
|
||||||
|
// we need to query individual cdps for denoms with more than one collateral type
|
||||||
|
for i := len(collateralTypes) - 1; i > 0; i-- {
|
||||||
|
cdps := keeper.GetAllCdpsByCollateralType(ctx, collateralTypes[i])
|
||||||
|
|
||||||
|
collateral := sdk.ZeroInt()
|
||||||
|
|
||||||
|
for _, cdp := range cdps {
|
||||||
|
collateral = collateral.Add(cdp.Collateral.Amount)
|
||||||
|
}
|
||||||
|
|
||||||
|
totalCollateral = totalCollateral.Sub(collateral)
|
||||||
|
|
||||||
|
// if we have no collateralType filter, or the filter matches, include it in the response
|
||||||
|
if request.CollateralType == "" || collateralTypes[i] == request.CollateralType {
|
||||||
|
response = append(response, types.NewTotalCDPCollateral(collateralTypes[i], sdk.NewCoin(denom, collateral)))
|
||||||
|
}
|
||||||
|
|
||||||
|
// skip the rest of the cdp queries if we have a matching filter
|
||||||
|
if collateralTypes[i] == request.CollateralType {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if request.CollateralType == "" || collateralTypes[0] == request.CollateralType {
|
||||||
|
// all leftover total collateral belongs to the first collateral type
|
||||||
|
response = append(response, types.NewTotalCDPCollateral(collateralTypes[0], sdk.NewCoin(denom, totalCollateral)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// sort to ensure deterministic response
|
||||||
|
sort.Slice(response, func(i int, j int) bool {
|
||||||
|
return response[i].CollateralType < response[j].CollateralType
|
||||||
|
})
|
||||||
|
|
||||||
|
// encode response
|
||||||
|
bz, err := codec.MarshalJSONIndent(keeper.cdc, response)
|
||||||
|
if err != nil {
|
||||||
|
return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return bz, nil
|
||||||
|
}
|
||||||
|
|
||||||
// FilterCDPs queries the store for all CDPs that match query params
|
// FilterCDPs queries the store for all CDPs that match query params
|
||||||
func FilterCDPs(ctx sdk.Context, k Keeper, params types.QueryCdpsParams) types.AugmentedCDPs {
|
func FilterCDPs(ctx sdk.Context, k Keeper, params types.QueryCdpsParams) types.AugmentedCDPs {
|
||||||
var matchCollateralType, matchOwner, matchID, matchRatio types.CDPs
|
var matchCollateralType, matchOwner, matchID, matchRatio types.CDPs
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package keeper_test
|
package keeper_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
@ -374,6 +375,96 @@ func (suite *QuerierTestSuite) TestQueryCdps() {
|
|||||||
suite.Equal(50, len(output))
|
suite.Equal(50, len(output))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (suite *QuerierTestSuite) TestQueryTotalPrincipal() {
|
||||||
|
ctx := suite.ctx.WithIsCheckTx(false)
|
||||||
|
params := types.NewQueryGetTotalPrincipalParams("btc-a")
|
||||||
|
|
||||||
|
query := abci.RequestQuery{
|
||||||
|
Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryGetTotalPrincipal}, "/"),
|
||||||
|
Data: types.ModuleCdc.MustMarshalJSON(params),
|
||||||
|
}
|
||||||
|
|
||||||
|
bz, err := suite.querier(ctx, []string{types.QueryGetTotalPrincipal}, query)
|
||||||
|
suite.Nil(err)
|
||||||
|
suite.NotNil(bz)
|
||||||
|
|
||||||
|
output := []types.TotalCDPPrincipal{}
|
||||||
|
suite.Nil(types.ModuleCdc.UnmarshalJSON(bz, &output))
|
||||||
|
fmt.Printf("%s", output)
|
||||||
|
suite.Equal(1, len(output))
|
||||||
|
suite.Equal("btc-a", output[0].CollateralType)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (suite *QuerierTestSuite) TestQueryTotalPrincipalAll() {
|
||||||
|
ctx := suite.ctx.WithIsCheckTx(false)
|
||||||
|
params := types.NewQueryGetTotalPrincipalParams("")
|
||||||
|
|
||||||
|
query := abci.RequestQuery{
|
||||||
|
Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryGetTotalPrincipal}, "/"),
|
||||||
|
Data: types.ModuleCdc.MustMarshalJSON(params),
|
||||||
|
}
|
||||||
|
|
||||||
|
bz, err := suite.querier(ctx, []string{types.QueryGetTotalPrincipal}, query)
|
||||||
|
suite.Nil(err)
|
||||||
|
suite.NotNil(bz)
|
||||||
|
|
||||||
|
output := []types.TotalCDPPrincipal{}
|
||||||
|
suite.Nil(types.ModuleCdc.UnmarshalJSON(bz, &output))
|
||||||
|
|
||||||
|
var outputTypes []string
|
||||||
|
for _, c := range output {
|
||||||
|
outputTypes = append(outputTypes, c.CollateralType)
|
||||||
|
}
|
||||||
|
|
||||||
|
suite.Greater(len(output), 0)
|
||||||
|
suite.Subset(outputTypes, []string{"btc-a", "xrp-a"})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (suite *QuerierTestSuite) TestQueryTotalCollateral() {
|
||||||
|
ctx := suite.ctx.WithIsCheckTx(false)
|
||||||
|
params := types.NewQueryGetTotalCollateralParams("btc-a")
|
||||||
|
|
||||||
|
query := abci.RequestQuery{
|
||||||
|
Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryGetTotalCollateral}, "/"),
|
||||||
|
Data: types.ModuleCdc.MustMarshalJSON(params),
|
||||||
|
}
|
||||||
|
|
||||||
|
bz, err := suite.querier(ctx, []string{types.QueryGetTotalCollateral}, query)
|
||||||
|
suite.Nil(err)
|
||||||
|
suite.NotNil(bz)
|
||||||
|
|
||||||
|
output := []types.TotalCDPCollateral{}
|
||||||
|
suite.Nil(types.ModuleCdc.UnmarshalJSON(bz, &output))
|
||||||
|
fmt.Printf("%s", output)
|
||||||
|
suite.Equal(1, len(output))
|
||||||
|
suite.Equal("btc-a", output[0].CollateralType)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (suite *QuerierTestSuite) TestQueryTotalCollateralAll() {
|
||||||
|
ctx := suite.ctx.WithIsCheckTx(false)
|
||||||
|
params := types.NewQueryGetTotalCollateralParams("")
|
||||||
|
|
||||||
|
query := abci.RequestQuery{
|
||||||
|
Path: strings.Join([]string{custom, types.QuerierRoute, types.QueryGetTotalCollateral}, "/"),
|
||||||
|
Data: types.ModuleCdc.MustMarshalJSON(params),
|
||||||
|
}
|
||||||
|
|
||||||
|
bz, err := suite.querier(ctx, []string{types.QueryGetTotalCollateral}, query)
|
||||||
|
suite.Nil(err)
|
||||||
|
suite.NotNil(bz)
|
||||||
|
|
||||||
|
output := []types.TotalCDPCollateral{}
|
||||||
|
suite.Nil(types.ModuleCdc.UnmarshalJSON(bz, &output))
|
||||||
|
|
||||||
|
var outputTypes []string
|
||||||
|
for _, c := range output {
|
||||||
|
outputTypes = append(outputTypes, c.CollateralType)
|
||||||
|
}
|
||||||
|
|
||||||
|
suite.Greater(len(output), 0)
|
||||||
|
suite.Subset(outputTypes, []string{"btc-a", "xrp-a"})
|
||||||
|
}
|
||||||
|
|
||||||
func TestQuerierTestSuite(t *testing.T) {
|
func TestQuerierTestSuite(t *testing.T) {
|
||||||
suite.Run(t, new(QuerierTestSuite))
|
suite.Run(t, new(QuerierTestSuite))
|
||||||
}
|
}
|
||||||
|
@ -203,3 +203,31 @@ func (augcdps AugmentedCDPs) String() string {
|
|||||||
}
|
}
|
||||||
return out
|
return out
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TotalCDPPrincipal is a total principal of a given collateral type
|
||||||
|
type TotalCDPPrincipal struct {
|
||||||
|
CollateralType string `json:"collateral_type" yaml:"collateral_type"` // string representing the unique collateral type of the CDP
|
||||||
|
Amount sdk.Coin `json:"amount" yaml:"amount"` // Amount of principal stored in this CDP
|
||||||
|
}
|
||||||
|
|
||||||
|
// TotalCDPPrincipal returns a new TotalCDPPrincipal
|
||||||
|
func NewTotalCDPPrincipal(collateralType string, amount sdk.Coin) TotalCDPPrincipal {
|
||||||
|
return TotalCDPPrincipal{
|
||||||
|
CollateralType: collateralType,
|
||||||
|
Amount: amount,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TotalCDPCollateral is a total principal of a given collateral type
|
||||||
|
type TotalCDPCollateral struct {
|
||||||
|
CollateralType string `json:"collateral_type" yaml:"collateral_type"` // string representing the unique collateral type of the CDP
|
||||||
|
Amount sdk.Coin `json:"amount" yaml:"amount"` // Amount of collateral stored in this CDP
|
||||||
|
}
|
||||||
|
|
||||||
|
// TotalCDPCollateral returns a new TotalCDPCollateral
|
||||||
|
func NewTotalCDPCollateral(collateralType string, amount sdk.Coin) TotalCDPCollateral {
|
||||||
|
return TotalCDPCollateral{
|
||||||
|
CollateralType: collateralType,
|
||||||
|
Amount: amount,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -13,6 +13,8 @@ const (
|
|||||||
QueryGetCdpsByCollateralType = "collateralType" // legacy query, maintained for REST API
|
QueryGetCdpsByCollateralType = "collateralType" // legacy query, maintained for REST API
|
||||||
QueryGetParams = "params"
|
QueryGetParams = "params"
|
||||||
QueryGetAccounts = "accounts"
|
QueryGetAccounts = "accounts"
|
||||||
|
QueryGetTotalPrincipal = "totalPrincipal"
|
||||||
|
QueryGetTotalCollateral = "totalCollateral"
|
||||||
RestOwner = "owner"
|
RestOwner = "owner"
|
||||||
RestCollateralType = "collateral-type"
|
RestCollateralType = "collateral-type"
|
||||||
RestRatio = "ratio"
|
RestRatio = "ratio"
|
||||||
@ -93,3 +95,27 @@ func NewQueryCdpsByRatioParams(collateralType string, ratio sdk.Dec) QueryCdpsBy
|
|||||||
Ratio: ratio,
|
Ratio: ratio,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// QueryGetTotalPrincipalParams params for query /cdp/totalPrincipal
|
||||||
|
type QueryGetTotalPrincipalParams struct {
|
||||||
|
CollateralType string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewQueryGetTotalPrincipalParams returns QueryGetTotalPrincipalParams
|
||||||
|
func NewQueryGetTotalPrincipalParams(collateralType string) QueryGetTotalPrincipalParams {
|
||||||
|
return QueryGetTotalPrincipalParams{
|
||||||
|
CollateralType: collateralType,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// QueryGetTotalCollateralParams params for query /cdp/totalCollateral
|
||||||
|
type QueryGetTotalCollateralParams struct {
|
||||||
|
CollateralType string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewQueryGetTotalCollateralParams returns QueryGetTotalCollateralParams
|
||||||
|
func NewQueryGetTotalCollateralParams(collateralType string) QueryGetTotalCollateralParams {
|
||||||
|
return QueryGetTotalCollateralParams{
|
||||||
|
CollateralType: collateralType,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user