-
Notifications
You must be signed in to change notification settings - Fork 3.5k
/
types.go
175 lines (141 loc) · 5.11 KB
/
types.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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
// Package v036 is used for legacy migration scripts. Actual migration scripts
// for v036 have been removed, but the v039->v042 migration script still
// references types from this file, so we're keeping it for now.
package v036
import (
"fmt"
"strings"
"github.com/cosmos/cosmos-sdk/codec"
v036gov "github.com/cosmos/cosmos-sdk/x/gov/legacy/v036"
)
const (
// ModuleName defines the name of the module
ModuleName = "params"
// RouterKey defines the routing key for a ParameterChangeProposal
RouterKey = "params"
)
const (
// ProposalTypeChange defines the type for a ParameterChangeProposal
ProposalTypeChange = "ParameterChange"
)
// Param module codespace constants
const (
DefaultCodespace = "params"
CodeUnknownSubspace = 1
CodeSettingParameter = 2
CodeEmptyData = 3
)
// Assert ParameterChangeProposal implements v036gov.Content at compile-time
var _ v036gov.Content = ParameterChangeProposal{}
// ParameterChangeProposal defines a proposal which contains multiple parameter
// changes.
type ParameterChangeProposal struct {
Title string `json:"title" yaml:"title"`
Description string `json:"description" yaml:"description"`
Changes []ParamChange `json:"changes" yaml:"changes"`
}
func NewParameterChangeProposal(title, description string, changes []ParamChange) ParameterChangeProposal {
return ParameterChangeProposal{title, description, changes}
}
// GetTitle returns the title of a parameter change proposal.
func (pcp ParameterChangeProposal) GetTitle() string { return pcp.Title }
// GetDescription returns the description of a parameter change proposal.
func (pcp ParameterChangeProposal) GetDescription() string { return pcp.Description }
// GetDescription returns the routing key of a parameter change proposal.
func (pcp ParameterChangeProposal) ProposalRoute() string { return RouterKey }
// ProposalType returns the type of a parameter change proposal.
func (pcp ParameterChangeProposal) ProposalType() string { return ProposalTypeChange }
// ValidateBasic validates the parameter change proposal
func (pcp ParameterChangeProposal) ValidateBasic() error {
err := v036gov.ValidateAbstract(pcp)
if err != nil {
return err
}
return ValidateChanges(pcp.Changes)
}
// String implements the Stringer interface.
func (pcp ParameterChangeProposal) String() string {
var b strings.Builder
b.WriteString(fmt.Sprintf(`Parameter Change Proposal:
Title: %s
Description: %s
Changes:
`, pcp.Title, pcp.Description))
for _, pc := range pcp.Changes {
b.WriteString(fmt.Sprintf(` Param Change:
Subspace: %s
Key: %s
Subkey: %X
Value: %X
`, pc.Subspace, pc.Key, pc.Subkey, pc.Value))
}
return b.String()
}
// ParamChange defines a parameter change.
type ParamChange struct {
Subspace string `json:"subspace" yaml:"subspace"`
Key string `json:"key" yaml:"key"`
Subkey string `json:"subkey,omitempty" yaml:"subkey,omitempty"`
Value string `json:"value" yaml:"value"`
}
func NewParamChange(subspace, key, value string) ParamChange {
return ParamChange{subspace, key, "", value}
}
func NewParamChangeWithSubkey(subspace, key, subkey, value string) ParamChange {
return ParamChange{subspace, key, subkey, value}
}
// String implements the Stringer interface.
func (pc ParamChange) String() string {
return fmt.Sprintf(`Param Change:
Subspace: %s
Key: %s
Subkey: %X
Value: %X
`, pc.Subspace, pc.Key, pc.Subkey, pc.Value)
}
// ValidateChange performs basic validation checks over a set of ParamChange. It
// returns an error if any ParamChange is invalid.
func ValidateChanges(changes []ParamChange) error {
if len(changes) == 0 {
return ErrEmptyChanges(DefaultCodespace)
}
for _, pc := range changes {
if len(pc.Subspace) == 0 {
return ErrEmptySubspace(DefaultCodespace)
}
if len(pc.Key) == 0 {
return ErrEmptyKey(DefaultCodespace)
}
if len(pc.Value) == 0 {
return ErrEmptyValue(DefaultCodespace)
}
}
return nil
}
// ErrUnknownSubspace returns an unknown subspace error.
func ErrUnknownSubspace(codespace string, space string) error {
return fmt.Errorf("unknown subspace %s", space)
}
// ErrSettingParameter returns an error for failing to set a parameter.
func ErrSettingParameter(codespace string, key, subkey, value, msg string) error {
return fmt.Errorf("error setting parameter %s on %s (%s): %s", value, key, subkey, msg)
}
// ErrEmptyChanges returns an error for empty parameter changes.
func ErrEmptyChanges(codespace string) error {
return fmt.Errorf("submitted parameter changes are empty")
}
// ErrEmptySubspace returns an error for an empty subspace.
func ErrEmptySubspace(codespace string) error {
return fmt.Errorf("parameter subspace is empty")
}
// ErrEmptyKey returns an error for when an empty key is given.
func ErrEmptyKey(codespace string) error {
return fmt.Errorf("parameter key is empty")
}
// ErrEmptyValue returns an error for when an empty key is given.
func ErrEmptyValue(codespace string) error {
return fmt.Errorf("parameter value is empty")
}
func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) {
cdc.RegisterConcrete(ParameterChangeProposal{}, "cosmos-sdk/ParameterChangeProposal", nil)
}