github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/staking/keeper/querier.go (about)

     1  package keeper
     2  
     3  import (
     4  	"strings"
     5  
     6  	"google.golang.org/grpc/codes"
     7  	"google.golang.org/grpc/status"
     8  
     9  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client"
    10  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
    11  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    12  	sdkerrors "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/errors"
    13  	stakingtypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/staking/types"
    14  	abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types"
    15  	"github.com/fibonacci-chain/fbc/libs/tendermint/crypto"
    16  	"github.com/fibonacci-chain/fbc/x/common"
    17  	"github.com/fibonacci-chain/fbc/x/staking/types"
    18  )
    19  
    20  // NewQuerier creates a querier for staking REST endpoints
    21  func NewQuerier(k Keeper) sdk.Querier {
    22  	return func(ctx sdk.Context, path []string, req abci.RequestQuery) (res []byte, err error) {
    23  		switch path[0] {
    24  		case types.QueryValidators:
    25  			return queryValidators(ctx, req, k)
    26  		case types.QueryValidator:
    27  			return queryValidator(ctx, req, k)
    28  		case types.QueryPool:
    29  			return queryPool(ctx, k)
    30  		case types.QueryParameters:
    31  			return queryParameters(ctx, k)
    32  		case types.QueryParams4IBC:
    33  			return queryParams4IBC(ctx, k)
    34  		case types.QueryUnbondingDelegation:
    35  			return queryUndelegation(ctx, req, k)
    36  		case types.QueryValidatorAllShares:
    37  			return queryValidatorAllShares(ctx, req, k)
    38  		case types.QueryAddress:
    39  			return queryAddress(ctx, k)
    40  		case types.QueryForAddress:
    41  			return queryForAddress(ctx, req, k)
    42  		case types.QueryForAccAddress:
    43  			return queryForAccAddress(ctx, req)
    44  		case types.QueryProxy:
    45  			return queryProxy(ctx, req, k)
    46  		case types.QueryDelegator:
    47  			return queryDelegator(ctx, req, k)
    48  		case types.QueryDelegatorValidators:
    49  			return queryDelegatorValidators(ctx, req, k)
    50  		case types.QueryDelegatorValidator:
    51  			return queryDelegatorValidator(ctx, req, k)
    52  		case types.QueryHistoricalInfo:
    53  			return queryHistoricalInfo(ctx, req, k)
    54  		case types.QueryValidatorDelegations:
    55  			return queryValidatorDelegations(ctx, req, k)
    56  		case types.QueryValidatorDelegator:
    57  			return queryValidatorDelegator(ctx, req, k)
    58  
    59  			// required by wallet
    60  		case types.QueryDelegatorDelegations:
    61  			return queryDelegatorDelegations(ctx, req, k)
    62  		case types.QueryUnbondingDelegation2:
    63  			return queryUndelegation2(ctx, req, k)
    64  		default:
    65  			return nil, types.ErrUnknownStakingQueryType()
    66  		}
    67  	}
    68  }
    69  
    70  func queryDelegator(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) {
    71  	var params types.QueryDelegatorParams
    72  
    73  	if err := types.ModuleCdc.UnmarshalJSON(req.Data, &params); err != nil {
    74  		return nil, common.ErrUnMarshalJSONFailed(err.Error())
    75  	}
    76  
    77  	delegator, found := k.GetDelegator(ctx, params.DelegatorAddr)
    78  	if !found {
    79  		return nil, types.ErrNoDelegatorExisted(params.DelegatorAddr.String())
    80  	}
    81  
    82  	res, err := codec.MarshalJSONIndent(types.ModuleCdc, delegator)
    83  	if err != nil {
    84  		return nil, common.ErrMarshalJSONFailed(err.Error())
    85  	}
    86  
    87  	return res, nil
    88  }
    89  
    90  func queryDelegatorValidator(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) {
    91  	var params types.QueryBondsParams
    92  	err := types.ModuleCdc.UnmarshalJSON(req.Data, &params)
    93  	if err != nil {
    94  		return nil, common.ErrUnMarshalJSONFailed(err.Error())
    95  	}
    96  
    97  	delegator, found := k.GetDelegator(ctx, params.DelegatorAddr)
    98  	if !found {
    99  		return nil, types.ErrNoDelegatorExisted(params.DelegatorAddr.String())
   100  	}
   101  
   102  	foundV := false
   103  	var validator types.Validator
   104  	for _, val := range delegator.ValidatorAddresses {
   105  		if !val.Equals(params.ValidatorAddr) {
   106  			continue
   107  		}
   108  		validator, found = k.GetValidator(ctx, val)
   109  		if !found {
   110  			return nil, types.ErrNoValidatorFound(val.String())
   111  		}
   112  		foundV = true
   113  		break
   114  	}
   115  
   116  	if !foundV {
   117  		return nil, types.ErrCodeNoDelegatorValidator(params.DelegatorAddr.String(), params.ValidatorAddr.String())
   118  	}
   119  
   120  	res, err := codec.MarshalJSONIndent(types.ModuleCdc, validator)
   121  	if err != nil {
   122  		return nil, common.ErrMarshalJSONFailed(err.Error())
   123  	}
   124  
   125  	return res, nil
   126  }
   127  
   128  func queryValidatorDelegator(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) {
   129  	var params types.QueryBondsParams
   130  	err := types.ModuleCdc.UnmarshalJSON(req.Data, &params)
   131  	if err != nil {
   132  		return nil, common.ErrUnMarshalJSONFailed(err.Error())
   133  	}
   134  
   135  	delegator, found := k.GetDelegator(ctx, params.DelegatorAddr)
   136  	if !found {
   137  		return nil, types.ErrNoDelegatorExisted(params.DelegatorAddr.String())
   138  	}
   139  
   140  	find := false
   141  	for _, val := range delegator.ValidatorAddresses {
   142  		if val.Equals(params.ValidatorAddr) {
   143  			find = true
   144  			break
   145  		}
   146  	}
   147  
   148  	if !find {
   149  		return nil, types.ErrCodeNoDelegatorValidator(params.DelegatorAddr.String(), params.ValidatorAddr.String())
   150  	}
   151  
   152  	res, err := codec.MarshalJSONIndent(types.ModuleCdc, delegator)
   153  	if err != nil {
   154  		return nil, common.ErrMarshalJSONFailed(err.Error())
   155  	}
   156  
   157  	return res, nil
   158  }
   159  
   160  func queryDelegatorValidators(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) {
   161  	var params types.QueryDelegatorParams
   162  	err := types.ModuleCdc.UnmarshalJSON(req.Data, &params)
   163  	if err != nil {
   164  		return nil, common.ErrUnMarshalJSONFailed(err.Error())
   165  	}
   166  
   167  	delegator, found := k.GetDelegator(ctx, params.DelegatorAddr)
   168  	if !found {
   169  		return nil, types.ErrNoDelegatorExisted(params.DelegatorAddr.String())
   170  	}
   171  
   172  	var validators []types.Validator
   173  	for _, val := range delegator.ValidatorAddresses {
   174  		validator, found := k.GetValidator(ctx, val)
   175  		if !found {
   176  			return nil, types.ErrNoValidatorFound(val.String())
   177  		}
   178  		validators = append(validators, validator)
   179  	}
   180  
   181  	res, err := codec.MarshalJSONIndent(types.ModuleCdc, validators)
   182  	if err != nil {
   183  		return nil, common.ErrMarshalJSONFailed(err.Error())
   184  	}
   185  
   186  	return res, nil
   187  }
   188  
   189  func queryValidatorDelegations(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) {
   190  	var params types.QueryValidatorParams
   191  
   192  	err := types.ModuleCdc.UnmarshalJSON(req.Data, &params)
   193  	if err != nil {
   194  		return nil, common.ErrUnMarshalJSONFailed(err.Error())
   195  	}
   196  
   197  	sharesDelegations := k.GetValidatorAllShares(ctx, params.ValidatorAddr)
   198  	var delegators []types.Delegator
   199  	for _, shareDelegator := range sharesDelegations {
   200  		delegator, found := k.GetDelegator(ctx, shareDelegator.DelAddr)
   201  		if !found {
   202  			return nil, types.ErrNoDelegatorExisted(shareDelegator.DelAddr.String())
   203  		}
   204  		delegators = append(delegators, delegator)
   205  	}
   206  
   207  	res, err := codec.MarshalJSONIndent(types.ModuleCdc, delegators)
   208  	if err != nil {
   209  		return nil, common.ErrMarshalJSONFailed(err.Error())
   210  	}
   211  
   212  	return res, nil
   213  }
   214  
   215  func queryValidators(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) {
   216  	var params types.QueryValidatorsParams
   217  
   218  	if err := types.ModuleCdc.UnmarshalJSON(req.Data, &params); err != nil {
   219  		return nil, common.ErrUnMarshalJSONFailed(err.Error())
   220  	}
   221  
   222  	validators := k.GetAllValidators(ctx)
   223  
   224  	var filteredVals []types.Validator
   225  	if params.Status == "all" {
   226  		filteredVals = validators
   227  	} else {
   228  		filteredVals = make([]types.Validator, 0, len(validators))
   229  		for _, val := range validators {
   230  			if strings.EqualFold(val.GetStatus().String(), params.Status) {
   231  				filteredVals = append(filteredVals, val)
   232  			}
   233  		}
   234  
   235  		start, end := client.Paginate(len(filteredVals), params.Page, params.Limit, int(k.GetParams(ctx).MaxValidators))
   236  		if start < 0 || end < 0 {
   237  			filteredVals = []types.Validator{}
   238  		} else {
   239  			filteredVals = filteredVals[start:end]
   240  		}
   241  	}
   242  
   243  	res, err := codec.MarshalJSONIndent(types.ModuleCdc, filteredVals)
   244  	if err != nil {
   245  		return nil, common.ErrMarshalJSONFailed(err.Error())
   246  	}
   247  
   248  	return res, nil
   249  }
   250  
   251  func queryValidator(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) {
   252  	var params types.QueryValidatorParams
   253  
   254  	err := types.ModuleCdc.UnmarshalJSON(req.Data, &params)
   255  	if err != nil {
   256  		return nil, common.ErrUnMarshalJSONFailed(err.Error())
   257  	}
   258  
   259  	validator, found := k.GetValidator(ctx, params.ValidatorAddr)
   260  	if !found {
   261  		return nil, types.ErrNoValidatorFound(params.ValidatorAddr.String())
   262  	}
   263  
   264  	res, err := codec.MarshalJSONIndent(types.ModuleCdc, validator)
   265  	if err != nil {
   266  		return nil, common.ErrMarshalJSONFailed(err.Error())
   267  	}
   268  
   269  	return res, nil
   270  }
   271  
   272  func queryPool(ctx sdk.Context, k Keeper) ([]byte, error) {
   273  	bondDenom := k.BondDenom(ctx)
   274  	bondedPool := k.GetBondedPool(ctx)
   275  	notBondedPool := k.GetNotBondedPool(ctx)
   276  	if bondedPool == nil || notBondedPool == nil {
   277  		return nil, types.ErrBondedPoolOrNotBondedIsNotExist()
   278  	}
   279  
   280  	pool := types.NewPool(
   281  		notBondedPool.GetCoins().AmountOf(bondDenom),
   282  		bondedPool.GetCoins().AmountOf(bondDenom),
   283  	)
   284  
   285  	res, err := codec.MarshalJSONIndent(types.ModuleCdc, pool)
   286  	if err != nil {
   287  		return nil, common.ErrMarshalJSONFailed(err.Error())
   288  	}
   289  
   290  	return res, nil
   291  }
   292  
   293  func queryParameters(ctx sdk.Context, k Keeper) ([]byte, error) {
   294  	params := k.GetParams(ctx)
   295  
   296  	res, err := codec.MarshalJSONIndent(types.ModuleCdc, params)
   297  	if err != nil {
   298  		return nil, common.ErrMarshalJSONFailed(err.Error())
   299  	}
   300  
   301  	return res, nil
   302  }
   303  
   304  func queryParams4IBC(ctx sdk.Context, k Keeper) ([]byte, error) {
   305  	params := k.GetParams(ctx)
   306  
   307  	//QueryParamsResponse
   308  	ret := &stakingtypes.QueryParamsResponse{
   309  		Params: stakingtypes.IBCParams{
   310  			UnbondingTime:     params.UnbondingTime,
   311  			MaxValidators:     uint32(params.MaxValidators),
   312  			MaxEntries:        uint32(params.MaxValsToAddShares),
   313  			HistoricalEntries: params.HistoricalEntries,
   314  			BondDenom:         sdk.DefaultBondDenom,
   315  		},
   316  	}
   317  	res, err := k.cdcMarshl.GetProtocMarshal().MarshalBinaryBare(ret)
   318  	if err != nil {
   319  		return nil, common.ErrMarshalJSONFailed(err.Error())
   320  	}
   321  
   322  	return res, nil
   323  }
   324  
   325  func queryProxy(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) {
   326  	var params types.QueryDelegatorParams
   327  	if err := types.ModuleCdc.UnmarshalJSON(req.Data, &params); err != nil {
   328  		return nil, common.ErrUnMarshalJSONFailed(err.Error())
   329  	}
   330  
   331  	delAddrs := k.GetDelegatorsByProxy(ctx, params.DelegatorAddr)
   332  	resp, err := codec.MarshalJSONIndent(types.ModuleCdc, delAddrs)
   333  	if err != nil {
   334  		return nil, common.ErrMarshalJSONFailed(err.Error())
   335  	}
   336  
   337  	return resp, nil
   338  }
   339  
   340  func queryValidatorAllShares(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) {
   341  	var params types.QueryValidatorParams
   342  
   343  	if err := types.ModuleCdc.UnmarshalJSON(req.Data, &params); err != nil {
   344  		return nil, common.ErrUnMarshalJSONFailed(err.Error())
   345  	}
   346  
   347  	sharesResponses := k.GetValidatorAllShares(ctx, params.ValidatorAddr)
   348  	resp, err := codec.MarshalJSONIndent(types.ModuleCdc, sharesResponses)
   349  	if err != nil {
   350  		return nil, common.ErrMarshalJSONFailed(err.Error())
   351  	}
   352  
   353  	return resp, nil
   354  }
   355  
   356  func queryUndelegation(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) {
   357  	var params types.QueryDelegatorParams
   358  	err := types.ModuleCdc.UnmarshalJSON(req.Data, &params)
   359  	if err != nil {
   360  		return nil, common.ErrUnMarshalJSONFailed(err.Error())
   361  	}
   362  
   363  	undelegation, found := k.GetUndelegating(ctx, params.DelegatorAddr)
   364  	if !found {
   365  		return nil, types.ErrNoUnbondingDelegation()
   366  	}
   367  
   368  	res, err := codec.MarshalJSONIndent(types.ModuleCdc, undelegation)
   369  	if err != nil {
   370  		return nil, common.ErrMarshalJSONFailed(err.Error())
   371  	}
   372  
   373  	return res, nil
   374  }
   375  
   376  func queryAddress(ctx sdk.Context, k Keeper) (res []byte, err error) {
   377  
   378  	ovPairs := k.GetOperAndValidatorAddr(ctx)
   379  	res, errRes := codec.MarshalJSONIndent(types.ModuleCdc, ovPairs)
   380  	if errRes != nil {
   381  		return nil, common.ErrMarshalJSONFailed(errRes.Error())
   382  	}
   383  	return res, nil
   384  }
   385  
   386  func queryForAddress(ctx sdk.Context, req abci.RequestQuery, k Keeper) (res []byte, err error) {
   387  	validatorAddr := string(req.Data)
   388  	if len(validatorAddr) != crypto.AddressSize*2 {
   389  		return nil, types.ErrBadValidatorAddr()
   390  	}
   391  
   392  	operAddr, found := k.GetOperAddrFromValidatorAddr(ctx, validatorAddr)
   393  	if !found {
   394  		return nil, types.ErrNoValidatorFound(validatorAddr)
   395  	}
   396  
   397  	res, errRes := codec.MarshalJSONIndent(types.ModuleCdc, operAddr)
   398  	if errRes != nil {
   399  		return nil, common.ErrMarshalJSONFailed(errRes.Error())
   400  	}
   401  	return res, nil
   402  }
   403  
   404  func queryForAccAddress(ctx sdk.Context, req abci.RequestQuery) (res []byte, err error) {
   405  
   406  	valAddr, errBech32 := sdk.ValAddressFromBech32(string(req.Data))
   407  	if errBech32 != nil {
   408  		return nil, common.ErrCreateAddrFromBech32Failed(errBech32.Error(), errBech32.Error())
   409  	}
   410  
   411  	accAddr := sdk.AccAddress(valAddr)
   412  
   413  	res, errMarshal := codec.MarshalJSONIndent(types.ModuleCdc, accAddr)
   414  	if errMarshal != nil {
   415  		return nil, common.ErrMarshalJSONFailed(errMarshal.Error())
   416  	}
   417  	return res, nil
   418  }
   419  
   420  func queryUndelegation2(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) {
   421  	var params types.QueryDelegatorUnbondingDelegationsRequest
   422  	err := types.ModuleCdc.UnmarshalJSON(req.Data, &params)
   423  	if err != nil {
   424  		return nil, common.ErrUnMarshalJSONFailed(err.Error())
   425  	}
   426  
   427  	if params.DelegatorAddr == "" {
   428  		return nil, status.Errorf(codes.InvalidArgument, "delegator address cannot be empty")
   429  	}
   430  
   431  	delAddr, err := sdk.AccAddressFromBech32(params.DelegatorAddr)
   432  	if err != nil {
   433  		return nil, err
   434  	}
   435  
   436  	un, pageRes, err := k.GetDelegatorUnbondingDelegations(ctx, delAddr, params.Pagination)
   437  	if nil != err {
   438  		return nil, err
   439  	}
   440  	if un == nil {
   441  		un = make(stakingtypes.UnbondingDelegations, 0)
   442  	}
   443  	marsh := &types.QueryDelegatorUnbondingDelegationsResponse{
   444  		UnbondingResponses: un,
   445  		Pagination:         pageRes,
   446  	}
   447  	res, err := codec.MarshalJSONIndent(types.ModuleCdc, marsh)
   448  	if err != nil {
   449  		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
   450  	}
   451  
   452  	return res, nil
   453  }
   454  
   455  func queryDelegatorDelegations(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) {
   456  	var params types.QueryDelegatorDelegationsRequest
   457  
   458  	err := types.ModuleCdc.UnmarshalJSON(req.Data, &params)
   459  	if err != nil {
   460  		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error())
   461  	}
   462  
   463  	delegationResps, err := k.DelegatorDelegations(ctx, &params)
   464  	if delegationResps == nil {
   465  		delegationResps = &types.QueryDelegatorDelegationsResponse{}
   466  	}
   467  
   468  	res, err := codec.MarshalJSONIndent(types.ModuleCdc, delegationResps)
   469  	if err != nil {
   470  		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
   471  	}
   472  
   473  	return res, nil
   474  }
   475  
   476  func delegationsToDelegationResponses(
   477  	ctx sdk.Context, k Keeper, delegations stakingtypes.Delegations,
   478  ) (stakingtypes.DelegationResponses, error) {
   479  
   480  	resp := make(stakingtypes.DelegationResponses, len(delegations))
   481  	for i, del := range delegations {
   482  		delResp, err := delegationToDelegationResponse(ctx, k, del)
   483  		if err != nil {
   484  			return nil, err
   485  		}
   486  
   487  		resp[i] = delResp
   488  	}
   489  
   490  	return resp, nil
   491  }
   492  
   493  // ///
   494  // utils
   495  func delegationToDelegationResponse(ctx sdk.Context, k Keeper, del stakingtypes.Delegation) (stakingtypes.DelegationResponse, error) {
   496  	val, found := k.GetValidator(ctx, del.ValidatorAddress)
   497  	if !found {
   498  		return stakingtypes.DelegationResponse{}, stakingtypes.ErrNoValidatorFound
   499  	}
   500  
   501  	return stakingtypes.NewDelegationResp(
   502  		del.DelegatorAddress,
   503  		del.ValidatorAddress,
   504  		del.Shares,
   505  		sdk.NewCoin(k.BondDenom(ctx), val.TokensFromShares(del.Shares).TruncateInt()),
   506  	), nil
   507  }
   508  
   509  func DelegationsToDelegationResponses(
   510  	ctx sdk.Context, k Keeper, delegations stakingtypes.Delegations,
   511  ) (stakingtypes.DelegationResponses, error) {
   512  	resp := make(stakingtypes.DelegationResponses, len(delegations))
   513  
   514  	for i, del := range delegations {
   515  		delResp, err := DelegationToDelegationResponse(ctx, k, del)
   516  		if err != nil {
   517  			return nil, err
   518  		}
   519  
   520  		resp[i] = delResp
   521  	}
   522  
   523  	return resp, nil
   524  }
   525  
   526  func DelegationToDelegationResponse(ctx sdk.Context, k Keeper, del stakingtypes.Delegation) (stakingtypes.DelegationResponse, error) {
   527  	val, found := k.GetValidator(ctx, del.GetValidatorAddr())
   528  	if !found {
   529  		return stakingtypes.DelegationResponse{}, stakingtypes.ErrNoValidatorFound
   530  	}
   531  
   532  	delegatorAddress, err := sdk.AccAddressFromBech32(del.DelegatorAddress.String())
   533  	if err != nil {
   534  		return stakingtypes.DelegationResponse{}, err
   535  	}
   536  
   537  	return stakingtypes.NewDelegationResp(
   538  		delegatorAddress,
   539  		del.GetValidatorAddr(),
   540  		del.Shares,
   541  		sdk.NewCoin(k.BondDenom(ctx), val.TokensFromShares(del.Shares).TruncateInt()),
   542  	), nil
   543  }
   544  
   545  func queryHistoricalInfo(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, error) {
   546  	var params types.QueryHistoricalInfoParams
   547  
   548  	err := types.ModuleCdc.UnmarshalJSON(req.Data, &params)
   549  	if err != nil {
   550  		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONUnmarshal, err.Error())
   551  	}
   552  
   553  	hi, found := k.GetHistoricalInfo(ctx, params.Height)
   554  	if !found {
   555  		return nil, types.ErrNoHistoricalInfo
   556  	}
   557  
   558  	res, err := codec.MarshalJSONIndent(types.ModuleCdc, hi)
   559  	if err != nil {
   560  		return nil, sdkerrors.Wrap(sdkerrors.ErrJSONMarshal, err.Error())
   561  	}
   562  
   563  	return res, nil
   564  }