mirror of
				https://github.com/0glabs/0g-chain.git
				synced 2025-04-04 15:55:23 +00:00 
			
		
		
		
	Add QueryGetAccounts to CDP Client (#596)
* add module accounts command * update get accounts query to return array of module accounts instead of map of addresses * update tests and add update swagger Co-authored-by: Kevin Davis <kjydavis3@gmail.com>
This commit is contained in:
		
							parent
							
								
									687c39be82
								
							
						
					
					
						commit
						e81987c31f
					
				| @ -36,6 +36,8 @@ Ref: https://keepachangelog.com/en/1.0.0/ | |||||||
| 
 | 
 | ||||||
| ## [Unreleased] | ## [Unreleased] | ||||||
| 
 | 
 | ||||||
|  | [\#596](https://github.com/Kava-Labs/kava/pull/596) Add REST client and CLI query to get module account information for the CDP module | ||||||
|  | 
 | ||||||
| [\#590](https://github.com/Kava-Labs/kava/pull/590) Add CLI query to return kavadist module account balance | [\#590](https://github.com/Kava-Labs/kava/pull/590) Add CLI query to return kavadist module account balance | ||||||
| 
 | 
 | ||||||
| [\#584](https://github.com/Kava-Labs/kava/pulls/584) Add REST client and CLI queries for `kavadist` module | [\#584](https://github.com/Kava-Labs/kava/pulls/584) Add REST client and CLI queries for `kavadist` module | ||||||
|  | |||||||
| @ -599,6 +599,48 @@ | |||||||
|             description: Invalid request |             description: Invalid request | ||||||
|           500: |           500: | ||||||
|             description: Server internal error |             description: Server internal error | ||||||
|  |     /cdp/accounts: | ||||||
|  |       get: | ||||||
|  |         summary: Get the cdp module accounts | ||||||
|  |         tags: | ||||||
|  |           - CDP | ||||||
|  |         produces: | ||||||
|  |           - application/json | ||||||
|  |         responses: | ||||||
|  |           200: | ||||||
|  |             description: The cdp module accounts | ||||||
|  |             schema: | ||||||
|  |               type: object | ||||||
|  |               properties: | ||||||
|  |                 height: | ||||||
|  |                   type: string | ||||||
|  |                   example: "100" | ||||||
|  |                 result: | ||||||
|  |                   type: array | ||||||
|  |                   items: | ||||||
|  |                     type: object | ||||||
|  |                     properties: | ||||||
|  |                       account_number: | ||||||
|  |                         type: number | ||||||
|  |                       address: | ||||||
|  |                         $ref: '#/definitions/Address' | ||||||
|  |                       coins: | ||||||
|  |                         type: array | ||||||
|  |                         items: | ||||||
|  |                           $ref: '#/definitions/Coin' | ||||||
|  |                       name: | ||||||
|  |                         type: string | ||||||
|  |                       permissions: | ||||||
|  |                         type: array | ||||||
|  |                         items: | ||||||
|  |                           type: string | ||||||
|  |                       public_key: | ||||||
|  |                         $ref: "#/definitions/PublicKey" | ||||||
|  |                       sequence: | ||||||
|  |                         type: number | ||||||
|  |           500: | ||||||
|  |             description: Server internal error | ||||||
|  | 
 | ||||||
|     /cdp/parameters: |     /cdp/parameters: | ||||||
|       get: |       get: | ||||||
|         summary: Get the parameters of the cdp module |         summary: Get the parameters of the cdp module | ||||||
|  | |||||||
| @ -11,6 +11,7 @@ import ( | |||||||
| 	"github.com/cosmos/cosmos-sdk/codec" | 	"github.com/cosmos/cosmos-sdk/codec" | ||||||
| 	sdk "github.com/cosmos/cosmos-sdk/types" | 	sdk "github.com/cosmos/cosmos-sdk/types" | ||||||
| 	"github.com/cosmos/cosmos-sdk/version" | 	"github.com/cosmos/cosmos-sdk/version" | ||||||
|  | 	supply "github.com/cosmos/cosmos-sdk/x/supply" | ||||||
| 
 | 
 | ||||||
| 	"github.com/kava-labs/kava/x/cdp/types" | 	"github.com/kava-labs/kava/x/cdp/types" | ||||||
| ) | ) | ||||||
| @ -29,6 +30,7 @@ func GetQueryCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | |||||||
| 		QueryCdpsByDenomAndRatioCmd(queryRoute, cdc), | 		QueryCdpsByDenomAndRatioCmd(queryRoute, cdc), | ||||||
| 		QueryCdpDepositsCmd(queryRoute, cdc), | 		QueryCdpDepositsCmd(queryRoute, cdc), | ||||||
| 		QueryParamsCmd(queryRoute, cdc), | 		QueryParamsCmd(queryRoute, cdc), | ||||||
|  | 		QueryGetAccounts(queryRoute, cdc), | ||||||
| 	)...) | 	)...) | ||||||
| 
 | 
 | ||||||
