Skip to content

Commit 54b8bc7

Browse files
authored
Implement initial StarknetBuilder and StarknetBuildComponents (#140)
* Implement initial StarknetBuilder and StarknetBuildComponents * taplo fmt
1 parent 57d7aa1 commit 54b8bc7

File tree

18 files changed

+186
-16
lines changed

18 files changed

+186
-16
lines changed

relayer/Cargo.lock

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

relayer/crates/starknet-chain-components/Cargo.toml

+5-4
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@ hermes-wasm-encoding-components = { workspace = true }
2727
ibc = { workspace = true }
2828
ibc-proto = { workspace = true }
2929

30-
starknet = { workspace = true }
31-
serde_json = { workspace = true }
3230
cairo-lang-starknet-classes = { workspace = true }
33-
ibc-client-starknet-types = { workspace = true }
3431
http = { workspace = true }
35-
tonic = { workspace = true }
32+
ibc-client-starknet-types = { workspace = true }
3633
prost-types = { workspace = true }
34+
serde = { workspace = true }
35+
serde_json = { workspace = true }
36+
starknet = { workspace = true }
37+
tonic = { workspace = true }

relayer/crates/starknet-cli/src/types/config.rs relayer/crates/starknet-chain-components/src/impls/types/config.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use hermes_cosmos_chain_components::impls::types::config::CosmosChainConfig;
2-
use hermes_starknet_test_components::types::wallet::StarknetWallet;
32
use serde::{Deserialize, Serialize};
43

4+
use crate::types::wallet::StarknetWallet;
5+
56
#[derive(Debug, Serialize, Deserialize)]
67
pub struct StarknetRelayerConfig {
78
pub cosmos_chain_config: Option<CosmosChainConfig>,

relayer/crates/starknet-chain-components/src/impls/types/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ pub mod blob;
44
pub mod chain_id;
55
pub mod client;
66
pub mod commitment_proof;
7+
pub mod config;
78
pub mod contract;
89
pub mod denom;
910
pub mod event;

relayer/crates/starknet-chain-components/src/types/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,4 @@ pub mod payloads;
1515
pub mod register;
1616
pub mod status;
1717
pub mod tx_response;
18+
pub mod wallet;

relayer/crates/starknet-cli/Cargo.toml

+3-1
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@ hermes-relayer-components = { workspace = true }
2929
hermes-cosmos-relayer = { workspace = true }
3030
hermes-cosmos-integration-tests = { workspace = true }
3131
hermes-cosmos-chain-components = { workspace = true }
32+
hermes-starknet-chain-components = { workspace = true }
33+
hermes-starknet-relayer = { workspace = true }
34+
hermes-starknet-integration-tests = { workspace = true }
3235
hermes-starknet-test-components = { workspace = true }
3336
hermes-test-components = { workspace = true }
34-
hermes-starknet-integration-tests = { workspace = true }
3537

3638
ibc = { workspace = true }
3739

relayer/crates/starknet-cli/src/contexts/app.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ use hermes_runtime::types::runtime::HermesRuntime;
3333
use hermes_runtime_components::traits::runtime::{
3434
HasRuntime, RuntimeGetterComponent, RuntimeTypeComponent,
3535
};
36+
use hermes_starknet_chain_components::impls::types::config::{
37+
StarknetChainConfig, StarknetRelayerConfig,
38+
};
3639
use hermes_starknet_integration_tests::contexts::bootstrap::StarknetBootstrap;
3740
use hermes_starknet_integration_tests::contexts::chain_driver::StarknetChainDriver;
3841
use hermes_test_components::chain_driver::traits::config::ConfigUpdater;
@@ -42,7 +45,6 @@ use crate::impls::bootstrap::starknet_chain::{BootstrapStarknetChainArgs, LoadSt
4245
use crate::impls::bootstrap::subcommand::{BootstrapSubCommand, RunBootstrapSubCommand};
4346
use crate::impls::error::ProvideCliError;
4447
use crate::impls::subcommand::{AllSubCommands, RunAllSubCommand};
45-
use crate::types::config::{StarknetChainConfig, StarknetRelayerConfig};
4648

4749
#[derive(HasField)]
4850
pub struct StarknetApp {

relayer/crates/starknet-cli/src/lib.rs

-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,3 @@ extern crate alloc;
22

33
pub mod contexts;
44
pub mod impls;
5-
pub mod types;

relayer/crates/starknet-cli/src/types/mod.rs

-1
This file was deleted.

relayer/crates/starknet-integration-tests/src/contexts/bootstrap.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use hermes_runtime::types::runtime::HermesRuntime;
2222
use hermes_runtime_components::traits::runtime::{
2323
HasRuntime, RuntimeGetterComponent, RuntimeTypeComponent,
2424
};
25+
use hermes_starknet_chain_components::types::wallet::StarknetWallet;
2526
use hermes_starknet_chain_context::contexts::chain::StarknetChain;
2627
use hermes_starknet_chain_context::impls::error::HandleStarknetChainError;
2728
use hermes_starknet_test_components::impls::bootstrap::bootstrap_chain::BootstrapStarknetDevnet;
@@ -30,7 +31,6 @@ use hermes_starknet_test_components::impls::types::genesis_config::ProvideStarkn
3031
use hermes_starknet_test_components::impls::types::node_config::ProvideStarknetNodeConfigType;
3132
use hermes_starknet_test_components::types::genesis_config::StarknetGenesisConfig;
3233
use hermes_starknet_test_components::types::node_config::StarknetNodeConfig;
33-
use hermes_starknet_test_components::types::wallet::StarknetWallet;
3434
use hermes_test_components::bootstrap::traits::chain::{
3535
CanBootstrapChain, ChainBootstrapperComponent,
3636
};

relayer/crates/starknet-integration-tests/src/contexts/chain_driver.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ use cgp::prelude::*;
88
use hermes_error::impls::ProvideHermesError;
99
use hermes_runtime::types::runtime::HermesRuntime;
1010
use hermes_runtime_components::traits::runtime::{RuntimeGetterComponent, RuntimeTypeComponent};
11+
use hermes_starknet_chain_components::types::wallet::StarknetWallet;
1112
use hermes_starknet_chain_context::contexts::chain::StarknetChain;
1213
use hermes_starknet_chain_context::impls::error::HandleStarknetChainError;
1314
use hermes_starknet_test_components::types::genesis_config::StarknetGenesisConfig;
1415
use hermes_starknet_test_components::types::node_config::StarknetNodeConfig;
15-
use hermes_starknet_test_components::types::wallet::StarknetWallet;
1616
use hermes_test_components::chain_driver::traits::chain_process::ChainProcessTaker;
1717
use hermes_test_components::chain_driver::traits::types::chain::{
1818
ChainGetter, HasChain, ProvideChainType,

relayer/crates/starknet-relayer/Cargo.toml

+6-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,12 @@ hermes-encoding-components = { workspace = true }
2020
hermes-logger = { workspace = true }
2121
hermes-relayer-components = { workspace = true }
2222
hermes-cosmos-relayer = { workspace = true }
23+
hermes-cosmos-chain-components = { workspace = true }
2324
hermes-starknet-chain-context = { workspace = true }
2425
hermes-starknet-chain-components = { workspace = true }
2526

26-
eyre = { workspace = true }
27+
starknet = { workspace = true }
28+
29+
eyre = { workspace = true }
30+
serde = { workspace = true }
31+
url = { workspace = true }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
use alloc::sync::Arc;
2+
use core::ops::Deref;
3+
use std::marker::PhantomData;
4+
5+
use cgp::core::component::UseDelegate;
6+
use cgp::core::error::{ErrorRaiserComponent, ErrorTypeComponent};
7+
use cgp::core::field::impls::use_field::WithField;
8+
use cgp::core::types::impls::WithType;
9+
use cgp::prelude::*;
10+
use hermes_cosmos_relayer::contexts::build::CosmosBuilder;
11+
use hermes_cosmos_relayer::contexts::chain::CosmosChain;
12+
use hermes_error::impls::ProvideHermesError;
13+
use hermes_error::types::Error;
14+
use hermes_error::HermesError;
15+
use hermes_relayer_components::build::traits::builders::chain_builder::{
16+
CanBuildChain, ChainBuilder,
17+
};
18+
use hermes_relayer_components::multi::traits::chain_at::ChainTypeAtComponent;
19+
use hermes_relayer_components::multi::types::index::Index;
20+
use hermes_runtime::types::runtime::HermesRuntime;
21+
use hermes_runtime_components::traits::runtime::{RuntimeGetterComponent, RuntimeTypeComponent};
22+
use hermes_starknet_chain_components::impls::types::config::StarknetChainConfig;
23+
use hermes_starknet_chain_context::contexts::chain::StarknetChain;
24+
use hermes_starknet_chain_context::impls::error::HandleStarknetChainError;
25+
use ibc::core::host::types::identifiers::ChainId;
26+
use starknet::accounts::{ExecutionEncoding, SingleOwnerAccount};
27+
use starknet::core::types::Felt;
28+
use starknet::providers::jsonrpc::HttpTransport;
29+
use starknet::providers::{JsonRpcClient, Provider};
30+
use starknet::signers::{LocalWallet, SigningKey};
31+
use url::Url;
32+
33+
#[derive(Clone)]
34+
pub struct StarknetBuilder {
35+
pub fields: Arc<dyn HasStarknetBuilderFields>,
36+
}
37+
38+
#[derive(HasField)]
39+
pub struct StarknetBuilderFields {
40+
// Used to build CosmosChain
41+
pub cosmos_builder: CosmosBuilder,
42+
// Fields for StarknetChain
43+
pub runtime: HermesRuntime,
44+
pub starknet_chain_config: StarknetChainConfig,
45+
}
46+
47+
impl Deref for StarknetBuilder {
48+
type Target = StarknetBuilderFields;
49+
50+
fn deref(&self) -> &Self::Target {
51+
self.fields.fields()
52+
}
53+
}
54+
55+
pub trait HasStarknetBuilderFields: Send + Sync + 'static {
56+
fn fields(&self) -> &StarknetBuilderFields;
57+
}
58+
59+
impl HasStarknetBuilderFields for StarknetBuilderFields {
60+
fn fields(&self) -> &StarknetBuilderFields {
61+
self
62+
}
63+
}
64+
65+
pub struct StarknetBuildComponents;
66+
67+
impl HasComponents for StarknetBuilder {
68+
type Components = StarknetBuildComponents;
69+
}
70+
71+
delegate_components! {
72+
StarknetBuildComponents {
73+
ErrorTypeComponent: ProvideHermesError,
74+
ErrorRaiserComponent: UseDelegate<HandleStarknetChainError>,
75+
ChainTypeAtComponent<Index<0>>: WithType<StarknetChain>,
76+
ChainTypeAtComponent<Index<1>>: WithType<CosmosChain>,
77+
RuntimeTypeComponent: WithType<HermesRuntime>,
78+
RuntimeGetterComponent: WithField<symbol!("runtime")>,
79+
}
80+
}
81+
82+
impl ChainBuilder<StarknetBuilder, Index<0>> for StarknetBuildComponents {
83+
async fn build_chain(
84+
build: &StarknetBuilder,
85+
_index: PhantomData<Index<0>>,
86+
_chain_id: &Felt,
87+
) -> Result<StarknetChain, HermesError> {
88+
build.build_chain().await
89+
}
90+
}
91+
92+
impl ChainBuilder<StarknetBuilder, Index<1>> for StarknetBuildComponents {
93+
async fn build_chain(
94+
build: &StarknetBuilder,
95+
_index: PhantomData<Index<1>>,
96+
chain_id: &ChainId,
97+
) -> Result<CosmosChain, Error> {
98+
build.cosmos_builder.build_chain(chain_id).await
99+
}
100+
}
101+
102+
impl StarknetBuilder {
103+
pub fn new(
104+
cosmos_builder: CosmosBuilder,
105+
runtime: HermesRuntime,
106+
starknet_chain_config: StarknetChainConfig,
107+
) -> Self {
108+
Self {
109+
fields: Arc::new(StarknetBuilderFields {
110+
cosmos_builder,
111+
runtime,
112+
starknet_chain_config,
113+
}),
114+
}
115+
}
116+
117+
pub async fn build_chain(&self) -> Result<StarknetChain, HermesError> {
118+
self.build_chain_with_config().await
119+
}
120+
121+
pub async fn build_chain_with_config(&self) -> Result<StarknetChain, HermesError> {
122+
let json_rpc_url = Url::parse(&self.starknet_chain_config.json_rpc_url)?;
123+
124+
let rpc_client = Arc::new(JsonRpcClient::new(HttpTransport::new(json_rpc_url)));
125+
126+
let chain_id = rpc_client.chain_id().await?;
127+
128+
let account = SingleOwnerAccount::new(
129+
rpc_client.clone(),
130+
LocalWallet::from_signing_key(SigningKey::from_secret_scalar(
131+
self.starknet_chain_config.relayer_wallet.signing_key,
132+
)),
133+
self.starknet_chain_config.relayer_wallet.account_address,
134+
chain_id,
135+
ExecutionEncoding::New,
136+
);
137+
138+
let context = StarknetChain {
139+
runtime: self.runtime.clone(),
140+
chain_id,
141+
rpc_client,
142+
account,
143+
ibc_client_contract_address: None,
144+
ibc_core_contract_address: None,
145+
};
146+
147+
Ok(context)
148+
}
149+
}
150+
151+
pub trait CanUseStarknetBuilder: CanBuildChain<Index<0>> + CanBuildChain<Index<1>> {}
152+
153+
impl CanUseStarknetBuilder for StarknetBuilder {}
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
1+
pub mod builder;
12
pub mod cosmos_to_starknet_relay;
23
pub mod starknet_to_cosmos_relay;

relayer/crates/starknet-test-components/src/impls/bootstrap/bootstrap_chain.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ use hermes_runtime_components::traits::os::child_process::HasChildProcessType;
1212
use hermes_runtime_components::traits::os::reserve_port::CanReserveTcpPort;
1313
use hermes_runtime_components::traits::random::CanGenerateRandom;
1414
use hermes_runtime_components::traits::runtime::HasRuntime;
15+
use hermes_starknet_chain_components::types::wallet::StarknetWallet;
1516
use hermes_test_components::bootstrap::traits::chain::ChainBootstrapper;
1617
use hermes_test_components::chain::traits::types::wallet::HasWalletType;
1718
use hermes_test_components::chain_driver::traits::types::chain::HasChainType;
1819
use starknet::macros::felt;
1920

2021
use crate::types::genesis_config::StarknetGenesisConfig;
2122
use crate::types::node_config::StarknetNodeConfig;
22-
use crate::types::wallet::StarknetWallet;
2323

2424
pub struct BootstrapStarknetDevnet;
2525

relayer/crates/starknet-test-components/src/impls/types/wallet.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1+
use hermes_starknet_chain_components::types::wallet::StarknetWallet;
12
use hermes_test_components::chain::traits::types::address::HasAddressType;
23
use hermes_test_components::chain::traits::types::wallet::ProvideWalletType;
34
use starknet::core::types::Felt;
45

5-
use crate::types::wallet::StarknetWallet;
6-
76
pub struct ProvideStarknetWalletType;
87

98
impl<Bootstrap> ProvideWalletType<Bootstrap> for ProvideStarknetWalletType
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
11
pub mod genesis_config;
22
pub mod node_config;
3-
pub mod wallet;

0 commit comments

Comments
 (0)