use bip157::builder::Builder;
use bip157::chain::{BlockHeaderChanges, ChainState};
use bip157::{lookup_host, Client, Event, HeaderCheckpoint, Network, ScriptBuf};
use std::collections::HashSet;
use tokio::time::Instant;
const NETWORK: Network = Network::Bitcoin;
#[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("seed.bitcoin.sipa.be").await;
let builder = Builder::new(NETWORK);
let (node, client) = builder
.required_peers(2)
.chain_state(ChainState::Checkpoint(
HeaderCheckpoint::taproot_activation(),
))
.add_peers(seeds.into_iter().map(From::from))
.build();
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::ChainUpdate(BlockHeaderChanges::Connected(header)) => {
tracing::info!("New best tip {}", header.height);
},
_ => (),
}
}
}
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");
}