| 	return cdpQueryCmd | 	return cdpQueryCmd | ||||||
| @ -225,3 +227,29 @@ func QueryParamsCmd(queryRoute string, cdc *codec.Codec) *cobra.Command { | |||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func QueryGetAccounts(queryRoute string, cdc *codec.Codec) *cobra.Command { | ||||||
|  | 	return &cobra.Command{ | ||||||
|  | 		Use:   "accounts", | ||||||
|  | 		Short: "Get module accounts", | ||||||
|  | 		Long:  "Get cdp module account addresses", | ||||||
|  | 		Args:  cobra.NoArgs, | ||||||
|  | 		RunE: func(cmd *cobra.Command, args []string) error { | ||||||
|  | 			cliCtx := context.NewCLIContext().WithCodec(cdc) | ||||||
|  | 
 | ||||||
|  | 			// Query
 | ||||||
|  | 			res, height, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryGetAccounts), nil) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 			cliCtx = cliCtx.WithHeight(height) | ||||||
|  | 
 | ||||||
|  | 			// Decode and print results
 | ||||||
|  | 			var out []supply.ModuleAccount | ||||||
|  | 			if err := cdc.UnmarshalJSON(res, &out); err != nil { | ||||||
|  | 				return fmt.Errorf("failed to unmarshal accounts: %w", err) | ||||||
|  | 			} | ||||||
|  | 			return cliCtx.PrintOutput(out) | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | |||||||
| @ -14,6 +14,7 @@ import ( | |||||||
| 
 | 
 | ||||||
| // define routes that get registered by the main application
 | // define routes that get registered by the main application
 | ||||||
| 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/parameters", getParamsHandlerFn(cliCtx)).Methods("GET") | 	r.HandleFunc("/cdp/parameters", getParamsHandlerFn(cliCtx)).Methods("GET") | ||||||
| 	r.HandleFunc(fmt.Sprintf("/cdp/cdps/cdp/{%s}/{%s}", types.RestOwner, types.RestCollateralDenom), queryCdpHandlerFn(cliCtx)).Methods("GET") | 	r.HandleFunc(fmt.Sprintf("/cdp/cdps/cdp/{%s}/{%s}", types.RestOwner, types.RestCollateralDenom), queryCdpHandlerFn(cliCtx)).Methods("GET") | ||||||
| 	r.HandleFunc(fmt.Sprintf("/cdp/cdps/denom/{%s}", types.RestCollateralDenom), queryCdpsHandlerFn(cliCtx)).Methods("GET") | 	r.HandleFunc(fmt.Sprintf("/cdp/cdps/denom/{%s}", types.RestCollateralDenom), queryCdpsHandlerFn(cliCtx)).Methods("GET") | ||||||
| @ -174,3 +175,21 @@ func getParamsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc { | |||||||
| 		rest.PostProcessResponse(w, cliCtx, res) | 		rest.PostProcessResponse(w, cliCtx, res) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func getAccountsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc { | ||||||
|  | 	return func(w http.ResponseWriter, r *http.Request) { | ||||||
|  | 		cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r) | ||||||
|  | 		if !ok { | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		res, height, err := cliCtx.QueryWithData(fmt.Sprintf("custom/cdp/%s", types.QueryGetAccounts), nil) | ||||||
|  | 		cliCtx = cliCtx.WithHeight(height) | ||||||
|  | 		if err != nil { | ||||||
|  | 			rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		rest.PostProcessResponse(w, cliCtx, res) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | |||||||
| @ -6,6 +6,7 @@ import ( | |||||||
| 	"github.com/cosmos/cosmos-sdk/codec" | 	"github.com/cosmos/cosmos-sdk/codec" | ||||||
| 	sdk "github.com/cosmos/cosmos-sdk/types" | 	sdk "github.com/cosmos/cosmos-sdk/types" | ||||||
| 	sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" | 	sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" | ||||||
|  | 	supply "github.com/cosmos/cosmos-sdk/x/supply" | ||||||
| 
 | 
 | ||||||
| 	"github.com/kava-labs/kava/x/cdp/types" | 	"github.com/kava-labs/kava/x/cdp/types" | ||||||
| ) | ) | ||||||
| @ -24,6 +25,8 @@ func NewQuerier(keeper Keeper) sdk.Querier { | |||||||
| 			return queryGetParams(ctx, req, keeper) | 			return queryGetParams(ctx, req, keeper) | ||||||
| 		case types.QueryGetCdpDeposits: | 		case types.QueryGetCdpDeposits: | ||||||
| 			return queryGetDeposits(ctx, req, keeper) | 			return queryGetDeposits(ctx, req, keeper) | ||||||
|  | 		case types.QueryGetAccounts: | ||||||
|  | 			return queryGetAccounts(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]) | ||||||
| 		} | 		} | ||||||
| @ -155,3 +158,23 @@ func queryGetParams(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) ([]by | |||||||
| 	} | 	} | ||||||
| 	return bz, nil | 	return bz, nil | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | // query cdp module accounts
 | ||||||
|  | func queryGetAccounts(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) ([]byte, error) { | ||||||
|  | 	cdpAccAccount := keeper.supplyKeeper.GetModuleAccount(ctx, types.ModuleName) | ||||||
|  | 	liquidatorAccAccount := keeper.supplyKeeper.GetModuleAccount(ctx, types.LiquidatorMacc) | ||||||
|  | 	savingsRateAccAccount := keeper.supplyKeeper.GetModuleAccount(ctx, types.SavingsRateMacc) | ||||||
|  | 
 | ||||||
|  | 	accounts := []supply.ModuleAccount{ | ||||||
|  | 		*cdpAccAccount.(*supply.ModuleAccount), | ||||||
|  | 		*liquidatorAccAccount.(*supply.ModuleAccount), | ||||||
|  | 		*savingsRateAccAccount.(*supply.ModuleAccount), | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Encode results
 | ||||||
|  | 	bz, err := codec.MarshalJSONIndent(supply.ModuleCdc, accounts) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error()) | ||||||
|  | 	} | ||||||
|  | 	return bz, nil | ||||||
|  | } | ||||||
|  | |||||||
| @ -11,6 +11,7 @@ import ( | |||||||
| 
 | 
 | ||||||
| 	sdk "github.com/cosmos/cosmos-sdk/types" | 	sdk "github.com/cosmos/cosmos-sdk/types" | ||||||
| 	"github.com/cosmos/cosmos-sdk/x/simulation" | 	"github.com/cosmos/cosmos-sdk/x/simulation" | ||||||
|  | 	supply "github.com/cosmos/cosmos-sdk/x/supply" | ||||||
| 
 | 
 | ||||||
| 	abci "github.com/tendermint/tendermint/abci/types" | 	abci "github.com/tendermint/tendermint/abci/types" | ||||||
| 	tmtime "github.com/tendermint/tendermint/types/time" | 	tmtime "github.com/tendermint/tendermint/types/time" | ||||||
| @ -279,6 +280,29 @@ func (suite *QuerierTestSuite) TestQueryDeposits() { | |||||||
| 
 | 
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (suite *QuerierTestSuite) TestQueryAccounts() { | ||||||
|  | 	bz, err := suite.querier(suite.ctx, []string{types.QueryGetAccounts}, abci.RequestQuery{}) | ||||||
|  | 	suite.Require().NoError(err) | ||||||
|  | 	suite.Require().NotNil(bz) | ||||||
|  | 
 | ||||||
|  | 	var accounts []supply.ModuleAccount | ||||||
|  | 	suite.Require().Nil(supply.ModuleCdc.UnmarshalJSON(bz, &accounts)) | ||||||
|  | 	suite.Require().Equal(3, len(accounts)) | ||||||
|  | 
 | ||||||
|  | 	findByName := func(name string) bool { | ||||||
|  | 		for _, account := range accounts { | ||||||
|  | 			if account.GetName() == name { | ||||||
|  | 				return true | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	suite.Require().True(findByName("cdp")) | ||||||
|  | 	suite.Require().True(findByName("liquidator")) | ||||||
|  | 	suite.Require().True(findByName("savings")) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func TestQuerierTestSuite(t *testing.T) { | func TestQuerierTestSuite(t *testing.T) { | ||||||
| 	suite.Run(t, new(QuerierTestSuite)) | 	suite.Run(t, new(QuerierTestSuite)) | ||||||
| } | } | ||||||
|  | |||||||
| @ -11,6 +11,7 @@ const ( | |||||||
| 	QueryGetCdps                    = "cdps" | 	QueryGetCdps                    = "cdps" | ||||||
| 	QueryGetCdpsByCollateralization = "ratio" | 	QueryGetCdpsByCollateralization = "ratio" | ||||||
| 	QueryGetParams                  = "params" | 	QueryGetParams                  = "params" | ||||||
|  | 	QueryGetAccounts                = "accounts" | ||||||
| 	RestOwner                       = "owner" | 	RestOwner                       = "owner" | ||||||
| 	RestCollateralDenom             = "collateral-denom" | 	RestCollateralDenom             = "collateral-denom" | ||||||
| 	RestRatio                       = "ratio" | 	RestRatio                       = "ratio" | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Nick DeLuca
						Nick DeLuca