Skip to content
This repository was archived by the owner on Apr 10, 2026. It is now read-only.

Commit e1c8740

Browse files
jtieriagouin
andauthored
Handle closing of channels (#863)
* WIP: handle closing ordered channels * treat ordered timeouts as different packet flows ending with channel close confirm * cleanup * remove dead code and cleanup `orderFromString` * purge relevant packet flow messages in the case of a channel closing for ordered channels * remove incorrect code * properly purge the relevant send packet and timeout messages * update comments + delete the relevant messages for the src and counterparty * fix deleting messages on wrong channel end * improve readability Co-authored-by: Andrew Gouin <andrew@gouin.io>
1 parent 234c886 commit e1c8740

4 files changed

Lines changed: 170 additions & 48 deletions

File tree

relayer/chains/cosmos/message_handlers.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ func (ccp *CosmosChainProcessor) handleChannelMessage(eventType string, ci provi
6161
ccp.channelStateCache[channelKey] = false
6262
case chantypes.EventTypeChannelOpenAck, chantypes.EventTypeChannelOpenConfirm:
6363
ccp.channelStateCache[channelKey] = true
64-
case chantypes.EventTypeChannelCloseInit, chantypes.EventTypeChannelCloseConfirm:
64+
case chantypes.EventTypeChannelCloseConfirm:
6565
for k := range ccp.channelStateCache {
6666
if k.PortID == ci.PortID && k.ChannelID == ci.ChannelID {
6767
ccp.channelStateCache[k] = false

relayer/processor/path_end_runtime.go

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,9 @@ func (pathEnd *pathEndRuntime) shouldSendChannelMessage(message channelIBCMessag
482482
// remove all retention of this connection handshake in pathEnd.messagesCache.ConnectionHandshake and counterparty
483483
toDelete := make(map[string][]ChannelKey)
484484
toDeleteCounterparty := make(map[string][]ChannelKey)
485+
toDeletePacket := make(map[string][]uint64)
486+
toDeleteCounterpartyPacket := make(map[string][]uint64)
487+
485488
counterpartyKey := channelKey.Counterparty()
486489
switch eventType {
487490
case chantypes.EventTypeChannelOpenTry:
@@ -493,9 +496,39 @@ func (pathEnd *pathEndRuntime) shouldSendChannelMessage(message channelIBCMessag
493496
toDeleteCounterparty[chantypes.EventTypeChannelOpenAck] = []ChannelKey{counterpartyKey}
494497
toDelete[chantypes.EventTypeChannelOpenTry] = []ChannelKey{channelKey}
495498
toDeleteCounterparty[chantypes.EventTypeChannelOpenInit] = []ChannelKey{counterpartyKey.msgInitKey()}
499+
case chantypes.EventTypeChannelCloseConfirm:
500+
toDeleteCounterparty[chantypes.EventTypeChannelCloseInit] = []ChannelKey{counterpartyKey}
501+
toDelete[chantypes.EventTypeChannelCloseConfirm] = []ChannelKey{channelKey}
502+
503+
// Gather relevant send packet messages, for this channel key, that should be deleted if we
504+
// are operating on an ordered channel.
505+
if messageCache, ok := pathEnd.messageCache.PacketFlow[channelKey]; ok {
506+
if seqCache, ok := messageCache[chantypes.EventTypeSendPacket]; ok {
507+
for seq, packetInfo := range seqCache {
508+
if packetInfo.ChannelOrder == chantypes.ORDERED.String() {
509+
toDeletePacket[chantypes.EventTypeSendPacket] = append(toDeletePacket[chantypes.EventTypeSendPacket], seq)
510+
}
511+
}
512+
}
513+
}
514+
515+
// Gather relevant timeout messages, for this counterparty channel key, that should be deleted if we
516+
// are operating on an ordered channel.
517+
if messageCache, ok := counterparty.messageCache.PacketFlow[counterpartyKey]; ok {
518+
if seqCache, ok := messageCache[chantypes.EventTypeTimeoutPacket]; ok {
519+
for seq, packetInfo := range seqCache {
520+
if packetInfo.ChannelOrder == chantypes.ORDERED.String() {
521+
toDeleteCounterpartyPacket[chantypes.EventTypeTimeoutPacket] = append(toDeleteCounterpartyPacket[chantypes.EventTypeTimeoutPacket], seq)
522+
}
523+
}
524+
}
525+
}
496526
}
527+
497528
// delete in progress send for this specific message
498-
pathEnd.channelProcessing.deleteMessages(map[string][]ChannelKey{eventType: []ChannelKey{channelKey}})
529+
pathEnd.channelProcessing.deleteMessages(map[string][]ChannelKey{eventType: {channelKey}})
530+
pathEnd.messageCache.PacketFlow[channelKey].DeleteMessages(toDeletePacket)
531+
counterparty.messageCache.PacketFlow[counterpartyKey].DeleteMessages(toDeleteCounterpartyPacket)
499532

500533
// delete all connection handshake retention history for this channel
501534
pathEnd.messageCache.ChannelHandshake.DeleteMessages(toDelete)

relayer/processor/path_processor_internal.go

Lines changed: 107 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,9 @@ func (pp *PathProcessor) assemblePacketIBCMessage(
3535

3636
func (pp *PathProcessor) getUnrelayedPacketsAndAcksAndToDelete(ctx context.Context, pathEndPacketFlowMessages pathEndPacketFlowMessages) pathEndPacketFlowResponse {
3737
res := pathEndPacketFlowResponse{
38-
ToDeleteSrc: make(map[string][]uint64),
39-
ToDeleteDst: make(map[string][]uint64),
38+
ToDeleteSrc: make(map[string][]uint64),
39+
ToDeleteDst: make(map[string][]uint64),
40+
ToDeleteDstChannel: make(map[string][]ChannelKey),
4041
}
4142

4243
MsgTransferLoop:
@@ -51,12 +52,42 @@ MsgTransferLoop:
5152
continue MsgTransferLoop
5253
}
5354
}
54-
for timeoutSeq := range pathEndPacketFlowMessages.SrcMsgTimeout {
55+
56+
for timeoutSeq, msgTimeout := range pathEndPacketFlowMessages.SrcMsgTimeout {
5557
if transferSeq == timeoutSeq {
56-
// we have a timeout for this packet, so packet flow is complete
57-
// remove all retention of this sequence number
58-
res.ToDeleteSrc[chantypes.EventTypeSendPacket] = append(res.ToDeleteSrc[chantypes.EventTypeSendPacket], transferSeq)
59-
res.ToDeleteSrc[chantypes.EventTypeTimeoutPacket] = append(res.ToDeleteSrc[chantypes.EventTypeTimeoutPacket], transferSeq)
58+
if msgTimeout.ChannelOrder == chantypes.ORDERED.String() {
59+
// For ordered channel packets, flow is not done until channel-close-confirm is observed.
60+
if pathEndPacketFlowMessages.DstMsgChannelCloseConfirm == nil {
61+
// have not observed a channel-close-confirm yet for this channel, send it if ready.
62+
// will come back through here next block if not yet ready.
63+
closeChan := channelIBCMessage{
64+
eventType: chantypes.EventTypeChannelCloseConfirm,
65+
info: provider.ChannelInfo{
66+
Height: msgTimeout.Height,
67+
PortID: msgTimeout.SourcePort,
68+
ChannelID: msgTimeout.SourceChannel,
69+
CounterpartyPortID: msgTimeout.DestPort,
70+
CounterpartyChannelID: msgTimeout.DestChannel,
71+
Order: orderFromString(msgTimeout.ChannelOrder),
72+
},
73+
}
74+
75+
if pathEndPacketFlowMessages.Src.shouldSendChannelMessage(closeChan, pathEndPacketFlowMessages.Dst) {
76+
res.DstChannelMessage = append(res.DstChannelMessage, closeChan)
77+
}
78+
} else {
79+
// ordered channel, and we have a channel close confirm, so packet-flow and channel-close-flow is complete.
80+
// remove all retention of this sequence number and this channel-close-confirm.
81+
res.ToDeleteDstChannel[chantypes.EventTypeChannelCloseConfirm] = append(res.ToDeleteDstChannel[chantypes.EventTypeChannelCloseConfirm], pathEndPacketFlowMessages.ChannelKey.Counterparty())
82+
res.ToDeleteSrc[chantypes.EventTypeSendPacket] = append(res.ToDeleteSrc[chantypes.EventTypeSendPacket], transferSeq)
83+
res.ToDeleteSrc[chantypes.EventTypeTimeoutPacket] = append(res.ToDeleteSrc[chantypes.EventTypeTimeoutPacket], transferSeq)
84+
}
85+
} else {
86+
// unordered channel, and we have a timeout for this packet, so packet flow is complete
87+
// remove all retention of this sequence number
88+
res.ToDeleteSrc[chantypes.EventTypeSendPacket] = append(res.ToDeleteSrc[chantypes.EventTypeSendPacket], transferSeq)
89+
res.ToDeleteSrc[chantypes.EventTypeTimeoutPacket] = append(res.ToDeleteSrc[chantypes.EventTypeTimeoutPacket], transferSeq)
90+
}
6091
continue MsgTransferLoop
6192
}
6293
}
@@ -128,9 +159,18 @@ MsgTransferLoop:
128159
res.ToDeleteDst[chantypes.EventTypeRecvPacket] = append(res.ToDeleteDst[chantypes.EventTypeRecvPacket], ackSeq)
129160
res.ToDeleteSrc[chantypes.EventTypeAcknowledgePacket] = append(res.ToDeleteSrc[chantypes.EventTypeAcknowledgePacket], ackSeq)
130161
}
131-
for timeoutSeq := range pathEndPacketFlowMessages.SrcMsgTimeout {
132-
res.ToDeleteSrc[chantypes.EventTypeSendPacket] = append(res.ToDeleteSrc[chantypes.EventTypeSendPacket], timeoutSeq)
133-
res.ToDeleteSrc[chantypes.EventTypeTimeoutPacket] = append(res.ToDeleteSrc[chantypes.EventTypeTimeoutPacket], timeoutSeq)
162+
for timeoutSeq, msgTimeout := range pathEndPacketFlowMessages.SrcMsgTimeout {
163+
if msgTimeout.ChannelOrder == chantypes.ORDERED.String() {
164+
if pathEndPacketFlowMessages.DstMsgChannelCloseConfirm != nil {
165+
// For ordered channel packets, flow is not done until channel-close-confirm is observed.
166+
res.ToDeleteDstChannel[chantypes.EventTypeChannelCloseConfirm] = append(res.ToDeleteDstChannel[chantypes.EventTypeChannelCloseConfirm], pathEndPacketFlowMessages.ChannelKey.Counterparty())
167+
res.ToDeleteSrc[chantypes.EventTypeSendPacket] = append(res.ToDeleteSrc[chantypes.EventTypeSendPacket], timeoutSeq)
168+
res.ToDeleteSrc[chantypes.EventTypeTimeoutPacket] = append(res.ToDeleteSrc[chantypes.EventTypeTimeoutPacket], timeoutSeq)
169+
}
170+
} else {
171+
res.ToDeleteSrc[chantypes.EventTypeSendPacket] = append(res.ToDeleteSrc[chantypes.EventTypeSendPacket], timeoutSeq)
172+
res.ToDeleteSrc[chantypes.EventTypeTimeoutPacket] = append(res.ToDeleteSrc[chantypes.EventTypeTimeoutPacket], timeoutSeq)
173+
}
134174
}
135175
for timeoutOnCloseSeq := range pathEndPacketFlowMessages.SrcMsgTimeoutOnClose {
136176
res.ToDeleteSrc[chantypes.EventTypeSendPacket] = append(res.ToDeleteSrc[chantypes.EventTypeSendPacket], timeoutOnCloseSeq)
@@ -512,25 +552,41 @@ func (pp *PathProcessor) processLatestMessages(ctx context.Context, messageLifec
512552
pathEnd2ProcessRes := make([]pathEndPacketFlowResponse, len(channelPairs))
513553

514554
for i, pair := range channelPairs {
555+
var pathEnd1ChannelCloseConfirm, pathEnd2ChannelCloseConfirm *provider.ChannelInfo
556+
557+
if pathEnd1ChanCloseConfirmMsgs, ok := pp.pathEnd1.messageCache.ChannelHandshake[chantypes.EventTypeChannelCloseConfirm]; ok {
558+
if pathEnd1ChannelCloseConfirmMsg, ok := pathEnd1ChanCloseConfirmMsgs[pair.pathEnd1ChannelKey]; ok {
559+
pathEnd1ChannelCloseConfirm = &pathEnd1ChannelCloseConfirmMsg
560+
}
561+
}
562+
563+
if pathEnd2ChanCloseConfirmMsgs, ok := pp.pathEnd2.messageCache.ChannelHandshake[chantypes.EventTypeChannelCloseConfirm]; ok {
564+
if pathEnd2ChannelCloseConfirmMsg, ok := pathEnd2ChanCloseConfirmMsgs[pair.pathEnd2ChannelKey]; ok {
565+
pathEnd2ChannelCloseConfirm = &pathEnd2ChannelCloseConfirmMsg
566+
}
567+
}
568+
515569
pathEnd1PacketFlowMessages := pathEndPacketFlowMessages{
516-
Src: pp.pathEnd1,
517-
Dst: pp.pathEnd2,
518-
ChannelKey: pair.pathEnd1ChannelKey,
519-
SrcMsgTransfer: pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][chantypes.EventTypeSendPacket],
520-
DstMsgRecvPacket: pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd2ChannelKey][chantypes.EventTypeRecvPacket],
521-
SrcMsgAcknowledgement: pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][chantypes.EventTypeAcknowledgePacket],
522-
SrcMsgTimeout: pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][chantypes.EventTypeTimeoutPacket],
523-
SrcMsgTimeoutOnClose: pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][chantypes.EventTypeTimeoutPacketOnClose],
570+
Src: pp.pathEnd1,
571+
Dst: pp.pathEnd2,
572+
ChannelKey: pair.pathEnd1ChannelKey,
573+
SrcMsgTransfer: pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][chantypes.EventTypeSendPacket],
574+
DstMsgRecvPacket: pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd2ChannelKey][chantypes.EventTypeRecvPacket],
575+
SrcMsgAcknowledgement: pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][chantypes.EventTypeAcknowledgePacket],
576+
SrcMsgTimeout: pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][chantypes.EventTypeTimeoutPacket],
577+
SrcMsgTimeoutOnClose: pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][chantypes.EventTypeTimeoutPacketOnClose],
578+
DstMsgChannelCloseConfirm: pathEnd2ChannelCloseConfirm,
524579
}
525580
pathEnd2PacketFlowMessages := pathEndPacketFlowMessages{
526-
Src: pp.pathEnd2,
527-
Dst: pp.pathEnd1,
528-
ChannelKey: pair.pathEnd2ChannelKey,
529-
SrcMsgTransfer: pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd2ChannelKey][chantypes.EventTypeSendPacket],
530-
DstMsgRecvPacket: pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][chantypes.EventTypeRecvPacket],
531-
SrcMsgAcknowledgement: pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd2ChannelKey][chantypes.EventTypeAcknowledgePacket],
532-
SrcMsgTimeout: pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd2ChannelKey][chantypes.EventTypeTimeoutPacket],
533-
SrcMsgTimeoutOnClose: pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd2ChannelKey][chantypes.EventTypeTimeoutPacketOnClose],
581+
Src: pp.pathEnd2,
582+
Dst: pp.pathEnd1,
583+
ChannelKey: pair.pathEnd2ChannelKey,
584+
SrcMsgTransfer: pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd2ChannelKey][chantypes.EventTypeSendPacket],
585+
DstMsgRecvPacket: pp.pathEnd1.messageCache.PacketFlow[pair.pathEnd1ChannelKey][chantypes.EventTypeRecvPacket],
586+
SrcMsgAcknowledgement: pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd2ChannelKey][chantypes.EventTypeAcknowledgePacket],
587+
SrcMsgTimeout: pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd2ChannelKey][chantypes.EventTypeTimeoutPacket],
588+
SrcMsgTimeoutOnClose: pp.pathEnd2.messageCache.PacketFlow[pair.pathEnd2ChannelKey][chantypes.EventTypeTimeoutPacketOnClose],
589+
DstMsgChannelCloseConfirm: pathEnd1ChannelCloseConfirm,
534590
}
535591

