From 0eb426574088c3f85aedc474432ec1fa7a11f2b2 Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Thu, 13 Jul 2023 16:58:07 +0200 Subject: [PATCH 01/26] Implement CanQueryPacketCommitments for relayer-next --- Cargo.lock | 55 ++----------------- .../src/all_for_one/chain.rs | 3 + .../one_for_all/impls/chain/queries/mod.rs | 1 + .../impls/chain/queries/packet_commitments.rs | 27 +++++++++ .../src/one_for_all/traits/chain.rs | 6 ++ .../src/chain/traits/queries/mod.rs | 1 + .../traits/queries/packet_commitments.rs | 32 +++++++++++ crates/relayer-cosmos/Cargo.toml | 2 +- crates/relayer-cosmos/src/impls/chain.rs | 37 ++++++++++++- crates/relayer-cosmos/src/types/error.rs | 10 ++++ 10 files changed, 122 insertions(+), 52 deletions(-) create mode 100644 crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/packet_commitments.rs create mode 100644 crates/relayer-components/src/chain/traits/queries/packet_commitments.rs diff --git a/Cargo.lock b/Cargo.lock index 898f08b676..a9847c2001 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1553,7 +1553,7 @@ dependencies = [ "time 0.3.22", "tokio", "toml 0.7.4", - "tonic 0.9.2", + "tonic", ] [[package]] @@ -1570,7 +1570,7 @@ dependencies = [ "serde", "subtle-encoding", "tendermint-proto", - "tonic 0.9.2", + "tonic", ] [[package]] @@ -1633,7 +1633,7 @@ dependencies = [ "tokio", "tokio-stream", "toml 0.7.4", - "tonic 0.9.2", + "tonic", "tracing", "tracing-subscriber", "uuid 1.4.0", @@ -1746,7 +1746,7 @@ dependencies = [ "tendermint-proto", "tendermint-rpc", "tokio", - "tonic 0.8.3", + "tonic", "tracing", ] @@ -1877,7 +1877,7 @@ dependencies = [ "tendermint-rpc", "tokio", "toml 0.7.4", - "tonic 0.9.2", + "tonic", "tracing", "tracing-subscriber", ] @@ -4045,41 +4045,6 @@ dependencies = [ "winnow", ] -[[package]] -name = "tonic" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f219fad3b929bef19b1f86fbc0358d35daed8f2cac972037ac0dc10bbb8d5fb" -dependencies = [ - "async-stream", - "async-trait", - "axum", - "base64 0.13.1", - "bytes", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-timeout", - "percent-encoding", - "pin-project", - "prost", - "prost-derive", - "rustls-native-certs 0.6.3", - "rustls-pemfile", - "tokio", - "tokio-rustls 0.23.4", - "tokio-stream", - "tokio-util", - "tower", - "tower-layer", - "tower-service", - "tracing", - "tracing-futures", -] - [[package]] name = "tonic" version = "0.9.2" @@ -4188,16 +4153,6 @@ dependencies = [ "tracing-subscriber", ] -[[package]] -name = "tracing-futures" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" -dependencies = [ - "pin-project", - "tracing", -] - [[package]] name = "tracing-log" version = "0.1.3" diff --git a/crates/relayer-all-in-one/src/all_for_one/chain.rs b/crates/relayer-all-in-one/src/all_for_one/chain.rs index 3af1becc6d..0cea381d88 100644 --- a/crates/relayer-all-in-one/src/all_for_one/chain.rs +++ b/crates/relayer-all-in-one/src/all_for_one/chain.rs @@ -1,5 +1,6 @@ use ibc_relayer_components::chain::traits::client::create::HasCreateClientOptions; use ibc_relayer_components::chain::traits::queries::consensus_state::CanQueryConsensusState; +use ibc_relayer_components::chain::traits::queries::packet_commitments::CanQueryPacketCommitments; use ibc_relayer_components::chain::traits::queries::received_packet::CanQueryReceivedPacket; use ibc_relayer_components::chain::traits::queries::status::CanQueryChainStatus; use ibc_relayer_components::chain::traits::types::channel::{ @@ -27,6 +28,7 @@ pub trait AfoChain: + HasConsensusStateType + CanQueryConsensusState + CanQueryReceivedPacket + + CanQueryPacketCommitments + HasCreateClientOptions + HasInitConnectionOptionsType + HasConnectionHandshakePayloads @@ -62,6 +64,7 @@ where + HasConsensusStateType + CanQueryConsensusState + CanQueryReceivedPacket + + CanQueryPacketCommitments + HasCreateClientOptions + HasInitConnectionOptionsType + HasConnectionHandshakePayloads diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/mod.rs b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/mod.rs index 555e1e1a11..12dca035f9 100644 --- a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/mod.rs +++ b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/mod.rs @@ -1,5 +1,6 @@ pub mod channel; pub mod consensus_state; +pub mod packet_commitments; pub mod received_packet; pub mod status; pub mod write_ack; diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/packet_commitments.rs b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/packet_commitments.rs new file mode 100644 index 0000000000..54b837c6c1 --- /dev/null +++ b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/packet_commitments.rs @@ -0,0 +1,27 @@ +use async_trait::async_trait; + +use ibc_relayer_components::chain::traits::queries::packet_commitments::CanQueryPacketCommitments; + +use crate::one_for_all::traits::chain::OfaIbcChain; +use crate::one_for_all::types::chain::OfaChainWrapper; +use crate::std_prelude::*; + +#[async_trait] +impl CanQueryPacketCommitments> + for OfaChainWrapper +where + Chain: OfaIbcChain, + Counterparty: OfaIbcChain, +{ + async fn query_packet_commitments( + &self, + channel_id: &Self::ChannelId, + port_id: &Self::PortId, + ) -> Result, Self::Error> { + let sequences = self + .chain + .query_packet_commitments(channel_id, port_id) + .await?; + Ok(sequences) + } +} diff --git a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs index 85f7755322..fbb4403698 100644 --- a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs +++ b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs @@ -310,6 +310,12 @@ where packet: &Self::IncomingPacket, ) -> Result, Self::Error>; + async fn query_packet_commitments( + &self, + channel_id: &Self::ChannelId, + port_id: &Self::PortId, + ) -> Result, Self::Error>; + async fn build_receive_packet_message( &self, height: &Self::Height, diff --git a/crates/relayer-components/src/chain/traits/queries/mod.rs b/crates/relayer-components/src/chain/traits/queries/mod.rs index 46d762e7c5..668e8d0c75 100644 --- a/crates/relayer-components/src/chain/traits/queries/mod.rs +++ b/crates/relayer-components/src/chain/traits/queries/mod.rs @@ -2,6 +2,7 @@ pub mod channel; pub mod client; pub mod connection; pub mod consensus_state; +pub mod packet_commitments; pub mod received_packet; pub mod status; pub mod write_ack; diff --git a/crates/relayer-components/src/chain/traits/queries/packet_commitments.rs b/crates/relayer-components/src/chain/traits/queries/packet_commitments.rs new file mode 100644 index 0000000000..5d9d039226 --- /dev/null +++ b/crates/relayer-components/src/chain/traits/queries/packet_commitments.rs @@ -0,0 +1,32 @@ +use async_trait::async_trait; + +use crate::chain::traits::types::ibc::HasIbcChainTypes; +use crate::chain::traits::types::packet::HasIbcPacketTypes; +use crate::core::traits::error::HasErrorType; +use crate::std_prelude::*; + +#[async_trait] +pub trait CommitmentsPacketQuerier +where + Chain: HasIbcPacketTypes + HasErrorType, + Counterparty: HasIbcChainTypes, +{ + async fn query_packet_commitments( + chain: &Chain, + port_id: &Chain::PortId, + channel_id: &Chain::ChannelId, + ) -> Result; +} + +#[async_trait] +pub trait CanQueryPacketCommitments: + HasIbcPacketTypes + HasErrorType +where + Counterparty: HasIbcChainTypes, +{ + async fn query_packet_commitments( + &self, + channel_id: &Self::ChannelId, + port_id: &Self::PortId, + ) -> Result, Self::Error>; +} diff --git a/crates/relayer-cosmos/Cargo.toml b/crates/relayer-cosmos/Cargo.toml index 02d1129bec..0291964078 100644 --- a/crates/relayer-cosmos/Cargo.toml +++ b/crates/relayer-cosmos/Cargo.toml @@ -40,7 +40,7 @@ futures = "0.3" tracing = "0.1.36" http = "0.2.8" opentelemetry = { version = "0.17.0", features = ["metrics"] } -tonic = { version = "0.8", features = ["tls", "tls-roots"] } +tonic = { version = "0.9", features = ["tls", "tls-roots"] } moka = { version = "0.10", features = ["future"] } [dependencies.tendermint] diff --git a/crates/relayer-cosmos/src/impls/chain.rs b/crates/relayer-cosmos/src/impls/chain.rs index 8b44e30dd1..6524410422 100644 --- a/crates/relayer-cosmos/src/impls/chain.rs +++ b/crates/relayer-cosmos/src/impls/chain.rs @@ -1,13 +1,15 @@ use alloc::sync::Arc; use async_trait::async_trait; use eyre::eyre; +use ibc_proto::ibc::core::channel::v1::query_client::QueryClient as ChannelQueryClient; use ibc_relayer::chain::client::ClientSettings; use ibc_relayer::chain::counterparty::counterparty_chain_from_channel; use ibc_relayer::chain::endpoint::ChainStatus; use ibc_relayer::chain::handle::ChainHandle; use ibc_relayer::chain::requests::{ IncludeProof, Qualified, QueryChannelRequest, QueryConnectionRequest, - QueryConsensusStateRequest, QueryHeight, QueryUnreceivedPacketsRequest, + QueryConsensusStateRequest, QueryHeight, QueryPacketCommitmentsRequest, + QueryUnreceivedPacketsRequest, }; use ibc_relayer::client_state::AnyClientState; use ibc_relayer::connection::ConnectionMsgType; @@ -64,6 +66,7 @@ use ibc_relayer_types::tx_msg::Msg; use ibc_relayer_types::Height; use prost::Message as _; use tendermint::abci::Event as AbciEvent; +use tonic::Request; use crate::contexts::chain::CosmosChain; use crate::types::channel::{ @@ -600,6 +603,38 @@ where .map_err(BaseError::join)? } + async fn query_packet_commitments( + &self, + channel_id: &ChannelId, + port_id: &PortId, + ) -> Result, Error> { + let mut client = + ChannelQueryClient::connect(self.tx_context.tx_context.tx_config.grpc_address.clone()) + .await + .map_err(BaseError::grpc_transport)?; + + let raw_request = QueryPacketCommitmentsRequest { + port_id: port_id.clone(), + channel_id: channel_id.clone(), + pagination: None, + }; + + let request = Request::new(raw_request.into()); + + let response = client + .packet_commitments(request) + .await + .map_err(|e| BaseError::grpc_status(e, "query_packet_commitments".to_owned()))? + .into_inner(); + + let commitment_sequences: Vec = response + .commitments + .into_iter() + .map(|packet_state| packet_state.sequence.into()) + .collect(); + Ok(commitment_sequences) + } + /// Construct a receive packet to be sent to a destination Cosmos /// chain from a source Cosmos chain. async fn build_receive_packet_message( diff --git a/crates/relayer-cosmos/src/types/error.rs b/crates/relayer-cosmos/src/types/error.rs index 2cd3127007..379021e308 100644 --- a/crates/relayer-cosmos/src/types/error.rs +++ b/crates/relayer-cosmos/src/types/error.rs @@ -13,6 +13,8 @@ use tendermint::Hash as TxHash; use tendermint_rpc::endpoint::broadcast::tx_sync::Response; use tendermint_rpc::Error as TendermintRpcError; use tokio::task::JoinError; +use tonic::transport::Error as TransportError; +use tonic::Status as GrpcStatus; pub type Error = Arc; @@ -76,5 +78,13 @@ define_error! { Join [ TraceError ] | _ | { "error joining tokio tasks" }, + + GrpcTransport + [ TraceError ] + |_| { "error in underlying transport when making gRPC call" }, + + GrpcStatus + { status: GrpcStatus, query: String } + |e| { format!("gRPC call `{}` failed with status: {1}", e.query, e.status) }, } } From 8806a8a2b92c0b5abd383dc899150f91d9112861 Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Fri, 14 Jul 2023 13:42:05 +0200 Subject: [PATCH 02/26] Implement CanQueryUnreceivedPacketSequences for relayer-next --- .../one_for_all/impls/chain/queries/mod.rs | 1 + .../impls/chain/queries/unreceived_packets.rs | 28 +++++++++++++++ .../src/one_for_all/traits/chain.rs | 7 ++++ .../src/chain/traits/queries/mod.rs | 1 + .../traits/queries/unreceived_packets.rs | 34 +++++++++++++++++++ crates/relayer-cosmos/src/impls/chain.rs | 34 +++++++++++++++++++ crates/relayer-cosmos/src/types/error.rs | 9 +++++ 7 files changed, 114 insertions(+) create mode 100644 crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs create mode 100644 crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/mod.rs b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/mod.rs index 12dca035f9..2ac966b8f3 100644 --- a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/mod.rs +++ b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/mod.rs @@ -3,4 +3,5 @@ pub mod consensus_state; pub mod packet_commitments; pub mod received_packet; pub mod status; +pub mod unreceived_packets; pub mod write_ack; diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs new file mode 100644 index 0000000000..b1c876b3cc --- /dev/null +++ b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs @@ -0,0 +1,28 @@ +use async_trait::async_trait; + +use ibc_relayer_components::chain::traits::queries::unreceived_packets::CanQueryUnreceivedPacketSequences; + +use crate::one_for_all::traits::chain::OfaIbcChain; +use crate::one_for_all::types::chain::OfaChainWrapper; +use crate::std_prelude::*; + +#[async_trait] +impl CanQueryUnreceivedPacketSequences> + for OfaChainWrapper +where + Chain: OfaIbcChain, + Counterparty: OfaIbcChain, +{ + async fn query_unreceived_packet_sequences( + &self, + channel_id: &Self::ChannelId, + port_id: &Self::PortId, + sequences: &[Counterparty::Sequence], + ) -> Result<(Vec, Self::Height), Self::Error> { + let unreceived_packets = self + .chain + .query_unreceived_packet_sequences(channel_id, port_id, sequences) + .await?; + Ok(unreceived_packets) + } +} diff --git a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs index fbb4403698..9ed7d45603 100644 --- a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs +++ b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs @@ -316,6 +316,13 @@ where port_id: &Self::PortId, ) -> Result, Self::Error>; + async fn query_unreceived_packet_sequences( + &self, + channel_id: &Self::ChannelId, + port_id: &Self::PortId, + sequences: &[Counterparty::Sequence], + ) -> Result<(Vec, Self::Height), Self::Error>; + async fn build_receive_packet_message( &self, height: &Self::Height, diff --git a/crates/relayer-components/src/chain/traits/queries/mod.rs b/crates/relayer-components/src/chain/traits/queries/mod.rs index 668e8d0c75..87f56d007f 100644 --- a/crates/relayer-components/src/chain/traits/queries/mod.rs +++ b/crates/relayer-components/src/chain/traits/queries/mod.rs @@ -5,4 +5,5 @@ pub mod consensus_state; pub mod packet_commitments; pub mod received_packet; pub mod status; +pub mod unreceived_packets; pub mod write_ack; diff --git a/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs b/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs new file mode 100644 index 0000000000..20cc346a00 --- /dev/null +++ b/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs @@ -0,0 +1,34 @@ +use async_trait::async_trait; + +use crate::chain::traits::types::ibc::HasIbcChainTypes; +use crate::chain::traits::types::packet::HasIbcPacketTypes; +use crate::core::traits::error::HasErrorType; +use crate::std_prelude::*; + +#[async_trait] +pub trait UnreceivedPacketSequencesQuerier +where + Chain: HasIbcPacketTypes + HasErrorType, + Counterparty: HasIbcChainTypes, +{ + async fn query_unreceived_packet_sequences( + &self, + channel_id: &Chain::ChannelId, + port_id: &Chain::PortId, + sequences: &[Counterparty::Sequence], + ) -> Result<(Vec, Chain::Height), Chain::Error>; +} + +#[async_trait] +pub trait CanQueryUnreceivedPacketSequences: + HasIbcPacketTypes + HasErrorType +where + Counterparty: HasIbcChainTypes, +{ + async fn query_unreceived_packet_sequences( + &self, + channel_id: &Self::ChannelId, + port_id: &Self::PortId, + sequences: &[Counterparty::Sequence], + ) -> Result<(Vec, Self::Height), Self::Error>; +} diff --git a/crates/relayer-cosmos/src/impls/chain.rs b/crates/relayer-cosmos/src/impls/chain.rs index 6524410422..3e4add643e 100644 --- a/crates/relayer-cosmos/src/impls/chain.rs +++ b/crates/relayer-cosmos/src/impls/chain.rs @@ -632,9 +632,43 @@ where .into_iter() .map(|packet_state| packet_state.sequence.into()) .collect(); + Ok(commitment_sequences) } + async fn query_unreceived_packet_sequences( + &self, + channel_id: &ChannelId, + port_id: &PortId, + sequences: &[Sequence], + ) -> Result<(Vec, Height), Error> { + let mut client = + ChannelQueryClient::connect(self.tx_context.tx_context.tx_config.grpc_address.clone()) + .await + .map_err(BaseError::grpc_transport)?; + + let raw_request = QueryUnreceivedPacketsRequest { + port_id: port_id.clone(), + channel_id: channel_id.clone(), + packet_commitment_sequences: sequences.to_vec(), + }; + + let request = Request::new(raw_request.into()); + + let response = client + .unreceived_packets(request) + .await + .map_err(|e| BaseError::grpc_status(e, "query_packet_commitments".to_owned()))? + .into_inner(); + + let raw_height = response + .height + .ok_or_else(|| BaseError::missing_height("query_unreceived_packets".to_owned()))?; + let height = raw_height.try_into().map_err(BaseError::ics02)?; + let response_sequences = response.sequences.into_iter().map(|s| s.into()).collect(); + Ok((response_sequences, height)) + } + /// Construct a receive packet to be sent to a destination Cosmos /// chain from a source Cosmos chain. async fn build_receive_packet_message( diff --git a/crates/relayer-cosmos/src/types/error.rs b/crates/relayer-cosmos/src/types/error.rs index 379021e308..5bc4ab7181 100644 --- a/crates/relayer-cosmos/src/types/error.rs +++ b/crates/relayer-cosmos/src/types/error.rs @@ -7,6 +7,7 @@ use ibc_relayer::foreign_client::ForeignClientError; use ibc_relayer::spawn::SpawnError; use ibc_relayer::supervisor::error::Error as SupervisorError; use ibc_relayer_runtime::tokio::error::Error as TokioError; +use ibc_relayer_types::core::ics02_client::error::Error as ClientError; use ibc_relayer_types::core::ics04_channel::error::Error as ChannelError; use prost::EncodeError; use tendermint::Hash as TxHash; @@ -86,5 +87,13 @@ define_error! { GrpcStatus { status: GrpcStatus, query: String } |e| { format!("gRPC call `{}` failed with status: {1}", e.query, e.status) }, + + MissingHeight + { query: String } + | e | { format_args!("height from query `{}` is missing", e.query) }, + + Ics02 + [ ClientError ] + |e| { format!("ICS 02 error: {}", e.source) }, } } From 24a410419541b0eaa8182db111fc0086e95a7b6d Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Fri, 14 Jul 2023 16:04:58 +0200 Subject: [PATCH 03/26] Implement CanQueryUnreceivedPacketEvents for relayer-next --- .../impls/chain/queries/unreceived_packets.rs | 39 ++++++++++++-- .../src/one_for_all/traits/chain.rs | 10 ++++ .../traits/queries/unreceived_packets.rs | 35 ++++++++++++ crates/relayer-cosmos/src/impls/chain.rs | 53 ++++++++++++++++++- 4 files changed, 132 insertions(+), 5 deletions(-) diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs index b1c876b3cc..d6585431df 100644 --- a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs +++ b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs @@ -1,6 +1,8 @@ use async_trait::async_trait; -use ibc_relayer_components::chain::traits::queries::unreceived_packets::CanQueryUnreceivedPacketSequences; +use ibc_relayer_components::chain::traits::queries::unreceived_packets::{ + CanQueryUnreceivedPacketEvents, CanQueryUnreceivedPacketSequences, +}; use crate::one_for_all::traits::chain::OfaIbcChain; use crate::one_for_all::types::chain::OfaChainWrapper; @@ -19,10 +21,41 @@ where port_id: &Self::PortId, sequences: &[Counterparty::Sequence], ) -> Result<(Vec, Self::Height), Self::Error> { - let unreceived_packets = self + let unreceived_packet_sequences = self .chain .query_unreceived_packet_sequences(channel_id, port_id, sequences) .await?; - Ok(unreceived_packets) + Ok(unreceived_packet_sequences) + } +} + +#[async_trait] +impl CanQueryUnreceivedPacketEvents> + for OfaChainWrapper +where + Chain: OfaIbcChain, + Counterparty: OfaIbcChain, +{ + async fn query_unreceived_packet_events( + &self, + channel_id: &Self::ChannelId, + port_id: &Self::PortId, + counterparty_channel_id: &Counterparty::ChannelId, + counterparty_port_id: &Counterparty::PortId, + sequences: &[Self::Sequence], + height: &Self::Height, + ) -> Result, Self::Error> { + let unreceived_packet_events = self + .chain + .query_unreceived_packet_events( + channel_id, + port_id, + counterparty_channel_id, + counterparty_port_id, + sequences, + height, + ) + .await?; + Ok(unreceived_packet_events) } } diff --git a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs index 9ed7d45603..10ea76fbd4 100644 --- a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs +++ b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs @@ -323,6 +323,16 @@ where sequences: &[Counterparty::Sequence], ) -> Result<(Vec, Self::Height), Self::Error>; + async fn query_unreceived_packet_events( + &self, + channel_id: &Self::ChannelId, + port_id: &Self::PortId, + counterparty_channel_id: &Counterparty::ChannelId, + counterparty_port_id: &Counterparty::PortId, + sequences: &[Self::Sequence], + height: &Self::Height, + ) -> Result, Self::Error>; + async fn build_receive_packet_message( &self, height: &Self::Height, diff --git a/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs b/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs index 20cc346a00..967b04a27c 100644 --- a/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs +++ b/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs @@ -1,6 +1,7 @@ use async_trait::async_trait; use crate::chain::traits::types::ibc::HasIbcChainTypes; +use crate::chain::traits::types::ibc_events::send_packet::HasSendPacketEvent; use crate::chain::traits::types::packet::HasIbcPacketTypes; use crate::core::traits::error::HasErrorType; use crate::std_prelude::*; @@ -32,3 +33,37 @@ where sequences: &[Counterparty::Sequence], ) -> Result<(Vec, Self::Height), Self::Error>; } + +#[async_trait] +pub trait UnreceivedPacketEventsQuerier +where + Chain: HasIbcPacketTypes + HasSendPacketEvent + HasErrorType, + Counterparty: HasIbcChainTypes, +{ + async fn query_unreceived_packet_events( + &self, + channel_id: &Chain::ChannelId, + port_id: &Chain::PortId, + counterparty_channel_id: &Counterparty::ChannelId, + counterparty_port_id: &Counterparty::PortId, + sequences: &[Chain::Sequence], + height: &Chain::Height, + ) -> Result, Chain::Error>; +} + +#[async_trait] +pub trait CanQueryUnreceivedPacketEvents: + HasIbcPacketTypes + HasSendPacketEvent + HasErrorType +where + Counterparty: HasIbcChainTypes, +{ + async fn query_unreceived_packet_events( + &self, + channel_id: &Self::ChannelId, + port_id: &Self::PortId, + counterparty_channel_id: &Counterparty::ChannelId, + counterparty_port_id: &Counterparty::PortId, + sequences: &[Self::Sequence], + height: &Self::Height, + ) -> Result, Self::Error>; +} diff --git a/crates/relayer-cosmos/src/impls/chain.rs b/crates/relayer-cosmos/src/impls/chain.rs index 3e4add643e..0113bca624 100644 --- a/crates/relayer-cosmos/src/impls/chain.rs +++ b/crates/relayer-cosmos/src/impls/chain.rs @@ -3,13 +3,14 @@ use async_trait::async_trait; use eyre::eyre; use ibc_proto::ibc::core::channel::v1::query_client::QueryClient as ChannelQueryClient; use ibc_relayer::chain::client::ClientSettings; +use ibc_relayer::chain::cosmos::query::packet_query; use ibc_relayer::chain::counterparty::counterparty_chain_from_channel; use ibc_relayer::chain::endpoint::ChainStatus; use ibc_relayer::chain::handle::ChainHandle; use ibc_relayer::chain::requests::{ IncludeProof, Qualified, QueryChannelRequest, QueryConnectionRequest, QueryConsensusStateRequest, QueryHeight, QueryPacketCommitmentsRequest, - QueryUnreceivedPacketsRequest, + QueryPacketEventDataRequest, QueryUnreceivedPacketsRequest, }; use ibc_relayer::client_state::AnyClientState; use ibc_relayer::connection::ConnectionMsgType; @@ -59,13 +60,14 @@ use ibc_relayer_types::core::ics04_channel::timeout::TimeoutHeight; use ibc_relayer_types::core::ics24_host::identifier::{ ChainId, ChannelId, ClientId, ConnectionId, PortId, }; -use ibc_relayer_types::events::{IbcEvent, IbcEventType}; +use ibc_relayer_types::events::{IbcEvent, IbcEventType, WithBlockDataType}; use ibc_relayer_types::signer::Signer; use ibc_relayer_types::timestamp::Timestamp; use ibc_relayer_types::tx_msg::Msg; use ibc_relayer_types::Height; use prost::Message as _; use tendermint::abci::Event as AbciEvent; +use tendermint_rpc::{Client, Order}; use tonic::Request; use crate::contexts::chain::CosmosChain; @@ -669,6 +671,53 @@ where Ok((response_sequences, height)) } + async fn query_unreceived_packet_events( + &self, + channel_id: &ChannelId, + port_id: &PortId, + counterparty_channel_id: &ChannelId, + counterparty_port_id: &PortId, + sequences: &[Sequence], + height: &Height, + ) -> Result, Self::Error> { + let request = QueryPacketEventDataRequest { + event_id: WithBlockDataType::SendPacket, + source_channel_id: channel_id.clone(), + source_port_id: port_id.clone(), + destination_channel_id: counterparty_channel_id.clone(), + destination_port_id: counterparty_port_id.clone(), + sequences: sequences.to_vec(), + height: Qualified::SmallerEqual(QueryHeight::Specific(*height)), + }; + let mut events = vec![]; + for sequence in sequences.iter() { + let query = packet_query(&request, *sequence); + let response = self + .tx_context + .tx_context + .rpc_client + .tx_search(query, false, 1, 10, Order::Descending) + .await + .unwrap(); + for tx in response.txs.iter() { + let mut event = tx + .tx_result + .events + .iter() + .map(|event| Arc::new(event.clone())) + .collect(); + events.append(&mut event); + } + } + let send_packet_events = events + .iter() + .filter_map( + >>::try_extract_send_packet_event, + ) + .collect(); + Ok(send_packet_events) + } + /// Construct a receive packet to be sent to a destination Cosmos /// chain from a source Cosmos chain. async fn build_receive_packet_message( From 86c547652d8fdb4fb7e3abcaa4e7535be1f24e1e Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Fri, 14 Jul 2023 17:24:44 +0200 Subject: [PATCH 04/26] Implement CanQueryUnreceivedPackets for relayer-next --- .../impls/chain/queries/unreceived_packets.rs | 14 +++++++------- .../src/one_for_all/traits/chain.rs | 4 ++-- .../chain/traits/queries/unreceived_packets.rs | 17 ++++++++--------- crates/relayer-cosmos/src/impls/chain.rs | 9 +++++---- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs index d6585431df..3fdcd3755a 100644 --- a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs +++ b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs @@ -1,7 +1,7 @@ use async_trait::async_trait; use ibc_relayer_components::chain::traits::queries::unreceived_packets::{ - CanQueryUnreceivedPacketEvents, CanQueryUnreceivedPacketSequences, + CanQueryUnreceivedPacketSequences, CanQueryUnreceivedPackets, }; use crate::one_for_all::traits::chain::OfaIbcChain; @@ -30,13 +30,13 @@ where } #[async_trait] -impl CanQueryUnreceivedPacketEvents> +impl CanQueryUnreceivedPackets> for OfaChainWrapper where Chain: OfaIbcChain, Counterparty: OfaIbcChain, { - async fn query_unreceived_packet_events( + async fn query_unreceived_packets( &self, channel_id: &Self::ChannelId, port_id: &Self::PortId, @@ -44,10 +44,10 @@ where counterparty_port_id: &Counterparty::PortId, sequences: &[Self::Sequence], height: &Self::Height, - ) -> Result, Self::Error> { - let unreceived_packet_events = self + ) -> Result, Self::Error> { + let unreceived_packets = self .chain - .query_unreceived_packet_events( + .query_unreceived_packets( channel_id, port_id, counterparty_channel_id, @@ -56,6 +56,6 @@ where height, ) .await?; - Ok(unreceived_packet_events) + Ok(unreceived_packets) } } diff --git a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs index 10ea76fbd4..9c651b1d1c 100644 --- a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs +++ b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs @@ -323,7 +323,7 @@ where sequences: &[Counterparty::Sequence], ) -> Result<(Vec, Self::Height), Self::Error>; - async fn query_unreceived_packet_events( + async fn query_unreceived_packets( &self, channel_id: &Self::ChannelId, port_id: &Self::PortId, @@ -331,7 +331,7 @@ where counterparty_port_id: &Counterparty::PortId, sequences: &[Self::Sequence], height: &Self::Height, - ) -> Result, Self::Error>; + ) -> Result, Self::Error>; async fn build_receive_packet_message( &self, diff --git a/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs b/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs index 967b04a27c..07cd3e60b0 100644 --- a/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs +++ b/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs @@ -1,7 +1,6 @@ use async_trait::async_trait; use crate::chain::traits::types::ibc::HasIbcChainTypes; -use crate::chain::traits::types::ibc_events::send_packet::HasSendPacketEvent; use crate::chain::traits::types::packet::HasIbcPacketTypes; use crate::core::traits::error::HasErrorType; use crate::std_prelude::*; @@ -35,12 +34,12 @@ where } #[async_trait] -pub trait UnreceivedPacketEventsQuerier +pub trait UnreceivedPacketsQuerier where - Chain: HasIbcPacketTypes + HasSendPacketEvent + HasErrorType, + Chain: HasIbcPacketTypes + HasErrorType, Counterparty: HasIbcChainTypes, { - async fn query_unreceived_packet_events( + async fn query_unreceived_packets( &self, channel_id: &Chain::ChannelId, port_id: &Chain::PortId, @@ -48,16 +47,16 @@ where counterparty_port_id: &Counterparty::PortId, sequences: &[Chain::Sequence], height: &Chain::Height, - ) -> Result, Chain::Error>; + ) -> Result, Chain::Error>; } #[async_trait] -pub trait CanQueryUnreceivedPacketEvents: - HasIbcPacketTypes + HasSendPacketEvent + HasErrorType +pub trait CanQueryUnreceivedPackets: + HasIbcPacketTypes + HasErrorType where Counterparty: HasIbcChainTypes, { - async fn query_unreceived_packet_events( + async fn query_unreceived_packets( &self, channel_id: &Self::ChannelId, port_id: &Self::PortId, @@ -65,5 +64,5 @@ where counterparty_port_id: &Counterparty::PortId, sequences: &[Self::Sequence], height: &Self::Height, - ) -> Result, Self::Error>; + ) -> Result, Self::Error>; } diff --git a/crates/relayer-cosmos/src/impls/chain.rs b/crates/relayer-cosmos/src/impls/chain.rs index 0113bca624..de2be22578 100644 --- a/crates/relayer-cosmos/src/impls/chain.rs +++ b/crates/relayer-cosmos/src/impls/chain.rs @@ -671,7 +671,7 @@ where Ok((response_sequences, height)) } - async fn query_unreceived_packet_events( + async fn query_unreceived_packets( &self, channel_id: &ChannelId, port_id: &PortId, @@ -679,7 +679,7 @@ where counterparty_port_id: &PortId, sequences: &[Sequence], height: &Height, - ) -> Result, Self::Error> { + ) -> Result, Self::Error> { let request = QueryPacketEventDataRequest { event_id: WithBlockDataType::SendPacket, source_channel_id: channel_id.clone(), @@ -709,13 +709,14 @@ where events.append(&mut event); } } - let send_packet_events = events + let send_packet_events: Vec = events .iter() .filter_map( >>::try_extract_send_packet_event, ) .collect(); - Ok(send_packet_events) + let send_packets: Vec = send_packet_events.iter().map(>>::extract_packet_from_send_packet_event).collect(); + Ok(send_packets) } /// Construct a receive packet to be sent to a destination Cosmos From 55399d531888aac5abffabe380b7f53b6420d353 Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Mon, 17 Jul 2023 17:15:32 +0200 Subject: [PATCH 05/26] Implement PacketClearerWithTarget for relayer-next --- .../impls/chain/queries/unreceived_packets.rs | 14 ++--- .../src/one_for_all/traits/chain.rs | 4 +- .../traits/queries/unreceived_packets.rs | 12 ++-- .../relayer-components/src/relay/impls/mod.rs | 1 + .../src/relay/impls/packet_clear/mod.rs | 1 + .../impls/packet_clear/target_packet_clear.rs | 57 +++++++++++++++++++ .../src/relay/traits/mod.rs | 1 + .../src/relay/traits/packet_clear.rs | 23 ++++++++ crates/relayer-cosmos/src/impls/chain.rs | 18 +++--- 9 files changed, 105 insertions(+), 26 deletions(-) create mode 100644 crates/relayer-components/src/relay/impls/packet_clear/mod.rs create mode 100644 crates/relayer-components/src/relay/impls/packet_clear/target_packet_clear.rs create mode 100644 crates/relayer-components/src/relay/traits/packet_clear.rs diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs index 3fdcd3755a..3d5d005835 100644 --- a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs +++ b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs @@ -1,7 +1,7 @@ use async_trait::async_trait; use ibc_relayer_components::chain::traits::queries::unreceived_packets::{ - CanQueryUnreceivedPacketSequences, CanQueryUnreceivedPackets, + CanQueryUnreceivedPacketEvents, CanQueryUnreceivedPacketSequences, }; use crate::one_for_all::traits::chain::OfaIbcChain; @@ -30,13 +30,13 @@ where } #[async_trait] -impl CanQueryUnreceivedPackets> +impl CanQueryUnreceivedPacketEvents> for OfaChainWrapper where Chain: OfaIbcChain, Counterparty: OfaIbcChain, { - async fn query_unreceived_packets( + async fn query_unreceived_packet_events( &self, channel_id: &Self::ChannelId, port_id: &Self::PortId, @@ -44,10 +44,10 @@ where counterparty_port_id: &Counterparty::PortId, sequences: &[Self::Sequence], height: &Self::Height, - ) -> Result, Self::Error> { - let unreceived_packets = self + ) -> Result, Self::Error> { + let unreceived_packet_events = self .chain - .query_unreceived_packets( + .query_unreceived_packet_events( channel_id, port_id, counterparty_channel_id, @@ -56,6 +56,6 @@ where height, ) .await?; - Ok(unreceived_packets) + Ok(unreceived_packet_events) } } diff --git a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs index c84268ed4b..5fa876085c 100644 --- a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs +++ b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs @@ -334,7 +334,7 @@ where sequences: &[Counterparty::Sequence], ) -> Result<(Vec, Self::Height), Self::Error>; - async fn query_unreceived_packets( + async fn query_unreceived_packet_events( &self, channel_id: &Self::ChannelId, port_id: &Self::PortId, @@ -342,7 +342,7 @@ where counterparty_port_id: &Counterparty::PortId, sequences: &[Self::Sequence], height: &Self::Height, - ) -> Result, Self::Error>; + ) -> Result, Self::Error>; async fn build_receive_packet_message( &self, diff --git a/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs b/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs index 07cd3e60b0..0f87b9ab9b 100644 --- a/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs +++ b/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs @@ -34,12 +34,12 @@ where } #[async_trait] -pub trait UnreceivedPacketsQuerier +pub trait UnreceivedPacketEventsQuerier where Chain: HasIbcPacketTypes + HasErrorType, Counterparty: HasIbcChainTypes, { - async fn query_unreceived_packets( + async fn query_unreceived_packet_events( &self, channel_id: &Chain::ChannelId, port_id: &Chain::PortId, @@ -47,16 +47,16 @@ where counterparty_port_id: &Counterparty::PortId, sequences: &[Chain::Sequence], height: &Chain::Height, - ) -> Result, Chain::Error>; + ) -> Result, Chain::Error>; } #[async_trait] -pub trait CanQueryUnreceivedPackets: +pub trait CanQueryUnreceivedPacketEvents: HasIbcPacketTypes + HasErrorType where Counterparty: HasIbcChainTypes, { - async fn query_unreceived_packets( + async fn query_unreceived_packet_events( &self, channel_id: &Self::ChannelId, port_id: &Self::PortId, @@ -64,5 +64,5 @@ where counterparty_port_id: &Counterparty::PortId, sequences: &[Self::Sequence], height: &Self::Height, - ) -> Result, Self::Error>; + ) -> Result, Self::Error>; } diff --git a/crates/relayer-components/src/relay/impls/mod.rs b/crates/relayer-components/src/relay/impls/mod.rs index 8a6f057ad1..8607aab777 100644 --- a/crates/relayer-components/src/relay/impls/mod.rs +++ b/crates/relayer-components/src/relay/impls/mod.rs @@ -5,6 +5,7 @@ pub mod connection; pub mod event_relayers; pub mod message_senders; pub mod messages; +pub mod packet_clear; pub mod packet_filters; pub mod packet_relayers; pub mod update_client; diff --git a/crates/relayer-components/src/relay/impls/packet_clear/mod.rs b/crates/relayer-components/src/relay/impls/packet_clear/mod.rs new file mode 100644 index 0000000000..a55f21c8dc --- /dev/null +++ b/crates/relayer-components/src/relay/impls/packet_clear/mod.rs @@ -0,0 +1 @@ +pub mod target_packet_clear; diff --git a/crates/relayer-components/src/relay/impls/packet_clear/target_packet_clear.rs b/crates/relayer-components/src/relay/impls/packet_clear/target_packet_clear.rs new file mode 100644 index 0000000000..ec394b871b --- /dev/null +++ b/crates/relayer-components/src/relay/impls/packet_clear/target_packet_clear.rs @@ -0,0 +1,57 @@ +use async_trait::async_trait; + +use crate::chain::traits::queries::packet_commitments::CanQueryPacketCommitments; +use crate::chain::traits::queries::unreceived_packets::CanQueryUnreceivedPacketEvents; +use crate::chain::types::aliases::{ChannelId, Height, PortId}; +use crate::relay::impls::packet_filters::chain::MatchPacketDestinationChain; +use crate::relay::traits::event_relayer::CanRelayEvent; +use crate::relay::traits::packet::HasRelayPacket; +use crate::relay::traits::packet_clear::PacketClearerWithTarget; +use crate::relay::traits::packet_filter::PacketFilter; +use crate::relay::traits::target::ChainTarget; +use crate::std_prelude::*; + +pub struct PacketClearRelayer; + +#[async_trait] +impl PacketClearerWithTarget for PacketClearRelayer +where + Relay: HasRelayPacket + CanRelayEvent, + Target: ChainTarget, + Target::TargetChain: CanQueryPacketCommitments + + CanQueryUnreceivedPacketEvents, + MatchPacketDestinationChain: PacketFilter, +{ + async fn clear_packets_with_target( + relay: &Relay, + channel_id: &ChannelId, + port_id: &PortId, + counterparty_channel_id: &ChannelId, + counterparty_port_id: &PortId, + height: &Height, + ) -> Result<(), Relay::Error> { + let chain = Target::target_chain(relay); + + let sequences = chain + .query_packet_commitments(channel_id, port_id) + .await + .map_err(Target::target_chain_error)?; + + let unreceived_packet_events = chain + .query_unreceived_packet_events( + channel_id, + port_id, + counterparty_channel_id, + counterparty_port_id, + &sequences, + height, + ) + .await + .map_err(Target::target_chain_error)?; + + for event in unreceived_packet_events.iter() { + relay.relay_chain_event(height, event).await?; + } + Ok(()) + } +} diff --git a/crates/relayer-components/src/relay/traits/mod.rs b/crates/relayer-components/src/relay/traits/mod.rs index 09704311e8..8cc507ac51 100644 --- a/crates/relayer-components/src/relay/traits/mod.rs +++ b/crates/relayer-components/src/relay/traits/mod.rs @@ -7,6 +7,7 @@ pub mod ibc_message_sender; pub mod logs; pub mod messages; pub mod packet; +pub mod packet_clear; pub mod packet_filter; pub mod packet_relayer; pub mod packet_relayers; diff --git a/crates/relayer-components/src/relay/traits/packet_clear.rs b/crates/relayer-components/src/relay/traits/packet_clear.rs new file mode 100644 index 0000000000..2330407ed9 --- /dev/null +++ b/crates/relayer-components/src/relay/traits/packet_clear.rs @@ -0,0 +1,23 @@ +use async_trait::async_trait; + +use crate::chain::types::aliases::{ChannelId, Height, PortId}; +use crate::core::traits::sync::Async; +use crate::relay::traits::packet::HasRelayPacket; +use crate::relay::traits::target::ChainTarget; +use crate::std_prelude::*; + +#[async_trait] +pub trait PacketClearerWithTarget: Async +where + Relay: HasRelayPacket, + Target: ChainTarget, +{ + async fn clear_packets_with_target( + relay: &Relay, + channel_id: &ChannelId, + port_id: &PortId, + counterparty_channel_id: &ChannelId, + counterparty_port_id: &PortId, + height: &Height, + ) -> Result<(), Relay::Error>; +} diff --git a/crates/relayer-cosmos/src/impls/chain.rs b/crates/relayer-cosmos/src/impls/chain.rs index 6d2cff15df..f7fcb83c29 100644 --- a/crates/relayer-cosmos/src/impls/chain.rs +++ b/crates/relayer-cosmos/src/impls/chain.rs @@ -2,14 +2,17 @@ use alloc::sync::Arc; use async_trait::async_trait; use core::iter; use eyre::eyre; +use ibc_proto::ibc::core::channel::v1::query_client::QueryClient as ChannelQueryClient; use ibc_relayer::chain::client::ClientSettings; +use ibc_relayer::chain::cosmos::query::packet_query; use ibc_relayer::chain::counterparty::counterparty_chain_from_channel; use ibc_relayer::chain::endpoint::ChainStatus; use ibc_relayer::chain::handle::ChainHandle; use ibc_relayer::chain::requests::{ IncludeProof, PageRequest, Qualified, QueryChannelRequest, QueryClientStateRequest, QueryConnectionRequest, QueryConsensusStateHeightsRequest, QueryConsensusStateRequest, - QueryHeight, QueryUnreceivedPacketsRequest, + QueryHeight, QueryPacketCommitmentsRequest, QueryPacketEventDataRequest, + QueryUnreceivedPacketsRequest, }; use ibc_relayer::client_state::AnyClientState; use ibc_relayer::connection::ConnectionMsgType; @@ -709,7 +712,7 @@ where Ok((response_sequences, height)) } - async fn query_unreceived_packets( + async fn query_unreceived_packet_events( &self, channel_id: &ChannelId, port_id: &PortId, @@ -717,7 +720,7 @@ where counterparty_port_id: &PortId, sequences: &[Sequence], height: &Height, - ) -> Result, Self::Error> { + ) -> Result>, Self::Error> { let request = QueryPacketEventDataRequest { event_id: WithBlockDataType::SendPacket, source_channel_id: channel_id.clone(), @@ -747,14 +750,7 @@ where events.append(&mut event); } } - let send_packet_events: Vec = events - .iter() - .filter_map( - >>::try_extract_send_packet_event, - ) - .collect(); - let send_packets: Vec = send_packet_events.iter().map(>>::extract_packet_from_send_packet_event).collect(); - Ok(send_packets) + Ok(events) } /// Construct a receive packet to be sent to a destination Cosmos From f3005066e6a64c707231d785ca0fd23b459ea3e3 Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Tue, 18 Jul 2023 10:43:33 +0200 Subject: [PATCH 06/26] Fix clear_packets_with_target --- .../impls/packet_clear/target_packet_clear.rs | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/crates/relayer-components/src/relay/impls/packet_clear/target_packet_clear.rs b/crates/relayer-components/src/relay/impls/packet_clear/target_packet_clear.rs index ec394b871b..0d64692604 100644 --- a/crates/relayer-components/src/relay/impls/packet_clear/target_packet_clear.rs +++ b/crates/relayer-components/src/relay/impls/packet_clear/target_packet_clear.rs @@ -1,7 +1,9 @@ use async_trait::async_trait; use crate::chain::traits::queries::packet_commitments::CanQueryPacketCommitments; -use crate::chain::traits::queries::unreceived_packets::CanQueryUnreceivedPacketEvents; +use crate::chain::traits::queries::unreceived_packets::{ + CanQueryUnreceivedPacketEvents, CanQueryUnreceivedPacketSequences, +}; use crate::chain::types::aliases::{ChannelId, Height, PortId}; use crate::relay::impls::packet_filters::chain::MatchPacketDestinationChain; use crate::relay::traits::event_relayer::CanRelayEvent; @@ -18,8 +20,9 @@ impl PacketClearerWithTarget for PacketClearRelaye where Relay: HasRelayPacket + CanRelayEvent, Target: ChainTarget, - Target::TargetChain: CanQueryPacketCommitments + Target::TargetChain: CanQueryUnreceivedPacketSequences + CanQueryUnreceivedPacketEvents, + Target::CounterpartyChain: CanQueryPacketCommitments, MatchPacketDestinationChain: PacketFilter, { async fn clear_packets_with_target( @@ -31,9 +34,15 @@ where height: &Height, ) -> Result<(), Relay::Error> { let chain = Target::target_chain(relay); + let counterparty_chain = Target::counterparty_chain(relay); - let sequences = chain - .query_packet_commitments(channel_id, port_id) + let commitment_sequences = counterparty_chain + .query_packet_commitments(counterparty_channel_id, counterparty_port_id) + .await + .map_err(Target::counterparty_chain_error)?; + + let (unreceived_sequences, unreceived_height) = chain + .query_unreceived_packet_sequences(channel_id, port_id, &commitment_sequences) .await .map_err(Target::target_chain_error)?; @@ -43,8 +52,8 @@ where port_id, counterparty_channel_id, counterparty_port_id, - &sequences, - height, + &unreceived_sequences, + &unreceived_height, ) .await .map_err(Target::target_chain_error)?; From 4f15ac83472d47257eff69a40c1f38e70912a623 Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Wed, 19 Jul 2023 14:10:25 +0200 Subject: [PATCH 07/26] Partial implementation of ClearPacketWorker for relayer-next --- .../impls/chain/queries/packet_commitments.rs | 2 +- .../impls/chain/queries/unreceived_packets.rs | 20 ++-- .../src/one_for_all/traits/chain.rs | 8 +- crates/relayer-components-extra/src/lib.rs | 1 + .../src/packet_clear/impls/mod.rs | 1 + .../impls/unreceived_packets_clear.rs | 64 ++++++++++ .../src/packet_clear/mod.rs | 4 + .../src/packet_clear/traits/mod.rs | 1 + .../src/packet_clear/traits/packet_clear.rs | 31 +++++ .../src/packet_clear/types/config.rs | 14 +++ .../src/packet_clear/types/mod.rs | 1 + .../src/packet_clear/worker.rs | 110 ++++++++++++++++++ .../traits/queries/packet_commitments.rs | 4 +- .../traits/queries/unreceived_packets.rs | 21 ++-- .../relayer-components/src/relay/impls/mod.rs | 1 - .../src/relay/impls/packet_clear/mod.rs | 1 - .../impls/packet_clear/target_packet_clear.rs | 66 ----------- .../src/relay/traits/mod.rs | 1 - .../src/relay/traits/packet_clear.rs | 23 ---- crates/relayer-cosmos/src/impls/chain.rs | 4 +- .../src/methods/unreceived_packet.rs | 16 ++- tools/integration-test/src/tests/next/mod.rs | 1 + .../src/tests/next/packet_clear.rs | 75 ++++++++++++ 23 files changed, 346 insertions(+), 124 deletions(-) create mode 100644 crates/relayer-components-extra/src/packet_clear/impls/mod.rs create mode 100644 crates/relayer-components-extra/src/packet_clear/impls/unreceived_packets_clear.rs create mode 100644 crates/relayer-components-extra/src/packet_clear/mod.rs create mode 100644 crates/relayer-components-extra/src/packet_clear/traits/mod.rs create mode 100644 crates/relayer-components-extra/src/packet_clear/traits/packet_clear.rs create mode 100644 crates/relayer-components-extra/src/packet_clear/types/config.rs create mode 100644 crates/relayer-components-extra/src/packet_clear/types/mod.rs create mode 100644 crates/relayer-components-extra/src/packet_clear/worker.rs delete mode 100644 crates/relayer-components/src/relay/impls/packet_clear/mod.rs delete mode 100644 crates/relayer-components/src/relay/impls/packet_clear/target_packet_clear.rs delete mode 100644 crates/relayer-components/src/relay/traits/packet_clear.rs create mode 100644 tools/integration-test/src/tests/next/packet_clear.rs diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/packet_commitments.rs b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/packet_commitments.rs index 54b837c6c1..3b25dfa65d 100644 --- a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/packet_commitments.rs +++ b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/packet_commitments.rs @@ -17,7 +17,7 @@ where &self, channel_id: &Self::ChannelId, port_id: &Self::PortId, - ) -> Result, Self::Error> { + ) -> Result, Self::Error> { let sequences = self .chain .query_packet_commitments(channel_id, port_id) diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs index 3d5d005835..db39059212 100644 --- a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs +++ b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs @@ -1,10 +1,10 @@ use async_trait::async_trait; use ibc_relayer_components::chain::traits::queries::unreceived_packets::{ - CanQueryUnreceivedPacketEvents, CanQueryUnreceivedPacketSequences, + CanQueryUnreceivedPacketSequences, CanQueryUnreceivedPackets, }; -use crate::one_for_all::traits::chain::OfaIbcChain; +use crate::one_for_all::traits::chain::{OfaChainTypes, OfaIbcChain}; use crate::one_for_all::types::chain::OfaChainWrapper; use crate::std_prelude::*; @@ -19,7 +19,7 @@ where &self, channel_id: &Self::ChannelId, port_id: &Self::PortId, - sequences: &[Counterparty::Sequence], + sequences: &[Self::Sequence], ) -> Result<(Vec, Self::Height), Self::Error> { let unreceived_packet_sequences = self .chain @@ -30,13 +30,13 @@ where } #[async_trait] -impl CanQueryUnreceivedPacketEvents> +impl CanQueryUnreceivedPackets> for OfaChainWrapper where - Chain: OfaIbcChain, + Chain: OfaIbcChain + OfaChainTypes, Counterparty: OfaIbcChain, { - async fn query_unreceived_packet_events( + async fn query_unreceived_packets( &self, channel_id: &Self::ChannelId, port_id: &Self::PortId, @@ -44,10 +44,10 @@ where counterparty_port_id: &Counterparty::PortId, sequences: &[Self::Sequence], height: &Self::Height, - ) -> Result, Self::Error> { - let unreceived_packet_events = self + ) -> Result, Self::Error> { + let unreceived_packet = self .chain - .query_unreceived_packet_events( + .query_unreceived_packets( channel_id, port_id, counterparty_channel_id, @@ -56,6 +56,6 @@ where height, ) .await?; - Ok(unreceived_packet_events) + Ok(unreceived_packet) } } diff --git a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs index 13b5ada057..bb88876ea5 100644 --- a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs +++ b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs @@ -334,16 +334,16 @@ where &self, channel_id: &Self::ChannelId, port_id: &Self::PortId, - ) -> Result, Self::Error>; + ) -> Result, Self::Error>; async fn query_unreceived_packet_sequences( &self, channel_id: &Self::ChannelId, port_id: &Self::PortId, - sequences: &[Counterparty::Sequence], + sequences: &[Self::Sequence], ) -> Result<(Vec, Self::Height), Self::Error>; - async fn query_unreceived_packet_events( + async fn query_unreceived_packets( &self, channel_id: &Self::ChannelId, port_id: &Self::PortId, @@ -351,7 +351,7 @@ where counterparty_port_id: &Counterparty::PortId, sequences: &[Self::Sequence], height: &Self::Height, - ) -> Result, Self::Error>; + ) -> Result, Self::Error>; async fn build_receive_packet_payload( &self, diff --git a/crates/relayer-components-extra/src/lib.rs b/crates/relayer-components-extra/src/lib.rs index fc19f1c994..02634b48a9 100644 --- a/crates/relayer-components-extra/src/lib.rs +++ b/crates/relayer-components-extra/src/lib.rs @@ -7,6 +7,7 @@ extern crate alloc; pub mod batch; pub mod builder; +pub mod packet_clear; pub mod relay; pub mod runtime; pub mod telemetry; diff --git a/crates/relayer-components-extra/src/packet_clear/impls/mod.rs b/crates/relayer-components-extra/src/packet_clear/impls/mod.rs new file mode 100644 index 0000000000..d01ba9ccc2 --- /dev/null +++ b/crates/relayer-components-extra/src/packet_clear/impls/mod.rs @@ -0,0 +1 @@ +pub mod unreceived_packets_clear; diff --git a/crates/relayer-components-extra/src/packet_clear/impls/unreceived_packets_clear.rs b/crates/relayer-components-extra/src/packet_clear/impls/unreceived_packets_clear.rs new file mode 100644 index 0000000000..d8e5494364 --- /dev/null +++ b/crates/relayer-components-extra/src/packet_clear/impls/unreceived_packets_clear.rs @@ -0,0 +1,64 @@ +use async_trait::async_trait; +use ibc_relayer_components::chain::traits::queries::packet_commitments::CanQueryPacketCommitments; +use ibc_relayer_components::chain::traits::queries::unreceived_packets::{ + CanQueryUnreceivedPacketSequences, CanQueryUnreceivedPackets, +}; +use ibc_relayer_components::chain::types::aliases::{ChannelId, PortId}; +use ibc_relayer_components::relay::traits::packet::HasRelayPacket; +use ibc_relayer_components::relay::traits::packet_relayer::CanRelayPacket; + +use crate::packet_clear::traits::packet_clear::PacketClearer; +use crate::std_prelude::*; + +pub struct PacketClearRelayer; + +#[async_trait] +impl PacketClearer for PacketClearRelayer +where + Relay: HasRelayPacket + CanRelayPacket, + Relay::DstChain: CanQueryPacketCommitments, + Relay::SrcChain: CanQueryUnreceivedPacketSequences + + CanQueryUnreceivedPackets, +{ + async fn clear_packets( + relay: &Relay, + channel_id: &ChannelId, + port_id: &PortId, + counterparty_channel_id: &ChannelId, + counterparty_port_id: &PortId, + ) -> Result<(), Relay::Error> { + let chain = relay.dst_chain(); + let counterparty_chain = relay.src_chain(); + + let commitment_sequences = chain + .query_packet_commitments(channel_id, port_id) + .await + .map_err(Relay::dst_chain_error)?; + + let (unreceived_sequences, unreceived_height) = counterparty_chain + .query_unreceived_packet_sequences( + counterparty_channel_id, + counterparty_port_id, + &commitment_sequences, + ) + .await + .map_err(Relay::src_chain_error)?; + + let unreceived_packets = counterparty_chain + .query_unreceived_packets( + counterparty_channel_id, + counterparty_port_id, + channel_id, + port_id, + &unreceived_sequences, + &unreceived_height, + ) + .await + .map_err(Relay::src_chain_error)?; + + for packet in unreceived_packets.iter() { + relay.relay_packet(packet).await?; + } + Ok(()) + } +} diff --git a/crates/relayer-components-extra/src/packet_clear/mod.rs b/crates/relayer-components-extra/src/packet_clear/mod.rs new file mode 100644 index 0000000000..35e02c0c8e --- /dev/null +++ b/crates/relayer-components-extra/src/packet_clear/mod.rs @@ -0,0 +1,4 @@ +pub mod impls; +pub mod traits; +pub mod types; +pub mod worker; diff --git a/crates/relayer-components-extra/src/packet_clear/traits/mod.rs b/crates/relayer-components-extra/src/packet_clear/traits/mod.rs new file mode 100644 index 0000000000..e2de2c5934 --- /dev/null +++ b/crates/relayer-components-extra/src/packet_clear/traits/mod.rs @@ -0,0 +1 @@ +pub mod packet_clear; diff --git a/crates/relayer-components-extra/src/packet_clear/traits/packet_clear.rs b/crates/relayer-components-extra/src/packet_clear/traits/packet_clear.rs new file mode 100644 index 0000000000..e4ade8b123 --- /dev/null +++ b/crates/relayer-components-extra/src/packet_clear/traits/packet_clear.rs @@ -0,0 +1,31 @@ +use async_trait::async_trait; +use ibc_relayer_components::chain::types::aliases::{ChannelId, PortId}; +use ibc_relayer_components::core::traits::sync::Async; +use ibc_relayer_components::relay::traits::packet::HasRelayPacket; + +use crate::std_prelude::*; + +#[async_trait] +pub trait CanClearPackets: HasRelayPacket { + async fn clear_packets( + &self, + channel_id: &ChannelId, + port_id: &PortId, + counterparty_channel_id: &ChannelId, + counterparty_port_id: &PortId, + ) -> Result<(), Self::Error>; +} + +#[async_trait] +pub trait PacketClearer: Async +where + Relay: HasRelayPacket, +{ + async fn clear_packets( + relay: &Relay, + channel_id: &ChannelId, + port_id: &PortId, + counterparty_channel_id: &ChannelId, + counterparty_port_id: &PortId, + ) -> Result<(), Relay::Error>; +} diff --git a/crates/relayer-components-extra/src/packet_clear/types/config.rs b/crates/relayer-components-extra/src/packet_clear/types/config.rs new file mode 100644 index 0000000000..b70853e8c7 --- /dev/null +++ b/crates/relayer-components-extra/src/packet_clear/types/config.rs @@ -0,0 +1,14 @@ +#[derive(Debug, Clone)] +pub struct PacketClearConfig { + pub clear_on_start: bool, + pub clear_interval: u64, +} + +impl Default for PacketClearConfig { + fn default() -> Self { + Self { + clear_on_start: true, + clear_interval: 100, + } + } +} diff --git a/crates/relayer-components-extra/src/packet_clear/types/mod.rs b/crates/relayer-components-extra/src/packet_clear/types/mod.rs new file mode 100644 index 0000000000..ef68c36943 --- /dev/null +++ b/crates/relayer-components-extra/src/packet_clear/types/mod.rs @@ -0,0 +1 @@ +pub mod config; diff --git a/crates/relayer-components-extra/src/packet_clear/worker.rs b/crates/relayer-components-extra/src/packet_clear/worker.rs new file mode 100644 index 0000000000..7795fa72d6 --- /dev/null +++ b/crates/relayer-components-extra/src/packet_clear/worker.rs @@ -0,0 +1,110 @@ +use core::time::Duration; +use ibc_relayer_components::chain::types::aliases::{ChannelId, PortId}; +use ibc_relayer_components::relay::traits::logs::logger::CanLogRelayTarget; + +use async_trait::async_trait; +use ibc_relayer_components::relay::traits::chains::HasRelayChains; +use ibc_relayer_components::relay::traits::target::ChainTarget; +use ibc_relayer_components::runtime::traits::runtime::HasRuntime; +use ibc_relayer_components::runtime::traits::sleep::CanSleep; + +use crate::packet_clear::traits::packet_clear::CanClearPackets; +use crate::packet_clear::types::config::PacketClearConfig; +use crate::runtime::traits::spawn::{HasSpawner, Spawner, TaskHandle}; +use crate::std_prelude::*; + +#[async_trait] +pub trait CanSpawnPacketClearWorker: HasRelayChains +where + Target: ChainTarget, + Target::TargetChain: HasRuntime, +{ + fn spawn_packet_clear_worker( + self, + target: Target, + config: PacketClearConfig, + channel_id: ChannelId, + port_id: PortId, + counterparty_channel_id: ChannelId, + counterparty_port_id: PortId, + ) -> Box; +} + +impl CanSpawnPacketClearWorker for Relay +where + Relay: CanRunLoop, + Target: ChainTarget, + Target::TargetChain: HasRuntime, + Runtime: HasSpawner, +{ + fn spawn_packet_clear_worker( + self, + _target: Target, + config: PacketClearConfig, + channel_id: ChannelId, + port_id: PortId, + counterparty_channel_id: ChannelId, + counterparty_port_id: PortId, + ) -> Box { + let spawner = Target::target_chain(&self).runtime().spawner(); + + spawner.spawn(async move { + self.run_loop( + &config, + &channel_id, + &port_id, + &counterparty_channel_id, + &counterparty_port_id, + ) + .await; + }) + } +} + +#[async_trait] +trait CanRunLoop: HasRelayChains +where + Target: ChainTarget, + Target::TargetChain: HasRuntime, +{ + async fn run_loop( + &self, + config: &PacketClearConfig, + channel_id: &ChannelId, + port_id: &PortId, + counterparty_channel_id: &ChannelId, + counterparty_port_id: &PortId, + ); +} + +#[async_trait] +impl CanRunLoop for Relay +where + Relay: CanLogRelayTarget + CanClearPackets, + Target: ChainTarget, + Target::TargetChain: HasRuntime, + Runtime: CanSleep, +{ + async fn run_loop( + &self, + _config: &PacketClearConfig, + channel_id: &ChannelId, + port_id: &PortId, + counterparty_channel_id: &ChannelId, + counterparty_port_id: &PortId, + ) { + let runtime = Target::target_chain(self).runtime(); + + loop { + let _ = self + .clear_packets( + channel_id, + port_id, + counterparty_channel_id, + counterparty_port_id, + ) + .await; + runtime.sleep(Duration::from_secs(5)).await; + } + } +} diff --git a/crates/relayer-components/src/chain/traits/queries/packet_commitments.rs b/crates/relayer-components/src/chain/traits/queries/packet_commitments.rs index 01f6ae9d57..243888f9bd 100644 --- a/crates/relayer-components/src/chain/traits/queries/packet_commitments.rs +++ b/crates/relayer-components/src/chain/traits/queries/packet_commitments.rs @@ -14,7 +14,7 @@ where chain: &Chain, port_id: &Chain::PortId, channel_id: &Chain::ChannelId, - ) -> Result; + ) -> Result; } #[async_trait] @@ -27,5 +27,5 @@ where &self, channel_id: &Self::ChannelId, port_id: &Self::PortId, - ) -> Result, Self::Error>; + ) -> Result, Self::Error>; } diff --git a/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs b/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs index 1fb2c285fd..d2aed85319 100644 --- a/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs +++ b/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs @@ -1,6 +1,7 @@ use async_trait::async_trait; use crate::chain::traits::types::ibc::HasIbcChainTypes; +use crate::chain::traits::types::packet::HasIbcPacketTypes; use crate::core::traits::error::HasErrorType; use crate::std_prelude::*; @@ -14,7 +15,7 @@ where &self, channel_id: &Chain::ChannelId, port_id: &Chain::PortId, - sequences: &[Counterparty::Sequence], + sequences: &[Chain::Sequence], ) -> Result<(Vec, Chain::Height), Chain::Error>; } @@ -28,17 +29,17 @@ where &self, channel_id: &Self::ChannelId, port_id: &Self::PortId, - sequences: &[Counterparty::Sequence], + sequences: &[Self::Sequence], ) -> Result<(Vec, Self::Height), Self::Error>; } #[async_trait] -pub trait UnreceivedPacketEventsQuerier +pub trait UnreceivedPacketsQuerier where - Chain: HasIbcChainTypes + HasErrorType, + Chain: HasIbcChainTypes + HasIbcPacketTypes + HasErrorType, Counterparty: HasIbcChainTypes, { - async fn query_unreceived_packet_events( + async fn query_unreceived_packets( &self, channel_id: &Chain::ChannelId, port_id: &Chain::PortId, @@ -46,16 +47,16 @@ where counterparty_port_id: &Counterparty::PortId, sequences: &[Chain::Sequence], height: &Chain::Height, - ) -> Result, Chain::Error>; + ) -> Result, Chain::Error>; } #[async_trait] -pub trait CanQueryUnreceivedPacketEvents: - HasIbcChainTypes + HasErrorType +pub trait CanQueryUnreceivedPackets: + HasIbcChainTypes + HasIbcPacketTypes + HasErrorType where Counterparty: HasIbcChainTypes, { - async fn query_unreceived_packet_events( + async fn query_unreceived_packets( &self, channel_id: &Self::ChannelId, port_id: &Self::PortId, @@ -63,5 +64,5 @@ where counterparty_port_id: &Counterparty::PortId, sequences: &[Self::Sequence], height: &Self::Height, - ) -> Result, Self::Error>; + ) -> Result, Self::Error>; } diff --git a/crates/relayer-components/src/relay/impls/mod.rs b/crates/relayer-components/src/relay/impls/mod.rs index 8607aab777..8a6f057ad1 100644 --- a/crates/relayer-components/src/relay/impls/mod.rs +++ b/crates/relayer-components/src/relay/impls/mod.rs @@ -5,7 +5,6 @@ pub mod connection; pub mod event_relayers; pub mod message_senders; pub mod messages; -pub mod packet_clear; pub mod packet_filters; pub mod packet_relayers; pub mod update_client; diff --git a/crates/relayer-components/src/relay/impls/packet_clear/mod.rs b/crates/relayer-components/src/relay/impls/packet_clear/mod.rs deleted file mode 100644 index a55f21c8dc..0000000000 --- a/crates/relayer-components/src/relay/impls/packet_clear/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod target_packet_clear; diff --git a/crates/relayer-components/src/relay/impls/packet_clear/target_packet_clear.rs b/crates/relayer-components/src/relay/impls/packet_clear/target_packet_clear.rs deleted file mode 100644 index 0d64692604..0000000000 --- a/crates/relayer-components/src/relay/impls/packet_clear/target_packet_clear.rs +++ /dev/null @@ -1,66 +0,0 @@ -use async_trait::async_trait; - -use crate::chain::traits::queries::packet_commitments::CanQueryPacketCommitments; -use crate::chain::traits::queries::unreceived_packets::{ - CanQueryUnreceivedPacketEvents, CanQueryUnreceivedPacketSequences, -}; -use crate::chain::types::aliases::{ChannelId, Height, PortId}; -use crate::relay::impls::packet_filters::chain::MatchPacketDestinationChain; -use crate::relay::traits::event_relayer::CanRelayEvent; -use crate::relay::traits::packet::HasRelayPacket; -use crate::relay::traits::packet_clear::PacketClearerWithTarget; -use crate::relay::traits::packet_filter::PacketFilter; -use crate::relay::traits::target::ChainTarget; -use crate::std_prelude::*; - -pub struct PacketClearRelayer; - -#[async_trait] -impl PacketClearerWithTarget for PacketClearRelayer -where - Relay: HasRelayPacket + CanRelayEvent, - Target: ChainTarget, - Target::TargetChain: CanQueryUnreceivedPacketSequences - + CanQueryUnreceivedPacketEvents, - Target::CounterpartyChain: CanQueryPacketCommitments, - MatchPacketDestinationChain: PacketFilter, -{ - async fn clear_packets_with_target( - relay: &Relay, - channel_id: &ChannelId, - port_id: &PortId, - counterparty_channel_id: &ChannelId, - counterparty_port_id: &PortId, - height: &Height, - ) -> Result<(), Relay::Error> { - let chain = Target::target_chain(relay); - let counterparty_chain = Target::counterparty_chain(relay); - - let commitment_sequences = counterparty_chain - .query_packet_commitments(counterparty_channel_id, counterparty_port_id) - .await - .map_err(Target::counterparty_chain_error)?; - - let (unreceived_sequences, unreceived_height) = chain - .query_unreceived_packet_sequences(channel_id, port_id, &commitment_sequences) - .await - .map_err(Target::target_chain_error)?; - - let unreceived_packet_events = chain - .query_unreceived_packet_events( - channel_id, - port_id, - counterparty_channel_id, - counterparty_port_id, - &unreceived_sequences, - &unreceived_height, - ) - .await - .map_err(Target::target_chain_error)?; - - for event in unreceived_packet_events.iter() { - relay.relay_chain_event(height, event).await?; - } - Ok(()) - } -} diff --git a/crates/relayer-components/src/relay/traits/mod.rs b/crates/relayer-components/src/relay/traits/mod.rs index 8cc507ac51..09704311e8 100644 --- a/crates/relayer-components/src/relay/traits/mod.rs +++ b/crates/relayer-components/src/relay/traits/mod.rs @@ -7,7 +7,6 @@ pub mod ibc_message_sender; pub mod logs; pub mod messages; pub mod packet; -pub mod packet_clear; pub mod packet_filter; pub mod packet_relayer; pub mod packet_relayers; diff --git a/crates/relayer-components/src/relay/traits/packet_clear.rs b/crates/relayer-components/src/relay/traits/packet_clear.rs deleted file mode 100644 index 2330407ed9..0000000000 --- a/crates/relayer-components/src/relay/traits/packet_clear.rs +++ /dev/null @@ -1,23 +0,0 @@ -use async_trait::async_trait; - -use crate::chain::types::aliases::{ChannelId, Height, PortId}; -use crate::core::traits::sync::Async; -use crate::relay::traits::packet::HasRelayPacket; -use crate::relay::traits::target::ChainTarget; -use crate::std_prelude::*; - -#[async_trait] -pub trait PacketClearerWithTarget: Async -where - Relay: HasRelayPacket, - Target: ChainTarget, -{ - async fn clear_packets_with_target( - relay: &Relay, - channel_id: &ChannelId, - port_id: &PortId, - counterparty_channel_id: &ChannelId, - counterparty_port_id: &PortId, - height: &Height, - ) -> Result<(), Relay::Error>; -} diff --git a/crates/relayer-cosmos/src/impls/chain.rs b/crates/relayer-cosmos/src/impls/chain.rs index 11c3ed86c2..34b65b221d 100644 --- a/crates/relayer-cosmos/src/impls/chain.rs +++ b/crates/relayer-cosmos/src/impls/chain.rs @@ -552,7 +552,7 @@ where query_unreceived_packet_sequences(self, channel_id, port_id, sequences).await } - async fn query_unreceived_packet_events( + async fn query_unreceived_packets( &self, channel_id: &ChannelId, port_id: &PortId, @@ -560,7 +560,7 @@ where counterparty_port_id: &PortId, sequences: &[Sequence], height: &Height, - ) -> Result>, Self::Error> { + ) -> Result, Self::Error> { query_unreceived_packet_events( self, channel_id, diff --git a/crates/relayer-cosmos/src/methods/unreceived_packet.rs b/crates/relayer-cosmos/src/methods/unreceived_packet.rs index 1afee5e04a..0e54465b0b 100644 --- a/crates/relayer-cosmos/src/methods/unreceived_packet.rs +++ b/crates/relayer-cosmos/src/methods/unreceived_packet.rs @@ -6,11 +6,12 @@ use ibc_relayer::chain::requests::{ Qualified, QueryHeight, QueryPacketCommitmentsRequest, QueryPacketEventDataRequest, QueryUnreceivedPacketsRequest, }; +use ibc_relayer_all_in_one::one_for_all::traits::chain::OfaChain; +use ibc_relayer_types::core::ics04_channel::packet::Packet; use ibc_relayer_types::core::ics04_channel::packet::Sequence; use ibc_relayer_types::core::ics24_host::identifier::{ChannelId, PortId}; use ibc_relayer_types::events::WithBlockDataType; use ibc_relayer_types::Height; -use tendermint::abci::Event as AbciEvent; use tendermint_rpc::{Client, Order}; use tonic::Request; @@ -91,7 +92,7 @@ pub async fn query_unreceived_packet_events( counterparty_port_id: &PortId, sequences: &[Sequence], height: &Height, -) -> Result>, Error> { +) -> Result, Error> { let request = QueryPacketEventDataRequest { event_id: WithBlockDataType::SendPacket, source_channel_id: channel_id.clone(), @@ -121,5 +122,14 @@ pub async fn query_unreceived_packet_events( events.append(&mut event); } } - Ok(events) + + let send_packets = events + .iter() + .filter_map( as OfaChain>::try_extract_send_packet_event) + .map(|event| { + as OfaChain>::extract_packet_from_send_packet_event(&event) + }) + .collect(); + + Ok(send_packets) } diff --git a/tools/integration-test/src/tests/next/mod.rs b/tools/integration-test/src/tests/next/mod.rs index d3cf0b430c..5c1df86ad6 100644 --- a/tools/integration-test/src/tests/next/mod.rs +++ b/tools/integration-test/src/tests/next/mod.rs @@ -1,5 +1,6 @@ pub mod connection; pub mod context; pub mod filter; +pub mod packet_clear; pub mod timeout_transfer; pub mod transfer; diff --git a/tools/integration-test/src/tests/next/packet_clear.rs b/tools/integration-test/src/tests/next/packet_clear.rs new file mode 100644 index 0000000000..a603b55da1 --- /dev/null +++ b/tools/integration-test/src/tests/next/packet_clear.rs @@ -0,0 +1,75 @@ +use ibc_relayer::config::PacketFilter; +use ibc_relayer_components::relay::traits::auto_relayer::CanAutoRelay; +use ibc_test_framework::framework::next::chain::{HasTwoChains, HasTwoChannels}; +use ibc_test_framework::prelude::*; +use ibc_test_framework::util::random::random_u64_range; + +use crate::tests::next::context::build_cosmos_relay_context; + +#[test] +fn test_ibc_clear_packet_next() -> Result<(), Error> { + run_binary_channel_test(&IbcClearPacketTest) +} + +pub struct IbcClearPacketTest; + +impl TestOverrides for IbcClearPacketTest { + fn should_spawn_supervisor(&self) -> bool { + false + } +} + +impl BinaryChannelTest for IbcClearPacketTest { + fn run(&self, relayer: RelayerDriver, context: &Context) -> Result<(), Error> + where + Context: HasTwoChains + HasTwoChannels, + { + let chains = context.chains(); + let channel = context.channel(); + let pf: PacketFilter = PacketFilter::default(); + + let relay_context = build_cosmos_relay_context(&relayer.config, chains, pf)?; + + let runtime = chains.node_a.value().chain_driver.runtime.as_ref(); + + let denom_a = chains.node_a.denom(); + + let wallet_a = chains.node_a.wallets().user1().cloned(); + let wallet_b = chains.node_b.wallets().user1().cloned(); + + let _balance_a = chains + .node_a + .chain_driver() + .query_balance(&wallet_a.address(), &denom_a)?; + + let a_to_b_amount = random_u64_range(1000, 5000); + + info!( + "Sending IBC transfer from chain {} to chain {} with amount of {} {}", + chains.chain_id_a(), + chains.chain_id_b(), + a_to_b_amount, + denom_a + ); + + chains.node_a.chain_driver().ibc_transfer_token( + &channel.port_a.as_ref(), + &channel.channel_id_a.as_ref(), + &wallet_a.as_ref(), + &wallet_b.address(), + &denom_a.with_amount(a_to_b_amount).as_ref(), + )?; + + runtime.spawn(async move { + let _ = relay_context.auto_relay().await; + }); + + // TODO assert transfer is not completed + + // TODO spawn clear packet worker + + // TODO assert transfer is completed + + Ok(()) + } +} From 25904eecca44b4ea67200bf519d9acd09d6ee480 Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Wed, 19 Jul 2023 17:30:42 +0200 Subject: [PATCH 08/26] Remove PacketClearConfig --- .../src/packet_clear/mod.rs | 1 - .../src/packet_clear/types/config.rs | 14 -------------- .../src/packet_clear/types/mod.rs | 1 - .../src/packet_clear/worker.rs | 6 ------ .../src/tests/next/packet_clear.rs | 13 +++---------- 5 files changed, 3 insertions(+), 32 deletions(-) delete mode 100644 crates/relayer-components-extra/src/packet_clear/types/config.rs delete mode 100644 crates/relayer-components-extra/src/packet_clear/types/mod.rs diff --git a/crates/relayer-components-extra/src/packet_clear/mod.rs b/crates/relayer-components-extra/src/packet_clear/mod.rs index 35e02c0c8e..4a0c56144b 100644 --- a/crates/relayer-components-extra/src/packet_clear/mod.rs +++ b/crates/relayer-components-extra/src/packet_clear/mod.rs @@ -1,4 +1,3 @@ pub mod impls; pub mod traits; -pub mod types; pub mod worker; diff --git a/crates/relayer-components-extra/src/packet_clear/types/config.rs b/crates/relayer-components-extra/src/packet_clear/types/config.rs deleted file mode 100644 index b70853e8c7..0000000000 --- a/crates/relayer-components-extra/src/packet_clear/types/config.rs +++ /dev/null @@ -1,14 +0,0 @@ -#[derive(Debug, Clone)] -pub struct PacketClearConfig { - pub clear_on_start: bool, - pub clear_interval: u64, -} - -impl Default for PacketClearConfig { - fn default() -> Self { - Self { - clear_on_start: true, - clear_interval: 100, - } - } -} diff --git a/crates/relayer-components-extra/src/packet_clear/types/mod.rs b/crates/relayer-components-extra/src/packet_clear/types/mod.rs deleted file mode 100644 index ef68c36943..0000000000 --- a/crates/relayer-components-extra/src/packet_clear/types/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod config; diff --git a/crates/relayer-components-extra/src/packet_clear/worker.rs b/crates/relayer-components-extra/src/packet_clear/worker.rs index 7795fa72d6..b1da7e47d7 100644 --- a/crates/relayer-components-extra/src/packet_clear/worker.rs +++ b/crates/relayer-components-extra/src/packet_clear/worker.rs @@ -9,7 +9,6 @@ use ibc_relayer_components::runtime::traits::runtime::HasRuntime; use ibc_relayer_components::runtime::traits::sleep::CanSleep; use crate::packet_clear::traits::packet_clear::CanClearPackets; -use crate::packet_clear::types::config::PacketClearConfig; use crate::runtime::traits::spawn::{HasSpawner, Spawner, TaskHandle}; use crate::std_prelude::*; @@ -22,7 +21,6 @@ where fn spawn_packet_clear_worker( self, target: Target, - config: PacketClearConfig, channel_id: ChannelId, port_id: PortId, counterparty_channel_id: ChannelId, @@ -40,7 +38,6 @@ where fn spawn_packet_clear_worker( self, _target: Target, - config: PacketClearConfig, channel_id: ChannelId, port_id: PortId, counterparty_channel_id: ChannelId, @@ -50,7 +47,6 @@ where spawner.spawn(async move { self.run_loop( - &config, &channel_id, &port_id, &counterparty_channel_id, @@ -69,7 +65,6 @@ where { async fn run_loop( &self, - config: &PacketClearConfig, channel_id: &ChannelId, port_id: &PortId, counterparty_channel_id: &ChannelId, @@ -87,7 +82,6 @@ where { async fn run_loop( &self, - _config: &PacketClearConfig, channel_id: &ChannelId, port_id: &PortId, counterparty_channel_id: &ChannelId, diff --git a/tools/integration-test/src/tests/next/packet_clear.rs b/tools/integration-test/src/tests/next/packet_clear.rs index a603b55da1..b58ead8b6f 100644 --- a/tools/integration-test/src/tests/next/packet_clear.rs +++ b/tools/integration-test/src/tests/next/packet_clear.rs @@ -1,5 +1,4 @@ use ibc_relayer::config::PacketFilter; -use ibc_relayer_components::relay::traits::auto_relayer::CanAutoRelay; use ibc_test_framework::framework::next::chain::{HasTwoChains, HasTwoChannels}; use ibc_test_framework::prelude::*; use ibc_test_framework::util::random::random_u64_range; @@ -28,9 +27,9 @@ impl BinaryChannelTest for IbcClearPacketTest { let channel = context.channel(); let pf: PacketFilter = PacketFilter::default(); - let relay_context = build_cosmos_relay_context(&relayer.config, chains, pf)?; + let _relay_context = build_cosmos_relay_context(&relayer.config, chains, pf)?; - let runtime = chains.node_a.value().chain_driver.runtime.as_ref(); + let _runtime = chains.node_a.value().chain_driver.runtime.as_ref(); let denom_a = chains.node_a.denom(); @@ -60,13 +59,7 @@ impl BinaryChannelTest for IbcClearPacketTest { &denom_a.with_amount(a_to_b_amount).as_ref(), )?; - runtime.spawn(async move { - let _ = relay_context.auto_relay().await; - }); - - // TODO assert transfer is not completed - - // TODO spawn clear packet worker + // TODO call clear packet // TODO assert transfer is completed From 97eeb501b4dfc37b95afbaa5362e865dc43b2b55 Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Wed, 19 Jul 2023 17:39:44 +0200 Subject: [PATCH 09/26] Rename channels to src/dst instead of using counterparty --- .../impls/unreceived_packets_clear.rs | 36 +++++++------- .../src/packet_clear/traits/packet_clear.rs | 20 ++++---- .../src/packet_clear/worker.rs | 48 ++++++++----------- 3 files changed, 45 insertions(+), 59 deletions(-) diff --git a/crates/relayer-components-extra/src/packet_clear/impls/unreceived_packets_clear.rs b/crates/relayer-components-extra/src/packet_clear/impls/unreceived_packets_clear.rs index d8e5494364..97acf52301 100644 --- a/crates/relayer-components-extra/src/packet_clear/impls/unreceived_packets_clear.rs +++ b/crates/relayer-components-extra/src/packet_clear/impls/unreceived_packets_clear.rs @@ -20,36 +20,32 @@ where Relay::SrcChain: CanQueryUnreceivedPacketSequences + CanQueryUnreceivedPackets, { - async fn clear_packets( + async fn clear_receive_packets( relay: &Relay, - channel_id: &ChannelId, - port_id: &PortId, - counterparty_channel_id: &ChannelId, - counterparty_port_id: &PortId, + dst_channel_id: &ChannelId, + dst_port_id: &PortId, + src_channel_id: &ChannelId, + src_port_id: &PortId, ) -> Result<(), Relay::Error> { - let chain = relay.dst_chain(); - let counterparty_chain = relay.src_chain(); + let dst_chain = relay.dst_chain(); + let src_chain = relay.src_chain(); - let commitment_sequences = chain - .query_packet_commitments(channel_id, port_id) + let commitment_sequences = dst_chain + .query_packet_commitments(dst_channel_id, dst_port_id) .await .map_err(Relay::dst_chain_error)?; - let (unreceived_sequences, unreceived_height) = counterparty_chain - .query_unreceived_packet_sequences( - counterparty_channel_id, - counterparty_port_id, - &commitment_sequences, - ) + let (unreceived_sequences, unreceived_height) = src_chain + .query_unreceived_packet_sequences(src_channel_id, src_port_id, &commitment_sequences) .await .map_err(Relay::src_chain_error)?; - let unreceived_packets = counterparty_chain + let unreceived_packets = src_chain .query_unreceived_packets( - counterparty_channel_id, - counterparty_port_id, - channel_id, - port_id, + src_channel_id, + src_port_id, + dst_channel_id, + dst_port_id, &unreceived_sequences, &unreceived_height, ) diff --git a/crates/relayer-components-extra/src/packet_clear/traits/packet_clear.rs b/crates/relayer-components-extra/src/packet_clear/traits/packet_clear.rs index e4ade8b123..2803832bcb 100644 --- a/crates/relayer-components-extra/src/packet_clear/traits/packet_clear.rs +++ b/crates/relayer-components-extra/src/packet_clear/traits/packet_clear.rs @@ -7,12 +7,12 @@ use crate::std_prelude::*; #[async_trait] pub trait CanClearPackets: HasRelayPacket { - async fn clear_packets( + async fn clear_receive_packets( &self, - channel_id: &ChannelId, - port_id: &PortId, - counterparty_channel_id: &ChannelId, - counterparty_port_id: &PortId, + dst_channel_id: &ChannelId, + dst_port_id: &PortId, + src_channel_id: &ChannelId, + src_port_id: &PortId, ) -> Result<(), Self::Error>; } @@ -21,11 +21,11 @@ pub trait PacketClearer: Async where Relay: HasRelayPacket, { - async fn clear_packets( + async fn clear_receive_packets( relay: &Relay, - channel_id: &ChannelId, - port_id: &PortId, - counterparty_channel_id: &ChannelId, - counterparty_port_id: &PortId, + dst_channel_id: &ChannelId, + dst_port_id: &PortId, + src_channel_id: &ChannelId, + src_port_id: &PortId, ) -> Result<(), Relay::Error>; } diff --git a/crates/relayer-components-extra/src/packet_clear/worker.rs b/crates/relayer-components-extra/src/packet_clear/worker.rs index b1da7e47d7..1c48985627 100644 --- a/crates/relayer-components-extra/src/packet_clear/worker.rs +++ b/crates/relayer-components-extra/src/packet_clear/worker.rs @@ -21,10 +21,10 @@ where fn spawn_packet_clear_worker( self, target: Target, - channel_id: ChannelId, - port_id: PortId, - counterparty_channel_id: ChannelId, - counterparty_port_id: PortId, + dst_channel_id: ChannelId, + dst_port_id: PortId, + src_channel_id: ChannelId, + src_counterparty_port_id: PortId, ) -> Box; } @@ -38,21 +38,16 @@ where fn spawn_packet_clear_worker( self, _target: Target, - channel_id: ChannelId, - port_id: PortId, - counterparty_channel_id: ChannelId, - counterparty_port_id: PortId, + dst_channel_id: ChannelId, + dst_port_id: PortId, + src_channel_id: ChannelId, + src_port_id: PortId, ) -> Box { let spawner = Target::target_chain(&self).runtime().spawner(); spawner.spawn(async move { - self.run_loop( - &channel_id, - &port_id, - &counterparty_channel_id, - &counterparty_port_id, - ) - .await; + self.run_loop(&dst_channel_id, &dst_port_id, &src_channel_id, &src_port_id) + .await; }) } } @@ -65,10 +60,10 @@ where { async fn run_loop( &self, - channel_id: &ChannelId, - port_id: &PortId, - counterparty_channel_id: &ChannelId, - counterparty_port_id: &PortId, + dst_channel_id: &ChannelId, + dst_port_id: &PortId, + src_channel_id: &ChannelId, + src_port_id: &PortId, ); } @@ -82,21 +77,16 @@ where { async fn run_loop( &self, - channel_id: &ChannelId, - port_id: &PortId, - counterparty_channel_id: &ChannelId, - counterparty_port_id: &PortId, + dst_channel_id: &ChannelId, + dst_port_id: &PortId, + src_channel_id: &ChannelId, + src_port_id: &PortId, ) { let runtime = Target::target_chain(self).runtime(); loop { let _ = self - .clear_packets( - channel_id, - port_id, - counterparty_channel_id, - counterparty_port_id, - ) + .clear_receive_packets(dst_channel_id, dst_port_id, src_channel_id, src_port_id) .await; runtime.sleep(Duration::from_secs(5)).await; } From 0579c59eb19836e09a36d520a40444a759caba66 Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Thu, 20 Jul 2023 09:27:42 +0200 Subject: [PATCH 10/26] Improve clear_receive_packets --- .../impls/chain/queries/unreceived_packets.rs | 27 +--------------- .../src/one_for_all/traits/chain.rs | 8 ----- .../impls/unreceived_packets_clear.rs | 27 +++++++--------- .../traits/queries/unreceived_packets.rs | 32 +------------------ crates/relayer-cosmos/src/impls/chain.rs | 17 ++-------- .../src/methods/unreceived_packet.rs | 11 ++++--- 6 files changed, 22 insertions(+), 100 deletions(-) diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs index db39059212..3cbebf2fa9 100644 --- a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs +++ b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs @@ -1,34 +1,11 @@ use async_trait::async_trait; -use ibc_relayer_components::chain::traits::queries::unreceived_packets::{ - CanQueryUnreceivedPacketSequences, CanQueryUnreceivedPackets, -}; +use ibc_relayer_components::chain::traits::queries::unreceived_packets::CanQueryUnreceivedPackets; use crate::one_for_all::traits::chain::{OfaChainTypes, OfaIbcChain}; use crate::one_for_all::types::chain::OfaChainWrapper; use crate::std_prelude::*; -#[async_trait] -impl CanQueryUnreceivedPacketSequences> - for OfaChainWrapper -where - Chain: OfaIbcChain, - Counterparty: OfaIbcChain, -{ - async fn query_unreceived_packet_sequences( - &self, - channel_id: &Self::ChannelId, - port_id: &Self::PortId, - sequences: &[Self::Sequence], - ) -> Result<(Vec, Self::Height), Self::Error> { - let unreceived_packet_sequences = self - .chain - .query_unreceived_packet_sequences(channel_id, port_id, sequences) - .await?; - Ok(unreceived_packet_sequences) - } -} - #[async_trait] impl CanQueryUnreceivedPackets> for OfaChainWrapper @@ -43,7 +20,6 @@ where counterparty_channel_id: &Counterparty::ChannelId, counterparty_port_id: &Counterparty::PortId, sequences: &[Self::Sequence], - height: &Self::Height, ) -> Result, Self::Error> { let unreceived_packet = self .chain @@ -53,7 +29,6 @@ where counterparty_channel_id, counterparty_port_id, sequences, - height, ) .await?; Ok(unreceived_packet) diff --git a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs index bb88876ea5..6c647a3c2a 100644 --- a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs +++ b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs @@ -336,13 +336,6 @@ where port_id: &Self::PortId, ) -> Result, Self::Error>; - async fn query_unreceived_packet_sequences( - &self, - channel_id: &Self::ChannelId, - port_id: &Self::PortId, - sequences: &[Self::Sequence], - ) -> Result<(Vec, Self::Height), Self::Error>; - async fn query_unreceived_packets( &self, channel_id: &Self::ChannelId, @@ -350,7 +343,6 @@ where counterparty_channel_id: &Counterparty::ChannelId, counterparty_port_id: &Counterparty::PortId, sequences: &[Self::Sequence], - height: &Self::Height, ) -> Result, Self::Error>; async fn build_receive_packet_payload( diff --git a/crates/relayer-components-extra/src/packet_clear/impls/unreceived_packets_clear.rs b/crates/relayer-components-extra/src/packet_clear/impls/unreceived_packets_clear.rs index 97acf52301..b9ecd48537 100644 --- a/crates/relayer-components-extra/src/packet_clear/impls/unreceived_packets_clear.rs +++ b/crates/relayer-components-extra/src/packet_clear/impls/unreceived_packets_clear.rs @@ -1,8 +1,7 @@ use async_trait::async_trait; +use futures_util::{stream, StreamExt}; use ibc_relayer_components::chain::traits::queries::packet_commitments::CanQueryPacketCommitments; -use ibc_relayer_components::chain::traits::queries::unreceived_packets::{ - CanQueryUnreceivedPacketSequences, CanQueryUnreceivedPackets, -}; +use ibc_relayer_components::chain::traits::queries::unreceived_packets::CanQueryUnreceivedPackets; use ibc_relayer_components::chain::types::aliases::{ChannelId, PortId}; use ibc_relayer_components::relay::traits::packet::HasRelayPacket; use ibc_relayer_components::relay::traits::packet_relayer::CanRelayPacket; @@ -17,8 +16,7 @@ impl PacketClearer for PacketClearRelayer where Relay: HasRelayPacket + CanRelayPacket, Relay::DstChain: CanQueryPacketCommitments, - Relay::SrcChain: CanQueryUnreceivedPacketSequences - + CanQueryUnreceivedPackets, + Relay::SrcChain: CanQueryUnreceivedPackets, { async fn clear_receive_packets( relay: &Relay, @@ -35,26 +33,25 @@ where .await .map_err(Relay::dst_chain_error)?; - let (unreceived_sequences, unreceived_height) = src_chain - .query_unreceived_packet_sequences(src_channel_id, src_port_id, &commitment_sequences) - .await - .map_err(Relay::src_chain_error)?; - let unreceived_packets = src_chain .query_unreceived_packets( src_channel_id, src_port_id, dst_channel_id, dst_port_id, - &unreceived_sequences, - &unreceived_height, + &commitment_sequences, ) .await .map_err(Relay::src_chain_error)?; - for packet in unreceived_packets.iter() { - relay.relay_packet(packet).await?; - } + stream::iter(unreceived_packets) + .for_each_concurrent(None, |t| async move { + // Ignore any relaying errors, as the relayer still needs to proceed + // relaying the next event regardless. + let _ = relay.relay_packet(&t).await; + }) + .await; + Ok(()) } } diff --git a/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs b/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs index d2aed85319..de7972ad0a 100644 --- a/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs +++ b/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs @@ -5,34 +5,6 @@ use crate::chain::traits::types::packet::HasIbcPacketTypes; use crate::core::traits::error::HasErrorType; use crate::std_prelude::*; -#[async_trait] -pub trait UnreceivedPacketSequencesQuerier -where - Chain: HasIbcChainTypes + HasErrorType, - Counterparty: HasIbcChainTypes, -{ - async fn query_unreceived_packet_sequences( - &self, - channel_id: &Chain::ChannelId, - port_id: &Chain::PortId, - sequences: &[Chain::Sequence], - ) -> Result<(Vec, Chain::Height), Chain::Error>; -} - -#[async_trait] -pub trait CanQueryUnreceivedPacketSequences: - HasIbcChainTypes + HasErrorType -where - Counterparty: HasIbcChainTypes, -{ - async fn query_unreceived_packet_sequences( - &self, - channel_id: &Self::ChannelId, - port_id: &Self::PortId, - sequences: &[Self::Sequence], - ) -> Result<(Vec, Self::Height), Self::Error>; -} - #[async_trait] pub trait UnreceivedPacketsQuerier where @@ -45,8 +17,7 @@ where port_id: &Chain::PortId, counterparty_channel_id: &Counterparty::ChannelId, counterparty_port_id: &Counterparty::PortId, - sequences: &[Chain::Sequence], - height: &Chain::Height, + sequences: &[Counterparty::Sequence], ) -> Result, Chain::Error>; } @@ -63,6 +34,5 @@ where counterparty_channel_id: &Counterparty::ChannelId, counterparty_port_id: &Counterparty::PortId, sequences: &[Self::Sequence], - height: &Self::Height, ) -> Result, Self::Error>; } diff --git a/crates/relayer-cosmos/src/impls/chain.rs b/crates/relayer-cosmos/src/impls/chain.rs index 34b65b221d..470fa330a1 100644 --- a/crates/relayer-cosmos/src/impls/chain.rs +++ b/crates/relayer-cosmos/src/impls/chain.rs @@ -60,9 +60,7 @@ use crate::methods::packet::{ query_write_acknowledgement_event, CosmosAckPacketPayload, CosmosReceivePacketPayload, CosmosTimeoutUnorderedPacketPayload, }; -use crate::methods::unreceived_packet::{ - query_packet_commitments, query_unreceived_packet_events, query_unreceived_packet_sequences, -}; +use crate::methods::unreceived_packet::{query_packet_commitments, query_unreceived_packets}; use crate::methods::update_client::{build_update_client_message, build_update_client_payload}; use crate::traits::message::CosmosMessage; use crate::types::channel::{ @@ -543,15 +541,6 @@ where query_packet_commitments(self, channel_id, port_id).await } - async fn query_unreceived_packet_sequences( - &self, - channel_id: &ChannelId, - port_id: &PortId, - sequences: &[Sequence], - ) -> Result<(Vec, Height), Error> { - query_unreceived_packet_sequences(self, channel_id, port_id, sequences).await - } - async fn query_unreceived_packets( &self, channel_id: &ChannelId, @@ -559,16 +548,14 @@ where counterparty_channel_id: &ChannelId, counterparty_port_id: &PortId, sequences: &[Sequence], - height: &Height, ) -> Result, Self::Error> { - query_unreceived_packet_events( + query_unreceived_packets( self, channel_id, port_id, counterparty_channel_id, counterparty_port_id, sequences, - height, ) .await } diff --git a/crates/relayer-cosmos/src/methods/unreceived_packet.rs b/crates/relayer-cosmos/src/methods/unreceived_packet.rs index 0e54465b0b..3c5302a7d7 100644 --- a/crates/relayer-cosmos/src/methods/unreceived_packet.rs +++ b/crates/relayer-cosmos/src/methods/unreceived_packet.rs @@ -51,7 +51,7 @@ pub async fn query_packet_commitments( Ok(commitment_sequences) } -pub async fn query_unreceived_packet_sequences( +async fn query_unreceived_packet_sequences( chain: &CosmosChain, channel_id: &ChannelId, port_id: &PortId, @@ -84,23 +84,24 @@ pub async fn query_unreceived_packet_sequences( Ok((response_sequences, height)) } -pub async fn query_unreceived_packet_events( +pub async fn query_unreceived_packets( chain: &CosmosChain, channel_id: &ChannelId, port_id: &PortId, counterparty_channel_id: &ChannelId, counterparty_port_id: &PortId, sequences: &[Sequence], - height: &Height, ) -> Result, Error> { + let (unreceived_sequences, height) = + query_unreceived_packet_sequences(chain, channel_id, port_id, sequences).await?; let request = QueryPacketEventDataRequest { event_id: WithBlockDataType::SendPacket, source_channel_id: channel_id.clone(), source_port_id: port_id.clone(), destination_channel_id: counterparty_channel_id.clone(), destination_port_id: counterparty_port_id.clone(), - sequences: sequences.to_vec(), - height: Qualified::SmallerEqual(QueryHeight::Specific(*height)), + sequences: unreceived_sequences.to_vec(), + height: Qualified::SmallerEqual(QueryHeight::Specific(height)), }; let mut events = vec![]; for sequence in sequences.iter() { From b54144efcfda85b2aeb296feb8c9e76e9f11b887 Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Thu, 20 Jul 2023 12:06:39 +0200 Subject: [PATCH 11/26] Add test for packet clearing relayer-next --- Cargo.lock | 1 + .../src/all_for_one/relay.rs | 5 +- .../impls/chain/queries/unreceived_packets.rs | 2 +- .../impls/relay/clear_packet/mod.rs | 1 + .../clear_packet/receive_packet_clear.rs | 46 ++++++++++++ .../src/one_for_all/impls/relay/mod.rs | 1 + .../src/one_for_all/traits/chain.rs | 2 +- .../src/packet_clear/impls/mod.rs | 2 +- ...kets_clear.rs => receive_packets_clear.rs} | 17 +++-- .../src/packet_clear/traits/packet_clear.rs | 4 +- .../src/packet_clear/worker.rs | 4 +- .../traits/queries/unreceived_packets.rs | 2 +- tools/integration-test/Cargo.toml | 1 + .../src/tests/next/packet_clear.rs | 70 +++++++++++++++++-- 14 files changed, 134 insertions(+), 24 deletions(-) create mode 100644 crates/relayer-all-in-one/src/one_for_all/impls/relay/clear_packet/mod.rs create mode 100644 crates/relayer-all-in-one/src/one_for_all/impls/relay/clear_packet/receive_packet_clear.rs rename crates/relayer-components-extra/src/packet_clear/impls/{unreceived_packets_clear.rs => receive_packets_clear.rs} (77%) diff --git a/Cargo.lock b/Cargo.lock index a76e86247e..95c2e1f4c7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1552,6 +1552,7 @@ dependencies = [ "ibc-relayer", "ibc-relayer-all-in-one", "ibc-relayer-components", + "ibc-relayer-components-extra", "ibc-relayer-cosmos", "ibc-relayer-runtime", "ibc-relayer-types", diff --git a/crates/relayer-all-in-one/src/all_for_one/relay.rs b/crates/relayer-all-in-one/src/all_for_one/relay.rs index b9a8168258..2848e31f30 100644 --- a/crates/relayer-all-in-one/src/all_for_one/relay.rs +++ b/crates/relayer-all-in-one/src/all_for_one/relay.rs @@ -18,6 +18,7 @@ use ibc_relayer_components::relay::traits::packet_relayers::receive_packet::CanR use ibc_relayer_components::relay::traits::packet_relayers::timeout_unordered_packet::CanRelayTimeoutUnorderedPacket; use ibc_relayer_components::relay::traits::target::{DestinationTarget, SourceTarget}; use ibc_relayer_components_extra::batch::traits::send_messages_from_batch::CanSendIbcMessagesFromBatchWorker; +use ibc_relayer_components_extra::packet_clear::traits::packet_clear::CanClearReceivePackets; use ibc_relayer_components_extra::relay::impls::packet_relayers::retry::SupportsPacketRetry; use crate::all_for_one::chain::AfoChain; @@ -52,6 +53,7 @@ pub trait AfoRelay: + CanInitChannel + CanRelayChannelOpenHandshake + SupportsPacketRetry + + CanClearReceivePackets { type AfoSrcChain: AfoChain; @@ -91,7 +93,8 @@ where + CanRelayConnectionOpenHandshake + CanInitChannel + CanRelayChannelOpenHandshake - + SupportsPacketRetry, + + SupportsPacketRetry + + CanClearReceivePackets, { type AfoSrcChain = SrcChain; diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs index 3cbebf2fa9..2e56eb9c38 100644 --- a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs +++ b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs @@ -19,7 +19,7 @@ where port_id: &Self::PortId, counterparty_channel_id: &Counterparty::ChannelId, counterparty_port_id: &Counterparty::PortId, - sequences: &[Self::Sequence], + sequences: &[Counterparty::Sequence], ) -> Result, Self::Error> { let unreceived_packet = self .chain diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/relay/clear_packet/mod.rs b/crates/relayer-all-in-one/src/one_for_all/impls/relay/clear_packet/mod.rs new file mode 100644 index 0000000000..b71813afee --- /dev/null +++ b/crates/relayer-all-in-one/src/one_for_all/impls/relay/clear_packet/mod.rs @@ -0,0 +1 @@ +pub mod receive_packet_clear; diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/relay/clear_packet/receive_packet_clear.rs b/crates/relayer-all-in-one/src/one_for_all/impls/relay/clear_packet/receive_packet_clear.rs new file mode 100644 index 0000000000..3ce1abc8e4 --- /dev/null +++ b/crates/relayer-all-in-one/src/one_for_all/impls/relay/clear_packet/receive_packet_clear.rs @@ -0,0 +1,46 @@ +use async_trait::async_trait; +use ibc_relayer_components::chain::types::aliases::{ChannelId, PortId}; +use ibc_relayer_components::relay::traits::chains::HasRelayChains; +use ibc_relayer_components_extra::packet_clear::impls::receive_packets_clear::ReceivePacketClearRelayer; +use ibc_relayer_components_extra::packet_clear::traits::packet_clear::{ + CanClearReceivePackets, ReceivePacketClearer, +}; + +use crate::one_for_all::traits::relay::OfaRelay; +use crate::one_for_all::types::relay::OfaRelayWrapper; +use crate::std_prelude::*; + +#[async_trait] +impl CanClearReceivePackets for OfaRelayWrapper +where + Relay: OfaRelay, +{ + async fn clear_receive_packets( + &self, + dst_channel_id: &ChannelId< + as HasRelayChains>::DstChain, + as HasRelayChains>::SrcChain, + >, + dst_port_id: &PortId< + as HasRelayChains>::DstChain, + as HasRelayChains>::SrcChain, + >, + src_channel_id: &ChannelId< + as HasRelayChains>::SrcChain, + as HasRelayChains>::DstChain, + >, + src_port_id: &PortId< + as HasRelayChains>::SrcChain, + as HasRelayChains>::DstChain, + >, + ) -> Result<(), Relay::Error> { + ReceivePacketClearRelayer::clear_receive_packets( + self, + dst_channel_id, + dst_port_id, + src_channel_id, + src_port_id, + ) + .await + } +} diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/relay/mod.rs b/crates/relayer-all-in-one/src/one_for_all/impls/relay/mod.rs index 10a6edb5a8..a558b0aef5 100644 --- a/crates/relayer-all-in-one/src/one_for_all/impls/relay/mod.rs +++ b/crates/relayer-all-in-one/src/one_for_all/impls/relay/mod.rs @@ -1,6 +1,7 @@ pub mod auto_relayer; pub mod batch; pub mod channel; +pub mod clear_packet; pub mod client; pub mod connection; pub mod error; diff --git a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs index 6c647a3c2a..59610015f6 100644 --- a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs +++ b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs @@ -342,7 +342,7 @@ where port_id: &Self::PortId, counterparty_channel_id: &Counterparty::ChannelId, counterparty_port_id: &Counterparty::PortId, - sequences: &[Self::Sequence], + sequences: &[Counterparty::Sequence], ) -> Result, Self::Error>; async fn build_receive_packet_payload( diff --git a/crates/relayer-components-extra/src/packet_clear/impls/mod.rs b/crates/relayer-components-extra/src/packet_clear/impls/mod.rs index d01ba9ccc2..3d808ca817 100644 --- a/crates/relayer-components-extra/src/packet_clear/impls/mod.rs +++ b/crates/relayer-components-extra/src/packet_clear/impls/mod.rs @@ -1 +1 @@ -pub mod unreceived_packets_clear; +pub mod receive_packets_clear; diff --git a/crates/relayer-components-extra/src/packet_clear/impls/unreceived_packets_clear.rs b/crates/relayer-components-extra/src/packet_clear/impls/receive_packets_clear.rs similarity index 77% rename from crates/relayer-components-extra/src/packet_clear/impls/unreceived_packets_clear.rs rename to crates/relayer-components-extra/src/packet_clear/impls/receive_packets_clear.rs index b9ecd48537..598be88947 100644 --- a/crates/relayer-components-extra/src/packet_clear/impls/unreceived_packets_clear.rs +++ b/crates/relayer-components-extra/src/packet_clear/impls/receive_packets_clear.rs @@ -6,17 +6,17 @@ use ibc_relayer_components::chain::types::aliases::{ChannelId, PortId}; use ibc_relayer_components::relay::traits::packet::HasRelayPacket; use ibc_relayer_components::relay::traits::packet_relayer::CanRelayPacket; -use crate::packet_clear::traits::packet_clear::PacketClearer; +use crate::packet_clear::traits::packet_clear::ReceivePacketClearer; use crate::std_prelude::*; -pub struct PacketClearRelayer; +pub struct ReceivePacketClearRelayer; #[async_trait] -impl PacketClearer for PacketClearRelayer +impl ReceivePacketClearer for ReceivePacketClearRelayer where Relay: HasRelayPacket + CanRelayPacket, - Relay::DstChain: CanQueryPacketCommitments, - Relay::SrcChain: CanQueryUnreceivedPackets, + Relay::SrcChain: + CanQueryUnreceivedPackets + CanQueryPacketCommitments, { async fn clear_receive_packets( relay: &Relay, @@ -25,13 +25,12 @@ where src_channel_id: &ChannelId, src_port_id: &PortId, ) -> Result<(), Relay::Error> { - let dst_chain = relay.dst_chain(); let src_chain = relay.src_chain(); - let commitment_sequences = dst_chain - .query_packet_commitments(dst_channel_id, dst_port_id) + let commitment_sequences = src_chain + .query_packet_commitments(src_channel_id, src_port_id) .await - .map_err(Relay::dst_chain_error)?; + .map_err(Relay::src_chain_error)?; let unreceived_packets = src_chain .query_unreceived_packets( diff --git a/crates/relayer-components-extra/src/packet_clear/traits/packet_clear.rs b/crates/relayer-components-extra/src/packet_clear/traits/packet_clear.rs index 2803832bcb..434439e9a3 100644 --- a/crates/relayer-components-extra/src/packet_clear/traits/packet_clear.rs +++ b/crates/relayer-components-extra/src/packet_clear/traits/packet_clear.rs @@ -6,7 +6,7 @@ use ibc_relayer_components::relay::traits::packet::HasRelayPacket; use crate::std_prelude::*; #[async_trait] -pub trait CanClearPackets: HasRelayPacket { +pub trait CanClearReceivePackets: HasRelayPacket { async fn clear_receive_packets( &self, dst_channel_id: &ChannelId, @@ -17,7 +17,7 @@ pub trait CanClearPackets: HasRelayPacket { } #[async_trait] -pub trait PacketClearer: Async +pub trait ReceivePacketClearer: Async where Relay: HasRelayPacket, { diff --git a/crates/relayer-components-extra/src/packet_clear/worker.rs b/crates/relayer-components-extra/src/packet_clear/worker.rs index 1c48985627..fa2d6ba0eb 100644 --- a/crates/relayer-components-extra/src/packet_clear/worker.rs +++ b/crates/relayer-components-extra/src/packet_clear/worker.rs @@ -8,7 +8,7 @@ use ibc_relayer_components::relay::traits::target::ChainTarget; use ibc_relayer_components::runtime::traits::runtime::HasRuntime; use ibc_relayer_components::runtime::traits::sleep::CanSleep; -use crate::packet_clear::traits::packet_clear::CanClearPackets; +use crate::packet_clear::traits::packet_clear::CanClearReceivePackets; use crate::runtime::traits::spawn::{HasSpawner, Spawner, TaskHandle}; use crate::std_prelude::*; @@ -70,7 +70,7 @@ where #[async_trait] impl CanRunLoop for Relay where - Relay: CanLogRelayTarget + CanClearPackets, + Relay: CanLogRelayTarget + CanClearReceivePackets, Target: ChainTarget, Target::TargetChain: HasRuntime, Runtime: CanSleep, diff --git a/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs b/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs index de7972ad0a..a22ba3b476 100644 --- a/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs +++ b/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs @@ -33,6 +33,6 @@ where port_id: &Self::PortId, counterparty_channel_id: &Counterparty::ChannelId, counterparty_port_id: &Counterparty::PortId, - sequences: &[Self::Sequence], + sequences: &[Counterparty::Sequence], ) -> Result, Self::Error>; } diff --git a/tools/integration-test/Cargo.toml b/tools/integration-test/Cargo.toml index 109401256f..eb02cd7542 100644 --- a/tools/integration-test/Cargo.toml +++ b/tools/integration-test/Cargo.toml @@ -17,6 +17,7 @@ ibc-relayer-types = { path = "../../crates/relayer-types" } ibc-relayer = { path = "../../crates/relayer" } ibc-relayer-all-in-one = { path = "../../crates/relayer-all-in-one" } ibc-relayer-components = { version = "0.1.0", path = "../../crates/relayer-components" } +ibc-relayer-components-extra = { version = "0.1.0", path = "../../crates/relayer-components-extra" } ibc-relayer-runtime = { path = "../../crates/relayer-runtime" } ibc-relayer-cosmos = { path = "../../crates/relayer-cosmos" } ibc-test-framework = { path = "../test-framework" } diff --git a/tools/integration-test/src/tests/next/packet_clear.rs b/tools/integration-test/src/tests/next/packet_clear.rs index b58ead8b6f..8d7ed9a39a 100644 --- a/tools/integration-test/src/tests/next/packet_clear.rs +++ b/tools/integration-test/src/tests/next/packet_clear.rs @@ -1,4 +1,6 @@ use ibc_relayer::config::PacketFilter; +use ibc_relayer_components::relay::traits::two_way::HasTwoWayRelay; +use ibc_relayer_components_extra::packet_clear::traits::packet_clear::CanClearReceivePackets; use ibc_test_framework::framework::next::chain::{HasTwoChains, HasTwoChannels}; use ibc_test_framework::prelude::*; use ibc_test_framework::util::random::random_u64_range; @@ -24,19 +26,21 @@ impl BinaryChannelTest for IbcClearPacketTest { Context: HasTwoChains + HasTwoChannels, { let chains = context.chains(); - let channel = context.channel(); + let cloned_channel = context.channel().clone(); + let channel = context.channel().clone(); let pf: PacketFilter = PacketFilter::default(); - let _relay_context = build_cosmos_relay_context(&relayer.config, chains, pf)?; + let relay_context = build_cosmos_relay_context(&relayer.config, chains, pf.clone())?; + let relay_context2 = build_cosmos_relay_context(&relayer.config, chains, pf)?; - let _runtime = chains.node_a.value().chain_driver.runtime.as_ref(); + let runtime = chains.node_a.value().chain_driver.runtime.as_ref(); let denom_a = chains.node_a.denom(); let wallet_a = chains.node_a.wallets().user1().cloned(); let wallet_b = chains.node_b.wallets().user1().cloned(); - let _balance_a = chains + let balance_a = chains .node_a .chain_driver() .query_balance(&wallet_a.address(), &denom_a)?; @@ -59,9 +63,63 @@ impl BinaryChannelTest for IbcClearPacketTest { &denom_a.with_amount(a_to_b_amount).as_ref(), )?; - // TODO call clear packet + let denom_b = derive_ibc_denom( + &channel.port_b.as_ref(), + &channel.channel_id_b.as_ref(), + &denom_a, + )?; + + runtime.spawn(async move { + let _ = relay_context + .relay_b_to_a() + .clear_receive_packets( + channel.channel_id_b.value(), + channel.port_b.value(), + channel.channel_id_a.value(), + channel.port_a.value(), + ) + .await; + }); + + sleep(Duration::from_secs(10)); + + info!("Clear packets from B to A should not clear the pending packet from A to B"); + + chains.node_a.chain_driver().assert_eventual_wallet_amount( + &wallet_a.address(), + &(balance_a.clone() - a_to_b_amount).as_ref(), + )?; + + chains.node_b.chain_driver().assert_eventual_wallet_amount( + &wallet_b.address(), + &denom_b.with_amount(0u64).as_ref(), + )?; + + runtime.spawn(async move { + let _ = relay_context2 + .relay_a_to_b() + .clear_receive_packets( + cloned_channel.channel_id_b.value(), + cloned_channel.port_b.value(), + cloned_channel.channel_id_a.value(), + cloned_channel.port_a.value(), + ) + .await; + }); + + info!("Clear packet from A to B should clear the pending packet"); + + chains.node_a.chain_driver().assert_eventual_wallet_amount( + &wallet_a.address(), + &(balance_a - a_to_b_amount).as_ref(), + )?; + + chains.node_b.chain_driver().assert_eventual_wallet_amount( + &wallet_b.address(), + &denom_b.with_amount(a_to_b_amount).as_ref(), + )?; - // TODO assert transfer is completed + sleep(Duration::from_secs(2)); Ok(()) } From 071c9963343e6cc204834a859dd3431b236181b7 Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Fri, 21 Jul 2023 10:48:03 +0200 Subject: [PATCH 12/26] Fix and improve Clear packet implementation and tests for relayer-next --- .../src/all_for_one/birelay.rs | 3 +- .../src/all_for_one/chain.rs | 7 + .../impls/chain/queries/packet_commitments.rs | 2 +- .../impls/chain/queries/unreceived_packets.rs | 28 ++- .../clear_packet/receive_packet_clear.rs | 18 +- .../src/one_for_all/traits/chain.rs | 10 +- .../impls/receive_packets_clear.rs | 20 ++- .../src/packet_clear/traits/packet_clear.rs | 8 +- .../src/packet_clear/worker.rs | 20 +-- .../traits/queries/packet_commitments.rs | 15 +- .../traits/queries/unreceived_packets.rs | 16 ++ crates/relayer-cosmos/src/impls/chain.rs | 15 +- .../src/methods/unreceived_packet.rs | 13 +- .../src/tests/next/packet_clear.rs | 169 ++++++++++++++---- 14 files changed, 257 insertions(+), 87 deletions(-) diff --git a/crates/relayer-all-in-one/src/all_for_one/birelay.rs b/crates/relayer-all-in-one/src/all_for_one/birelay.rs index 29ca22773f..8483c5d176 100644 --- a/crates/relayer-all-in-one/src/all_for_one/birelay.rs +++ b/crates/relayer-all-in-one/src/all_for_one/birelay.rs @@ -23,7 +23,8 @@ impl AfoBiRelay for BiRelay where RelayAToB: AfoRelay, RelayBToA: AfoRelay, - BiRelay: HasAfoRuntime + BiRelay: Clone + + HasAfoRuntime + HasLoggerWithBaseLevels + CanAutoRelay + HasTwoWayRelay, diff --git a/crates/relayer-all-in-one/src/all_for_one/chain.rs b/crates/relayer-all-in-one/src/all_for_one/chain.rs index 372e7f2dd3..ed412a92e8 100644 --- a/crates/relayer-all-in-one/src/all_for_one/chain.rs +++ b/crates/relayer-all-in-one/src/all_for_one/chain.rs @@ -3,6 +3,9 @@ use ibc_relayer_components::chain::traits::queries::consensus_state::CanQueryCon use ibc_relayer_components::chain::traits::queries::packet_commitments::CanQueryPacketCommitments; use ibc_relayer_components::chain::traits::queries::received_packet::CanQueryReceivedPacket; use ibc_relayer_components::chain::traits::queries::status::CanQueryChainStatus; +use ibc_relayer_components::chain::traits::queries::unreceived_packets::{ + CanQueryUnreceivedPacketSequences, CanQueryUnreceivedPackets, +}; use ibc_relayer_components::chain::traits::types::chain::HasChainTypes; use ibc_relayer_components::chain::traits::types::channel::{ HasChannelHandshakePayloads, HasInitChannelOptionsType, @@ -31,6 +34,8 @@ pub trait AfoChain: + CanQueryConsensusState + CanQueryReceivedPacket + CanQueryPacketCommitments + + CanQueryUnreceivedPacketSequences + + CanQueryUnreceivedPackets + HasCreateClientOptions + HasInitConnectionOptionsType + HasConnectionHandshakePayloads @@ -68,6 +73,8 @@ where + CanQueryConsensusState + CanQueryReceivedPacket + CanQueryPacketCommitments + + CanQueryUnreceivedPacketSequences + + CanQueryUnreceivedPackets + HasCreateClientOptions + HasInitConnectionOptionsType + HasConnectionHandshakePayloads diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/packet_commitments.rs b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/packet_commitments.rs index 3b25dfa65d..54b837c6c1 100644 --- a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/packet_commitments.rs +++ b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/packet_commitments.rs @@ -17,7 +17,7 @@ where &self, channel_id: &Self::ChannelId, port_id: &Self::PortId, - ) -> Result, Self::Error> { + ) -> Result, Self::Error> { let sequences = self .chain .query_packet_commitments(channel_id, port_id) diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs index 2e56eb9c38..969fd86916 100644 --- a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs +++ b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs @@ -1,11 +1,35 @@ use async_trait::async_trait; -use ibc_relayer_components::chain::traits::queries::unreceived_packets::CanQueryUnreceivedPackets; +use ibc_relayer_components::chain::traits::queries::unreceived_packets::{ + CanQueryUnreceivedPacketSequences, CanQueryUnreceivedPackets, +}; use crate::one_for_all::traits::chain::{OfaChainTypes, OfaIbcChain}; use crate::one_for_all::types::chain::OfaChainWrapper; use crate::std_prelude::*; +#[async_trait] +impl CanQueryUnreceivedPacketSequences> + for OfaChainWrapper +where + Chain: OfaIbcChain + OfaChainTypes, + Counterparty: OfaIbcChain, +{ + async fn query_unreceived_packet_sequences( + &self, + channel_id: &Chain::ChannelId, + port_id: &Chain::PortId, + sequences: &[Counterparty::Sequence], + ) -> Result<(Vec, Chain::Height), Self::Error> { + let unreceived_packet_sequences = self + .chain + .query_unreceived_packet_sequences(channel_id, port_id, sequences) + .await?; + + Ok(unreceived_packet_sequences) + } +} + #[async_trait] impl CanQueryUnreceivedPackets> for OfaChainWrapper @@ -20,6 +44,7 @@ where counterparty_channel_id: &Counterparty::ChannelId, counterparty_port_id: &Counterparty::PortId, sequences: &[Counterparty::Sequence], + height: &Counterparty::Height, ) -> Result, Self::Error> { let unreceived_packet = self .chain @@ -29,6 +54,7 @@ where counterparty_channel_id, counterparty_port_id, sequences, + height, ) .await?; Ok(unreceived_packet) diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/relay/clear_packet/receive_packet_clear.rs b/crates/relayer-all-in-one/src/one_for_all/impls/relay/clear_packet/receive_packet_clear.rs index 3ce1abc8e4..7da4edf729 100644 --- a/crates/relayer-all-in-one/src/one_for_all/impls/relay/clear_packet/receive_packet_clear.rs +++ b/crates/relayer-all-in-one/src/one_for_all/impls/relay/clear_packet/receive_packet_clear.rs @@ -17,29 +17,29 @@ where { async fn clear_receive_packets( &self, - dst_channel_id: &ChannelId< - as HasRelayChains>::DstChain, + src_channel_id: &ChannelId< as HasRelayChains>::SrcChain, - >, - dst_port_id: &PortId< as HasRelayChains>::DstChain, - as HasRelayChains>::SrcChain, >, - src_channel_id: &ChannelId< + src_port_id: &PortId< as HasRelayChains>::SrcChain, as HasRelayChains>::DstChain, >, - src_port_id: &PortId< + dst_channel_id: &ChannelId< + as HasRelayChains>::DstChain, as HasRelayChains>::SrcChain, + >, + dst_port_id: &PortId< as HasRelayChains>::DstChain, + as HasRelayChains>::SrcChain, >, ) -> Result<(), Relay::Error> { ReceivePacketClearRelayer::clear_receive_packets( self, - dst_channel_id, - dst_port_id, src_channel_id, src_port_id, + dst_channel_id, + dst_port_id, ) .await } diff --git a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs index 59610015f6..19485c3420 100644 --- a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs +++ b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs @@ -334,7 +334,14 @@ where &self, channel_id: &Self::ChannelId, port_id: &Self::PortId, - ) -> Result, Self::Error>; + ) -> Result, Self::Error>; + + async fn query_unreceived_packet_sequences( + &self, + channel_id: &Self::ChannelId, + port_id: &Self::PortId, + sequences: &[Counterparty::Sequence], + ) -> Result<(Vec, Self::Height), Self::Error>; async fn query_unreceived_packets( &self, @@ -343,6 +350,7 @@ where counterparty_channel_id: &Counterparty::ChannelId, counterparty_port_id: &Counterparty::PortId, sequences: &[Counterparty::Sequence], + height: &Counterparty::Height, ) -> Result, Self::Error>; async fn build_receive_packet_payload( diff --git a/crates/relayer-components-extra/src/packet_clear/impls/receive_packets_clear.rs b/crates/relayer-components-extra/src/packet_clear/impls/receive_packets_clear.rs index 598be88947..cfb0889d88 100644 --- a/crates/relayer-components-extra/src/packet_clear/impls/receive_packets_clear.rs +++ b/crates/relayer-components-extra/src/packet_clear/impls/receive_packets_clear.rs @@ -1,7 +1,9 @@ use async_trait::async_trait; use futures_util::{stream, StreamExt}; use ibc_relayer_components::chain::traits::queries::packet_commitments::CanQueryPacketCommitments; -use ibc_relayer_components::chain::traits::queries::unreceived_packets::CanQueryUnreceivedPackets; +use ibc_relayer_components::chain::traits::queries::unreceived_packets::{ + CanQueryUnreceivedPacketSequences, CanQueryUnreceivedPackets, +}; use ibc_relayer_components::chain::types::aliases::{ChannelId, PortId}; use ibc_relayer_components::relay::traits::packet::HasRelayPacket; use ibc_relayer_components::relay::traits::packet_relayer::CanRelayPacket; @@ -15,16 +17,18 @@ pub struct ReceivePacketClearRelayer; impl ReceivePacketClearer for ReceivePacketClearRelayer where Relay: HasRelayPacket + CanRelayPacket, + Relay::DstChain: CanQueryUnreceivedPacketSequences, Relay::SrcChain: - CanQueryUnreceivedPackets + CanQueryPacketCommitments, + CanQueryPacketCommitments + CanQueryUnreceivedPackets, { async fn clear_receive_packets( relay: &Relay, - dst_channel_id: &ChannelId, - dst_port_id: &PortId, src_channel_id: &ChannelId, src_port_id: &PortId, + dst_channel_id: &ChannelId, + dst_port_id: &PortId, ) -> Result<(), Relay::Error> { + let dst_chain = relay.dst_chain(); let src_chain = relay.src_chain(); let commitment_sequences = src_chain @@ -32,13 +36,19 @@ where .await .map_err(Relay::src_chain_error)?; + let (unreceived_sequences, height) = dst_chain + .query_unreceived_packet_sequences(dst_channel_id, dst_port_id, &commitment_sequences) + .await + .map_err(Relay::dst_chain_error)?; + let unreceived_packets = src_chain .query_unreceived_packets( src_channel_id, src_port_id, dst_channel_id, dst_port_id, - &commitment_sequences, + &unreceived_sequences, + &height, ) .await .map_err(Relay::src_chain_error)?; diff --git a/crates/relayer-components-extra/src/packet_clear/traits/packet_clear.rs b/crates/relayer-components-extra/src/packet_clear/traits/packet_clear.rs index 434439e9a3..77e7bd3f0e 100644 --- a/crates/relayer-components-extra/src/packet_clear/traits/packet_clear.rs +++ b/crates/relayer-components-extra/src/packet_clear/traits/packet_clear.rs @@ -9,10 +9,10 @@ use crate::std_prelude::*; pub trait CanClearReceivePackets: HasRelayPacket { async fn clear_receive_packets( &self, - dst_channel_id: &ChannelId, - dst_port_id: &PortId, src_channel_id: &ChannelId, src_port_id: &PortId, + dst_channel_id: &ChannelId, + dst_port_id: &PortId, ) -> Result<(), Self::Error>; } @@ -23,9 +23,9 @@ where { async fn clear_receive_packets( relay: &Relay, - dst_channel_id: &ChannelId, - dst_port_id: &PortId, src_channel_id: &ChannelId, src_port_id: &PortId, + dst_channel_id: &ChannelId, + dst_port_id: &PortId, ) -> Result<(), Relay::Error>; } diff --git a/crates/relayer-components-extra/src/packet_clear/worker.rs b/crates/relayer-components-extra/src/packet_clear/worker.rs index fa2d6ba0eb..7e48d6e39a 100644 --- a/crates/relayer-components-extra/src/packet_clear/worker.rs +++ b/crates/relayer-components-extra/src/packet_clear/worker.rs @@ -21,10 +21,10 @@ where fn spawn_packet_clear_worker( self, target: Target, - dst_channel_id: ChannelId, - dst_port_id: PortId, src_channel_id: ChannelId, src_counterparty_port_id: PortId, + dst_channel_id: ChannelId, + dst_port_id: PortId, ) -> Box; } @@ -38,15 +38,15 @@ where fn spawn_packet_clear_worker( self, _target: Target, - dst_channel_id: ChannelId, - dst_port_id: PortId, src_channel_id: ChannelId, src_port_id: PortId, + dst_channel_id: ChannelId, + dst_port_id: PortId, ) -> Box { let spawner = Target::target_chain(&self).runtime().spawner(); spawner.spawn(async move { - self.run_loop(&dst_channel_id, &dst_port_id, &src_channel_id, &src_port_id) + self.run_loop(&src_channel_id, &src_port_id, &dst_channel_id, &dst_port_id) .await; }) } @@ -60,10 +60,10 @@ where { async fn run_loop( &self, - dst_channel_id: &ChannelId, - dst_port_id: &PortId, src_channel_id: &ChannelId, src_port_id: &PortId, + dst_channel_id: &ChannelId, + dst_port_id: &PortId, ); } @@ -77,16 +77,16 @@ where { async fn run_loop( &self, - dst_channel_id: &ChannelId, - dst_port_id: &PortId, src_channel_id: &ChannelId, src_port_id: &PortId, + dst_channel_id: &ChannelId, + dst_port_id: &PortId, ) { let runtime = Target::target_chain(self).runtime(); loop { let _ = self - .clear_receive_packets(dst_channel_id, dst_port_id, src_channel_id, src_port_id) + .clear_receive_packets(src_channel_id, src_port_id, dst_channel_id, dst_port_id) .await; runtime.sleep(Duration::from_secs(5)).await; } diff --git a/crates/relayer-components/src/chain/traits/queries/packet_commitments.rs b/crates/relayer-components/src/chain/traits/queries/packet_commitments.rs index 243888f9bd..a4c842364c 100644 --- a/crates/relayer-components/src/chain/traits/queries/packet_commitments.rs +++ b/crates/relayer-components/src/chain/traits/queries/packet_commitments.rs @@ -4,19 +4,6 @@ use crate::chain::traits::types::ibc::HasIbcChainTypes; use crate::core::traits::error::HasErrorType; use crate::std_prelude::*; -#[async_trait] -pub trait CommitmentsPacketQuerier -where - Chain: HasIbcChainTypes + HasErrorType, - Counterparty: HasIbcChainTypes, -{ - async fn query_packet_commitments( - chain: &Chain, - port_id: &Chain::PortId, - channel_id: &Chain::ChannelId, - ) -> Result; -} - #[async_trait] pub trait CanQueryPacketCommitments: HasIbcChainTypes + HasErrorType @@ -27,5 +14,5 @@ where &self, channel_id: &Self::ChannelId, port_id: &Self::PortId, - ) -> Result, Self::Error>; + ) -> Result, Self::Error>; } diff --git a/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs b/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs index a22ba3b476..13e21fc3da 100644 --- a/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs +++ b/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs @@ -5,6 +5,20 @@ use crate::chain::traits::types::packet::HasIbcPacketTypes; use crate::core::traits::error::HasErrorType; use crate::std_prelude::*; +#[async_trait] +pub trait CanQueryUnreceivedPacketSequences: + HasIbcChainTypes + HasIbcPacketTypes + HasErrorType +where + Counterparty: HasIbcChainTypes, +{ + async fn query_unreceived_packet_sequences( + &self, + channel_id: &Self::ChannelId, + port_id: &Self::PortId, + sequences: &[Counterparty::Sequence], + ) -> Result<(Vec, Self::Height), Self::Error>; +} + #[async_trait] pub trait UnreceivedPacketsQuerier where @@ -18,6 +32,7 @@ where counterparty_channel_id: &Counterparty::ChannelId, counterparty_port_id: &Counterparty::PortId, sequences: &[Counterparty::Sequence], + height: &Counterparty::Height, ) -> Result, Chain::Error>; } @@ -34,5 +49,6 @@ where counterparty_channel_id: &Counterparty::ChannelId, counterparty_port_id: &Counterparty::PortId, sequences: &[Counterparty::Sequence], + height: &Counterparty::Height, ) -> Result, Self::Error>; } diff --git a/crates/relayer-cosmos/src/impls/chain.rs b/crates/relayer-cosmos/src/impls/chain.rs index 470fa330a1..f9da390bb7 100644 --- a/crates/relayer-cosmos/src/impls/chain.rs +++ b/crates/relayer-cosmos/src/impls/chain.rs @@ -60,7 +60,9 @@ use crate::methods::packet::{ query_write_acknowledgement_event, CosmosAckPacketPayload, CosmosReceivePacketPayload, CosmosTimeoutUnorderedPacketPayload, }; -use crate::methods::unreceived_packet::{query_packet_commitments, query_unreceived_packets}; +use crate::methods::unreceived_packet::{ + query_packet_commitments, query_unreceived_packet_sequences, query_unreceived_packets, +}; use crate::methods::update_client::{build_update_client_message, build_update_client_payload}; use crate::traits::message::CosmosMessage; use crate::types::channel::{ @@ -541,6 +543,15 @@ where query_packet_commitments(self, channel_id, port_id).await } + async fn query_unreceived_packet_sequences( + &self, + channel_id: &ChannelId, + port_id: &PortId, + sequences: &[Sequence], + ) -> Result<(Vec, Height), Self::Error> { + query_unreceived_packet_sequences(self, channel_id, port_id, sequences).await + } + async fn query_unreceived_packets( &self, channel_id: &ChannelId, @@ -548,6 +559,7 @@ where counterparty_channel_id: &ChannelId, counterparty_port_id: &PortId, sequences: &[Sequence], + height: &Height, ) -> Result, Self::Error> { query_unreceived_packets( self, @@ -556,6 +568,7 @@ where counterparty_channel_id, counterparty_port_id, sequences, + height, ) .await } diff --git a/crates/relayer-cosmos/src/methods/unreceived_packet.rs b/crates/relayer-cosmos/src/methods/unreceived_packet.rs index 3c5302a7d7..c77d44038e 100644 --- a/crates/relayer-cosmos/src/methods/unreceived_packet.rs +++ b/crates/relayer-cosmos/src/methods/unreceived_packet.rs @@ -51,7 +51,7 @@ pub async fn query_packet_commitments( Ok(commitment_sequences) } -async fn query_unreceived_packet_sequences( +pub async fn query_unreceived_packet_sequences( chain: &CosmosChain, channel_id: &ChannelId, port_id: &PortId, @@ -73,7 +73,7 @@ async fn query_unreceived_packet_sequences( let response = client .unreceived_packets(request) .await - .map_err(|e| BaseError::grpc_status(e, "query_packet_commitments".to_owned()))? + .map_err(|e| BaseError::grpc_status(e, "unreceived_packets".to_owned()))? .into_inner(); let raw_height = response @@ -91,17 +91,18 @@ pub async fn query_unreceived_packets( counterparty_channel_id: &ChannelId, counterparty_port_id: &PortId, sequences: &[Sequence], + height: &Height, ) -> Result, Error> { - let (unreceived_sequences, height) = - query_unreceived_packet_sequences(chain, channel_id, port_id, sequences).await?; + // The unreceived packet are queried from the source chain, so the destination + // channel id and port id are the counterparty channel id and counterparty port id. let request = QueryPacketEventDataRequest { event_id: WithBlockDataType::SendPacket, source_channel_id: channel_id.clone(), source_port_id: port_id.clone(), destination_channel_id: counterparty_channel_id.clone(), destination_port_id: counterparty_port_id.clone(), - sequences: unreceived_sequences.to_vec(), - height: Qualified::SmallerEqual(QueryHeight::Specific(height)), + sequences: sequences.to_vec(), + height: Qualified::SmallerEqual(QueryHeight::Specific(*height)), }; let mut events = vec![]; for sequence in sequences.iter() { diff --git a/tools/integration-test/src/tests/next/packet_clear.rs b/tools/integration-test/src/tests/next/packet_clear.rs index 8d7ed9a39a..34cd0ca34c 100644 --- a/tools/integration-test/src/tests/next/packet_clear.rs +++ b/tools/integration-test/src/tests/next/packet_clear.rs @@ -1,6 +1,13 @@ use ibc_relayer::config::PacketFilter; +use ibc_relayer_components::chain::traits::queries::packet_commitments::CanQueryPacketCommitments; +use ibc_relayer_components::chain::traits::queries::unreceived_packets::{ + CanQueryUnreceivedPacketSequences, CanQueryUnreceivedPackets, +}; +use ibc_relayer_components::relay::traits::chains::HasRelayChains; use ibc_relayer_components::relay::traits::two_way::HasTwoWayRelay; use ibc_relayer_components_extra::packet_clear::traits::packet_clear::CanClearReceivePackets; +use ibc_relayer_types::core::ics04_channel::packet::Sequence; +use ibc_relayer_types::Height; use ibc_test_framework::framework::next::chain::{HasTwoChains, HasTwoChannels}; use ibc_test_framework::prelude::*; use ibc_test_framework::util::random::random_u64_range; @@ -30,8 +37,7 @@ impl BinaryChannelTest for IbcClearPacketTest { let channel = context.channel().clone(); let pf: PacketFilter = PacketFilter::default(); - let relay_context = build_cosmos_relay_context(&relayer.config, chains, pf.clone())?; - let relay_context2 = build_cosmos_relay_context(&relayer.config, chains, pf)?; + let relay_context = build_cosmos_relay_context(&relayer.config, chains, pf)?; let runtime = chains.node_a.value().chain_driver.runtime.as_ref(); @@ -69,57 +75,152 @@ impl BinaryChannelTest for IbcClearPacketTest { &denom_a, )?; - runtime.spawn(async move { + runtime.block_on(async { + info!("Assert query packet commitments works as expected"); + + let src_commitments: Vec = + CanQueryPacketCommitments::query_packet_commitments( + relay_context.relay_a_to_b().src_chain(), + channel.channel_id_a.value(), + channel.port_a.value(), + ) + .await + .unwrap(); + + assert_eq!(src_commitments, vec!(Sequence::from(1))); + + let dst_commitments: Vec = + CanQueryPacketCommitments::query_packet_commitments( + relay_context.relay_a_to_b().dst_chain(), + channel.channel_id_b.value(), + channel.port_b.value(), + ) + .await + .unwrap(); + + assert_eq!(dst_commitments, vec!()); + + info!("Assert query unreceived packet sequences works as expected"); + + let (unreceived_packet_sequences, height): (Vec, Height) = + CanQueryUnreceivedPacketSequences::query_unreceived_packet_sequences( + relay_context.relay_a_to_b().src_chain(), + channel.channel_id_a.value(), + channel.port_a.value(), + &src_commitments, + ) + .await + .unwrap(); + + assert_eq!(unreceived_packet_sequences, vec!(Sequence::from(1))); + + let (unreceived_packet_sequences, _): (Vec, Height) = + CanQueryUnreceivedPacketSequences::query_unreceived_packet_sequences( + relay_context.relay_a_to_b().dst_chain(), + channel.channel_id_b.value(), + channel.port_b.value(), + &src_commitments, + ) + .await + .unwrap(); + + assert_eq!(unreceived_packet_sequences, vec!(Sequence::from(1))); + + info!("Assert query unreceived packets works as expected"); + + let unreceived_packets = CanQueryUnreceivedPackets::query_unreceived_packets( + relay_context.relay_a_to_b().src_chain(), + channel.channel_id_a.value(), + channel.port_a.value(), + channel.channel_id_b.value(), + channel.port_b.value(), + &unreceived_packet_sequences, + &height, + ) + .await + .unwrap(); + + assert_eq!(unreceived_packets.len(), 1); + + let unreceived_packets = CanQueryUnreceivedPackets::query_unreceived_packets( + relay_context.relay_a_to_b().dst_chain(), + channel.channel_id_b.value(), + channel.port_b.value(), + channel.channel_id_a.value(), + channel.port_a.value(), + &unreceived_packet_sequences, + &height, + ) + .await + .unwrap(); + + assert_eq!(unreceived_packets.len(), 0); + let _ = relay_context .relay_b_to_a() .clear_receive_packets( - channel.channel_id_b.value(), - channel.port_b.value(), channel.channel_id_a.value(), channel.port_a.value(), + channel.channel_id_b.value(), + channel.port_b.value(), ) .await; - }); - sleep(Duration::from_secs(10)); + info!("Clear packets from B to A should not clear the pending packet from A to B"); - info!("Clear packets from B to A should not clear the pending packet from A to B"); + let amount = chains + .node_a + .chain_driver() + .query_balance(&wallet_a.address(), &balance_a.denom()) + .unwrap(); - chains.node_a.chain_driver().assert_eventual_wallet_amount( - &wallet_a.address(), - &(balance_a.clone() - a_to_b_amount).as_ref(), - )?; + assert_eq!( + amount.value().amount, + (balance_a.clone() - a_to_b_amount).amount() + ); - chains.node_b.chain_driver().assert_eventual_wallet_amount( - &wallet_b.address(), - &denom_b.with_amount(0u64).as_ref(), - )?; + let amount = chains + .node_b + .chain_driver() + .query_balance(&wallet_b.address(), &denom_b.as_ref()) + .unwrap(); + + assert_eq!(amount.value().amount, denom_b.with_amount(0u64).amount()); - runtime.spawn(async move { - let _ = relay_context2 + let _ = relay_context .relay_a_to_b() .clear_receive_packets( - cloned_channel.channel_id_b.value(), - cloned_channel.port_b.value(), cloned_channel.channel_id_a.value(), cloned_channel.port_a.value(), + cloned_channel.channel_id_b.value(), + cloned_channel.port_b.value(), ) .await; - }); - - info!("Clear packet from A to B should clear the pending packet"); - - chains.node_a.chain_driver().assert_eventual_wallet_amount( - &wallet_a.address(), - &(balance_a - a_to_b_amount).as_ref(), - )?; - chains.node_b.chain_driver().assert_eventual_wallet_amount( - &wallet_b.address(), - &denom_b.with_amount(a_to_b_amount).as_ref(), - )?; - - sleep(Duration::from_secs(2)); + info!("Clear packet from A to B should clear the pending packet"); + + let amount = chains + .node_a + .chain_driver() + .query_balance(&wallet_a.address(), &balance_a.denom()) + .unwrap(); + + assert_eq!( + amount.value().amount, + (balance_a.clone() - a_to_b_amount).amount() + ); + + let amount = chains + .node_b + .chain_driver() + .query_balance(&wallet_b.address(), &denom_b.as_ref()) + .unwrap(); + + assert_eq!( + amount.value().amount, + denom_b.with_amount(a_to_b_amount).amount() + ); + }); Ok(()) } From acf2b7b4f10d31318b97314a2048d0e34b01e0a2 Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Mon, 24 Jul 2023 09:26:07 +0200 Subject: [PATCH 13/26] Add HasClearInterval trait for relayer-next --- .../src/packet_clear/traits/clear_interval.rs | 7 +++++++ .../src/packet_clear/traits/mod.rs | 1 + crates/relayer-components-extra/src/packet_clear/worker.rs | 7 +++++-- 3 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 crates/relayer-components-extra/src/packet_clear/traits/clear_interval.rs diff --git a/crates/relayer-components-extra/src/packet_clear/traits/clear_interval.rs b/crates/relayer-components-extra/src/packet_clear/traits/clear_interval.rs new file mode 100644 index 0000000000..aabc84d194 --- /dev/null +++ b/crates/relayer-components-extra/src/packet_clear/traits/clear_interval.rs @@ -0,0 +1,7 @@ +use ibc_relayer_components::core::traits::sync::Async; + +pub trait HasClearInterval { + type ClearInterval: Async + Clone + Into; + + fn clear_interval(&self) -> Self::ClearInterval; +} diff --git a/crates/relayer-components-extra/src/packet_clear/traits/mod.rs b/crates/relayer-components-extra/src/packet_clear/traits/mod.rs index e2de2c5934..01d2f89c1a 100644 --- a/crates/relayer-components-extra/src/packet_clear/traits/mod.rs +++ b/crates/relayer-components-extra/src/packet_clear/traits/mod.rs @@ -1 +1,2 @@ +pub mod clear_interval; pub mod packet_clear; diff --git a/crates/relayer-components-extra/src/packet_clear/worker.rs b/crates/relayer-components-extra/src/packet_clear/worker.rs index 7e48d6e39a..caa34ed700 100644 --- a/crates/relayer-components-extra/src/packet_clear/worker.rs +++ b/crates/relayer-components-extra/src/packet_clear/worker.rs @@ -12,6 +12,8 @@ use crate::packet_clear::traits::packet_clear::CanClearReceivePackets; use crate::runtime::traits::spawn::{HasSpawner, Spawner, TaskHandle}; use crate::std_prelude::*; +use super::traits::clear_interval::HasClearInterval; + #[async_trait] pub trait CanSpawnPacketClearWorker: HasRelayChains where @@ -70,7 +72,7 @@ where #[async_trait] impl CanRunLoop for Relay where - Relay: CanLogRelayTarget + CanClearReceivePackets, + Relay: CanLogRelayTarget + CanClearReceivePackets + HasClearInterval, Target: ChainTarget, Target::TargetChain: HasRuntime, Runtime: CanSleep, @@ -83,12 +85,13 @@ where dst_port_id: &PortId, ) { let runtime = Target::target_chain(self).runtime(); + let clear_interval = self.clear_interval().into(); loop { let _ = self .clear_receive_packets(src_channel_id, src_port_id, dst_channel_id, dst_port_id) .await; - runtime.sleep(Duration::from_secs(5)).await; + runtime.sleep(Duration::from_secs(clear_interval)).await; } } } From 7b69032c7c97e0446f1166bd3c3d5c4c830c2cc5 Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Mon, 24 Jul 2023 09:44:27 +0200 Subject: [PATCH 14/26] Remove Target from ClearPacketWorker in relayer-next --- .../src/packet_clear/worker.rs | 36 ++++++------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/crates/relayer-components-extra/src/packet_clear/worker.rs b/crates/relayer-components-extra/src/packet_clear/worker.rs index caa34ed700..d0eb16ad10 100644 --- a/crates/relayer-components-extra/src/packet_clear/worker.rs +++ b/crates/relayer-components-extra/src/packet_clear/worker.rs @@ -1,10 +1,8 @@ use core::time::Duration; use ibc_relayer_components::chain::types::aliases::{ChannelId, PortId}; -use ibc_relayer_components::relay::traits::logs::logger::CanLogRelayTarget; use async_trait::async_trait; use ibc_relayer_components::relay::traits::chains::HasRelayChains; -use ibc_relayer_components::relay::traits::target::ChainTarget; use ibc_relayer_components::runtime::traits::runtime::HasRuntime; use ibc_relayer_components::runtime::traits::sleep::CanSleep; @@ -15,14 +13,9 @@ use crate::std_prelude::*; use super::traits::clear_interval::HasClearInterval; #[async_trait] -pub trait CanSpawnPacketClearWorker: HasRelayChains -where - Target: ChainTarget, - Target::TargetChain: HasRuntime, -{ +pub trait CanSpawnPacketClearWorker: HasRelayChains { fn spawn_packet_clear_worker( self, - target: Target, src_channel_id: ChannelId, src_counterparty_port_id: PortId, dst_channel_id: ChannelId, @@ -30,22 +23,19 @@ where ) -> Box; } -impl CanSpawnPacketClearWorker for Relay +impl CanSpawnPacketClearWorker for Relay where - Relay: CanRunLoop, - Target: ChainTarget, - Target::TargetChain: HasRuntime, - Runtime: HasSpawner, + Relay: CanRunLoop + HasRuntime, + Relay::Runtime: HasSpawner, { fn spawn_packet_clear_worker( self, - _target: Target, src_channel_id: ChannelId, src_port_id: PortId, dst_channel_id: ChannelId, dst_port_id: PortId, ) -> Box { - let spawner = Target::target_chain(&self).runtime().spawner(); + let spawner = self.runtime().spawner(); spawner.spawn(async move { self.run_loop(&src_channel_id, &src_port_id, &dst_channel_id, &dst_port_id) @@ -55,11 +45,7 @@ where } #[async_trait] -trait CanRunLoop: HasRelayChains -where - Target: ChainTarget, - Target::TargetChain: HasRuntime, -{ +trait CanRunLoop: HasRelayChains { async fn run_loop( &self, src_channel_id: &ChannelId, @@ -70,12 +56,10 @@ where } #[async_trait] -impl CanRunLoop for Relay +impl CanRunLoop for Relay where - Relay: CanLogRelayTarget + CanClearReceivePackets + HasClearInterval, - Target: ChainTarget, - Target::TargetChain: HasRuntime, - Runtime: CanSleep, + Relay: HasRuntime + CanClearReceivePackets + HasClearInterval, + Relay::Runtime: CanSleep, { async fn run_loop( &self, @@ -84,7 +68,7 @@ where dst_channel_id: &ChannelId, dst_port_id: &PortId, ) { - let runtime = Target::target_chain(self).runtime(); + let runtime = self.runtime(); let clear_interval = self.clear_interval().into(); loop { From 528e03410a08f9cb26ca735f5e8cdc1d1d34887f Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Mon, 31 Jul 2023 10:10:03 +0200 Subject: [PATCH 15/26] Update cargo lock --- Cargo.lock | 105 ++++++++++++++++++++++++++++------------------------- 1 file changed, 56 insertions(+), 49 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b2dcbff0c5..e9edefe79a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -140,7 +140,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -151,7 +151,7 @@ checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -745,6 +745,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "deranged" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8810e7e2cf385b1e9b50d68264908ec367ba642c96d02edfe61c39e88e2a3c01" + [[package]] name = "derivation-path" version = "0.2.0" @@ -966,9 +972,9 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" dependencies = [ "errno-dragonfly", "libc", @@ -1147,7 +1153,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -1567,7 +1573,7 @@ dependencies = [ "serde", "serde_json", "tempfile", - "time 0.3.23", + "time 0.3.24", "tokio", "toml 0.7.6", "tonic", @@ -1709,7 +1715,7 @@ dependencies = [ "tendermint", "tendermint-light-client-verifier", "tendermint-rpc", - "time 0.3.23", + "time 0.3.24", "tokio", "tracing", "tracing-subscriber", @@ -1837,7 +1843,7 @@ dependencies = [ "tendermint-rpc", "tendermint-testgen", "test-log", - "time 0.3.23", + "time 0.3.24", "tracing", "tracing-subscriber", "uint", @@ -2109,9 +2115,9 @@ dependencies = [ [[package]] name = "matchit" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40" +checksum = "67827e6ea8ee8a7c4a72227ef4fc08957040acffdb5f122733b24fa12daff41b" [[package]] name = "maybe-uninit" @@ -2519,7 +2525,7 @@ checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -2816,7 +2822,7 @@ checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.3.3", + "regex-automata 0.3.4", "regex-syntax 0.7.4", ] @@ -2831,9 +2837,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" +checksum = "b7b6d6190b7594385f61bd3911cd1be99dfddcfc365a4160cc2ab5bff4aed294" dependencies = [ "aho-corasick", "memchr", @@ -3051,9 +3057,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.101.1" +version = "0.101.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15f36a6828982f422756984e47912a7a51dcbc2a197aa791158f8ca61cd8204e" +checksum = "513722fd73ad80a71f72b61009ea1b584bcfa1483ca93949c8f290298837fa59" dependencies = [ "ring", "untrusted", @@ -3250,9 +3256,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.175" +version = "1.0.179" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d25439cd7397d044e2748a6fe2432b5e85db703d6d097bd014b3c0ad1ebff0b" +checksum = "0a5bf42b8d227d4abf38a1ddb08602e229108a517cd4e5bb28f9c7eaafdce5c0" dependencies = [ "serde_derive", ] @@ -3278,20 +3284,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.175" +version = "1.0.179" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b23f7ade6f110613c0d63858ddb8b94c1041f550eab58a16b371bdf2c9c80ab4" +checksum = "741e124f5485c7e60c03b043f79f320bff3527f4bbf12cf3831750dc46a0ec2c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] name = "serde_json" -version = "1.0.103" +version = "1.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d03b412469450d4404fe8499a268edd7f8b79fecb074b0d812ad64ca21f4031b" +checksum = "076066c5f1078eac5b722a31827a8832fe108bed65dfa75e233c89f8206e976c" dependencies = [ "itoa", "ryu", @@ -3310,13 +3316,13 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e168eaaf71e8f9bd6037feb05190485708e019f4fd87d161b3c0a0d37daf85e5" +checksum = "8725e1dfadb3a50f7e5ce0b1a540466f6ed3fe7a0fca2ac2b8b831d31316bd00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -3375,7 +3381,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -3566,7 +3572,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -3603,9 +3609,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.27" +version = "2.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" +checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567" dependencies = [ "proc-macro2", "quote", @@ -3676,7 +3682,7 @@ dependencies = [ "subtle", "subtle-encoding", "tendermint-proto", - "time 0.3.23", + "time 0.3.24", "zeroize", ] @@ -3714,7 +3720,7 @@ dependencies = [ "tendermint", "tendermint-light-client-verifier", "tendermint-rpc", - "time 0.3.23", + "time 0.3.24", "tokio", "tracing", ] @@ -3739,7 +3745,7 @@ dependencies = [ "tendermint-light-client", "tendermint-proto", "tendermint-rpc", - "time 0.3.23", + "time 0.3.24", "tracing", ] @@ -3753,7 +3759,7 @@ dependencies = [ "flex-error", "serde", "tendermint", - "time 0.3.23", + "time 0.3.24", ] [[package]] @@ -3771,7 +3777,7 @@ dependencies = [ "serde", "serde_bytes", "subtle-encoding", - "time 0.3.23", + "time 0.3.24", ] [[package]] @@ -3802,7 +3808,7 @@ dependencies = [ "tendermint-config", "tendermint-proto", "thiserror", - "time 0.3.23", + "time 0.3.24", "tokio", "tracing", "url", @@ -3823,7 +3829,7 @@ dependencies = [ "simple-error", "tempfile", "tendermint", - "time 0.3.23", + "time 0.3.24", ] [[package]] @@ -3869,7 +3875,7 @@ checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -3895,10 +3901,11 @@ dependencies = [ [[package]] name = "time" -version = "0.3.23" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59e399c068f43a5d116fedaf73b203fa4f9c519f17e2b34f63221d3792f81446" +checksum = "b79eabcd964882a646b3584543ccabeae7869e9ac32a46f6f22b7a5bd405308b" dependencies = [ + "deranged", "serde", "time-core", "time-macros", @@ -3912,9 +3919,9 @@ checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" [[package]] name = "time-macros" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96ba15a897f3c86766b757e5ac7221554c6750054d74d5b28844fce5fb36a6c4" +checksum = "eb71511c991639bb078fd5bf97757e03914361c48100d52878b8e52b46fb92cd" dependencies = [ "time-core", ] @@ -4000,7 +4007,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -4188,7 +4195,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] [[package]] @@ -4487,7 +4494,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", "wasm-bindgen-shared", ] @@ -4521,7 +4528,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4754,9 +4761,9 @@ checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "winnow" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25b5872fa2e10bd067ae946f927e726d7d603eaeb6e02fa6a350e0722d2b8c11" +checksum = "8bd122eb777186e60c3fdf765a58ac76e41c582f1f535fbf3314434c6b58f3f7" dependencies = [ "memchr", ] @@ -4787,5 +4794,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.28", ] From 92c386ff67c5d0b0ba43b11c80d2055a4bd1cd74 Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Wed, 2 Aug 2023 09:46:35 +0200 Subject: [PATCH 16/26] Fix 'query_unreceived_packet_sequences' and 'query_packet_commitments' for relayer-next --- .../impls/chain/queries/packet_commitments.rs | 6 +++--- .../impls/chain/queries/unreceived_packets.rs | 9 ++++++--- .../src/one_for_all/traits/chain.rs | 11 ++++++---- .../impls/receive_packets_clear.rs | 4 ++-- .../traits/queries/packet_commitments.rs | 2 +- .../traits/queries/unreceived_packets.rs | 13 +++++++----- crates/relayer-cosmos/src/impls/chain.rs | 7 +++++-- .../src/methods/unreceived_packet.rs | 20 +++++++++++-------- .../src/tests/next/packet_clear.rs | 12 +++++------ 9 files changed, 50 insertions(+), 34 deletions(-) diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/packet_commitments.rs b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/packet_commitments.rs index 54b837c6c1..bda71aefb9 100644 --- a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/packet_commitments.rs +++ b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/packet_commitments.rs @@ -17,11 +17,11 @@ where &self, channel_id: &Self::ChannelId, port_id: &Self::PortId, - ) -> Result, Self::Error> { - let sequences = self + ) -> Result<(Vec, Self::Height), Self::Error> { + let (sequences, height) = self .chain .query_packet_commitments(channel_id, port_id) .await?; - Ok(sequences) + Ok((sequences, height)) } } diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs index 969fd86916..7dfaede916 100644 --- a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs +++ b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs @@ -15,12 +15,15 @@ where Chain: OfaIbcChain + OfaChainTypes, Counterparty: OfaIbcChain, { + /// Given a list of counterparty commitment sequences, + /// return a filtered list of sequences which the chain + /// has not received the packet from the counterparty chain. async fn query_unreceived_packet_sequences( &self, channel_id: &Chain::ChannelId, port_id: &Chain::PortId, sequences: &[Counterparty::Sequence], - ) -> Result<(Vec, Chain::Height), Self::Error> { + ) -> Result, Self::Error> { let unreceived_packet_sequences = self .chain .query_unreceived_packet_sequences(channel_id, port_id, sequences) @@ -43,8 +46,8 @@ where port_id: &Self::PortId, counterparty_channel_id: &Counterparty::ChannelId, counterparty_port_id: &Counterparty::PortId, - sequences: &[Counterparty::Sequence], - height: &Counterparty::Height, + sequences: &[Self::Sequence], + height: &Self::Height, ) -> Result, Self::Error> { let unreceived_packet = self .chain diff --git a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs index 65555d9dbf..ca3c612954 100644 --- a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs +++ b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs @@ -336,14 +336,17 @@ where &self, channel_id: &Self::ChannelId, port_id: &Self::PortId, - ) -> Result, Self::Error>; + ) -> Result<(Vec, Self::Height), Self::Error>; + /// Given a list of counterparty commitment sequences, + /// return a filtered list of sequences which the chain + /// has not received the packet from the counterparty chain. async fn query_unreceived_packet_sequences( &self, channel_id: &Self::ChannelId, port_id: &Self::PortId, sequences: &[Counterparty::Sequence], - ) -> Result<(Vec, Self::Height), Self::Error>; + ) -> Result, Self::Error>; async fn query_unreceived_packets( &self, @@ -351,8 +354,8 @@ where port_id: &Self::PortId, counterparty_channel_id: &Counterparty::ChannelId, counterparty_port_id: &Counterparty::PortId, - sequences: &[Counterparty::Sequence], - height: &Counterparty::Height, + sequences: &[Self::Sequence], + height: &Self::Height, ) -> Result, Self::Error>; async fn build_receive_packet_payload( diff --git a/crates/relayer-components-extra/src/packet_clear/impls/receive_packets_clear.rs b/crates/relayer-components-extra/src/packet_clear/impls/receive_packets_clear.rs index cfb0889d88..23f2359f62 100644 --- a/crates/relayer-components-extra/src/packet_clear/impls/receive_packets_clear.rs +++ b/crates/relayer-components-extra/src/packet_clear/impls/receive_packets_clear.rs @@ -31,12 +31,12 @@ where let dst_chain = relay.dst_chain(); let src_chain = relay.src_chain(); - let commitment_sequences = src_chain + let (commitment_sequences, height) = src_chain .query_packet_commitments(src_channel_id, src_port_id) .await .map_err(Relay::src_chain_error)?; - let (unreceived_sequences, height) = dst_chain + let unreceived_sequences = dst_chain .query_unreceived_packet_sequences(dst_channel_id, dst_port_id, &commitment_sequences) .await .map_err(Relay::dst_chain_error)?; diff --git a/crates/relayer-components/src/chain/traits/queries/packet_commitments.rs b/crates/relayer-components/src/chain/traits/queries/packet_commitments.rs index a4c842364c..12f643ebd1 100644 --- a/crates/relayer-components/src/chain/traits/queries/packet_commitments.rs +++ b/crates/relayer-components/src/chain/traits/queries/packet_commitments.rs @@ -14,5 +14,5 @@ where &self, channel_id: &Self::ChannelId, port_id: &Self::PortId, - ) -> Result, Self::Error>; + ) -> Result<(Vec, Self::Height), Self::Error>; } diff --git a/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs b/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs index 13e21fc3da..1545fec800 100644 --- a/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs +++ b/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs @@ -11,12 +11,15 @@ pub trait CanQueryUnreceivedPacketSequences: where Counterparty: HasIbcChainTypes, { + /// Given a list of counterparty commitment sequences, + /// return a filtered list of sequences which the chain + /// has not received the packet from the counterparty chain. async fn query_unreceived_packet_sequences( &self, channel_id: &Self::ChannelId, port_id: &Self::PortId, sequences: &[Counterparty::Sequence], - ) -> Result<(Vec, Self::Height), Self::Error>; + ) -> Result, Self::Error>; } #[async_trait] @@ -31,8 +34,8 @@ where port_id: &Chain::PortId, counterparty_channel_id: &Counterparty::ChannelId, counterparty_port_id: &Counterparty::PortId, - sequences: &[Counterparty::Sequence], - height: &Counterparty::Height, + sequences: &[Chain::Sequence], + height: &Chain::Height, ) -> Result, Chain::Error>; } @@ -48,7 +51,7 @@ where port_id: &Self::PortId, counterparty_channel_id: &Counterparty::ChannelId, counterparty_port_id: &Counterparty::PortId, - sequences: &[Counterparty::Sequence], - height: &Counterparty::Height, + sequences: &[Self::Sequence], + height: &Self::Height, ) -> Result, Self::Error>; } diff --git a/crates/relayer-cosmos/src/impls/chain.rs b/crates/relayer-cosmos/src/impls/chain.rs index 66d41bb4f7..cbc37aa466 100644 --- a/crates/relayer-cosmos/src/impls/chain.rs +++ b/crates/relayer-cosmos/src/impls/chain.rs @@ -547,16 +547,19 @@ where &self, channel_id: &ChannelId, port_id: &PortId, - ) -> Result, Error> { + ) -> Result<(Vec, Height), Error> { query_packet_commitments(self, channel_id, port_id).await } + /// Given a list of counterparty commitment sequences, + /// return a filtered list of sequences which the chain + /// has not received the packet from the counterparty chain. async fn query_unreceived_packet_sequences( &self, channel_id: &ChannelId, port_id: &PortId, sequences: &[Sequence], - ) -> Result<(Vec, Height), Self::Error> { + ) -> Result, Self::Error> { query_unreceived_packet_sequences(self, channel_id, port_id, sequences).await } diff --git a/crates/relayer-cosmos/src/methods/unreceived_packet.rs b/crates/relayer-cosmos/src/methods/unreceived_packet.rs index c77d44038e..c5bfe3bc7d 100644 --- a/crates/relayer-cosmos/src/methods/unreceived_packet.rs +++ b/crates/relayer-cosmos/src/methods/unreceived_packet.rs @@ -22,7 +22,7 @@ pub async fn query_packet_commitments( chain: &CosmosChain, channel_id: &ChannelId, port_id: &PortId, -) -> Result, Error> { +) -> Result<(Vec, Height), Error> { let mut client = ChannelQueryClient::connect(chain.tx_context.tx_context.tx_config.grpc_address.clone()) .await @@ -48,15 +48,23 @@ pub async fn query_packet_commitments( .map(|packet_state| packet_state.sequence.into()) .collect(); - Ok(commitment_sequences) + let raw_height = response + .height + .ok_or_else(|| BaseError::missing_height("query_packet_commitments".to_owned()))?; + let height = raw_height.try_into().map_err(BaseError::ics02)?; + + Ok((commitment_sequences, height)) } +/// Given a list of counterparty commitment sequences, +/// return a filtered list of sequences which the chain +/// has not received the packet from the counterparty chain. pub async fn query_unreceived_packet_sequences( chain: &CosmosChain, channel_id: &ChannelId, port_id: &PortId, sequences: &[Sequence], -) -> Result<(Vec, Height), Error> { +) -> Result, Error> { let mut client = ChannelQueryClient::connect(chain.tx_context.tx_context.tx_config.grpc_address.clone()) .await @@ -76,12 +84,8 @@ pub async fn query_unreceived_packet_sequences( .map_err(|e| BaseError::grpc_status(e, "unreceived_packets".to_owned()))? .into_inner(); - let raw_height = response - .height - .ok_or_else(|| BaseError::missing_height("query_unreceived_packets".to_owned()))?; - let height = raw_height.try_into().map_err(BaseError::ics02)?; let response_sequences = response.sequences.into_iter().map(|s| s.into()).collect(); - Ok((response_sequences, height)) + Ok(response_sequences) } pub async fn query_unreceived_packets( diff --git a/tools/integration-test/src/tests/next/packet_clear.rs b/tools/integration-test/src/tests/next/packet_clear.rs index 34cd0ca34c..a035a2e061 100644 --- a/tools/integration-test/src/tests/next/packet_clear.rs +++ b/tools/integration-test/src/tests/next/packet_clear.rs @@ -78,7 +78,7 @@ impl BinaryChannelTest for IbcClearPacketTest { runtime.block_on(async { info!("Assert query packet commitments works as expected"); - let src_commitments: Vec = + let (src_commitments, src_height): (Vec, Height) = CanQueryPacketCommitments::query_packet_commitments( relay_context.relay_a_to_b().src_chain(), channel.channel_id_a.value(), @@ -89,7 +89,7 @@ impl BinaryChannelTest for IbcClearPacketTest { assert_eq!(src_commitments, vec!(Sequence::from(1))); - let dst_commitments: Vec = + let (dst_commitments, dst_height): (Vec, Height) = CanQueryPacketCommitments::query_packet_commitments( relay_context.relay_a_to_b().dst_chain(), channel.channel_id_b.value(), @@ -102,7 +102,7 @@ impl BinaryChannelTest for IbcClearPacketTest { info!("Assert query unreceived packet sequences works as expected"); - let (unreceived_packet_sequences, height): (Vec, Height) = + let unreceived_packet_sequences: Vec = CanQueryUnreceivedPacketSequences::query_unreceived_packet_sequences( relay_context.relay_a_to_b().src_chain(), channel.channel_id_a.value(), @@ -114,7 +114,7 @@ impl BinaryChannelTest for IbcClearPacketTest { assert_eq!(unreceived_packet_sequences, vec!(Sequence::from(1))); - let (unreceived_packet_sequences, _): (Vec, Height) = + let unreceived_packet_sequences: Vec = CanQueryUnreceivedPacketSequences::query_unreceived_packet_sequences( relay_context.relay_a_to_b().dst_chain(), channel.channel_id_b.value(), @@ -135,7 +135,7 @@ impl BinaryChannelTest for IbcClearPacketTest { channel.channel_id_b.value(), channel.port_b.value(), &unreceived_packet_sequences, - &height, + &src_height, ) .await .unwrap(); @@ -149,7 +149,7 @@ impl BinaryChannelTest for IbcClearPacketTest { channel.channel_id_a.value(), channel.port_a.value(), &unreceived_packet_sequences, - &height, + &dst_height, ) .await .unwrap(); From 132ae5d017275e9d40f921b77453a23ee0a622bd Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Wed, 2 Aug 2023 09:49:34 +0200 Subject: [PATCH 17/26] Add documentation to 'query_packet_commitments' --- .../src/one_for_all/impls/chain/queries/packet_commitments.rs | 4 ++++ crates/relayer-all-in-one/src/one_for_all/traits/chain.rs | 4 ++++ .../src/chain/traits/queries/packet_commitments.rs | 4 ++++ crates/relayer-cosmos/src/impls/chain.rs | 4 ++++ 4 files changed, 16 insertions(+) diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/packet_commitments.rs b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/packet_commitments.rs index bda71aefb9..aa58391a58 100644 --- a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/packet_commitments.rs +++ b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/packet_commitments.rs @@ -13,6 +13,10 @@ where Chain: OfaIbcChain, Counterparty: OfaIbcChain, { + /// Query the sequences of the packets that the chain has committed to be + /// sent to the counterparty chain, of which the full packet relaying is not + /// yet completed. Once the chain receives the ack from the counterparty + /// chain, a given sequence should be removed from the packet commitment list. async fn query_packet_commitments( &self, channel_id: &Self::ChannelId, diff --git a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs index ca3c612954..e10d1222ff 100644 --- a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs +++ b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs @@ -332,6 +332,10 @@ where sequence: &Counterparty::Sequence, ) -> Result; + /// Query the sequences of the packets that the chain has committed to be + /// sent to the counterparty chain, of which the full packet relaying is not + /// yet completed. Once the chain receives the ack from the counterparty + /// chain, a given sequence should be removed from the packet commitment list. async fn query_packet_commitments( &self, channel_id: &Self::ChannelId, diff --git a/crates/relayer-components/src/chain/traits/queries/packet_commitments.rs b/crates/relayer-components/src/chain/traits/queries/packet_commitments.rs index 12f643ebd1..3e17bccf1e 100644 --- a/crates/relayer-components/src/chain/traits/queries/packet_commitments.rs +++ b/crates/relayer-components/src/chain/traits/queries/packet_commitments.rs @@ -10,6 +10,10 @@ pub trait CanQueryPacketCommitments: where Counterparty: HasIbcChainTypes, { + /// Query the sequences of the packets that the chain has committed to be + /// sent to the counterparty chain, of which the full packet relaying is not + /// yet completed. Once the chain receives the ack from the counterparty + /// chain, a given sequence should be removed from the packet commitment list. async fn query_packet_commitments( &self, channel_id: &Self::ChannelId, diff --git a/crates/relayer-cosmos/src/impls/chain.rs b/crates/relayer-cosmos/src/impls/chain.rs index cbc37aa466..4946cef2ef 100644 --- a/crates/relayer-cosmos/src/impls/chain.rs +++ b/crates/relayer-cosmos/src/impls/chain.rs @@ -543,6 +543,10 @@ where query_is_packet_received(self, port_id, channel_id, sequence).await } + /// Query the sequences of the packets that the chain has committed to be + /// sent to the counterparty chain, of which the full packet relaying is not + /// yet completed. Once the chain receives the ack from the counterparty + /// chain, a given sequence should be removed from the packet commitment list. async fn query_packet_commitments( &self, channel_id: &ChannelId, From 11da2e4f25c3da2027d05395969c7ccef913b422 Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Wed, 2 Aug 2023 11:10:07 +0200 Subject: [PATCH 18/26] Rename 'CanQueryUnreceivedPackets' to 'CanQuerySendPacketsFromSequences' --- crates/relayer-all-in-one/src/all_for_one/chain.rs | 6 +++--- .../one_for_all/impls/chain/queries/unreceived_packets.rs | 6 ++++-- crates/relayer-all-in-one/src/one_for_all/traits/chain.rs | 2 ++ .../src/packet_clear/impls/receive_packets_clear.rs | 6 +++--- .../src/chain/traits/queries/unreceived_packets.rs | 8 ++++++-- crates/relayer-cosmos/src/impls/chain.rs | 2 ++ crates/relayer-cosmos/src/methods/unreceived_packet.rs | 2 ++ tools/integration-test/src/tests/next/packet_clear.rs | 6 +++--- 8 files changed, 25 insertions(+), 13 deletions(-) diff --git a/crates/relayer-all-in-one/src/all_for_one/chain.rs b/crates/relayer-all-in-one/src/all_for_one/chain.rs index ed412a92e8..6e1a19fe09 100644 --- a/crates/relayer-all-in-one/src/all_for_one/chain.rs +++ b/crates/relayer-all-in-one/src/all_for_one/chain.rs @@ -4,7 +4,7 @@ use ibc_relayer_components::chain::traits::queries::packet_commitments::CanQuery use ibc_relayer_components::chain::traits::queries::received_packet::CanQueryReceivedPacket; use ibc_relayer_components::chain::traits::queries::status::CanQueryChainStatus; use ibc_relayer_components::chain::traits::queries::unreceived_packets::{ - CanQueryUnreceivedPacketSequences, CanQueryUnreceivedPackets, + CanQuerySendPacketsFromSequences, CanQueryUnreceivedPacketSequences, }; use ibc_relayer_components::chain::traits::types::chain::HasChainTypes; use ibc_relayer_components::chain::traits::types::channel::{ @@ -35,7 +35,7 @@ pub trait AfoChain: + CanQueryReceivedPacket + CanQueryPacketCommitments + CanQueryUnreceivedPacketSequences - + CanQueryUnreceivedPackets + + CanQuerySendPacketsFromSequences + HasCreateClientOptions + HasInitConnectionOptionsType + HasConnectionHandshakePayloads @@ -74,7 +74,7 @@ where + CanQueryReceivedPacket + CanQueryPacketCommitments + CanQueryUnreceivedPacketSequences - + CanQueryUnreceivedPackets + + CanQuerySendPacketsFromSequences + HasCreateClientOptions + HasInitConnectionOptionsType + HasConnectionHandshakePayloads diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs index 7dfaede916..2585faf95d 100644 --- a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs +++ b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs @@ -1,7 +1,7 @@ use async_trait::async_trait; use ibc_relayer_components::chain::traits::queries::unreceived_packets::{ - CanQueryUnreceivedPacketSequences, CanQueryUnreceivedPackets, + CanQuerySendPacketsFromSequences, CanQueryUnreceivedPacketSequences, }; use crate::one_for_all::traits::chain::{OfaChainTypes, OfaIbcChain}; @@ -34,12 +34,14 @@ where } #[async_trait] -impl CanQueryUnreceivedPackets> +impl CanQuerySendPacketsFromSequences> for OfaChainWrapper where Chain: OfaIbcChain + OfaChainTypes, Counterparty: OfaIbcChain, { + /// Given a list of sequences, a channel and port will query a list of outgoing + /// packets which have not been relayed. async fn query_unreceived_packets( &self, channel_id: &Self::ChannelId, diff --git a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs index e10d1222ff..f862688c84 100644 --- a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs +++ b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs @@ -352,6 +352,8 @@ where sequences: &[Counterparty::Sequence], ) -> Result, Self::Error>; + /// Given a list of sequences, a channel and port will query a list of outgoing + /// packets which have not been relayed. async fn query_unreceived_packets( &self, channel_id: &Self::ChannelId, diff --git a/crates/relayer-components-extra/src/packet_clear/impls/receive_packets_clear.rs b/crates/relayer-components-extra/src/packet_clear/impls/receive_packets_clear.rs index 23f2359f62..ff4d3cedbf 100644 --- a/crates/relayer-components-extra/src/packet_clear/impls/receive_packets_clear.rs +++ b/crates/relayer-components-extra/src/packet_clear/impls/receive_packets_clear.rs @@ -2,7 +2,7 @@ use async_trait::async_trait; use futures_util::{stream, StreamExt}; use ibc_relayer_components::chain::traits::queries::packet_commitments::CanQueryPacketCommitments; use ibc_relayer_components::chain::traits::queries::unreceived_packets::{ - CanQueryUnreceivedPacketSequences, CanQueryUnreceivedPackets, + CanQuerySendPacketsFromSequences, CanQueryUnreceivedPacketSequences, }; use ibc_relayer_components::chain::types::aliases::{ChannelId, PortId}; use ibc_relayer_components::relay::traits::packet::HasRelayPacket; @@ -18,8 +18,8 @@ impl ReceivePacketClearer for ReceivePacketClearRelayer where Relay: HasRelayPacket + CanRelayPacket, Relay::DstChain: CanQueryUnreceivedPacketSequences, - Relay::SrcChain: - CanQueryPacketCommitments + CanQueryUnreceivedPackets, + Relay::SrcChain: CanQueryPacketCommitments + + CanQuerySendPacketsFromSequences, { async fn clear_receive_packets( relay: &Relay, diff --git a/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs b/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs index 1545fec800..c9cfc104bf 100644 --- a/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs +++ b/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs @@ -23,11 +23,13 @@ where } #[async_trait] -pub trait UnreceivedPacketsQuerier +pub trait SendPacketsFromSequencesQuerier where Chain: HasIbcChainTypes + HasIbcPacketTypes + HasErrorType, Counterparty: HasIbcChainTypes, { + /// Given a list of sequences, a channel and port will query a list of outgoing + /// packets which have not been relayed. async fn query_unreceived_packets( &self, channel_id: &Chain::ChannelId, @@ -40,11 +42,13 @@ where } #[async_trait] -pub trait CanQueryUnreceivedPackets: +pub trait CanQuerySendPacketsFromSequences: HasIbcChainTypes + HasIbcPacketTypes + HasErrorType where Counterparty: HasIbcChainTypes, { + /// Given a list of sequences, a channel and port will query a list of outgoing + /// packets which have not been relayed. async fn query_unreceived_packets( &self, channel_id: &Self::ChannelId, diff --git a/crates/relayer-cosmos/src/impls/chain.rs b/crates/relayer-cosmos/src/impls/chain.rs index 4946cef2ef..0f859c290b 100644 --- a/crates/relayer-cosmos/src/impls/chain.rs +++ b/crates/relayer-cosmos/src/impls/chain.rs @@ -567,6 +567,8 @@ where query_unreceived_packet_sequences(self, channel_id, port_id, sequences).await } + /// Given a list of sequences, a channel and port will query a list of outgoing + /// packets which have not been relayed. async fn query_unreceived_packets( &self, channel_id: &ChannelId, diff --git a/crates/relayer-cosmos/src/methods/unreceived_packet.rs b/crates/relayer-cosmos/src/methods/unreceived_packet.rs index c5bfe3bc7d..33ab8b5bde 100644 --- a/crates/relayer-cosmos/src/methods/unreceived_packet.rs +++ b/crates/relayer-cosmos/src/methods/unreceived_packet.rs @@ -88,6 +88,8 @@ pub async fn query_unreceived_packet_sequences( Ok(response_sequences) } +/// Given a list of sequences, a channel and port will query a list of outgoing +/// packets which have not been relayed. pub async fn query_unreceived_packets( chain: &CosmosChain, channel_id: &ChannelId, diff --git a/tools/integration-test/src/tests/next/packet_clear.rs b/tools/integration-test/src/tests/next/packet_clear.rs index a035a2e061..f8a0382bd1 100644 --- a/tools/integration-test/src/tests/next/packet_clear.rs +++ b/tools/integration-test/src/tests/next/packet_clear.rs @@ -1,7 +1,7 @@ use ibc_relayer::config::PacketFilter; use ibc_relayer_components::chain::traits::queries::packet_commitments::CanQueryPacketCommitments; use ibc_relayer_components::chain::traits::queries::unreceived_packets::{ - CanQueryUnreceivedPacketSequences, CanQueryUnreceivedPackets, + CanQuerySendPacketsFromSequences, CanQueryUnreceivedPacketSequences, }; use ibc_relayer_components::relay::traits::chains::HasRelayChains; use ibc_relayer_components::relay::traits::two_way::HasTwoWayRelay; @@ -128,7 +128,7 @@ impl BinaryChannelTest for IbcClearPacketTest { info!("Assert query unreceived packets works as expected"); - let unreceived_packets = CanQueryUnreceivedPackets::query_unreceived_packets( + let unreceived_packets = CanQuerySendPacketsFromSequences::query_unreceived_packets( relay_context.relay_a_to_b().src_chain(), channel.channel_id_a.value(), channel.port_a.value(), @@ -142,7 +142,7 @@ impl BinaryChannelTest for IbcClearPacketTest { assert_eq!(unreceived_packets.len(), 1); - let unreceived_packets = CanQueryUnreceivedPackets::query_unreceived_packets( + let unreceived_packets = CanQuerySendPacketsFromSequences::query_unreceived_packets( relay_context.relay_a_to_b().dst_chain(), channel.channel_id_b.value(), channel.port_b.value(), From 495bffb8b2657adedecc163142a67552d091c7e7 Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Wed, 2 Aug 2023 11:17:16 +0200 Subject: [PATCH 19/26] Add documentation for 'height' used in 'query_unreceived_packets' --- .../one_for_all/impls/chain/queries/unreceived_packets.rs | 3 +++ crates/relayer-all-in-one/src/one_for_all/traits/chain.rs | 3 +++ .../src/chain/traits/queries/unreceived_packets.rs | 6 ++++++ crates/relayer-cosmos/src/impls/chain.rs | 3 +++ 4 files changed, 15 insertions(+) diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs index 2585faf95d..651fcac81f 100644 --- a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs +++ b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs @@ -49,6 +49,9 @@ where counterparty_channel_id: &Counterparty::ChannelId, counterparty_port_id: &Counterparty::PortId, sequences: &[Self::Sequence], + // The height is given to query the packets from a specific height. + // This height should be the same as the query height from the + // `CanQueryPacketCommitments` made on the same chain. height: &Self::Height, ) -> Result, Self::Error> { let unreceived_packet = self diff --git a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs index f862688c84..613daa714a 100644 --- a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs +++ b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs @@ -361,6 +361,9 @@ where counterparty_channel_id: &Counterparty::ChannelId, counterparty_port_id: &Counterparty::PortId, sequences: &[Self::Sequence], + // The height is given to query the packets from a specific height. + // This height should be the same as the query height from the + // `CanQueryPacketCommitments` made on the same chain. height: &Self::Height, ) -> Result, Self::Error>; diff --git a/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs b/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs index c9cfc104bf..a2bf4ecd9d 100644 --- a/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs +++ b/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs @@ -37,6 +37,9 @@ where counterparty_channel_id: &Counterparty::ChannelId, counterparty_port_id: &Counterparty::PortId, sequences: &[Chain::Sequence], + // The height is given to query the packets from a specific height. + // This height should be the same as the query height from the + // `CanQueryPacketCommitments` made on the same chain. height: &Chain::Height, ) -> Result, Chain::Error>; } @@ -56,6 +59,9 @@ where counterparty_channel_id: &Counterparty::ChannelId, counterparty_port_id: &Counterparty::PortId, sequences: &[Self::Sequence], + // The height is given to query the packets from a specific height. + // This height should be the same as the query height from the + // `CanQueryPacketCommitments` made on the same chain. height: &Self::Height, ) -> Result, Self::Error>; } diff --git a/crates/relayer-cosmos/src/impls/chain.rs b/crates/relayer-cosmos/src/impls/chain.rs index 0f859c290b..c5e5612987 100644 --- a/crates/relayer-cosmos/src/impls/chain.rs +++ b/crates/relayer-cosmos/src/impls/chain.rs @@ -576,6 +576,9 @@ where counterparty_channel_id: &ChannelId, counterparty_port_id: &PortId, sequences: &[Sequence], + // The height is given to query the packets from a specific height. + // This height should be the same as the query height from the + // `CanQueryPacketCommitments` made on the same chain. height: &Height, ) -> Result, Self::Error> { query_unreceived_packets( From e0b57276ffac462d71f87fe62aa5d397711560d6 Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Wed, 2 Aug 2023 12:21:00 +0200 Subject: [PATCH 20/26] Clean 'packet_clear' test for relayer-next --- .../src/tests/next/packet_clear.rs | 81 +++++++++---------- 1 file changed, 37 insertions(+), 44 deletions(-) diff --git a/tools/integration-test/src/tests/next/packet_clear.rs b/tools/integration-test/src/tests/next/packet_clear.rs index f8a0382bd1..9479a9c892 100644 --- a/tools/integration-test/src/tests/next/packet_clear.rs +++ b/tools/integration-test/src/tests/next/packet_clear.rs @@ -39,6 +39,11 @@ impl BinaryChannelTest for IbcClearPacketTest { let relay_context = build_cosmos_relay_context(&relayer.config, chains, pf)?; + let relay_a_to_b = relay_context.relay_a_to_b(); + let relay_b_to_a = relay_context.relay_b_to_a(); + let chain_a = relay_a_to_b.src_chain(); + let chain_b = relay_a_to_b.dst_chain(); + let runtime = chains.node_a.value().chain_driver.runtime.as_ref(); let denom_a = chains.node_a.denom(); @@ -78,23 +83,15 @@ impl BinaryChannelTest for IbcClearPacketTest { runtime.block_on(async { info!("Assert query packet commitments works as expected"); - let (src_commitments, src_height): (Vec, Height) = - CanQueryPacketCommitments::query_packet_commitments( - relay_context.relay_a_to_b().src_chain(), - channel.channel_id_a.value(), - channel.port_a.value(), - ) + let (src_commitments, src_height): (Vec, Height) = chain_a + .query_packet_commitments(channel.channel_id_a.value(), channel.port_a.value()) .await .unwrap(); assert_eq!(src_commitments, vec!(Sequence::from(1))); - let (dst_commitments, dst_height): (Vec, Height) = - CanQueryPacketCommitments::query_packet_commitments( - relay_context.relay_a_to_b().dst_chain(), - channel.channel_id_b.value(), - channel.port_b.value(), - ) + let (dst_commitments, dst_height): (Vec, Height) = chain_b + .query_packet_commitments(channel.channel_id_b.value(), channel.port_b.value()) .await .unwrap(); @@ -102,9 +99,8 @@ impl BinaryChannelTest for IbcClearPacketTest { info!("Assert query unreceived packet sequences works as expected"); - let unreceived_packet_sequences: Vec = - CanQueryUnreceivedPacketSequences::query_unreceived_packet_sequences( - relay_context.relay_a_to_b().src_chain(), + let unreceived_packet_sequences: Vec = chain_a + .query_unreceived_packet_sequences( channel.channel_id_a.value(), channel.port_a.value(), &src_commitments, @@ -114,9 +110,8 @@ impl BinaryChannelTest for IbcClearPacketTest { assert_eq!(unreceived_packet_sequences, vec!(Sequence::from(1))); - let unreceived_packet_sequences: Vec = - CanQueryUnreceivedPacketSequences::query_unreceived_packet_sequences( - relay_context.relay_a_to_b().dst_chain(), + let unreceived_packet_sequences: Vec = chain_b + .query_unreceived_packet_sequences( channel.channel_id_b.value(), channel.port_b.value(), &src_commitments, @@ -128,36 +123,35 @@ impl BinaryChannelTest for IbcClearPacketTest { info!("Assert query unreceived packets works as expected"); - let unreceived_packets = CanQuerySendPacketsFromSequences::query_unreceived_packets( - relay_context.relay_a_to_b().src_chain(), - channel.channel_id_a.value(), - channel.port_a.value(), - channel.channel_id_b.value(), - channel.port_b.value(), - &unreceived_packet_sequences, - &src_height, - ) - .await - .unwrap(); + let unreceived_packets = chain_a + .query_unreceived_packets( + channel.channel_id_a.value(), + channel.port_a.value(), + channel.channel_id_b.value(), + channel.port_b.value(), + &unreceived_packet_sequences, + &src_height, + ) + .await + .unwrap(); assert_eq!(unreceived_packets.len(), 1); - let unreceived_packets = CanQuerySendPacketsFromSequences::query_unreceived_packets( - relay_context.relay_a_to_b().dst_chain(), - channel.channel_id_b.value(), - channel.port_b.value(), - channel.channel_id_a.value(), - channel.port_a.value(), - &unreceived_packet_sequences, - &dst_height, - ) - .await - .unwrap(); + let unreceived_packets = chain_b + .query_unreceived_packets( + channel.channel_id_b.value(), + channel.port_b.value(), + channel.channel_id_a.value(), + channel.port_a.value(), + &unreceived_packet_sequences, + &dst_height, + ) + .await + .unwrap(); assert_eq!(unreceived_packets.len(), 0); - let _ = relay_context - .relay_b_to_a() + let _ = relay_b_to_a .clear_receive_packets( channel.channel_id_a.value(), channel.port_a.value(), @@ -187,8 +181,7 @@ impl BinaryChannelTest for IbcClearPacketTest { assert_eq!(amount.value().amount, denom_b.with_amount(0u64).amount()); - let _ = relay_context - .relay_a_to_b() + let _ = relay_a_to_b .clear_receive_packets( cloned_channel.channel_id_a.value(), cloned_channel.port_a.value(), From 2f4e771c9d6f39100c29b3be2730fef5ab2a16e7 Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Thu, 3 Aug 2023 15:52:52 +0200 Subject: [PATCH 21/26] Split CanQuerySendPacketsFromSequences into two traits --- .../impls/chain/queries/unreceived_packets.rs | 8 +- .../src/one_for_all/traits/chain.rs | 2 +- .../impls/receive_packets_clear.rs | 6 +- .../traits/queries/unreceived_packets.rs | 24 +++--- crates/relayer-cosmos/src/impls/chain.rs | 6 +- .../src/methods/unreceived_packet.rs | 86 +++++++++++++------ crates/relayer-cosmos/src/types/error.rs | 3 + .../src/tests/next/packet_clear.rs | 18 ++-- 8 files changed, 96 insertions(+), 57 deletions(-) diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs index 651fcac81f..149de55fc7 100644 --- a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs +++ b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs @@ -42,7 +42,7 @@ where { /// Given a list of sequences, a channel and port will query a list of outgoing /// packets which have not been relayed. - async fn query_unreceived_packets( + async fn query_send_packets_from_sequences( &self, channel_id: &Self::ChannelId, port_id: &Self::PortId, @@ -54,9 +54,9 @@ where // `CanQueryPacketCommitments` made on the same chain. height: &Self::Height, ) -> Result, Self::Error> { - let unreceived_packet = self + let send_packets = self .chain - .query_unreceived_packets( + .query_send_packets_from_sequences( channel_id, port_id, counterparty_channel_id, @@ -65,6 +65,6 @@ where height, ) .await?; - Ok(unreceived_packet) + Ok(send_packets) } } diff --git a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs index 613daa714a..3a913f48f8 100644 --- a/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs +++ b/crates/relayer-all-in-one/src/one_for_all/traits/chain.rs @@ -354,7 +354,7 @@ where /// Given a list of sequences, a channel and port will query a list of outgoing /// packets which have not been relayed. - async fn query_unreceived_packets( + async fn query_send_packets_from_sequences( &self, channel_id: &Self::ChannelId, port_id: &Self::PortId, diff --git a/crates/relayer-components-extra/src/packet_clear/impls/receive_packets_clear.rs b/crates/relayer-components-extra/src/packet_clear/impls/receive_packets_clear.rs index ff4d3cedbf..62b2627e33 100644 --- a/crates/relayer-components-extra/src/packet_clear/impls/receive_packets_clear.rs +++ b/crates/relayer-components-extra/src/packet_clear/impls/receive_packets_clear.rs @@ -41,8 +41,8 @@ where .await .map_err(Relay::dst_chain_error)?; - let unreceived_packets = src_chain - .query_unreceived_packets( + let send_packets = src_chain + .query_send_packets_from_sequences( src_channel_id, src_port_id, dst_channel_id, @@ -53,7 +53,7 @@ where .await .map_err(Relay::src_chain_error)?; - stream::iter(unreceived_packets) + stream::iter(send_packets) .for_each_concurrent(None, |t| async move { // Ignore any relaying errors, as the relayer still needs to proceed // relaying the next event regardless. diff --git a/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs b/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs index a2bf4ecd9d..33bc5d3c8b 100644 --- a/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs +++ b/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs @@ -23,25 +23,25 @@ where } #[async_trait] -pub trait SendPacketsFromSequencesQuerier +pub trait CanQuerySendPacketFromSequence: + HasIbcChainTypes + HasIbcPacketTypes + HasErrorType where - Chain: HasIbcChainTypes + HasIbcPacketTypes + HasErrorType, - Counterparty: HasIbcChainTypes, + Counterparty: HasIbcChainTypes, { - /// Given a list of sequences, a channel and port will query a list of outgoing - /// packets which have not been relayed. - async fn query_unreceived_packets( + /// Given a single sequence, a channel and port will query the outgoing + /// packets if it hasn't been relayed. + async fn query_send_packet_from_sequence( &self, - channel_id: &Chain::ChannelId, - port_id: &Chain::PortId, + channel_id: &Self::ChannelId, + port_id: &Self::PortId, counterparty_channel_id: &Counterparty::ChannelId, counterparty_port_id: &Counterparty::PortId, - sequences: &[Chain::Sequence], + sequence: &Self::Sequence, // The height is given to query the packets from a specific height. // This height should be the same as the query height from the // `CanQueryPacketCommitments` made on the same chain. - height: &Chain::Height, - ) -> Result, Chain::Error>; + height: &Self::Height, + ) -> Result; } #[async_trait] @@ -52,7 +52,7 @@ where { /// Given a list of sequences, a channel and port will query a list of outgoing /// packets which have not been relayed. - async fn query_unreceived_packets( + async fn query_send_packets_from_sequences( &self, channel_id: &Self::ChannelId, port_id: &Self::PortId, diff --git a/crates/relayer-cosmos/src/impls/chain.rs b/crates/relayer-cosmos/src/impls/chain.rs index c5e5612987..2387b5b08d 100644 --- a/crates/relayer-cosmos/src/impls/chain.rs +++ b/crates/relayer-cosmos/src/impls/chain.rs @@ -60,7 +60,7 @@ use crate::methods::packet::{ query_write_acknowledgement_event, }; use crate::methods::unreceived_packet::{ - query_packet_commitments, query_unreceived_packet_sequences, query_unreceived_packets, + query_packet_commitments, query_send_packets_from_sequences, query_unreceived_packet_sequences, }; use crate::methods::update_client::{build_update_client_message, build_update_client_payload}; use crate::traits::message::CosmosMessage; @@ -569,7 +569,7 @@ where /// Given a list of sequences, a channel and port will query a list of outgoing /// packets which have not been relayed. - async fn query_unreceived_packets( + async fn query_send_packets_from_sequences( &self, channel_id: &ChannelId, port_id: &PortId, @@ -581,7 +581,7 @@ where // `CanQueryPacketCommitments` made on the same chain. height: &Height, ) -> Result, Self::Error> { - query_unreceived_packets( + query_send_packets_from_sequences( self, channel_id, port_id, diff --git a/crates/relayer-cosmos/src/methods/unreceived_packet.rs b/crates/relayer-cosmos/src/methods/unreceived_packet.rs index 33ab8b5bde..e28df55013 100644 --- a/crates/relayer-cosmos/src/methods/unreceived_packet.rs +++ b/crates/relayer-cosmos/src/methods/unreceived_packet.rs @@ -1,4 +1,7 @@ use alloc::sync::Arc; +use futures::stream::{self, StreamExt, TryStreamExt}; +use tonic::Request; + use ibc_proto::ibc::core::channel::v1::query_client::QueryClient as ChannelQueryClient; use ibc_relayer::chain::cosmos::query::packet_query; use ibc_relayer::chain::handle::ChainHandle; @@ -13,7 +16,6 @@ use ibc_relayer_types::core::ics24_host::identifier::{ChannelId, PortId}; use ibc_relayer_types::events::WithBlockDataType; use ibc_relayer_types::Height; use tendermint_rpc::{Client, Order}; -use tonic::Request; use crate::contexts::chain::CosmosChain; use crate::types::error::{BaseError, Error}; @@ -88,17 +90,17 @@ pub async fn query_unreceived_packet_sequences( Ok(response_sequences) } -/// Given a list of sequences, a channel and port will query a list of outgoing -/// packets which have not been relayed. -pub async fn query_unreceived_packets( +/// Given a single sequence, a channel and port will query the outgoing +/// packets if it hasn't been relayed. +async fn query_send_packet_from_sequence( chain: &CosmosChain, channel_id: &ChannelId, port_id: &PortId, counterparty_channel_id: &ChannelId, counterparty_port_id: &PortId, - sequences: &[Sequence], + sequence: &Sequence, height: &Height, -) -> Result, Error> { +) -> Result { // The unreceived packet are queried from the source chain, so the destination // channel id and port id are the counterparty channel id and counterparty port id. let request = QueryPacketEventDataRequest { @@ -107,31 +109,30 @@ pub async fn query_unreceived_packets( source_port_id: port_id.clone(), destination_channel_id: counterparty_channel_id.clone(), destination_port_id: counterparty_port_id.clone(), - sequences: sequences.to_vec(), + sequences: vec![*sequence], height: Qualified::SmallerEqual(QueryHeight::Specific(*height)), }; let mut events = vec![]; - for sequence in sequences.iter() { - let query = packet_query(&request, *sequence); - let response = chain - .tx_context - .tx_context - .rpc_client - .tx_search(query, false, 1, 10, Order::Descending) - .await - .unwrap(); - for tx in response.txs.iter() { - let mut event = tx - .tx_result - .events - .iter() - .map(|event| Arc::new(event.clone())) - .collect(); - events.append(&mut event); - } + let query = packet_query(&request, *sequence); + let response = chain + .tx_context + .tx_context + .rpc_client + .tx_search(query, false, 1, 10, Order::Descending) + .await + .map_err(BaseError::tendermint_rpc)?; + + for tx in response.txs.iter() { + let mut event = tx + .tx_result + .events + .iter() + .map(|event| Arc::new(event.clone())) + .collect(); + events.append(&mut event); } - let send_packets = events + let send_packets: Vec = events .iter() .filter_map( as OfaChain>::try_extract_send_packet_event) .map(|event| { @@ -139,5 +140,38 @@ pub async fn query_unreceived_packets( }) .collect(); + let send_packet = send_packets + .first() + .ok_or_else(BaseError::missing_send_packet)?; + + Ok(send_packet.clone()) +} + +/// Given a list of sequences, a channel and port will query a list of outgoing +/// packets which have not been relayed. +pub async fn query_send_packets_from_sequences( + chain: &CosmosChain, + channel_id: &ChannelId, + port_id: &PortId, + counterparty_channel_id: &ChannelId, + counterparty_port_id: &PortId, + sequences: &[Sequence], + height: &Height, +) -> Result, Error> { + let send_packets = stream::iter(sequences) + .then(|sequence| { + query_send_packet_from_sequence( + chain, + channel_id, + port_id, + counterparty_channel_id, + counterparty_port_id, + sequence, + height, + ) + }) + .try_collect::>() + .await?; + Ok(send_packets) } diff --git a/crates/relayer-cosmos/src/types/error.rs b/crates/relayer-cosmos/src/types/error.rs index 5bc4ab7181..e9108195ff 100644 --- a/crates/relayer-cosmos/src/types/error.rs +++ b/crates/relayer-cosmos/src/types/error.rs @@ -72,6 +72,9 @@ define_error! { MissingSimulateGasInfo | _ | { "missing gas info returned from send_tx_simulate" }, + MissingSendPacket + | _ | { "missing send packet" }, + CheckTx { response: Response } | e | { format_args!("check tx error: {:?}", e.response) }, diff --git a/tools/integration-test/src/tests/next/packet_clear.rs b/tools/integration-test/src/tests/next/packet_clear.rs index 9479a9c892..ab2286af10 100644 --- a/tools/integration-test/src/tests/next/packet_clear.rs +++ b/tools/integration-test/src/tests/next/packet_clear.rs @@ -123,8 +123,8 @@ impl BinaryChannelTest for IbcClearPacketTest { info!("Assert query unreceived packets works as expected"); - let unreceived_packets = chain_a - .query_unreceived_packets( + let send_packets = chain_a + .query_send_packets_from_sequences( channel.channel_id_a.value(), channel.port_a.value(), channel.channel_id_b.value(), @@ -135,10 +135,10 @@ impl BinaryChannelTest for IbcClearPacketTest { .await .unwrap(); - assert_eq!(unreceived_packets.len(), 1); + assert_eq!(send_packets.len(), 1); - let unreceived_packets = chain_b - .query_unreceived_packets( + let send_packets = chain_b + .query_send_packets_from_sequences( channel.channel_id_b.value(), channel.port_b.value(), channel.channel_id_a.value(), @@ -146,10 +146,12 @@ impl BinaryChannelTest for IbcClearPacketTest { &unreceived_packet_sequences, &dst_height, ) - .await - .unwrap(); + .await; - assert_eq!(unreceived_packets.len(), 0); + assert!( + send_packets.is_err(), + "There should be no send packets from Chain B" + ); let _ = relay_b_to_a .clear_receive_packets( From 41ce78e65dbf7f4c05b0b8c3db2da81899fb124b Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Fri, 4 Aug 2023 10:07:08 +0200 Subject: [PATCH 22/26] Add 'try_extract_send_packet_event' to relayer-cosmos methods module --- crates/relayer-cosmos/src/impls/chain.rs | 13 ++---------- crates/relayer-cosmos/src/methods/event.rs | 21 +++++++++++++++++++ crates/relayer-cosmos/src/methods/mod.rs | 1 + .../src/methods/unreceived_packet.rs | 3 ++- 4 files changed, 26 insertions(+), 12 deletions(-) create mode 100644 crates/relayer-cosmos/src/methods/event.rs diff --git a/crates/relayer-cosmos/src/impls/chain.rs b/crates/relayer-cosmos/src/impls/chain.rs index 2387b5b08d..3366bb7efd 100644 --- a/crates/relayer-cosmos/src/impls/chain.rs +++ b/crates/relayer-cosmos/src/impls/chain.rs @@ -53,6 +53,7 @@ use crate::methods::connection::{ }; use crate::methods::consensus_state::{find_consensus_state_height_before, query_consensus_state}; use crate::methods::create_client::{build_create_client_message, build_create_client_payload}; +use crate::methods::event::try_extract_send_packet_event; use crate::methods::packet::{ build_ack_packet_message, build_ack_packet_payload, build_receive_packet_message, build_receive_packet_payload, build_timeout_unordered_packet_message, @@ -241,17 +242,7 @@ where } fn try_extract_send_packet_event(event: &Arc) -> Option { - let event_type = event.kind.parse().ok()?; - - if let IbcEventType::SendPacket = event_type { - let (packet, _) = extract_packet_and_write_ack_from_tx(event).ok()?; - - let send_packet_event = SendPacket { packet }; - - Some(send_packet_event) - } else { - None - } + try_extract_send_packet_event(event) } fn extract_packet_from_send_packet_event(event: &SendPacket) -> Packet { diff --git a/crates/relayer-cosmos/src/methods/event.rs b/crates/relayer-cosmos/src/methods/event.rs new file mode 100644 index 0000000000..3af66292fd --- /dev/null +++ b/crates/relayer-cosmos/src/methods/event.rs @@ -0,0 +1,21 @@ +use alloc::sync::Arc; + +use ibc_relayer::event::extract_packet_and_write_ack_from_tx; +use tendermint::abci::Event as AbciEvent; + +use ibc_relayer_types::core::ics04_channel::events::SendPacket; +use ibc_relayer_types::events::IbcEventType; + +pub fn try_extract_send_packet_event(event: &Arc) -> Option { + let event_type = event.kind.parse().ok()?; + + if let IbcEventType::SendPacket = event_type { + let (packet, _) = extract_packet_and_write_ack_from_tx(event).ok()?; + + let send_packet_event = SendPacket { packet }; + + Some(send_packet_event) + } else { + None + } +} diff --git a/crates/relayer-cosmos/src/methods/mod.rs b/crates/relayer-cosmos/src/methods/mod.rs index 8582b235ac..b786c3a058 100644 --- a/crates/relayer-cosmos/src/methods/mod.rs +++ b/crates/relayer-cosmos/src/methods/mod.rs @@ -5,6 +5,7 @@ pub mod connection; pub mod consensus_state; pub mod create_client; pub mod encode; +pub mod event; pub mod packet; pub mod runtime; pub mod unreceived_packet; diff --git a/crates/relayer-cosmos/src/methods/unreceived_packet.rs b/crates/relayer-cosmos/src/methods/unreceived_packet.rs index e28df55013..caa915f803 100644 --- a/crates/relayer-cosmos/src/methods/unreceived_packet.rs +++ b/crates/relayer-cosmos/src/methods/unreceived_packet.rs @@ -18,6 +18,7 @@ use ibc_relayer_types::Height; use tendermint_rpc::{Client, Order}; use crate::contexts::chain::CosmosChain; +use crate::methods::event::try_extract_send_packet_event; use crate::types::error::{BaseError, Error}; pub async fn query_packet_commitments( @@ -134,7 +135,7 @@ async fn query_send_packet_from_sequence( let send_packets: Vec = events .iter() - .filter_map( as OfaChain>::try_extract_send_packet_event) + .filter_map(try_extract_send_packet_event) .map(|event| { as OfaChain>::extract_packet_from_send_packet_event(&event) }) From 9ccc656e283866d46b03a73c7f3a8dd1bf5525fb Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Fri, 4 Aug 2023 11:27:53 +0200 Subject: [PATCH 23/26] Moved traits related to send packets in their own mod --- .../src/all_for_one/chain.rs | 5 +- .../impls/chain/queries/unreceived_packets.rs | 5 +- .../impls/receive_packets_clear.rs | 5 +- .../src/chain/traits/queries/mod.rs | 1 + .../src/chain/traits/queries/send_packet.rs | 50 +++++++++++++++++++ .../traits/queries/unreceived_packets.rs | 44 ---------------- .../src/tests/next/packet_clear.rs | 5 +- 7 files changed, 59 insertions(+), 56 deletions(-) create mode 100644 crates/relayer-components/src/chain/traits/queries/send_packet.rs diff --git a/crates/relayer-all-in-one/src/all_for_one/chain.rs b/crates/relayer-all-in-one/src/all_for_one/chain.rs index 6e1a19fe09..59044ba491 100644 --- a/crates/relayer-all-in-one/src/all_for_one/chain.rs +++ b/crates/relayer-all-in-one/src/all_for_one/chain.rs @@ -2,10 +2,9 @@ use ibc_relayer_components::chain::traits::client::create::HasCreateClientOption use ibc_relayer_components::chain::traits::queries::consensus_state::CanQueryConsensusState; use ibc_relayer_components::chain::traits::queries::packet_commitments::CanQueryPacketCommitments; use ibc_relayer_components::chain::traits::queries::received_packet::CanQueryReceivedPacket; +use ibc_relayer_components::chain::traits::queries::send_packet::CanQuerySendPacketsFromSequences; use ibc_relayer_components::chain::traits::queries::status::CanQueryChainStatus; -use ibc_relayer_components::chain::traits::queries::unreceived_packets::{ - CanQuerySendPacketsFromSequences, CanQueryUnreceivedPacketSequences, -}; +use ibc_relayer_components::chain::traits::queries::unreceived_packets::CanQueryUnreceivedPacketSequences; use ibc_relayer_components::chain::traits::types::chain::HasChainTypes; use ibc_relayer_components::chain::traits::types::channel::{ HasChannelHandshakePayloads, HasInitChannelOptionsType, diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs index 149de55fc7..c7ab122782 100644 --- a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs +++ b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs @@ -1,8 +1,7 @@ use async_trait::async_trait; -use ibc_relayer_components::chain::traits::queries::unreceived_packets::{ - CanQuerySendPacketsFromSequences, CanQueryUnreceivedPacketSequences, -}; +use ibc_relayer_components::chain::traits::queries::send_packet::CanQuerySendPacketsFromSequences; +use ibc_relayer_components::chain::traits::queries::unreceived_packets::CanQueryUnreceivedPacketSequences; use crate::one_for_all::traits::chain::{OfaChainTypes, OfaIbcChain}; use crate::one_for_all::types::chain::OfaChainWrapper; diff --git a/crates/relayer-components-extra/src/packet_clear/impls/receive_packets_clear.rs b/crates/relayer-components-extra/src/packet_clear/impls/receive_packets_clear.rs index 62b2627e33..e2595d3688 100644 --- a/crates/relayer-components-extra/src/packet_clear/impls/receive_packets_clear.rs +++ b/crates/relayer-components-extra/src/packet_clear/impls/receive_packets_clear.rs @@ -1,9 +1,8 @@ use async_trait::async_trait; use futures_util::{stream, StreamExt}; use ibc_relayer_components::chain::traits::queries::packet_commitments::CanQueryPacketCommitments; -use ibc_relayer_components::chain::traits::queries::unreceived_packets::{ - CanQuerySendPacketsFromSequences, CanQueryUnreceivedPacketSequences, -}; +use ibc_relayer_components::chain::traits::queries::send_packet::CanQuerySendPacketsFromSequences; +use ibc_relayer_components::chain::traits::queries::unreceived_packets::CanQueryUnreceivedPacketSequences; use ibc_relayer_components::chain::types::aliases::{ChannelId, PortId}; use ibc_relayer_components::relay::traits::packet::HasRelayPacket; use ibc_relayer_components::relay::traits::packet_relayer::CanRelayPacket; diff --git a/crates/relayer-components/src/chain/traits/queries/mod.rs b/crates/relayer-components/src/chain/traits/queries/mod.rs index cac9aab84e..e5b0c2beff 100644 --- a/crates/relayer-components/src/chain/traits/queries/mod.rs +++ b/crates/relayer-components/src/chain/traits/queries/mod.rs @@ -3,6 +3,7 @@ pub mod connection; pub mod consensus_state; pub mod packet_commitments; pub mod received_packet; +pub mod send_packet; pub mod status; pub mod unreceived_packets; pub mod write_ack; diff --git a/crates/relayer-components/src/chain/traits/queries/send_packet.rs b/crates/relayer-components/src/chain/traits/queries/send_packet.rs new file mode 100644 index 0000000000..8557c0cfdd --- /dev/null +++ b/crates/relayer-components/src/chain/traits/queries/send_packet.rs @@ -0,0 +1,50 @@ +use async_trait::async_trait; + +use crate::chain::traits::types::ibc::HasIbcChainTypes; +use crate::chain::traits::types::packet::HasIbcPacketTypes; +use crate::core::traits::error::HasErrorType; +use crate::std_prelude::*; + +#[async_trait] +pub trait CanQuerySendPacketFromSequence: + HasIbcChainTypes + HasIbcPacketTypes + HasErrorType +where + Counterparty: HasIbcChainTypes, +{ + /// Given a single sequence, a channel and port will query the outgoing + /// packets if it hasn't been relayed. + async fn query_send_packet_from_sequence( + &self, + channel_id: &Self::ChannelId, + port_id: &Self::PortId, + counterparty_channel_id: &Counterparty::ChannelId, + counterparty_port_id: &Counterparty::PortId, + sequence: &Self::Sequence, + // The height is given to query the packets from a specific height. + // This height should be the same as the query height from the + // `CanQueryPacketCommitments` made on the same chain. + height: &Self::Height, + ) -> Result; +} + +#[async_trait] +pub trait CanQuerySendPacketsFromSequences: + HasIbcChainTypes + HasIbcPacketTypes + HasErrorType +where + Counterparty: HasIbcChainTypes, +{ + /// Given a list of sequences, a channel and port will query a list of outgoing + /// packets which have not been relayed. + async fn query_send_packets_from_sequences( + &self, + channel_id: &Self::ChannelId, + port_id: &Self::PortId, + counterparty_channel_id: &Counterparty::ChannelId, + counterparty_port_id: &Counterparty::PortId, + sequences: &[Self::Sequence], + // The height is given to query the packets from a specific height. + // This height should be the same as the query height from the + // `CanQueryPacketCommitments` made on the same chain. + height: &Self::Height, + ) -> Result, Self::Error>; +} diff --git a/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs b/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs index 33bc5d3c8b..56aa7044e3 100644 --- a/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs +++ b/crates/relayer-components/src/chain/traits/queries/unreceived_packets.rs @@ -21,47 +21,3 @@ where sequences: &[Counterparty::Sequence], ) -> Result, Self::Error>; } - -#[async_trait] -pub trait CanQuerySendPacketFromSequence: - HasIbcChainTypes + HasIbcPacketTypes + HasErrorType -where - Counterparty: HasIbcChainTypes, -{ - /// Given a single sequence, a channel and port will query the outgoing - /// packets if it hasn't been relayed. - async fn query_send_packet_from_sequence( - &self, - channel_id: &Self::ChannelId, - port_id: &Self::PortId, - counterparty_channel_id: &Counterparty::ChannelId, - counterparty_port_id: &Counterparty::PortId, - sequence: &Self::Sequence, - // The height is given to query the packets from a specific height. - // This height should be the same as the query height from the - // `CanQueryPacketCommitments` made on the same chain. - height: &Self::Height, - ) -> Result; -} - -#[async_trait] -pub trait CanQuerySendPacketsFromSequences: - HasIbcChainTypes + HasIbcPacketTypes + HasErrorType -where - Counterparty: HasIbcChainTypes, -{ - /// Given a list of sequences, a channel and port will query a list of outgoing - /// packets which have not been relayed. - async fn query_send_packets_from_sequences( - &self, - channel_id: &Self::ChannelId, - port_id: &Self::PortId, - counterparty_channel_id: &Counterparty::ChannelId, - counterparty_port_id: &Counterparty::PortId, - sequences: &[Self::Sequence], - // The height is given to query the packets from a specific height. - // This height should be the same as the query height from the - // `CanQueryPacketCommitments` made on the same chain. - height: &Self::Height, - ) -> Result, Self::Error>; -} diff --git a/tools/integration-test/src/tests/next/packet_clear.rs b/tools/integration-test/src/tests/next/packet_clear.rs index ab2286af10..da7ab99de8 100644 --- a/tools/integration-test/src/tests/next/packet_clear.rs +++ b/tools/integration-test/src/tests/next/packet_clear.rs @@ -1,8 +1,7 @@ use ibc_relayer::config::PacketFilter; use ibc_relayer_components::chain::traits::queries::packet_commitments::CanQueryPacketCommitments; -use ibc_relayer_components::chain::traits::queries::unreceived_packets::{ - CanQuerySendPacketsFromSequences, CanQueryUnreceivedPacketSequences, -}; +use ibc_relayer_components::chain::traits::queries::send_packet::CanQuerySendPacketsFromSequences; +use ibc_relayer_components::chain::traits::queries::unreceived_packets::CanQueryUnreceivedPacketSequences; use ibc_relayer_components::relay::traits::chains::HasRelayChains; use ibc_relayer_components::relay::traits::two_way::HasTwoWayRelay; use ibc_relayer_components_extra::packet_clear::traits::packet_clear::CanClearReceivePackets; From 610e571c1038dd90cd2b2c4e62afeb937ba3c4cb Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Fri, 4 Aug 2023 11:50:43 +0200 Subject: [PATCH 24/26] Moved packet_clear traits to relayer-components --- .../relayer-all-in-one/src/all_for_one/relay.rs | 2 +- .../relay/clear_packet/receive_packet_clear.rs | 5 +++-- .../src/packet_clear/mod.rs | 2 -- .../src/packet_clear/traits/mod.rs | 2 -- .../src/packet_clear/worker.rs | 9 ++++----- .../relayer-components/src/relay/impls/mod.rs | 1 + .../src/relay/impls/packet_clear}/mod.rs | 0 .../packet_clear}/receive_packets_clear.rs | 17 +++++++++-------- .../src/relay}/traits/clear_interval.rs | 2 +- .../relayer-components/src/relay/traits/mod.rs | 2 ++ .../src/relay}/traits/packet_clear.rs | 7 ++++--- .../src/tests/next/packet_clear.rs | 2 +- 12 files changed, 26 insertions(+), 25 deletions(-) delete mode 100644 crates/relayer-components-extra/src/packet_clear/traits/mod.rs rename crates/{relayer-components-extra/src/packet_clear/impls => relayer-components/src/relay/impls/packet_clear}/mod.rs (100%) rename crates/{relayer-components-extra/src/packet_clear/impls => relayer-components/src/relay/impls/packet_clear}/receive_packets_clear.rs (75%) rename crates/{relayer-components-extra/src/packet_clear => relayer-components/src/relay}/traits/clear_interval.rs (71%) rename crates/{relayer-components-extra/src/packet_clear => relayer-components/src/relay}/traits/packet_clear.rs (82%) diff --git a/crates/relayer-all-in-one/src/all_for_one/relay.rs b/crates/relayer-all-in-one/src/all_for_one/relay.rs index 2848e31f30..3c11b9635b 100644 --- a/crates/relayer-all-in-one/src/all_for_one/relay.rs +++ b/crates/relayer-all-in-one/src/all_for_one/relay.rs @@ -11,6 +11,7 @@ use ibc_relayer_components::relay::traits::event_relayer::CanRelayEvent; use ibc_relayer_components::relay::traits::ibc_message_sender::CanSendIbcMessages; use ibc_relayer_components::relay::traits::messages::update_client::CanBuildUpdateClientMessage; use ibc_relayer_components::relay::traits::packet::HasRelayPacket; +use ibc_relayer_components::relay::traits::packet_clear::CanClearReceivePackets; use ibc_relayer_components::relay::traits::packet_filter::CanFilterPackets; use ibc_relayer_components::relay::traits::packet_relayer::CanRelayPacket; use ibc_relayer_components::relay::traits::packet_relayers::ack_packet::CanRelayAckPacket; @@ -18,7 +19,6 @@ use ibc_relayer_components::relay::traits::packet_relayers::receive_packet::CanR use ibc_relayer_components::relay::traits::packet_relayers::timeout_unordered_packet::CanRelayTimeoutUnorderedPacket; use ibc_relayer_components::relay::traits::target::{DestinationTarget, SourceTarget}; use ibc_relayer_components_extra::batch::traits::send_messages_from_batch::CanSendIbcMessagesFromBatchWorker; -use ibc_relayer_components_extra::packet_clear::traits::packet_clear::CanClearReceivePackets; use ibc_relayer_components_extra::relay::impls::packet_relayers::retry::SupportsPacketRetry; use crate::all_for_one::chain::AfoChain; diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/relay/clear_packet/receive_packet_clear.rs b/crates/relayer-all-in-one/src/one_for_all/impls/relay/clear_packet/receive_packet_clear.rs index 7da4edf729..47324a2f88 100644 --- a/crates/relayer-all-in-one/src/one_for_all/impls/relay/clear_packet/receive_packet_clear.rs +++ b/crates/relayer-all-in-one/src/one_for_all/impls/relay/clear_packet/receive_packet_clear.rs @@ -1,8 +1,9 @@ use async_trait::async_trait; + use ibc_relayer_components::chain::types::aliases::{ChannelId, PortId}; +use ibc_relayer_components::relay::impls::packet_clear::receive_packets_clear::ReceivePacketClearRelayer; use ibc_relayer_components::relay::traits::chains::HasRelayChains; -use ibc_relayer_components_extra::packet_clear::impls::receive_packets_clear::ReceivePacketClearRelayer; -use ibc_relayer_components_extra::packet_clear::traits::packet_clear::{ +use ibc_relayer_components::relay::traits::packet_clear::{ CanClearReceivePackets, ReceivePacketClearer, }; diff --git a/crates/relayer-components-extra/src/packet_clear/mod.rs b/crates/relayer-components-extra/src/packet_clear/mod.rs index 4a0c56144b..2c8b83993a 100644 --- a/crates/relayer-components-extra/src/packet_clear/mod.rs +++ b/crates/relayer-components-extra/src/packet_clear/mod.rs @@ -1,3 +1 @@ -pub mod impls; -pub mod traits; pub mod worker; diff --git a/crates/relayer-components-extra/src/packet_clear/traits/mod.rs b/crates/relayer-components-extra/src/packet_clear/traits/mod.rs deleted file mode 100644 index 01d2f89c1a..0000000000 --- a/crates/relayer-components-extra/src/packet_clear/traits/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod clear_interval; -pub mod packet_clear; diff --git a/crates/relayer-components-extra/src/packet_clear/worker.rs b/crates/relayer-components-extra/src/packet_clear/worker.rs index d0eb16ad10..117d609a95 100644 --- a/crates/relayer-components-extra/src/packet_clear/worker.rs +++ b/crates/relayer-components-extra/src/packet_clear/worker.rs @@ -1,17 +1,16 @@ +use async_trait::async_trait; use core::time::Duration; -use ibc_relayer_components::chain::types::aliases::{ChannelId, PortId}; -use async_trait::async_trait; +use ibc_relayer_components::chain::types::aliases::{ChannelId, PortId}; use ibc_relayer_components::relay::traits::chains::HasRelayChains; +use ibc_relayer_components::relay::traits::clear_interval::HasClearInterval; +use ibc_relayer_components::relay::traits::packet_clear::CanClearReceivePackets; use ibc_relayer_components::runtime::traits::runtime::HasRuntime; use ibc_relayer_components::runtime::traits::sleep::CanSleep; -use crate::packet_clear::traits::packet_clear::CanClearReceivePackets; use crate::runtime::traits::spawn::{HasSpawner, Spawner, TaskHandle}; use crate::std_prelude::*; -use super::traits::clear_interval::HasClearInterval; - #[async_trait] pub trait CanSpawnPacketClearWorker: HasRelayChains { fn spawn_packet_clear_worker( diff --git a/crates/relayer-components/src/relay/impls/mod.rs b/crates/relayer-components/src/relay/impls/mod.rs index 8a6f057ad1..8607aab777 100644 --- a/crates/relayer-components/src/relay/impls/mod.rs +++ b/crates/relayer-components/src/relay/impls/mod.rs @@ -5,6 +5,7 @@ pub mod connection; pub mod event_relayers; pub mod message_senders; pub mod messages; +pub mod packet_clear; pub mod packet_filters; pub mod packet_relayers; pub mod update_client; diff --git a/crates/relayer-components-extra/src/packet_clear/impls/mod.rs b/crates/relayer-components/src/relay/impls/packet_clear/mod.rs similarity index 100% rename from crates/relayer-components-extra/src/packet_clear/impls/mod.rs rename to crates/relayer-components/src/relay/impls/packet_clear/mod.rs diff --git a/crates/relayer-components-extra/src/packet_clear/impls/receive_packets_clear.rs b/crates/relayer-components/src/relay/impls/packet_clear/receive_packets_clear.rs similarity index 75% rename from crates/relayer-components-extra/src/packet_clear/impls/receive_packets_clear.rs rename to crates/relayer-components/src/relay/impls/packet_clear/receive_packets_clear.rs index e2595d3688..3b7f551728 100644 --- a/crates/relayer-components-extra/src/packet_clear/impls/receive_packets_clear.rs +++ b/crates/relayer-components/src/relay/impls/packet_clear/receive_packets_clear.rs @@ -1,13 +1,14 @@ use async_trait::async_trait; -use futures_util::{stream, StreamExt}; -use ibc_relayer_components::chain::traits::queries::packet_commitments::CanQueryPacketCommitments; -use ibc_relayer_components::chain::traits::queries::send_packet::CanQuerySendPacketsFromSequences; -use ibc_relayer_components::chain::traits::queries::unreceived_packets::CanQueryUnreceivedPacketSequences; -use ibc_relayer_components::chain::types::aliases::{ChannelId, PortId}; -use ibc_relayer_components::relay::traits::packet::HasRelayPacket; -use ibc_relayer_components::relay::traits::packet_relayer::CanRelayPacket; +use futures_util::stream; +use futures_util::StreamExt; -use crate::packet_clear::traits::packet_clear::ReceivePacketClearer; +use crate::chain::traits::queries::packet_commitments::CanQueryPacketCommitments; +use crate::chain::traits::queries::send_packet::CanQuerySendPacketsFromSequences; +use crate::chain::traits::queries::unreceived_packets::CanQueryUnreceivedPacketSequences; +use crate::chain::types::aliases::{ChannelId, PortId}; +use crate::relay::traits::packet::HasRelayPacket; +use crate::relay::traits::packet_clear::ReceivePacketClearer; +use crate::relay::traits::packet_relayer::CanRelayPacket; use crate::std_prelude::*; pub struct ReceivePacketClearRelayer; diff --git a/crates/relayer-components-extra/src/packet_clear/traits/clear_interval.rs b/crates/relayer-components/src/relay/traits/clear_interval.rs similarity index 71% rename from crates/relayer-components-extra/src/packet_clear/traits/clear_interval.rs rename to crates/relayer-components/src/relay/traits/clear_interval.rs index aabc84d194..bed2b67097 100644 --- a/crates/relayer-components-extra/src/packet_clear/traits/clear_interval.rs +++ b/crates/relayer-components/src/relay/traits/clear_interval.rs @@ -1,4 +1,4 @@ -use ibc_relayer_components::core::traits::sync::Async; +use crate::core::traits::sync::Async; pub trait HasClearInterval { type ClearInterval: Async + Clone + Into; diff --git a/crates/relayer-components/src/relay/traits/mod.rs b/crates/relayer-components/src/relay/traits/mod.rs index 09704311e8..fb69427fdf 100644 --- a/crates/relayer-components/src/relay/traits/mod.rs +++ b/crates/relayer-components/src/relay/traits/mod.rs @@ -1,12 +1,14 @@ pub mod auto_relayer; pub mod chains; pub mod channel; +pub mod clear_interval; pub mod connection; pub mod event_relayer; pub mod ibc_message_sender; pub mod logs; pub mod messages; pub mod packet; +pub mod packet_clear; pub mod packet_filter; pub mod packet_relayer; pub mod packet_relayers; diff --git a/crates/relayer-components-extra/src/packet_clear/traits/packet_clear.rs b/crates/relayer-components/src/relay/traits/packet_clear.rs similarity index 82% rename from crates/relayer-components-extra/src/packet_clear/traits/packet_clear.rs rename to crates/relayer-components/src/relay/traits/packet_clear.rs index 77e7bd3f0e..063d7828a0 100644 --- a/crates/relayer-components-extra/src/packet_clear/traits/packet_clear.rs +++ b/crates/relayer-components/src/relay/traits/packet_clear.rs @@ -1,7 +1,8 @@ use async_trait::async_trait; -use ibc_relayer_components::chain::types::aliases::{ChannelId, PortId}; -use ibc_relayer_components::core::traits::sync::Async; -use ibc_relayer_components::relay::traits::packet::HasRelayPacket; + +use crate::chain::types::aliases::{ChannelId, PortId}; +use crate::core::traits::sync::Async; +use crate::relay::traits::packet::HasRelayPacket; use crate::std_prelude::*; diff --git a/tools/integration-test/src/tests/next/packet_clear.rs b/tools/integration-test/src/tests/next/packet_clear.rs index da7ab99de8..df7b318568 100644 --- a/tools/integration-test/src/tests/next/packet_clear.rs +++ b/tools/integration-test/src/tests/next/packet_clear.rs @@ -3,8 +3,8 @@ use ibc_relayer_components::chain::traits::queries::packet_commitments::CanQuery use ibc_relayer_components::chain::traits::queries::send_packet::CanQuerySendPacketsFromSequences; use ibc_relayer_components::chain::traits::queries::unreceived_packets::CanQueryUnreceivedPacketSequences; use ibc_relayer_components::relay::traits::chains::HasRelayChains; +use ibc_relayer_components::relay::traits::packet_clear::CanClearReceivePackets; use ibc_relayer_components::relay::traits::two_way::HasTwoWayRelay; -use ibc_relayer_components_extra::packet_clear::traits::packet_clear::CanClearReceivePackets; use ibc_relayer_types::core::ics04_channel::packet::Sequence; use ibc_relayer_types::Height; use ibc_test_framework::framework::next::chain::{HasTwoChains, HasTwoChannels}; From e0b5f2290980fb05387e81ea8a468760ab9ff313 Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Fri, 4 Aug 2023 12:01:17 +0200 Subject: [PATCH 25/26] Moved send_packet impls to its own mod --- .../one_for_all/impls/chain/queries/mod.rs | 1 + .../impls/chain/queries/send_packet.rs | 43 +++++++++++++++++++ .../impls/chain/queries/unreceived_packets.rs | 37 ---------------- 3 files changed, 44 insertions(+), 37 deletions(-) create mode 100644 crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/send_packet.rs diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/mod.rs b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/mod.rs index 2ac966b8f3..40caf4ac14 100644 --- a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/mod.rs +++ b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/mod.rs @@ -2,6 +2,7 @@ pub mod channel; pub mod consensus_state; pub mod packet_commitments; pub mod received_packet; +pub mod send_packet; pub mod status; pub mod unreceived_packets; pub mod write_ack; diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/send_packet.rs b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/send_packet.rs new file mode 100644 index 0000000000..482ac80c54 --- /dev/null +++ b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/send_packet.rs @@ -0,0 +1,43 @@ +use async_trait::async_trait; + +use ibc_relayer_components::chain::traits::queries::send_packet::CanQuerySendPacketsFromSequences; + +use crate::one_for_all::traits::chain::{OfaChainTypes, OfaIbcChain}; +use crate::one_for_all::types::chain::OfaChainWrapper; +use crate::std_prelude::*; + +#[async_trait] +impl CanQuerySendPacketsFromSequences> + for OfaChainWrapper +where + Chain: OfaIbcChain + OfaChainTypes, + Counterparty: OfaIbcChain, +{ + /// Given a list of sequences, a channel and port will query a list of outgoing + /// packets which have not been relayed. + async fn query_send_packets_from_sequences( + &self, + channel_id: &Self::ChannelId, + port_id: &Self::PortId, + counterparty_channel_id: &Counterparty::ChannelId, + counterparty_port_id: &Counterparty::PortId, + sequences: &[Self::Sequence], + // The height is given to query the packets from a specific height. + // This height should be the same as the query height from the + // `CanQueryPacketCommitments` made on the same chain. + height: &Self::Height, + ) -> Result, Self::Error> { + let send_packets = self + .chain + .query_send_packets_from_sequences( + channel_id, + port_id, + counterparty_channel_id, + counterparty_port_id, + sequences, + height, + ) + .await?; + Ok(send_packets) + } +} diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs index c7ab122782..4f1ccdd108 100644 --- a/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs +++ b/crates/relayer-all-in-one/src/one_for_all/impls/chain/queries/unreceived_packets.rs @@ -1,6 +1,5 @@ use async_trait::async_trait; -use ibc_relayer_components::chain::traits::queries::send_packet::CanQuerySendPacketsFromSequences; use ibc_relayer_components::chain::traits::queries::unreceived_packets::CanQueryUnreceivedPacketSequences; use crate::one_for_all::traits::chain::{OfaChainTypes, OfaIbcChain}; @@ -31,39 +30,3 @@ where Ok(unreceived_packet_sequences) } } - -#[async_trait] -impl CanQuerySendPacketsFromSequences> - for OfaChainWrapper -where - Chain: OfaIbcChain + OfaChainTypes, - Counterparty: OfaIbcChain, -{ - /// Given a list of sequences, a channel and port will query a list of outgoing - /// packets which have not been relayed. - async fn query_send_packets_from_sequences( - &self, - channel_id: &Self::ChannelId, - port_id: &Self::PortId, - counterparty_channel_id: &Counterparty::ChannelId, - counterparty_port_id: &Counterparty::PortId, - sequences: &[Self::Sequence], - // The height is given to query the packets from a specific height. - // This height should be the same as the query height from the - // `CanQueryPacketCommitments` made on the same chain. - height: &Self::Height, - ) -> Result, Self::Error> { - let send_packets = self - .chain - .query_send_packets_from_sequences( - channel_id, - port_id, - counterparty_channel_id, - counterparty_port_id, - sequences, - height, - ) - .await?; - Ok(send_packets) - } -} From 063dc7fb72782dc8ebfce115b1279808e01b1c85 Mon Sep 17 00:00:00 2001 From: Luca Joss Date: Fri, 4 Aug 2023 14:24:22 +0200 Subject: [PATCH 26/26] Moved 'try_extract_write_acknowledgement_event' to the methods module --- crates/relayer-cosmos/src/impls/chain.rs | 18 ++++-------------- crates/relayer-cosmos/src/methods/event.rs | 19 ++++++++++++++++++- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/crates/relayer-cosmos/src/impls/chain.rs b/crates/relayer-cosmos/src/impls/chain.rs index 3366bb7efd..da1abc3b72 100644 --- a/crates/relayer-cosmos/src/impls/chain.rs +++ b/crates/relayer-cosmos/src/impls/chain.rs @@ -6,7 +6,6 @@ use ibc_relayer::chain::handle::ChainHandle; use ibc_relayer::event::{ channel_open_init_try_from_abci_event, channel_open_try_try_from_abci_event, connection_open_ack_try_from_abci_event, connection_open_try_try_from_abci_event, - extract_packet_and_write_ack_from_tx, }; use ibc_relayer_all_in_one::one_for_all::traits::chain::{OfaChain, OfaChainTypes, OfaIbcChain}; use ibc_relayer_all_in_one::one_for_all::types::runtime::OfaRuntimeWrapper; @@ -53,7 +52,9 @@ use crate::methods::connection::{ }; use crate::methods::consensus_state::{find_consensus_state_height_before, query_consensus_state}; use crate::methods::create_client::{build_create_client_message, build_create_client_payload}; -use crate::methods::event::try_extract_send_packet_event; +use crate::methods::event::{ + try_extract_send_packet_event, try_extract_write_acknowledgement_event, +}; use crate::methods::packet::{ build_ack_packet_message, build_ack_packet_payload, build_receive_packet_message, build_receive_packet_payload, build_timeout_unordered_packet_message, @@ -227,18 +228,7 @@ where fn try_extract_write_acknowledgement_event( event: &Arc, ) -> Option { - if let IbcEventType::WriteAck = event.kind.parse().ok()? { - let (packet, write_ack) = extract_packet_and_write_ack_from_tx(event).ok()?; - - let ack = WriteAcknowledgement { - packet, - ack: write_ack, - }; - - Some(ack) - } else { - None - } + try_extract_write_acknowledgement_event(event) } fn try_extract_send_packet_event(event: &Arc) -> Option { diff --git a/crates/relayer-cosmos/src/methods/event.rs b/crates/relayer-cosmos/src/methods/event.rs index 3af66292fd..ca818b5a7f 100644 --- a/crates/relayer-cosmos/src/methods/event.rs +++ b/crates/relayer-cosmos/src/methods/event.rs @@ -3,7 +3,7 @@ use alloc::sync::Arc; use ibc_relayer::event::extract_packet_and_write_ack_from_tx; use tendermint::abci::Event as AbciEvent; -use ibc_relayer_types::core::ics04_channel::events::SendPacket; +use ibc_relayer_types::core::ics04_channel::events::{SendPacket, WriteAcknowledgement}; use ibc_relayer_types::events::IbcEventType; pub fn try_extract_send_packet_event(event: &Arc) -> Option { @@ -19,3 +19,20 @@ pub fn try_extract_send_packet_event(event: &Arc) -> Option, +) -> Option { + if let IbcEventType::WriteAck = event.kind.parse().ok()? { + let (packet, write_ack) = extract_packet_and_write_ack_from_tx(event).ok()?; + + let ack = WriteAcknowledgement { + packet, + ack: write_ack, + }; + + Some(ack) + } else { + None + } +}