pub mod compliance;
pub mod conservation;
pub mod evaluate;
pub mod fold;
pub mod pools;
pub mod resolve;
pub mod transition;
pub use compliance::{disposal_compliance, ComplianceStatus, DisposalCompliance};
pub use conservation::{conservation_report, ConservationReport};
pub use evaluate::{evaluate_disposal, CandidateDisposal, EvaluateError, EvaluateOutcome};
use crate::event::LedgerEvent;
use crate::price::PriceProvider;
use crate::state::LedgerState;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FeeTreatment {
TreatmentC,
TreatmentB,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, serde::Serialize, serde::Deserialize)]
pub enum LotMethod {
#[default]
Fifo,
Lifo,
Hifo,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ProjectionConfig {
pub self_transfer_fee: FeeTreatment,
pub pre2025_method: LotMethod,
pub pre2025_method_attested: bool,
}
impl Default for ProjectionConfig {
fn default() -> Self {
ProjectionConfig {
self_transfer_fee: FeeTreatment::TreatmentC,
pre2025_method: LotMethod::Fifo,
pre2025_method_attested: false,
}
}
}
pub fn project(
events: &[LedgerEvent],
prices: &dyn PriceProvider,
config: &ProjectionConfig,
) -> LedgerState {
let resolution = resolve::resolve(events, prices, config);
fold::fold(resolution, prices, config)
}