Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 57 additions & 5 deletions queryengine/native/native_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package queryengine
import (
"context"
"strconv"
"sync"
"time"

csr "github.com/Canto-Network/Canto/v6/x/csr/types"
Expand All @@ -28,6 +29,14 @@ type Validator struct {
Description staking.Description `json:"description"`
// commission defines the commission rate.
Commission string `json:"commission"`
// number of delegators.
Delegators int `json:"delegators"`
}

type ValidatorDelegationsResponse struct {
Validator string
Delegations int
Error error
}

// get all Validators for staking
Expand All @@ -41,9 +50,38 @@ func GetValidators(ctx context.Context, queryClient staking.QueryClient) ([]Vali
if err != nil {
return nil, nil, err
}
allValidators := new([]Validator)
validatorMap := make(map[string]string)
allValidators := []Validator{}
validatorMap := make(map[string]Validator)
validatorToResultStringMap := make(map[string]string)

var wg sync.WaitGroup
wg.Add(len(respValidators.Validators))
resultChan := make(chan ValidatorDelegationsResponse, len(respValidators.Validators))

for _, validator := range respValidators.Validators {
go func(valAddress string) {
defer wg.Done()
delegations, err := queryClient.ValidatorDelegations(ctx, &staking.QueryValidatorDelegationsRequest{
ValidatorAddr: valAddress,
Pagination: &query.PageRequest{
Limit: 1000,
},
})

if err != nil {
resultChan <- ValidatorDelegationsResponse{
Validator: valAddress,
Error: err,
}
return
}
resultChan <- ValidatorDelegationsResponse{
Validator: valAddress,
Delegations: len(delegations.DelegationResponses),
}

}(validator.OperatorAddress)

valResponse := Validator{
OperatorAddress: validator.OperatorAddress,
Jailed: validator.Jailed,
Expand All @@ -52,10 +90,24 @@ func GetValidators(ctx context.Context, queryClient staking.QueryClient) ([]Vali
Description: validator.Description,
Commission: validator.Commission.CommissionRates.Rate.String(),
}
*allValidators = append(*allValidators, valResponse)
validatorMap[validator.OperatorAddress] = GeneralResultToString(valResponse)
validatorMap[valResponse.OperatorAddress] = valResponse
}

wg.Wait()
close(resultChan)

for result := range resultChan {
if result.Error != nil {
return nil, nil, result.Error
} else {
validator := validatorMap[result.Validator]
validator.Delegators = result.Delegations
validatorMap[result.Validator] = validator
validatorToResultStringMap[result.Validator] = GeneralResultToString(validator)
allValidators = append(allValidators, validator)
}
}
return *allValidators, validatorMap, nil
return allValidators, validatorToResultStringMap, nil
}
func GetStakingAPR(ctx context.Context, stakingQueryClient staking.QueryClient, inflationQueryClient inflation.QueryClient) (string, error) {
//get pool
Expand Down