use std::path::PathBuf;
use clap::Parser;
use sidestr_round::node::{run, ParentSettings, Settings};
use sidestr_round::pegout::PegoutConfig;
use sidestr_round::round::RoundConfig;
#[derive(Debug, Parser)]
#[command(name = "cosign", version, about)]
struct Args {
#[arg(long)]
chain: PathBuf,
#[arg(long)]
dir: PathBuf,
#[arg(long)]
key_file: PathBuf,
#[arg(long, default_value_t = 3450)]
port: u16,
#[arg(long, default_value_t = 600)]
interval: u64,
#[arg(long, default_value_t = 30)]
tx_interval: u64,
#[arg(long, default_value_t = 30)]
propose_after: u64,
#[arg(long, default_value = "upstream")]
resign_after: String,
#[arg(long, value_delimiter = ',')]
relay: Vec<String>,
#[arg(long, value_delimiter = ',')]
announce_mirror: Vec<String>,
#[arg(long)]
parent_rpc: Option<String>,
#[arg(long)]
parent_cookie: Option<PathBuf>,
#[arg(long)]
parent_wallet: Option<String>,
#[arg(long, default_value_t = 60)]
parent_poll: u64,
#[arg(long, default_value_t = 0)]
parent_from: u32,
#[arg(long)]
journal: Option<PathBuf>,
#[arg(long, default_value_t = 2)]
fee_rate: u64,
#[arg(long, default_value_t = 100_000)]
max_fee: u64,
}
fn main() {
let a = Args::parse();
let resign_after = match a.resign_after.as_str() {
"upstream" => Some(a.propose_after),
"never" => None,
s => match s.parse::<u64>() {
Ok(n) => Some(n),
Err(_) => {
eprintln!("--resign-after: \"upstream\", \"never\" or a number of seconds");
std::process::exit(2);
}
},
};
let parent = a.parent_rpc.map(|url| ParentSettings {
url,
cookie: a.parent_cookie.unwrap_or_else(|| {
let home = std::env::var("HOME").unwrap_or_default();
PathBuf::from(home).join(".bitcoin/.cookie")
}),
wallet: a.parent_wallet,
poll: a.parent_poll,
from: a.parent_from,
});
let settings = Settings {
chain: a.chain,
dir: a.dir,
key_file: a.key_file,
port: a.port,
interval: a.interval,
tx_interval: a.tx_interval,
round: RoundConfig {
propose_after: a.propose_after,
resign_after,
},
pegout: PegoutConfig {
propose_after: a.propose_after,
resign_after,
fee_rate: a.fee_rate,
max_fee: a.max_fee,
network: None,
},
relays: a
.relay
.into_iter()
.map(|r| r.trim().to_string())
.filter(|r| !r.is_empty())
.collect(),
mirrors: a
.announce_mirror
.into_iter()
.map(|m| m.trim().trim_end_matches('/').to_string())
.filter(|m| !m.is_empty())
.collect(),
parent,
journal: a.journal,
};
let rt = tokio::runtime::Builder::new_current_thread()
.enable_all()
.build()
.expect("a tokio runtime");
if let Err(e) = rt.block_on(run(settings)) {
eprintln!("cosign: {e}");
std::process::exit(1);
}
}