-
Notifications
You must be signed in to change notification settings - Fork 3.5k
/
utils.go
127 lines (108 loc) · 3.6 KB
/
utils.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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package cli
import (
"encoding/json"
"errors"
"fmt"
"os"
errorsmod "cosmossdk.io/errors"
"cosmossdk.io/math"
"github.com/cosmos/cosmos-sdk/codec"
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
"github.com/cosmos/cosmos-sdk/x/staking/types"
)
// validator struct to define the fields of the validator
type validator struct {
Amount sdk.Coin
PubKey cryptotypes.PubKey
Moniker string
Identity string
Website string
Security string
Details string
CommissionRates types.CommissionRates
MinSelfDelegation math.Int
}
func parseAndValidateValidatorJSON(cdc codec.Codec, path string) (validator, error) {
type internalVal struct {
Amount string `json:"amount"`
PubKey json.RawMessage `json:"pubkey"`
Moniker string `json:"moniker"`
Identity string `json:"identity,omitempty"`
Website string `json:"website,omitempty"`
Security string `json:"security,omitempty"`
Details string `json:"details,omitempty"`
CommissionRate string `json:"commission-rate"`
CommissionMaxRate string `json:"commission-max-rate"`
CommissionMaxChange string `json:"commission-max-change-rate"`
MinSelfDelegation string `json:"min-self-delegation"`
}
contents, err := os.ReadFile(path)
if err != nil {
return validator{}, err
}
var v internalVal
err = json.Unmarshal(contents, &v)
if err != nil {
return validator{}, err
}
if v.Amount == "" {
return validator{}, fmt.Errorf("must specify amount of coins to bond")
}
amount, err := sdk.ParseCoinNormalized(v.Amount)
if err != nil {
return validator{}, err
}
if v.PubKey == nil {
return validator{}, fmt.Errorf("must specify the JSON encoded pubkey")
}
var pk cryptotypes.PubKey
if err := cdc.UnmarshalInterfaceJSON(v.PubKey, &pk); err != nil {
return validator{}, err
}
if v.Moniker == "" {
return validator{}, fmt.Errorf("must specify the moniker name")
}
commissionRates, err := buildCommissionRates(v.CommissionRate, v.CommissionMaxRate, v.CommissionMaxChange)
if err != nil {
return validator{}, err
}
if v.MinSelfDelegation == "" {
return validator{}, fmt.Errorf("must specify minimum self delegation")
}
minSelfDelegation, ok := math.NewIntFromString(v.MinSelfDelegation)
if !ok {
return validator{}, errorsmod.Wrap(sdkerrors.ErrInvalidRequest, "minimum self delegation must be a positive integer")
}
return validator{
Amount: amount,
PubKey: pk,
Moniker: v.Moniker,
Identity: v.Identity,
Website: v.Website,
Security: v.Security,
Details: v.Details,
CommissionRates: commissionRates,
MinSelfDelegation: minSelfDelegation,
}, nil
}
func buildCommissionRates(rateStr, maxRateStr, maxChangeRateStr string) (commission types.CommissionRates, err error) {
if rateStr == "" || maxRateStr == "" || maxChangeRateStr == "" {
return commission, errors.New("must specify all validator commission parameters")
}
rate, err := math.LegacyNewDecFromStr(rateStr)
if err != nil {
return commission, err
}
maxRate, err := math.LegacyNewDecFromStr(maxRateStr)
if err != nil {
return commission, err
}
maxChangeRate, err := math.LegacyNewDecFromStr(maxChangeRateStr)
if err != nil {
return commission, err
}
commission = types.NewCommissionRates(rate, maxRate, maxChangeRate)
return commission, nil
}