hopr_chain_connector/
lib.rs

1mod backend;
2mod connector;
3pub mod errors;
4#[cfg(feature = "testing")]
5pub mod testing;
6
7#[cfg(feature = "testing")]
8pub use backend::InMemoryBackend;
9pub use backend::{Backend, TempDbBackend};
10pub use connector::{BlockchainConnectorConfig, HoprBlockchainConnector};
11pub use hopr_chain_types::payload::SafePayloadGenerator;
12
13/// Re-exports of the `blokli_client` crate.
14pub mod blokli_client {
15    pub use blokli_client::{
16        BlokliClient, BlokliClientConfig,
17        api::{BlokliQueryClient, BlokliSubscriptionClient, BlokliTransactionClient},
18    };
19}
20
21pub use hopr_chain_types::prelude::{ContractAddresses, PayloadGenerator};
22pub use hopr_crypto_types::prelude::ChainKeypair;
23pub use hopr_primitive_types::prelude::Address;
24
25/// Connector to HOPR on-chain contracts that uses multisig Safe as a signer and [`TempDbBackend`].
26pub type HoprBlockchainSafeConnector<C> = HoprBlockchainConnector<
27    C,
28    TempDbBackend,
29    SafePayloadGenerator,
30    <SafePayloadGenerator as PayloadGenerator>::TxRequest,
31>;
32
33/// Convenience function to create [`HoprBlokliConnector`] with own contract addresses.
34///
35/// The returned instance uses [`TempDbBackend`] and [`hopr_chain_types::payload::bindings_based::SafePayloadGenerator`]
36pub fn create_trustless_hopr_blokli_connector<C>(
37    chain_key: &ChainKeypair,
38    cfg: BlockchainConnectorConfig,
39    client: C,
40    module_address: Address,
41    contracts: ContractAddresses,
42) -> Result<HoprBlockchainSafeConnector<C>, errors::ConnectorError>
43where
44    C: blokli_client::BlokliSubscriptionClient
45        + blokli_client::BlokliQueryClient
46        + blokli_client::BlokliTransactionClient
47        + Send
48        + Sync
49        + 'static,
50{
51    let payload_gen = SafePayloadGenerator::new(chain_key, contracts, module_address);
52
53    Ok(HoprBlockchainConnector::new(
54        chain_key.clone(),
55        cfg,
56        client,
57        TempDbBackend::new()?,
58        payload_gen,
59    ))
60}
61
62/// Convenience function to create [`HoprBlokliConnector`] with contract addresses retrieved from the given `client`.
63///
64/// This instantiation explicitly trusts the contract address information retrieved from the
65/// [`blokli_client::BlokliClient`].
66/// If you wish to provide your own deployment information, use the [`create_trustless_hopr_blokli_connector`] function.
67///
68/// The returned instance uses [`TempDbBackend`] and [`hopr_chain_types::payload::bindings_based::SafePayloadGenerator`]
69pub async fn create_trustful_hopr_blokli_connector<C>(
70    chain_key: &ChainKeypair,
71    cfg: BlockchainConnectorConfig,
72    client: C,
73    module_address: Address,
74) -> Result<HoprBlockchainSafeConnector<C>, errors::ConnectorError>
75where
76    C: blokli_client::BlokliSubscriptionClient
77        + blokli_client::BlokliQueryClient
78        + blokli_client::BlokliTransactionClient
79        + Send
80        + Sync
81        + 'static,
82{
83    let info = client.query_chain_info().await?;
84    let contract_addrs = serde_json::from_str(&info.contract_addresses.0)
85        .map_err(|e| errors::ConnectorError::TypeConversion(format!("contract addresses not a valid JSON: {e}")))?;
86
87    let payload_gen = SafePayloadGenerator::new(chain_key, contract_addrs, module_address);
88
89    Ok(HoprBlockchainConnector::new(
90        chain_key.clone(),
91        cfg,
92        client,
93        TempDbBackend::new()?,
94        payload_gen,
95    ))
96}