hermes_test_components/setup/impls/
connection.rs1use cgp::core::error::{CanRaiseError, ErrorOf};
2use hermes_relayer_components::birelay::traits::two_way::HasTwoWayRelay;
3use hermes_relayer_components::chain::traits::types::connection::HasInitConnectionOptionsType;
4use hermes_relayer_components::chain::traits::types::ibc::HasIbcChainTypes;
5use hermes_relayer_components::chain::types::aliases::ConnectionIdOf;
6use hermes_relayer_components::multi::traits::birelay_at::{BiRelayAt, HasBiRelayTypeAt};
7use hermes_relayer_components::multi::traits::chain_at::ChainAt;
8use hermes_relayer_components::multi::traits::relay_at::{HasRelayTypeAt, RelayAt};
9use hermes_relayer_components::relay::impls::connection::bootstrap::CanBootstrapConnection;
10
11use crate::setup::traits::connection::ConnectionSetup;
12use crate::setup::traits::init_connection_options_at::HasInitConnectionOptionsAt;
13
14pub struct SetupConnectionHandshake;
15
16impl<Setup, const A: usize, const B: usize> ConnectionSetup<Setup, A, B>
17 for SetupConnectionHandshake
18where
19 Setup: HasBiRelayTypeAt<A, B>
20 + HasInitConnectionOptionsAt<A, B>
21 + CanRaiseError<ErrorOf<RelayAt<Setup, A, B>>>,
22 ChainAt<Setup, A>:
23 HasIbcChainTypes<ChainAt<Setup, B>> + HasInitConnectionOptionsType<ChainAt<Setup, B>>,
24 ChainAt<Setup, B>: HasIbcChainTypes<ChainAt<Setup, A>>,
25 RelayAt<Setup, A, B>: CanBootstrapConnection,
26 BiRelayAt<Setup, A, B>: HasTwoWayRelay + HasRelayTypeAt<0, 1, Relay = RelayAt<Setup, A, B>>,
27{
28 async fn setup_connection(
29 setup: &Setup,
30 birelay: &BiRelayAt<Setup, A, B>,
31 ) -> Result<
32 (
33 ConnectionIdOf<ChainAt<Setup, A>, ChainAt<Setup, B>>,
34 ConnectionIdOf<ChainAt<Setup, B>, ChainAt<Setup, A>>,
35 ),
36 Setup::Error,
37 > {
38 let (connection_id_a, connection_id_b) = birelay
39 .relay_a_to_b()
40 .bootstrap_connection(&setup.init_connection_options())
41 .await
42 .map_err(Setup::raise_error)?;
43
44 Ok((connection_id_a, connection_id_b))
45 }
46}