-
Notifications
You must be signed in to change notification settings - Fork 10
/
proposal.go
132 lines (110 loc) · 4.57 KB
/
proposal.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
package types
import (
"fmt"
"strings"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
)
type ProposalType string
const (
ProposalTypePromoteContract ProposalType = "PromoteToPrivilegedContract"
ProposalTypeDemoteContract ProposalType = "DemotePrivilegedContract"
)
// EnableAllProposals contains all twasm gov types as keys.
var EnableAllProposals = []ProposalType{
ProposalTypePromoteContract,
ProposalTypeDemoteContract,
}
func init() { // register new content types with the sdk
govtypes.RegisterProposalType(string(ProposalTypePromoteContract))
govtypes.RegisterProposalType(string(ProposalTypeDemoteContract))
govtypes.RegisterProposalTypeCodec(&PromoteToPrivilegedContractProposal{}, "twasm/PromoteToPrivilegedContractProposal")
govtypes.RegisterProposalTypeCodec(&DemotePrivilegedContractProposal{}, "twasm/DemotePrivilegedContractProposal")
}
// ProposalRoute returns the routing key of a parameter change proposal.
func (p PromoteToPrivilegedContractProposal) ProposalRoute() string { return RouterKey }
// GetTitle returns the title of the proposal
func (p *PromoteToPrivilegedContractProposal) GetTitle() string { return p.Title }
// GetDescription returns the human readable description of the proposal
func (p PromoteToPrivilegedContractProposal) GetDescription() string { return p.Description }
// ProposalType returns the type
func (p PromoteToPrivilegedContractProposal) ProposalType() string {
return string(ProposalTypePromoteContract)
}
// ValidateBasic validates the proposal
func (p PromoteToPrivilegedContractProposal) ValidateBasic() error {
if err := validateProposalCommons(p.Title, p.Description); err != nil {
return err
}
if _, err := sdk.AccAddressFromBech32(p.Contract); err != nil {
return sdkerrors.Wrap(err, "contract")
}
return nil
}
// String implements the Stringer interface.
func (p PromoteToPrivilegedContractProposal) String() string {
return fmt.Sprintf(`Store Code Proposal:
Title: %s
Description: %s
Contract: %s
`, p.Title, p.Description, p.Contract)
}
// MarshalYAML pretty prints the wasm byte code
func (p PromoteToPrivilegedContractProposal) MarshalYAML() (interface{}, error) {
return p, nil
}
// ProposalRoute returns the routing key of a parameter change proposal.
func (p DemotePrivilegedContractProposal) ProposalRoute() string { return RouterKey }
// GetTitle returns the title of the proposal
func (p *DemotePrivilegedContractProposal) GetTitle() string { return p.Title }
// GetDescription returns the human readable description of the proposal
func (p DemotePrivilegedContractProposal) GetDescription() string { return p.Description }
// ProposalType returns the type
func (p DemotePrivilegedContractProposal) ProposalType() string {
return string(ProposalTypeDemoteContract)
}
// ValidateBasic validates the proposal
func (p DemotePrivilegedContractProposal) ValidateBasic() error {
if err := validateProposalCommons(p.Title, p.Description); err != nil {
return err
}
if _, err := sdk.AccAddressFromBech32(p.Contract); err != nil {
return sdkerrors.Wrap(err, "contract")
}
return nil
}
// String implements the Stringer interface.
func (p DemotePrivilegedContractProposal) String() string {
return fmt.Sprintf(`Store Code Proposal:
Title: %s
Description: %s
Contract: %s
`, p.Title, p.Description, p.Contract)
}
// MarshalYAML pretty prints the wasm byte code
func (p DemotePrivilegedContractProposal) MarshalYAML() (interface{}, error) {
return p, nil
}
// common validations
func validateProposalCommons(title, description string) error {
if strings.TrimSpace(title) != title {
return sdkerrors.Wrap(govtypes.ErrInvalidProposalContent, "proposal title must not start/end with white spaces")
}
if len(title) == 0 {
return sdkerrors.Wrap(govtypes.ErrInvalidProposalContent, "proposal title cannot be blank")
}
if len(title) > govtypes.MaxTitleLength {
return sdkerrors.Wrapf(govtypes.ErrInvalidProposalContent, "proposal title is longer than max length of %d", govtypes.MaxTitleLength)
}
if strings.TrimSpace(description) != description {
return sdkerrors.Wrap(govtypes.ErrInvalidProposalContent, "proposal description must not start/end with white spaces")
}
if len(description) == 0 {
return sdkerrors.Wrap(govtypes.ErrInvalidProposalContent, "proposal description cannot be blank")
}
if len(description) > govtypes.MaxDescriptionLength {
return sdkerrors.Wrapf(govtypes.ErrInvalidProposalContent, "proposal description is longer than max length of %d", govtypes.MaxDescriptionLength)
}
return nil
}