use std::sync::LazyLock;
use r402_core::chain::NetworkInfo;
use crate::chain::{
HBAR_ASSET_ID, HBAR_DECIMALS, HEDERA_MAINNET_USDC, HEDERA_TESTNET_USDC, HederaAddress,
HederaChainReference, HederaTokenDeployment, USDC_DECIMALS,
};
pub static HEDERA_NETWORKS: &[NetworkInfo] = &[
NetworkInfo {
name: "hedera",
namespace: "hedera",
reference: "mainnet",
},
NetworkInfo {
name: "hedera-testnet",
namespace: "hedera",
reference: "testnet",
},
];
#[allow(
clippy::expect_used,
reason = "hardcoded constant is infallible; validated by tests"
)]
fn well_known(s: &str) -> HederaAddress {
s.parse().expect("well-known hedera address must be valid")
}
static HBAR_DEPLOYMENTS: LazyLock<Vec<HederaTokenDeployment>> = LazyLock::new(|| {
vec![
HederaTokenDeployment::new(
HederaChainReference::MAINNET,
well_known(HBAR_ASSET_ID),
HBAR_DECIMALS,
),
HederaTokenDeployment::new(
HederaChainReference::TESTNET,
well_known(HBAR_ASSET_ID),
HBAR_DECIMALS,
),
]
});
static USDC_DEPLOYMENTS: LazyLock<Vec<HederaTokenDeployment>> = LazyLock::new(|| {
vec![
HederaTokenDeployment::new(
HederaChainReference::MAINNET,
well_known(HEDERA_MAINNET_USDC),
USDC_DECIMALS,
),
HederaTokenDeployment::new(
HederaChainReference::TESTNET,
well_known(HEDERA_TESTNET_USDC),
USDC_DECIMALS,
),
]
});
#[must_use]
pub fn usdc_hedera_deployments() -> &'static [HederaTokenDeployment] {
&USDC_DEPLOYMENTS
}
#[must_use]
pub fn usdc_hedera_deployment(
chain: HederaChainReference,
) -> Option<&'static HederaTokenDeployment> {
USDC_DEPLOYMENTS.iter().find(|d| d.chain_reference == chain)
}
#[must_use]
pub fn hbar_deployment(chain: HederaChainReference) -> Option<&'static HederaTokenDeployment> {
HBAR_DEPLOYMENTS.iter().find(|d| d.chain_reference == chain)
}
#[derive(Debug, Clone, Copy)]
#[allow(
clippy::upper_case_acronyms,
reason = "USDC is a well-known token ticker"
)]
pub struct USDC;
#[allow(
clippy::missing_panics_doc,
clippy::expect_used,
reason = "static deployment lookups are infallible for built-in data"
)]
impl USDC {
#[must_use]
pub fn on(chain: HederaChainReference) -> Option<&'static HederaTokenDeployment> {
usdc_hedera_deployment(chain)
}
#[must_use]
pub fn all() -> &'static [HederaTokenDeployment] {
usdc_hedera_deployments()
}
#[must_use]
pub fn hedera() -> &'static HederaTokenDeployment {
usdc_hedera_deployment(HederaChainReference::MAINNET)
.expect("built-in USDC deployment for hedera mainnet missing")
}
#[must_use]
pub fn hedera_testnet() -> &'static HederaTokenDeployment {
usdc_hedera_deployment(HederaChainReference::TESTNET)
.expect("built-in USDC deployment for hedera testnet missing")
}
}
#[derive(Debug, Clone, Copy)]
#[allow(
clippy::upper_case_acronyms,
reason = "HBAR is a well-known token ticker"
)]
pub struct HBAR;
#[allow(
clippy::missing_panics_doc,
clippy::expect_used,
reason = "static deployment lookups are infallible for built-in data"
)]
impl HBAR {
#[must_use]
pub fn hedera() -> &'static HederaTokenDeployment {
hbar_deployment(HederaChainReference::MAINNET)
.expect("built-in HBAR deployment for hedera mainnet missing")
}
#[must_use]
pub fn hedera_testnet() -> &'static HederaTokenDeployment {
hbar_deployment(HederaChainReference::TESTNET)
.expect("built-in HBAR deployment for hedera testnet missing")
}
}
#[cfg(test)]
#[allow(clippy::unwrap_used, reason = "test assertions")]
mod tests {
use super::*;
use crate::chain::{HBAR_ASSET_ID, HEDERA_MAINNET_USDC, HEDERA_TESTNET_USDC};
#[test]
fn usdc_and_hbar_deployments_resolve() {
assert_eq!(USDC::hedera().decimals, USDC_DECIMALS);
assert_eq!(USDC::hedera_testnet().decimals, USDC_DECIMALS);
assert_eq!(USDC::hedera().address.as_str(), HEDERA_MAINNET_USDC);
assert_eq!(USDC::hedera_testnet().address.as_str(), HEDERA_TESTNET_USDC);
assert_eq!(USDC::all().len(), 2);
assert_eq!(HBAR::hedera().address.as_str(), HBAR_ASSET_ID);
assert_eq!(HBAR::hedera().decimals, HBAR_DECIMALS);
assert_eq!(HEDERA_NETWORKS.len(), 2);
}
}