diff --git a/crates/chain/chain-components/src/lib.rs b/crates/chain/chain-components/src/lib.rs index 96b794821..5d40a7705 100644 --- a/crates/chain/chain-components/src/lib.rs +++ b/crates/chain/chain-components/src/lib.rs @@ -1,4 +1,5 @@ #![no_std] +#![allow(clippy::type_complexity)] extern crate alloc; diff --git a/crates/chain/chain-components/src/traits/event_subscription.rs b/crates/chain/chain-components/src/traits/event_subscription.rs index a48d8446e..d217e5b01 100644 --- a/crates/chain/chain-components/src/traits/event_subscription.rs +++ b/crates/chain/chain-components/src/traits/event_subscription.rs @@ -1,14 +1,19 @@ +use cgp::prelude::*; use hermes_runtime_components::traits::runtime::HasRuntime; use hermes_runtime_components::traits::subscription::HasSubscription; use crate::traits::types::event::HasEventType; use crate::traits::types::height::HasHeightType; +#[cgp_component { + provider: EventSubscriptionGetter, + context: Chain, +}] pub trait HasEventSubscription: HasHeightType + HasEventType + HasRuntime where Self::Runtime: HasSubscription, { fn event_subscription( &self, - ) -> &::Subscription<(Self::Height, Self::Event)>; + ) -> Option<&::Subscription<(Self::Height, Self::Event)>>; } diff --git a/crates/chain/chain-components/src/traits/extract_data.rs b/crates/chain/chain-components/src/traits/extract_data.rs new file mode 100644 index 000000000..97f7e3d3b --- /dev/null +++ b/crates/chain/chain-components/src/traits/extract_data.rs @@ -0,0 +1,74 @@ +use core::marker::PhantomData; + +use cgp::core::component::UseDelegate; +use cgp::prelude::*; +use hermes_chain_type_components::traits::fields::message_response_events::HasMessageResponseEvents; +use hermes_chain_type_components::traits::types::event::HasEventType; +use hermes_chain_type_components::traits::types::message_response::HasMessageResponseType; + +#[cgp_component { + provider: MessageResponseExtractor, + context: Chain, +}] +pub trait CanExtractFromMessageResponse: HasMessageResponseType { + fn try_extract_from_message_response( + &self, + _tag: PhantomData, + message_response: &Self::MessageResponse, + ) -> Option; +} + +#[cgp_component { + provider: EventExtractor, + context: Chain, +}] +pub trait CanExtractFromEvent: HasEventType { + fn try_extract_from_event(&self, _tag: PhantomData, event: &Self::Event) -> Option; +} + +pub struct ExtractFromMessageResponseViaEvents; + +impl MessageResponseExtractor for ExtractFromMessageResponseViaEvents +where + Chain: HasMessageResponseEvents + CanExtractFromEvent, +{ + fn try_extract_from_message_response( + chain: &Chain, + tag: PhantomData, + message_response: &Chain::MessageResponse, + ) -> Option { + Chain::message_response_events(message_response) + .iter() + .find_map(|event| chain.try_extract_from_event(tag, event)) + } +} + +impl MessageResponseExtractor for UseDelegate +where + Chain: HasMessageResponseType, + Components: DelegateComponent, + Components::Delegate: MessageResponseExtractor, +{ + fn try_extract_from_message_response( + chain: &Chain, + tag: PhantomData, + message_response: &Chain::MessageResponse, + ) -> Option { + Components::Delegate::try_extract_from_message_response(chain, tag, message_response) + } +} + +impl EventExtractor for UseDelegate +where + Chain: HasEventType, + Components: DelegateComponent, + Components::Delegate: EventExtractor, +{ + fn try_extract_from_event( + chain: &Chain, + tag: PhantomData, + event: &Chain::Event, + ) -> Option { + Components::Delegate::try_extract_from_event(chain, tag, event) + } +} diff --git a/crates/chain/chain-components/src/traits/mod.rs b/crates/chain/chain-components/src/traits/mod.rs index e6a7660f6..ed0d2cc3e 100644 --- a/crates/chain/chain-components/src/traits/mod.rs +++ b/crates/chain/chain-components/src/traits/mod.rs @@ -1,5 +1,6 @@ pub mod commitment_prefix; pub mod event_subscription; +pub mod extract_data; pub mod message_builders; pub mod packet; pub mod payload_builders; diff --git a/crates/chain/chain-components/src/traits/packet/from_send_packet.rs b/crates/chain/chain-components/src/traits/packet/from_send_packet.rs new file mode 100644 index 000000000..bb59076b2 --- /dev/null +++ b/crates/chain/chain-components/src/traits/packet/from_send_packet.rs @@ -0,0 +1,18 @@ +use cgp::prelude::*; +use hermes_chain_type_components::traits::types::ibc::packet::HasOutgoingPacketType; + +use crate::traits::types::ibc_events::send_packet::HasSendPacketEvent; + +#[cgp_component { + provider: PacketFromSendPacketEventBuilder, + context: Chain, +}] +#[async_trait] +pub trait CanBuildPacketFromSendPacket: + Sized + HasSendPacketEvent + HasOutgoingPacketType + HasAsyncErrorType +{ + async fn build_packet_from_send_packet_event( + &self, + event: &Self::SendPacketEvent, + ) -> Result; +} diff --git a/crates/chain/chain-components/src/traits/packet/from_write_ack.rs b/crates/chain/chain-components/src/traits/packet/from_write_ack.rs index 19955aadb..208cf7632 100644 --- a/crates/chain/chain-components/src/traits/packet/from_write_ack.rs +++ b/crates/chain/chain-components/src/traits/packet/from_write_ack.rs @@ -2,12 +2,15 @@ use cgp::prelude::*; use hermes_chain_type_components::traits::types::ibc::packet::HasOutgoingPacketType; use crate::traits::types::ibc_events::write_ack::HasWriteAckEvent; +use crate::traits::types::packets::ack::HasAcknowledgementType; #[cgp_component { - provider: PacketFromWriteAckBuilder, + provider: PacketFromWriteAckEventBuilder, context: Chain, }] -pub trait CanBuildPacketFromWriteAck: HasWriteAckEvent +#[async_trait] +pub trait CanBuildPacketFromWriteAck: + Sized + HasWriteAckEvent + HasAcknowledgementType + HasAsyncErrorType where Counterparty: HasOutgoingPacketType, { @@ -25,7 +28,13 @@ where refactored into a method like `query_packet_from_write_ack_event`. */ - fn build_packet_from_write_ack_event( + async fn build_packet_from_write_ack_event( + &self, ack: &Self::WriteAckEvent, - ) -> &Counterparty::OutgoingPacket; + ) -> Result; + + async fn build_ack_from_write_ack_event( + &self, + ack: &Self::WriteAckEvent, + ) -> Result; } diff --git a/crates/chain/chain-components/src/traits/packet/mod.rs b/crates/chain/chain-components/src/traits/packet/mod.rs index d66a61192..3cac3e728 100644 --- a/crates/chain/chain-components/src/traits/packet/mod.rs +++ b/crates/chain/chain-components/src/traits/packet/mod.rs @@ -1,3 +1,4 @@ pub mod fields; pub mod filter; +pub mod from_send_packet; pub mod from_write_ack; diff --git a/crates/chain/chain-components/src/traits/queries/write_ack.rs b/crates/chain/chain-components/src/traits/queries/write_ack.rs index 12331a92a..975acd20a 100644 --- a/crates/chain/chain-components/src/traits/queries/write_ack.rs +++ b/crates/chain/chain-components/src/traits/queries/write_ack.rs @@ -9,7 +9,7 @@ use crate::traits::types::ibc_events::write_ack::HasWriteAckEvent; }] #[async_trait] pub trait CanQueryWriteAck: - HasWriteAckEvent + HasAsyncErrorType + Sized + HasWriteAckEvent + HasAsyncErrorType where Counterparty: HasOutgoingPacketType, { diff --git a/crates/chain/chain-components/src/traits/types/create_client.rs b/crates/chain/chain-components/src/traits/types/create_client.rs index 5f33ec113..24919405c 100644 --- a/crates/chain/chain-components/src/traits/types/create_client.rs +++ b/crates/chain/chain-components/src/traits/types/create_client.rs @@ -2,7 +2,6 @@ use cgp::core::component::{UseDelegate, WithProvider}; use cgp::core::types::ProvideType; use cgp::prelude::*; use hermes_chain_type_components::traits::types::ibc::client_id::HasClientIdType; -use hermes_chain_type_components::traits::types::message_response::HasMessageResponseType; #[cgp_component { name: CreateClientPayloadOptionsTypeComponent, @@ -45,15 +44,9 @@ pub type CreateClientPayloadOf = provider: ProvideCreateClientEvent, context: Chain, }] -pub trait HasCreateClientEvent: - HasMessageResponseType + HasClientIdType -{ +pub trait HasCreateClientEvent: HasClientIdType { type CreateClientEvent: Async; - fn try_extract_create_client_event( - response: &Self::MessageResponse, - ) -> Option; - fn create_client_event_client_id(event: &Self::CreateClientEvent) -> &Self::ClientId; } diff --git a/crates/chain/chain-components/src/traits/types/ibc_events/channel.rs b/crates/chain/chain-components/src/traits/types/ibc_events/channel.rs index 8bd16fec0..6c2a10487 100644 --- a/crates/chain/chain-components/src/traits/types/ibc_events/channel.rs +++ b/crates/chain/chain-components/src/traits/types/ibc_events/channel.rs @@ -1,21 +1,14 @@ use cgp::prelude::*; use hermes_chain_type_components::traits::types::ibc::channel_id::HasChannelIdType; -use hermes_chain_type_components::traits::types::message_response::HasMessageResponseType; #[cgp_component { name: ChannelOpenInitEventComponent, provider: ProvideChannelOpenInitEvent, context: Chain, }] -pub trait HasChannelOpenInitEvent: - HasMessageResponseType + HasChannelIdType -{ +pub trait HasChannelOpenInitEvent: HasChannelIdType { type ChannelOpenInitEvent: Async; - fn try_extract_channel_open_init_event( - event: &Self::MessageResponse, - ) -> Option; - fn channel_open_init_event_channel_id(event: &Self::ChannelOpenInitEvent) -> &Self::ChannelId; } @@ -24,14 +17,8 @@ pub trait HasChannelOpenInitEvent: provider: ProvideChannelOpenTryEvent, context: Chain, }] -pub trait HasChannelOpenTryEvent: - HasMessageResponseType + HasChannelIdType -{ +pub trait HasChannelOpenTryEvent: HasChannelIdType { type ChannelOpenTryEvent: Async; - fn try_extract_channel_open_try_event( - event: &Self::MessageResponse, - ) -> Option; - fn channel_open_try_event_channel_id(event: &Self::ChannelOpenTryEvent) -> &Self::ChannelId; } diff --git a/crates/chain/chain-components/src/traits/types/ibc_events/connection.rs b/crates/chain/chain-components/src/traits/types/ibc_events/connection.rs index 8c65677d4..307322a65 100644 --- a/crates/chain/chain-components/src/traits/types/ibc_events/connection.rs +++ b/crates/chain/chain-components/src/traits/types/ibc_events/connection.rs @@ -1,22 +1,14 @@ use cgp::prelude::*; use hermes_chain_type_components::traits::types::ibc::connection_id::HasConnectionIdType; -use hermes_chain_type_components::traits::types::message_response::HasMessageResponseType; #[cgp_component { name: ConnectionOpenTryEventComponent, provider: ProvideConnectionOpenTryEvent, context: Chain, }] -pub trait HasConnectionOpenTryEvent: - HasMessageResponseType + HasConnectionIdType -{ +pub trait HasConnectionOpenTryEvent: HasConnectionIdType { type ConnectionOpenTryEvent: Async; - fn try_extract_connection_open_try_event( - &self, - response: &Self::MessageResponse, - ) -> Option; - fn connection_open_try_event_connection_id( event: &Self::ConnectionOpenTryEvent, ) -> &Self::ConnectionId; @@ -27,15 +19,9 @@ pub trait HasConnectionOpenTryEvent: provider: ProvideConnectionOpenInitEvent, context: Chain, }] -pub trait HasConnectionOpenInitEvent: - HasMessageResponseType + HasConnectionIdType -{ +pub trait HasConnectionOpenInitEvent: HasConnectionIdType { type ConnectionOpenInitEvent: Async; - fn try_extract_connection_open_init_event( - response: &Self::MessageResponse, - ) -> Option; - fn connection_open_init_event_connection_id( event: &Self::ConnectionOpenInitEvent, ) -> &Self::ConnectionId; diff --git a/crates/chain/chain-components/src/traits/types/ibc_events/send_packet.rs b/crates/chain/chain-components/src/traits/types/ibc_events/send_packet.rs index af2e50989..06a25669d 100644 --- a/crates/chain/chain-components/src/traits/types/ibc_events/send_packet.rs +++ b/crates/chain/chain-components/src/traits/types/ibc_events/send_packet.rs @@ -3,9 +3,6 @@ */ use cgp::prelude::*; -use hermes_chain_type_components::traits::types::ibc::packet::HasOutgoingPacketType; - -use crate::traits::types::event::HasEventType; /** Indicates that a chain context's @@ -17,13 +14,6 @@ use crate::traits::types::event::HasEventType; provider: ProvideSendPacketEvent, context: Chain, }] -pub trait HasSendPacketEvent: - HasOutgoingPacketType + HasEventType -{ +pub trait HasSendPacketEvent { type SendPacketEvent: Async; - - fn try_extract_send_packet_event(event: &Self::Event) -> Option; - - fn extract_packet_from_send_packet_event(event: &Self::SendPacketEvent) - -> Self::OutgoingPacket; } diff --git a/crates/chain/chain-components/src/traits/types/ibc_events/write_ack.rs b/crates/chain/chain-components/src/traits/types/ibc_events/write_ack.rs index 7ead82fb1..53f4dbdd0 100644 --- a/crates/chain/chain-components/src/traits/types/ibc_events/write_ack.rs +++ b/crates/chain/chain-components/src/traits/types/ibc_events/write_ack.rs @@ -4,9 +4,6 @@ use cgp::prelude::*; -use crate::traits::types::event::HasEventType; -use crate::traits::types::packets::ack::HasAcknowledgementType; - /** Indicates that a chain context's [`Event`](crate::traits::types::event::HasEventType::Event) @@ -17,9 +14,7 @@ use crate::traits::types::packets::ack::HasAcknowledgementType; provider: ProvideWriteAckEvent, context: Chain, }] -pub trait HasWriteAckEvent: - HasEventType + HasAcknowledgementType -{ +pub trait HasWriteAckEvent { /** The write acknowledgement event that is emitted when a `RecvPacket` message is committed to a chain. @@ -34,22 +29,4 @@ pub trait HasWriteAckEvent: we can add new methods to this trait to do the extraction. */ type WriteAckEvent: Async; - - /** - Try to extract an abstract - [`Event`](crate::traits::types::event::HasEventType::Event) - type into a - [`WriteAckEvent`](Self::WriteAckEvent). - If the extraction fails, return `None`. - - Since an event type may contain many variants, it is not guaranteed - that the event extraction would be successful. If the concrete - `Event` is dynamic-typed, then the extraction may also fail due to - parse errors. - */ - fn try_extract_write_ack_event(event: &Self::Event) -> Option; - - fn write_acknowledgement( - event: &Self::WriteAckEvent, - ) -> impl AsRef + Send; } diff --git a/crates/cosmos/cosmos-chain-components/src/components/client.rs b/crates/cosmos/cosmos-chain-components/src/components/client.rs index e88766efe..14e16396a 100644 --- a/crates/cosmos/cosmos-chain-components/src/components/client.rs +++ b/crates/cosmos/cosmos-chain-components/src/components/client.rs @@ -8,6 +8,9 @@ use hermes_relayer_components::chain::impls::payload_builders::connection::Build use hermes_relayer_components::chain::impls::payload_builders::packet::BuildPacketPayloads; use hermes_relayer_components::chain::impls::queries::consensus_state_height::QueryConsensusStateHeightsAndFindHeightBefore; pub use hermes_relayer_components::chain::traits::commitment_prefix::CommitmentPrefixTypeComponent; +pub use hermes_relayer_components::chain::traits::extract_data::{ + EventExtractorComponent, ExtractFromMessageResponseViaEvents, MessageResponseExtractorComponent, +}; pub use hermes_relayer_components::chain::traits::message_builders::ack_packet::AckPacketMessageBuilderComponent; pub use hermes_relayer_components::chain::traits::message_builders::channel_handshake::{ ChannelOpenAckMessageBuilderComponent, ChannelOpenConfirmMessageBuilderComponent, @@ -30,7 +33,8 @@ pub use hermes_relayer_components::chain::traits::packet::fields::{ pub use hermes_relayer_components::chain::traits::packet::filter::{ IncomingPacketFilterComponent, OutgoingPacketFilterComponent, }; -pub use hermes_relayer_components::chain::traits::packet::from_write_ack::PacketFromWriteAckBuilderComponent; +pub use hermes_relayer_components::chain::traits::packet::from_send_packet::PacketFromSendPacketEventBuilderComponent; +pub use hermes_relayer_components::chain::traits::packet::from_write_ack::PacketFromWriteAckEventBuilderComponent; pub use hermes_relayer_components::chain::traits::payload_builders::ack_packet::AckPacketPayloadBuilderComponent; pub use hermes_relayer_components::chain::traits::payload_builders::channel_handshake::{ ChannelOpenAckPayloadBuilderComponent, ChannelOpenConfirmPayloadBuilderComponent, @@ -147,7 +151,6 @@ use crate::components::delegate::DelegateCosmosChainComponents; use crate::impls::channel::init_channel_options::ProvideCosmosInitChannelOptionsType; use crate::impls::connection::init_connection_options::ProvideCosmosInitConnectionOptionsType; use crate::impls::events::ProvideCosmosEvents; -use crate::impls::packet::packet_from_ack::BuildCosmosPacketFromWriteAck; use crate::impls::packet::packet_message::BuildCosmosPacketMessages; use crate::impls::queries::abci::QueryAbci; use crate::impls::queries::ack_packet::QueryCosmosAckPacket; @@ -223,6 +226,9 @@ cgp_preset! { ChannelOpenTryEventComponent, SendPacketEventComponent, WriteAckEventComponent, + EventExtractorComponent, + PacketFromSendPacketEventBuilderComponent, + PacketFromWriteAckEventBuilderComponent, ]: ProvideCosmosEvents, [ @@ -238,6 +244,8 @@ cgp_preset! { TimeoutUnorderedPacketPayloadTypeComponent, ]: ProvideCosmosPayloadTypes, + MessageResponseExtractorComponent: + ExtractFromMessageResponseViaEvents, RawClientStateTypeComponent: ProvideAnyRawClientState, RawConsensusStateTypeComponent: @@ -313,8 +321,6 @@ cgp_preset! { QueryCosmosAckPacket, AckPacketsQuerierComponent: QueryAckPacketsConcurrently, - PacketFromWriteAckBuilderComponent: - BuildCosmosPacketFromWriteAck, ChainStatusQuerierComponent: QueryCosmosChainStatus, InitConnectionOptionsTypeComponent: diff --git a/crates/cosmos/cosmos-chain-components/src/impls/events.rs b/crates/cosmos/cosmos-chain-components/src/impls/events.rs index 245864f88..d29976993 100644 --- a/crates/cosmos/cosmos-chain-components/src/impls/events.rs +++ b/crates/cosmos/cosmos-chain-components/src/impls/events.rs @@ -1,6 +1,11 @@ use alloc::sync::Arc; +use core::marker::PhantomData; +use cgp::prelude::HasAsyncErrorType; use hermes_chain_type_components::traits::types::message_response::HasMessageResponseType; +use hermes_relayer_components::chain::traits::extract_data::EventExtractor; +use hermes_relayer_components::chain::traits::packet::from_send_packet::PacketFromSendPacketEventBuilder; +use hermes_relayer_components::chain::traits::packet::from_write_ack::PacketFromWriteAckEventBuilder; use hermes_relayer_components::chain::traits::types::create_client::ProvideCreateClientEvent; use hermes_relayer_components::chain::traits::types::event::HasEventType; use hermes_relayer_components::chain::traits::types::ibc::{ @@ -12,8 +17,12 @@ use hermes_relayer_components::chain::traits::types::ibc_events::channel::{ use hermes_relayer_components::chain::traits::types::ibc_events::connection::{ ProvideConnectionOpenInitEvent, ProvideConnectionOpenTryEvent, }; -use hermes_relayer_components::chain::traits::types::ibc_events::send_packet::ProvideSendPacketEvent; -use hermes_relayer_components::chain::traits::types::ibc_events::write_ack::ProvideWriteAckEvent; +use hermes_relayer_components::chain::traits::types::ibc_events::send_packet::{ + HasSendPacketEvent, ProvideSendPacketEvent, +}; +use hermes_relayer_components::chain::traits::types::ibc_events::write_ack::{ + HasWriteAckEvent, ProvideWriteAckEvent, +}; use hermes_relayer_components::chain::traits::types::packet::HasOutgoingPacketType; use hermes_relayer_components::chain::traits::types::packets::ack::HasAcknowledgementType; use ibc::core::channel::types::packet::Packet; @@ -38,55 +47,45 @@ pub struct ProvideCosmosEvents; impl ProvideCreateClientEvent for ProvideCosmosEvents where - Chain: HasClientIdType - + HasMessageResponseType>>, + Chain: HasClientIdType, { type CreateClientEvent = CosmosCreateClientEvent; - fn try_extract_create_client_event( - events: &Vec>, + fn create_client_event_client_id(event: &CosmosCreateClientEvent) -> &ClientId { + &event.client_id + } +} + +impl EventExtractor for ProvideCosmosEvents +where + Chain: HasEventType>, +{ + fn try_extract_from_event( + _chain: &Chain, + _tag: PhantomData, + event: &Chain::Event, ) -> Option { - events.iter().find_map(|event| { - if event.kind == "create_client" { - for tag in &event.attributes { - if tag.key_bytes() == CLIENT_ID_ATTRIBUTE_KEY.as_bytes() { - let client_id = tag.value_str().ok()?.parse().ok()?; - - return Some(CosmosCreateClientEvent { client_id }); - } - } + if event.kind == "create_client" { + for tag in &event.attributes { + if tag.key_bytes() == CLIENT_ID_ATTRIBUTE_KEY.as_bytes() { + let client_id = tag.value_str().ok()?.parse().ok()?; - None - } else { - None + return Some(CosmosCreateClientEvent { client_id }); + } } - }) - } + } - fn create_client_event_client_id(event: &CosmosCreateClientEvent) -> &ClientId { - &event.client_id + None } } impl ProvideConnectionOpenInitEvent for ProvideCosmosEvents where - Chain: HasConnectionIdType - + HasMessageResponseType>>, + Chain: HasConnectionIdType, { type ConnectionOpenInitEvent = CosmosConnectionOpenInitEvent; - fn try_extract_connection_open_init_event( - events: &Vec>, - ) -> Option { - events.iter().find_map(|event| { - let ibc_event = try_conn_open_init_from_abci_event(event).ok()??; - let connection_id = ibc_event.conn_id_on_a().clone(); - - Some(CosmosConnectionOpenInitEvent { connection_id }) - }) - } - fn connection_open_init_event_connection_id( event: &CosmosConnectionOpenInitEvent, ) -> &ConnectionId { @@ -94,24 +93,27 @@ where } } -impl ProvideConnectionOpenTryEvent for ProvideCosmosEvents +impl EventExtractor for ProvideCosmosEvents where - Chain: HasConnectionIdType - + HasMessageResponseType>>, + Chain: HasEventType>, { - type ConnectionOpenTryEvent = CosmosConnectionOpenTryEvent; - - fn try_extract_connection_open_try_event( + fn try_extract_from_event( _chain: &Chain, - events: &Vec>, - ) -> Option { - events.iter().find_map(|event| { - let ibc_event = try_conn_open_try_from_abci_event(event).ok()??; - let connection_id = ibc_event.conn_id_on_b().clone(); + _tag: PhantomData, + event: &Chain::Event, + ) -> Option { + let ibc_event = try_conn_open_init_from_abci_event(event).ok()??; + let connection_id = ibc_event.conn_id_on_a().clone(); - Some(CosmosConnectionOpenTryEvent { connection_id }) - }) + Some(CosmosConnectionOpenInitEvent { connection_id }) } +} + +impl ProvideConnectionOpenTryEvent for ProvideCosmosEvents +where + Chain: HasConnectionIdType, +{ + type ConnectionOpenTryEvent = CosmosConnectionOpenTryEvent; fn connection_open_try_event_connection_id( event: &CosmosConnectionOpenTryEvent, @@ -120,6 +122,22 @@ where } } +impl EventExtractor for ProvideCosmosEvents +where + Chain: HasEventType>, +{ + fn try_extract_from_event( + _chain: &Chain, + _tag: PhantomData, + event: &Chain::Event, + ) -> Option { + let ibc_event = try_conn_open_try_from_abci_event(event).ok()??; + let connection_id = ibc_event.conn_id_on_b().clone(); + + Some(CosmosConnectionOpenTryEvent { connection_id }) + } +} + impl ProvideChannelOpenInitEvent for ProvideCosmosEvents where Chain: HasChannelIdType @@ -127,59 +145,88 @@ where { type ChannelOpenInitEvent = CosmosChannelOpenInitEvent; - fn try_extract_channel_open_init_event( - events: &Vec>, - ) -> Option { - events.iter().find_map(|event| { - let ibc_event = try_chan_open_init_from_abci_event(event).ok()??; - let channel_id = ibc_event.chan_id_on_a().clone(); - Some(CosmosChannelOpenInitEvent { channel_id }) - }) - } - fn channel_open_init_event_channel_id(event: &CosmosChannelOpenInitEvent) -> &ChannelId { &event.channel_id } } +impl EventExtractor for ProvideCosmosEvents +where + Chain: HasEventType>, +{ + fn try_extract_from_event( + _chain: &Chain, + _tag: PhantomData, + event: &Chain::Event, + ) -> Option { + let ibc_event = try_chan_open_init_from_abci_event(event).ok()??; + let channel_id = ibc_event.chan_id_on_a().clone(); + Some(CosmosChannelOpenInitEvent { channel_id }) + } +} + impl ProvideChannelOpenTryEvent for ProvideCosmosEvents where - Chain: HasChannelIdType - + HasMessageResponseType>>, + Chain: HasChannelIdType, { type ChannelOpenTryEvent = CosmosChannelOpenTryEvent; - fn try_extract_channel_open_try_event( - events: &Vec>, - ) -> Option { - events.iter().find_map(|event| { - let ibc_event = try_chan_open_try_from_abci_event(event).ok()??; - let channel_id = ibc_event.chan_id_on_b().clone(); - Some(CosmosChannelOpenTryEvent { channel_id }) - }) - } - fn channel_open_try_event_channel_id(event: &CosmosChannelOpenTryEvent) -> &ChannelId { &event.channel_id } } +impl EventExtractor for ProvideCosmosEvents +where + Chain: HasEventType>, +{ + fn try_extract_from_event( + _chain: &Chain, + _tag: PhantomData, + event: &Chain::Event, + ) -> Option { + let ibc_event = try_chan_open_try_from_abci_event(event).ok()??; + let channel_id = ibc_event.chan_id_on_b().clone(); + Some(CosmosChannelOpenTryEvent { channel_id }) + } +} + impl ProvideSendPacketEvent for ProvideCosmosEvents where Chain: HasEventType> + HasOutgoingPacketType, { type SendPacketEvent = SendPacketEvent; +} + +impl PacketFromSendPacketEventBuilder + for ProvideCosmosEvents +where + Chain: HasSendPacketEvent + + HasOutgoingPacketType + + HasAsyncErrorType, +{ + async fn build_packet_from_send_packet_event( + _chain: &Chain, + event: &SendPacketEvent, + ) -> Result { + Ok(event.packet.clone()) + } +} - fn try_extract_send_packet_event(event: &Arc) -> Option { +impl EventExtractor for ProvideCosmosEvents +where + Chain: HasEventType>, +{ + fn try_extract_from_event( + _chain: &Chain, + _tag: PhantomData, + event: &Chain::Event, + ) -> Option { try_send_packet_from_abci_event(event) .ok()? .map(|send_packet| send_packet.into()) } - - fn extract_packet_from_send_packet_event(event: &SendPacketEvent) -> Packet { - event.packet.clone() - } } impl ProvideWriteAckEvent for ProvideCosmosEvents @@ -188,14 +235,42 @@ where + HasAcknowledgementType>, { type WriteAckEvent = WriteAckEvent; +} - fn try_extract_write_ack_event(event: &Arc) -> Option { +impl EventExtractor for ProvideCosmosEvents +where + Chain: HasEventType>, +{ + fn try_extract_from_event( + _chain: &Chain, + _tag: PhantomData, + event: &Chain::Event, + ) -> Option { try_write_acknowledgment_from_abci_event(event) .ok()? .map(|write_ack| write_ack.into()) } +} - fn write_acknowledgement(event: &WriteAckEvent) -> &Vec { - &event.acknowledgment +impl PacketFromWriteAckEventBuilder + for ProvideCosmosEvents +where + Chain: HasWriteAckEvent + + HasAcknowledgementType> + + HasAsyncErrorType, + Counterparty: HasOutgoingPacketType, +{ + async fn build_packet_from_write_ack_event( + _chain: &Chain, + ack: &WriteAckEvent, + ) -> Result { + Ok(ack.packet.clone()) + } + + async fn build_ack_from_write_ack_event( + _chain: &Chain, + event: &WriteAckEvent, + ) -> Result, Chain::Error> { + Ok(event.acknowledgment.clone()) } } diff --git a/crates/cosmos/cosmos-chain-components/src/impls/packet/mod.rs b/crates/cosmos/cosmos-chain-components/src/impls/packet/mod.rs index e9f603723..35a9bc0a7 100644 --- a/crates/cosmos/cosmos-chain-components/src/impls/packet/mod.rs +++ b/crates/cosmos/cosmos-chain-components/src/impls/packet/mod.rs @@ -1,3 +1,2 @@ pub mod packet_fields; -pub mod packet_from_ack; pub mod packet_message; diff --git a/crates/cosmos/cosmos-chain-components/src/impls/packet/packet_from_ack.rs b/crates/cosmos/cosmos-chain-components/src/impls/packet/packet_from_ack.rs deleted file mode 100644 index 9f67c2eee..000000000 --- a/crates/cosmos/cosmos-chain-components/src/impls/packet/packet_from_ack.rs +++ /dev/null @@ -1,19 +0,0 @@ -use hermes_relayer_components::chain::traits::packet::from_write_ack::PacketFromWriteAckBuilder; -use hermes_relayer_components::chain::traits::types::ibc_events::write_ack::HasWriteAckEvent; -use hermes_relayer_components::chain::traits::types::packet::HasOutgoingPacketType; -use ibc::core::channel::types::packet::Packet; - -use crate::types::events::write_acknowledgment::WriteAckEvent; - -pub struct BuildCosmosPacketFromWriteAck; - -impl PacketFromWriteAckBuilder - for BuildCosmosPacketFromWriteAck -where - Chain: HasWriteAckEvent, - Counterparty: HasOutgoingPacketType, -{ - fn build_packet_from_write_ack_event(ack: &WriteAckEvent) -> &Packet { - &ack.packet - } -} diff --git a/crates/cosmos/cosmos-chain-components/src/impls/queries/ack_packet.rs b/crates/cosmos/cosmos-chain-components/src/impls/queries/ack_packet.rs index c9998a5cd..b1c99846d 100644 --- a/crates/cosmos/cosmos-chain-components/src/impls/queries/ack_packet.rs +++ b/crates/cosmos/cosmos-chain-components/src/impls/queries/ack_packet.rs @@ -1,6 +1,8 @@ use alloc::sync::Arc; +use core::marker::PhantomData; use cgp::core::error::CanRaiseAsyncError; +use hermes_relayer_components::chain::traits::extract_data::CanExtractFromEvent; use hermes_relayer_components::chain::traits::queries::ack_packets::AckPacketQuerier; use hermes_relayer_components::chain::traits::types::ibc::HasIbcChainTypes; use hermes_relayer_components::chain::traits::types::ibc_events::write_ack::HasWriteAckEvent; @@ -26,6 +28,7 @@ where PortId = PortId, Event = Arc, > + HasWriteAckEvent + + CanExtractFromEvent + HasRpcClient + CanRaiseAsyncError + CanRaiseAsyncError<&'static str>, @@ -85,7 +88,7 @@ where let write_acks: Vec = events .iter() - .filter_map(Chain::try_extract_write_ack_event) + .filter_map(|event| chain.try_extract_from_event(PhantomData, event)) .collect(); let write_ack = write_acks diff --git a/crates/cosmos/cosmos-chain-components/src/impls/queries/send_packet.rs b/crates/cosmos/cosmos-chain-components/src/impls/queries/send_packet.rs index 1194a93d4..2844f2bd1 100644 --- a/crates/cosmos/cosmos-chain-components/src/impls/queries/send_packet.rs +++ b/crates/cosmos/cosmos-chain-components/src/impls/queries/send_packet.rs @@ -1,6 +1,8 @@ use alloc::sync::Arc; +use core::marker::PhantomData; use cgp::core::error::CanRaiseAsyncError; +use hermes_relayer_components::chain::traits::extract_data::CanExtractFromEvent; use hermes_relayer_components::chain::traits::queries::send_packets::SendPacketQuerier; use hermes_relayer_components::chain::traits::types::ibc::HasIbcChainTypes; use hermes_relayer_components::chain::traits::types::ibc_events::send_packet::HasSendPacketEvent; @@ -28,6 +30,7 @@ where Event = Arc, > + HasOutgoingPacketType + HasSendPacketEvent + + CanExtractFromEvent + HasRpcClient + CanRaiseAsyncError + CanRaiseAsyncError<&'static str>, @@ -85,7 +88,7 @@ where let send_packets: Vec = events .iter() - .filter_map(Chain::try_extract_send_packet_event) + .filter_map(|event| chain.try_extract_from_event(PhantomData, event)) .map(|event| event.packet.clone()) .collect(); diff --git a/crates/cosmos/cosmos-relayer/src/contexts/chain.rs b/crates/cosmos/cosmos-relayer/src/contexts/chain.rs index c8f46ca5e..4caaa569d 100644 --- a/crates/cosmos/cosmos-relayer/src/contexts/chain.rs +++ b/crates/cosmos/cosmos-relayer/src/contexts/chain.rs @@ -25,6 +25,7 @@ use hermes_cosmos_chain_components::traits::tx_extension_options::TxExtensionOpt use hermes_cosmos_chain_components::traits::unbonding_period::CanQueryUnbondingPeriod; use hermes_cosmos_chain_components::types::commitment_proof::CosmosCommitmentProof; use hermes_cosmos_chain_components::types::config::gas::gas_config::GasConfig; +use hermes_cosmos_chain_components::types::events::client::CosmosCreateClientEvent; use hermes_cosmos_chain_components::types::key_types::secp256k1::Secp256k1KeyPair; use hermes_cosmos_chain_components::types::messages::packet::packet_filter::PacketFilterConfig; use hermes_cosmos_chain_components::types::nonce_guard::NonceGuard; @@ -44,7 +45,10 @@ use hermes_logging_components::traits::logger::CanLog; use hermes_relayer_components::chain::traits::commitment_prefix::{ HasCommitmentPrefixType, HasIbcCommitmentPrefix, IbcCommitmentPrefixGetter, }; -use hermes_relayer_components::chain::traits::event_subscription::HasEventSubscription; +use hermes_relayer_components::chain::traits::event_subscription::EventSubscriptionGetter; +use hermes_relayer_components::chain::traits::extract_data::{ + CanExtractFromEvent, CanExtractFromMessageResponse, +}; use hermes_relayer_components::chain::traits::message_builders::update_client::CanBuildUpdateClientMessage; use hermes_relayer_components::chain::traits::packet::fields::HasPacketSrcChannelId; use hermes_relayer_components::chain::traits::packet::filter::{ @@ -72,7 +76,8 @@ use hermes_relayer_components::chain::traits::types::client_state::{ HasClientStateType, HasRawClientStateType, }; use hermes_relayer_components::chain::traits::types::create_client::{ - HasCreateClientPayloadOptionsType, HasCreateClientPayloadType, + HasCreateClientMessageOptionsType, HasCreateClientPayloadOptionsType, + HasCreateClientPayloadType, }; use hermes_relayer_components::chain::traits::types::ibc_events::send_packet::HasSendPacketEvent; use hermes_relayer_components::chain::traits::types::proof::HasCommitmentProofType; @@ -329,9 +334,11 @@ impl ChainIdGetter for CosmosChainContextComponents { } } -impl HasEventSubscription for CosmosChain { - fn event_subscription(&self) -> &Arc)>> { - &self.subscription +impl EventSubscriptionGetter for CosmosChainContextComponents { + fn event_subscription( + chain: &CosmosChain, + ) -> Option<&Arc)>>> { + Some(&chain.subscription) } } @@ -343,6 +350,7 @@ pub trait CanUseCosmosChain: + HasEventType> + HasCreateClientPayloadType + HasUpdateClientPayloadType + + HasCreateClientMessageOptionsType + HasCreateClientPayloadOptionsType< CosmosChain, CreateClientPayloadOptions = CosmosCreateClientOptions, @@ -386,6 +394,8 @@ pub trait CanUseCosmosChain: + CanFilterIncomingPacket + CanFilterOutgoingPacket + HasPacketSrcChannelId + + CanExtractFromEvent + + CanExtractFromMessageResponse { } diff --git a/crates/cosmos/cosmos-wasm-relayer/src/context/chain.rs b/crates/cosmos/cosmos-wasm-relayer/src/context/chain.rs index 5707685b5..44b7a13e8 100644 --- a/crates/cosmos/cosmos-wasm-relayer/src/context/chain.rs +++ b/crates/cosmos/cosmos-wasm-relayer/src/context/chain.rs @@ -38,7 +38,7 @@ use hermes_logging_components::traits::has_logger::{ GlobalLoggerGetterComponent, HasLogger, LoggerGetterComponent, LoggerTypeComponent, }; use hermes_relayer_components::chain::traits::commitment_prefix::IbcCommitmentPrefixGetter; -use hermes_relayer_components::chain::traits::event_subscription::HasEventSubscription; +use hermes_relayer_components::chain::traits::event_subscription::EventSubscriptionGetter; use hermes_relayer_components::chain::traits::message_builders::ack_packet::CanBuildAckPacketMessage; use hermes_relayer_components::chain::traits::message_builders::channel_handshake::{ CanBuildChannelOpenAckMessage, CanBuildChannelOpenConfirmMessage, @@ -263,9 +263,11 @@ impl ChainIdGetter for WasmCosmosChainComponents { } } -impl HasEventSubscription for WasmCosmosChain { - fn event_subscription(&self) -> &Arc)>> { - &self.subscription +impl EventSubscriptionGetter for WasmCosmosChainComponents { + fn event_subscription( + chain: &WasmCosmosChain, + ) -> Option<&Arc)>>> { + Some(&chain.subscription) } } diff --git a/crates/mock/mock-relayer/src/relayer_mock/base/impls/chain.rs b/crates/mock/mock-relayer/src/relayer_mock/base/impls/chain.rs index 8655baa90..a610f190d 100644 --- a/crates/mock/mock-relayer/src/relayer_mock/base/impls/chain.rs +++ b/crates/mock/mock-relayer/src/relayer_mock/base/impls/chain.rs @@ -19,6 +19,7 @@ use hermes_chain_type_components::impls::types::message_response::UseEventsMessa use hermes_cosmos_chain_components::components::client::{ MessageResponseEventsGetterComponent, MessageResponseTypeComponent, }; +use hermes_relayer_components::chain::traits::extract_data::EventExtractor; use hermes_relayer_components::chain::traits::message_builders::ack_packet::AckPacketMessageBuilder; use hermes_relayer_components::chain::traits::message_builders::receive_packet::ReceivePacketMessageBuilder; use hermes_relayer_components::chain::traits::message_builders::timeout_unordered_packet::TimeoutUnorderedPacketMessageBuilder; @@ -27,6 +28,8 @@ use hermes_relayer_components::chain::traits::packet::fields::{ PacketSrcChannelIdGetter, PacketSrcPortIdGetter, PacketTimeoutHeightGetter, PacketTimeoutTimestampGetter, }; +use hermes_relayer_components::chain::traits::packet::from_send_packet::PacketFromSendPacketEventBuilder; +use hermes_relayer_components::chain::traits::packet::from_write_ack::PacketFromWriteAckEventBuilder; use hermes_relayer_components::chain::traits::payload_builders::ack_packet::AckPacketPayloadBuilder; use hermes_relayer_components::chain::traits::payload_builders::receive_packet::ReceivePacketPayloadBuilder; use hermes_relayer_components::chain::traits::payload_builders::timeout_unordered_packet::TimeoutUnorderedPacketPayloadBuilder; @@ -195,17 +198,35 @@ impl PacketTimeoutTimestampGetter for MockCh impl ProvideWriteAckEvent for MockChainComponents { type WriteAckEvent = WriteAckEvent; +} - fn try_extract_write_ack_event(event: &Event) -> Option { +impl PacketFromWriteAckEventBuilder for MockChainComponents { + async fn build_packet_from_write_ack_event( + _chain: &MockChainContext, + _ack: &WriteAckEvent, + ) -> Result { + todo!() + } + + async fn build_ack_from_write_ack_event( + _chain: &MockChainContext, + _ack: &WriteAckEvent, + ) -> Result, Error> { + Ok(Vec::new()) + } +} + +impl EventExtractor for MockChainComponents { + fn try_extract_from_event( + _chain: &MockChainContext, + _tag: PhantomData, + event: &Event, + ) -> Option { match event { Event::WriteAcknowledgment(h) => Some(WriteAckEvent::new(*h)), _ => None, } } - - fn write_acknowledgement(_event: &WriteAckEvent) -> Vec { - Vec::new() // stub - } } impl ProvideConsensusStateType for MockChainComponents { @@ -231,16 +252,14 @@ impl ProvideChainStatusType for MockChainComponents { impl ProvideSendPacketEvent for MockChainComponents { type SendPacketEvent = SendPacketEvent; +} - fn try_extract_send_packet_event(event: &Event) -> Option { - match event { - Event::SendPacket(send_packet_event) => Some(send_packet_event.clone()), - _ => None, - } - } - - fn extract_packet_from_send_packet_event(event: &Self::SendPacketEvent) -> Packet { - Packet::from(event.clone()) +impl PacketFromSendPacketEventBuilder for MockChainComponents { + async fn build_packet_from_send_packet_event( + _chain: &MockChainContext, + event: &SendPacketEvent, + ) -> Result { + Ok(Packet::from(event.clone())) } } diff --git a/crates/relayer/relayer-components-extra/src/components/extra/closures/chain/event_relayer.rs b/crates/relayer/relayer-components-extra/src/components/extra/closures/chain/event_relayer.rs index ba863b5a8..f4d46a2a4 100644 --- a/crates/relayer/relayer-components-extra/src/components/extra/closures/chain/event_relayer.rs +++ b/crates/relayer/relayer-components-extra/src/components/extra/closures/chain/event_relayer.rs @@ -1,6 +1,8 @@ use cgp::prelude::{HasAsyncErrorType, HasComponents}; +use hermes_relayer_components::chain::traits::extract_data::CanExtractFromEvent; +use hermes_relayer_components::chain::traits::packet::from_send_packet::CanBuildPacketFromSendPacket; use hermes_relayer_components::chain::traits::packet::from_write_ack::{ - CanBuildPacketFromWriteAck, PacketFromWriteAckBuilder, + CanBuildPacketFromWriteAck, PacketFromWriteAckEventBuilder, }; use hermes_relayer_components::chain::traits::queries::counterparty_chain_id::{ CanQueryCounterpartyChainId, CounterpartyChainIdQuerier, @@ -15,8 +17,11 @@ use hermes_relayer_components::chain::traits::types::packet::HasOutgoingPacketTy pub trait UseExtraChainComponentsForEventRelayer: HasChainId + HasSendPacketEvent + + CanBuildPacketFromSendPacket + CanQueryCounterpartyChainId + CanBuildPacketFromWriteAck + + CanExtractFromEvent + + CanExtractFromEvent where Counterparty: HasIbcChainTypes + HasOutgoingPacketType, { @@ -27,12 +32,16 @@ where Chain: HasAsyncErrorType + HasChainId + HasSendPacketEvent + + CanBuildPacketFromSendPacket + HasIbcChainTypes + HasClientStateType + HasWriteAckEvent + + CanBuildPacketFromWriteAck + + CanExtractFromEvent + + CanExtractFromEvent + HasComponents, Counterparty: HasIbcChainTypes + HasOutgoingPacketType, Components: CounterpartyChainIdQuerier - + PacketFromWriteAckBuilder, + + PacketFromWriteAckEventBuilder, { } diff --git a/crates/relayer/relayer-components-extra/src/components/extra/closures/chain/packet_relayer.rs b/crates/relayer/relayer-components-extra/src/components/extra/closures/chain/packet_relayer.rs index ac6c1b814..a6ecaf4dc 100644 --- a/crates/relayer/relayer-components-extra/src/components/extra/closures/chain/packet_relayer.rs +++ b/crates/relayer/relayer-components-extra/src/components/extra/closures/chain/packet_relayer.rs @@ -1,4 +1,5 @@ use cgp::prelude::HasComponents; +use hermes_relayer_components::chain::traits::extract_data::CanExtractFromEvent; use hermes_relayer_components::chain::traits::message_builders::ack_packet::{ AckPacketMessageBuilder, CanBuildAckPacketMessage, }; @@ -9,6 +10,7 @@ use hermes_relayer_components::chain::traits::message_builders::timeout_unordere CanBuildTimeoutUnorderedPacketMessage, TimeoutUnorderedPacketMessageBuilder, }; use hermes_relayer_components::chain::traits::packet::fields::CanReadPacketFields; +use hermes_relayer_components::chain::traits::packet::from_write_ack::CanBuildPacketFromWriteAck; use hermes_relayer_components::chain::traits::payload_builders::ack_packet::{ AckPacketPayloadBuilder, CanBuildAckPacketPayload, }; @@ -42,6 +44,8 @@ pub trait UseExtraChainComponentsForPacketRelayer: + CanBuildAckPacketMessage + CanBuildTimeoutUnorderedPacketPayload + CanBuildTimeoutUnorderedPacketMessage + + HasWriteAckEvent + + CanExtractFromEvent + UseExtraChainComponentsForIbcMessageSender where Counterparty: HasClientStateType @@ -62,9 +66,12 @@ where + HasOutgoingPacketType + HasReceivePacketPayloadType + HasWriteAckEvent + + CanBuildPacketFromWriteAck + HasAckPacketPayloadType + CanReadPacketFields + HasTimeoutUnorderedPacketPayloadType + + HasWriteAckEvent + + CanExtractFromEvent + UseExtraChainComponentsForIbcMessageSender + HasComponents, Counterparty: HasIbcChainTypes diff --git a/crates/relayer/relayer-components-extra/src/components/extra/closures/relay/packet_relayer.rs b/crates/relayer/relayer-components-extra/src/components/extra/closures/relay/packet_relayer.rs index adc25094e..42409039f 100644 --- a/crates/relayer/relayer-components-extra/src/components/extra/closures/relay/packet_relayer.rs +++ b/crates/relayer/relayer-components-extra/src/components/extra/closures/relay/packet_relayer.rs @@ -2,6 +2,7 @@ use cgp::prelude::{CanRaiseAsyncError, HasComponents}; use hermes_chain_type_components::traits::fields::message_response_events::HasMessageResponseEvents; use hermes_logging_components::traits::has_logger::HasLogger; use hermes_logging_components::traits::logger::CanLog; +use hermes_relayer_components::chain::traits::packet::from_write_ack::CanBuildPacketFromWriteAck; use hermes_relayer_components::chain::traits::send_message::EmptyMessageResponse; use hermes_relayer_components::chain::traits::types::ibc_events::write_ack::HasWriteAckEvent; use hermes_relayer_components::chain::traits::types::packet::HasOutgoingPacketType; @@ -42,7 +43,8 @@ where SrcChain: HasOutgoingPacketType + UseExtraChainComponentsForPacketRelayer, DstChain: UseExtraChainComponentsForPacketRelayer + HasMessageResponseEvents - + HasWriteAckEvent, + + HasWriteAckEvent + + CanBuildPacketFromWriteAck, Logger: for<'a> CanLog> + for<'a> CanLog> + for<'a> CanLog>, diff --git a/crates/relayer/relayer-components-extra/src/relay/impls/packet_relayers/extra.rs b/crates/relayer/relayer-components-extra/src/relay/impls/packet_relayers/extra.rs index 575bd9e4e..3fbe6f51d 100644 --- a/crates/relayer/relayer-components-extra/src/relay/impls/packet_relayers/extra.rs +++ b/crates/relayer/relayer-components-extra/src/relay/impls/packet_relayers/extra.rs @@ -3,6 +3,7 @@ use hermes_chain_type_components::traits::types::timeout::HasTimeoutType; use hermes_logging_components::traits::has_logger::HasLogger; use hermes_logging_components::traits::logger::CanLog; use hermes_relayer_components::chain::traits::packet::fields::CanReadPacketFields; +use hermes_relayer_components::chain::traits::packet::from_write_ack::CanBuildPacketFromWriteAck; use hermes_relayer_components::chain::traits::queries::chain_status::CanQueryChainStatus; use hermes_relayer_components::chain::traits::types::ibc::{HasChannelIdType, HasPortIdType}; use hermes_relayer_components::chain::traits::types::ibc_events::write_ack::HasWriteAckEvent; @@ -48,6 +49,7 @@ where SrcChain: CanQueryChainStatus + CanReadPacketFields, DstChain: CanQueryChainStatus + HasWriteAckEvent + + CanBuildPacketFromWriteAck + HasChannelIdType + HasPortIdType + HasTimeoutType, diff --git a/crates/relayer/relayer-components/src/components/default/closures/relay/event_relayer.rs b/crates/relayer/relayer-components/src/components/default/closures/relay/event_relayer.rs index 07d8c807d..27913bbce 100644 --- a/crates/relayer/relayer-components/src/components/default/closures/relay/event_relayer.rs +++ b/crates/relayer/relayer-components/src/components/default/closures/relay/event_relayer.rs @@ -1,6 +1,8 @@ use cgp::core::component::HasComponents; use cgp::core::error::ErrorRaiser; +use hermes_chain_components::traits::extract_data::CanExtractFromEvent; use hermes_chain_components::traits::packet::fields::CanReadPacketFields; +use hermes_chain_components::traits::packet::from_send_packet::CanBuildPacketFromSendPacket; use hermes_logging_components::traits::has_logger::HasLogger; use hermes_logging_components::traits::logger::CanLog; @@ -36,11 +38,14 @@ where + HasComponents, SrcChain: HasChainId + CanReadPacketFields - + HasSendPacketEvent - + CanQueryCounterpartyChainId, + + HasSendPacketEvent + + CanExtractFromEvent + + CanBuildPacketFromSendPacket + + CanQueryCounterpartyChainId, DstChain: HasChainId - + CanQueryCounterpartyChainId - + CanBuildPacketFromWriteAck, + + CanQueryCounterpartyChainId + + CanBuildPacketFromWriteAck + + CanExtractFromEvent, Components: DelegatesToDefaultRelayPreset + RelayPacketFilter + ErrorRaiser diff --git a/crates/relayer/relayer-components/src/components/default/closures/relay/packet_relayer.rs b/crates/relayer/relayer-components/src/components/default/closures/relay/packet_relayer.rs index 8bcf023d0..47e050598 100644 --- a/crates/relayer/relayer-components/src/components/default/closures/relay/packet_relayer.rs +++ b/crates/relayer/relayer-components/src/components/default/closures/relay/packet_relayer.rs @@ -1,5 +1,6 @@ use cgp::core::component::HasComponents; use cgp::core::error::{ErrorRaiser, HasAsyncErrorType}; +use hermes_chain_components::traits::packet::from_write_ack::CanBuildPacketFromWriteAck; use hermes_chain_components::traits::send_message::EmptyMessageResponse; use hermes_chain_components::traits::types::ibc::HasIbcChainTypes; use hermes_chain_type_components::traits::fields::message_response_events::HasMessageResponseEvents; @@ -90,6 +91,7 @@ where + HasConsensusStateType + HasCounterpartyMessageHeight + HasWriteAckEvent + + CanBuildPacketFromWriteAck + CanReadPacketFields + CanQueryClientState + CanQueryPacketIsReceived diff --git a/crates/relayer/relayer-components/src/relay/impls/auto_relayers/event.rs b/crates/relayer/relayer-components/src/relay/impls/auto_relayers/event.rs index 132fa64c2..fe234eb79 100644 --- a/crates/relayer/relayer-components/src/relay/impls/auto_relayers/event.rs +++ b/crates/relayer/relayer-components/src/relay/impls/auto_relayers/event.rs @@ -55,28 +55,32 @@ where let target_chain = relay.target_chain(); let subscription = target_chain.event_subscription(); - loop { - if let Some(event_stream) = Runtime::subscribe(subscription).await { - let tasks = { - let relay = relay.clone(); + if let Some(subscription) = subscription { + loop { + if let Some(event_stream) = Runtime::subscribe(subscription).await { + let tasks = { + let relay = relay.clone(); - Runtime::map_stream(event_stream, move |(height, event)| { - Box::new(EventRelayerTask { - relay: relay.clone(), - height, - event, - phantom: PhantomData, + Runtime::map_stream(event_stream, move |(height, event)| { + Box::new(EventRelayerTask { + relay: relay.clone(), + height, + event, + phantom: PhantomData, + }) }) - }) - }; + }; - target_chain - .runtime() - .run_concurrent_task_stream(tasks) - .await; - } else { - return Ok(()); + target_chain + .runtime() + .run_concurrent_task_stream(tasks) + .await; + } else { + return Ok(()); + } } + } else { + Ok(()) } } } diff --git a/crates/relayer/relayer-components/src/relay/impls/channel/open_init.rs b/crates/relayer/relayer-components/src/relay/impls/channel/open_init.rs index eae26103b..473a473ab 100644 --- a/crates/relayer/relayer-components/src/relay/impls/channel/open_init.rs +++ b/crates/relayer/relayer-components/src/relay/impls/channel/open_init.rs @@ -1,7 +1,9 @@ use core::fmt::Debug; +use core::marker::PhantomData; use cgp::core::error::CanRaiseAsyncError; use cgp::prelude::HasAsyncErrorType; +use hermes_chain_components::traits::extract_data::CanExtractFromMessageResponse; use crate::chain::traits::message_builders::channel_handshake::CanBuildChannelOpenInitMessage; use crate::chain::traits::send_message::CanSendSingleMessage; @@ -31,7 +33,8 @@ where SrcChain: CanSendSingleMessage + HasInitChannelOptionsType + CanBuildChannelOpenInitMessage - + HasChannelOpenInitEvent, + + HasChannelOpenInitEvent + + CanExtractFromMessageResponse, DstChain: HasIbcChainTypes + HasAsyncErrorType, SrcChain::ChannelId: Clone, { @@ -53,7 +56,8 @@ where .await .map_err(Relay::raise_error)?; - let open_init_event = SrcChain::try_extract_channel_open_init_event(&response) + let open_init_event = src_chain + .try_extract_from_message_response(PhantomData, &response) .ok_or_else(|| Relay::raise_error(MissingChannelInitEventError { relay }))?; let src_channel_id = SrcChain::channel_open_init_event_channel_id(&open_init_event); diff --git a/crates/relayer/relayer-components/src/relay/impls/channel/open_try.rs b/crates/relayer/relayer-components/src/relay/impls/channel/open_try.rs index 944158210..088e96c4b 100644 --- a/crates/relayer/relayer-components/src/relay/impls/channel/open_try.rs +++ b/crates/relayer/relayer-components/src/relay/impls/channel/open_try.rs @@ -2,6 +2,7 @@ use core::fmt::Debug; use core::marker::PhantomData; use cgp::core::error::CanRaiseAsyncError; +use hermes_chain_components::traits::extract_data::CanExtractFromMessageResponse; use crate::chain::traits::message_builders::channel_handshake::CanBuildChannelOpenTryMessage; use crate::chain::traits::payload_builders::channel_handshake::CanBuildChannelOpenTryPayload; @@ -48,7 +49,8 @@ where SrcChain: CanQueryChainHeight + CanBuildChannelOpenTryPayload, DstChain: CanQueryClientStateWithLatestHeight + CanBuildChannelOpenTryMessage - + HasChannelOpenTryEvent, + + HasChannelOpenTryEvent + + CanExtractFromMessageResponse, DstChain::ChannelId: Clone, { async fn relay_channel_open_try( @@ -89,8 +91,9 @@ where .send_message(DestinationTarget, open_try_message) .await?; - let open_try_event = - DstChain::try_extract_channel_open_try_event(&response).ok_or_else(|| { + let open_try_event = dst_chain + .try_extract_from_message_response(PhantomData, &response) + .ok_or_else(|| { Relay::raise_error(MissingChannelTryEventError { relay, src_channel_id, diff --git a/crates/relayer/relayer-components/src/relay/impls/connection/open_init.rs b/crates/relayer/relayer-components/src/relay/impls/connection/open_init.rs index afd2788cf..399769d8c 100644 --- a/crates/relayer/relayer-components/src/relay/impls/connection/open_init.rs +++ b/crates/relayer/relayer-components/src/relay/impls/connection/open_init.rs @@ -2,6 +2,7 @@ use core::fmt::Debug; use core::marker::PhantomData; use cgp::core::error::CanRaiseAsyncError; +use hermes_chain_components::traits::extract_data::CanExtractFromMessageResponse; use crate::chain::traits::message_builders::connection_handshake::CanBuildConnectionOpenInitMessage; use crate::chain::traits::payload_builders::connection_handshake::CanBuildConnectionOpenInitPayload; @@ -34,7 +35,8 @@ where + HasInitConnectionOptionsType + CanBuildConnectionOpenInitMessage + CanQueryClientStateWithLatestHeight - + HasConnectionOpenInitEvent, + + HasConnectionOpenInitEvent + + CanExtractFromMessageResponse, DstChain: CanBuildConnectionOpenInitPayload, SrcChain::ConnectionId: Clone, { @@ -73,7 +75,8 @@ where .await .map_err(Relay::raise_error)?; - let open_init_event = SrcChain::try_extract_connection_open_init_event(&response) + let open_init_event = src_chain + .try_extract_from_message_response(PhantomData, &response) .ok_or_else(|| Relay::raise_error(MissingConnectionInitEventError { relay }))?; let src_connection_id = diff --git a/crates/relayer/relayer-components/src/relay/impls/connection/open_try.rs b/crates/relayer/relayer-components/src/relay/impls/connection/open_try.rs index 1e8f366bf..4725e8132 100644 --- a/crates/relayer/relayer-components/src/relay/impls/connection/open_try.rs +++ b/crates/relayer/relayer-components/src/relay/impls/connection/open_try.rs @@ -2,6 +2,7 @@ use core::fmt::Debug; use core::marker::PhantomData; use cgp::core::error::CanRaiseAsyncError; +use hermes_chain_components::traits::extract_data::CanExtractFromMessageResponse; use crate::chain::traits::message_builders::connection_handshake::CanBuildConnectionOpenTryMessage; use crate::chain::traits::payload_builders::connection_handshake::CanBuildConnectionOpenTryPayload; @@ -51,7 +52,8 @@ where SrcChain: CanQueryChainHeight + CanBuildConnectionOpenTryPayload, DstChain: CanQueryClientStateWithLatestHeight + CanBuildConnectionOpenTryMessage - + HasConnectionOpenTryEvent, + + HasConnectionOpenTryEvent + + CanExtractFromMessageResponse, DstChain::ConnectionId: Clone, { async fn relay_connection_open_try( @@ -99,7 +101,7 @@ where .await?; let open_try_event = dst_chain - .try_extract_connection_open_try_event(&response) + .try_extract_from_message_response(PhantomData, &response) .ok_or_else(|| { Relay::raise_error(MissingConnectionTryEventError { relay, diff --git a/crates/relayer/relayer-components/src/relay/impls/create_client.rs b/crates/relayer/relayer-components/src/relay/impls/create_client.rs index 803e608ed..c0806c9e8 100644 --- a/crates/relayer/relayer-components/src/relay/impls/create_client.rs +++ b/crates/relayer/relayer-components/src/relay/impls/create_client.rs @@ -1,6 +1,8 @@ use core::fmt::Debug; +use core::marker::PhantomData; use cgp::core::error::CanRaiseAsyncError; +use hermes_chain_components::traits::extract_data::CanExtractFromMessageResponse; use hermes_chain_type_components::traits::fields::message_response_events::HasMessageResponseEvents; use crate::chain::traits::message_builders::create_client::CanBuildCreateClientMessage; @@ -60,6 +62,7 @@ where + HasChainId + CanBuildCreateClientMessage + HasCreateClientEvent + + CanExtractFromMessageResponse + HasMessageResponseEvents, CounterpartyChain: HasChainId + CanBuildCreateClientPayload @@ -88,7 +91,8 @@ where .await .map_err(Relay::raise_error)?; - let create_client_event = TargetChain::try_extract_create_client_event(&response) + let create_client_event = target_chain + .try_extract_from_message_response(PhantomData, &response) .ok_or_else(|| { Relay::raise_error(MissingCreateClientEventError { target_chain_id: target_chain.chain_id(), diff --git a/crates/relayer/relayer-components/src/relay/impls/event_relayers/packet_event.rs b/crates/relayer/relayer-components/src/relay/impls/event_relayers/packet_event.rs index 0af71ed85..25b6140fb 100644 --- a/crates/relayer/relayer-components/src/relay/impls/event_relayers/packet_event.rs +++ b/crates/relayer/relayer-components/src/relay/impls/event_relayers/packet_event.rs @@ -1,15 +1,19 @@ +use core::marker::PhantomData; + +use cgp::prelude::HasErrorType; +use hermes_chain_components::traits::extract_data::CanExtractFromEvent; +use hermes_chain_components::traits::packet::from_send_packet::CanBuildPacketFromSendPacket; use hermes_logging_components::traits::has_logger::HasLogger; use hermes_logging_components::traits::logger::CanLog; use crate::chain::traits::packet::from_write_ack::CanBuildPacketFromWriteAck; use crate::chain::traits::types::ibc_events::send_packet::HasSendPacketEvent; -use crate::chain::traits::types::ibc_events::write_ack::HasWriteAckEvent; use crate::chain::types::aliases::{EventOf, HeightOf}; use crate::relay::impls::packet_filters::target::{ MatchPacketDestinationChain, MatchPacketSourceChain, }; use crate::relay::impls::packet_relayers::general::lock::LogSkipRelayLockedPacket; -use crate::relay::traits::chains::{CanRaiseRelayChainErrors, HasRelayClientIds}; +use crate::relay::traits::chains::{CanRaiseRelayChainErrors, HasRelayChains, HasRelayClientIds}; use crate::relay::traits::event_relayer::EventRelayer; use crate::relay::traits::packet_filter::{CanFilterRelayPackets, RelayPacketFilter}; use crate::relay::traits::packet_lock::HasPacketLock; @@ -36,10 +40,16 @@ use crate::relay::traits::target::{DestinationTarget, SourceTarget}; */ pub struct PacketEventRelayer; -impl EventRelayer for PacketEventRelayer +impl EventRelayer for PacketEventRelayer where - Relay: HasRelayClientIds + CanRelayPacket + CanRaiseRelayChainErrors, - Relay::SrcChain: HasSendPacketEvent, + Relay: HasRelayChains + + HasRelayClientIds + + CanRelayPacket + + CanRaiseRelayChainErrors, + SrcChain: HasErrorType + + HasSendPacketEvent + + CanExtractFromEvent + + CanBuildPacketFromSendPacket, MatchPacketDestinationChain: RelayPacketFilter, { async fn relay_chain_event( @@ -47,8 +57,13 @@ where _height: &HeightOf, event: &EventOf, ) -> Result<(), Relay::Error> { - if let Some(send_packet_event) = Relay::SrcChain::try_extract_send_packet_event(event) { - let packet = Relay::SrcChain::extract_packet_from_send_packet_event(&send_packet_event); + let src_chain = relay.src_chain(); + + if let Some(send_packet_event) = src_chain.try_extract_from_event(PhantomData, event) { + let packet = src_chain + .build_packet_from_send_packet_event(&send_packet_event) + .await + .map_err(Relay::raise_error)?; if MatchPacketDestinationChain::should_relay_packet(relay, &packet).await? { relay.relay_packet(&packet).await?; @@ -59,15 +74,18 @@ where } } -impl EventRelayer for PacketEventRelayer +impl EventRelayer for PacketEventRelayer where - Relay: HasRelayClientIds + Relay: HasRelayChains + + HasRelayClientIds + CanRelayAckPacket + CanFilterRelayPackets + HasPacketLock + HasLogger + CanRaiseRelayChainErrors, - Relay::DstChain: CanBuildPacketFromWriteAck, + DstChain: HasErrorType + + CanBuildPacketFromWriteAck + + CanExtractFromEvent, MatchPacketSourceChain: RelayPacketFilter, Relay::Logger: for<'a> CanLog>, { @@ -76,20 +94,24 @@ where height: &HeightOf, event: &EventOf, ) -> Result<(), Relay::Error> { - let m_ack_event = Relay::DstChain::try_extract_write_ack_event(event); + let dst_chain = relay.dst_chain(); + let m_ack_event = dst_chain.try_extract_from_event(PhantomData, event); if let Some(ack_event) = m_ack_event { - let packet = Relay::DstChain::build_packet_from_write_ack_event(&ack_event); + let packet = dst_chain + .build_packet_from_write_ack_event(&ack_event) + .await + .map_err(Relay::raise_error)?; /* First check whether the packet is targetted for the destination chain, then use the packet filter in the relay context, as we skip `CanRelayPacket` which would have done the packet filtering. */ - if MatchPacketSourceChain::should_relay_packet(relay, packet).await? - && relay.should_relay_packet(packet).await? + if MatchPacketSourceChain::should_relay_packet(relay, &packet).await? + && relay.should_relay_packet(&packet).await? { - let m_lock = relay.try_acquire_packet_lock(packet).await; + let m_lock = relay.try_acquire_packet_lock(&packet).await; /* Only relay the ack packet if there isn't another packet relayer @@ -111,20 +133,19 @@ where */ match m_lock { Some(_lock) => { - relay - .relay_ack_packet( - height, - packet, - Relay::DstChain::write_acknowledgement(&ack_event).as_ref(), - ) - .await?; + let ack = dst_chain + .build_ack_from_write_ack_event(&ack_event) + .await + .map_err(Relay::raise_error)?; + + relay.relay_ack_packet(height, &packet, &ack).await?; } None => { relay.logger().log( "skip relaying ack packet, as another packet relayer has acquired the packet lock", &LogSkipRelayLockedPacket { relay, - packet, + packet: &packet, }).await; } } diff --git a/crates/relayer/relayer-components/src/relay/impls/packet_clearers/ack.rs b/crates/relayer/relayer-components/src/relay/impls/packet_clearers/ack.rs index 72966e30f..95a29336a 100644 --- a/crates/relayer/relayer-components/src/relay/impls/packet_clearers/ack.rs +++ b/crates/relayer/relayer-components/src/relay/impls/packet_clearers/ack.rs @@ -1,5 +1,8 @@ use alloc::boxed::Box; +use cgp::core::error::ErrorOf; +use cgp::prelude::CanRaiseAsyncError; +use hermes_chain_components::traits::packet::from_write_ack::CanBuildPacketFromWriteAck; use hermes_logging_components::traits::has_logger::HasLogger; use hermes_logging_components::traits::logger::CanLog; use hermes_runtime_components::traits::runtime::HasRuntime; @@ -32,18 +35,21 @@ where impl Task for RelayPacketTask where - Relay: CanRelayAckPacket + HasLogger, - Relay::DstChain: HasWriteAckEvent, + Relay: CanRelayAckPacket + HasLogger + CanRaiseAsyncError>, + Relay::DstChain: CanBuildPacketFromWriteAck, Relay::Logger: for<'a> CanLog>, { async fn run(self) { + let ack = self + .relay + .dst_chain() + .build_ack_from_write_ack_event(&self.ack) + .await + .unwrap(); + let res = self .relay - .relay_ack_packet( - &self.height, - &self.packet, - Relay::DstChain::write_acknowledgement(&self.ack).as_ref(), - ) + .relay_ack_packet(&self.height, &self.packet, &ack) .await; if let Err(e) = res { diff --git a/crates/relayer/relayer-components/src/relay/impls/packet_relayers/general/default.rs b/crates/relayer/relayer-components/src/relay/impls/packet_relayers/general/default.rs index 27f5b463a..501ed66df 100644 --- a/crates/relayer/relayer-components/src/relay/impls/packet_relayers/general/default.rs +++ b/crates/relayer/relayer-components/src/relay/impls/packet_relayers/general/default.rs @@ -1,5 +1,6 @@ use cgp::prelude::CanRaiseAsyncError; use hermes_chain_components::traits::packet::fields::CanReadPacketFields; +use hermes_chain_components::traits::packet::from_write_ack::CanBuildPacketFromWriteAck; use hermes_chain_components::traits::types::ibc::{HasChannelIdType, HasPortIdType}; use hermes_chain_components::traits::types::timestamp::HasTimeoutType; use hermes_logging_components::traits::has_logger::HasLogger; @@ -40,6 +41,7 @@ where SrcChain: CanQueryChainStatus + CanReadPacketFields, DstChain: CanQueryChainStatus + HasWriteAckEvent + + CanBuildPacketFromWriteAck + HasChannelIdType + HasPortIdType + HasTimeoutType, diff --git a/crates/relayer/relayer-components/src/relay/impls/packet_relayers/general/full_relay.rs b/crates/relayer/relayer-components/src/relay/impls/packet_relayers/general/full_relay.rs index fb6ab2a72..68a59d995 100644 --- a/crates/relayer/relayer-components/src/relay/impls/packet_relayers/general/full_relay.rs +++ b/crates/relayer/relayer-components/src/relay/impls/packet_relayers/general/full_relay.rs @@ -2,6 +2,7 @@ use cgp::prelude::CanRaiseAsyncError; use hermes_chain_components::traits::packet::fields::{ HasPacketTimeoutHeight, HasPacketTimeoutTimestamp, }; +use hermes_chain_components::traits::packet::from_write_ack::CanBuildPacketFromWriteAck; use hermes_chain_components::traits::types::ibc::{HasChannelIdType, HasPortIdType}; use hermes_chain_components::traits::types::timestamp::HasTimeoutType; use hermes_logging_components::traits::has_logger::HasLogger; @@ -49,6 +50,7 @@ where + HasPacketTimeoutTimestamp, DstChain: CanQueryChainStatus + HasWriteAckEvent + + CanBuildPacketFromWriteAck + HasChannelIdType + HasPortIdType + HasTimeoutType, @@ -129,7 +131,7 @@ where let destination_height = DstChain::chain_status_height(&destination_status); - if let Some(ack) = write_ack { + if let Some(ack_event) = write_ack { logger .log( "relaying ack packet", @@ -141,12 +143,13 @@ where ) .await; + let ack = dst_chain + .build_ack_from_write_ack_event(&ack_event) + .await + .map_err(Relay::raise_error)?; + relay - .relay_ack_packet( - destination_height, - packet, - DstChain::write_acknowledgement(&ack).as_ref(), - ) + .relay_ack_packet(destination_height, packet, &ack) .await?; } else { logger diff --git a/crates/relayer/relayer-components/src/relay/impls/packet_relayers/receive/base_receive_packet.rs b/crates/relayer/relayer-components/src/relay/impls/packet_relayers/receive/base_receive_packet.rs index b7fd7f020..5502156c6 100644 --- a/crates/relayer/relayer-components/src/relay/impls/packet_relayers/receive/base_receive_packet.rs +++ b/crates/relayer/relayer-components/src/relay/impls/packet_relayers/receive/base_receive_packet.rs @@ -1,5 +1,6 @@ use core::marker::PhantomData; +use hermes_chain_components::traits::extract_data::CanExtractFromEvent; use hermes_chain_type_components::traits::fields::message_response_events::HasMessageResponseEvents; use crate::chain::traits::message_builders::receive_packet::CanBuildReceivePacketMessage; @@ -27,15 +28,17 @@ where Relay::DstChain: CanQueryClientStateWithLatestHeight + CanBuildReceivePacketMessage + HasMessageResponseEvents - + HasWriteAckEvent, + + HasWriteAckEvent + + CanExtractFromEvent, { async fn relay_receive_packet( relay: &Relay, source_height: &HeightOf, packet: &PacketOf, ) -> Result, Relay::Error> { - let src_client_state = relay - .dst_chain() + let dst_chain = relay.dst_chain(); + + let src_client_state = dst_chain .query_client_state_with_latest_height(PhantomData, relay.dst_client_id()) .await .map_err(Relay::raise_error)?; @@ -46,8 +49,7 @@ where .await .map_err(Relay::raise_error)?; - let message = relay - .dst_chain() + let message = dst_chain .build_receive_packet_message(packet, payload) .await .map_err(Relay::raise_error)?; @@ -56,7 +58,7 @@ where let ack_event = Relay::DstChain::message_response_events(&response) .iter() - .find_map(Relay::DstChain::try_extract_write_ack_event); + .find_map(|event| dst_chain.try_extract_from_event(PhantomData, event)); Ok(ack_event) } diff --git a/crates/relayer/relayer-components/src/relay/traits/chains/types.rs b/crates/relayer/relayer-components/src/relay/traits/chains/types.rs index 738ffc010..1b2c04c08 100644 --- a/crates/relayer/relayer-components/src/relay/traits/chains/types.rs +++ b/crates/relayer/relayer-components/src/relay/traits/chains/types.rs @@ -1,4 +1,4 @@ -use cgp::prelude::HasAsyncErrorType; +use cgp::prelude::{HasAsyncErrorType, HasErrorType}; use hermes_chain_components::traits::types::packet::HasOutgoingPacketType; use crate::chain::traits::types::ibc::HasIbcChainTypes; @@ -30,10 +30,10 @@ where pub trait HasRelayChainTypes: HasAsyncErrorType + HasSrcChainType< - SrcChain: HasAsyncErrorType + SrcChain: HasErrorType + HasIbcChainTypes + HasOutgoingPacketType, - > + HasDstChainType> + > + HasDstChainType> { } @@ -42,8 +42,8 @@ where Relay: HasChainTypeAt + HasChainTypeAt + HasAsyncErrorType, - SrcChain: HasAsyncErrorType + HasIbcChainTypes + HasOutgoingPacketType, - DstChain: HasAsyncErrorType + HasIbcChainTypes, + SrcChain: HasErrorType + HasIbcChainTypes + HasOutgoingPacketType, + DstChain: HasErrorType + HasIbcChainTypes, { } diff --git a/crates/runtime/async-runtime-components/src/channel/impls.rs b/crates/runtime/async-runtime-components/src/channel/impls.rs index 1490b7f59..faa8deff4 100644 --- a/crates/runtime/async-runtime-components/src/channel/impls.rs +++ b/crates/runtime/async-runtime-components/src/channel/impls.rs @@ -10,7 +10,7 @@ use hermes_runtime_components::traits::channel::{ }; use crate::channel::traits::{HasUnboundedChannelType, UnboundedChannelTypeProvider}; -use crate::channel::types::ChannelClosedError; +use crate::channel::types::ErrChannelClosed; use crate::stream::traits::boxed::HasBoxedStreamType; pub struct ProvideUnboundedChannelType; @@ -90,7 +90,7 @@ where impl ChannelUser for ProvideUnboundedChannelType where - Runtime: HasUnboundedChannelType + CanRaiseAsyncError, + Runtime: HasUnboundedChannelType + CanRaiseAsyncError, { async fn send(sender: &Runtime::Sender, value: T) -> Result<(), Runtime::Error> where @@ -100,7 +100,7 @@ where .lock() .await .unbounded_send(value) - .map_err(|_| Runtime::raise_error(ChannelClosedError)) + .map_err(|_| Runtime::raise_error(ErrChannelClosed)) } async fn receive(receiver: &mut Runtime::Receiver) -> Result @@ -110,7 +110,7 @@ where Runtime::to_unbounded_receiver_ref(receiver) .next() .await - .ok_or(Runtime::raise_error(ChannelClosedError)) + .ok_or(Runtime::raise_error(ErrChannelClosed)) } fn try_receive(receiver: &mut Runtime::Receiver) -> Result, Runtime::Error> @@ -123,7 +123,7 @@ where match res { Ok(Some(res)) => Ok(Some(res)), // Ok(None) means that the channel is closed - Ok(None) => Err(Runtime::raise_error(ChannelClosedError)), + Ok(None) => Err(Runtime::raise_error(ErrChannelClosed)), // Error means that there is no meesage currently available Err(_) => Ok(None), } diff --git a/crates/runtime/async-runtime-components/src/channel/types.rs b/crates/runtime/async-runtime-components/src/channel/types.rs index 79075280b..c8702876d 100644 --- a/crates/runtime/async-runtime-components/src/channel/types.rs +++ b/crates/runtime/async-runtime-components/src/channel/types.rs @@ -1 +1,2 @@ -pub struct ChannelClosedError; +#[derive(Debug)] +pub struct ErrChannelClosed; diff --git a/crates/runtime/async-runtime-components/src/channel_once/impls.rs b/crates/runtime/async-runtime-components/src/channel_once/impls.rs index 4c9c4534b..5806c0ab0 100644 --- a/crates/runtime/async-runtime-components/src/channel_once/impls.rs +++ b/crates/runtime/async-runtime-components/src/channel_once/impls.rs @@ -4,7 +4,7 @@ use hermes_runtime_components::traits::channel_once::{ ChannelOnceCreator, ChannelOnceUser, ProvideChannelOnceType, }; -use crate::channel::types::ChannelClosedError; +use crate::channel::types::ErrChannelClosed; use crate::channel_once::traits::{HasOneShotChannelType, OneShotChannelTypeProvider}; pub struct ProvideOneShotChannelType; @@ -76,7 +76,7 @@ where impl ChannelOnceUser for ProvideOneShotChannelType where - Runtime: HasOneShotChannelType + CanRaiseAsyncError, + Runtime: HasOneShotChannelType + CanRaiseAsyncError, { fn send_once(sender: Runtime::SenderOnce, value: T) -> Result<(), Runtime::Error> where @@ -84,7 +84,7 @@ where { Runtime::to_oneshot_sender(sender) .send(value) - .map_err(|_| Runtime::raise_error(ChannelClosedError)) + .map_err(|_| Runtime::raise_error(ErrChannelClosed)) } async fn receive_once(receiver: Runtime::ReceiverOnce) -> Result @@ -93,6 +93,6 @@ where { Runtime::to_oneshot_receiver(receiver) .await - .map_err(|_| Runtime::raise_error(ChannelClosedError)) + .map_err(|_| Runtime::raise_error(ErrChannelClosed)) } } diff --git a/crates/runtime/runtime/src/impls/runtime/error.rs b/crates/runtime/runtime/src/impls/runtime/error.rs index 94c26fbcf..914e5e475 100644 --- a/crates/runtime/runtime/src/impls/runtime/error.rs +++ b/crates/runtime/runtime/src/impls/runtime/error.rs @@ -4,7 +4,7 @@ use std::io::Error as IoError; use std::process::ExitStatus; use cgp::core::error::{ErrorRaiser, ProvideErrorType}; -use hermes_async_runtime_components::channel::types::ChannelClosedError; +use hermes_async_runtime_components::channel::types::ErrChannelClosed; use hermes_tokio_runtime_components::impls::os::child_process::PrematureChildProcessExitError; use hermes_tokio_runtime_components::impls::os::exec_command::{ CommandNotFound, ExecCommandFailure, @@ -46,8 +46,8 @@ impl ErrorRaiser for HermesRuntimeComponents { } } -impl ErrorRaiser for HermesRuntimeComponents { - fn raise_error(_e: ChannelClosedError) -> TokioRuntimeError { +impl ErrorRaiser for HermesRuntimeComponents { + fn raise_error(_e: ErrChannelClosed) -> TokioRuntimeError { TokioRuntimeError::ChannelClosed } } diff --git a/crates/runtime/tokio-runtime-components/src/impls/channel.rs b/crates/runtime/tokio-runtime-components/src/impls/channel.rs index 57c45f17c..1c073becf 100644 --- a/crates/runtime/tokio-runtime-components/src/impls/channel.rs +++ b/crates/runtime/tokio-runtime-components/src/impls/channel.rs @@ -1,5 +1,5 @@ use cgp::prelude::*; -use hermes_async_runtime_components::channel::types::ChannelClosedError; +use hermes_async_runtime_components::channel::types::ErrChannelClosed; use hermes_async_runtime_components::stream::traits::boxed::HasBoxedStreamType; use hermes_runtime_components::traits::channel::{ ChannelCreator, ChannelUser, ProvideChannelType, ReceiverStreamer, SenderCloner, @@ -86,7 +86,7 @@ where impl ChannelUser for ProvideUnboundedChannelType where - Runtime: HasUnboundedChannelType + CanRaiseAsyncError, + Runtime: HasUnboundedChannelType + CanRaiseAsyncError, { async fn send(sender: &Runtime::Sender, value: T) -> Result<(), Runtime::Error> where @@ -94,7 +94,7 @@ where { Runtime::to_unbounded_sender_ref(sender) .send(value) - .map_err(|_| Runtime::raise_error(ChannelClosedError)) + .map_err(|_| Runtime::raise_error(ErrChannelClosed)) } async fn receive(receiver: &mut Runtime::Receiver) -> Result @@ -104,7 +104,7 @@ where Runtime::to_unbounded_receiver_ref(receiver) .recv() .await - .ok_or(Runtime::raise_error(ChannelClosedError)) + .ok_or(Runtime::raise_error(ErrChannelClosed)) } fn try_receive(receiver: &mut Runtime::Receiver) -> Result, Runtime::Error> @@ -115,7 +115,7 @@ where Ok(batch) => Ok(Some(batch)), Err(mpsc::error::TryRecvError::Empty) => Ok(None), Err(mpsc::error::TryRecvError::Disconnected) => { - Err(Runtime::raise_error(ChannelClosedError)) + Err(Runtime::raise_error(ErrChannelClosed)) } } } diff --git a/crates/solomachine/solomachine-chain-components/src/components/solomachine.rs b/crates/solomachine/solomachine-chain-components/src/components/solomachine.rs index d2a5bbc71..b285028b2 100644 --- a/crates/solomachine/solomachine-chain-components/src/components/solomachine.rs +++ b/crates/solomachine/solomachine-chain-components/src/components/solomachine.rs @@ -17,11 +17,12 @@ pub use hermes_cosmos_chain_components::components::client::{ pub use hermes_cosmos_chain_components::impls::client::update_client_message::BuildCosmosUpdateClientMessage; pub use hermes_cosmos_chain_components::impls::packet::packet_fields::CosmosPacketFieldReader; pub use hermes_cosmos_chain_components::impls::types::chain::ProvideCosmosChainTypes; +use hermes_cosmos_relayer::presets::chain::ExtractFromMessageResponseViaEvents; pub use hermes_cosmos_relayer::presets::chain::{ - PacketDstChannelIdGetterComponent, PacketDstPortIdGetterComponent, - PacketSequenceGetterComponent, PacketSrcChannelIdGetterComponent, - PacketSrcPortIdGetterComponent, PacketTimeoutHeightGetterComponent, - PacketTimeoutTimestampGetterComponent, + EventExtractorComponent, MessageResponseExtractorComponent, PacketDstChannelIdGetterComponent, + PacketDstPortIdGetterComponent, PacketSequenceGetterComponent, + PacketSrcChannelIdGetterComponent, PacketSrcPortIdGetterComponent, + PacketTimeoutHeightGetterComponent, PacketTimeoutTimestampGetterComponent, }; pub use hermes_encoding_components::impls::default_encoding::GetDefaultEncoding; pub use hermes_encoding_components::traits::has_encoding::EncodingGetterComponent; @@ -115,6 +116,7 @@ cgp_preset! { TimeoutUnorderedPacketPayloadTypeComponent, CreateClientEventComponent, ConnectionOpenInitEventComponent, + EventExtractorComponent, ]: ProvideSolomachineChainTypes, [ @@ -136,6 +138,8 @@ cgp_preset! { CosmosPacketFieldReader, MessageSenderComponent: ProcessSolomachineMessages, + MessageResponseExtractorComponent: + ExtractFromMessageResponseViaEvents, ChainStatusQuerierComponent: QuerySolomachineStatus, [ diff --git a/crates/solomachine/solomachine-chain-components/src/impls/solomachine/types.rs b/crates/solomachine/solomachine-chain-components/src/impls/solomachine/types.rs index f8950f6a9..de2de9519 100644 --- a/crates/solomachine/solomachine-chain-components/src/impls/solomachine/types.rs +++ b/crates/solomachine/solomachine-chain-components/src/impls/solomachine/types.rs @@ -1,10 +1,14 @@ +use core::marker::PhantomData; + use cgp::prelude::*; use hermes_chain_type_components::impls::types::message_response::UseEventsMessageResponse; +use hermes_chain_type_components::traits::types::event::HasEventType; use hermes_chain_type_components::traits::types::message_response::HasMessageResponseType; use hermes_cosmos_chain_components::components::client::{ MessageResponseEventsGetterComponent, MessageResponseTypeComponent, }; use hermes_relayer_components::chain::traits::commitment_prefix::ProvideCommitmentPrefixType; +use hermes_relayer_components::chain::traits::extract_data::EventExtractor; use hermes_relayer_components::chain::traits::types::channel::{ ProvideChannelEndType, ProvideChannelOpenAckPayloadType, ProvideChannelOpenConfirmPayloadType, ProvideChannelOpenTryPayloadType, ProvideInitChannelOptionsType, @@ -226,17 +230,24 @@ where { type CreateClientEvent = SolomachineCreateClientEvent; - fn try_extract_create_client_event( - events: &Vec, + fn create_client_event_client_id(event: &SolomachineCreateClientEvent) -> &ClientId { + &event.client_id + } +} + +impl EventExtractor for ProvideSolomachineChainTypes +where + Chain: HasEventType, +{ + fn try_extract_from_event( + _chain: &Chain, + _tag: PhantomData, + event: &SolomachineEvent, ) -> Option { - events.iter().find_map(|event| match event { + match event { SolomachineEvent::CreateClient(e) => Some(e.clone()), _ => None, - }) - } - - fn create_client_event_client_id(event: &SolomachineCreateClientEvent) -> &ClientId { - &event.client_id + } } } @@ -248,18 +259,25 @@ where { type ConnectionOpenInitEvent = SolomachineConnectionInitEvent; - fn try_extract_connection_open_init_event( - events: &Vec, - ) -> Option { - events.iter().find_map(|event| match event { - SolomachineEvent::ConnectionInit(e) => Some(e.clone()), - _ => None, - }) - } - fn connection_open_init_event_connection_id( event: &Self::ConnectionOpenInitEvent, ) -> &ConnectionId { &event.connection_id } } + +impl EventExtractor for ProvideSolomachineChainTypes +where + Chain: HasEventType, +{ + fn try_extract_from_event( + _chain: &Chain, + _tag: PhantomData, + event: &SolomachineEvent, + ) -> Option { + match event { + SolomachineEvent::ConnectionInit(e) => Some(e.clone()), + _ => None, + } + } +} diff --git a/crates/test/test-components/src/chain/impls/ibc_transfer.rs b/crates/test/test-components/src/chain/impls/ibc_transfer.rs index d5ce892d3..c156ebf37 100644 --- a/crates/test/test-components/src/chain/impls/ibc_transfer.rs +++ b/crates/test/test-components/src/chain/impls/ibc_transfer.rs @@ -1,5 +1,9 @@ +use core::marker::PhantomData; + use cgp::core::error::CanRaiseAsyncError; use hermes_chain_type_components::traits::fields::message_response_events::HasMessageResponseEvents; +use hermes_relayer_components::chain::traits::extract_data::CanExtractFromEvent; +use hermes_relayer_components::chain::traits::packet::from_send_packet::CanBuildPacketFromSendPacket; use hermes_relayer_components::chain::traits::queries::chain_status::CanQueryChainStatus; use hermes_relayer_components::chain::traits::types::ibc::HasIbcChainTypes; use hermes_relayer_components::chain::traits::types::ibc_events::send_packet::HasSendPacketEvent; @@ -30,6 +34,8 @@ where + CanBuildIbcTokenTransferMessage + HasIbcChainTypes + HasSendPacketEvent + + CanBuildPacketFromSendPacket + + CanExtractFromEvent + CanRaiseAsyncError + CanSendSingleMessageWithSigner, Counterparty: HasAddressType, @@ -71,10 +77,12 @@ where let send_packet_event = Chain::message_response_events(&response) .iter() - .find_map(Chain::try_extract_send_packet_event) + .find_map(|event| chain.try_extract_from_event(PhantomData, event)) .ok_or_else(|| Chain::raise_error(MissingSendPacketEventError))?; - let packet = Chain::extract_packet_from_send_packet_event(&send_packet_event); + let packet = chain + .build_packet_from_send_packet_event(&send_packet_event) + .await?; Ok(packet) }