-
Notifications
You must be signed in to change notification settings - Fork 40
/
query_delegator_validators.go
76 lines (61 loc) · 2.49 KB
/
query_delegator_validators.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package wasm
import (
"encoding/json"
"math"
errorsmod "cosmossdk.io/errors"
cosmos_sdk_math "cosmossdk.io/math"
sdk "github.com/cosmos/cosmos-sdk/types"
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
commitmenttypes "github.com/elys-network/elys/x/commitment/types"
)
func (oq *Querier) queryDelegatorValidators(ctx sdk.Context, query *commitmenttypes.QueryValidatorsRequest) ([]byte, error) {
totalBonded := oq.stakingKeeper.TotalBondedTokens(ctx)
delegatorAddr, err := sdk.AccAddressFromBech32(query.DelegatorAddress)
if err != nil {
return nil, errorsmod.Wrap(err, "invalid delegator address")
}
validators := oq.stakingKeeper.GetDelegatorValidators(ctx, delegatorAddr, math.MaxInt16)
validatorsCW := oq.BuildDelegatorValidatorsResponseCW(ctx, validators, totalBonded, query.DelegatorAddress)
res := commitmenttypes.QueryDelegatorValidatorsResponse{
Validators: validatorsCW,
}
responseBytes, err := json.Marshal(res)
if err != nil {
return nil, errorsmod.Wrap(err, "failed to get delegation validator response")
}
return responseBytes, nil
}
func (oq *Querier) BuildDelegatorValidatorsResponseCW(ctx sdk.Context, validators []stakingtypes.Validator, totalBonded cosmos_sdk_math.Int, delegatorAddress string) []commitmenttypes.ValidatorDetail {
edenDenomPrice := sdk.ZeroDec()
baseCurrency, found := oq.assetKeeper.GetUsdcDenom(ctx)
if found {
edenDenomPrice = oq.ammKeeper.GetEdenDenomPrice(ctx, baseCurrency)
}
var validatorsCW []commitmenttypes.ValidatorDetail
for _, validator := range validators {
var validatorCW commitmenttypes.ValidatorDetail
validatorCW.Id = validator.Description.Identity
validatorCW.Address = validator.OperatorAddress
validatorCW.Name = validator.Description.Moniker
validatorCW.Commission = validator.GetCommission()
valAddress, err := sdk.ValAddressFromBech32(validator.OperatorAddress)
if err != nil {
continue
}
delAddress, err := sdk.AccAddressFromBech32(delegatorAddress)
if err != nil {
continue
}
delegations, _ := oq.stakingKeeper.GetDelegation(ctx, delAddress, valAddress)
shares := delegations.GetShares()
tokens := validator.TokensFromSharesTruncated(shares)
validatorCW.Staked = commitmenttypes.BalanceAvailable{
Amount: tokens.TruncateInt(),
UsdAmount: edenDenomPrice.Mul(tokens),
}
votingPower := sdk.NewDecFromInt(validator.Tokens).QuoInt(totalBonded).MulInt(sdk.NewInt(100))
validatorCW.VotingPower = votingPower
validatorsCW = append(validatorsCW, validatorCW)
}
return validatorsCW
}