use anyhow::Result;
use bsv_wallet_cli::relay::{make_relay_router, open_relay_db, RelayState};
use std::net::{IpAddr, SocketAddr};
use std::sync::Arc;
use tracing_subscriber::EnvFilter;
#[tokio::main]
async fn main() -> Result<()> {
dotenvy::dotenv().ok();
tracing_subscriber::fmt()
.with_env_filter(
EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info")),
)
.with_writer(std::io::stderr)
.init();
let db_path = std::env::var("RELAY_DB").unwrap_or_else(|_| "relay.db".to_string());
let port: u16 = std::env::var("RELAY_PORT")
.ok()
.and_then(|v| v.parse().ok())
.unwrap_or(3390);
let bind_addr: IpAddr = std::env::var("BIND_ADDR")
.ok()
.and_then(|v| v.parse().ok())
.unwrap_or_else(|| "0.0.0.0".parse().unwrap());
let admin_token = std::env::var("RELAY_ADMIN_TOKEN")
.ok()
.filter(|s| !s.is_empty())
.map(Arc::new);
let require_register = std::env::var("RELAY_REQUIRE_REGISTER")
.map(|v| v == "1" || v.eq_ignore_ascii_case("true"))
.unwrap_or(false);
let pool = open_relay_db(&db_path).await?;
let state = RelayState {
pool,
admin_token,
require_register,
};
let app = make_relay_router(state);
let addr = SocketAddr::from((bind_addr, port));
tracing::info!(%addr, db = %db_path, require_register, "bsv-wallet-relay listening");
eprintln!("bsv-wallet-relay listening on {addr} (db: {db_path})");
let listener = tokio::net::TcpListener::bind(addr).await?;
axum::serve(listener, app)
.with_graceful_shutdown(async {
tokio::signal::ctrl_c().await.ok();
eprintln!("\nShutting down relay...");
})
.await?;
Ok(())
}