From bb9555a89bcd50f221b31ec518435f3fcab2da53 Mon Sep 17 00:00:00 2001 From: Ranadeep Biswas Date: Sat, 4 May 2024 14:46:40 +0200 Subject: [PATCH 01/21] use basecoin rev --- ibc-testkit/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ibc-testkit/Cargo.toml b/ibc-testkit/Cargo.toml index 0ab0ed09e..c52df1a70 100644 --- a/ibc-testkit/Cargo.toml +++ b/ibc-testkit/Cargo.toml @@ -36,7 +36,7 @@ ibc-client-tendermint-cw = { workspace = true } ibc-query = { workspace = true } # basecoin dependencies -basecoin-store = { git = "https://github.com/informalsystems/basecoin-rs", rev = "8496b3f" } +basecoin-store = { git = "https://github.com/informalsystems/basecoin-rs", rev = "cc15eb0" } # cosmos dependencies tendermint = { workspace = true } From 4b3d7d64c7ab5b1b2d294a10b4976ec83565c0a9 Mon Sep 17 00:00:00 2001 From: Ranadeep Biswas Date: Sat, 4 May 2024 14:47:18 +0200 Subject: [PATCH 02/21] rm RevertibleStore and GrowingStore use --- docs/architecture/adr-009-revamp-testkit.md | 2 +- ibc-testkit/src/context.rs | 4 ++-- ibc-testkit/tests/core/ics03_connection/conn_open_ack.rs | 5 ++--- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/docs/architecture/adr-009-revamp-testkit.md b/docs/architecture/adr-009-revamp-testkit.md index 8bf5af3e2..8e42b28bf 100644 --- a/docs/architecture/adr-009-revamp-testkit.md +++ b/docs/architecture/adr-009-revamp-testkit.md @@ -335,7 +335,7 @@ defined `TestContext` to have a concrete store implementation - ```rs // A mock store type using basecoin-storage implementations. -pub type MockStore = RevertibleStore>; +pub type MockStore = InMemoryStore; pub type TestContext = StoreGenericTestContext; ``` diff --git a/ibc-testkit/src/context.rs b/ibc-testkit/src/context.rs index 74d141f2e..7af55cc7d 100644 --- a/ibc-testkit/src/context.rs +++ b/ibc-testkit/src/context.rs @@ -2,7 +2,7 @@ use core::fmt::Debug; use core::time::Duration; use basecoin_store::context::ProvableStore; -use basecoin_store::impls::{GrowingStore, InMemoryStore, RevertibleStore}; +use basecoin_store::impls::InMemoryStore; use ibc::core::channel::types::channel::ChannelEnd; use ibc::core::channel::types::commitment::PacketCommitment; use ibc::core::client::context::client_state::ClientStateValidation; @@ -53,7 +53,7 @@ where } /// A mock store type using basecoin-storage implementations. -pub type MockStore = RevertibleStore>; +pub type MockStore = InMemoryStore; /// A [`StoreGenericTestContext`] using [`MockStore`]. pub type TestContext = StoreGenericTestContext; /// A [`StoreGenericTestContext`] using [`MockStore`] and [`MockHost`]. diff --git a/ibc-testkit/tests/core/ics03_connection/conn_open_ack.rs b/ibc-testkit/tests/core/ics03_connection/conn_open_ack.rs index 37733b60c..8860e3227 100644 --- a/ibc-testkit/tests/core/ics03_connection/conn_open_ack.rs +++ b/ibc-testkit/tests/core/ics03_connection/conn_open_ack.rs @@ -1,6 +1,5 @@ use core::str::FromStr; -use basecoin_store::impls::{GrowingStore, InMemoryStore, RevertibleStore}; use ibc::core::client::types::Height; use ibc::core::commitment_types::commitment::CommitmentPrefix; use ibc::core::connection::types::error::ConnectionError; @@ -20,7 +19,7 @@ use ibc_testkit::fixtures::core::context::TestContextConfig; use ibc_testkit::fixtures::{Expect, Fixture}; use ibc_testkit::hosts::MockHost; use ibc_testkit::testapp::ibc::core::router::MockRouter; -use ibc_testkit::testapp::ibc::core::types::{LightClientState, MockIbcStore}; +use ibc_testkit::testapp::ibc::core::types::{DefaultIbcStore, LightClientState}; use test_log::test; enum Ctx { @@ -168,7 +167,7 @@ fn conn_open_ack_execute(fxt: &mut Fixture, expect: Expect let IbcEvent::OpenAckConnection(conn_open_try_event) = event else { unreachable!() }; - let conn_end = >> as ValidationContext>::connection_end( + let conn_end = ::connection_end( &fxt.ctx, conn_open_try_event.conn_id_on_a(), ) From 9d35eb0e48ef4e2018a0a61e9a7fc7a685c63eab Mon Sep 17 00:00:00 2001 From: Ranadeep Biswas Date: Sat, 4 May 2024 14:47:44 +0200 Subject: [PATCH 03/21] add packet timeout integration test this verifies non-membership proofs --- ibc-testkit/src/relayer/context.rs | 51 ++++++++++++++++++++ ibc-testkit/src/relayer/integration.rs | 64 +++++++++++++++++++++++++- ibc-testkit/src/relayer/utils.rs | 42 +++++++++++++++++ 3 files changed, 156 insertions(+), 1 deletion(-) diff --git a/ibc-testkit/src/relayer/context.rs b/ibc-testkit/src/relayer/context.rs index 232fb6074..3c268ce78 100644 --- a/ibc-testkit/src/relayer/context.rs +++ b/ibc-testkit/src/relayer/context.rs @@ -356,4 +356,55 @@ where signer, ) } + + /// Timeouts a packet from the first context to the second context. + /// The IBC packet is created by an IBC application on the first context. + pub fn timeout_packet_on_a(&mut self, packet: Packet, signer: Signer) { + let conn_id_on_a = self + .ctx_a + .ibc_store() + .channel_end(&ChannelEndPath::new( + &packet.port_id_on_a, + &packet.chan_id_on_a, + )) + .expect("connection exists") + .connection_hops()[0] + .clone(); + + let conn_id_on_b = self + .ctx_b + .ibc_store() + .channel_end(&ChannelEndPath::new( + &packet.port_id_on_b, + &packet.chan_id_on_b, + )) + .expect("connection exists") + .connection_hops()[0] + .clone(); + + let client_id_on_a = self + .ctx_a + .ibc_store() + .connection_end(&conn_id_on_a) + .expect("connection exists") + .client_id() + .clone(); + + let client_id_on_b = self + .ctx_b + .ibc_store() + .connection_end(&conn_id_on_b) + .expect("connection exists") + .client_id() + .clone(); + + TypedRelayerOps::::timeout_packet_on_a( + &mut self.ctx_a, + &mut self.ctx_b, + packet, + client_id_on_a, + client_id_on_b, + signer, + ) + } } diff --git a/ibc-testkit/src/relayer/integration.rs b/ibc-testkit/src/relayer/integration.rs index 85df3cd9c..fe154f68b 100644 --- a/ibc-testkit/src/relayer/integration.rs +++ b/ibc-testkit/src/relayer/integration.rs @@ -151,7 +151,69 @@ where }; // continue packet relay starting from recv_packet at B - relayer.send_packet_on_a(packet, signer); + relayer.send_packet_on_a(packet, signer.clone()); + + // timeout packet from A to B + + // generate packet for DummyTransferModule + let packet_data = PacketData { + token: PrefixedCoin::from_str("1000uibc").expect("valid prefixed coin"), + sender: signer.clone(), + receiver: signer.clone(), + memo: "sample memo".into(), + }; + + // packet with ibc metadata + // either height timeout or timestamp timeout must be set + let msg = MsgTransfer { + port_id_on_a: PortId::transfer(), + chan_id_on_a: chan_id_on_a.clone(), + packet_data, + // setting timeout height to 10 blocks from B's current height. + timeout_height_on_b: relayer.get_ctx_b().latest_height().add(10).into(), + // not setting timeout timestamp. + timeout_timestamp_on_b: Timestamp::none(), + }; + + // module creates the send_packet + send_transfer( + relayer.get_ctx_a_mut().ibc_store_mut(), + &mut DummyTransferModule, + msg, + ) + .expect("successfully created send_packet"); + + // send_packet wasn't committed, hence produce a block + relayer.get_ctx_a_mut().advance_block_height(); + + // retrieve the send_packet event + let Some(IbcEvent::SendPacket(send_packet_event)) = relayer + .get_ctx_a() + .ibc_store() + .events + .lock() + .iter() + .rev() + .nth(2) + .cloned() + else { + panic!("unexpected event") + }; + + // create the IBC packet type + let packet = Packet { + port_id_on_a: send_packet_event.port_id_on_a().clone(), + chan_id_on_a: send_packet_event.chan_id_on_a().clone(), + seq_on_a: *send_packet_event.seq_on_a(), + data: send_packet_event.packet_data().to_vec(), + timeout_height_on_b: *send_packet_event.timeout_height_on_b(), + timeout_timestamp_on_b: *send_packet_event.timeout_timestamp_on_b(), + port_id_on_b: send_packet_event.port_id_on_b().clone(), + chan_id_on_b: send_packet_event.chan_id_on_b().clone(), + }; + + // timeout the packet on A; never relay the packet to B + relayer.timeout_packet_on_a(packet.clone(), signer.clone()); } #[cfg(test)] diff --git a/ibc-testkit/src/relayer/utils.rs b/ibc-testkit/src/relayer/utils.rs index 9d4c96bd6..ad721e35c 100644 --- a/ibc-testkit/src/relayer/utils.rs +++ b/ibc-testkit/src/relayer/utils.rs @@ -1,6 +1,7 @@ use alloc::string::String; use core::marker::PhantomData; use core::time::Duration; +use ibc::core::channel::types::timeout::TimeoutHeight; use ibc::core::channel::types::acknowledgement::Acknowledgement; use ibc::core::channel::types::channel::Order; @@ -998,4 +999,45 @@ where signer.clone(), ); } + + /// Times out a packet from an IBC application on `A` to `B` using the IBC packet relay protocol. + pub fn timeout_packet_on_a( + ctx_a: &mut TestContext, + ctx_b: &mut TestContext, + packet: Packet, + client_id_on_a: ClientId, + client_id_on_b: ClientId, + signer: Signer, + ) { + // packet is passed from module + + let TimeoutHeight::At(timeout_height) = packet.timeout_height_on_b else { + panic!("timeout height is set") + }; + + // progress `B`'s block height to the timeout height. + // packet is timed out at the timeout height + 1 + while ctx_b.latest_height() <= timeout_height { + ctx_b.advance_block_height(); + } + + // update client on `A` with the latest header from `B`. + TypedRelayerOps::::update_client_on_a_with_sync( + ctx_a, + ctx_b, + client_id_on_a.clone(), + signer.clone(), + ); + + // timeout the packet on `A`. + TypedRelayerOps::::packet_timeout_on_a(ctx_a, ctx_b, packet.clone(), signer.clone()); + + // `A` has progressed; update client on `B` with the latest header from `A`. + TypedRelayerOps::::update_client_on_a_with_sync( + ctx_b, + ctx_a, + client_id_on_b, + signer.clone(), + ); + } } From 1cba670f53fcfd16889ff70706111bc5baa39963 Mon Sep 17 00:00:00 2001 From: Ranadeep Biswas Date: Mon, 6 May 2024 10:54:52 +0200 Subject: [PATCH 04/21] reorder imports --- ibc-testkit/src/relayer/utils.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ibc-testkit/src/relayer/utils.rs b/ibc-testkit/src/relayer/utils.rs index ad721e35c..fdca2c8c8 100644 --- a/ibc-testkit/src/relayer/utils.rs +++ b/ibc-testkit/src/relayer/utils.rs @@ -1,7 +1,6 @@ use alloc::string::String; use core::marker::PhantomData; use core::time::Duration; -use ibc::core::channel::types::timeout::TimeoutHeight; use ibc::core::channel::types::acknowledgement::Acknowledgement; use ibc::core::channel::types::channel::Order; @@ -11,6 +10,7 @@ use ibc::core::channel::types::msgs::{ MsgTimeoutOnClose, PacketMsg, }; use ibc::core::channel::types::packet::Packet; +use ibc::core::channel::types::timeout::TimeoutHeight; use ibc::core::channel::types::Version as ChannelVersion; use ibc::core::client::context::client_state::ClientStateValidation; use ibc::core::client::context::ClientValidationContext; From 1713241cb23696e2391ab7368213c039ce98a7ea Mon Sep 17 00:00:00 2001 From: Ranadeep Biswas Date: Tue, 7 May 2024 19:49:13 +0200 Subject: [PATCH 05/21] add timeout_packet_on_channel_close_on_a in utils --- ibc-testkit/src/relayer/utils.rs | 43 ++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/ibc-testkit/src/relayer/utils.rs b/ibc-testkit/src/relayer/utils.rs index fdca2c8c8..b219fe449 100644 --- a/ibc-testkit/src/relayer/utils.rs +++ b/ibc-testkit/src/relayer/utils.rs @@ -1040,4 +1040,47 @@ where signer.clone(), ); } + + /// Times out a packet from an IBC application on `A` to `B` after closing the channel. + pub fn timeout_packet_on_channel_close_on_a( + ctx_a: &mut TestContext, + ctx_b: &mut TestContext, + packet: Packet, + client_id_on_a: ClientId, + client_id_on_b: ClientId, + signer: Signer, + ) { + // packet is passed from module + + // close the channel on `A`. + TypedRelayerOps::::close_channel_on_a( + ctx_a, + ctx_b, + client_id_on_a.clone(), + packet.chan_id_on_a.clone(), + packet.port_id_on_a.clone(), + client_id_on_b.clone(), + packet.chan_id_on_b.clone(), + packet.port_id_on_b.clone(), + signer.clone(), + ); + + // timeout the packet on `A`. + TypedRelayerOps::::packet_timeout_on_close_on_a( + ctx_a, + ctx_b, + packet.clone(), + packet.chan_id_on_b.clone(), + packet.port_id_on_b.clone(), + signer.clone(), + ); + + // `A` has progressed; update client on `B` with the latest header from `A`. + TypedRelayerOps::::update_client_on_a_with_sync( + ctx_b, + ctx_a, + client_id_on_b, + signer.clone(), + ); + } } From b3a1f0a7946265925f493f71c6ad6127405b8e09 Mon Sep 17 00:00:00 2001 From: Ranadeep Biswas Date: Tue, 7 May 2024 19:49:43 +0200 Subject: [PATCH 06/21] add timeout_packet_on_channel_close_on_a in context --- ibc-testkit/src/relayer/context.rs | 51 ++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/ibc-testkit/src/relayer/context.rs b/ibc-testkit/src/relayer/context.rs index 3c268ce78..8d18e092c 100644 --- a/ibc-testkit/src/relayer/context.rs +++ b/ibc-testkit/src/relayer/context.rs @@ -407,4 +407,55 @@ where signer, ) } + + /// Timeouts a packet from the second context to the first context, + /// because of the channel is closed. + pub fn timeout_packet_on_channel_close_on_a(&mut self, packet: Packet, signer: Signer) { + let conn_id_on_a = self + .ctx_a + .ibc_store() + .channel_end(&ChannelEndPath::new( + &packet.port_id_on_a, + &packet.chan_id_on_a, + )) + .expect("connection exists") + .connection_hops()[0] + .clone(); + + let conn_id_on_b = self + .ctx_b + .ibc_store() + .channel_end(&ChannelEndPath::new( + &packet.port_id_on_b, + &packet.chan_id_on_b, + )) + .expect("connection exists") + .connection_hops()[0] + .clone(); + + let client_id_on_a = self + .ctx_a + .ibc_store() + .connection_end(&conn_id_on_a) + .expect("connection exists") + .client_id() + .clone(); + + let client_id_on_b = self + .ctx_b + .ibc_store() + .connection_end(&conn_id_on_b) + .expect("connection exists") + .client_id() + .clone(); + + TypedRelayerOps::::timeout_packet_on_channel_close_on_a( + &mut self.ctx_a, + &mut self.ctx_b, + packet, + client_id_on_a, + client_id_on_b, + signer, + ) + } } From 7fb3ffc45a8f7a11a51ca4fd431d930d9d2153a6 Mon Sep 17 00:00:00 2001 From: Ranadeep Biswas Date: Tue, 7 May 2024 19:50:44 +0200 Subject: [PATCH 07/21] test for packet timeout on channel close --- ibc-testkit/src/relayer/integration.rs | 62 ++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/ibc-testkit/src/relayer/integration.rs b/ibc-testkit/src/relayer/integration.rs index fe154f68b..ede532805 100644 --- a/ibc-testkit/src/relayer/integration.rs +++ b/ibc-testkit/src/relayer/integration.rs @@ -214,6 +214,68 @@ where // timeout the packet on A; never relay the packet to B relayer.timeout_packet_on_a(packet.clone(), signer.clone()); + + // timeout packet from A to B; using close channel + + // generate packet for DummyTransferModule + let packet_data = PacketData { + token: PrefixedCoin::from_str("1000uibc").expect("valid prefixed coin"), + sender: signer.clone(), + receiver: signer.clone(), + memo: "sample memo".into(), + }; + + // packet with ibc metadata + // either height timeout or timestamp timeout must be set + let msg = MsgTransfer { + port_id_on_a: PortId::transfer(), + chan_id_on_a: chan_id_on_a.clone(), + packet_data, + // setting timeout height to 10 blocks from B's current height. + timeout_height_on_b: relayer.get_ctx_b().latest_height().add(10).into(), + // not setting timeout timestamp. + timeout_timestamp_on_b: Timestamp::none(), + }; + + // module creates the send_packet + send_transfer( + relayer.get_ctx_a_mut().ibc_store_mut(), + &mut DummyTransferModule, + msg, + ) + .expect("successfully created send_packet"); + + // send_packet wasn't committed, hence produce a block + relayer.get_ctx_a_mut().advance_block_height(); + + // retrieve the send_packet event + let Some(IbcEvent::SendPacket(send_packet_event)) = relayer + .get_ctx_a() + .ibc_store() + .events + .lock() + .iter() + .rev() + .nth(2) + .cloned() + else { + panic!("unexpected event") + }; + + // create the IBC packet type + let packet = Packet { + port_id_on_a: send_packet_event.port_id_on_a().clone(), + chan_id_on_a: send_packet_event.chan_id_on_a().clone(), + seq_on_a: *send_packet_event.seq_on_a(), + data: send_packet_event.packet_data().to_vec(), + timeout_height_on_b: *send_packet_event.timeout_height_on_b(), + timeout_timestamp_on_b: *send_packet_event.timeout_timestamp_on_b(), + port_id_on_b: send_packet_event.port_id_on_b().clone(), + chan_id_on_b: send_packet_event.chan_id_on_b().clone(), + }; + + // timeout the packet on A; never relay the packet to B + relayer.timeout_packet_on_channel_close_on_a(packet.clone(), signer.clone()); } #[cfg(test)] From 1c38260ef3386dfdae66fe051999fe96015cc291 Mon Sep 17 00:00:00 2001 From: Ranadeep Biswas Date: Tue, 7 May 2024 19:51:40 +0200 Subject: [PATCH 08/21] use correct event type --- ibc-testkit/src/relayer/utils.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ibc-testkit/src/relayer/utils.rs b/ibc-testkit/src/relayer/utils.rs index b219fe449..368f341a4 100644 --- a/ibc-testkit/src/relayer/utils.rs +++ b/ibc-testkit/src/relayer/utils.rs @@ -950,7 +950,7 @@ where ctx_a.deliver(msg_for_a).expect("success"); - let Some(IbcEvent::ChannelClosed(_)) = ctx_a.ibc_store().events.lock().last().cloned() + let Some(IbcEvent::TimeoutPacket(_)) = ctx_a.ibc_store().events.lock().last().cloned() else { panic!("unexpected event") }; From ce318162049d290ba781b0190e1f82e63564994f Mon Sep 17 00:00:00 2001 From: Ranadeep Biswas Date: Tue, 7 May 2024 19:52:12 +0200 Subject: [PATCH 09/21] validate packet events --- ibc-testkit/src/relayer/integration.rs | 36 ++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/ibc-testkit/src/relayer/integration.rs b/ibc-testkit/src/relayer/integration.rs index ede532805..b831ec6ea 100644 --- a/ibc-testkit/src/relayer/integration.rs +++ b/ibc-testkit/src/relayer/integration.rs @@ -153,6 +153,18 @@ where // continue packet relay starting from recv_packet at B relayer.send_packet_on_a(packet, signer.clone()); + // retrieve the ack_packet event + let Some(IbcEvent::AcknowledgePacket(_)) = relayer + .get_ctx_a() + .ibc_store() + .events + .lock() + .last() + .cloned() + else { + panic!("unexpected event") + }; + // timeout packet from A to B // generate packet for DummyTransferModule @@ -215,6 +227,18 @@ where // timeout the packet on A; never relay the packet to B relayer.timeout_packet_on_a(packet.clone(), signer.clone()); + // retrieve the timeout_packet event + let Some(IbcEvent::TimeoutPacket(_)) = relayer + .get_ctx_a() + .ibc_store() + .events + .lock() + .last() + .cloned() + else { + panic!("unexpected event") + }; + // timeout packet from A to B; using close channel // generate packet for DummyTransferModule @@ -276,6 +300,18 @@ where // timeout the packet on A; never relay the packet to B relayer.timeout_packet_on_channel_close_on_a(packet.clone(), signer.clone()); + + // retrieve the timeout_packet event + let Some(IbcEvent::TimeoutPacket(_)) = relayer + .get_ctx_a() + .ibc_store() + .events + .lock() + .last() + .cloned() + else { + panic!("unexpected event") + }; } #[cfg(test)] From 12921b064b51ad49c416977f37ee72c14d20e9c7 Mon Sep 17 00:00:00 2001 From: Ranadeep Biswas Date: Tue, 7 May 2024 19:58:07 +0200 Subject: [PATCH 10/21] rm dbg --- ibc-core/ics04-channel/src/handler/timeout_on_close.rs | 2 +- ibc-testkit/tests/core/ics02_client/recover_client.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ibc-core/ics04-channel/src/handler/timeout_on_close.rs b/ibc-core/ics04-channel/src/handler/timeout_on_close.rs index 0aa5a4027..8366a5d26 100644 --- a/ibc-core/ics04-channel/src/handler/timeout_on_close.rs +++ b/ibc-core/ics04-channel/src/handler/timeout_on_close.rs @@ -109,7 +109,7 @@ where client_state_of_b_on_a .verify_membership( prefix_on_b, - &msg.proof_unreceived_on_b, + &msg.proof_close_on_b, consensus_state_of_b_on_a.root(), Path::ChannelEnd(chan_end_path_on_b), expected_chan_end_on_b.encode_vec(), diff --git a/ibc-testkit/tests/core/ics02_client/recover_client.rs b/ibc-testkit/tests/core/ics02_client/recover_client.rs index 28f1de076..f40f15f52 100644 --- a/ibc-testkit/tests/core/ics02_client/recover_client.rs +++ b/ibc-testkit/tests/core/ics02_client/recover_client.rs @@ -284,6 +284,6 @@ fn test_recover_client_with_matching_heights() { signer, }; - dbg!(recover_client::validate(ctx.ibc_store(), msg)) + recover_client::validate(ctx.ibc_store(), msg) .expect_err("expected client recovery validation to fail"); } From 622deee71fcf7b2442ef4bfe85866539c98a388f Mon Sep 17 00:00:00 2001 From: Ranadeep Biswas Date: Thu, 9 May 2024 14:50:54 +0200 Subject: [PATCH 11/21] add send_packet_via_dummy_transfer_module_on_a method --- ibc-testkit/src/relayer/context.rs | 71 +++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/ibc-testkit/src/relayer/context.rs b/ibc-testkit/src/relayer/context.rs index 8d18e092c..e68d71313 100644 --- a/ibc-testkit/src/relayer/context.rs +++ b/ibc-testkit/src/relayer/context.rs @@ -1,13 +1,18 @@ +use ibc::apps::transfer::handler::send_transfer; +use ibc::apps::transfer::types::msgs::transfer::MsgTransfer; +use ibc::apps::transfer::types::packet::PacketData; use ibc::core::channel::types::packet::Packet; use ibc::core::client::context::client_state::ClientStateValidation; +use ibc::core::handler::types::events::IbcEvent; use ibc::core::host::types::identifiers::{ChannelId, ClientId, ConnectionId, PortId}; use ibc::core::host::types::path::ChannelEndPath; use ibc::core::host::ValidationContext; -use ibc::primitives::Signer; +use ibc::primitives::{Signer, Timestamp}; use crate::context::TestContext; use crate::hosts::{HostClientState, TestHost}; use crate::relayer::utils::TypedRelayerOps; +use crate::testapp::ibc::applications::transfer::types::DummyTransferModule; use crate::testapp::ibc::core::types::DefaultIbcStore; /// A relayer context that allows interaction between two [`TestContext`] instances. @@ -458,4 +463,68 @@ where signer, ) } + + /// Submit a packet via [`DummyTransferModule`] on the first context. + pub fn send_packet_via_dummy_transfer_module_on_a( + &mut self, + chan_id_on_a: ChannelId, + signer: Signer, + ) -> Packet { + // generate packet for DummyTransferModule + let packet_data = PacketData { + token: "1000uibc".parse().expect("valid prefixed coin"), + sender: signer.clone(), + receiver: signer.clone(), + memo: "sample memo".into(), + }; + + // packet with ibc metadata + // either height timeout or timestamp timeout must be set + let msg = MsgTransfer { + port_id_on_a: PortId::transfer(), + chan_id_on_a: chan_id_on_a.clone(), + packet_data, + // setting timeout height to 10 blocks from B's current height. + timeout_height_on_b: self.get_ctx_b().latest_height().add(10).into(), + // not setting timeout timestamp. + timeout_timestamp_on_b: Timestamp::none(), + }; + + // module creates the send_packet + send_transfer( + self.get_ctx_a_mut().ibc_store_mut(), + &mut DummyTransferModule, + msg, + ) + .expect("successfully created send_packet"); + + // send_packet wasn't committed, hence produce a block + self.get_ctx_a_mut().advance_block_height(); + + // retrieve the send_packet event + let Some(IbcEvent::SendPacket(send_packet_event)) = self + .get_ctx_a() + .ibc_store() + .events + .lock() + .iter() + .rev() + .nth(2) + .cloned() + else { + panic!("unexpected event") + }; + + // create the IBC packet type + Packet { + port_id_on_a: send_packet_event.port_id_on_a().clone(), + chan_id_on_a: send_packet_event.chan_id_on_a().clone(), + seq_on_a: *send_packet_event.seq_on_a(), + data: send_packet_event.packet_data().to_vec(), + timeout_height_on_b: *send_packet_event.timeout_height_on_b(), + timeout_timestamp_on_b: *send_packet_event.timeout_timestamp_on_b(), + port_id_on_b: send_packet_event.port_id_on_b().clone(), + chan_id_on_b: send_packet_event.chan_id_on_b().clone(), + } + } } From 930f236905443dd8b1eb8c9a5fd04e33c5c37d2a Mon Sep 17 00:00:00 2001 From: Ranadeep Biswas Date: Thu, 9 May 2024 14:51:17 +0200 Subject: [PATCH 12/21] use the new method --- ibc-testkit/src/relayer/integration.rs | 191 ++----------------------- 1 file changed, 13 insertions(+), 178 deletions(-) diff --git a/ibc-testkit/src/relayer/integration.rs b/ibc-testkit/src/relayer/integration.rs index b831ec6ea..fd58bfd85 100644 --- a/ibc-testkit/src/relayer/integration.rs +++ b/ibc-testkit/src/relayer/integration.rs @@ -1,20 +1,11 @@ -use core::str::FromStr; - -use ibc::apps::transfer::handler::send_transfer; -use ibc::apps::transfer::types::msgs::transfer::MsgTransfer; -use ibc::apps::transfer::types::packet::PacketData; -use ibc::apps::transfer::types::PrefixedCoin; -use ibc::core::channel::types::packet::Packet; use ibc::core::client::context::client_state::ClientStateValidation; use ibc::core::handler::types::events::IbcEvent; use ibc::core::host::types::identifiers::{ChannelId, ConnectionId, PortId}; -use ibc::primitives::Timestamp; use crate::context::TestContext; use crate::fixtures::core::signer::dummy_account_id; use crate::hosts::{HostClientState, TestHost}; use crate::relayer::context::RelayerContext; -use crate::testapp::ibc::applications::transfer::types::DummyTransferModule; use crate::testapp::ibc::core::types::DefaultIbcStore; /// Integration test for IBC implementation. @@ -91,64 +82,12 @@ where assert_eq!(chan_id_on_a, ChannelId::new(1)); assert_eq!(chan_id_on_b, ChannelId::new(1)); + // ------------------------ // send packet from A to B + // ------------------------ - // generate packet for DummyTransferModule - let packet_data = PacketData { - token: PrefixedCoin::from_str("1000uibc").expect("valid prefixed coin"), - sender: signer.clone(), - receiver: signer.clone(), - memo: "sample memo".into(), - }; - - // packet with ibc metadata - // either height timeout or timestamp timeout must be set - let msg = MsgTransfer { - port_id_on_a: PortId::transfer(), - chan_id_on_a: chan_id_on_a.clone(), - packet_data, - // setting timeout height to 10 blocks from B's current height. - timeout_height_on_b: relayer.get_ctx_b().latest_height().add(10).into(), - // not setting timeout timestamp. - timeout_timestamp_on_b: Timestamp::none(), - }; - - // module creates the send_packet - send_transfer( - relayer.get_ctx_a_mut().ibc_store_mut(), - &mut DummyTransferModule, - msg, - ) - .expect("successfully created send_packet"); - - // send_packet wasn't committed, hence produce a block - relayer.get_ctx_a_mut().advance_block_height(); - - // retrieve the send_packet event - let Some(IbcEvent::SendPacket(send_packet_event)) = relayer - .get_ctx_a() - .ibc_store() - .events - .lock() - .iter() - .rev() - .nth(2) - .cloned() - else { - panic!("unexpected event") - }; - - // create the IBC packet type - let packet = Packet { - port_id_on_a: send_packet_event.port_id_on_a().clone(), - chan_id_on_a: send_packet_event.chan_id_on_a().clone(), - seq_on_a: *send_packet_event.seq_on_a(), - data: send_packet_event.packet_data().to_vec(), - timeout_height_on_b: *send_packet_event.timeout_height_on_b(), - timeout_timestamp_on_b: *send_packet_event.timeout_timestamp_on_b(), - port_id_on_b: send_packet_event.port_id_on_b().clone(), - chan_id_on_b: send_packet_event.chan_id_on_b().clone(), - }; + let packet = + relayer.send_packet_via_dummy_transfer_module_on_a(chan_id_on_a.clone(), signer.clone()); // continue packet relay starting from recv_packet at B relayer.send_packet_on_a(packet, signer.clone()); @@ -165,64 +104,12 @@ where panic!("unexpected event") }; + // -------------------------- // timeout packet from A to B + // -------------------------- - // generate packet for DummyTransferModule - let packet_data = PacketData { - token: PrefixedCoin::from_str("1000uibc").expect("valid prefixed coin"), - sender: signer.clone(), - receiver: signer.clone(), - memo: "sample memo".into(), - }; - - // packet with ibc metadata - // either height timeout or timestamp timeout must be set - let msg = MsgTransfer { - port_id_on_a: PortId::transfer(), - chan_id_on_a: chan_id_on_a.clone(), - packet_data, - // setting timeout height to 10 blocks from B's current height. - timeout_height_on_b: relayer.get_ctx_b().latest_height().add(10).into(), - // not setting timeout timestamp. - timeout_timestamp_on_b: Timestamp::none(), - }; - - // module creates the send_packet - send_transfer( - relayer.get_ctx_a_mut().ibc_store_mut(), - &mut DummyTransferModule, - msg, - ) - .expect("successfully created send_packet"); - - // send_packet wasn't committed, hence produce a block - relayer.get_ctx_a_mut().advance_block_height(); - - // retrieve the send_packet event - let Some(IbcEvent::SendPacket(send_packet_event)) = relayer - .get_ctx_a() - .ibc_store() - .events - .lock() - .iter() - .rev() - .nth(2) - .cloned() - else { - panic!("unexpected event") - }; - - // create the IBC packet type - let packet = Packet { - port_id_on_a: send_packet_event.port_id_on_a().clone(), - chan_id_on_a: send_packet_event.chan_id_on_a().clone(), - seq_on_a: *send_packet_event.seq_on_a(), - data: send_packet_event.packet_data().to_vec(), - timeout_height_on_b: *send_packet_event.timeout_height_on_b(), - timeout_timestamp_on_b: *send_packet_event.timeout_timestamp_on_b(), - port_id_on_b: send_packet_event.port_id_on_b().clone(), - chan_id_on_b: send_packet_event.chan_id_on_b().clone(), - }; + let packet = + relayer.send_packet_via_dummy_transfer_module_on_a(chan_id_on_a.clone(), signer.clone()); // timeout the packet on A; never relay the packet to B relayer.timeout_packet_on_a(packet.clone(), signer.clone()); @@ -239,64 +126,12 @@ where panic!("unexpected event") }; - // timeout packet from A to B; using close channel - - // generate packet for DummyTransferModule - let packet_data = PacketData { - token: PrefixedCoin::from_str("1000uibc").expect("valid prefixed coin"), - sender: signer.clone(), - receiver: signer.clone(), - memo: "sample memo".into(), - }; - - // packet with ibc metadata - // either height timeout or timestamp timeout must be set - let msg = MsgTransfer { - port_id_on_a: PortId::transfer(), - chan_id_on_a: chan_id_on_a.clone(), - packet_data, - // setting timeout height to 10 blocks from B's current height. - timeout_height_on_b: relayer.get_ctx_b().latest_height().add(10).into(), - // not setting timeout timestamp. - timeout_timestamp_on_b: Timestamp::none(), - }; - - // module creates the send_packet - send_transfer( - relayer.get_ctx_a_mut().ibc_store_mut(), - &mut DummyTransferModule, - msg, - ) - .expect("successfully created send_packet"); - - // send_packet wasn't committed, hence produce a block - relayer.get_ctx_a_mut().advance_block_height(); - - // retrieve the send_packet event - let Some(IbcEvent::SendPacket(send_packet_event)) = relayer - .get_ctx_a() - .ibc_store() - .events - .lock() - .iter() - .rev() - .nth(2) - .cloned() - else { - panic!("unexpected event") - }; + // ------------------------------------------------ + // timeout packet from A to B; using closed channel + // ------------------------------------------------ - // create the IBC packet type - let packet = Packet { - port_id_on_a: send_packet_event.port_id_on_a().clone(), - chan_id_on_a: send_packet_event.chan_id_on_a().clone(), - seq_on_a: *send_packet_event.seq_on_a(), - data: send_packet_event.packet_data().to_vec(), - timeout_height_on_b: *send_packet_event.timeout_height_on_b(), - timeout_timestamp_on_b: *send_packet_event.timeout_timestamp_on_b(), - port_id_on_b: send_packet_event.port_id_on_b().clone(), - chan_id_on_b: send_packet_event.chan_id_on_b().clone(), - }; + let packet = + relayer.send_packet_via_dummy_transfer_module_on_a(chan_id_on_a.clone(), signer.clone()); // timeout the packet on A; never relay the packet to B relayer.timeout_packet_on_channel_close_on_a(packet.clone(), signer.clone()); From 19ad30a893a4e5a1b8e58faed871eae776d0cd48 Mon Sep 17 00:00:00 2001 From: Ranadeep Biswas Date: Thu, 9 May 2024 14:55:09 +0200 Subject: [PATCH 13/21] add changelog entry --- .../bug-fixes/1217-fix-packet-timeout-on-closed-channel.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .changelog/unreleased/bug-fixes/1217-fix-packet-timeout-on-closed-channel.md diff --git a/.changelog/unreleased/bug-fixes/1217-fix-packet-timeout-on-closed-channel.md b/.changelog/unreleased/bug-fixes/1217-fix-packet-timeout-on-closed-channel.md new file mode 100644 index 000000000..e98541b39 --- /dev/null +++ b/.changelog/unreleased/bug-fixes/1217-fix-packet-timeout-on-closed-channel.md @@ -0,0 +1,2 @@ +- [ibc-core] Fix proof verification for `PacketTimeout` on a closed channel. + ([\#1217](https://github.com/cosmos/ibc-rs/issues/1217)) From 6b3be3175bb78239cc976baada2c902d8abfaf82 Mon Sep 17 00:00:00 2001 From: Ranadeep Biswas Date: Thu, 9 May 2024 14:57:51 +0200 Subject: [PATCH 14/21] update doc links --- docs/architecture/adr-009-revamp-testkit.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/architecture/adr-009-revamp-testkit.md b/docs/architecture/adr-009-revamp-testkit.md index 8e42b28bf..9f4541638 100644 --- a/docs/architecture/adr-009-revamp-testkit.md +++ b/docs/architecture/adr-009-revamp-testkit.md @@ -304,16 +304,16 @@ The following provides the concrete implementations of the proposed changes: #### MockIbcStore The modified `MockIbcStore` with Merkle store lives at -[`testapp/ibc/core/types.rs`](https://github.com/cosmos/ibc-rs/blob/feat/refactor-testkit/ibc-testkit/src/testapp/ibc/core/types.rs#L43-L96). +[`testapp/ibc/core/types.rs`](https://github.com/cosmos/ibc-rs/blob/main/ibc-testkit/src/testapp/ibc/core/types.rs#L43-L96). #### TestHost The Rust trait lives at -[`hosts/mod.rs`](https://github.com/cosmos/ibc-rs/blob/feat/refactor-testkit/ibc-testkit/src/hosts/mod.rs#L27). +[`hosts/mod.rs`](https://github.com/cosmos/ibc-rs/blob/main/ibc-testkit/src/hosts/mod.rs#L27). The `Mock` and `Tendermint` host implementations live in -[`hosts/mock.rs`](https://github.com/cosmos/ibc-rs/blob/feat/refactor-testkit/ibc-testkit/src/hosts/mock.rs#L30) +[`hosts/mock.rs`](https://github.com/cosmos/ibc-rs/blob/main/ibc-testkit/src/hosts/mock.rs#L30) and -[`hosts/tendermint.rs`](https://github.com/cosmos/ibc-rs/blob/feat/refactor-testkit/ibc-testkit/src/hosts/tendermint.rs#L42) +[`hosts/tendermint.rs`](https://github.com/cosmos/ibc-rs/blob/main/ibc-testkit/src/hosts/tendermint.rs#L42) respectively. #### Renaming `MockContext` to `StoreGenericTestContext` @@ -328,10 +328,10 @@ have `Mock` in their name. #### StoreGenericTestContext -[`StoreGenericTestContext`](https://github.com/cosmos/ibc-rs/blob/feat/refactor-testkit/ibc-testkit/src/context.rs#L34-L52) +[`StoreGenericTestContext`](https://github.com/cosmos/ibc-rs/blob/main/ibc-testkit/src/context.rs#L34-L52) is actually what is described as `MockContext` in the ADR. For convenience, we defined `TestContext` to have a concrete store implementation - -[`MockStore`](https://github.com/cosmos/ibc-rs/blob/feat/refactor-testkit/ibc-testkit/src/context.rs#L55-L56). +[`MockStore`](https://github.com/cosmos/ibc-rs/blob/main/ibc-testkit/src/context.rs#L55-L56). ```rs // A mock store type using basecoin-storage implementations. From 6398fe03e996cb8705edde0e0e73a6c5da5011ee Mon Sep 17 00:00:00 2001 From: Ranadeep Biswas Date: Thu, 9 May 2024 15:04:33 +0200 Subject: [PATCH 15/21] fix link in doc-strings --- ibc-testkit/src/relayer/integration.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ibc-testkit/src/relayer/integration.rs b/ibc-testkit/src/relayer/integration.rs index fd58bfd85..fb831b498 100644 --- a/ibc-testkit/src/relayer/integration.rs +++ b/ibc-testkit/src/relayer/integration.rs @@ -8,9 +8,10 @@ use crate::hosts::{HostClientState, TestHost}; use crate::relayer::context::RelayerContext; use crate::testapp::ibc::core::types::DefaultIbcStore; -/// Integration test for IBC implementation. -/// This test creates clients, connections, channels, and sends packets between two [`TestHost`]s. -/// This uses [`DummyTransferModule`] to simulate the transfer of tokens between two contexts. +/// Integration test for IBC implementation. This test creates clients, +/// connections, channels, and sends packets between two [`TestHost`]s. This uses +/// [`DummyTransferModule`](crate::testapp::ibc::applications::transfer::types::DummyTransferModule) +/// to simulate the transfer of tokens between two contexts. pub fn ibc_integration_test() where A: TestHost, From ca6cd6b6543fa43a8e35ad09316251eda1de5925 Mon Sep 17 00:00:00 2001 From: Ranadeep Biswas Date: Thu, 9 May 2024 15:07:53 +0200 Subject: [PATCH 16/21] fix for serde feature --- ibc-testkit/src/relayer/context.rs | 6 +- ibc-testkit/src/relayer/integration.rs | 143 +++++++++++++------------ ibc-testkit/src/relayer/mod.rs | 5 +- 3 files changed, 82 insertions(+), 72 deletions(-) diff --git a/ibc-testkit/src/relayer/context.rs b/ibc-testkit/src/relayer/context.rs index e68d71313..035b9cb25 100644 --- a/ibc-testkit/src/relayer/context.rs +++ b/ibc-testkit/src/relayer/context.rs @@ -1,4 +1,3 @@ -use ibc::apps::transfer::handler::send_transfer; use ibc::apps::transfer::types::msgs::transfer::MsgTransfer; use ibc::apps::transfer::types::packet::PacketData; use ibc::core::channel::types::packet::Packet; @@ -465,6 +464,9 @@ where } /// Submit a packet via [`DummyTransferModule`] on the first context. + /// + /// Requires `serde` feature because of [`ibc::apps::transfer::handler::send_transfer`]. + #[cfg(feature = "serde")] pub fn send_packet_via_dummy_transfer_module_on_a( &mut self, chan_id_on_a: ChannelId, @@ -491,7 +493,7 @@ where }; // module creates the send_packet - send_transfer( + ibc::apps::transfer::handler::send_transfer( self.get_ctx_a_mut().ibc_store_mut(), &mut DummyTransferModule, msg, diff --git a/ibc-testkit/src/relayer/integration.rs b/ibc-testkit/src/relayer/integration.rs index fb831b498..9993cc7f3 100644 --- a/ibc-testkit/src/relayer/integration.rs +++ b/ibc-testkit/src/relayer/integration.rs @@ -9,7 +9,9 @@ use crate::relayer::context::RelayerContext; use crate::testapp::ibc::core::types::DefaultIbcStore; /// Integration test for IBC implementation. This test creates clients, -/// connections, channels, and sends packets between two [`TestHost`]s. This uses +/// connections, channels between two [`TestHost`]s. +/// +/// If `serde` feature is enabled, this also exercises packet relay between [`TestHost`]s. This uses /// [`DummyTransferModule`](crate::testapp::ibc::applications::transfer::types::DummyTransferModule) /// to simulate the transfer of tokens between two contexts. pub fn ibc_integration_test() @@ -83,71 +85,80 @@ where assert_eq!(chan_id_on_a, ChannelId::new(1)); assert_eq!(chan_id_on_b, ChannelId::new(1)); - // ------------------------ - // send packet from A to B - // ------------------------ - - let packet = - relayer.send_packet_via_dummy_transfer_module_on_a(chan_id_on_a.clone(), signer.clone()); - - // continue packet relay starting from recv_packet at B - relayer.send_packet_on_a(packet, signer.clone()); - - // retrieve the ack_packet event - let Some(IbcEvent::AcknowledgePacket(_)) = relayer - .get_ctx_a() - .ibc_store() - .events - .lock() - .last() - .cloned() - else { - panic!("unexpected event") - }; - - // -------------------------- - // timeout packet from A to B - // -------------------------- - - let packet = - relayer.send_packet_via_dummy_transfer_module_on_a(chan_id_on_a.clone(), signer.clone()); - - // timeout the packet on A; never relay the packet to B - relayer.timeout_packet_on_a(packet.clone(), signer.clone()); - - // retrieve the timeout_packet event - let Some(IbcEvent::TimeoutPacket(_)) = relayer - .get_ctx_a() - .ibc_store() - .events - .lock() - .last() - .cloned() - else { - panic!("unexpected event") - }; - - // ------------------------------------------------ - // timeout packet from A to B; using closed channel - // ------------------------------------------------ - - let packet = - relayer.send_packet_via_dummy_transfer_module_on_a(chan_id_on_a.clone(), signer.clone()); - - // timeout the packet on A; never relay the packet to B - relayer.timeout_packet_on_channel_close_on_a(packet.clone(), signer.clone()); - - // retrieve the timeout_packet event - let Some(IbcEvent::TimeoutPacket(_)) = relayer - .get_ctx_a() - .ibc_store() - .events - .lock() - .last() - .cloned() - else { - panic!("unexpected event") - }; + #[cfg(feature = "serde")] + { + { + // ------------------------ + // send packet from A to B + // ------------------------ + + let packet = relayer + .send_packet_via_dummy_transfer_module_on_a(chan_id_on_a.clone(), signer.clone()); + + // continue packet relay starting from recv_packet at B + relayer.send_packet_on_a(packet, signer.clone()); + + // retrieve the ack_packet event + let Some(IbcEvent::AcknowledgePacket(_)) = relayer + .get_ctx_a() + .ibc_store() + .events + .lock() + .last() + .cloned() + else { + panic!("unexpected event") + }; + } + + { + // -------------------------- + // timeout packet from A to B + // -------------------------- + + let packet = relayer + .send_packet_via_dummy_transfer_module_on_a(chan_id_on_a.clone(), signer.clone()); + + // timeout the packet on A; never relay the packet to B + relayer.timeout_packet_on_a(packet.clone(), signer.clone()); + + // retrieve the timeout_packet event + let Some(IbcEvent::TimeoutPacket(_)) = relayer + .get_ctx_a() + .ibc_store() + .events + .lock() + .last() + .cloned() + else { + panic!("unexpected event") + }; + } + + { + // ------------------------------------------------ + // timeout packet from A to B; using closed channel + // ------------------------------------------------ + + let packet = relayer + .send_packet_via_dummy_transfer_module_on_a(chan_id_on_a.clone(), signer.clone()); + + // timeout the packet on A; never relay the packet to B + relayer.timeout_packet_on_channel_close_on_a(packet.clone(), signer.clone()); + + // retrieve the timeout_packet event + let Some(IbcEvent::TimeoutPacket(_)) = relayer + .get_ctx_a() + .ibc_store() + .events + .lock() + .last() + .cloned() + else { + panic!("unexpected event") + }; + } + } } #[cfg(test)] diff --git a/ibc-testkit/src/relayer/mod.rs b/ibc-testkit/src/relayer/mod.rs index 5c70430ef..961de7885 100644 --- a/ibc-testkit/src/relayer/mod.rs +++ b/ibc-testkit/src/relayer/mod.rs @@ -1,7 +1,4 @@ pub mod context; pub mod error; -pub mod utils; - -// `ibc::apps::transfer::handler::send_transfer` requires `serde` -#[cfg(feature = "serde")] pub mod integration; +pub mod utils; From e43b753fcdd4307bc91bfa309f563ff591e42d65 Mon Sep 17 00:00:00 2001 From: Ranadeep Biswas Date: Thu, 9 May 2024 15:11:48 +0200 Subject: [PATCH 17/21] basecoin main branch --- ibc-testkit/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ibc-testkit/Cargo.toml b/ibc-testkit/Cargo.toml index c52df1a70..7887a30f1 100644 --- a/ibc-testkit/Cargo.toml +++ b/ibc-testkit/Cargo.toml @@ -36,7 +36,7 @@ ibc-client-tendermint-cw = { workspace = true } ibc-query = { workspace = true } # basecoin dependencies -basecoin-store = { git = "https://github.com/informalsystems/basecoin-rs", rev = "cc15eb0" } +basecoin-store = { git = "https://github.com/informalsystems/basecoin-rs", rev = "2dd5b95" } # cosmos dependencies tendermint = { workspace = true } From b3a1163e6c3ffba80c45c49d80f2004aba31c680 Mon Sep 17 00:00:00 2001 From: Ranadeep Biswas Date: Thu, 9 May 2024 15:17:12 +0200 Subject: [PATCH 18/21] fix unused imports --- ibc-testkit/src/relayer/context.rs | 16 ++++++++++------ ibc-testkit/src/relayer/integration.rs | 3 ++- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/ibc-testkit/src/relayer/context.rs b/ibc-testkit/src/relayer/context.rs index 035b9cb25..9365c1ba9 100644 --- a/ibc-testkit/src/relayer/context.rs +++ b/ibc-testkit/src/relayer/context.rs @@ -1,17 +1,13 @@ -use ibc::apps::transfer::types::msgs::transfer::MsgTransfer; -use ibc::apps::transfer::types::packet::PacketData; use ibc::core::channel::types::packet::Packet; use ibc::core::client::context::client_state::ClientStateValidation; -use ibc::core::handler::types::events::IbcEvent; use ibc::core::host::types::identifiers::{ChannelId, ClientId, ConnectionId, PortId}; use ibc::core::host::types::path::ChannelEndPath; use ibc::core::host::ValidationContext; -use ibc::primitives::{Signer, Timestamp}; +use ibc::primitives::Signer; use crate::context::TestContext; use crate::hosts::{HostClientState, TestHost}; use crate::relayer::utils::TypedRelayerOps; -use crate::testapp::ibc::applications::transfer::types::DummyTransferModule; use crate::testapp::ibc::core::types::DefaultIbcStore; /// A relayer context that allows interaction between two [`TestContext`] instances. @@ -472,6 +468,14 @@ where chan_id_on_a: ChannelId, signer: Signer, ) -> Packet { + use crate::testapp::ibc::applications::transfer::types::DummyTransferModule; + + use ibc::apps::transfer::handler::send_transfer; + use ibc::apps::transfer::types::msgs::transfer::MsgTransfer; + use ibc::apps::transfer::types::packet::PacketData; + use ibc::core::handler::types::events::IbcEvent; + use ibc::primitives::Timestamp; + // generate packet for DummyTransferModule let packet_data = PacketData { token: "1000uibc".parse().expect("valid prefixed coin"), @@ -493,7 +497,7 @@ where }; // module creates the send_packet - ibc::apps::transfer::handler::send_transfer( + send_transfer( self.get_ctx_a_mut().ibc_store_mut(), &mut DummyTransferModule, msg, diff --git a/ibc-testkit/src/relayer/integration.rs b/ibc-testkit/src/relayer/integration.rs index 9993cc7f3..1c749af40 100644 --- a/ibc-testkit/src/relayer/integration.rs +++ b/ibc-testkit/src/relayer/integration.rs @@ -1,5 +1,4 @@ use ibc::core::client::context::client_state::ClientStateValidation; -use ibc::core::handler::types::events::IbcEvent; use ibc::core::host::types::identifiers::{ChannelId, ConnectionId, PortId}; use crate::context::TestContext; @@ -87,6 +86,8 @@ where #[cfg(feature = "serde")] { + use ibc::core::handler::types::events::IbcEvent; + { // ------------------------ // send packet from A to B From b8a71043bd970ccfe02468121dc230c93ae492b5 Mon Sep 17 00:00:00 2001 From: Ranadeep Biswas Date: Thu, 9 May 2024 15:20:24 +0200 Subject: [PATCH 19/21] cargo format --- ibc-testkit/src/relayer/context.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ibc-testkit/src/relayer/context.rs b/ibc-testkit/src/relayer/context.rs index 9365c1ba9..27079626b 100644 --- a/ibc-testkit/src/relayer/context.rs +++ b/ibc-testkit/src/relayer/context.rs @@ -468,14 +468,14 @@ where chan_id_on_a: ChannelId, signer: Signer, ) -> Packet { - use crate::testapp::ibc::applications::transfer::types::DummyTransferModule; - use ibc::apps::transfer::handler::send_transfer; use ibc::apps::transfer::types::msgs::transfer::MsgTransfer; use ibc::apps::transfer::types::packet::PacketData; use ibc::core::handler::types::events::IbcEvent; use ibc::primitives::Timestamp; + use crate::testapp::ibc::applications::transfer::types::DummyTransferModule; + // generate packet for DummyTransferModule let packet_data = PacketData { token: "1000uibc".parse().expect("valid prefixed coin"), From 47e982fab441e8eee4626fcea929340059184200 Mon Sep 17 00:00:00 2001 From: Ranadeep Biswas Date: Thu, 9 May 2024 15:25:31 +0200 Subject: [PATCH 20/21] fix link in doc-strings --- ibc-testkit/src/relayer/context.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ibc-testkit/src/relayer/context.rs b/ibc-testkit/src/relayer/context.rs index 27079626b..b0c37b429 100644 --- a/ibc-testkit/src/relayer/context.rs +++ b/ibc-testkit/src/relayer/context.rs @@ -459,7 +459,9 @@ where ) } - /// Submit a packet via [`DummyTransferModule`] on the first context. + /// Submit a packet via + /// [`DummyTransferModule`](crate::testapp::ibc::applications::transfer::types::DummyTransferModule) + /// on the first context. /// /// Requires `serde` feature because of [`ibc::apps::transfer::handler::send_transfer`]. #[cfg(feature = "serde")] From 77873019251be50136e9df8012bfdaf7abdabef4 Mon Sep 17 00:00:00 2001 From: Ranadeep Biswas Date: Fri, 10 May 2024 12:58:20 +0200 Subject: [PATCH 21/21] fix method names and comments --- ibc-testkit/src/relayer/context.rs | 32 +++++++++++++++----------- ibc-testkit/src/relayer/integration.rs | 24 +++++++++---------- ibc-testkit/src/relayer/utils.rs | 8 +++---- 3 files changed, 35 insertions(+), 29 deletions(-) diff --git a/ibc-testkit/src/relayer/context.rs b/ibc-testkit/src/relayer/context.rs index b0c37b429..43f2a612f 100644 --- a/ibc-testkit/src/relayer/context.rs +++ b/ibc-testkit/src/relayer/context.rs @@ -306,9 +306,11 @@ where ) } - /// Sends a packet from the first context to the second context. + /// Sends a packet from the first context to the second context by + /// submitting on receive packet on the second context. + /// /// The IBC packet is created by an IBC application on the first context. - pub fn send_packet_on_a(&mut self, packet: Packet, signer: Signer) { + pub fn submit_packet_on_b(&mut self, packet: Packet, signer: Signer) { let conn_id_on_a = self .ctx_a .ibc_store() @@ -347,7 +349,7 @@ where .client_id() .clone(); - TypedRelayerOps::::send_packet_on_a( + TypedRelayerOps::::submit_packet_on_b( &mut self.ctx_a, &mut self.ctx_b, packet, @@ -357,9 +359,11 @@ where ) } - /// Timeouts a packet from the first context to the second context. + /// Times out a packet from the first context to the second context by + /// waiting for timeout period and then sending timeout packet on first context. + /// /// The IBC packet is created by an IBC application on the first context. - pub fn timeout_packet_on_a(&mut self, packet: Packet, signer: Signer) { + pub fn timeout_packet_from_a(&mut self, packet: Packet, signer: Signer) { let conn_id_on_a = self .ctx_a .ibc_store() @@ -398,7 +402,7 @@ where .client_id() .clone(); - TypedRelayerOps::::timeout_packet_on_a( + TypedRelayerOps::::timeout_packet_from_a( &mut self.ctx_a, &mut self.ctx_b, packet, @@ -408,9 +412,11 @@ where ) } - /// Timeouts a packet from the second context to the first context, - /// because of the channel is closed. - pub fn timeout_packet_on_channel_close_on_a(&mut self, packet: Packet, signer: Signer) { + /// Timeouts a packet from the first context on the second context by closing the + /// corresponding channel is closed and then sending a timeout packet on the first context. + /// + /// The IBC packet is created by an IBC application on the first context. + pub fn timeout_packet_from_a_on_channel_close(&mut self, packet: Packet, signer: Signer) { let conn_id_on_a = self .ctx_a .ibc_store() @@ -449,7 +455,7 @@ where .client_id() .clone(); - TypedRelayerOps::::timeout_packet_on_channel_close_on_a( + TypedRelayerOps::::timeout_packet_from_a_on_channel_close( &mut self.ctx_a, &mut self.ctx_b, packet, @@ -459,13 +465,13 @@ where ) } - /// Submit a packet via + /// Submit a /// [`DummyTransferModule`](crate::testapp::ibc::applications::transfer::types::DummyTransferModule) - /// on the first context. + /// packet on the first context. /// /// Requires `serde` feature because of [`ibc::apps::transfer::handler::send_transfer`]. #[cfg(feature = "serde")] - pub fn send_packet_via_dummy_transfer_module_on_a( + pub fn send_dummy_transfer_packet_on_a( &mut self, chan_id_on_a: ChannelId, signer: Signer, diff --git a/ibc-testkit/src/relayer/integration.rs b/ibc-testkit/src/relayer/integration.rs index 1c749af40..145ed5004 100644 --- a/ibc-testkit/src/relayer/integration.rs +++ b/ibc-testkit/src/relayer/integration.rs @@ -93,11 +93,11 @@ where // send packet from A to B // ------------------------ - let packet = relayer - .send_packet_via_dummy_transfer_module_on_a(chan_id_on_a.clone(), signer.clone()); + let packet = + relayer.send_dummy_transfer_packet_on_a(chan_id_on_a.clone(), signer.clone()); - // continue packet relay starting from recv_packet at B - relayer.send_packet_on_a(packet, signer.clone()); + // continue packet relay; submitting recv_packet at B + relayer.submit_packet_on_b(packet, signer.clone()); // retrieve the ack_packet event let Some(IbcEvent::AcknowledgePacket(_)) = relayer @@ -117,11 +117,11 @@ where // timeout packet from A to B // -------------------------- - let packet = relayer - .send_packet_via_dummy_transfer_module_on_a(chan_id_on_a.clone(), signer.clone()); + let packet = + relayer.send_dummy_transfer_packet_on_a(chan_id_on_a.clone(), signer.clone()); - // timeout the packet on A; never relay the packet to B - relayer.timeout_packet_on_a(packet.clone(), signer.clone()); + // timeout the packet on B; by never submitting the packet to B + relayer.timeout_packet_from_a(packet.clone(), signer.clone()); // retrieve the timeout_packet event let Some(IbcEvent::TimeoutPacket(_)) = relayer @@ -141,11 +141,11 @@ where // timeout packet from A to B; using closed channel // ------------------------------------------------ - let packet = relayer - .send_packet_via_dummy_transfer_module_on_a(chan_id_on_a.clone(), signer.clone()); + let packet = + relayer.send_dummy_transfer_packet_on_a(chan_id_on_a.clone(), signer.clone()); - // timeout the packet on A; never relay the packet to B - relayer.timeout_packet_on_channel_close_on_a(packet.clone(), signer.clone()); + // timeout the packet on B; close the corresponding channel + relayer.timeout_packet_from_a_on_channel_close(packet.clone(), signer.clone()); // retrieve the timeout_packet event let Some(IbcEvent::TimeoutPacket(_)) = relayer diff --git a/ibc-testkit/src/relayer/utils.rs b/ibc-testkit/src/relayer/utils.rs index 368f341a4..7987f9ca3 100644 --- a/ibc-testkit/src/relayer/utils.rs +++ b/ibc-testkit/src/relayer/utils.rs @@ -957,7 +957,7 @@ where } /// Sends a packet from an IBC application on `A` to `B` using the IBC packet relay protocol. - pub fn send_packet_on_a( + pub fn submit_packet_on_b( ctx_a: &mut TestContext, ctx_b: &mut TestContext, packet: Packet, @@ -1000,8 +1000,8 @@ where ); } - /// Times out a packet from an IBC application on `A` to `B` using the IBC packet relay protocol. - pub fn timeout_packet_on_a( + /// Times out a packet from an IBC application on `A` to `B` after waiting timeout period. + pub fn timeout_packet_from_a( ctx_a: &mut TestContext, ctx_b: &mut TestContext, packet: Packet, @@ -1042,7 +1042,7 @@ where } /// Times out a packet from an IBC application on `A` to `B` after closing the channel. - pub fn timeout_packet_on_channel_close_on_a( + pub fn timeout_packet_from_a_on_channel_close( ctx_a: &mut TestContext, ctx_b: &mut TestContext, packet: Packet,