pot-o-validator 0.10.0

PoT-O (Proof of Tensor Optimizations) Validator Service
Documentation
use hexchain_p2p::block_store::BlockStore;
use pot_o_extensions::{load_ledger, ExtensionRegistry, DEFAULT_LEDGER_PATH};
use pot_o_extensions::{Genesis, Mempool};
use std::path::Path;
use std::sync::Arc;

use crate::config::ValidatorConfig;

pub fn build_extension_registry(cfg: &ValidatorConfig) -> ExtensionRegistry {
    let ledger_path =
        std::env::var("LEDGER_PATH").unwrap_or_else(|_| DEFAULT_LEDGER_PATH.to_string());
    let mut ledger = load_ledger(&ledger_path, &cfg.protocol_fee_address);

    let genesis: Option<Genesis> =
        if cfg.tribechain_enabled && !cfg.tribechain_genesis_path.is_empty() {
            let blockstore_path = &cfg.tribechain_blockstore_path;
            let is_fresh_chain = !Path::new(blockstore_path).exists();

            match Genesis::load(&cfg.tribechain_genesis_path) {
                Ok(g) => {
                    if let Err(e) = g.validate() {
                        tracing::warn!("Invalid genesis file (tribechain disabled): {}", e);
                        None
                    } else if is_fresh_chain {
                        if let Err(e) = g.apply_to_ledger(&mut ledger) {
                            tracing::warn!("Failed to apply genesis to ledger: {}", e);
                            None
                        } else {
                            tracing::info!(
                                "Initialized ledger from genesis: {} entries, chain_id={}",
                                g.entries.len(),
                                g.chain_id
                            );
                            Some(g)
                        }
                    } else {
                        tracing::info!("Chain already initialized, skipping genesis apply");
                        Some(g)
                    }
                }
                Err(e) => {
                    tracing::warn!("Failed to load genesis (tribechain disabled): {}", e);
                    None
                }
            }
        } else {
            None
        };

    let mut registry = ExtensionRegistry::from_config(
        &cfg.peer_network_mode,
        &cfg.pool_strategy,
        &cfg.device_protocol,
        &cfg.protocol_fee_address,
        cfg.marketplace_fee_bps,
        Some(ledger),
        &cfg.bootstrap_urls,
        cfg.enable_mdns,
        &cfg.mdns_service_name,
        cfg.peer_timeout_secs,
        cfg.challenge_relay_enabled,
    );

    if cfg.tribechain_enabled {
        registry.mempool = Some(Arc::new(Mempool::new(
            cfg.tribechain_max_pool_size,
            cfg.tribechain_min_fee,
        )));
        registry.block_store = Some(Arc::new(BlockStore::new(&cfg.tribechain_blockstore_path)));
        registry.genesis = genesis;
        registry.tribechain_enabled = true;
    }

    registry
}