diff --git a/relayer/Cargo.lock b/relayer/Cargo.lock index 7c9615d9..188c74d3 100644 --- a/relayer/Cargo.lock +++ b/relayer/Cargo.lock @@ -1970,7 +1970,7 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermes-any-counterparty" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", "hermes-cosmos-chain-components", @@ -1987,7 +1987,7 @@ dependencies = [ [[package]] name = "hermes-async-runtime-components" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "async-trait", "cgp 0.3.1", @@ -2010,7 +2010,7 @@ dependencies = [ [[package]] name = "hermes-chain-components" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", "hermes-chain-type-components", @@ -2021,7 +2021,7 @@ dependencies = [ [[package]] name = "hermes-chain-type-components" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", ] @@ -2029,7 +2029,7 @@ dependencies = [ [[package]] name = "hermes-cli" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", "clap", @@ -2068,7 +2068,7 @@ dependencies = [ [[package]] name = "hermes-cli-components" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", "clap", @@ -2108,7 +2108,7 @@ dependencies = [ [[package]] name = "hermes-comet-light-client-components" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", "hermes-chain-type-components", @@ -2117,7 +2117,7 @@ dependencies = [ [[package]] name = "hermes-comet-light-client-context" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", "eyre", @@ -2133,7 +2133,7 @@ dependencies = [ [[package]] name = "hermes-cosmos-chain-components" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "bech32 0.9.1", "bitcoin", @@ -2186,7 +2186,7 @@ dependencies = [ [[package]] name = "hermes-cosmos-encoding-components" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", "hermes-encoding-components", @@ -2200,7 +2200,7 @@ dependencies = [ [[package]] name = "hermes-cosmos-integration-tests" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", "eyre", @@ -2233,7 +2233,7 @@ dependencies = [ [[package]] name = "hermes-cosmos-relayer" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", "dirs-next", @@ -2282,7 +2282,7 @@ dependencies = [ [[package]] name = "hermes-cosmos-test-components" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", "hdpath", @@ -2309,7 +2309,7 @@ dependencies = [ [[package]] name = "hermes-cosmos-wasm-relayer" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", "eyre", @@ -2358,7 +2358,7 @@ dependencies = [ [[package]] name = "hermes-encoding-components" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", ] @@ -2366,7 +2366,7 @@ dependencies = [ [[package]] name = "hermes-error" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", "eyre", @@ -2376,7 +2376,7 @@ dependencies = [ [[package]] name = "hermes-ibc-test-suite" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", "hermes-logging-components", @@ -2387,7 +2387,7 @@ dependencies = [ [[package]] name = "hermes-logger" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", "hermes-logging-components", @@ -2399,7 +2399,7 @@ dependencies = [ [[package]] name = "hermes-logging-components" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", ] @@ -2407,7 +2407,7 @@ dependencies = [ [[package]] name = "hermes-protobuf-encoding-components" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", "hermes-encoding-components", @@ -2418,7 +2418,7 @@ dependencies = [ [[package]] name = "hermes-relayer-components" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", "hermes-chain-components", @@ -2431,7 +2431,7 @@ dependencies = [ [[package]] name = "hermes-relayer-components-extra" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", "hermes-chain-type-components", @@ -2443,7 +2443,7 @@ dependencies = [ [[package]] name = "hermes-runtime" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", "hermes-async-runtime-components", @@ -2455,7 +2455,7 @@ dependencies = [ [[package]] name = "hermes-runtime-components" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", ] @@ -2645,7 +2645,7 @@ dependencies = [ [[package]] name = "hermes-test-components" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", "hermes-chain-type-components", @@ -2657,7 +2657,7 @@ dependencies = [ [[package]] name = "hermes-tokio-runtime-components" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", "futures", @@ -2671,7 +2671,7 @@ dependencies = [ [[package]] name = "hermes-tracing-logging-components" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", "hermes-logging-components", @@ -2683,7 +2683,7 @@ dependencies = [ [[package]] name = "hermes-wasm-client-components" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", "hermes-cosmos-chain-components", @@ -2702,7 +2702,7 @@ dependencies = [ [[package]] name = "hermes-wasm-encoding-components" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", "hermes-cosmos-encoding-components", @@ -2716,7 +2716,7 @@ dependencies = [ [[package]] name = "hermes-wasm-test-components" version = "0.1.0" -source = "git+https://github.com/informalsystems/hermes-sdk.git#61b94d9d043ba40c814807f3a9e95e754258360e" +source = "git+https://github.com/informalsystems/hermes-sdk.git#b432c9e2fa8d198d6294eb4e7567ed66efa23d7f" dependencies = [ "cgp 0.3.1", "hermes-chain-type-components", @@ -4558,7 +4558,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "157c5a9d7ea5c2ed2d9fb8f495b64759f7816c7eaea54ba3978f0d63000162e3" dependencies = [ "anyhow", - "itertools 0.13.0", + "itertools 0.12.1", "proc-macro2", "quote", "syn 2.0.96", diff --git a/relayer/crates/starknet-cli/src/contexts/app.rs b/relayer/crates/starknet-cli/src/contexts/app.rs index 27536a75..cc1b4ebb 100644 --- a/relayer/crates/starknet-cli/src/contexts/app.rs +++ b/relayer/crates/starknet-cli/src/contexts/app.rs @@ -26,6 +26,7 @@ use hermes_cli_components::impls::commands::queries::client_state::{ use hermes_cli_components::impls::commands::queries::consensus_state::{ QueryConsensusStateArgs, RunQueryConsensusStateCommand, }; +use hermes_cli_components::impls::commands::start::{RunStartRelayerCommand, StartRelayerArgs}; use hermes_cli_components::impls::config::get_config_path::GetDefaultConfigField; use hermes_cli_components::impls::config::load_toml_config::LoadTomlConfig; use hermes_cli_components::impls::config::save_toml_config::WriteTomlConfig; @@ -168,6 +169,12 @@ delegate_components! { (CreateClientArgs, symbol!("target_chain_id")): ParseFromString, (CreateClientArgs, symbol!("counterparty_chain_id")): ParseFromString, + + (StartRelayerArgs, symbol!("chain_id_a")): ParseFromString, + (StartRelayerArgs, symbol!("client_id_a")): ParseFromString, + (StartRelayerArgs, symbol!("chain_id_b")): ParseFromString, + (StartRelayerArgs, symbol!("client_id_b")): ParseFromString, + } } @@ -176,6 +183,8 @@ delegate_components! { AllSubCommands: RunAllSubCommand, BootstrapSubCommand: RunBootstrapSubCommand, + StartRelayerArgs: RunStartRelayerCommand, + QuerySubCommand: RunQuerySubCommand, QueryClientStateArgs: RunQueryClientStateCommand, QueryConsensusStateArgs: RunQueryConsensusStateCommand, @@ -303,6 +312,7 @@ pub trait CanUseStarknetApp: + CanRunCommand + CanRunCommand + CanRunCommand + + CanRunCommand { } diff --git a/relayer/crates/starknet-cli/src/impls/subcommand.rs b/relayer/crates/starknet-cli/src/impls/subcommand.rs index 967f5da6..bb2a0c1b 100644 --- a/relayer/crates/starknet-cli/src/impls/subcommand.rs +++ b/relayer/crates/starknet-cli/src/impls/subcommand.rs @@ -1,3 +1,4 @@ +use hermes_cli_components::impls::commands::start::StartRelayerArgs; use hermes_cli_components::traits::command::{CanRunCommand, CommandRunner}; use crate::commands::create::subcommand::CreateSubCommand; @@ -7,6 +8,8 @@ use crate::impls::bootstrap::subcommand::BootstrapSubCommand; #[derive(Debug, clap::Subcommand)] pub enum AllSubCommands { + Start(StartRelayerArgs), + #[clap(subcommand)] Bootstrap(BootstrapSubCommand), #[clap(subcommand)] @@ -24,13 +27,15 @@ where App: CanRunCommand + CanRunCommand + CanRunCommand - + CanRunCommand, + + CanRunCommand + + CanRunCommand, { async fn run_command( app: &App, subcommand: &AllSubCommands, ) -> Result { match subcommand { + AllSubCommands::Start(args) => app.run_command(args).await, AllSubCommands::Bootstrap(args) => app.run_command(args).await, AllSubCommands::Query(args) => app.run_command(args).await, AllSubCommands::Create(args) => app.run_command(args).await, diff --git a/relayer/crates/starknet-relayer/src/build/components/relay/build.rs b/relayer/crates/starknet-relayer/src/build/components/relay/build.rs index e9dbbbc3..2050b796 100644 --- a/relayer/crates/starknet-relayer/src/build/components/relay/build.rs +++ b/relayer/crates/starknet-relayer/src/build/components/relay/build.rs @@ -13,12 +13,12 @@ impl RelayBuilder, Index<1>> for StarknetBuildComponen async fn build_relay( build: &StarknetBuilder, _index: PhantomData<(Index<0>, Index<1>)>, - _src_chain_id: &ChainId, + src_chain_id: &ChainId, dst_chain_id: &ChainId, src_client_id: &StarknetClientId, dst_client_id: &CosmosClientId, ) -> Result { - let src_chain = build.build_chain().await?; + let src_chain = build.build_chain(src_chain_id).await?; let dst_chain = build.cosmos_builder.build_chain(dst_chain_id).await?; diff --git a/relayer/crates/starknet-relayer/src/contexts/birelay.rs b/relayer/crates/starknet-relayer/src/contexts/birelay.rs new file mode 100644 index 00000000..b600630a --- /dev/null +++ b/relayer/crates/starknet-relayer/src/contexts/birelay.rs @@ -0,0 +1,68 @@ +use cgp::core::component::UseDelegate; +use cgp::core::error::{ErrorRaiserComponent, ErrorTypeComponent}; +use cgp::core::field::{Index, WithField}; +use cgp::core::types::WithType; +use cgp::extra::run::CanRun; +use cgp::prelude::*; +use hermes_cosmos_relayer::contexts::chain::CosmosChain; +use hermes_error::impls::ProvideHermesError; +use hermes_relayer_components::birelay::traits::two_way::TwoWayRelayGetter; +use hermes_relayer_components::components::default::birelay::{ + DefaultBiRelayComponents, IsDefaultBiRelayComponents, +}; +use hermes_relayer_components::multi::traits::chain_at::ChainTypeAtComponent; +use hermes_relayer_components::multi::traits::relay_at::RelayTypeAtComponent; +use hermes_runtime::types::runtime::HermesRuntime; +use hermes_runtime_components::traits::runtime::{RuntimeGetterComponent, RuntimeTypeComponent}; +use hermes_starknet_chain_context::contexts::chain::StarknetChain; +use hermes_starknet_chain_context::impls::error::HandleStarknetChainError; + +use crate::contexts::cosmos_to_starknet_relay::CosmosToStarknetRelay; +use crate::contexts::starknet_to_cosmos_relay::StarknetToCosmosRelay; + +#[derive(Clone, HasField)] +pub struct StarknetCosmosBiRelay { + pub runtime: HermesRuntime, + pub relay_a_to_b: StarknetToCosmosRelay, + pub relay_b_to_a: CosmosToStarknetRelay, +} + +pub struct StarknetCosmosBiRelayComponents; + +impl HasComponents for StarknetCosmosBiRelay { + type Components = StarknetCosmosBiRelayComponents; +} + +impl DelegateComponent for StarknetCosmosBiRelayComponents +where + Self: IsDefaultBiRelayComponents, +{ + type Delegate = DefaultBiRelayComponents; +} + +delegate_components! { + StarknetCosmosBiRelayComponents { + ErrorTypeComponent: ProvideHermesError, + ErrorRaiserComponent: UseDelegate, + RuntimeTypeComponent: WithType, + RuntimeGetterComponent: WithField, + ChainTypeAtComponent>: WithType, + ChainTypeAtComponent>: WithType, + RelayTypeAtComponent, Index<1>>: WithType, + RelayTypeAtComponent, Index<0>>: WithType, + } +} + +impl TwoWayRelayGetter for StarknetCosmosBiRelayComponents { + fn relay_a_to_b(birelay: &StarknetCosmosBiRelay) -> &StarknetToCosmosRelay { + &birelay.relay_a_to_b + } + + fn relay_b_to_a(birelay: &StarknetCosmosBiRelay) -> &CosmosToStarknetRelay { + &birelay.relay_b_to_a + } +} + +pub trait CanUseCosmosStarnetBiRelay: CanRun {} + +impl CanUseCosmosStarnetBiRelay for StarknetCosmosBiRelay {} diff --git a/relayer/crates/starknet-relayer/src/contexts/builder.rs b/relayer/crates/starknet-relayer/src/contexts/builder.rs index 98ddd781..9b2098cc 100644 --- a/relayer/crates/starknet-relayer/src/contexts/builder.rs +++ b/relayer/crates/starknet-relayer/src/contexts/builder.rs @@ -7,14 +7,17 @@ use cgp::core::error::{ErrorRaiserComponent, ErrorTypeComponent}; use cgp::core::field::{Index, WithField}; use cgp::core::types::WithType; use cgp::prelude::*; +use eyre::eyre; use hermes_cosmos_relayer::contexts::build::CosmosBuilder; use hermes_cosmos_relayer::contexts::chain::CosmosChain; use hermes_error::impls::ProvideHermesError; use hermes_error::types::Error; use hermes_error::HermesError; +use hermes_relayer_components::build::traits::builders::birelay_builder::BiRelayBuilder; use hermes_relayer_components::build::traits::builders::chain_builder::{ CanBuildChain, ChainBuilder, }; +use hermes_relayer_components::multi::traits::birelay_at::BiRelayTypeAtComponent; use hermes_relayer_components::multi::traits::chain_at::ChainTypeAtComponent; use hermes_relayer_components::multi::traits::relay_at::RelayTypeAtComponent; use hermes_runtime::types::runtime::HermesRuntime; @@ -23,7 +26,7 @@ use hermes_starknet_chain_components::impls::types::config::StarknetChainConfig; use hermes_starknet_chain_components::types::client_id::ClientId as StarknetClientId; use hermes_starknet_chain_context::contexts::chain::StarknetChain; use hermes_starknet_chain_context::impls::error::HandleStarknetChainError; -use ibc::core::host::types::identifiers::{ChainId, ClientId as CosmosClientId}; +use ibc::core::host::types::identifiers::{ChainId, ClientId, ClientId as CosmosClientId}; use starknet::accounts::{ExecutionEncoding, SingleOwnerAccount}; use starknet::providers::jsonrpc::HttpTransport; use starknet::providers::{JsonRpcClient, Provider}; @@ -31,6 +34,7 @@ use starknet::signers::{LocalWallet, SigningKey}; use url::Url; use super::cosmos_to_starknet_relay::CosmosToStarknetRelay; +use crate::contexts::birelay::StarknetCosmosBiRelay; use crate::contexts::starknet_to_cosmos_relay::StarknetToCosmosRelay; #[derive(Clone)] @@ -42,8 +46,8 @@ pub struct StarknetBuilder { pub struct StarknetBuilderFields { // Used to build CosmosChain pub cosmos_builder: CosmosBuilder, - // Fields for StarknetChain pub runtime: HermesRuntime, + // Fields for StarknetChain pub starknet_chain_config: StarknetChainConfig, } @@ -80,6 +84,8 @@ delegate_components! { RuntimeTypeComponent: WithType, RuntimeGetterComponent: WithField, RelayTypeAtComponent, Index<1>>: WithType, + RelayTypeAtComponent, Index<0>>: WithType, + BiRelayTypeAtComponent, Index<1>>: WithType, } } @@ -87,9 +93,9 @@ impl ChainBuilder> for StarknetBuildComponents { async fn build_chain( build: &StarknetBuilder, _index: PhantomData>, - _chain_id: &ChainId, + chain_id: &ChainId, ) -> Result { - build.build_chain().await + build.build_chain(chain_id).await } } @@ -103,6 +109,43 @@ impl ChainBuilder> for StarknetBuildComponents { } } +impl BiRelayBuilder, Index<1>> for StarknetBuildComponents { + async fn build_birelay( + build: &StarknetBuilder, + chain_id_a: &ChainId, + chain_id_b: &ChainId, + client_id_a: &ClientId, + client_id_b: &ClientId, + ) -> Result { + let starknet_chain = build.build_chain(chain_id_a).await?; + let cosmos_chain = build.cosmos_builder.build_chain(chain_id_b).await?; + + let relay_a_to_b = StarknetToCosmosRelay::new( + build.runtime.clone(), + starknet_chain.clone(), + cosmos_chain.clone(), + client_id_a.clone(), + client_id_b.clone(), + ); + + let relay_b_to_a = CosmosToStarknetRelay::new( + build.runtime.clone(), + cosmos_chain, + starknet_chain, + client_id_b.clone(), + client_id_a.clone(), + ); + + let birelay = StarknetCosmosBiRelay { + runtime: build.runtime.clone(), + relay_a_to_b, + relay_b_to_a, + }; + + Ok(birelay) + } +} + impl StarknetBuilder { pub fn new( cosmos_builder: CosmosBuilder, @@ -118,16 +161,25 @@ impl StarknetBuilder { } } - pub async fn build_chain(&self) -> Result { - self.build_chain_with_config().await + pub async fn build_chain(&self, chain_id: &ChainId) -> Result { + self.build_chain_with_config(chain_id).await } - pub async fn build_chain_with_config(&self) -> Result { + pub async fn build_chain_with_config( + &self, + expected_chain_id: &ChainId, + ) -> Result { let json_rpc_url = Url::parse(&self.starknet_chain_config.json_rpc_url.to_string())?; let rpc_client = Arc::new(JsonRpcClient::new(HttpTransport::new(json_rpc_url))); - let chain_id = rpc_client.chain_id().await?; + let chain_id_felt = rpc_client.chain_id().await?; + + let chain_id = chain_id_felt.to_string().parse()?; + + if &chain_id != expected_chain_id { + return Err(eyre!("Starknet chain has a different ID as configured. Expected: {expected_chain_id}, got: {chain_id}").into()); + } let account = SingleOwnerAccount::new( rpc_client.clone(), @@ -135,13 +187,13 @@ impl StarknetBuilder { self.starknet_chain_config.relayer_wallet.signing_key, )), self.starknet_chain_config.relayer_wallet.account_address, - chain_id, + chain_id_felt, ExecutionEncoding::New, ); let context = StarknetChain { runtime: self.runtime.clone(), - chain_id: chain_id.to_string().parse()?, + chain_id, rpc_client, account, ibc_client_contract_address: None, diff --git a/relayer/crates/starknet-relayer/src/contexts/mod.rs b/relayer/crates/starknet-relayer/src/contexts/mod.rs index 5589048a..2b6de7b0 100644 --- a/relayer/crates/starknet-relayer/src/contexts/mod.rs +++ b/relayer/crates/starknet-relayer/src/contexts/mod.rs @@ -1,3 +1,4 @@ +pub mod birelay; pub mod builder; pub mod cosmos_to_starknet_relay; pub mod starknet_to_cosmos_relay;