use std::net::SocketAddr;
use std::time::Duration;
use chia_protocol::Bytes32;
use chia_wallet_sdk::types::{MAINNET_CONSTANTS, TESTNET11_CONSTANTS};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ChiaNetwork {
Mainnet,
Testnet11,
}
const MAINNET_PORT: u16 = 8444;
const TESTNET11_PORT: u16 = 58444;
impl ChiaNetwork {
pub fn network_id(self) -> &'static str {
match self {
ChiaNetwork::Mainnet => "mainnet",
ChiaNetwork::Testnet11 => "testnet11",
}
}
pub fn default_port(self) -> u16 {
match self {
ChiaNetwork::Mainnet => MAINNET_PORT,
ChiaNetwork::Testnet11 => TESTNET11_PORT,
}
}
pub fn genesis_challenge(self) -> Bytes32 {
match self {
ChiaNetwork::Mainnet => MAINNET_CONSTANTS.genesis_challenge,
ChiaNetwork::Testnet11 => TESTNET11_CONSTANTS.genesis_challenge,
}
}
}
#[derive(Debug, Clone)]
pub struct ChiaPeerConfig {
pub network: ChiaNetwork,
pub endpoint: Option<SocketAddr>,
pub trusted: bool,
pub connect_timeout: Duration,
pub request_timeout: Duration,
pub tls_cert_path: Option<String>,
pub tls_key_path: Option<String>,
}
impl ChiaPeerConfig {
pub fn mainnet() -> Self {
Self::discovering(ChiaNetwork::Mainnet)
}
pub fn testnet11() -> Self {
Self::discovering(ChiaNetwork::Testnet11)
}
pub fn discovering(network: ChiaNetwork) -> Self {
Self {
network,
endpoint: None,
trusted: false,
connect_timeout: Duration::from_secs(5),
request_timeout: Duration::from_secs(15),
tls_cert_path: None,
tls_key_path: None,
}
}
pub fn with_trusted_endpoint(mut self, endpoint: SocketAddr) -> Self {
self.endpoint = Some(endpoint);
self.trusted = true;
self
}
pub fn with_tls(mut self, cert_path: impl Into<String>, key_path: impl Into<String>) -> Self {
self.tls_cert_path = Some(cert_path.into());
self.tls_key_path = Some(key_path.into());
self
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::net::{IpAddr, Ipv4Addr};
#[test]
fn network_ids_and_ports_are_canonical() {
assert_eq!(ChiaNetwork::Mainnet.network_id(), "mainnet");
assert_eq!(ChiaNetwork::Testnet11.network_id(), "testnet11");
assert_eq!(ChiaNetwork::Mainnet.default_port(), 8444);
assert_eq!(ChiaNetwork::Testnet11.default_port(), 58444);
}
#[test]
fn genesis_challenge_differs_per_network() {
assert_ne!(
ChiaNetwork::Mainnet.genesis_challenge(),
ChiaNetwork::Testnet11.genesis_challenge()
);
}
#[test]
fn discovering_config_is_untrusted_with_no_endpoint() {
let cfg = ChiaPeerConfig::mainnet();
assert!(!cfg.trusted);
assert!(cfg.endpoint.is_none());
}
#[test]
fn trusted_endpoint_marks_config_trusted() {
let addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 8444);
let cfg = ChiaPeerConfig::testnet11().with_trusted_endpoint(addr);
assert!(cfg.trusted);
assert_eq!(cfg.endpoint, Some(addr));
}
#[test]
fn with_tls_sets_both_paths() {
let cfg = ChiaPeerConfig::mainnet().with_tls("cert.pem", "key.pem");
assert_eq!(cfg.tls_cert_path.as_deref(), Some("cert.pem"));
assert_eq!(cfg.tls_key_path.as_deref(), Some("key.pem"));
}
}