use brk_error::Result;
use brk_types::{Indexes, Sats};
use vecdb::Exit;
const INITIAL_SUBSIDY: f64 = Sats::ONE_BTC_U64 as f64 * 50.0;
use super::Vecs;
use crate::{blocks, distribution, mining, prices, scripts, transactions};
impl Vecs {
#[allow(clippy::too_many_arguments)]
pub(crate) fn compute(
&mut self,
scripts: &scripts::Vecs,
blocks: &blocks::Vecs,
mining: &mining::Vecs,
transactions: &transactions::Vecs,
prices: &prices::Vecs,
distribution: &distribution::Vecs,
starting_indexes: &Indexes,
exit: &Exit,
) -> Result<()> {
self.db.sync_bg_tasks()?;
self.burned
.compute(scripts, mining, prices, starting_indexes, exit)?;
let circulating_supply = &distribution.utxo_cohorts.all.metrics.supply.total.sats;
self.inflation_rate
.bps
.height
.compute_rolling_from_window_starts(
starting_indexes.height,
&blocks.lookback._1y,
&circulating_supply.height,
exit,
|current, previous| {
if previous.is_nan() || previous <= INITIAL_SUBSIDY {
f64::NAN
} else {
current / previous - 1.0
}
},
)?;
self.velocity
.compute(blocks, transactions, distribution, starting_indexes, exit)?;
let all_realized = &distribution.utxo_cohorts.all.metrics.realized;
let mcr_arr = self.market_cap_delta.rate.as_array();
let diff_arr = self.market_minus_realized_cap_growth_rate.0.as_mut_array();
let rcr_rates = [
&all_realized.cap.delta.rate._24h.bps.height,
&all_realized.cap.delta.rate._1w.bps.height,
&all_realized.cap.delta.rate._1m.bps.height,
&all_realized.cap.delta.rate._1y.bps.height,
];
for i in 0..4 {
diff_arr[i].height.compute_subtract(
starting_indexes.height,
&mcr_arr[i].bps.height,
rcr_rates[i],
exit,
)?;
}
let exit = exit.clone();
self.db.run_bg(move |db| {
let _lock = exit.lock();
db.compact_deferred_default()
});
Ok(())
}
}