Skip to main content

hopr_chain_connector/
lib.rs

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