-
Notifications
You must be signed in to change notification settings - Fork 563
/
channel.go
138 lines (120 loc) · 3.77 KB
/
channel.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
package types
import (
errorsmod "cosmossdk.io/errors"
host "github.com/cosmos/ibc-go/v8/modules/core/24-host"
"github.com/cosmos/ibc-go/v8/modules/core/exported"
)
var (
_ exported.ChannelI = (*Channel)(nil)
_ exported.CounterpartyChannelI = (*Counterparty)(nil)
)
// NewChannel creates a new Channel instance
func NewChannel(
state State, ordering Order, counterparty Counterparty,
hops []string, version string,
) Channel {
return Channel{
State: state,
Ordering: ordering,
Counterparty: counterparty,
ConnectionHops: hops,
Version: version,
}
}
// GetState implements Channel interface.
func (ch Channel) GetState() int32 {
return int32(ch.State)
}
// GetOrdering implements Channel interface.
func (ch Channel) GetOrdering() int32 {
return int32(ch.Ordering)
}
// GetCounterparty implements Channel interface.
func (ch Channel) GetCounterparty() exported.CounterpartyChannelI {
return ch.Counterparty
}
// GetConnectionHops implements Channel interface.
func (ch Channel) GetConnectionHops() []string {
return ch.ConnectionHops
}
// GetVersion implements Channel interface.
func (ch Channel) GetVersion() string {
return ch.Version
}
// IsOpen returns true if the channel state is OPEN
func (ch Channel) IsOpen() bool {
return ch.State == OPEN
}
// IsClosed returns true if the channel state is CLOSED
func (ch Channel) IsClosed() bool {
return ch.State == CLOSED
}
// ValidateBasic performs a basic validation of the channel fields
func (ch Channel) ValidateBasic() error {
if ch.State == UNINITIALIZED {
return ErrInvalidChannelState
}
if !(ch.Ordering == ORDERED || ch.Ordering == UNORDERED) {
return errorsmod.Wrap(ErrInvalidChannelOrdering, ch.Ordering.String())
}
if len(ch.ConnectionHops) != 1 {
return errorsmod.Wrap(
ErrTooManyConnectionHops,
"current IBC version only supports one connection hop",
)
}
if err := host.ConnectionIdentifierValidator(ch.ConnectionHops[0]); err != nil {
return errorsmod.Wrap(err, "invalid connection hop ID")
}
return ch.Counterparty.ValidateBasic()
}
// NewCounterparty returns a new Counterparty instance
func NewCounterparty(portID, channelID string) Counterparty {
return Counterparty{
PortId: portID,
ChannelId: channelID,
}
}
// GetPortID implements CounterpartyChannelI interface
func (c Counterparty) GetPortID() string {
return c.PortId
}
// GetChannelID implements CounterpartyChannelI interface
func (c Counterparty) GetChannelID() string {
return c.ChannelId
}
// ValidateBasic performs a basic validation check of the identifiers
func (c Counterparty) ValidateBasic() error {
if err := host.PortIdentifierValidator(c.PortId); err != nil {
return errorsmod.Wrap(err, "invalid counterparty port ID")
}
if c.ChannelId != "" {
if err := host.ChannelIdentifierValidator(c.ChannelId); err != nil {
return errorsmod.Wrap(err, "invalid counterparty channel ID")
}
}
return nil
}
// NewIdentifiedChannel creates a new IdentifiedChannel instance
func NewIdentifiedChannel(portID, channelID string, ch Channel) IdentifiedChannel {
return IdentifiedChannel{
State: ch.State,
Ordering: ch.Ordering,
Counterparty: ch.Counterparty,
ConnectionHops: ch.ConnectionHops,
Version: ch.Version,
PortId: portID,
ChannelId: channelID,
}
}
// ValidateBasic performs a basic validation of the identifiers and channel fields.
func (ic IdentifiedChannel) ValidateBasic() error {
if err := host.ChannelIdentifierValidator(ic.ChannelId); err != nil {
return errorsmod.Wrap(err, "invalid channel ID")
}
if err := host.PortIdentifierValidator(ic.PortId); err != nil {
return errorsmod.Wrap(err, "invalid port ID")
}
channel := NewChannel(ic.State, ic.Ordering, ic.Counterparty, ic.ConnectionHops, ic.Version)
return channel.ValidateBasic()
}