from __future__ import annotations from pathlib import Path from typing import Optional from pydantic_settings import BaseSettings, SettingsConfigDict class ChainSettings(BaseSettings): model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", case_sensitive=False) chain_id: str = "ait-devnet" db_path: Path = Path("./data/chain.db") rpc_bind_host: str = "127.0.0.1" rpc_bind_port: int = 8080 p2p_bind_host: str = "127.0.0.2" p2p_bind_port: int = 7070 proposer_id: str = "ait-devnet-proposer" proposer_key: Optional[str] = None mint_per_unit: int = 1000 coordinator_ratio: float = 0.05 block_time_seconds: int = 2 # Block production limits max_block_size_bytes: int = 1_000_000 # 1 MB max_txs_per_block: int = 500 min_fee: int = 0 # Minimum fee to accept into mempool # Mempool settings mempool_backend: str = "database" # "database" or "memory" (database recommended for persistence) mempool_max_size: int = 10_000 mempool_eviction_interval: int = 60 # seconds # Circuit breaker circuit_breaker_threshold: int = 5 # failures before opening circuit_breaker_timeout: int = 30 # seconds before half-open # Sync settings trusted_proposers: str = "" # comma-separated list of trusted proposer IDs max_reorg_depth: int = 10 # max blocks to reorg on conflict sync_validate_signatures: bool = True # validate proposer signatures on import gossip_backend: str = "memory" gossip_broadcast_url: Optional[str] = None settings = ChainSettings()