pub mod builder;
mod fees;
mod stats;
mod tx;
mod tx_index;
pub use builder::PrefixIndex;
pub use stats::BlockStats;
pub use tx::SnapTx;
pub use tx_index::TxIndex;
use std::hash::{DefaultHasher, Hash, Hasher};
use brk_types::{FeeRate, RecommendedFees, TxidPrefix};
use fees::Fees;
#[derive(Default)]
pub struct Snapshot {
pub txs: Vec<SnapTx>,
pub blocks: Vec<Vec<TxIndex>>,
pub block_stats: Vec<BlockStats>,
pub fees: RecommendedFees,
pub next_block_hash: u64,
prefix_to_idx: PrefixIndex,
}
impl Snapshot {
pub fn build(
txs: Vec<SnapTx>,
blocks: Vec<Vec<TxIndex>>,
prefix_to_idx: PrefixIndex,
min_fee: FeeRate,
) -> Self {
let block_stats: Vec<BlockStats> = blocks
.iter()
.enumerate()
.map(|(i, block)| {
if i == 0 {
BlockStats::compute_core(block, &txs)
} else {
BlockStats::compute_projected(block, &txs)
}
})
.collect();
let fees = Fees::compute(&block_stats, min_fee);
let next_block_hash = Self::hash_next_block(&blocks);
Self {
txs,
blocks,
block_stats,
fees,
next_block_hash,
prefix_to_idx,
}
}
fn hash_next_block(blocks: &[Vec<TxIndex>]) -> u64 {
let Some(block) = blocks.first() else {
return 0;
};
let mut hasher = DefaultHasher::new();
block.hash(&mut hasher);
hasher.finish()
}
pub fn tx(&self, idx: TxIndex) -> Option<&SnapTx> {
self.txs.get(idx.as_usize())
}
pub fn idx_of(&self, prefix: &TxidPrefix) -> Option<TxIndex> {
self.prefix_to_idx.get(prefix).copied()
}
pub fn chunk_rate_for(&self, prefix: &TxidPrefix) -> Option<FeeRate> {
let idx = self.idx_of(prefix)?;
Some(self.txs[idx.as_usize()].chunk_rate)
}
}