package rest import ( "encoding/json" "fmt" "net/http" "github.com/gorilla/mux" "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/types/rest" "github.com/kava-labs/kava/x/validator-vesting/types" ) func registerQueryRoutes(cliCtx client.Context, r *mux.Router) { r.HandleFunc(fmt.Sprintf("/%s/circulatingsupply", types.QueryPath), getCirculatingSupplyHandlerFn(cliCtx)).Methods("GET") r.HandleFunc(fmt.Sprintf("/%s/totalsupply", types.QueryPath), getTotalSupplyHandlerFn(cliCtx)).Methods("GET") r.HandleFunc(fmt.Sprintf("/%s/circulatingsupplyhard", types.QueryPath), getCirculatingSupplyHARDHandlerFn(cliCtx)).Methods("GET") r.HandleFunc(fmt.Sprintf("/%s/circulatingsupplyusdx", types.QueryPath), getCirculatingSupplyUSDXHandlerFn(cliCtx)).Methods("GET") r.HandleFunc(fmt.Sprintf("/%s/circulatingsupplyswp", types.QueryPath), getCirculatingSupplySWPHandlerFn(cliCtx)).Methods("GET") r.HandleFunc(fmt.Sprintf("/%s/totalsupplyhard", types.QueryPath), getTotalSupplyHARDHandlerFn(cliCtx)).Methods("GET") r.HandleFunc(fmt.Sprintf("/%s/totalsupplyusdx", types.QueryPath), getTotalSupplyUSDXHandlerFn(cliCtx)).Methods("GET") } func getTotalSupplyHandlerFn(cliCtx client.Context) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { _, page, limit, err := rest.ParseHTTPArgsWithLimit(r, 0) if err != nil { rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return } cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r) if !ok { return } params := types.NewBaseQueryParams(page, limit) bz, err := cliCtx.LegacyAmino.MarshalJSON(params) if err != nil { rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("failed to marshal query params: %s", err)) return } route := fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryTotalSupply) res, _, err := cliCtx.QueryWithData(route, bz) if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } var totalSupply int64 err = cliCtx.LegacyAmino.UnmarshalJSON(res, &totalSupply) if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } resBytes, err := json.Marshal(totalSupply) if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } w.Write(resBytes) } } func getCirculatingSupplyHandlerFn(cliCtx client.Context) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { _, page, limit, err := rest.ParseHTTPArgsWithLimit(r, 0) if err != nil { rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return } cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r) if !ok { return } params := types.NewBaseQueryParams(page, limit) bz, err := cliCtx.LegacyAmino.MarshalJSON(params) if err != nil { rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("failed to marshal query params: %s", err)) return } route := fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryCirculatingSupply) res, _, err := cliCtx.QueryWithData(route, bz) if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } var circSupply int64 err = cliCtx.LegacyAmino.UnmarshalJSON(res, &circSupply) if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } resBytes, err := json.Marshal(circSupply) if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } w.Write(resBytes) } } func getCirculatingSupplyHARDHandlerFn(cliCtx client.Context) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { _, page, limit, err := rest.ParseHTTPArgsWithLimit(r, 0) if err != nil { rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return } cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r) if !ok { return } params := types.NewBaseQueryParams(page, limit) bz, err := cliCtx.LegacyAmino.MarshalJSON(params) if err != nil { rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("failed to marshal query params: %s", err)) return } route := fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryCirculatingSupplyHARD) res, _, err := cliCtx.QueryWithData(route, bz) if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } var circSupply int64 err = cliCtx.LegacyAmino.UnmarshalJSON(res, &circSupply) if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } resBytes, err := json.Marshal(circSupply) if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } w.Write(resBytes) } } func getCirculatingSupplyUSDXHandlerFn(cliCtx client.Context) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { _, page, limit, err := rest.ParseHTTPArgsWithLimit(r, 0) if err != nil { rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return } cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r) if !ok { return } params := types.NewBaseQueryParams(page, limit) bz, err := cliCtx.LegacyAmino.MarshalJSON(params) if err != nil { rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("failed to marshal query params: %s", err)) return } route := fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryCirculatingSupplyUSDX) res, _, err := cliCtx.QueryWithData(route, bz) if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } var circSupply int64 err = cliCtx.LegacyAmino.UnmarshalJSON(res, &circSupply) if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } resBytes, err := json.Marshal(circSupply) if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } w.Write(resBytes) } } func getCirculatingSupplySWPHandlerFn(cliCtx client.Context) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { _, page, limit, err := rest.ParseHTTPArgsWithLimit(r, 0) if err != nil { rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return } cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r) if !ok { return } params := types.NewBaseQueryParams(page, limit) bz, err := cliCtx.LegacyAmino.MarshalJSON(params) if err != nil { rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("failed to marshal query params: %s", err)) return } route := fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryCirculatingSupplySWP) res, _, err := cliCtx.QueryWithData(route, bz) if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } var circSupply int64 err = cliCtx.LegacyAmino.UnmarshalJSON(res, &circSupply) if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } resBytes, err := json.Marshal(circSupply) if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } w.Write(resBytes) } } func getTotalSupplyHARDHandlerFn(cliCtx client.Context) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { _, page, limit, err := rest.ParseHTTPArgsWithLimit(r, 0) if err != nil { rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return } cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r) if !ok { return } params := types.NewBaseQueryParams(page, limit) bz, err := cliCtx.LegacyAmino.MarshalJSON(params) if err != nil { rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("failed to marshal query params: %s", err)) return } route := fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryTotalSupplyHARD) res, _, err := cliCtx.QueryWithData(route, bz) if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } var totalSupply int64 err = cliCtx.LegacyAmino.UnmarshalJSON(res, &totalSupply) if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } resBytes, err := json.Marshal(totalSupply) if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } w.Write(resBytes) } } func getTotalSupplyUSDXHandlerFn(cliCtx client.Context) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { _, page, limit, err := rest.ParseHTTPArgsWithLimit(r, 0) if err != nil { rest.WriteErrorResponse(w, http.StatusBadRequest, err.Error()) return } cliCtx, ok := rest.ParseQueryHeightOrReturnBadRequest(w, cliCtx, r) if !ok { return } params := types.NewBaseQueryParams(page, limit) bz, err := cliCtx.LegacyAmino.MarshalJSON(params) if err != nil { rest.WriteErrorResponse(w, http.StatusBadRequest, fmt.Sprintf("failed to marshal query params: %s", err)) return } route := fmt.Sprintf("custom/%s/%s", types.QuerierRoute, types.QueryTotalSupplyUSDX) res, _, err := cliCtx.QueryWithData(route, bz) if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } var totalSupply int64 err = cliCtx.LegacyAmino.UnmarshalJSON(res, &totalSupply) if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } resBytes, err := json.Marshal(totalSupply) if err != nil { rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) return } w.Write(resBytes) } }