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

     1  package keeper
     2  
     3  import (
     4  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client"
     5  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
     6  	abci "github.com/fibonacci-chain/fbc/libs/tendermint/abci/types"
     7  	"github.com/fibonacci-chain/fbc/x/common"
     8  
     9  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    10  	"github.com/fibonacci-chain/fbc/x/farm/types"
    11  )
    12  
    13  const (
    14  	defaultPoolsDisplayedNum = 20
    15  )
    16  
    17  // NewQuerier creates a new querier for farm clients.
    18  func NewQuerier(k Keeper) sdk.Querier {
    19  	return func(ctx sdk.Context, path []string, req abci.RequestQuery) ([]byte, sdk.Error) {
    20  		switch path[0] {
    21  		case types.QueryPool:
    22  			return queryPool(ctx, req, k)
    23  		case types.QueryPools:
    24  			return queryPools(ctx, req, k)
    25  		case types.QueryEarnings:
    26  			return queryEarnings(ctx, req, k)
    27  		case types.QueryLockInfo:
    28  			return queryLockInfo(ctx, req, k)
    29  		case types.QueryParameters:
    30  			return queryParams(ctx, k)
    31  		case types.QueryWhitelist:
    32  			return queryWhitelist(ctx, k)
    33  		case types.QueryAccount:
    34  			return queryAccount(ctx, req, k)
    35  		case types.QueryAccountsLockedTo:
    36  			return queryAccountsLockedTo(ctx, req, k)
    37  		case types.QueryPoolNum:
    38  			return queryPoolNum(ctx, k)
    39  		default:
    40  			return nil, types.ErrUnknownFarmQueryType("failed. unknown farm query endpoint")
    41  		}
    42  	}
    43  }
    44  
    45  func queryPool(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, sdk.Error) {
    46  	var params types.QueryPoolParams
    47  
    48  	if err := types.ModuleCdc.UnmarshalJSON(req.Data, &params); err != nil {
    49  		return nil, defaultQueryErrParseParams(err)
    50  	}
    51  
    52  	pool, found := k.GetFarmPool(ctx, params.PoolName)
    53  	if !found {
    54  		return nil, types.ErrNoFarmPoolFound(params.PoolName)
    55  	}
    56  
    57  	updatedPool, _ := k.CalculateAmountYieldedBetween(ctx, pool)
    58  
    59  	res, err := codec.MarshalJSONIndent(types.ModuleCdc, updatedPool)
    60  	if err != nil {
    61  		return nil, defaultQueryErrJSONMarshal(err)
    62  	}
    63  
    64  	return res, nil
    65  }
    66  
    67  // support query by page && limit
    68  func queryPools(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, sdk.Error) {
    69  	var params types.QueryPoolsParams
    70  	if err := types.ModuleCdc.UnmarshalJSON(req.Data, &params); err != nil {
    71  		return nil, defaultQueryErrParseParams(err)
    72  	}
    73  
    74  	pools := k.GetFarmPools(ctx)
    75  	var updatedPools types.FarmPools
    76  	for _, pool := range pools {
    77  		updatedPool, _ := k.CalculateAmountYieldedBetween(ctx, pool)
    78  		updatedPools = append(updatedPools, updatedPool)
    79  	}
    80  
    81  	if !(params.Page == 1 && params.Limit == 0) {
    82  		start, end := client.Paginate(len(updatedPools), params.Page, params.Limit, defaultPoolsDisplayedNum)
    83  		if start < 0 || end < 0 {
    84  			start, end = 0, 0
    85  		}
    86  		updatedPools = updatedPools[start:end]
    87  	}
    88  
    89  	res, err := codec.MarshalJSONIndent(types.ModuleCdc, updatedPools)
    90  	if err != nil {
    91  		return nil, defaultQueryErrJSONMarshal(err)
    92  	}
    93  
    94  	return res, nil
    95  }
    96  
    97  func queryEarnings(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, sdk.Error) {
    98  	var params types.QueryPoolAccountParams
    99  	if err := types.ModuleCdc.UnmarshalJSON(req.Data, &params); err != nil {
   100  		return nil, defaultQueryErrParseParams(err)
   101  	}
   102  
   103  	earnings, sdkErr := k.GetEarnings(ctx, params.PoolName, params.AccAddress)
   104  	if sdkErr != nil {
   105  		return nil, sdkErr
   106  	}
   107  
   108  	res, err := codec.MarshalJSONIndent(types.ModuleCdc, earnings)
   109  	if err != nil {
   110  		return nil, defaultQueryErrJSONMarshal(err)
   111  	}
   112  
   113  	return res, nil
   114  }
   115  
   116  func queryLockInfo(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, sdk.Error) {
   117  	var params types.QueryPoolAccountParams
   118  	if err := types.ModuleCdc.UnmarshalJSON(req.Data, &params); err != nil {
   119  		return nil, defaultQueryErrParseParams(err)
   120  	}
   121  
   122  	lockInfo, found := k.GetLockInfo(ctx, params.AccAddress, params.PoolName)
   123  	if !found {
   124  		return nil, types.ErrNoLockInfoFound(params.AccAddress.String(), params.PoolName)
   125  	}
   126  
   127  	res, err := codec.MarshalJSONIndent(types.ModuleCdc, lockInfo)
   128  	if err != nil {
   129  		return nil, defaultQueryErrJSONMarshal(err)
   130  	}
   131  
   132  	return res, nil
   133  }
   134  
   135  func queryParams(ctx sdk.Context, k Keeper) ([]byte, sdk.Error) {
   136  	params := k.GetParams(ctx)
   137  	res, err := codec.MarshalJSONIndent(types.ModuleCdc, params)
   138  	if err != nil {
   139  		return nil, defaultQueryErrJSONMarshal(err)
   140  	}
   141  
   142  	return res, nil
   143  }
   144  
   145  func queryWhitelist(ctx sdk.Context, k Keeper) ([]byte, sdk.Error) {
   146  	whitelist := k.GetWhitelist(ctx)
   147  	res, err := codec.MarshalJSONIndent(types.ModuleCdc, whitelist)
   148  	if err != nil {
   149  		return nil, defaultQueryErrJSONMarshal(err)
   150  	}
   151  
   152  	return res, nil
   153  }
   154  
   155  func queryAccount(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, sdk.Error) {
   156  	var params types.QueryAccountParams
   157  	if err := types.ModuleCdc.UnmarshalJSON(req.Data, &params); err != nil {
   158  		return nil, defaultQueryErrParseParams(err)
   159  	}
   160  
   161  	poolNames := k.GetFarmPoolNamesForAccount(ctx, params.AccAddress)
   162  	res, err := codec.MarshalJSONIndent(types.ModuleCdc, poolNames)
   163  	if err != nil {
   164  		return nil, defaultQueryErrJSONMarshal(err)
   165  	}
   166  
   167  	return res, nil
   168  }
   169  
   170  func queryAccountsLockedTo(ctx sdk.Context, req abci.RequestQuery, k Keeper) ([]byte, sdk.Error) {
   171  	var params types.QueryPoolParams
   172  	if err := types.ModuleCdc.UnmarshalJSON(req.Data, &params); err != nil {
   173  		return nil, defaultQueryErrParseParams(err)
   174  	}
   175  
   176  	accAddrList := k.getAccountsLockedTo(ctx, params.PoolName)
   177  	res, err := codec.MarshalJSONIndent(types.ModuleCdc, accAddrList)
   178  	if err != nil {
   179  		return nil, defaultQueryErrJSONMarshal(err)
   180  	}
   181  
   182  	return res, nil
   183  }
   184  
   185  func queryPoolNum(ctx sdk.Context, k Keeper) ([]byte, sdk.Error) {
   186  	poolNum := k.getPoolNum(ctx)
   187  	res, err := codec.MarshalJSONIndent(types.ModuleCdc, poolNum)
   188  	if err != nil {
   189  		return nil, defaultQueryErrJSONMarshal(err)
   190  	}
   191  
   192  	return res, nil
   193  }
   194  
   195  func defaultQueryErrJSONMarshal(err error) sdk.Error {
   196  	return common.ErrMarshalJSONFailed(err.Error())
   197  }
   198  
   199  func defaultQueryErrParseParams(err error) sdk.Error {
   200  	return common.ErrUnMarshalJSONFailed(err.Error())
   201  }