use kyoto::builder::Builder;
use kyoto::{lookup_host, Client, Event, HeaderCheckpoint, Network, ScriptBuf};
use std::collections::HashSet;
use std::net::Ipv4Addr;
use tokio::time::Instant;
const NETWORK: Network = Network::Bitcoin;
const HOST_ADDR: Ipv4Addr = Ipv4Addr::new(1, 1, 1, 1);
#[tokio::main]
async fn main() {
let subscriber = tracing_subscriber::FmtSubscriber::new();
tracing::subscriber::set_global_default(subscriber).unwrap();
let now = Instant::now();
let address = ScriptBuf::new_op_return(b"Kyoto light client");
let mut addresses = HashSet::new();
addresses.insert(address);
let seeds = lookup_host("dnsseed.bitcoin.dashjr-list-of-p2p-nodes.us", HOST_ADDR).await;
let builder = Builder::new(NETWORK);
let (node, client) = builder
.required_peers(2)
.after_checkpoint(HeaderCheckpoint::taproot_activation())
.add_peers(seeds.into_iter().map(From::from))
.build()
.unwrap();
tokio::task::spawn(async move { node.run().await });
let Client {
requester,
mut info_rx,
mut warn_rx,
mut event_rx,
} = client;
loop {
tokio::select! {
event = event_rx.recv() => {
if let Some(event) = event {
match event {
Event::FiltersSynced(update) => {
tracing::info!("Chain tip: {}",update.tip().hash);
let fee = requester.broadcast_min_feerate().await.unwrap();
tracing::info!("Minimum transaction broadcast fee rate: {:#}", fee);
let sync_time = now.elapsed().as_secs_f32();
tracing::info!("Total sync time: {sync_time} seconds");
let avg_fee_rate = requester.average_fee_rate(update.tip().hash).await.unwrap();
tracing::info!("Last block average fee rate: {:#}", avg_fee_rate);
break;
},
Event::BlocksDisconnected { accepted: _, disconnected: _} => {
tracing::warn!("Some blocks were reorganized")
},
_ => (),
}
}
}
info = info_rx.recv() => {
if let Some(info) = info {
tracing::info!("{info}");
}
}
warn = warn_rx.recv() => {
if let Some(warn) = warn {
tracing::warn!("{warn}");
}
}
}
}
let _ = requester.shutdown();
tracing::info!("Shutting down");
}