diff --git a/crates/chain/chain-components/src/traits/queries/consensus_state.rs b/crates/chain/chain-components/src/traits/queries/consensus_state.rs index 78ad87c50..44c67d8e0 100644 --- a/crates/chain/chain-components/src/traits/queries/consensus_state.rs +++ b/crates/chain/chain-components/src/traits/queries/consensus_state.rs @@ -93,16 +93,16 @@ where #[async_trait] pub trait CanQueryConsensusStateWithLatestHeight: - HasClientIdType + HasErrorType -where - Counterparty: HasConsensusStateType + HasHeightType, + HasClientIdType + + CanUseCounterparty + HasHeightType> + + HasErrorType { async fn query_consensus_state_with_latest_height( &self, tag: PhantomData, client_id: &Self::ClientId, - consensus_height: &Counterparty::Height, - ) -> Result; + consensus_height: &HeightOf, + ) -> Result, Self::Error>; } impl CanQueryConsensusStateWithLatestHeight for Chain diff --git a/crates/cosmos/cosmos-relayer/src/contexts/relay.rs b/crates/cosmos/cosmos-relayer/src/contexts/relay.rs index 3168cf4df..e8d5ef96d 100644 --- a/crates/cosmos/cosmos-relayer/src/contexts/relay.rs +++ b/crates/cosmos/cosmos-relayer/src/contexts/relay.rs @@ -16,13 +16,16 @@ use hermes_relayer_components::error::traits::retry::{ MaxErrorRetryGetterComponent, RetryableErrorComponent, }; use hermes_relayer_components::multi::traits::chain_at::{ - ChainGetterAtComponent, ChainTypeAtComponent, + ChainAt, ChainGetterAtComponent, ChainTypeAtComponent, }; use hermes_relayer_components::multi::traits::client_id_at::ClientIdAtGetterComponent; +use hermes_relayer_components::multi::traits::relay_at::ClientIdAt; +use hermes_relayer_components::multi::types::index::Index; use hermes_relayer_components::multi::types::tags::{Dst, Src}; use hermes_relayer_components::relay::impls::packet_lock::{ PacketMutexGetterComponent, PacketMutexOf, ProvidePacketLockWithMutex, }; +use hermes_relayer_components::relay::impls::selector::SelectRelayAToB; use hermes_relayer_components::relay::traits::auto_relayer::CanAutoRelay; use hermes_relayer_components::relay::traits::chains::HasRelayClientIds; use hermes_relayer_components::relay::traits::client_creator::CanCreateClient; @@ -39,7 +42,9 @@ use hermes_relayer_components_extra::components::extra::relay::{ ExtraRelayPreset, IsExtraRelayPreset, }; use hermes_runtime::types::runtime::HermesRuntime; -use hermes_runtime_components::traits::runtime::{RuntimeGetterComponent, RuntimeTypeComponent}; +use hermes_runtime_components::traits::runtime::{ + RuntimeGetterComponent, RuntimeOf, RuntimeTypeComponent, +}; use ibc::core::host::types::identifiers::ClientId; use crate::contexts::chain::CosmosChain; @@ -52,14 +57,14 @@ pub struct CosmosRelay { #[derive(HasField)] pub struct CosmosRelayFields { - pub runtime: HermesRuntime, - pub src_chain: CosmosChain, - pub dst_chain: CosmosChain, - pub src_client_id: ClientId, - pub dst_client_id: ClientId, + pub runtime: RuntimeOf, + pub chain_a: ChainAt>, + pub chain_b: ChainAt>, + pub client_id_a: ClientIdAt, Index<1>>, + pub client_id_b: ClientIdAt, Index<0>>, pub packet_lock_mutex: PacketMutexOf, - pub src_chain_message_batch_sender: MessageBatchSenderOf, - pub dst_chain_message_batch_sender: MessageBatchSenderOf, + pub message_batch_sender_a: MessageBatchSenderOf>, + pub message_batch_sender_b: MessageBatchSenderOf>, } pub trait HasCosmosRelayFields: Send + Sync + 'static { @@ -93,12 +98,12 @@ impl CosmosRelay { let relay = Self { fields: Arc::new(CosmosRelayFields { runtime, - src_chain, - dst_chain, - src_client_id, - dst_client_id, - src_chain_message_batch_sender, - dst_chain_message_batch_sender, + chain_a: src_chain, + chain_b: dst_chain, + client_id_a: src_client_id, + client_id_b: dst_client_id, + message_batch_sender_a: src_chain_message_batch_sender, + message_batch_sender_b: dst_chain_message_batch_sender, packet_lock_mutex: Arc::new(Mutex::new(BTreeSet::new())), }), }; @@ -120,8 +125,8 @@ delegate_components! { RuntimeTypeComponent: WithType, RuntimeGetterComponent: WithField, [ - ChainTypeAtComponent, - ChainTypeAtComponent, + ChainTypeAtComponent>, + ChainTypeAtComponent>, ]: WithType, [ @@ -134,20 +139,29 @@ delegate_components! { ReturnMaxRetry<3>, PacketLockComponent: ProvidePacketLockWithMutex, - ChainGetterAtComponent: - UseField, - ChainGetterAtComponent: - UseField, + ChainGetterAtComponent>: + UseField, + ChainGetterAtComponent>: + UseField, ClientIdAtGetterComponent: - UseField, + UseField, ClientIdAtGetterComponent: - UseField, + UseField, PacketMutexGetterComponent: UseField, - MessageBatchSenderGetterComponent: - UseField, - MessageBatchSenderGetterComponent: - UseField, + MessageBatchSenderGetterComponent>: + UseField, + MessageBatchSenderGetterComponent>: + UseField, + [ + ChainTypeAtComponent, + ChainTypeAtComponent, + ChainGetterAtComponent, + ChainGetterAtComponent, + MessageBatchSenderGetterComponent, + MessageBatchSenderGetterComponent, + ]: + SelectRelayAToB, } } diff --git a/crates/relayer/relayer-components-extra/src/batch/traits/channel.rs b/crates/relayer/relayer-components-extra/src/batch/traits/channel.rs index 57f41fc6e..ae1d897b4 100644 --- a/crates/relayer/relayer-components-extra/src/batch/traits/channel.rs +++ b/crates/relayer/relayer-components-extra/src/batch/traits/channel.rs @@ -2,6 +2,8 @@ use core::marker::PhantomData; use cgp::core::field::impls::use_field::UseField; use cgp::prelude::*; +use hermes_relayer_components::multi::types::tags::{Dst, Src}; +use hermes_relayer_components::relay::impls::selector::SelectRelayChains; use crate::batch::traits::types::HasMessageBatchChannelTypes; @@ -26,3 +28,25 @@ where context.get_field(PhantomData) } } + +impl MessageBatchSenderGetter + for SelectRelayChains +where + Relay: HasMessageBatchSender + + HasMessageBatchChannelTypes, +{ + fn get_batch_sender(context: &Relay, _tag: PhantomData) -> &Sender { + context.get_batch_sender(PhantomData::) + } +} + +impl MessageBatchSenderGetter + for SelectRelayChains +where + Relay: HasMessageBatchSender + + HasMessageBatchChannelTypes, +{ + fn get_batch_sender(context: &Relay, _tag: PhantomData) -> &Sender { + context.get_batch_sender(PhantomData::) + } +} diff --git a/crates/relayer/relayer-components-extra/src/components/extra/relay.rs b/crates/relayer/relayer-components-extra/src/components/extra/relay.rs index 22d5d611d..08eef65bd 100644 --- a/crates/relayer/relayer-components-extra/src/components/extra/relay.rs +++ b/crates/relayer/relayer-components-extra/src/components/extra/relay.rs @@ -3,14 +3,10 @@ use cgp::prelude::*; pub use hermes_relayer_components::components::default::relay::*; use hermes_relayer_components::relay::impls::message_senders::chain_sender::SendIbcMessagesToChain; use hermes_relayer_components::relay::impls::message_senders::update_client::SendIbcMessagesWithUpdateClient; -use hermes_relayer_components::relay::impls::packet_relayers::general::filter_relayer::FilterRelayer; -use hermes_relayer_components::relay::impls::packet_relayers::general::full_relay::FullCycleRelayer; -use hermes_relayer_components::relay::impls::packet_relayers::general::lock::LockPacketRelayer; -use hermes_relayer_components::relay::impls::packet_relayers::general::log::LoggerRelayer; use crate::batch::impls::message_sender::SendMessagesToBatchWorker; pub use crate::batch::types::sink::BatchWorkerSink; -use crate::relay::components::packet_relayers::retry::RetryRelayer; +use crate::relay::impls::packet_relayers::extra::ExtraPacketRelayer; with_default_relay_preset! { [ @@ -24,7 +20,7 @@ with_default_relay_preset! { IbcMessageSenderComponent: SendIbcMessagesWithUpdateClient, PacketRelayerComponent: - LockPacketRelayer>>>, + ExtraPacketRelayer, Components: DefaultRelayPreset, } diff --git a/crates/relayer/relayer-components-extra/src/relay/components/mod.rs b/crates/relayer/relayer-components-extra/src/relay/impls/mod.rs similarity index 100% rename from crates/relayer/relayer-components-extra/src/relay/components/mod.rs rename to crates/relayer/relayer-components-extra/src/relay/impls/mod.rs 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 new file mode 100644 index 000000000..fc5949a3e --- /dev/null +++ b/crates/relayer/relayer-components-extra/src/relay/impls/packet_relayers/extra.rs @@ -0,0 +1,62 @@ +use cgp::prelude::CanRaiseError; +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::CanReadOutgoingPacketFields; +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; +use hermes_relayer_components::error::impls::error::MaxRetryExceededError; +use hermes_relayer_components::error::traits::retry::{HasMaxErrorRetry, HasRetryableError}; +use hermes_relayer_components::relay::impls::packet_relayers::general::filter_relayer::FilterRelayer; +use hermes_relayer_components::relay::impls::packet_relayers::general::full_relay::{ + FullCycleRelayer, LogRelayPacketAction, +}; +use hermes_relayer_components::relay::impls::packet_relayers::general::lock::{ + LockPacketRelayer, LogSkipRelayLockedPacket, +}; +use hermes_relayer_components::relay::impls::packet_relayers::general::log::{ + LogRelayPacketStatus, LoggerRelayer, +}; +use hermes_relayer_components::relay::traits::chains::{HasRelayChains, HasRelayPacketType}; +use hermes_relayer_components::relay::traits::packet_filter::CanFilterRelayPackets; +use hermes_relayer_components::relay::traits::packet_lock::HasPacketLock; +use hermes_relayer_components::relay::traits::packet_relayer::PacketRelayer; +use hermes_relayer_components::relay::traits::packet_relayers::ack_packet::CanRelayAckPacket; +use hermes_relayer_components::relay::traits::packet_relayers::receive_packet::CanRelayReceivePacket; +use hermes_relayer_components::relay::traits::packet_relayers::timeout_unordered_packet::CanRelayTimeoutUnorderedPacket; + +use crate::relay::impls::packet_relayers::retry::RetryRelayer; + +pub struct ExtraPacketRelayer; + +impl PacketRelayer for ExtraPacketRelayer +where + Relay: CanRelayAckPacket + + CanRelayReceivePacket + + CanRelayTimeoutUnorderedPacket + + HasLogger + + HasRelayChains + + HasRelayPacketType + + CanFilterRelayPackets + + HasPacketLock + + HasMaxErrorRetry + + HasRetryableError + + CanRaiseError + + CanRaiseError + + for<'a> CanRaiseError>, + SrcChain: CanQueryChainStatus + CanReadOutgoingPacketFields, + DstChain: CanQueryChainStatus + + HasWriteAckEvent + + HasChannelIdType + + HasPortIdType + + HasTimeoutType, + Relay::Logger: for<'a> CanLog> + + for<'a> CanLog> + + for<'a> CanLog>, +{ + async fn relay_packet(relay: &Relay, packet: &Relay::Packet) -> Result<(), Relay::Error> { + >>>>:: + relay_packet(relay, packet).await + } +} diff --git a/crates/relayer/relayer-components-extra/src/relay/components/packet_relayers/mod.rs b/crates/relayer/relayer-components-extra/src/relay/impls/packet_relayers/mod.rs similarity index 50% rename from crates/relayer/relayer-components-extra/src/relay/components/packet_relayers/mod.rs rename to crates/relayer/relayer-components-extra/src/relay/impls/packet_relayers/mod.rs index f53ac7233..08a23c0ac 100644 --- a/crates/relayer/relayer-components-extra/src/relay/components/packet_relayers/mod.rs +++ b/crates/relayer/relayer-components-extra/src/relay/impls/packet_relayers/mod.rs @@ -1 +1,2 @@ +pub mod extra; pub mod retry; diff --git a/crates/relayer/relayer-components-extra/src/relay/components/packet_relayers/retry.rs b/crates/relayer/relayer-components-extra/src/relay/impls/packet_relayers/retry.rs similarity index 100% rename from crates/relayer/relayer-components-extra/src/relay/components/packet_relayers/retry.rs rename to crates/relayer/relayer-components-extra/src/relay/impls/packet_relayers/retry.rs diff --git a/crates/relayer/relayer-components-extra/src/relay/mod.rs b/crates/relayer/relayer-components-extra/src/relay/mod.rs index f188f2c26..b132bc255 100644 --- a/crates/relayer/relayer-components-extra/src/relay/mod.rs +++ b/crates/relayer/relayer-components-extra/src/relay/mod.rs @@ -1 +1 @@ -pub mod components; +pub mod impls; diff --git a/crates/relayer/relayer-components/src/components/default/relay.rs b/crates/relayer/relayer-components/src/components/default/relay.rs index 5bb2aa201..049aef831 100644 --- a/crates/relayer/relayer-components/src/components/default/relay.rs +++ b/crates/relayer/relayer-components/src/components/default/relay.rs @@ -20,16 +20,11 @@ use crate::relay::impls::message_senders::update_client::SendIbcMessagesWithUpda use crate::relay::impls::packet_clearers::packets::ClearAllPackets; use crate::relay::impls::packet_filters::chain::FilterRelayPacketWithChains; use crate::relay::impls::packet_relayers::ack::base_ack_packet::BaseAckPacketRelayer; -use crate::relay::impls::packet_relayers::general::filter_relayer::FilterRelayer; -use crate::relay::impls::packet_relayers::general::full_relay::FullCycleRelayer; -use crate::relay::impls::packet_relayers::general::lock::LockPacketRelayer; -use crate::relay::impls::packet_relayers::general::log::LoggerRelayer; +use crate::relay::impls::packet_relayers::general::default::DefaultPacketRelayer; use crate::relay::impls::packet_relayers::receive::base_receive_packet::BaseReceivePacketRelayer; use crate::relay::impls::packet_relayers::receive::skip_received_packet::SkipReceivedPacketRelayer; use crate::relay::impls::packet_relayers::timeout_unordered::timeout_unordered_packet::BaseTimeoutUnorderedPacketRelayer; -use crate::relay::impls::update_client::build::BuildUpdateClientMessages; -use crate::relay::impls::update_client::skip::SkipUpdateClient; -use crate::relay::impls::update_client::wait::WaitUpdateClient; +use crate::relay::impls::update_client::default::DefaultTargetUpdateClientMessageBuilder; pub use crate::relay::traits::auto_relayer::AutoRelayerComponent; pub use crate::relay::traits::channel::open_ack::ChannelOpenAckRelayerComponent; pub use crate::relay::traits::channel::open_confirm::ChannelOpenConfirmRelayerComponent; @@ -55,8 +50,8 @@ pub use crate::relay::traits::update_client_message_builder::TargetUpdateClientM cgp_preset! { DefaultRelayPreset { IbcMessageSenderComponent: SendIbcMessagesWithUpdateClient, - TargetUpdateClientMessageBuilderComponent: SkipUpdateClient>, - PacketRelayerComponent: LockPacketRelayer>>, + TargetUpdateClientMessageBuilderComponent: DefaultTargetUpdateClientMessageBuilder, + PacketRelayerComponent: DefaultPacketRelayer, ReceivePacketRelayerComponent: SkipReceivedPacketRelayer, AckPacketRelayerComponent: BaseAckPacketRelayer, TimeoutUnorderedPacketRelayerComponent: BaseTimeoutUnorderedPacketRelayer, diff --git a/crates/relayer/relayer-components/src/relay/impls/mod.rs b/crates/relayer/relayer-components/src/relay/impls/mod.rs index f592c3e93..5a80b5d55 100644 --- a/crates/relayer/relayer-components/src/relay/impls/mod.rs +++ b/crates/relayer/relayer-components/src/relay/impls/mod.rs @@ -8,4 +8,5 @@ pub mod packet_clearers; pub mod packet_filters; pub mod packet_lock; pub mod packet_relayers; +pub mod selector; pub mod update_client; 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 new file mode 100644 index 000000000..ac8ab4a0e --- /dev/null +++ b/crates/relayer/relayer-components/src/relay/impls/packet_relayers/general/default.rs @@ -0,0 +1,56 @@ +use cgp::prelude::CanRaiseError; +use hermes_chain_components::traits::packet::fields::CanReadOutgoingPacketFields; +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; +use hermes_logging_components::traits::logger::CanLog; + +use crate::chain::traits::queries::chain_status::CanQueryChainStatus; +use crate::chain::traits::types::ibc_events::write_ack::HasWriteAckEvent; +use crate::relay::impls::packet_relayers::general::filter_relayer::FilterRelayer; +use crate::relay::impls::packet_relayers::general::full_relay::{ + FullCycleRelayer, LogRelayPacketAction, +}; +use crate::relay::impls::packet_relayers::general::lock::{ + LockPacketRelayer, LogSkipRelayLockedPacket, +}; +use crate::relay::impls::packet_relayers::general::log::{LogRelayPacketStatus, LoggerRelayer}; +use crate::relay::traits::chains::{HasRelayChains, HasRelayPacketType}; +use crate::relay::traits::packet_filter::CanFilterRelayPackets; +use crate::relay::traits::packet_lock::HasPacketLock; +use crate::relay::traits::packet_relayer::PacketRelayer; +use crate::relay::traits::packet_relayers::ack_packet::CanRelayAckPacket; +use crate::relay::traits::packet_relayers::receive_packet::CanRelayReceivePacket; +use crate::relay::traits::packet_relayers::timeout_unordered_packet::CanRelayTimeoutUnorderedPacket; + +pub struct DefaultPacketRelayer; + +impl PacketRelayer for DefaultPacketRelayer +where + Relay: CanRelayAckPacket + + CanRelayReceivePacket + + CanRelayTimeoutUnorderedPacket + + HasRelayPacketType + + HasLogger + + HasPacketLock + + CanFilterRelayPackets + + HasRelayChains + + CanRaiseError + + CanRaiseError, + SrcChain: CanQueryChainStatus + CanReadOutgoingPacketFields, + DstChain: CanQueryChainStatus + + HasWriteAckEvent + + HasChannelIdType + + HasPortIdType + + HasTimeoutType, + Relay::Logger: for<'a> CanLog> + + for<'a> CanLog> + + for<'a> CanLog>, +{ + async fn relay_packet(relay: &Relay, packet: &Relay::Packet) -> Result<(), Relay::Error> { + >>>::relay_packet( + relay, packet, + ) + .await + } +} 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 21fc97f85..847144278 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 @@ -7,7 +7,7 @@ use hermes_logging_components::traits::logger::CanLog; use crate::chain::traits::queries::chain_status::CanQueryChainStatus; use crate::chain::traits::types::ibc_events::write_ack::HasWriteAckEvent; -use crate::relay::traits::chains::{HasRelayChains, PacketOf}; +use crate::relay::traits::chains::{HasRelayChains, HasRelayPacketType, PacketOf}; use crate::relay::traits::packet_relayer::PacketRelayer; use crate::relay::traits::packet_relayers::ack_packet::CanRelayAckPacket; use crate::relay::traits::packet_relayers::receive_packet::CanRelayReceivePacket; @@ -37,6 +37,7 @@ where Relay: CanRelayAckPacket + CanRelayReceivePacket + CanRelayTimeoutUnorderedPacket + + HasRelayPacketType + HasLogger + HasRelayChains + CanRaiseError @@ -49,7 +50,7 @@ where + HasTimeoutType, Relay::Logger: for<'a> CanLog>, { - async fn relay_packet(relay: &Relay, packet: &PacketOf) -> Result<(), Relay::Error> { + async fn relay_packet(relay: &Relay, packet: &Relay::Packet) -> Result<(), Relay::Error> { let src_chain = relay.src_chain(); let dst_chain = relay.dst_chain(); let logger = relay.logger(); diff --git a/crates/relayer/relayer-components/src/relay/impls/packet_relayers/general/mod.rs b/crates/relayer/relayer-components/src/relay/impls/packet_relayers/general/mod.rs index 838c43487..fb123e9cb 100644 --- a/crates/relayer/relayer-components/src/relay/impls/packet_relayers/general/mod.rs +++ b/crates/relayer/relayer-components/src/relay/impls/packet_relayers/general/mod.rs @@ -1,3 +1,4 @@ +pub mod default; pub mod filter_relayer; pub mod full_relay; pub mod lock; diff --git a/crates/relayer/relayer-components/src/relay/impls/selector.rs b/crates/relayer/relayer-components/src/relay/impls/selector.rs new file mode 100644 index 000000000..27c8538ae --- /dev/null +++ b/crates/relayer/relayer-components/src/relay/impls/selector.rs @@ -0,0 +1,44 @@ +use core::marker::PhantomData; + +use crate::multi::traits::chain_at::{ + ChainGetterAt, HasChainAt, HasChainTypeAt, ProvideChainTypeAt, +}; +use crate::multi::types::index::Index; +use crate::multi::types::tags::{Dst, Src}; + +pub struct SelectRelayChains(pub PhantomData<(SrcTag, DstTag)>); + +impl ProvideChainTypeAt for SelectRelayChains +where + Relay: HasChainTypeAt, +{ + type Chain = Relay::Chain; +} + +impl ProvideChainTypeAt for SelectRelayChains +where + Relay: HasChainTypeAt, +{ + type Chain = Relay::Chain; +} + +impl ChainGetterAt for SelectRelayChains +where + Relay: HasChainAt + HasChainTypeAt, +{ + fn chain_at(relay: &Relay, _tag: PhantomData) -> &Chain { + relay.chain_at(PhantomData::) + } +} + +impl ChainGetterAt for SelectRelayChains +where + Relay: HasChainAt + HasChainTypeAt, +{ + fn chain_at(relay: &Relay, _tag: PhantomData) -> &Chain { + relay.chain_at(PhantomData::) + } +} +pub type SelectRelayAToB = SelectRelayChains, Index<1>>; + +pub type SelectRelayBToA = SelectRelayChains, Index<0>>; diff --git a/crates/relayer/relayer-components/src/relay/impls/update_client/default.rs b/crates/relayer/relayer-components/src/relay/impls/update_client/default.rs new file mode 100644 index 000000000..ddad45bbd --- /dev/null +++ b/crates/relayer/relayer-components/src/relay/impls/update_client/default.rs @@ -0,0 +1,55 @@ +use alloc::vec::Vec; + +use cgp::prelude::CanRaiseError; +use hermes_chain_components::impls::wait_chain_reach_height::CanWaitChainReachHeight; +use hermes_chain_components::traits::queries::consensus_state::CanQueryConsensusStateWithLatestHeight; +use hermes_logging_components::traits::has_logger::HasLogger; +use hermes_logging_components::traits::logger::CanLog; + +use crate::chain::traits::message_builders::update_client::CanBuildUpdateClientMessage; +use crate::chain::traits::payload_builders::update_client::CanBuildUpdateClientPayload; +use crate::chain::traits::queries::client_state::CanQueryClientStateWithLatestHeight; +use crate::chain::traits::queries::consensus_state_height::CanQueryConsensusStateHeight; +use crate::chain::traits::types::client_state::HasClientStateFields; +use crate::relay::impls::update_client::build::BuildUpdateClientMessages; +use crate::relay::impls::update_client::skip::{LogSkipBuildUpdateClientMessage, SkipUpdateClient}; +use crate::relay::impls::update_client::wait::{LogWaitUpdateClientHeightStatus, WaitUpdateClient}; +use crate::relay::traits::target::{ + HasTargetChainTypes, HasTargetChains, HasTargetClientIds, RelayTarget, +}; +use crate::relay::traits::update_client_message_builder::TargetUpdateClientMessageBuilder; + +pub struct DefaultTargetUpdateClientMessageBuilder; + +impl TargetUpdateClientMessageBuilder + for DefaultTargetUpdateClientMessageBuilder +where + Target: RelayTarget, + Relay: HasLogger + + HasTargetChainTypes< + Target, + TargetChain = TargetChain, + CounterpartyChain = CounterpartyChain, + > + HasTargetChains + + HasTargetClientIds + + CanRaiseError + + CanRaiseError, + TargetChain: CanQueryClientStateWithLatestHeight + + CanBuildUpdateClientMessage + + CanQueryConsensusStateHeight + + CanQueryConsensusStateWithLatestHeight, + CounterpartyChain: CanWaitChainReachHeight + + CanBuildUpdateClientPayload + + HasClientStateFields, + CounterpartyChain::Height: Clone, + Relay::Logger: for<'a> CanLog> + + for<'a> CanLog>, +{ + async fn build_target_update_client_messages( + relay: &Relay, + target: Target, + height: &CounterpartyChain::Height, + ) -> Result, Relay::Error> { + >>::build_target_update_client_messages(relay, target, height).await + } +} diff --git a/crates/relayer/relayer-components/src/relay/impls/update_client/mod.rs b/crates/relayer/relayer-components/src/relay/impls/update_client/mod.rs index 9a20ef44f..dfa094ea7 100644 --- a/crates/relayer/relayer-components/src/relay/impls/update_client/mod.rs +++ b/crates/relayer/relayer-components/src/relay/impls/update_client/mod.rs @@ -1,3 +1,4 @@ pub mod build; +pub mod default; pub mod skip; pub mod wait; diff --git a/crates/relayer/relayer-components/src/relay/impls/update_client/wait.rs b/crates/relayer/relayer-components/src/relay/impls/update_client/wait.rs index 01f1bc5cd..cbe46c386 100644 --- a/crates/relayer/relayer-components/src/relay/impls/update_client/wait.rs +++ b/crates/relayer/relayer-components/src/relay/impls/update_client/wait.rs @@ -3,11 +3,11 @@ use core::marker::PhantomData; use cgp::prelude::CanRaiseError; use hermes_chain_components::traits::types::height::HasHeightType; +use hermes_chain_components::traits::types::message::HasMessageType; use hermes_logging_components::traits::has_logger::HasLogger; use hermes_logging_components::traits::logger::CanLog; use crate::chain::impls::wait_chain_reach_height::CanWaitChainReachHeight; -use crate::chain::traits::types::ibc::HasIbcChainTypes; use crate::chain::types::aliases::HeightOf; use crate::relay::traits::target::{ CounterpartyChainOf, HasTargetChainTypes, HasTargetChains, RelayTarget, @@ -44,8 +44,8 @@ where + HasTargetChains + CanRaiseError, InUpdateClient: TargetUpdateClientMessageBuilder, - TargetChain: HasIbcChainTypes, - CounterpartyChain: CanWaitChainReachHeight + HasIbcChainTypes, + TargetChain: HasMessageType, + CounterpartyChain: CanWaitChainReachHeight + HasHeightType, Relay::Logger: for<'a> CanLog>, { async fn build_target_update_client_messages( diff --git a/crates/relayer/relayer-components/src/relay/traits/chains/selector.rs b/crates/relayer/relayer-components/src/relay/traits/chains/selector.rs new file mode 100644 index 000000000..84f2a90e2 --- /dev/null +++ b/crates/relayer/relayer-components/src/relay/traits/chains/selector.rs @@ -0,0 +1,18 @@ +use crate::multi::traits::chain_at::{ChainGetterAt, HasChainTypeAt, ProvideChainTypeAt}; +use crate::multi::types::tags::{Dst, Src}; + +pub trait RelayChainsSelector: + ProvideChainTypeAt + ProvideChainTypeAt + + ChainGetterAt + ChainGetterAt +where + Relay: HasChainTypeAt + HasChainTypeAt +{} + +impl RelayChainsSelector for Selector +where + Relay: HasChainTypeAt + HasChainTypeAt, + Selector: ProvideChainTypeAt + ProvideChainTypeAt + + ChainGetterAt + ChainGetterAt +{ + +} \ No newline at end of file diff --git a/crates/relayer/relayer-components/src/relay/traits/packet_relayer.rs b/crates/relayer/relayer-components/src/relay/traits/packet_relayer.rs index 75fd8897b..09f142999 100644 --- a/crates/relayer/relayer-components/src/relay/traits/packet_relayer.rs +++ b/crates/relayer/relayer-components/src/relay/traits/packet_relayer.rs @@ -1,12 +1,12 @@ use cgp::prelude::*; -use crate::relay::traits::chains::{HasRelayChainTypes, PacketOf}; +use crate::relay::traits::chains::HasRelayPacketType; #[cgp_component { provider: PacketRelayer, context: Relay, }] #[async_trait] -pub trait CanRelayPacket: HasRelayChainTypes { - async fn relay_packet(&self, packet: &PacketOf) -> Result<(), Self::Error>; +pub trait CanRelayPacket: HasRelayPacketType { + async fn relay_packet(&self, packet: &Self::Packet) -> Result<(), Self::Error>; }