hopr_chain_connector/
lib.rs

1mod backend;
2mod connector;
3pub mod errors;
4mod reader;
5#[cfg(feature = "testing")]
6pub mod testing;
7
8pub(crate) mod utils;
9
10#[cfg(feature = "testing")]
11pub use backend::InMemoryBackend;
12pub use backend::{Backend, TempDbBackend};
13pub use connector::{BlockchainConnectorConfig, HoprBlockchainConnector};
14pub use hopr_chain_types::payload::{BasicPayloadGenerator, SafePayloadGenerator};
15pub use reader::HoprBlockchainReader;
16
17/// Re-exports of the `blokli_client` crate.
18pub mod blokli_client {
19    pub use blokli_client::{
20        BlokliClient, BlokliClientConfig,
21        api::{BlokliQueryClient, BlokliSubscriptionClient, BlokliTransactionClient},
22    };
23}
24
25#[doc(hidden)]
26pub mod reexports {
27    pub use hopr_chain_types;
28    /// Export of relevant types for easier integration.
29    pub use hopr_chain_types::exports::alloy;
30}
31
32pub use hopr_chain_types::prelude::{ContractAddresses, PayloadGenerator};
33pub use hopr_crypto_types::prelude::ChainKeypair;
34use hopr_crypto_types::prelude::Keypair;
35pub use hopr_primitive_types::prelude::Address;
36
37/// Connector to HOPR on-chain contracts that uses multisig Safe as a signer and [`TempDbBackend`].
38pub type HoprBlockchainSafeConnector<C> = HoprBlockchainConnector<
39    C,
40    TempDbBackend,
41    SafePayloadGenerator,
42    <SafePayloadGenerator as PayloadGenerator>::TxRequest,
43>;
44
45/// Connector to HOPR on-chain contracts that uses standard EOA as a signer and [`TempDbBackend`].
46pub type HoprBlockchainBasicConnector<C> = HoprBlockchainConnector<
47    C,
48    TempDbBackend,
49    BasicPayloadGenerator,
50    <BasicPayloadGenerator as PayloadGenerator>::TxRequest,
51>;
52
53/// Convenience function to create [`HoprBlockchainConnector`] with own contract addresses.
54///
55/// The returned instance uses [`TempDbBackend`] and [`hopr_chain_types::payload::bindings_based::SafePayloadGenerator`]
56pub fn create_trustless_hopr_blokli_connector<C>(
57    chain_key: &ChainKeypair,
58    cfg: BlockchainConnectorConfig,
59    client: C,
60    module_address: Address,
61    contracts: ContractAddresses,
62) -> Result<HoprBlockchainSafeConnector<C>, errors::ConnectorError>
63where
64    C: blokli_client::BlokliSubscriptionClient
65        + blokli_client::BlokliQueryClient
66        + blokli_client::BlokliTransactionClient
67        + Send
68        + Sync
69        + 'static,
70{
71    let payload_gen = SafePayloadGenerator::new(chain_key, contracts, module_address);
72
73    Ok(HoprBlockchainConnector::new(
74        chain_key.clone(),
75        cfg,
76        client,
77        TempDbBackend::new()?,
78        payload_gen,
79    ))
80}
81
82/// Convenience function to create [`HoprBlockchainConnector`] with own contract addresses.
83///
84/// The transactions generated using this Connector are simply signed using the `chain_key` EOA.
85///
86/// The returned instance uses [`TempDbBackend`] and [`BasicPayloadGenerator`]
87pub fn create_trustless_safeless_hopr_blokli_connector<C>(
88    chain_key: &ChainKeypair,
89    cfg: BlockchainConnectorConfig,
90    client: C,
91    contracts: ContractAddresses,
92) -> Result<HoprBlockchainBasicConnector<C>, errors::ConnectorError>
93where
94    C: blokli_client::BlokliSubscriptionClient
95        + blokli_client::BlokliQueryClient
96        + blokli_client::BlokliTransactionClient
97        + Send
98        + Sync
99        + 'static,
100{
101    let payload_gen = BasicPayloadGenerator::new(chain_key.public().to_address(), contracts);
102
103    Ok(HoprBlockchainConnector::new(
104        chain_key.clone(),
105        cfg,
106        client,
107        TempDbBackend::new()?,
108        payload_gen,
109    ))
110}
111
112/// Convenience function to create [`HoprBlockchainConnector`] with contract addresses retrieved from the given
113/// `client`.
114///
115/// This instantiation explicitly trusts the contract address information retrieved from the
116/// [`blokli_client::BlokliClient`].
117/// If you wish to provide your own deployment information, use the [`create_trustless_hopr_blokli_connector`] function.
118///
119/// The returned instance uses [`TempDbBackend`] and [`SafePayloadGenerator`].
120pub async fn create_trustful_hopr_blokli_connector<C>(
121    chain_key: &ChainKeypair,
122    cfg: BlockchainConnectorConfig,
123    client: C,
124    module_address: Address,
125) -> Result<HoprBlockchainSafeConnector<C>, errors::ConnectorError>
126where
127    C: blokli_client::BlokliSubscriptionClient
128        + blokli_client::BlokliQueryClient
129        + blokli_client::BlokliTransactionClient
130        + Send
131        + Sync
132        + 'static,
133{
134    let info = client.query_chain_info().await?;
135    let contract_addrs = serde_json::from_str(&info.contract_addresses.0)
136        .map_err(|e| errors::ConnectorError::TypeConversion(format!("contract addresses not a valid JSON: {e}")))?;
137
138    let payload_gen = SafePayloadGenerator::new(chain_key, contract_addrs, module_address);
139
140    Ok(HoprBlockchainConnector::new(
141        chain_key.clone(),
142        cfg,
143        client,
144        TempDbBackend::new()?,
145        payload_gen,
146    ))
147}
148
149/// Convenience function to create [`HoprBlockchainConnector`] with contract addresses retrieved from the given
150/// `client`.
151///
152/// The transactions generated using this Connector are simply signed using the `chain_key` EOA.
153///
154/// This instantiation explicitly trusts the contract address information retrieved from the
155/// [`blokli_client::BlokliClient`].
156/// If you wish to provide your own deployment information, use the [`create_trustless_safeless_hopr_blokli_connector`]
157/// function.
158///
159/// The returned instance uses [`TempDbBackend`] and [`BasicPayloadGenerator`].
160pub async fn create_trustful_safeless_hopr_blokli_connector<C>(
161    chain_key: &ChainKeypair,
162    cfg: BlockchainConnectorConfig,
163    client: C,
164) -> Result<HoprBlockchainBasicConnector<C>, errors::ConnectorError>
165where
166    C: blokli_client::BlokliSubscriptionClient
167        + blokli_client::BlokliQueryClient
168        + blokli_client::BlokliTransactionClient
169        + Send
170        + Sync
171        + 'static,
172{
173    let info = client.query_chain_info().await?;
174    let contract_addrs = serde_json::from_str(&info.contract_addresses.0)
175        .map_err(|e| errors::ConnectorError::TypeConversion(format!("contract addresses not a valid JSON: {e}")))?;
176
177    let payload_gen = BasicPayloadGenerator::new(chain_key.public().to_address(), contract_addrs);
178
179    Ok(HoprBlockchainConnector::new(
180        chain_key.clone(),
181        cfg,
182        client,
183        TempDbBackend::new()?,
184        payload_gen,
185    ))
186}