diff --git a/crates/relayer-all-in-one/src/one_for_all/impls/chain/message/ack_packet.rs b/crates/relayer-all-in-one/src/one_for_all/impls/chain/message/ack_packet.rs index a03770de0a..c3a0370cee 100644 --- a/crates/relayer-all-in-one/src/one_for_all/impls/chain/message/ack_packet.rs +++ b/crates/relayer-all-in-one/src/one_for_all/impls/chain/message/ack_packet.rs @@ -1,25 +1,53 @@ use async_trait::async_trait; -use ibc_relayer_components::chain::traits::message_builders::ack_packet::CanBuildAckPacketMessage; +use ibc_relayer_components::chain::traits::message_builders::ack_packet::{ + CanBuildAckPacketMessage, CanBuildAckPacketPayload, +}; +use ibc_relayer_components::chain::traits::types::packets::ack::HasAckPacketPayload; use crate::one_for_all::traits::chain::OfaIbcChain; use crate::one_for_all::types::chain::OfaChainWrapper; use crate::std_prelude::*; #[async_trait] -impl CanBuildAckPacketMessage> +impl HasAckPacketPayload> for OfaChainWrapper where Chain: OfaIbcChain, Counterparty: OfaIbcChain, { - async fn build_ack_packet_message( + type AckPacketPayload = Chain::AckPacketPayload; +} + +#[async_trait] +impl CanBuildAckPacketPayload> + for OfaChainWrapper +where + Chain: OfaIbcChain, + Counterparty: OfaIbcChain, +{ + async fn build_ack_packet_payload( &self, height: &Self::Height, packet: &Self::IncomingPacket, ack: &Self::WriteAcknowledgementEvent, - ) -> Result { + ) -> Result { self.chain - .build_ack_packet_message(height, packet, ack) + .build_ack_packet_payload(height, packet, ack) .await } } + +#[async_trait] +impl CanBuildAckPacketMessage> + for OfaChainWrapper +where + Chain: OfaIbcChain, + Counterparty: OfaIbcChain, +{ + async fn build_ack_packet_message( + &self, + payload: Counterparty::AckPacketPayload, + ) -> Result { + self.chain.build_ack_packet_message(payload).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 4724e7a1bc..898504ef08 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 @@ -168,6 +168,8 @@ pub trait OfaChainTypes: Async { type ChannelOpenTryEvent: Async; type ReceivePacketPayload: Async; + + type AckPacketPayload: Async; } #[async_trait] @@ -337,12 +339,17 @@ where payload: Counterparty::ReceivePacketPayload, ) -> Result; - async fn build_ack_packet_message( + async fn build_ack_packet_payload( &self, height: &Self::Height, packet: &Self::IncomingPacket, ack: &Self::WriteAcknowledgementEvent, - ) -> Result; + ) -> Result; + + async fn build_ack_packet_message( + &self, + payload: Counterparty::AckPacketPayload, + ) -> Result; async fn build_timeout_unordered_packet_message( &self, diff --git a/crates/relayer-components/src/chain/traits/message_builders/ack_packet.rs b/crates/relayer-components/src/chain/traits/message_builders/ack_packet.rs index 2ceb1a5c1d..a71866ce54 100644 --- a/crates/relayer-components/src/chain/traits/message_builders/ack_packet.rs +++ b/crates/relayer-components/src/chain/traits/message_builders/ack_packet.rs @@ -3,6 +3,7 @@ use async_trait::async_trait; use crate::chain::traits::types::height::HasHeightType; use crate::chain::traits::types::ibc::HasIbcChainTypes; use crate::chain::traits::types::ibc_events::write_ack::HasWriteAcknowledgementEvent; +use crate::chain::traits::types::message::HasMessageType; use crate::chain::traits::types::packet::HasIbcPacketTypes; use crate::chain::traits::types::packets::ack::HasAckPacketPayload; use crate::core::traits::error::HasErrorType; @@ -27,18 +28,12 @@ where } #[async_trait] -pub trait CanBuildAckPacketMessage: - HasWriteAcknowledgementEvent - + HasIbcPacketTypes - + HasHeightType - + HasErrorType +pub trait CanBuildAckPacketMessage: HasMessageType + HasErrorType where - Counterparty: HasIbcChainTypes, + Counterparty: HasAckPacketPayload, { async fn build_ack_packet_message( &self, - height: &Self::Height, - packet: &Self::IncomingPacket, - ack: &Self::WriteAcknowledgementEvent, - ) -> Result; + payload: Counterparty::AckPacketPayload, + ) -> Result; } diff --git a/crates/relayer-components/src/relay/impls/packet_relayers/ack/base_ack_packet.rs b/crates/relayer-components/src/relay/impls/packet_relayers/ack/base_ack_packet.rs index ba4d442e9c..92492f2d7f 100644 --- a/crates/relayer-components/src/relay/impls/packet_relayers/ack/base_ack_packet.rs +++ b/crates/relayer-components/src/relay/impls/packet_relayers/ack/base_ack_packet.rs @@ -1,6 +1,8 @@ use async_trait::async_trait; -use crate::chain::traits::message_builders::ack_packet::CanBuildAckPacketMessage; +use crate::chain::traits::message_builders::ack_packet::{ + CanBuildAckPacketMessage, CanBuildAckPacketPayload, +}; use crate::chain::types::aliases::{Height, WriteAcknowledgementEvent}; use crate::relay::traits::chains::HasRelayChains; use crate::relay::traits::ibc_message_sender::CanSendSingleIbcMessage; @@ -19,7 +21,8 @@ impl AckPacketRelayer for BaseAckPacketRelayer where Relay: HasRelayChains, Relay: CanSendSingleIbcMessage, - Relay::DstChain: CanBuildAckPacketMessage, + Relay::DstChain: CanBuildAckPacketPayload, + Relay::SrcChain: CanBuildAckPacketMessage, { async fn relay_ack_packet( relay: &Relay, @@ -27,12 +30,18 @@ where packet: &Packet, ack: &WriteAcknowledgementEvent, ) -> Result<(), Relay::Error> { - let message = relay + let payload = relay .dst_chain() - .build_ack_packet_message(destination_height, packet, ack) + .build_ack_packet_payload(destination_height, packet, ack) .await .map_err(Relay::dst_chain_error)?; + let message = relay + .src_chain() + .build_ack_packet_message(payload) + .await + .map_err(Relay::src_chain_error)?; + relay.send_message(SourceTarget, message).await?; Ok(()) diff --git a/crates/relayer-cosmos/src/impls/chain.rs b/crates/relayer-cosmos/src/impls/chain.rs index 9d6e6d3996..906c1cc5c5 100644 --- a/crates/relayer-cosmos/src/impls/chain.rs +++ b/crates/relayer-cosmos/src/impls/chain.rs @@ -54,9 +54,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::packet::{ - build_ack_packet_message, build_receive_packet_message, build_receive_packet_payload, - build_timeout_unordered_packet_message, query_is_packet_received, - query_write_acknowledgement_event, CosmosReceivePacketPayload, + build_ack_packet_message, build_ack_packet_payload, build_receive_packet_message, + build_receive_packet_payload, build_timeout_unordered_packet_message, query_is_packet_received, + query_write_acknowledgement_event, CosmosAckPacketPayload, CosmosReceivePacketPayload, }; use crate::methods::update_client::{build_update_client_message, build_update_client_payload}; use crate::traits::message::CosmosMessage; @@ -161,6 +161,8 @@ where type ChannelOpenTryEvent = CosmosChannelOpenTryEvent; type ReceivePacketPayload = CosmosReceivePacketPayload; + + type AckPacketPayload = CosmosAckPacketPayload; } #[async_trait] @@ -416,6 +418,7 @@ where ChannelOpenAckPayload = CosmosChannelOpenAckPayload, ChannelOpenConfirmPayload = CosmosChannelOpenConfirmPayload, ReceivePacketPayload = CosmosReceivePacketPayload, + AckPacketPayload = CosmosAckPacketPayload, >, { fn incoming_packet_src_channel_id(packet: &Packet) -> &ChannelId { @@ -539,19 +542,26 @@ where &self, payload: CosmosReceivePacketPayload, ) -> Result, Error> { - build_receive_packet_message(payload).await + build_receive_packet_message(payload) } /// Construct an acknowledgement packet to be sent from a Cosmos /// chain that successfully received a packet from another Cosmos /// chain. - async fn build_ack_packet_message( + async fn build_ack_packet_payload( &self, height: &Height, packet: &Packet, ack: &WriteAcknowledgement, + ) -> Result { + build_ack_packet_payload(self, height, packet, ack).await + } + + async fn build_ack_packet_message( + &self, + payload: CosmosAckPacketPayload, ) -> Result, Error> { - build_ack_packet_message(self, height, packet, ack).await + build_ack_packet_message(payload) } /// Construct a timeout packet message to be sent between Cosmos chains diff --git a/crates/relayer-cosmos/src/methods/packet.rs b/crates/relayer-cosmos/src/methods/packet.rs index bf17c4c842..008bbbb007 100644 --- a/crates/relayer-cosmos/src/methods/packet.rs +++ b/crates/relayer-cosmos/src/methods/packet.rs @@ -25,6 +25,13 @@ pub struct CosmosReceivePacketPayload { pub proofs: Proofs, } +pub struct CosmosAckPacketPayload { + pub height: Height, + pub packet: Packet, + pub ack: Vec, + pub proofs: Proofs, +} + pub async fn build_receive_packet_payload( chain: &CosmosChain, height: &Height, @@ -62,7 +69,7 @@ pub async fn build_receive_packet_payload( .map_err(BaseError::join)? } -pub async fn build_receive_packet_message( +pub fn build_receive_packet_message( payload: CosmosReceivePacketPayload, ) -> Result, Error> { let message = CosmosIbcMessage::new(Some(payload.height), move |signer| { @@ -77,12 +84,12 @@ pub async fn build_receive_packet_message( Ok(wrap_cosmos_message(message)) } -pub async fn build_ack_packet_message( +pub async fn build_ack_packet_payload( chain: &CosmosChain, height: &Height, packet: &Packet, ack: &WriteAcknowledgement, -) -> Result, Error> { +) -> Result { let height = *height; let packet = packet.clone(); let ack = ack.clone(); @@ -107,22 +114,33 @@ pub async fn build_ack_packet_message( let packet = packet.clone(); let ack = ack.ack.clone(); - let message = CosmosIbcMessage::new(Some(height), move |signer| { - Ok(MsgAcknowledgement::new( - packet.clone(), - ack.clone().into(), - proofs.clone(), - signer.clone(), - ) - .to_any()) - }); - - Ok(wrap_cosmos_message(message)) + Ok(CosmosAckPacketPayload { + height, + packet, + ack, + proofs, + }) }) .await .map_err(BaseError::join)? } +pub fn build_ack_packet_message( + payload: CosmosAckPacketPayload, +) -> Result, Error> { + let message = CosmosIbcMessage::new(Some(payload.height), move |signer| { + Ok(MsgAcknowledgement::new( + payload.packet.clone(), + payload.ack.clone().into(), + payload.proofs.clone(), + signer.clone(), + ) + .to_any()) + }); + + Ok(wrap_cosmos_message(message)) +} + pub async fn build_timeout_unordered_packet_message( chain: &CosmosChain, height: &Height, diff --git a/crates/relayer-mock/src/relayer_mock/base/impls/chain.rs b/crates/relayer-mock/src/relayer_mock/base/impls/chain.rs index 6ef9006781..68a25049b0 100644 --- a/crates/relayer-mock/src/relayer_mock/base/impls/chain.rs +++ b/crates/relayer-mock/src/relayer_mock/base/impls/chain.rs @@ -12,7 +12,9 @@ use async_trait::async_trait; use eyre::eyre; use ibc_relayer_components::chain::traits::logs::event::CanLogChainEvent; use ibc_relayer_components::chain::traits::logs::packet::CanLogChainPacket; -use ibc_relayer_components::chain::traits::message_builders::ack_packet::CanBuildAckPacketMessage; +use ibc_relayer_components::chain::traits::message_builders::ack_packet::{ + CanBuildAckPacketMessage, CanBuildAckPacketPayload, +}; use ibc_relayer_components::chain::traits::message_builders::receive_packet::{ CanBuildReceivePacketMessage, CanBuildReceivePacketPayload, }; @@ -35,6 +37,7 @@ use ibc_relayer_components::chain::traits::types::message::{ CanEstimateMessageSize, HasMessageType, }; use ibc_relayer_components::chain::traits::types::packet::{HasIbcPacketFields, HasIbcPacketTypes}; +use ibc_relayer_components::chain::traits::types::packets::ack::HasAckPacketPayload; use ibc_relayer_components::chain::traits::types::packets::receive::HasReceivePacketPayload; use ibc_relayer_components::chain::traits::types::status::HasChainStatusType; use ibc_relayer_components::chain::traits::types::timestamp::HasTimestampType; @@ -387,9 +390,13 @@ impl CanBuildReceivePacketMessage for MockChainContext { } } +impl HasAckPacketPayload for MockChainContext { + type AckPacketPayload = MockMessage; +} + #[async_trait] -impl CanBuildAckPacketMessage for MockChainContext { - async fn build_ack_packet_message( +impl CanBuildAckPacketPayload for MockChainContext { + async fn build_ack_packet_payload( &self, height: &MockHeight, packet: &PacketKey, @@ -414,6 +421,12 @@ impl CanBuildAckPacketMessage for MockChainContext { } } +#[async_trait] +impl CanBuildAckPacketMessage for MockChainContext { + async fn build_ack_packet_message(&self, payload: MockMessage) -> Result { + Ok(payload) + } +} #[async_trait] impl CanBuildTimeoutUnorderedPacketMessage for MockChainContext { async fn build_timeout_unordered_packet_message(