use crate::primitives::ChainId;
use serde::{Deserialize, Serialize};
use std::net::SocketAddr;
use std::path::PathBuf;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct NetworkConfig {
pub chain_id: ChainId,
pub network_name: String,
pub genesis_hash: String,
pub bootstrap_nodes: Vec<String>,
pub consensus: ConsensusConfig,
pub protocol_version: u32,
}
impl Default for NetworkConfig {
fn default() -> Self {
Self {
chain_id: ChainId::mainnet(),
network_name: "Tenzro Network Mainnet".to_string(),
genesis_hash: String::new(),
bootstrap_nodes: Vec::new(),
consensus: ConsensusConfig::default(),
protocol_version: 1,
}
}
}
impl NetworkConfig {
pub fn mainnet() -> Self {
Self {
chain_id: ChainId::mainnet(),
network_name: "Tenzro Network Mainnet".to_string(),
genesis_hash: String::new(),
bootstrap_nodes: Vec::new(),
consensus: ConsensusConfig::default(),
protocol_version: 1,
}
}
pub fn testnet() -> Self {
Self {
chain_id: ChainId::testnet(),
network_name: "Tenzro Network Testnet".to_string(),
genesis_hash: String::new(),
bootstrap_nodes: Vec::new(),
consensus: ConsensusConfig::default(),
protocol_version: 1,
}
}
pub fn devnet() -> Self {
Self {
chain_id: ChainId::new(31337),
network_name: "Tenzro Network Devnet".to_string(),
genesis_hash: String::new(),
bootstrap_nodes: Vec::new(),
consensus: ConsensusConfig::default(),
protocol_version: 1,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ConsensusConfig {
pub block_time_ms: u64,
pub max_block_size: u64,
pub max_transactions_per_block: u32,
pub min_validator_stake: u64,
pub max_validators: u32,
pub algorithm: String,
}
impl Default for ConsensusConfig {
fn default() -> Self {
Self {
block_time_ms: 2000, max_block_size: 1024 * 1024, max_transactions_per_block: 1000,
min_validator_stake: 10_000 * 10u64.pow(18), max_validators: 100,
algorithm: "PoS".to_string(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct NodeConfig {
pub node_name: String,
pub data_dir: PathBuf,
pub network: NetworkConfig,
pub p2p: P2pConfig,
pub rpc: RpcConfig,
pub storage: StorageConfig,
pub logging: LoggingConfig,
}
impl Default for NodeConfig {
fn default() -> Self {
Self {
node_name: "tenzro-node".to_string(),
data_dir: PathBuf::from("./data"),
network: NetworkConfig::default(),
p2p: P2pConfig::default(),
rpc: RpcConfig::default(),
storage: StorageConfig::default(),
logging: LoggingConfig::default(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct P2pConfig {
pub listen_address: SocketAddr,
pub public_address: Option<SocketAddr>,
pub max_inbound_peers: u32,
pub max_outbound_peers: u32,
pub enable_discovery: bool,
pub bootstrap_nodes: Vec<String>,
}
impl Default for P2pConfig {
fn default() -> Self {
Self {
listen_address: "0.0.0.0:26656".parse().unwrap(),
public_address: None,
max_inbound_peers: 50,
max_outbound_peers: 25,
enable_discovery: true,
bootstrap_nodes: Vec::new(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RpcConfig {
pub enabled: bool,
pub listen_address: SocketAddr,
pub enable_http: bool,
pub enable_ws: bool,
pub cors_allowed_origins: Vec<String>,
pub max_request_size: usize,
}
impl Default for RpcConfig {
fn default() -> Self {
Self {
enabled: true,
listen_address: "127.0.0.1:8545".parse().unwrap(),
enable_http: true,
enable_ws: true,
cors_allowed_origins: vec!["*".to_string()],
max_request_size: 1024 * 1024, }
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct StorageConfig {
pub backend: StorageBackend,
pub db_path: PathBuf,
pub cache_size_mb: u64,
pub enable_pruning: bool,
pub pruning_interval: u64,
}
impl Default for StorageConfig {
fn default() -> Self {
Self {
backend: StorageBackend::RocksDb,
db_path: PathBuf::from("./data/db"),
cache_size_mb: 512,
enable_pruning: false,
pruning_interval: 1000,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum StorageBackend {
RocksDb,
Memory,
Custom,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct LoggingConfig {
pub level: LogLevel,
pub format: LogFormat,
pub log_to_file: bool,
pub log_file_path: Option<PathBuf>,
pub json_logs: bool,
}
impl Default for LoggingConfig {
fn default() -> Self {
Self {
level: LogLevel::Info,
format: LogFormat::Text,
log_to_file: false,
log_file_path: None,
json_logs: false,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum LogLevel {
Trace,
Debug,
Info,
Warn,
Error,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum LogFormat {
Text,
Json,
Compact,
}