Restored validators query endpoint

This commit is contained in:
Matt Bell 2018-05-29 15:07:03 +09:00
parent 5c1a7694e5
commit 99e5c5a18f
2 changed files with 55 additions and 35 deletions

View File

@ -313,6 +313,13 @@ func TestTxs(t *testing.T) {
// assert.NotEqual(t, "[]", body)
}
func TestValidatorsQuery(t *testing.T) {
validators := getValidators(t)
assert.Equal(t, len(validators), 2)
assert.Equal(t, hex.EncodeToString(validators[0].Owner), validatorAddr1)
assert.Equal(t, hex.EncodeToString(validators[1].Owner), validatorAddr2)
}
func TestBond(t *testing.T) {
// create bond TX
@ -631,42 +638,12 @@ func doUnbond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastT
return results[0]
}
func doMultiBond(t *testing.T, port, seed string) (resultTx ctypes.ResultBroadcastTxCommit) {
func getValidators(t *testing.T) []stake.Validator {
// get the account to get the sequence
acc := getAccount(t, sendAddr)
sequence := acc.GetSequence()
// send
jsonStr := []byte(fmt.Sprintf(`{
"name": "%s",
"password": "%s",
"sequence": %d,
"bond": [
{
"delegator_addr": "%x",
"validator_addr": "%s",
"bond": { "denom": "%s", "amount": 1 }
},
{
"delegator_addr": "%x",
"validator_addr": "%s",
"bond": { "denom": "%s", "amount": 1 }
},
],
"unbond": [
{
"delegator_addr": "%x",
"validator_addr": "%s",
"shares": "1"
}
]
}`, name, password, sequence, acc.GetAddress(), validatorAddr1, coinDenom, acc.GetAddress(), validatorAddr2, coinDenom, acc.GetAddress(), validatorAddr1))
res, body := request(t, port, "POST", "/stake/delegations", jsonStr)
res, body := request(t, port, "GET", "/stake/validators", nil)
require.Equal(t, http.StatusOK, res.StatusCode, body)
var results []ctypes.ResultBroadcastTxCommit
err := cdc.UnmarshalJSON([]byte(body), &results)
var validators stake.Validators
err := cdc.UnmarshalJSON([]byte(body), &validators)
require.Nil(t, err)
return results[0]
return validators
}

View File

@ -18,6 +18,10 @@ func registerQueryRoutes(ctx context.CoreContext, r *mux.Router, cdc *wire.Codec
"/stake/{delegator}/bonding_status/{validator}",
bondingStatusHandlerFn("stake", cdc, ctx),
).Methods("GET")
r.HandleFunc(
"/stake/validators",
validatorsHandlerFn("stake", cdc, ctx),
).Methods("GET")
}
// http request handler to query delegator bonding status
@ -77,3 +81,42 @@ func bondingStatusHandlerFn(storeName string, cdc *wire.Codec, ctx context.CoreC
w.Write(output)
}
}
// http request handler to query list of validators
func validatorsHandlerFn(storeName string, cdc *wire.Codec, ctx context.CoreContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
res, err := ctx.QuerySubspace(cdc, stake.ValidatorsKey, storeName)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(fmt.Sprintf("Couldn't query validators. Error: %s", err.Error())))
return
}
// the query will return empty if there are no validators
if len(res) == 0 {
w.WriteHeader(http.StatusNoContent)
return
}
validators := make(stake.Validators, 0, len(res))
for _, kv := range res {
var validator stake.Validator
err = cdc.UnmarshalBinary(kv.Value, &validator)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(fmt.Sprintf("Couldn't decode validator. Error: %s", err.Error())))
return
}
validators = append(validators, validator)
}
output, err := cdc.MarshalJSON(validators)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(err.Error()))
return
}
w.Write(output)
}
}