use std::net::SocketAddr;
use clap::{Parser, Subcommand};
use log::error;
use soroban_fork::{server::Server, ForkConfig};
#[derive(Parser, Debug)]
#[command(
version,
about = "Lazy-loading mainnet/testnet fork for Soroban — Anvil-equivalent for Stellar."
)]
struct Cli {
#[command(subcommand)]
command: Command,
}
#[derive(Subcommand, Debug)]
enum Command {
Serve {
#[arg(
long,
default_value = "https://soroban-rpc.mainnet.stellar.gateway.fm",
env = "SOROBAN_FORK_RPC"
)]
rpc: String,
#[arg(long, default_value = "127.0.0.1:8000", env = "SOROBAN_FORK_LISTEN")]
listen: SocketAddr,
#[arg(long, env = "SOROBAN_FORK_CACHE")]
cache: Option<std::path::PathBuf>,
#[arg(long)]
tracing: bool,
},
}
#[tokio::main]
async fn main() {
env_logger::Builder::from_env(
env_logger::Env::default().default_filter_or("soroban_fork=info"),
)
.init();
let cli = Cli::parse();
if let Err(e) = run(cli).await {
error!("{e}");
std::process::exit(1);
}
}
async fn run(cli: Cli) -> Result<(), Box<dyn std::error::Error>> {
match cli.command {
Command::Serve {
rpc,
listen,
cache,
tracing,
} => {
let mut config = ForkConfig::new(rpc).tracing(tracing);
if let Some(path) = cache {
config = config.cache_file(path);
}
Server::builder(config).listen(listen).serve().await?;
Ok(())
}
}
}