use crate::Error;
use crate::model::{ArchiveConfig, ChainPoint, Retention};
use libp2p::Multiaddr;
use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4};
use urma_chain::observation::Chain;
use urma_runtime::p2p::Anchor;
pub const WINDOWS_PRODUCT_DIR: &str = "URMA Node";
pub const SERVICE_NAME: &str = "urma-node";
pub const SERVICE_CHAIN: Chain = Chain::LitecoinTestnet;
pub const SERVICE_LISTEN: SocketAddr =
SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::LOCALHOST, 28331));
pub const SERVICE_OBJECT_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(15);
pub const SERVICE_URMA_LISTEN: SocketAddr =
SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::UNSPECIFIED, 28332));
pub fn service_archive_config() -> Result<ArchiveConfig, Error> {
let anchor =
Anchor::embedded(SERVICE_CHAIN).map_err(|error| Error::Invalid(error.to_string()))?;
Ok(ArchiveConfig {
chain: SERVICE_CHAIN,
application_start: ChainPoint {
height: anchor.height,
hash: anchor.header.block_hash(),
},
retention: Retention::Unpruned,
})
}
#[cfg(windows)]
pub fn program_data() -> std::path::PathBuf {
match std::env::var_os("ProgramData") {
Some(dir) => std::path::PathBuf::from(dir),
None => std::path::PathBuf::from(r"C:\ProgramData"),
}
}
#[cfg(windows)]
pub fn program_files() -> std::path::PathBuf {
match std::env::var_os("ProgramFiles") {
Some(dir) => std::path::PathBuf::from(dir),
None => std::path::PathBuf::from(r"C:\Program Files"),
}
}
pub const SEEDS: &[(Chain, &str)] = &[
(Chain::LitecoinMainnet, "/dnsaddr/ltc-seed.urma.rosint.org"),
(Chain::LitecoinTestnet, "/dnsaddr/tltc-seed.urma.rosint.org"),
];
pub fn seeds(chain: Chain) -> Result<Vec<Multiaddr>, Error> {
let genesis = |chain: Chain| {
chain
.genesis()
.map(|identity| identity.0)
.map_err(|error| Error::Invalid(error.to_string()))
};
let wanted = genesis(chain)?;
let mut seeds = Vec::new();
for (seeded, address) in SEEDS {
if genesis(*seeded)? == wanted {
let parsed = address
.parse()
.map_err(|error| Error::Invalid(format!("built-in seed {address}: {error}")))?;
seeds.push(parsed);
}
}
Ok(seeds)
}