hopr_chain_types/
lib.rs

1//! This crate contains various on-chain related modules and types.
2
3pub mod chain_events;
4pub mod errors;
5#[cfg(feature = "use-bindings")]
6mod parser;
7pub mod payload;
8
9#[cfg(feature = "use-bindings")]
10pub use {
11    hopr_bindings::{ContractAddresses, exports, exports::alloy::primitives::Address as AlloyAddress},
12    parser::ParsedHoprChainAction,
13};
14
15pub mod prelude {
16    #[cfg(feature = "use-bindings")]
17    pub use super::payload::{BasicPayloadGenerator, SafePayloadGenerator, TransactionRequest};
18    pub use super::{
19        ContractAddresses,
20        chain_events::ChainEvent,
21        payload::{GasEstimation, PayloadGenerator, SignableTransaction},
22    };
23}
24
25#[cfg(not(feature = "use-bindings"))]
26/// Holds addresses of all smart contracts.
27#[serde_with::serde_as]
28#[derive(Clone, Copy, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize, Default)]
29pub struct ContractAddresses {
30    /// Token contract
31    #[serde_as(as = "serde_with::DisplayFromStr")]
32    pub token: hopr_primitive_types::primitives::Address,
33    /// Channels contract
34    #[serde_as(as = "serde_with::DisplayFromStr")]
35    pub channels: hopr_primitive_types::primitives::Address,
36    /// Announcement contract
37    #[serde_as(as = "serde_with::DisplayFromStr")]
38    pub announcements: hopr_primitive_types::primitives::Address,
39    /// Safe registry contract
40    #[serde_as(as = "serde_with::DisplayFromStr")]
41    pub node_safe_registry: hopr_primitive_types::primitives::Address,
42    /// Price oracle contract
43    #[serde_as(as = "serde_with::DisplayFromStr")]
44    pub ticket_price_oracle: hopr_primitive_types::primitives::Address,
45    /// Minimum ticket winning probability contract
46    #[serde_as(as = "serde_with::DisplayFromStr")]
47    pub winning_probability_oracle: hopr_primitive_types::primitives::Address,
48    /// Migration helper for node safes and modules
49    #[serde_as(as = "serde_with::DisplayFromStr")]
50    pub node_safe_migration: hopr_primitive_types::primitives::Address,
51    /// Stake factory contract
52    #[serde_as(as = "serde_with::DisplayFromStr")]
53    pub node_stake_factory: hopr_primitive_types::primitives::Address,
54    /// Node management module contract (can be zero if safe is not used)
55    #[serde_as(as = "serde_with::DisplayFromStr")]
56    pub module_implementation: hopr_primitive_types::primitives::Address,
57}
58
59#[cfg(not(feature = "use-bindings"))]
60impl IntoIterator for &ContractAddresses {
61    type IntoIter = std::vec::IntoIter<Address>;
62    type Item = Address;
63
64    fn into_iter(self) -> Self::IntoIter {
65        vec![
66            self.token,
67            self.channels,
68            self.announcements,
69            self.node_safe_registry,
70            self.ticket_price_oracle,
71            self.winning_probability_oracle,
72            self.node_stake_factory,
73            self.module_implementation,
74        ]
75        .into_iter()
76    }
77}
78
79/// Returns chain ID and contract addresses for a known HOPR network on-chain deployment with the given `name` (e.g.
80/// `rotsee` or `dufour`)
81///
82/// Returns `None` if network deployment with the given `name` is not known.
83#[cfg(feature = "use-bindings")]
84pub fn contract_addresses_for_network(name: &str) -> Option<(u64, ContractAddresses)> {
85    hopr_bindings::config::NetworksWithContractAddresses::default()
86        .networks
87        .get(name)
88        .cloned()
89        .map(|n| (n.chain_id, n.addresses))
90}
91
92// Used instead of From implementation to avoid alloy being a dependency of the primitive crates
93#[inline]
94pub(crate) fn a2al(a: hopr_primitive_types::prelude::Address) -> AlloyAddress {
95    AlloyAddress::from_slice(a.as_ref())
96}