228 lines
7.5 KiB
Go
228 lines
7.5 KiB
Go
|
package querier
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
|
||
|
"github.com/cosmos/cosmos-sdk/codec"
|
||
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||
|
keep "github.com/cosmos/cosmos-sdk/x/stake/keeper"
|
||
|
"github.com/cosmos/cosmos-sdk/x/stake/types"
|
||
|
abci "github.com/tendermint/tendermint/abci/types"
|
||
|
)
|
||
|
|
||
|
// query endpoints supported by the staking Querier
|
||
|
const (
|
||
|
QueryValidators = "validators"
|
||
|
QueryValidator = "validator"
|
||
|
QueryDelegator = "delegator"
|
||
|
QueryDelegation = "delegation"
|
||
|
QueryUnbondingDelegation = "unbondingDelegation"
|
||
|
QueryDelegatorValidators = "delegatorValidators"
|
||
|
QueryDelegatorValidator = "delegatorValidator"
|
||
|
QueryPool = "pool"
|
||
|
QueryParameters = "parameters"
|
||
|
)
|
||
|
|
||
|
// creates a querier for staking REST endpoints
|
||
|
func NewQuerier(k keep.Keeper, cdc *codec.Codec) sdk.Querier {
|
||
|
return func(ctx sdk.Context, path []string, req abci.RequestQuery) (res []byte, err sdk.Error) {
|
||
|
switch path[0] {
|
||
|
case QueryValidators:
|
||
|
return queryValidators(ctx, cdc, k)
|
||
|
case QueryValidator:
|
||
|
return queryValidator(ctx, cdc, req, k)
|
||
|
case QueryDelegator:
|
||
|
return queryDelegator(ctx, cdc, req, k)
|
||
|
case QueryDelegation:
|
||
|
return queryDelegation(ctx, cdc, req, k)
|
||
|
case QueryUnbondingDelegation:
|
||
|
return queryUnbondingDelegation(ctx, cdc, req, k)
|
||
|
case QueryDelegatorValidators:
|
||
|
return queryDelegatorValidators(ctx, cdc, req, k)
|
||
|
case QueryDelegatorValidator:
|
||
|
return queryDelegatorValidator(ctx, cdc, req, k)
|
||
|
case QueryPool:
|
||
|
return queryPool(ctx, cdc, k)
|
||
|
case QueryParameters:
|
||
|
return queryParameters(ctx, cdc, k)
|
||
|
default:
|
||
|
return nil, sdk.ErrUnknownRequest("unknown stake query endpoint")
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// defines the params for the following queries:
|
||
|
// - 'custom/stake/delegator'
|
||
|
// - 'custom/stake/delegatorValidators'
|
||
|
type QueryDelegatorParams struct {
|
||
|
DelegatorAddr sdk.AccAddress
|
||
|
}
|
||
|
|
||
|
// defines the params for the following queries:
|
||
|
// - 'custom/stake/validator'
|
||
|
type QueryValidatorParams struct {
|
||
|
ValidatorAddr sdk.ValAddress
|
||
|
}
|
||
|
|
||
|
// defines the params for the following queries:
|
||
|
// - 'custom/stake/delegation'
|
||
|
// - 'custom/stake/unbondingDelegation'
|
||
|
// - 'custom/stake/delegatorValidator'
|
||
|
type QueryBondsParams struct {
|
||
|
DelegatorAddr sdk.AccAddress
|
||
|
ValidatorAddr sdk.ValAddress
|
||
|
}
|
||
|
|
||
|
func queryValidators(ctx sdk.Context, cdc *codec.Codec, k keep.Keeper) (res []byte, err sdk.Error) {
|
||
|
stakeParams := k.GetParams(ctx)
|
||
|
validators := k.GetValidators(ctx, stakeParams.MaxValidators)
|
||
|
|
||
|
res, errRes := codec.MarshalJSONIndent(cdc, validators)
|
||
|
if err != nil {
|
||
|
return nil, sdk.ErrInternal(fmt.Sprintf("could not marshal result to JSON: %s", errRes.Error()))
|
||
|
}
|
||
|
return res, nil
|
||
|
}
|
||
|
|
||
|
func queryValidator(ctx sdk.Context, cdc *codec.Codec, req abci.RequestQuery, k keep.Keeper) (res []byte, err sdk.Error) {
|
||
|
var params QueryValidatorParams
|
||
|
|
||
|
errRes := cdc.UnmarshalJSON(req.Data, ¶ms)
|
||
|
if errRes != nil {
|
||
|
return []byte{}, sdk.ErrUnknownAddress(fmt.Sprintf("incorrectly formatted request address: %s", err.Error()))
|
||
|
}
|
||
|
|
||
|
validator, found := k.GetValidator(ctx, params.ValidatorAddr)
|
||
|
if !found {
|
||
|
return []byte{}, types.ErrNoValidatorFound(types.DefaultCodespace)
|
||
|
}
|
||
|
|
||
|
res, errRes = codec.MarshalJSONIndent(cdc, validator)
|
||
|
if errRes != nil {
|
||
|
return nil, sdk.ErrInternal(fmt.Sprintf("could not marshal result to JSON: %s", errRes.Error()))
|
||
|
}
|
||
|
return res, nil
|
||
|
}
|
||
|
|
||
|
func queryDelegator(ctx sdk.Context, cdc *codec.Codec, req abci.RequestQuery, k keep.Keeper) (res []byte, err sdk.Error) {
|
||
|
var params QueryDelegatorParams
|
||
|
errRes := cdc.UnmarshalJSON(req.Data, ¶ms)
|
||
|
if errRes != nil {
|
||
|
return []byte{}, sdk.ErrUnknownAddress(fmt.Sprintf("incorrectly formatted request address: %s", errRes.Error()))
|
||
|
}
|
||
|
delegations := k.GetAllDelegatorDelegations(ctx, params.DelegatorAddr)
|
||
|
unbondingDelegations := k.GetAllUnbondingDelegations(ctx, params.DelegatorAddr)
|
||
|
redelegations := k.GetAllRedelegations(ctx, params.DelegatorAddr)
|
||
|
|
||
|
summary := types.DelegationSummary{
|
||
|
Delegations: delegations,
|
||
|
UnbondingDelegations: unbondingDelegations,
|
||
|
Redelegations: redelegations,
|
||
|
}
|
||
|
|
||
|
res, errRes = codec.MarshalJSONIndent(cdc, summary)
|
||
|
if errRes != nil {
|
||
|
return nil, sdk.ErrInternal(fmt.Sprintf("could not marshal result to JSON: %s", errRes.Error()))
|
||
|
}
|
||
|
return res, nil
|
||
|
}
|
||
|
|
||
|
func queryDelegatorValidators(ctx sdk.Context, cdc *codec.Codec, req abci.RequestQuery, k keep.Keeper) (res []byte, err sdk.Error) {
|
||
|
var params QueryDelegatorParams
|
||
|
|
||
|
stakeParams := k.GetParams(ctx)
|
||
|
|
||
|
errRes := cdc.UnmarshalJSON(req.Data, ¶ms)
|
||
|
if errRes != nil {
|
||
|
return []byte{}, sdk.ErrUnknownAddress(fmt.Sprintf("incorrectly formatted request address: %s", errRes.Error()))
|
||
|
}
|
||
|
|
||
|
validators := k.GetDelegatorValidators(ctx, params.DelegatorAddr, stakeParams.MaxValidators)
|
||
|
|
||
|
res, errRes = codec.MarshalJSONIndent(cdc, validators)
|
||
|
if errRes != nil {
|
||
|
return nil, sdk.ErrInternal(fmt.Sprintf("could not marshal result to JSON: %s", errRes.Error()))
|
||
|
}
|
||
|
return res, nil
|
||
|
}
|
||
|
|
||
|
func queryDelegatorValidator(ctx sdk.Context, cdc *codec.Codec, req abci.RequestQuery, k keep.Keeper) (res []byte, err sdk.Error) {
|
||
|
var params QueryBondsParams
|
||
|
|
||
|
errRes := cdc.UnmarshalJSON(req.Data, ¶ms)
|
||
|
if errRes != nil {
|
||
|
return []byte{}, sdk.ErrUnknownRequest(fmt.Sprintf("incorrectly formatted request address: %s", errRes.Error()))
|
||
|
}
|
||
|
|
||
|
validator, err := k.GetDelegatorValidator(ctx, params.DelegatorAddr, params.ValidatorAddr)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
res, errRes = codec.MarshalJSONIndent(cdc, validator)
|
||
|
if errRes != nil {
|
||
|
return nil, sdk.ErrInternal(fmt.Sprintf("could not marshal result to JSON: %s", errRes.Error()))
|
||
|
}
|
||
|
return res, nil
|
||
|
}
|
||
|
|
||
|
func queryDelegation(ctx sdk.Context, cdc *codec.Codec, req abci.RequestQuery, k keep.Keeper) (res []byte, err sdk.Error) {
|
||
|
var params QueryBondsParams
|
||
|
|
||
|
errRes := cdc.UnmarshalJSON(req.Data, ¶ms)
|
||
|
if errRes != nil {
|
||
|
return []byte{}, sdk.ErrUnknownRequest(fmt.Sprintf("incorrectly formatted request address: %s", errRes.Error()))
|
||
|
}
|
||
|
|
||
|
delegation, found := k.GetDelegation(ctx, params.DelegatorAddr, params.ValidatorAddr)
|
||
|
if !found {
|
||
|
return []byte{}, types.ErrNoDelegation(types.DefaultCodespace)
|
||
|
}
|
||
|
|
||
|
res, errRes = codec.MarshalJSONIndent(cdc, delegation)
|
||
|
if errRes != nil {
|
||
|
return nil, sdk.ErrInternal(fmt.Sprintf("could not marshal result to JSON: %s", errRes.Error()))
|
||
|
}
|
||
|
return res, nil
|
||
|
}
|
||
|
|
||
|
func queryUnbondingDelegation(ctx sdk.Context, cdc *codec.Codec, req abci.RequestQuery, k keep.Keeper) (res []byte, err sdk.Error) {
|
||
|
var params QueryBondsParams
|
||
|
|
||
|
errRes := cdc.UnmarshalJSON(req.Data, ¶ms)
|
||
|
if errRes != nil {
|
||
|
return []byte{}, sdk.ErrUnknownRequest(fmt.Sprintf("incorrectly formatted request address: %s", errRes.Error()))
|
||
|
}
|
||
|
|
||
|
unbond, found := k.GetUnbondingDelegation(ctx, params.DelegatorAddr, params.ValidatorAddr)
|
||
|
if !found {
|
||
|
return []byte{}, types.ErrNoUnbondingDelegation(types.DefaultCodespace)
|
||
|
}
|
||
|
|
||
|
res, errRes = codec.MarshalJSONIndent(cdc, unbond)
|
||
|
if errRes != nil {
|
||
|
return nil, sdk.ErrInternal(fmt.Sprintf("could not marshal result to JSON: %s", errRes.Error()))
|
||
|
}
|
||
|
return res, nil
|
||
|
}
|
||
|
|
||
|
func queryPool(ctx sdk.Context, cdc *codec.Codec, k keep.Keeper) (res []byte, err sdk.Error) {
|
||
|
pool := k.GetPool(ctx)
|
||
|
|
||
|
res, errRes := codec.MarshalJSONIndent(cdc, pool)
|
||
|
if errRes != nil {
|
||
|
return nil, sdk.ErrInternal(fmt.Sprintf("could not marshal result to JSON: %s", errRes.Error()))
|
||
|
}
|
||
|
return res, nil
|
||
|
}
|
||
|
|
||
|
func queryParameters(ctx sdk.Context, cdc *codec.Codec, k keep.Keeper) (res []byte, err sdk.Error) {
|
||
|
params := k.GetParams(ctx)
|
||
|
|
||
|
res, errRes := codec.MarshalJSONIndent(cdc, params)
|
||
|
if errRes != nil {
|
||
|
return nil, sdk.ErrInternal(fmt.Sprintf("could not marshal result to JSON: %s", errRes.Error()))
|
||
|
}
|
||
|
return res, nil
|
||
|
}
|