536592
pathEnd1ProcessRes[i] = pp.getUnrelayedPacketsAndAcksAndToDelete(ctx, pathEnd1PacketFlowMessages)
@@ -540,7 +596,10 @@ func (pp *PathProcessor) processLatestMessages(ctx context.Context, messageLifec
540596
// concatenate applicable messages for pathend
541597
pathEnd1ConnectionMessages, pathEnd2ConnectionMessages := pp.connectionMessagesToSend(pathEnd1ConnectionHandshakeRes, pathEnd2ConnectionHandshakeRes)
542598
pathEnd1ChannelMessages, pathEnd2ChannelMessages := pp.channelMessagesToSend(pathEnd1ChannelHandshakeRes, pathEnd2ChannelHandshakeRes)
543-
pathEnd1PacketMessages, pathEnd2PacketMessages := pp.packetMessagesToSend(channelPairs, pathEnd1ProcessRes, pathEnd2ProcessRes)
599+
600+
pathEnd1PacketMessages, pathEnd2PacketMessages, pathEnd1ChanCloseMessages, pathEnd2ChanCloseMessages := pp.packetMessagesToSend(channelPairs, pathEnd1ProcessRes, pathEnd2ProcessRes)
601+
pathEnd1ChannelMessages = append(pathEnd1ChannelMessages, pathEnd1ChanCloseMessages...)
602+
pathEnd2ChannelMessages = append(pathEnd2ChannelMessages, pathEnd2ChanCloseMessages...)
544603

545604
pathEnd1Messages := pathEndMessages{
546605
connectionMessages: pathEnd1ConnectionMessages,
@@ -626,6 +685,7 @@ func (pp *PathProcessor) assembleMessage(
626685
return
627686
}
628687
om.Append(message)
688+
629689
}
630690

631691
func (pp *PathProcessor) assembleAndSendMessages(
@@ -869,29 +929,47 @@ func (pp *PathProcessor) connectionMessagesToSend(pathEnd1ConnectionHandshakeRes
869929
return pathEnd1ConnectionMessages, pathEnd2ConnectionMessages
870930
}
871931

872-
func (pp *PathProcessor) packetMessagesToSend(channelPairs []channelPair, pathEnd1ProcessRes []pathEndPacketFlowResponse, pathEnd2ProcessRes []pathEndPacketFlowResponse) ([]packetIBCMessage, []packetIBCMessage) {
932+
func (pp *PathProcessor) packetMessagesToSend(
933+
channelPairs []channelPair,
934+
pathEnd1ProcessRes []pathEndPacketFlowResponse,
935+
pathEnd2ProcessRes []pathEndPacketFlowResponse,
936+
) ([]packetIBCMessage, []packetIBCMessage, []channelIBCMessage, []channelIBCMessage) {
873937
pathEnd1PacketLen := 0
874938
pathEnd2PacketLen := 0
939+
pathEnd1ChannelLen := 0
940+
pathEnd2ChannelLen := 0
941+
875942
for i := 0; i < len(channelPairs); i++ {
876943
pathEnd1PacketLen += len(pathEnd2ProcessRes[i].DstMessages) + len(pathEnd1ProcessRes[i].SrcMessages)
877944
pathEnd2PacketLen += len(pathEnd1ProcessRes[i].DstMessages) + len(pathEnd2ProcessRes[i].SrcMessages)
945+
pathEnd1ChannelLen += len(pathEnd2ProcessRes[i].DstChannelMessage)
946+
pathEnd2ChannelLen += len(pathEnd1ProcessRes[i].DstChannelMessage)
878947
}
879948

880949
pathEnd1PacketMessages := make([]packetIBCMessage, 0, pathEnd1PacketLen)
881950
pathEnd2PacketMessages := make([]packetIBCMessage, 0, pathEnd2PacketLen)
882951

952+
pathEnd1ChannelMessage := make([]channelIBCMessage, 0, pathEnd1ChannelLen)
953+
pathEnd2ChannelMessage := make([]channelIBCMessage, 0, pathEnd2ChannelLen)
954+
883955
for i, channelPair := range channelPairs {
884956
pathEnd1PacketMessages = append(pathEnd1PacketMessages, pathEnd2ProcessRes[i].DstMessages...)
885957
pathEnd1PacketMessages = append(pathEnd1PacketMessages, pathEnd1ProcessRes[i].SrcMessages...)
886958

887959
pathEnd2PacketMessages = append(pathEnd2PacketMessages, pathEnd1ProcessRes[i].DstMessages...)
888960
pathEnd2PacketMessages = append(pathEnd2PacketMessages, pathEnd2ProcessRes[i].SrcMessages...)
889961

962+
pathEnd1ChannelMessage = append(pathEnd1ChannelMessage, pathEnd2ProcessRes[i].DstChannelMessage...)
963+
pathEnd2ChannelMessage = append(pathEnd2ChannelMessage, pathEnd1ProcessRes[i].DstChannelMessage...)
964+
965+
pp.pathEnd1.messageCache.ChannelHandshake.DeleteMessages(pathEnd2ProcessRes[i].ToDeleteDstChannel)
966+
pp.pathEnd2.messageCache.ChannelHandshake.DeleteMessages(pathEnd1ProcessRes[i].ToDeleteDstChannel)
967+
890968
pp.pathEnd1.messageCache.PacketFlow[channelPair.pathEnd1ChannelKey].DeleteMessages(pathEnd1ProcessRes[i].ToDeleteSrc, pathEnd2ProcessRes[i].ToDeleteDst)
891969
pp.pathEnd2.messageCache.PacketFlow[channelPair.pathEnd2ChannelKey].DeleteMessages(pathEnd2ProcessRes[i].ToDeleteSrc, pathEnd1ProcessRes[i].ToDeleteDst)
892970
pp.pathEnd1.packetProcessing[channelPair.pathEnd1ChannelKey].deleteMessages(pathEnd1ProcessRes[i].ToDeleteSrc, pathEnd2ProcessRes[i].ToDeleteDst)
893971
pp.pathEnd2.packetProcessing[channelPair.pathEnd2ChannelKey].deleteMessages(pathEnd2ProcessRes[i].ToDeleteSrc, pathEnd1ProcessRes[i].ToDeleteDst)
894972
}
895973

896-
return pathEnd1PacketMessages, pathEnd2PacketMessages
974+
return pathEnd1PacketMessages, pathEnd2PacketMessages, pathEnd1ChannelMessage, pathEnd2ChannelMessage
897975
}

relayer/processor/types_internal.go

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package processor
22

33
import (
4+
"strings"
45
"sync"
56

7+
chantypes "github.com/cosmos/ibc-go/v4/modules/core/04-channel/types"
68
"github.com/cosmos/relayer/v2/relayer/provider"
79
)
810

@@ -101,14 +103,15 @@ func (c connectionProcessingCache) deleteMessages(toDelete ...map[string][]Conne
101103
// contains MsgRecvPacket from counterparty
102104
// entire packet flow
103105
type pathEndPacketFlowMessages struct {
104-
Src *pathEndRuntime
105-
Dst *pathEndRuntime
106-
ChannelKey ChannelKey
107-
SrcMsgTransfer PacketSequenceCache
108-
DstMsgRecvPacket PacketSequenceCache
109-
SrcMsgAcknowledgement PacketSequenceCache
110-
SrcMsgTimeout PacketSequenceCache
111-
SrcMsgTimeoutOnClose PacketSequenceCache
106+
Src *pathEndRuntime
107+
Dst *pathEndRuntime
108+
ChannelKey ChannelKey
109+
SrcMsgTransfer PacketSequenceCache
110+
DstMsgRecvPacket PacketSequenceCache
111+
SrcMsgAcknowledgement PacketSequenceCache
112+
SrcMsgTimeout PacketSequenceCache
113+
SrcMsgTimeoutOnClose PacketSequenceCache
114+
DstMsgChannelCloseConfirm *provider.ChannelInfo
112115
}
113116

114117
type pathEndConnectionHandshakeMessages struct {
@@ -129,19 +132,15 @@ type pathEndChannelHandshakeMessages struct {
129132
DstMsgChannelOpenConfirm ChannelMessageCache
130133
}
131134

132-
type pathEndChannelCloseMessages struct {
133-
Src *pathEndRuntime
134-
Dst *pathEndRuntime
135-
SrcMsgChannelCloseInit ChannelMessageCache
136-
DstMsgChannelCloseConfirm ChannelMessageCache
137-
}
138-
139135
type pathEndPacketFlowResponse struct {
140136
SrcMessages []packetIBCMessage
141137
DstMessages []packetIBCMessage
142138

143-
ToDeleteSrc map[string][]uint64
144-
ToDeleteDst map[string][]uint64
139+
DstChannelMessage []channelIBCMessage
140+
141+
ToDeleteSrc map[string][]uint64
142+
ToDeleteDst map[string][]uint64
143+
ToDeleteDstChannel map[string][]ChannelKey
145144
}
146145

147146
type pathEndChannelHandshakeResponse struct {
@@ -220,3 +219,15 @@ type channelMessageToTrack struct {
220219
msg channelIBCMessage
221220
assembled bool
222221
}
222+
223+
// orderFromString parses a string into a channel order byte.
224+
func orderFromString(order string) chantypes.Order {
225+
switch strings.ToUpper(order) {
226+
case chantypes.UNORDERED.String():
227+
return chantypes.UNORDERED
228+
case chantypes.ORDERED.String():
229+
return chantypes.ORDERED
230+
default:
231+
return chantypes.NONE
232+
}
233+
}

0 commit comments

Comments
 (0)