use crate::conventions::Sat;
use crate::state::{BlockerKind, LedgerState};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ConservationReport {
pub sigma_in: Sat,
pub sigma_disposed: Sat,
pub sigma_removed: Sat,
pub sigma_held: Sat,
pub sigma_fee_sats: Sat,
pub sigma_pending: Sat,
pub balanced: bool,
pub has_uncovered: bool,
}
pub fn conservation_report(st: &LedgerState) -> ConservationReport {
let sigma_disposed = st
.disposals
.iter()
.filter(|d| !d.fee_mini_disposition)
.flat_map(|d| &d.legs)
.map(|l| l.sat)
.sum();
let sigma_removed = st
.removals
.iter()
.flat_map(|r| &r.legs)
.map(|l| l.sat)
.sum();
let sigma_held: Sat = st.lots.iter().map(|l| l.remaining_sat).sum();
let has_uncovered = st
.blockers
.iter()
.any(|b| b.kind == BlockerKind::UncoveredDisposal);
let (sigma_in, sigma_fee_sats, sigma_pending) = (
st.stats.sigma_in,
st.stats.fee_sats_consumed,
st.stats.sigma_pending,
);
let balanced = !has_uncovered
&& sigma_in == sigma_disposed + sigma_removed + sigma_held + sigma_fee_sats + sigma_pending;
ConservationReport {
sigma_in,
sigma_disposed,
sigma_removed,
sigma_held,
sigma_fee_sats,
sigma_pending,
balanced,
has_uncovered,
}
}