From 2672f4a1bbc4a8358dd595b62ccb9c42b5fac12a Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Mon, 23 Apr 2018 17:30:54 +0200 Subject: [PATCH] Add delegator bond query API endpoint --- x/stake/rest/query.go | 79 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 x/stake/rest/query.go diff --git a/x/stake/rest/query.go b/x/stake/rest/query.go new file mode 100644 index 000000000..240f68d96 --- /dev/null +++ b/x/stake/rest/query.go @@ -0,0 +1,79 @@ +package rest + +import ( + "encoding/hex" + "fmt" + "net/http" + + "github.com/gorilla/mux" + "github.com/tendermint/go-crypto/keys" + + "github.com/cosmos/cosmos-sdk/client/context" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/stake" +) + +// RegisterRoutes - Central function to define routes that get registered by the main application +func RegisterRoutes(r *mux.Router, cdc *wire.Codec, kb keys.Keybase) { + r.HandleFunc("/stake/{delegator}/bonding_status/{candidate}", BondingStatusHandler("stake", cdc, kb)).Methods("GET") +} + +// BondingStatusHandler - http request handler to query delegator bonding status +func BondingStatusHandler(storeName string, cdc *wire.Codec, kb keys.Keybase) func(http.ResponseWriter, *http.Request) { + ctx := context.NewCoreContextFromViper() + return func(w http.ResponseWriter, r *http.Request) { + // read parameters + vars := mux.Vars(r) + delegator := vars["delegator"] + validator := vars["validator"] + + bz, err := hex.DecodeString(delegator) + if err != nil { + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte(err.Error())) + return + } + delegatorAddr := sdk.Address(bz) + + bz, err = hex.DecodeString(validator) + if err != nil { + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte(err.Error())) + return + } + candidateAddr := sdk.Address(bz) + + key := stake.GetDelegatorBondKey(delegatorAddr, candidateAddr, cdc) + + res, err := ctx.Query(key, storeName) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(fmt.Sprintf("Couldn't query bond. Error: %s", err.Error()))) + return + } + + // the query will return empty if there is no data for this bond + if len(res) == 0 { + w.WriteHeader(http.StatusNoContent) + return + } + + var bond stake.DelegatorBond + err = cdc.UnmarshalBinary(res, &bond) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(fmt.Sprintf("Couldn't decode bond. Error: %s", err.Error()))) + return + } + + output, err := cdc.MarshalJSON(bond) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte(err.Error())) + return + } + + w.Write(output) + } +}