use std::hash::{DefaultHasher, Hash, Hasher};
use brk_types::RecommendedFees;
use super::{
fees,
stats::{self, BlockStats},
};
use crate::{
entry::Entry,
types::{SelectedTx, TxIndex},
};
#[derive(Debug, Clone, Default)]
pub struct Snapshot {
pub blocks: Vec<Vec<TxIndex>>,
pub block_stats: Vec<BlockStats>,
pub fees: RecommendedFees,
}
impl Snapshot {
pub fn build(blocks: Vec<Vec<SelectedTx>>, entries: &[Option<Entry>]) -> Self {
let block_stats: Vec<BlockStats> = blocks
.iter()
.map(|selected| stats::compute_block_stats(selected, entries))
.collect();
let fees = fees::compute_recommended_fees(&block_stats);
let blocks = blocks
.into_iter()
.map(|selected| selected.into_iter().map(|s| s.tx_index).collect())
.collect();
Self {
blocks,
block_stats,
fees,
}
}
pub fn next_block_hash(&self) -> u64 {
let Some(block) = self.blocks.first() else {
return 0;
};
let mut hasher = DefaultHasher::new();
block.hash(&mut hasher);
hasher.finish()
}
}