Skip to content

Commit c6492e5

Browse files
authored
feat(api): query delegator total rewards token (piplabs#572)
Add to query the total number of rewards token of delegator. This is to estimate the daily rewards for staking dashboard. issue: none
1 parent fad7dab commit c6492e5

File tree

2 files changed

+82
-0
lines changed

2 files changed

+82
-0
lines changed

client/server/README.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -725,6 +725,26 @@ URL: [GET] /staking/delegators/{delegator_addr}/validators/{validator_addr}
725725
}
726726
```
727727

728+
## GetDelegatorTotalRewardsToken
729+
730+
URL: [GET] /staking/delegators/{delegator_addr}/total_rewards_token
731+
732+
### Path Params
733+
| Name | Type | Example | Required |
734+
|----------------|--------|----------------------------------------------|----------|
735+
| delegator_addr | string | 0x00a842dbd3d11176b4868dd753a552b8919d5a63 ||
736+
737+
### Response Example
738+
```json
739+
{
740+
"code": 200,
741+
"msg": {
742+
"rewards_token": "373566680396694.500000000000000000"
743+
},
744+
"error": ""
745+
}
746+
```
747+
728748
## GetDelegatorDelegations
729749

730750
URL: [GET] /staking/delegations/{delegator_addr}

client/server/staking.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ import (
55
"net/http"
66
"strconv"
77

8+
"cosmossdk.io/math"
9+
10+
sdk "github.com/cosmos/cosmos-sdk/types"
811
"github.com/cosmos/cosmos-sdk/types/query"
912
"github.com/cosmos/cosmos-sdk/x/staking/keeper"
1013
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
@@ -35,6 +38,7 @@ func (s *Server) initStakingRoute() {
3538
s.httpMux.HandleFunc("/staking/delegators/{delegator_address}/unbonding_delegations", utils.AutoWrap(s.aminoCodec, s.GetUnbondingDelegationsByDelegatorAddress))
3639
s.httpMux.HandleFunc("/staking/delegators/{delegator_address}/validators", utils.AutoWrap(s.aminoCodec, s.GetValidatorsByDelegatorAddress))
3740
s.httpMux.HandleFunc("/staking/delegators/{delegator_address}/validators/{validator_address}", utils.SimpleWrap(s.aminoCodec, s.GetValidatorsByDelegatorAddressValidatorAddress))
41+
s.httpMux.HandleFunc("/staking/delegators/{delegator_address}/total_rewards_token", utils.SimpleWrap(s.aminoCodec, s.GetTotalRewardsTokenByDelegatorAddress))
3842
}
3943

4044
// GetStakingParams queries the staking parameters.
@@ -624,6 +628,64 @@ func (s *Server) GetValidatorsByDelegatorAddressValidatorAddress(r *http.Request
624628
return queryResp, nil
625629
}
626630

631+
type QueryTotalRewardsTokenByDelegatorAddressResponse struct {
632+
RewardsToken math.LegacyDec `json:"rewards_token"`
633+
}
634+
635+
func (s *Server) GetTotalRewardsTokenByDelegatorAddress(r *http.Request) (resp any, err error) {
636+
queryContext, err := s.createQueryContextByHeader(r)
637+
if err != nil {
638+
return nil, err
639+
}
640+
641+
bech32AccAddress, err := utils.EvmAddressToBech32AccAddress(mux.Vars(r)["delegator_address"])
642+
if err != nil {
643+
return nil, err
644+
}
645+
646+
var nextKey []byte
647+
totalRewardsToken := math.LegacyZeroDec()
648+
649+
for {
650+
queryResp, err := keeper.NewQuerier(s.store.GetStakingKeeper()).DelegatorDelegations(queryContext, &stakingtypes.QueryDelegatorDelegationsRequest{
651+
DelegatorAddr: bech32AccAddress.String(),
652+
Pagination: &query.PageRequest{
653+
Key: nextKey,
654+
Limit: 100,
655+
CountTotal: false,
656+
},
657+
})
658+
if err != nil {
659+
return nil, err
660+
}
661+
662+
for _, delResp := range queryResp.DelegationResponses {
663+
valAddr, err := sdk.ValAddressFromBech32(delResp.Delegation.ValidatorAddress)
664+
if err != nil {
665+
return nil, err
666+
}
667+
668+
val, err := keeper.NewQuerier(s.store.GetStakingKeeper()).GetValidator(queryContext, valAddr)
669+
if err != nil {
670+
return nil, err
671+
}
672+
673+
rewardsToken := val.RewardsTokensFromRewardsShares(delResp.Delegation.RewardsShares)
674+
totalRewardsToken = totalRewardsToken.Add(rewardsToken)
675+
}
676+
677+
if queryResp.Pagination == nil || len(queryResp.Pagination.NextKey) == 0 {
678+
break
679+
}
680+
681+
nextKey = queryResp.Pagination.NextKey
682+
}
683+
684+
return QueryTotalRewardsTokenByDelegatorAddressResponse{
685+
RewardsToken: totalRewardsToken,
686+
}, nil
687+
}
688+
627689
// GetPeriodDelegations queries period delegations info for given validator delegator pair.
628690
func (s *Server) GetPeriodDelegations(req *getPeriodDelegationsRequest, r *http.Request) (resp any, err error) {
629691
queryContext, err := s.createQueryContextByHeader(r)

0 commit comments

Comments
 (0)