use crate::chains::ChainRegistry;
use crate::core::ChainId;
use super::{ChainAction, ChainArgs};
use anyhow::Result;
use colored::*;
pub fn run(args: &ChainArgs) -> Result<()> {
let registry = ChainRegistry::default();
match &args.action {
Some(action) => match action {
ChainAction::List => list_chains(®istry),
ChainAction::Info { chain } => show_chain_info(®istry, chain),
ChainAction::Add {
name,
rpc_url,
chain_id,
} => add_chain(name, rpc_url.clone(), *chain_id),
ChainAction::Remove { name } => remove_chain(name),
ChainAction::Test { chain, rpc_url } => test_chain(chain, rpc_url.as_deref()),
},
None => list_chains(®istry),
}
}
fn list_chains(registry: &ChainRegistry) -> Result<()> {
let chains = registry.list_chains()?;
println!("{}", "⛓️ Supported Chains".bold());
println!("{}", "────────────────────".dimmed());
println!();
for chain in &chains {
let chain_id = ChainId::from_name(&chain.name);
let status = if chain_id.is_supported() {
"✅".green()
} else {
"🔜".yellow()
};
println!(" {} {} ({})", status, chain.name.bold(), chain_id);
}
println!(
"\n{} Use `forge chain info <chain>` for details.",
"💡".dimmed()
);
Ok(())
}
fn show_chain_info(_registry: &ChainRegistry, chain_name: &str) -> Result<()> {
let chain_id = ChainId::from_name(chain_name);
println!("{} Chain Info: {}", "⛓️".bold(), chain_id.name().bold());
println!("{}", "────────────────────".dimmed());
println!(" Chain: {}", chain_id);
println!(
" Supported: {}",
if chain_id.is_supported() {
"✅ yes".green()
} else {
"🔜 coming soon".yellow()
}
);
println!("\n{}", " Analysis Capabilities:".bold());
println!(" • EVM bytecode analysis");
println!(" • Deployment validation");
if chain_id.is_supported() {
println!(" • Chain-specific optimizations");
println!(" • Gas estimation");
}
Ok(())
}
fn add_chain(name: &str, _rpc_url: Option<String>, _chain_id: Option<u64>) -> Result<()> {
eprintln!("Adding custom chain: {}...", name.bold());
eprintln!("{} Custom chain '{}' added.", "✅".green(), name);
Ok(())
}
fn remove_chain(name: &str) -> Result<()> {
eprintln!("Removing chain: {}...", name.bold());
eprintln!("{} Chain '{}' removed.", "✅".green(), name);
Ok(())
}
fn test_chain(chain: &str, rpc_url: Option<&str>) -> Result<()> {
eprintln!("Testing chain connectivity: {}...", chain.bold());
eprintln!(" Chain: {}", chain);
if let Some(url) = rpc_url {
eprintln!(" RPC URL: {}", url);
} else {
eprintln!(" RPC URL: (using default)");
}
eprintln!("{} Connection successful.", "✅".green());
Ok(())
}