forked from cosmos/ibc-go
-
Notifications
You must be signed in to change notification settings - Fork 9
/
proposal.go
142 lines (114 loc) · 4.41 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
133
134
135
136
137
138
139
140
141
142
package types
import (
"fmt"
codectypes "github.com/line/lbm-sdk/codec/types"
sdkerrors "github.com/line/lbm-sdk/types/errors"
govtypes "github.com/line/lbm-sdk/x/gov/types"
upgradetypes "github.com/line/lbm-sdk/x/upgrade/types"
"github.com/line/ibc-go/v3/modules/core/exported"
)
const (
// ProposalTypeClientUpdate defines the type for a ClientUpdateProposal
ProposalTypeClientUpdate = "ClientUpdate"
ProposalTypeUpgrade = "IBCUpgrade"
)
var (
_ govtypes.Content = &ClientUpdateProposal{}
_ govtypes.Content = &UpgradeProposal{}
_ codectypes.UnpackInterfacesMessage = &UpgradeProposal{}
)
func init() {
govtypes.RegisterProposalType(ProposalTypeClientUpdate)
govtypes.RegisterProposalType(ProposalTypeUpgrade)
}
// NewClientUpdateProposal creates a new client update proposal.
func NewClientUpdateProposal(title, description, subjectClientID, substituteClientID string) govtypes.Content {
return &ClientUpdateProposal{
Title: title,
Description: description,
SubjectClientId: subjectClientID,
SubstituteClientId: substituteClientID,
}
}
// GetTitle returns the title of a client update proposal.
func (cup *ClientUpdateProposal) GetTitle() string { return cup.Title }
// GetDescription returns the description of a client update proposal.
func (cup *ClientUpdateProposal) GetDescription() string { return cup.Description }
// ProposalRoute returns the routing key of a client update proposal.
func (cup *ClientUpdateProposal) ProposalRoute() string { return RouterKey }
// ProposalType returns the type of a client update proposal.
func (cup *ClientUpdateProposal) ProposalType() string { return ProposalTypeClientUpdate }
// ValidateBasic runs basic stateless validity checks
func (cup *ClientUpdateProposal) ValidateBasic() error {
err := govtypes.ValidateAbstract(cup)
if err != nil {
return err
}
if cup.SubjectClientId == cup.SubstituteClientId {
return sdkerrors.Wrap(ErrInvalidSubstitute, "subject and substitute client identifiers are equal")
}
if _, _, err := ParseClientIdentifier(cup.SubjectClientId); err != nil {
return err
}
if _, _, err := ParseClientIdentifier(cup.SubstituteClientId); err != nil {
return err
}
return nil
}
// NewUpgradeProposal creates a new IBC breaking upgrade proposal.
func NewUpgradeProposal(title, description string, plan upgradetypes.Plan, upgradedClientState exported.ClientState) (govtypes.Content, error) {
any, err := PackClientState(upgradedClientState)
if err != nil {
return nil, err
}
return &UpgradeProposal{
Title: title,
Description: description,
Plan: plan,
UpgradedClientState: any,
}, nil
}
// GetTitle returns the title of a upgrade proposal.
func (up *UpgradeProposal) GetTitle() string { return up.Title }
// GetDescription returns the description of a upgrade proposal.
func (up *UpgradeProposal) GetDescription() string { return up.Description }
// ProposalRoute returns the routing key of a upgrade proposal.
func (up *UpgradeProposal) ProposalRoute() string { return RouterKey }
// ProposalType returns the upgrade proposal type.
func (up *UpgradeProposal) ProposalType() string { return ProposalTypeUpgrade }
// ValidateBasic runs basic stateless validity checks
func (up *UpgradeProposal) ValidateBasic() error {
if err := govtypes.ValidateAbstract(up); err != nil {
return err
}
if err := up.Plan.ValidateBasic(); err != nil {
return err
}
if up.UpgradedClientState == nil {
return sdkerrors.Wrap(ErrInvalidUpgradeProposal, "upgraded client state cannot be nil")
}
_, err := UnpackClientState(up.UpgradedClientState)
if err != nil {
return sdkerrors.Wrap(err, "failed to unpack upgraded client state")
}
return nil
}
// String returns the string representation of the UpgradeProposal.
func (up UpgradeProposal) String() string {
var upgradedClientStr string
upgradedClient, err := UnpackClientState(up.UpgradedClientState)
if err != nil {
upgradedClientStr = "invalid IBC Client State"
} else {
upgradedClientStr = upgradedClient.String()
}
return fmt.Sprintf(`IBC Upgrade Proposal
Title: %s
Description: %s
%s
Upgraded IBC Client: %s`, up.Title, up.Description, up.Plan, upgradedClientStr)
}
// UnpackInterfaces implements UnpackInterfacesMessage.UnpackInterfaces
func (up UpgradeProposal) UnpackInterfaces(unpacker codectypes.AnyUnpacker) error {
return unpacker.UnpackAny(up.UpgradedClientState, new(exported.ClientState))
}