From c83955eea72ad98f0bde6676ae231d20464d43fc Mon Sep 17 00:00:00 2001 From: nym21 Date: Thu, 12 Mar 2026 14:26:08 +0100 Subject: [PATCH] global: snapshot --- .../src/distribution/metrics/cohort/all.rs | 7 +++++ .../src/distribution/metrics/cohort/basic.rs | 7 +++++ .../src/distribution/metrics/cohort/core.rs | 7 +++++ .../distribution/metrics/cohort/extended.rs | 7 +++++ .../distribution/metrics/cohort/minimal.rs | 11 +++++++- .../src/distribution/metrics/cohort/type.rs | 8 ++++++ .../src/distribution/metrics/mod.rs | 2 +- .../distribution/metrics/realized/minimal.rs | 27 +++---------------- .../distribution/metrics/unrealized/basic.rs | 12 +++++++-- .../distribution/metrics/unrealized/mod.rs | 2 ++ crates/brk_computer/src/distribution/vecs.rs | 2 ++ crates/brk_computer/src/lib.rs | 1 + 12 files changed, 65 insertions(+), 28 deletions(-) diff --git a/crates/brk_computer/src/distribution/metrics/cohort/all.rs b/crates/brk_computer/src/distribution/metrics/cohort/all.rs index 50842c16b..9013d0ecf 100644 --- a/crates/brk_computer/src/distribution/metrics/cohort/all.rs +++ b/crates/brk_computer/src/distribution/metrics/cohort/all.rs @@ -127,6 +127,13 @@ impl AllCohortMetrics { exit, )?; + self.unrealized.compute( + starting_indexes.height, + &prices.spot.cents.height, + &self.realized.price.cents.height, + exit, + )?; + self.asopr.compute_rest_part2( blocks, starting_indexes, diff --git a/crates/brk_computer/src/distribution/metrics/cohort/basic.rs b/crates/brk_computer/src/distribution/metrics/cohort/basic.rs index 71629eda3..c01eeb661 100644 --- a/crates/brk_computer/src/distribution/metrics/cohort/basic.rs +++ b/crates/brk_computer/src/distribution/metrics/cohort/basic.rs @@ -79,6 +79,13 @@ impl BasicCohortMetrics { exit, )?; + self.unrealized.compute( + starting_indexes.height, + &prices.spot.cents.height, + &self.realized.price.cents.height, + exit, + )?; + self.relative.compute( starting_indexes.height, &self.supply.core, diff --git a/crates/brk_computer/src/distribution/metrics/cohort/core.rs b/crates/brk_computer/src/distribution/metrics/cohort/core.rs index 44916bc3b..cc36a6f81 100644 --- a/crates/brk_computer/src/distribution/metrics/cohort/core.rs +++ b/crates/brk_computer/src/distribution/metrics/cohort/core.rs @@ -141,6 +141,13 @@ impl CoreCohortMetrics { exit, )?; + self.unrealized.compute( + starting_indexes.height, + &prices.spot.cents.height, + &self.realized.price.cents.height, + exit, + )?; + self.relative.compute( starting_indexes.height, &self.supply.core, diff --git a/crates/brk_computer/src/distribution/metrics/cohort/extended.rs b/crates/brk_computer/src/distribution/metrics/cohort/extended.rs index d5c6ca903..acbb1a0a0 100644 --- a/crates/brk_computer/src/distribution/metrics/cohort/extended.rs +++ b/crates/brk_computer/src/distribution/metrics/cohort/extended.rs @@ -113,6 +113,13 @@ impl ExtendedCohortMetrics { exit, )?; + self.unrealized.compute( + starting_indexes.height, + &prices.spot.cents.height, + &self.realized.price.cents.height, + exit, + )?; + self.relative.compute( starting_indexes.height, &self.supply.core, diff --git a/crates/brk_computer/src/distribution/metrics/cohort/minimal.rs b/crates/brk_computer/src/distribution/metrics/cohort/minimal.rs index 8df35fc81..0409e092b 100644 --- a/crates/brk_computer/src/distribution/metrics/cohort/minimal.rs +++ b/crates/brk_computer/src/distribution/metrics/cohort/minimal.rs @@ -7,7 +7,7 @@ use vecdb::{AnyStoredVec, Exit, Rw, StorageMode}; use crate::{blocks, prices}; use crate::distribution::metrics::{ - ImportConfig, OutputsBase, RealizedMinimal, SupplyBase, + ImportConfig, OutputsBase, RealizedMinimal, SupplyBase, UnrealizedMinimal, }; /// MinimalCohortMetrics: supply, outputs, realized cap/price/mvrv/profit/loss + value_created/destroyed. @@ -21,6 +21,7 @@ pub struct MinimalCohortMetrics { pub supply: Box>, pub outputs: Box>, pub realized: Box>, + pub unrealized: Box>, } impl MinimalCohortMetrics { @@ -30,6 +31,7 @@ impl MinimalCohortMetrics { supply: Box::new(SupplyBase::forced_import(cfg)?), outputs: Box::new(OutputsBase::forced_import(cfg)?), realized: Box::new(RealizedMinimal::forced_import(cfg)?), + unrealized: Box::new(UnrealizedMinimal::forced_import(cfg)?), }) } @@ -105,6 +107,13 @@ impl MinimalCohortMetrics { exit, )?; + self.unrealized.compute( + starting_indexes.height, + &prices.spot.cents.height, + &self.realized.price.cents.height, + exit, + )?; + Ok(()) } } diff --git a/crates/brk_computer/src/distribution/metrics/cohort/type.rs b/crates/brk_computer/src/distribution/metrics/cohort/type.rs index 8c2763d3f..6b7267927 100644 --- a/crates/brk_computer/src/distribution/metrics/cohort/type.rs +++ b/crates/brk_computer/src/distribution/metrics/cohort/type.rs @@ -78,6 +78,14 @@ impl TypeCohortMetrics { &self.supply.total.btc.height, exit, )?; + + self.unrealized.compute( + starting_indexes.height, + &prices.spot.cents.height, + &self.realized.price.cents.height, + exit, + )?; + Ok(()) } } diff --git a/crates/brk_computer/src/distribution/metrics/mod.rs b/crates/brk_computer/src/distribution/metrics/mod.rs index 86ddda5db..42b49459a 100644 --- a/crates/brk_computer/src/distribution/metrics/mod.rs +++ b/crates/brk_computer/src/distribution/metrics/mod.rs @@ -59,7 +59,7 @@ pub use relative::{ RelativeForAll, RelativeToAll, RelativeWithExtended, }; pub use supply::{SupplyBase, SupplyCore, SupplyFull}; -pub use unrealized::{UnrealizedBase, UnrealizedBasic, UnrealizedCore, UnrealizedFull, UnrealizedLike}; +pub use unrealized::{UnrealizedBase, UnrealizedBasic, UnrealizedCore, UnrealizedFull, UnrealizedLike, UnrealizedMinimal}; use brk_cohort::Filter; use brk_error::Result; diff --git a/crates/brk_computer/src/distribution/metrics/realized/minimal.rs b/crates/brk_computer/src/distribution/metrics/realized/minimal.rs index 6c960278b..6694deca5 100644 --- a/crates/brk_computer/src/distribution/metrics/realized/minimal.rs +++ b/crates/brk_computer/src/distribution/metrics/realized/minimal.rs @@ -1,7 +1,7 @@ use brk_error::Result; use brk_traversable::Traversable; use brk_types::{ - BasisPoints32, BasisPointsSigned32, Bitcoin, Cents, Height, Indexes, Sats, StoredF32, + BasisPoints32, Bitcoin, Cents, Height, Indexes, Sats, StoredF32, Version, }; use vecdb::{ @@ -13,7 +13,7 @@ use crate::{ distribution::state::{CohortState, CostBasisOps, RealizedOps}, internal::{ FiatPerBlock, FiatPerBlockWithSum24h, Identity, LazyPerBlock, - PerBlockWithSum24h, PriceWithRatioPerBlock, RatioPerBlock, + PerBlockWithSum24h, PriceWithRatioPerBlock, }, prices, }; @@ -27,7 +27,7 @@ pub struct RealizedSoprMinimal { } /// Minimal realized metrics: cap (fiat), profit/loss (fiat + 24h sum), -/// price, mvrv, nupl, sopr (value_created/destroyed with 24h sums). +/// price, mvrv, sopr (value_created/destroyed with 24h sums). #[derive(Traversable)] pub struct RealizedMinimal { pub cap: FiatPerBlock, @@ -35,7 +35,6 @@ pub struct RealizedMinimal { pub loss: FiatPerBlockWithSum24h, pub price: PriceWithRatioPerBlock, pub mvrv: LazyPerBlock, - pub nupl: RatioPerBlock, pub sopr: RealizedSoprMinimal, } @@ -53,15 +52,12 @@ impl RealizedMinimal { &price.ratio, ); - let nupl = cfg.import("nupl", v1)?; - Ok(Self { cap, profit: cfg.import("realized_profit", v1)?, loss: cfg.import("realized_loss", v1)?, price, mvrv, - nupl, sopr: RealizedSoprMinimal { value_created: cfg.import("value_created", v1)?, value_destroyed: cfg.import("value_destroyed", v1)?, @@ -180,23 +176,6 @@ impl RealizedMinimal { )?) })?; - self.nupl.bps.height.compute_transform2( - starting_indexes.height, - &prices.spot.cents.height, - &self.price.cents.height, - |(i, price, realized_price, ..)| { - let p = price.as_u128(); - if p == 0 { - (i, BasisPointsSigned32::ZERO) - } else { - let rp = realized_price.as_u128(); - let nupl_bps = ((p as i128 - rp as i128) * 10000) / p as i128; - (i, BasisPointsSigned32::from(nupl_bps as i32)) - } - }, - exit, - )?; - Ok(()) } } diff --git a/crates/brk_computer/src/distribution/metrics/unrealized/basic.rs b/crates/brk_computer/src/distribution/metrics/unrealized/basic.rs index 7922e29f0..a17dff805 100644 --- a/crates/brk_computer/src/distribution/metrics/unrealized/basic.rs +++ b/crates/brk_computer/src/distribution/metrics/unrealized/basic.rs @@ -1,6 +1,7 @@ use brk_error::Result; use brk_traversable::Traversable; use brk_types::{Cents, Height, Indexes, Version}; +use derive_more::{Deref, DerefMut}; use vecdb::{AnyStoredVec, AnyVec, Exit, Rw, StorageMode, WritableVec}; use crate::{ @@ -9,9 +10,15 @@ use crate::{ internal::FiatPerBlockWithSum24h, }; -/// Basic unrealized metrics: unrealized profit/loss (fiat + 24h sums). -#[derive(Traversable)] +use super::UnrealizedMinimal; + +/// Basic unrealized metrics: nupl + unrealized profit/loss (fiat + 24h sums). +#[derive(Deref, DerefMut, Traversable)] pub struct UnrealizedBasic { + #[deref] + #[deref_mut] + #[traversable(flatten)] + pub minimal: UnrealizedMinimal, pub profit: FiatPerBlockWithSum24h, pub loss: FiatPerBlockWithSum24h, } @@ -21,6 +28,7 @@ impl UnrealizedBasic { let v1 = Version::ONE; Ok(Self { + minimal: UnrealizedMinimal::forced_import(cfg)?, profit: cfg.import("unrealized_profit", v1)?, loss: cfg.import("unrealized_loss", v1)?, }) diff --git a/crates/brk_computer/src/distribution/metrics/unrealized/mod.rs b/crates/brk_computer/src/distribution/metrics/unrealized/mod.rs index 239d1149f..7f458c747 100644 --- a/crates/brk_computer/src/distribution/metrics/unrealized/mod.rs +++ b/crates/brk_computer/src/distribution/metrics/unrealized/mod.rs @@ -2,11 +2,13 @@ mod base; mod basic; mod core; mod full; +mod minimal; pub use self::core::UnrealizedCore; pub use base::UnrealizedBase; pub use basic::UnrealizedBasic; pub use full::UnrealizedFull; +pub use minimal::UnrealizedMinimal; use brk_error::Result; use brk_types::{Height, Indexes}; diff --git a/crates/brk_computer/src/distribution/vecs.rs b/crates/brk_computer/src/distribution/vecs.rs index 8e29e42af..0c85e98aa 100644 --- a/crates/brk_computer/src/distribution/vecs.rs +++ b/crates/brk_computer/src/distribution/vecs.rs @@ -60,6 +60,7 @@ pub struct Vecs { #[traversable(skip)] pub states_path: PathBuf, + #[traversable(wrap = "supply", rename = "state")] pub supply_state: M::Stored>, #[traversable(wrap = "addresses", rename = "indexes")] pub any_address_indexes: AnyAddressIndexesVecs, @@ -69,6 +70,7 @@ pub struct Vecs { pub utxo_cohorts: UTXOCohorts, #[traversable(wrap = "cohorts", rename = "address")] pub address_cohorts: AddressCohorts, + #[traversable(wrap = "cointime")] pub coinblocks_destroyed: ComputedPerBlockCumulative, pub addresses: AddressMetricsVecs, diff --git a/crates/brk_computer/src/lib.rs b/crates/brk_computer/src/lib.rs index 676fad607..ce1c5b35f 100644 --- a/crates/brk_computer/src/lib.rs +++ b/crates/brk_computer/src/lib.rs @@ -42,6 +42,7 @@ pub struct Computer { pub market: Box>, pub pools: Box>, pub prices: Box>, + #[traversable(flatten)] pub distribution: Box>, pub supply: Box>, pub inputs: Box>,