Skip to content

Commit 47e1776

Browse files
ancazamfirromac
andauthored
Process ChanCloseInit in relayer loop (start command) (#623)
* listen and act on CloseInitChannel event * Fix e2e/run.py * Decode TimeoutOnClosePacket event and more event cleanup. * Handle the case where the destination client advances after event but before the processing finishes. * Minor stylistic changes * more sylistic changes * Exit when both ends of channel are Closed * update changelog * use crate names in changelog * clippy warnings Co-authored-by: Romain Ruetschi <[email protected]>
1 parent b654af3 commit 47e1776

File tree

10 files changed

+452
-213
lines changed

10 files changed

+452
-213
lines changed

CHANGELOG.md

+108-64
Large diffs are not rendered by default.

e2e/e2e/packet.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def args(self) -> List[str]:
3232
return [self.src_chain_id, self.dst_chain_id, self.src_port, self.src_channel, "9999", "1000"]
3333

3434
def process(self, result: Any) -> TxPacketSendRes:
35-
entry = find_entry(result, 'SendPacketChannel')
35+
entry = find_entry(result, 'SendPacket')
3636
return from_dict(TxPacketSendRes, entry)
3737

3838
# -----------------------------------------------------------------------------
@@ -57,7 +57,7 @@ def args(self) -> List[str]:
5757
return [self.dst_chain_id, self.src_chain_id, self.src_port, self.src_channel]
5858

5959
def process(self, result: Any) -> TxPacketRecvRes:
60-
entry = find_entry(result, 'WriteAcknowledgementChannel')
60+
entry = find_entry(result, 'WriteAcknowledgement')
6161
return from_dict(TxPacketRecvRes, entry)
6262

6363
# -----------------------------------------------------------------------------
@@ -81,7 +81,7 @@ def args(self) -> List[str]:
8181
return [self.dst_chain_id, self.src_chain_id, self.src_port, self.src_channel]
8282

8383
def process(self, result: Any) -> TxPacketAckRes:
84-
entry = find_entry(result, 'AcknowledgePacketChannel')
84+
entry = find_entry(result, 'AcknowledgePacket')
8585
return from_dict(TxPacketAckRes, entry)
8686

8787
# =============================================================================

modules/src/events.rs

+33-20
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,12 @@ pub enum IBCEvent {
5454
CloseInitChannel(ChannelEvents::CloseInit),
5555
CloseConfirmChannel(ChannelEvents::CloseConfirm),
5656

57-
SendPacketChannel(ChannelEvents::SendPacket),
58-
ReceivePacketChannel(ChannelEvents::ReceivePacket),
59-
WriteAcknowledgementChannel(ChannelEvents::WriteAcknowledgement),
60-
AcknowledgePacketChannel(ChannelEvents::AcknowledgePacket),
61-
TimeoutPacketChannel(ChannelEvents::TimeoutPacket),
57+
SendPacket(ChannelEvents::SendPacket),
58+
ReceivePacket(ChannelEvents::ReceivePacket),
59+
WriteAcknowledgement(ChannelEvents::WriteAcknowledgement),
60+
AcknowledgePacket(ChannelEvents::AcknowledgePacket),
61+
TimeoutPacket(ChannelEvents::TimeoutPacket),
62+
TimeoutOnClosePacket(ChannelEvents::TimeoutOnClosePacket),
6263

6364
TimeoutTransfer(TransferEvents::Timeout),
6465
PacketTransfer(TransferEvents::Packet),
@@ -87,37 +88,42 @@ impl IBCEvent {
8788
serde_json::to_string(self).unwrap()
8889
}
8990

90-
pub fn height(&self) -> Height {
91+
// TODO - change to ICSHeight
92+
pub fn height(&self) -> &Height {
9193
match self {
92-
IBCEvent::NewBlock(bl) => bl.height,
93-
IBCEvent::UpdateClient(uc) => *uc.height(),
94-
IBCEvent::SendPacketChannel(ev) => ev.height,
95-
IBCEvent::ReceivePacketChannel(ev) => ev.height,
96-
IBCEvent::WriteAcknowledgementChannel(ev) => ev.height,
97-
IBCEvent::AcknowledgePacketChannel(ev) => ev.height,
98-
IBCEvent::TimeoutPacketChannel(ev) => ev.height,
94+
IBCEvent::NewBlock(ev) => &ev.height,
95+
IBCEvent::UpdateClient(ev) => ev.height(),
96+
IBCEvent::SendPacket(ev) => &ev.height,
97+
IBCEvent::ReceivePacket(ev) => &ev.height,
98+
IBCEvent::WriteAcknowledgement(ev) => &ev.height,
99+
IBCEvent::AcknowledgePacket(ev) => &ev.height,
100+
IBCEvent::TimeoutPacket(ev) => &ev.height,
101+
IBCEvent::CloseInitChannel(ev) => ev.height(),
99102

100103
_ => unimplemented!(),
101104
}
102105
}
103106

104-
pub fn set_height(&mut self, height: ICSHeight) {
107+
pub fn set_height(&mut self, height: &ICSHeight) {
105108
match self {
106-
IBCEvent::SendPacketChannel(ev) => {
109+
IBCEvent::SendPacket(ev) => {
107110
ev.height = Height::try_from(height.revision_height).unwrap()
108111
}
109-
IBCEvent::ReceivePacketChannel(ev) => {
112+
IBCEvent::ReceivePacket(ev) => {
110113
ev.height = Height::try_from(height.revision_height).unwrap()
111114
}
112-
IBCEvent::WriteAcknowledgementChannel(ev) => {
115+
IBCEvent::WriteAcknowledgement(ev) => {
113116
ev.height = Height::try_from(height.revision_height).unwrap()
114117
}
115-
IBCEvent::AcknowledgePacketChannel(ev) => {
118+
IBCEvent::AcknowledgePacket(ev) => {
116119
ev.height = Height::try_from(height.revision_height).unwrap()
117120
}
118-
IBCEvent::TimeoutPacketChannel(ev) => {
121+
IBCEvent::TimeoutPacket(ev) => {
119122
ev.height = Height::try_from(height.revision_height).unwrap()
120123
}
124+
IBCEvent::CloseInitChannel(ev) => {
125+
ev.set_height(Height::try_from(height.revision_height).unwrap())
126+
}
121127
_ => unimplemented!(),
122128
}
123129
}
@@ -292,7 +298,14 @@ pub fn build_event(mut object: RawObject) -> Result<IBCEvent, BoxError> {
292298
object,
293299
)?)),
294300

295-
_ => Err("Incorrect Event Type".into()),
301+
"timeout_on_close_packet" => {
302+
object.action = "timeout_packet".to_string();
303+
Ok(IBCEvent::from(
304+
ChannelEvents::TimeoutOnClosePacket::try_from(object)?,
305+
))
306+
}
307+
308+
unknown_event => Err(unknown_event.into()),
296309
}
297310
}
298311

modules/src/ics02_client/msgs/create_client.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,13 @@ impl TryFrom<RawMsgCreateClient> for MsgCreateAnyClient {
8686

8787
let signer = string_to_account(raw.signer).map_err(|e| Kind::InvalidAddress.context(e))?;
8888

89-
Ok(MsgCreateAnyClient::new(
89+
MsgCreateAnyClient::new(
9090
AnyClientState::try_from(raw_client_state)
9191
.map_err(|e| Kind::InvalidRawClientState.context(e))?,
9292
AnyConsensusState::try_from(raw_consensus_state)
9393
.map_err(|e| Kind::InvalidRawConsensusState.context(e))?,
9494
signer,
95-
)?)
95+
)
9696
}
9797
}
9898

modules/src/ics04_channel/events.rs

+63-15
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ const RECV_PACKET: &str = "recv_packet";
2929
const WRITE_ACK: &str = "write_acknowledgement";
3030
const ACK_PACKET: &str = "acknowledge_packet";
3131
const TIMEOUT: &str = "timeout_packet";
32+
const TIMEOUT_ON_CLOSE: &str = "timeout_on_close_packet";
3233

3334
/// Packet event attribute keys
3435
const PKT_SEQ_ATTRIBUTE_KEY: &str = "packet_sequence";
@@ -65,7 +66,7 @@ pub fn try_from_tx(event: &tendermint::abci::Event) -> Option<IBCEvent> {
6566
let (packet, write_ack) = extract_packet_and_write_ack_from_tx(event);
6667
// This event should not have a write ack.
6768
assert!(write_ack.is_none());
68-
Some(IBCEvent::SendPacketChannel(SendPacket {
69+
Some(IBCEvent::SendPacket(SendPacket {
6970
height: Default::default(),
7071
packet,
7172
}))
@@ -74,19 +75,17 @@ pub fn try_from_tx(event: &tendermint::abci::Event) -> Option<IBCEvent> {
7475
let (packet, write_ack) = extract_packet_and_write_ack_from_tx(event);
7576
// This event should have a write ack.
7677
let write_ack = write_ack.unwrap();
77-
Some(IBCEvent::WriteAcknowledgementChannel(
78-
WriteAcknowledgement {
79-
height: Default::default(),
80-
packet,
81-
ack: write_ack,
82-
},
83-
))
78+
Some(IBCEvent::WriteAcknowledgement(WriteAcknowledgement {
79+
height: Default::default(),
80+
packet,
81+
ack: write_ack,
82+
}))
8483
}
8584
ACK_PACKET => {
8685
let (packet, write_ack) = extract_packet_and_write_ack_from_tx(event);
8786
// This event should not have a write ack.
8887
assert!(write_ack.is_none());
89-
Some(IBCEvent::AcknowledgePacketChannel(AcknowledgePacket {
88+
Some(IBCEvent::AcknowledgePacket(AcknowledgePacket {
9089
height: Default::default(),
9190
packet,
9291
}))
@@ -95,7 +94,7 @@ pub fn try_from_tx(event: &tendermint::abci::Event) -> Option<IBCEvent> {
9594
let (packet, write_ack) = extract_packet_and_write_ack_from_tx(event);
9695
// This event should not have a write ack.
9796
assert!(write_ack.is_none());
98-
Some(IBCEvent::TimeoutPacketChannel(TimeoutPacket {
97+
Some(IBCEvent::TimeoutPacket(TimeoutPacket {
9998
height: Default::default(),
10099
packet,
101100
}))
@@ -334,6 +333,15 @@ impl CloseInit {
334333
pub fn channel_id(&self) -> &Option<ChannelId> {
335334
&self.0.channel_id
336335
}
336+
pub fn height(&self) -> &block::Height {
337+
&self.0.height
338+
}
339+
pub fn port_id(&self) -> &PortId {
340+
&self.0.port_id
341+
}
342+
pub fn set_height(&mut self, height: block::Height) {
343+
self.0.height = height;
344+
}
337345
}
338346

339347
impl From<Attributes> for CloseInit {
@@ -365,6 +373,18 @@ impl From<CloseInit> for IBCEvent {
365373
}
366374
}
367375

376+
impl std::fmt::Display for CloseInit {
377+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
378+
write!(
379+
f,
380+
"{:?} {} {:?}",
381+
self.height(),
382+
CLOSE_INIT_EVENT_TYPE,
383+
self.0
384+
)
385+
}
386+
}
387+
368388
#[derive(Debug, Deserialize, Serialize, Clone)]
369389
pub struct CloseConfirm(Attributes);
370390

@@ -448,7 +468,7 @@ impl TryFrom<RawObject> for SendPacket {
448468

449469
impl From<SendPacket> for IBCEvent {
450470
fn from(v: SendPacket) -> Self {
451-
IBCEvent::SendPacketChannel(v)
471+
IBCEvent::SendPacket(v)
452472
}
453473
}
454474

@@ -477,7 +497,7 @@ impl TryFrom<RawObject> for ReceivePacket {
477497

478498
impl From<ReceivePacket> for IBCEvent {
479499
fn from(v: ReceivePacket) -> Self {
480-
IBCEvent::ReceivePacketChannel(v)
500+
IBCEvent::ReceivePacket(v)
481501
}
482502
}
483503

@@ -513,7 +533,7 @@ impl TryFrom<RawObject> for WriteAcknowledgement {
513533

514534
impl From<WriteAcknowledgement> for IBCEvent {
515535
fn from(v: WriteAcknowledgement) -> Self {
516-
IBCEvent::WriteAcknowledgementChannel(v)
536+
IBCEvent::WriteAcknowledgement(v)
517537
}
518538
}
519539

@@ -540,7 +560,7 @@ impl TryFrom<RawObject> for AcknowledgePacket {
540560

541561
impl From<AcknowledgePacket> for IBCEvent {
542562
fn from(v: AcknowledgePacket) -> Self {
543-
IBCEvent::AcknowledgePacketChannel(v)
563+
IBCEvent::AcknowledgePacket(v)
544564
}
545565
}
546566

@@ -568,7 +588,7 @@ impl TryFrom<RawObject> for TimeoutPacket {
568588

569589
impl From<TimeoutPacket> for IBCEvent {
570590
fn from(v: TimeoutPacket) -> Self {
571-
IBCEvent::TimeoutPacketChannel(v)
591+
IBCEvent::TimeoutPacket(v)
572592
}
573593
}
574594

@@ -577,3 +597,31 @@ impl std::fmt::Display for TimeoutPacket {
577597
write!(f, "{} {} {}", self.height, TIMEOUT, self.packet)
578598
}
579599
}
600+
601+
#[derive(Debug, Deserialize, Serialize, Clone)]
602+
pub struct TimeoutOnClosePacket {
603+
pub height: block::Height,
604+
pub packet: Packet,
605+
}
606+
607+
impl TryFrom<RawObject> for TimeoutOnClosePacket {
608+
type Error = BoxError;
609+
fn try_from(obj: RawObject) -> Result<Self, Self::Error> {
610+
Ok(TimeoutOnClosePacket {
611+
height: obj.height,
612+
packet: Packet::try_from(obj)?,
613+
})
614+
}
615+
}
616+
617+
impl From<TimeoutOnClosePacket> for IBCEvent {
618+
fn from(v: TimeoutOnClosePacket) -> Self {
619+
IBCEvent::TimeoutOnClosePacket(v)
620+
}
621+
}
622+
623+
impl std::fmt::Display for TimeoutOnClosePacket {
624+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
625+
write!(f, "{} {} {}", self.height, TIMEOUT_ON_CLOSE, self.packet)
626+
}
627+
}

modules/src/mock/context.rs

+4-13
Original file line numberDiff line numberDiff line change
@@ -448,19 +448,10 @@ impl ChannelKeeper for MockContext {
448448
cid: &ConnectionId,
449449
port_channel_id: &(PortId, ChannelId),
450450
) -> Result<(), ICS4Error> {
451-
match self.connection_channels.get(cid) {
452-
Some(v) => {
453-
let mut modv = v.clone();
454-
modv.push(port_channel_id.clone());
455-
self.connection_channels.remove(cid);
456-
self.connection_channels.insert(cid.clone(), modv);
457-
}
458-
None => {
459-
let mut modv = Vec::new();
460-
modv.push(port_channel_id.clone());
461-
self.connection_channels.insert(cid.clone(), modv);
462-
}
463-
}
451+
self.connection_channels
452+
.entry(cid.clone())
453+
.or_insert_with(Vec::new)
454+
.push(port_channel_id.clone());
464455
Ok(())
465456
}
466457
}

0 commit comments

Comments
 (0)