mirror of
https://github.com/0glabs/0g-chain.git
synced 2024-11-10 10:05:18 +00:00
R4R: update pricefeed module rest endpoints (#359)
* query get price implemented - /pricefeed/price/xrp:usd * query rawprices implemented - /pricefeed/rawprices/xrp:usd * refactored to QueryWithMarketIDParams, added rest logic for QueryOracles * new query get oracles implemented for cli and rest - /pricefeed/oracles/xrp:usd * tx postprice implemented - /pricefeed/postprice/{MsgPostPrice} * updated contrib with post-price examples and added to README * added cliCtx.WithHeight(height) and removed import comment
This commit is contained in:
parent
183acfef62
commit
4599caca07
@ -1,11 +1,11 @@
|
|||||||
|
|
||||||
# Contrib
|
# Contrib
|
||||||
|
|
||||||
## Requests
|
## Rest server requests
|
||||||
|
|
||||||
### Create CDP example request
|
### Setup
|
||||||
|
|
||||||
First, query account information for the signing account. Note the 'accountnumber' and 'sequence' fields, we'll need them later in order to send our request:
|
Before making a request, query account information for the signing account. Note the 'accountnumber' and 'sequence' fields, we'll need them later in order to send our request:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
kvcli q auth account $(kvcli keys show accB -a)
|
kvcli q auth account $(kvcli keys show accB -a)
|
||||||
@ -17,17 +17,18 @@ If testing locally, start the Kava rest server:
|
|||||||
kvcli rest-server
|
kvcli rest-server
|
||||||
```
|
```
|
||||||
|
|
||||||
Format the base request in create-cdp.json. You'll need to update the 'from', 'chain-id', 'account_number', 'sequence', and 'gas' as appropriate. Then, populate the CDP creation request's params 'owner', 'collateral', and 'principal'. An example formatted base request can be found in `example-create-cdp.json`.
|
Now we'll create an unsigned request, sign it, and broadcast it to the Kava blockchain via the rest server. Note that if you're using the mainnet or testnet, the host IP address will need to be updated to point at an active rest server instead of http://127.0.0.1.
|
||||||
|
|
||||||
Now we'll create an unsigned request, sign it, and broadcast it to the Kava blockchain via the rest server.
|
### Create CDP example request
|
||||||
Note that if you're using the mainnet or testnet, the host IP address will need to be updated to point at an active rest server.
|
|
||||||
|
Format the base request in create-cdp.json. You'll need to update the 'from', 'chain-id', 'account_number', 'sequence', and 'gas' as appropriate. Then, populate the CDP creation request's params 'owner', 'collateral', and 'principal'. An example formatted request can be found in `example-create-cdp.json`.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Create an unsigned request
|
# Create an unsigned request
|
||||||
curl -H "Content-Type: application/json" -X PUT -d @./contrib/requests/create-cdp.json http://127.0.0.1:1317/cdp | jq > ./contrib/requests/create-cdp-unsigned.json
|
curl -H "Content-Type: application/json" -X PUT -d @./contrib/requests/create-cdp.json http://127.0.0.1:1317/cdp | jq > ./contrib/requests/create-cdp-unsigned.json
|
||||||
|
|
||||||
# Sign the request
|
# Sign the request
|
||||||
kvcli tx sign ./contrib/requests/create-cdp-unsigned.json --from accB --offline --chain-id testing --sequence 1 --account-number 2 > ./contrib/requests/broadcast-create-cdp.json
|
kvcli tx sign ./contrib/requests/create-cdp-unsigned.json --from accB --offline --chain-id testing --sequence 1 --account-number 2 | jq > ./contrib/requests/broadcast-create-cdp.json
|
||||||
|
|
||||||
# Broadcast the request
|
# Broadcast the request
|
||||||
kvcli tx broadcast ./contrib/requests/broadcast-create-cdp.json
|
kvcli tx broadcast ./contrib/requests/broadcast-create-cdp.json
|
||||||
@ -35,6 +36,26 @@ If testing locally, start the Kava rest server:
|
|||||||
|
|
||||||
Congratulations, you've just created a CDP on Kava using the rest server!
|
Congratulations, you've just created a CDP on Kava using the rest server!
|
||||||
|
|
||||||
|
### Post market price example request
|
||||||
|
|
||||||
|
Note that only market oracles can post prices, other senders will have their transactions rejected by Kava.
|
||||||
|
|
||||||
|
Format the base request in post-price.json. You'll need to update the 'from', 'chain-id', 'account_number', 'sequence', and 'gas' as appropriate. Then, populate the post price request's params 'from', 'market_id', 'price', and 'expiry'. An example formatted request can be found in `example-post-price.json`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create an unsigned request
|
||||||
|
curl -H "Content-Type: application/json" -X PUT -d @./contrib/requests/post-price.json http://127.0.0.1:1317/pricefeed/postprice | jq > ./contrib/requests/post-price-unsigned.json
|
||||||
|
|
||||||
|
|
||||||
|
# Sign the request
|
||||||
|
kvcli tx sign ./contrib/requests/post-price-unsigned.json --from validator --offline --chain-id testing --sequence 96 --account-number 0 | jq > ./contrib/requests/broadcast-post-price.json
|
||||||
|
|
||||||
|
# Broadcast the request
|
||||||
|
kvcli tx broadcast ./contrib/requests/broadcast-post-price.json
|
||||||
|
```
|
||||||
|
|
||||||
|
Congratulations, you've just posted a current market price on Kava using the rest server!
|
||||||
|
|
||||||
## Governance proposals
|
## Governance proposals
|
||||||
|
|
||||||
Example governance proposals are located in `/proposal_examples`.
|
Example governance proposals are located in `/proposal_examples`.
|
@ -1 +1,39 @@
|
|||||||
{"type":"cosmos-sdk/StdTx","value":{"msg":[{"type":"cdp/MsgCreateCDP","value":{"sender":"kava12jk3szk45afmvjc3xc6kvj4e40tuy2m8ckgs03","collateral":[{"denom":"xrp","amount":"110000000"}],"principal":[{"denom":"usdx","amount":"10000000"}]}}],"fee":{"amount":[],"gas":"500000"},"signatures":[{"pub_key":{"type":"tendermint/PubKeySecp256k1","value":"AxYhgA8CL/ZmTZCQDS2dGcccu+dv7zOBT0Wz0+grIufW"},"signature":"KMGQekAgj9qSqnu38swM/jTnIkrSskL4m9L3QQlBIbVZdzDQVh9Rkb0UL7TPeXTaswlSTiwFic3hvZZOcjM4SA=="}],"memo":""}}
|
{
|
||||||
|
"type": "cosmos-sdk/StdTx",
|
||||||
|
"value": {
|
||||||
|
"msg": [
|
||||||
|
{
|
||||||
|
"type": "cdp/MsgCreateCDP",
|
||||||
|
"value": {
|
||||||
|
"sender": "kava12jk3szk45afmvjc3xc6kvj4e40tuy2m8ckgs03",
|
||||||
|
"collateral": [
|
||||||
|
{
|
||||||
|
"denom": "xrp",
|
||||||
|
"amount": "110000000"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"principal": [
|
||||||
|
{
|
||||||
|
"denom": "usdx",
|
||||||
|
"amount": "10000000"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fee": {
|
||||||
|
"amount": [],
|
||||||
|
"gas": "500000"
|
||||||
|
},
|
||||||
|
"signatures": [
|
||||||
|
{
|
||||||
|
"pub_key": {
|
||||||
|
"type": "tendermint/PubKeySecp256k1",
|
||||||
|
"value": "AxYhgA8CL/ZmTZCQDS2dGcccu+dv7zOBT0Wz0+grIufW"
|
||||||
|
},
|
||||||
|
"signature": "KMGQekAgj9qSqnu38swM/jTnIkrSskL4m9L3QQlBIbVZdzDQVh9Rkb0UL7TPeXTaswlSTiwFic3hvZZOcjM4SA=="
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"memo": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
30
contrib/requests/broadcast-post-price.json
Normal file
30
contrib/requests/broadcast-post-price.json
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"type": "cosmos-sdk/StdTx",
|
||||||
|
"value": {
|
||||||
|
"msg": [
|
||||||
|
{
|
||||||
|
"type": "pricefeed/MsgPostPrice",
|
||||||
|
"value": {
|
||||||
|
"from": "kava15qdefkmwswysgg4qxgqpqr35k3m49pkx2jdfnw",
|
||||||
|
"market_id": "xrp:usd",
|
||||||
|
"price": "0.290000000000000000",
|
||||||
|
"expiry": "2100-03-29T10:40:00Z"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fee": {
|
||||||
|
"amount": [],
|
||||||
|
"gas": "500000"
|
||||||
|
},
|
||||||
|
"signatures": [
|
||||||
|
{
|
||||||
|
"pub_key": {
|
||||||
|
"type": "tendermint/PubKeySecp256k1",
|
||||||
|
"value": "Az740XKIPCJtnZLmJfktTfhsEStEJE3n2iRVyJ3wko43"
|
||||||
|
},
|
||||||
|
"signature": "1CMkPnD0UYSpIgPTIGUjroM/16DizLgrR+NSNlsjNs1b5cvD2j3VMfYM0nyBa4IC305RkBOUdthTPc6RPZWDGg=="
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"memo": ""
|
||||||
|
}
|
||||||
|
}
|
16
contrib/requests/example-post-price.json
Normal file
16
contrib/requests/example-post-price.json
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"base_req": {
|
||||||
|
"from": "kava15qdefkmwswysgg4qxgqpqr35k3m49pkx2jdfnw",
|
||||||
|
"memo": "",
|
||||||
|
"chain_id": "testing",
|
||||||
|
"account_number": "0",
|
||||||
|
"sequence": "96",
|
||||||
|
"gas": "500000",
|
||||||
|
"gas_adjustment": "1.0",
|
||||||
|
"simulate": false
|
||||||
|
},
|
||||||
|
"from": "kava15qdefkmwswysgg4qxgqpqr35k3m49pkx2jdfnw",
|
||||||
|
"market_id": "xrp:usd",
|
||||||
|
"price": "0.29",
|
||||||
|
"expiry": "4110000000"
|
||||||
|
}
|
22
contrib/requests/post-price-unsigned.json
Normal file
22
contrib/requests/post-price-unsigned.json
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"type": "cosmos-sdk/StdTx",
|
||||||
|
"value": {
|
||||||
|
"msg": [
|
||||||
|
{
|
||||||
|
"type": "pricefeed/MsgPostPrice",
|
||||||
|
"value": {
|
||||||
|
"from": "kava15qdefkmwswysgg4qxgqpqr35k3m49pkx2jdfnw",
|
||||||
|
"market_id": "xrp:usd",
|
||||||
|
"price": "0.290000000000000000",
|
||||||
|
"expiry": "2100-03-29T10:40:00Z"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"fee": {
|
||||||
|
"amount": [],
|
||||||
|
"gas": "500000"
|
||||||
|
},
|
||||||
|
"signatures": null,
|
||||||
|
"memo": ""
|
||||||
|
}
|
||||||
|
}
|
16
contrib/requests/post-price.json
Normal file
16
contrib/requests/post-price.json
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"base_req": {
|
||||||
|
"from": "kava15qdefkmwswysgg4qxgqpqr35k3m49pkx2jdfnw",
|
||||||
|
"memo": "",
|
||||||
|
"chain_id": "testing",
|
||||||
|
"account_number": "0",
|
||||||
|
"sequence": "96",
|
||||||
|
"gas": "500000",
|
||||||
|
"gas_adjustment": "1.0",
|
||||||
|
"simulate": false
|
||||||
|
},
|
||||||
|
"from": "kava15qdefkmwswysgg4qxgqpqr35k3m49pkx2jdfnw",
|
||||||
|
"market_id": "xrp:usd",
|
||||||
|
"price": "0.29",
|
||||||
|
"expiry": "4110000000"
|
||||||
|
}
|
@ -36,7 +36,7 @@ const (
|
|||||||
MarketPrefix = types.MarketPrefix
|
MarketPrefix = types.MarketPrefix
|
||||||
OraclePrefix = types.OraclePrefix
|
OraclePrefix = types.OraclePrefix
|
||||||
TypeMsgPostPrice = types.TypeMsgPostPrice
|
TypeMsgPostPrice = types.TypeMsgPostPrice
|
||||||
QueryCurrentPrice = types.QueryCurrentPrice
|
QueryPrice = types.QueryPrice
|
||||||
QueryRawPrices = types.QueryRawPrices
|
QueryRawPrices = types.QueryRawPrices
|
||||||
QueryMarkets = types.QueryMarkets
|
QueryMarkets = types.QueryMarkets
|
||||||
)
|
)
|
||||||
@ -65,14 +65,14 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
GenesisState = types.GenesisState
|
GenesisState = types.GenesisState
|
||||||
Market = types.Market
|
Market = types.Market
|
||||||
Markets = types.Markets
|
Markets = types.Markets
|
||||||
CurrentPrice = types.CurrentPrice
|
CurrentPrice = types.CurrentPrice
|
||||||
PostedPrice = types.PostedPrice
|
PostedPrice = types.PostedPrice
|
||||||
SortDecs = types.SortDecs
|
SortDecs = types.SortDecs
|
||||||
MsgPostPrice = types.MsgPostPrice
|
MsgPostPrice = types.MsgPostPrice
|
||||||
Params = types.Params
|
Params = types.Params
|
||||||
QueryPricesParams = types.QueryPricesParams
|
QueryWithMarketIDParams = types.QueryWithMarketIDParams
|
||||||
Keeper = keeper.Keeper
|
Keeper = keeper.Keeper
|
||||||
)
|
)
|
||||||
|
@ -6,6 +6,7 @@ import (
|
|||||||
"github.com/cosmos/cosmos-sdk/client"
|
"github.com/cosmos/cosmos-sdk/client"
|
||||||
"github.com/cosmos/cosmos-sdk/client/context"
|
"github.com/cosmos/cosmos-sdk/client/context"
|
||||||
"github.com/cosmos/cosmos-sdk/codec"
|
"github.com/cosmos/cosmos-sdk/codec"
|
||||||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
"github.com/kava-labs/kava/x/pricefeed/types"
|
"github.com/kava-labs/kava/x/pricefeed/types"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
@ -22,8 +23,9 @@ func GetQueryCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pricefeedQueryCmd.AddCommand(client.GetCommands(
|
pricefeedQueryCmd.AddCommand(client.GetCommands(
|
||||||
GetCmdCurrentPrice(queryRoute, cdc),
|
GetCmdPrice(queryRoute, cdc),
|
||||||
GetCmdRawPrices(queryRoute, cdc),
|
GetCmdRawPrices(queryRoute, cdc),
|
||||||
|
GetCmdOracles(queryRoute, cdc),
|
||||||
GetCmdMarkets(queryRoute, cdc),
|
GetCmdMarkets(queryRoute, cdc),
|
||||||
GetCmdQueryParams(queryRoute, cdc),
|
GetCmdQueryParams(queryRoute, cdc),
|
||||||
)...)
|
)...)
|
||||||
@ -31,8 +33,37 @@ func GetQueryCmd(queryRoute string, cdc *codec.Codec) *cobra.Command {
|
|||||||
return pricefeedQueryCmd
|
return pricefeedQueryCmd
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetCmdCurrentPrice queries the current price of an asset
|
// GetCmdOracles queries the oracle set of an asset
|
||||||
func GetCmdCurrentPrice(queryRoute string, cdc *codec.Codec) *cobra.Command {
|
func GetCmdOracles(queryRoute string, cdc *codec.Codec) *cobra.Command {
|
||||||
|
return &cobra.Command{
|
||||||
|
Use: "oracles [marketID]",
|
||||||
|
Short: "get the oracle set for a market",
|
||||||
|
Args: cobra.ExactArgs(1),
|
||||||
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
|
cliCtx := context.NewCLIContext().WithCodec(cdc)
|
||||||
|
marketID := args[0]
|
||||||
|
|
||||||
|
bz, err := cdc.MarshalJSON(types.QueryWithMarketIDParams{
|
||||||
|
MarketID: marketID,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
route := fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryOracles)
|
||||||
|
|
||||||
|
res, _, err := cliCtx.QueryWithData(route, bz)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var oracles []sdk.AccAddress
|
||||||
|
cdc.MustUnmarshalJSON(res, &oracles)
|
||||||
|
return cliCtx.PrintOutput(oracles)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetCmdPrice queries the current price of an asset
|
||||||
|
func GetCmdPrice(queryRoute string, cdc *codec.Codec) *cobra.Command {
|
||||||
return &cobra.Command{
|
return &cobra.Command{
|
||||||
Use: "price [marketID]",
|
Use: "price [marketID]",
|
||||||
Short: "get the current price for the input market",
|
Short: "get the current price for the input market",
|
||||||
@ -41,13 +72,13 @@ func GetCmdCurrentPrice(queryRoute string, cdc *codec.Codec) *cobra.Command {
|
|||||||
cliCtx := context.NewCLIContext().WithCodec(cdc)
|
cliCtx := context.NewCLIContext().WithCodec(cdc)
|
||||||
marketID := args[0]
|
marketID := args[0]
|
||||||
|
|
||||||
bz, err := cdc.MarshalJSON(types.QueryPricesParams{
|
bz, err := cdc.MarshalJSON(types.QueryWithMarketIDParams{
|
||||||
MarketID: marketID,
|
MarketID: marketID,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
route := fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryCurrentPrice)
|
route := fmt.Sprintf("custom/%s/%s", queryRoute, types.QueryPrice)
|
||||||
|
|
||||||
res, _, err := cliCtx.QueryWithData(route, bz)
|
res, _, err := cliCtx.QueryWithData(route, bz)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -70,7 +101,7 @@ func GetCmdRawPrices(queryRoute string, cdc *codec.Codec) *cobra.Command {
|
|||||||
cliCtx := context.NewCLIContext().WithCodec(cdc)
|
cliCtx := context.NewCLIContext().WithCodec(cdc)
|
||||||
marketID := args[0]
|
marketID := args[0]
|
||||||
|
|
||||||
bz, err := cdc.MarshalJSON(types.QueryPricesParams{
|
bz, err := cdc.MarshalJSON(types.QueryWithMarketIDParams{
|
||||||
MarketID: marketID,
|
MarketID: marketID,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -14,59 +14,104 @@ 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(fmt.Sprintf("/%s/rawprices/{%s}", types.ModuleName, restName), queryRawPricesHandler(cliCtx)).Methods("GET")
|
r.HandleFunc(fmt.Sprintf("/%s/parameters", types.ModuleName), queryParamsHandlerFn(cliCtx)).Methods("GET")
|
||||||
r.HandleFunc(fmt.Sprintf("/%s/currentprice/{%s}", types.ModuleName, restName), queryCurrentPriceHandler(cliCtx)).Methods("GET")
|
r.HandleFunc(fmt.Sprintf("/%s/markets", types.ModuleName), queryMarketsHandlerFn(cliCtx)).Methods("GET")
|
||||||
r.HandleFunc(fmt.Sprintf("/%s/markets", types.ModuleName), queryMarketsHandler(cliCtx)).Methods("GET")
|
r.HandleFunc(fmt.Sprintf("/%s/oracles/{%s}", types.ModuleName, RestMarketID), queryOraclesHandlerFn(cliCtx)).Methods("GET")
|
||||||
r.HandleFunc(fmt.Sprintf("/%s/params", types.ModuleName), queryParamsHandlerFn(cliCtx)).Methods("GET")
|
r.HandleFunc(fmt.Sprintf("/%s/rawprices/{%s}", types.ModuleName, RestMarketID), queryRawPricesHandlerFn(cliCtx)).Methods("GET")
|
||||||
|
r.HandleFunc(fmt.Sprintf("/%s/price/{%s}", types.ModuleName, RestMarketID), queryPriceHandlerFn(cliCtx)).Methods("GET")
|
||||||
}
|
}
|
||||||
|
|
||||||
func queryRawPricesHandler(cliCtx context.CLIContext) http.HandlerFunc {
|
func queryRawPricesHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
vars := mux.Vars(r)
|
vars := mux.Vars(r)
|
||||||
paramType := vars[restName]
|
paramMarketID := vars[RestMarketID]
|
||||||
res, _, err := cliCtx.QueryWithData(fmt.Sprintf("custom/rawprices/%s", paramType), nil)
|
queryRawPricesParams := types.NewQueryWithMarketIDParams(paramMarketID)
|
||||||
|
|
||||||
|
bz, err := cliCtx.Codec.MarshalJSON(queryRawPricesParams)
|
||||||
|
if err != nil {
|
||||||
|
rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
res, height, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/%s", types.ModuleName, types.QueryRawPrices), bz)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
rest.WriteErrorResponse(w, http.StatusNotFound, err.Error())
|
rest.WriteErrorResponse(w, http.StatusNotFound, err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cliCtx = cliCtx.WithHeight(height)
|
||||||
rest.PostProcessResponse(w, cliCtx, res)
|
rest.PostProcessResponse(w, cliCtx, res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func queryCurrentPriceHandler(cliCtx context.CLIContext) http.HandlerFunc {
|
func queryPriceHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
vars := mux.Vars(r)
|
vars := mux.Vars(r)
|
||||||
paramType := vars[restName]
|
paramMarketID := vars[RestMarketID]
|
||||||
res, _, err := cliCtx.QueryWithData(fmt.Sprintf("custom/price/%s", paramType), nil)
|
queryPriceParams := types.NewQueryWithMarketIDParams(paramMarketID)
|
||||||
|
|
||||||
|
bz, err := cliCtx.Codec.MarshalJSON(queryPriceParams)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
rest.WriteErrorResponse(w, http.StatusNotFound, err.Error())
|
rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
res, height, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/%s", types.ModuleName, types.QueryPrice), bz)
|
||||||
|
if err != nil {
|
||||||
|
rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
cliCtx = cliCtx.WithHeight(height)
|
||||||
rest.PostProcessResponse(w, cliCtx, res)
|
rest.PostProcessResponse(w, cliCtx, res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func queryMarketsHandler(cliCtx context.CLIContext) http.HandlerFunc {
|
func queryMarketsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
res, _, err := cliCtx.QueryWithData(fmt.Sprintf("custom/markets/"), nil)
|
res, height, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/%s", types.ModuleName, types.QueryMarkets), nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
rest.WriteErrorResponse(w, http.StatusNotFound, err.Error())
|
rest.WriteErrorResponse(w, http.StatusNotFound, err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cliCtx = cliCtx.WithHeight(height)
|
||||||
|
rest.PostProcessResponse(w, cliCtx, res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func queryOraclesHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
vars := mux.Vars(r)
|
||||||
|
paramMarketID := vars[RestMarketID]
|
||||||
|
queryOraclesParams := types.NewQueryWithMarketIDParams(paramMarketID)
|
||||||
|
|
||||||
|
bz, err := cliCtx.Codec.MarshalJSON(queryOraclesParams)
|
||||||
|
if err != nil {
|
||||||
|
rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
res, height, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/%s", types.ModuleName, types.QueryOracles), bz)
|
||||||
|
if err != nil {
|
||||||
|
rest.WriteErrorResponse(w, http.StatusNotFound, err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
cliCtx = cliCtx.WithHeight(height)
|
||||||
rest.PostProcessResponse(w, cliCtx, res)
|
rest.PostProcessResponse(w, cliCtx, res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func queryParamsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
func queryParamsHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
// Get the params
|
res, height, err := cliCtx.QueryWithData(fmt.Sprintf("custom/%s/%s", types.ModuleName, types.QueryGetParams), nil)
|
||||||
res, height, err := cliCtx.QueryWithData(fmt.Sprintf("custom/pricefeed/%s", types.QueryGetParams), nil)
|
|
||||||
cliCtx = cliCtx.WithHeight(height)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error())
|
rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// Return the params
|
|
||||||
|
cliCtx = cliCtx.WithHeight(height)
|
||||||
rest.PostProcessResponse(w, cliCtx, res)
|
rest.PostProcessResponse(w, cliCtx, res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,10 +7,11 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
restName = "marketID"
|
RestMarketID = "market_id"
|
||||||
)
|
)
|
||||||
|
|
||||||
type postPriceReq struct {
|
// PostPriceReq defines the properties of a PostPrice request's body.
|
||||||
|
type PostPriceReq struct {
|
||||||
BaseReq rest.BaseReq `json:"base_req"`
|
BaseReq rest.BaseReq `json:"base_req"`
|
||||||
MarketID string `json:"market_id"`
|
MarketID string `json:"market_id"`
|
||||||
Price string `json:"price"`
|
Price string `json:"price"`
|
||||||
|
@ -5,23 +5,23 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/gorilla/mux"
|
|
||||||
|
|
||||||
"github.com/cosmos/cosmos-sdk/client/context"
|
"github.com/cosmos/cosmos-sdk/client/context"
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
"github.com/cosmos/cosmos-sdk/types/rest"
|
"github.com/cosmos/cosmos-sdk/types/rest"
|
||||||
"github.com/cosmos/cosmos-sdk/x/auth/client/utils"
|
"github.com/cosmos/cosmos-sdk/x/auth/client/utils"
|
||||||
|
"github.com/gorilla/mux"
|
||||||
"github.com/kava-labs/kava/x/pricefeed/types"
|
"github.com/kava-labs/kava/x/pricefeed/types"
|
||||||
tmtime "github.com/tendermint/tendermint/types/time"
|
tmtime "github.com/tendermint/tendermint/types/time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func registerTxRoutes(cliCtx context.CLIContext, r *mux.Router) {
|
func registerTxRoutes(cliCtx context.CLIContext, r *mux.Router) {
|
||||||
r.HandleFunc(fmt.Sprintf("/%s/rawprices", types.ModuleName), postPriceHandler(cliCtx)).Methods("PUT")
|
r.HandleFunc(fmt.Sprintf("/%s/postprice", types.ModuleName), postPriceHandlerFn(cliCtx)).Methods("PUT")
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func postPriceHandler(cliCtx context.CLIContext) http.HandlerFunc {
|
func postPriceHandlerFn(cliCtx context.CLIContext) http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
var req postPriceReq
|
var req PostPriceReq
|
||||||
|
|
||||||
if !rest.ReadRESTReq(w, r, cliCtx.Codec, &req) {
|
if !rest.ReadRESTReq(w, r, cliCtx.Codec, &req) {
|
||||||
rest.WriteErrorResponse(w, http.StatusBadRequest, "failed to parse request")
|
rest.WriteErrorResponse(w, http.StatusBadRequest, "failed to parse request")
|
||||||
@ -62,5 +62,4 @@ func postPriceHandler(cliCtx context.CLIContext) http.HandlerFunc {
|
|||||||
|
|
||||||
utils.WriteGenerateStdTxResponse(w, cliCtx, baseReq, []sdk.Msg{msg})
|
utils.WriteGenerateStdTxResponse(w, cliCtx, baseReq, []sdk.Msg{msg})
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
|
||||||
|
@ -15,10 +15,12 @@ import (
|
|||||||
func NewQuerier(keeper Keeper) sdk.Querier {
|
func NewQuerier(keeper Keeper) sdk.Querier {
|
||||||
return func(ctx sdk.Context, path []string, req abci.RequestQuery) (res []byte, err sdk.Error) {
|
return func(ctx sdk.Context, path []string, req abci.RequestQuery) (res []byte, err sdk.Error) {
|
||||||
switch path[0] {
|
switch path[0] {
|
||||||
case types.QueryCurrentPrice:
|
case types.QueryPrice:
|
||||||
return queryCurrentPrice(ctx, req, keeper)
|
return queryPrice(ctx, req, keeper)
|
||||||
case types.QueryRawPrices:
|
case types.QueryRawPrices:
|
||||||
return queryRawPrices(ctx, req, keeper)
|
return queryRawPrices(ctx, req, keeper)
|
||||||
|
case types.QueryOracles:
|
||||||
|
return queryOracles(ctx, req, keeper)
|
||||||
case types.QueryMarkets:
|
case types.QueryMarkets:
|
||||||
return queryMarkets(ctx, req, keeper)
|
return queryMarkets(ctx, req, keeper)
|
||||||
case types.QueryGetParams:
|
case types.QueryGetParams:
|
||||||
@ -30,8 +32,8 @@ func NewQuerier(keeper Keeper) sdk.Querier {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func queryCurrentPrice(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) (res []byte, sdkErr sdk.Error) {
|
func queryPrice(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) (res []byte, sdkErr sdk.Error) {
|
||||||
var requestParams types.QueryPricesParams
|
var requestParams types.QueryWithMarketIDParams
|
||||||
err := keeper.cdc.UnmarshalJSON(req.Data, &requestParams)
|
err := keeper.cdc.UnmarshalJSON(req.Data, &requestParams)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, sdk.ErrInternal(fmt.Sprintf("failed to parse params: %s", err))
|
return nil, sdk.ErrInternal(fmt.Sprintf("failed to parse params: %s", err))
|
||||||
@ -53,7 +55,7 @@ func queryCurrentPrice(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) (r
|
|||||||
}
|
}
|
||||||
|
|
||||||
func queryRawPrices(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) (res []byte, sdkErr sdk.Error) {
|
func queryRawPrices(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) (res []byte, sdkErr sdk.Error) {
|
||||||
var requestParams types.QueryPricesParams
|
var requestParams types.QueryWithMarketIDParams
|
||||||
err := keeper.cdc.UnmarshalJSON(req.Data, &requestParams)
|
err := keeper.cdc.UnmarshalJSON(req.Data, &requestParams)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, sdk.ErrInternal(fmt.Sprintf("failed to parse params: %s", err))
|
return nil, sdk.ErrInternal(fmt.Sprintf("failed to parse params: %s", err))
|
||||||
@ -72,6 +74,26 @@ func queryRawPrices(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) (res
|
|||||||
return bz, nil
|
return bz, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func queryOracles(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) (res []byte, sdkErr sdk.Error) {
|
||||||
|
var requestParams types.QueryWithMarketIDParams
|
||||||
|
err := keeper.cdc.UnmarshalJSON(req.Data, &requestParams)
|
||||||
|
if err != nil {
|
||||||
|
return nil, sdk.ErrInternal(fmt.Sprintf("failed to parse params: %s", err))
|
||||||
|
}
|
||||||
|
|
||||||
|
oracles, err := keeper.GetOracles(ctx, requestParams.MarketID)
|
||||||
|
if err != nil {
|
||||||
|
return []byte{}, sdk.ErrUnknownRequest("market not found")
|
||||||
|
}
|
||||||
|
|
||||||
|
bz, err := codec.MarshalJSONIndent(keeper.cdc, oracles)
|
||||||
|
if err != nil {
|
||||||
|
panic("could not marshal result to JSON")
|
||||||
|
}
|
||||||
|
|
||||||
|
return bz, nil
|
||||||
|
}
|
||||||
|
|
||||||
func queryMarkets(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) (res []byte, sdkErr sdk.Error) {
|
func queryMarkets(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) (res []byte, sdkErr sdk.Error) {
|
||||||
markets := keeper.GetMarkets(ctx)
|
markets := keeper.GetMarkets(ctx)
|
||||||
|
|
||||||
@ -83,9 +105,8 @@ func queryMarkets(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) (res []
|
|||||||
return bz, nil
|
return bz, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// query params in the auction store
|
// query params in the pricefeed store
|
||||||
func queryGetParams(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) ([]byte, sdk.Error) {
|
func queryGetParams(ctx sdk.Context, req abci.RequestQuery, keeper Keeper) ([]byte, sdk.Error) {
|
||||||
// Get params
|
|
||||||
params := keeper.GetParams(ctx)
|
params := keeper.GetParams(ctx)
|
||||||
|
|
||||||
// Encode results
|
// Encode results
|
||||||
|
@ -5,17 +5,26 @@ package types
|
|||||||
// assets Returns []Assets in the pricefeed system
|
// assets Returns []Assets in the pricefeed system
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// QueryCurrentPrice command for current price queries
|
// QueryGetParams command for params query
|
||||||
QueryCurrentPrice = "price"
|
QueryGetParams = "parameters"
|
||||||
// QueryRawPrices command for raw price queries
|
|
||||||
QueryRawPrices = "rawprices"
|
|
||||||
// QueryMarkets command for assets query
|
// QueryMarkets command for assets query
|
||||||
QueryMarkets = "markets"
|
QueryMarkets = "markets"
|
||||||
// QueryGetParams command for params query
|
// QueryOracles command for oracles query
|
||||||
QueryGetParams = "params"
|
QueryOracles = "oracles"
|
||||||
|
// QueryRawPrices command for raw price queries
|
||||||
|
QueryRawPrices = "rawprices"
|
||||||
|
// QueryPrice command for price queries
|
||||||
|
QueryPrice = "price"
|
||||||
)
|
)
|
||||||
|
|
||||||
// QueryPricesParams fields for querying prices
|
// QueryWithMarketIDParams fields for querying information from a specific market
|
||||||
type QueryPricesParams struct {
|
type QueryWithMarketIDParams struct {
|
||||||
MarketID string
|
MarketID string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewQueryWithMarketIDParams creates a new instance of QueryWithMarketIDParams
|
||||||
|
func NewQueryWithMarketIDParams(marketID string) QueryWithMarketIDParams {
|
||||||
|
return QueryWithMarketIDParams{
|
||||||
|
MarketID: marketID,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user