diff --git a/crates/brk_client/src/lib.rs b/crates/brk_client/src/lib.rs index e40e94609..49c729caa 100644 --- a/crates/brk_client/src/lib.rs +++ b/crates/brk_client/src/lib.rs @@ -1330,13 +1330,13 @@ impl CapLossMvrvNetPriceProfitSoprPattern { } /// Pattern struct for repeated tree structure. -pub struct InInvestedMaxMinPercentilesSupplyPattern { +pub struct InMaxMinPerSupplyPattern { pub in_loss: PerPattern, pub in_profit: PerPattern, - pub invested_capital: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern, pub max: CentsSatsUsdPattern, pub min: CentsSatsUsdPattern, - pub percentiles: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern, + pub per_coin: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern, + pub per_dollar: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern, pub supply_density: BpsPercentRatioPattern3, } @@ -4045,6 +4045,8 @@ impl SeriesTree_Mining_Rewards { pub struct SeriesTree_Mining_Rewards_Subsidy { pub base: BtcCentsSatsUsdPattern, pub cumulative: BtcCentsSatsUsdPattern, + pub sum: _1m1w1y24hPattern3, + pub average: _1m1w1y24hPattern3, pub dominance: _1m1w1y24hBpsPercentRatioPattern, pub sma_1y: CentsUsdPattern2, } @@ -4054,6 +4056,8 @@ impl SeriesTree_Mining_Rewards_Subsidy { Self { base: BtcCentsSatsUsdPattern::new(client.clone(), "subsidy".to_string()), cumulative: BtcCentsSatsUsdPattern::new(client.clone(), "subsidy_cumulative".to_string()), + sum: _1m1w1y24hPattern3::new(client.clone(), "subsidy_sum".to_string()), + average: _1m1w1y24hPattern3::new(client.clone(), "subsidy_average".to_string()), dominance: _1m1w1y24hBpsPercentRatioPattern::new(client.clone(), "subsidy_dominance".to_string()), sma_1y: CentsUsdPattern2::new(client.clone(), "subsidy_sma_1y".to_string()), } @@ -6644,8 +6648,8 @@ pub struct SeriesTree_Cohorts_Utxo_All_CostBasis { pub in_loss: PerPattern, pub min: CentsSatsUsdPattern, pub max: CentsSatsUsdPattern, - pub percentiles: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern, - pub invested_capital: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern, + pub per_coin: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern, + pub per_dollar: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern, pub supply_density: BpsPercentRatioPattern3, } @@ -6656,8 +6660,8 @@ impl SeriesTree_Cohorts_Utxo_All_CostBasis { in_loss: PerPattern::new(client.clone(), "cost_basis_in_loss_per".to_string()), min: CentsSatsUsdPattern::new(client.clone(), "cost_basis_min".to_string()), max: CentsSatsUsdPattern::new(client.clone(), "cost_basis_max".to_string()), - percentiles: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern::new(client.clone(), "cost_basis".to_string()), - invested_capital: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern::new(client.clone(), "invested_capital".to_string()), + per_coin: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern::new(client.clone(), "cost_basis_per_coin".to_string()), + per_dollar: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern::new(client.clone(), "cost_basis_per_dollar".to_string()), supply_density: BpsPercentRatioPattern3::new(client.clone(), "supply_density".to_string()), } } @@ -7114,8 +7118,8 @@ pub struct SeriesTree_Cohorts_Utxo_Sth_CostBasis { pub in_loss: PerPattern, pub min: CentsSatsUsdPattern, pub max: CentsSatsUsdPattern, - pub percentiles: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern, - pub invested_capital: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern, + pub per_coin: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern, + pub per_dollar: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern, pub supply_density: BpsPercentRatioPattern3, } @@ -7126,8 +7130,8 @@ impl SeriesTree_Cohorts_Utxo_Sth_CostBasis { in_loss: PerPattern::new(client.clone(), "sth_cost_basis_in_loss_per".to_string()), min: CentsSatsUsdPattern::new(client.clone(), "sth_cost_basis_min".to_string()), max: CentsSatsUsdPattern::new(client.clone(), "sth_cost_basis_max".to_string()), - percentiles: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern::new(client.clone(), "sth_cost_basis".to_string()), - invested_capital: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern::new(client.clone(), "sth_invested_capital".to_string()), + per_coin: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern::new(client.clone(), "sth_cost_basis_per_coin".to_string()), + per_dollar: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern::new(client.clone(), "sth_cost_basis_per_dollar".to_string()), supply_density: BpsPercentRatioPattern3::new(client.clone(), "sth_supply_density".to_string()), } } @@ -7508,8 +7512,8 @@ pub struct SeriesTree_Cohorts_Utxo_Lth_CostBasis { pub in_loss: PerPattern, pub min: CentsSatsUsdPattern, pub max: CentsSatsUsdPattern, - pub percentiles: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern, - pub invested_capital: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern, + pub per_coin: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern, + pub per_dollar: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern, pub supply_density: BpsPercentRatioPattern3, } @@ -7520,8 +7524,8 @@ impl SeriesTree_Cohorts_Utxo_Lth_CostBasis { in_loss: PerPattern::new(client.clone(), "lth_cost_basis_in_loss_per".to_string()), min: CentsSatsUsdPattern::new(client.clone(), "lth_cost_basis_min".to_string()), max: CentsSatsUsdPattern::new(client.clone(), "lth_cost_basis_max".to_string()), - percentiles: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern::new(client.clone(), "lth_cost_basis".to_string()), - invested_capital: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern::new(client.clone(), "lth_invested_capital".to_string()), + per_coin: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern::new(client.clone(), "lth_cost_basis_per_coin".to_string()), + per_dollar: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern::new(client.clone(), "lth_cost_basis_per_dollar".to_string()), supply_density: BpsPercentRatioPattern3::new(client.clone(), "lth_supply_density".to_string()), } } diff --git a/crates/brk_computer/src/blocks/count/import.rs b/crates/brk_computer/src/blocks/count/import.rs index 6208bdaa1..1d6019169 100644 --- a/crates/brk_computer/src/blocks/count/import.rs +++ b/crates/brk_computer/src/blocks/count/import.rs @@ -7,7 +7,7 @@ use crate::{ indexes, internal::{ BlockCountTarget24h, BlockCountTarget1w, BlockCountTarget1m, BlockCountTarget1y, - CachedWindowStarts, PerBlockCumulativeWithSums, ConstantVecs, Windows, + CachedWindowStarts, PerBlockCumulativeRolling, ConstantVecs, Windows, }, }; @@ -25,7 +25,7 @@ impl Vecs { _1m: ConstantVecs::new::("block_count_target_1m", version, indexes), _1y: ConstantVecs::new::("block_count_target_1y", version, indexes), }, - total: PerBlockCumulativeWithSums::forced_import( + total: PerBlockCumulativeRolling::forced_import( db, "block_count", version + Version::ONE, diff --git a/crates/brk_computer/src/blocks/count/vecs.rs b/crates/brk_computer/src/blocks/count/vecs.rs index 5ea13d6e4..5663742d6 100644 --- a/crates/brk_computer/src/blocks/count/vecs.rs +++ b/crates/brk_computer/src/blocks/count/vecs.rs @@ -2,10 +2,10 @@ use brk_traversable::Traversable; use brk_types::{StoredU32, StoredU64}; use vecdb::{Rw, StorageMode}; -use crate::internal::{PerBlockCumulativeWithSums, ConstantVecs, Windows}; +use crate::internal::{PerBlockCumulativeRolling, ConstantVecs, Windows}; #[derive(Traversable)] pub struct Vecs { pub target: Windows>, - pub total: PerBlockCumulativeWithSums, + pub total: PerBlockCumulativeRolling, } diff --git a/crates/brk_computer/src/cointime/activity/import.rs b/crates/brk_computer/src/cointime/activity/import.rs index 1b4d981d7..827ff89c9 100644 --- a/crates/brk_computer/src/cointime/activity/import.rs +++ b/crates/brk_computer/src/cointime/activity/import.rs @@ -6,7 +6,7 @@ use super::Vecs; use crate::{ indexes, internal::{ - CachedWindowStarts, LazyPerBlock, OneMinusF64, PerBlock, PerBlockCumulativeWithSums, + CachedWindowStarts, LazyPerBlock, OneMinusF64, PerBlock, PerBlockCumulativeRolling, }, }; @@ -27,10 +27,10 @@ impl Vecs { ); Ok(Self { - coinblocks_created: PerBlockCumulativeWithSums::forced_import( + coinblocks_created: PerBlockCumulativeRolling::forced_import( db, "coinblocks_created", version, indexes, cached_starts, )?, - coinblocks_stored: PerBlockCumulativeWithSums::forced_import( + coinblocks_stored: PerBlockCumulativeRolling::forced_import( db, "coinblocks_stored", version, indexes, cached_starts, )?, liveliness, diff --git a/crates/brk_computer/src/cointime/activity/vecs.rs b/crates/brk_computer/src/cointime/activity/vecs.rs index 85fc27ab2..5a77df1b2 100644 --- a/crates/brk_computer/src/cointime/activity/vecs.rs +++ b/crates/brk_computer/src/cointime/activity/vecs.rs @@ -2,12 +2,12 @@ use brk_traversable::Traversable; use brk_types::StoredF64; use vecdb::{Rw, StorageMode}; -use crate::internal::{LazyPerBlock, PerBlock, PerBlockCumulativeWithSums}; +use crate::internal::{LazyPerBlock, PerBlock, PerBlockCumulativeRolling}; #[derive(Traversable)] pub struct Vecs { - pub coinblocks_created: PerBlockCumulativeWithSums, - pub coinblocks_stored: PerBlockCumulativeWithSums, + pub coinblocks_created: PerBlockCumulativeRolling, + pub coinblocks_stored: PerBlockCumulativeRolling, pub liveliness: PerBlock, pub vaultedness: LazyPerBlock, pub ratio: PerBlock, diff --git a/crates/brk_computer/src/cointime/value/import.rs b/crates/brk_computer/src/cointime/value/import.rs index 85c0a3ebd..b5fcdbc1f 100644 --- a/crates/brk_computer/src/cointime/value/import.rs +++ b/crates/brk_computer/src/cointime/value/import.rs @@ -5,7 +5,7 @@ use vecdb::Database; use super::Vecs; use crate::{ indexes, - internal::{CachedWindowStarts, PerBlockCumulativeWithSums}, + internal::{CachedWindowStarts, PerBlockCumulativeRolling}, }; impl Vecs { @@ -16,28 +16,28 @@ impl Vecs { cached_starts: &CachedWindowStarts, ) -> Result { Ok(Self { - destroyed: PerBlockCumulativeWithSums::forced_import( + destroyed: PerBlockCumulativeRolling::forced_import( db, "cointime_value_destroyed", version, indexes, cached_starts, )?, - created: PerBlockCumulativeWithSums::forced_import( + created: PerBlockCumulativeRolling::forced_import( db, "cointime_value_created", version, indexes, cached_starts, )?, - stored: PerBlockCumulativeWithSums::forced_import( + stored: PerBlockCumulativeRolling::forced_import( db, "cointime_value_stored", version, indexes, cached_starts, )?, - vocdd: PerBlockCumulativeWithSums::forced_import( + vocdd: PerBlockCumulativeRolling::forced_import( db, "vocdd", version + Version::ONE, diff --git a/crates/brk_computer/src/cointime/value/vecs.rs b/crates/brk_computer/src/cointime/value/vecs.rs index aafd627c3..b9d2cbaa5 100644 --- a/crates/brk_computer/src/cointime/value/vecs.rs +++ b/crates/brk_computer/src/cointime/value/vecs.rs @@ -2,12 +2,12 @@ use brk_traversable::Traversable; use brk_types::StoredF64; use vecdb::{Rw, StorageMode}; -use crate::internal::PerBlockCumulativeWithSums; +use crate::internal::PerBlockCumulativeRolling; #[derive(Traversable)] pub struct Vecs { - pub destroyed: PerBlockCumulativeWithSums, - pub created: PerBlockCumulativeWithSums, - pub stored: PerBlockCumulativeWithSums, - pub vocdd: PerBlockCumulativeWithSums, + pub destroyed: PerBlockCumulativeRolling, + pub created: PerBlockCumulativeRolling, + pub stored: PerBlockCumulativeRolling, + pub vocdd: PerBlockCumulativeRolling, } diff --git a/crates/brk_computer/src/distribution/addr/new_addr_count.rs b/crates/brk_computer/src/distribution/addr/new_addr_count.rs index ee8221894..af87728f8 100644 --- a/crates/brk_computer/src/distribution/addr/new_addr_count.rs +++ b/crates/brk_computer/src/distribution/addr/new_addr_count.rs @@ -6,7 +6,7 @@ use vecdb::{Database, Exit, Rw, StorageMode}; use crate::{ indexes, - internal::{CachedWindowStarts, PerBlockCumulativeWithSums}, + internal::{CachedWindowStarts, PerBlockCumulativeRolling}, }; use super::TotalAddrCountVecs; @@ -14,9 +14,9 @@ use super::TotalAddrCountVecs; /// New address count per block (global + per-type) #[derive(Traversable)] pub struct NewAddrCountVecs { - pub all: PerBlockCumulativeWithSums, + pub all: PerBlockCumulativeRolling, #[traversable(flatten)] - pub by_addr_type: ByAddrType>, + pub by_addr_type: ByAddrType>, } impl NewAddrCountVecs { @@ -26,7 +26,7 @@ impl NewAddrCountVecs { indexes: &indexes::Vecs, cached_starts: &CachedWindowStarts, ) -> Result { - let all = PerBlockCumulativeWithSums::forced_import( + let all = PerBlockCumulativeRolling::forced_import( db, "new_addr_count", version, @@ -35,7 +35,7 @@ impl NewAddrCountVecs { )?; let by_addr_type = ByAddrType::new_with_name(|name| { - PerBlockCumulativeWithSums::forced_import( + PerBlockCumulativeRolling::forced_import( db, &format!("{name}_new_addr_count"), version, diff --git a/crates/brk_computer/src/distribution/cohorts/utxo/groups.rs b/crates/brk_computer/src/distribution/cohorts/utxo/groups.rs index b9f7fb146..4299fcbdc 100644 --- a/crates/brk_computer/src/distribution/cohorts/utxo/groups.rs +++ b/crates/brk_computer/src/distribution/cohorts/utxo/groups.rs @@ -25,7 +25,7 @@ use crate::{ state::UTXOCohortState, }, indexes, - internal::{AmountPerBlockCumulativeWithSums, CachedWindowStarts}, + internal::{AmountPerBlockCumulativeRolling, CachedWindowStarts}, prices, }; @@ -50,7 +50,7 @@ pub struct UTXOCohorts { #[traversable(rename = "type")] pub type_: SpendableType>>, pub profitability: ProfitabilityMetrics, - pub matured: AgeRange>, + pub matured: AgeRange>, #[traversable(skip)] pub(super) fenwick: CostBasisFenwick, /// Cached partition_point positions for tick_tock boundary searches. @@ -259,8 +259,8 @@ impl UTXOCohorts { let prefix = CohortContext::Utxo.prefix(); let matured = AgeRange::try_new(&|_f: Filter, name: &'static str| - -> Result { - AmountPerBlockCumulativeWithSums::forced_import( + -> Result { + AmountPerBlockCumulativeRolling::forced_import( db, &format!("{prefix}_{name}_matured_supply"), v, @@ -713,10 +713,11 @@ impl UTXOCohorts { } vecs.extend(self.profitability.collect_all_vecs_mut()); for v in self.matured.iter_mut() { - vecs.push(&mut v.base.sats.height); - vecs.push(&mut v.base.cents.height); - vecs.push(&mut v.cumulative.sats.height); - vecs.push(&mut v.cumulative.cents.height); + let inner = &mut v.inner; + vecs.push(&mut inner.base.sats.height); + vecs.push(&mut inner.base.cents.height); + vecs.push(&mut inner.cumulative.sats.height); + vecs.push(&mut inner.cumulative.cents.height); } vecs.into_par_iter() } diff --git a/crates/brk_computer/src/distribution/metrics/activity/core.rs b/crates/brk_computer/src/distribution/metrics/activity/core.rs index de56e4f2d..2b119d1ba 100644 --- a/crates/brk_computer/src/distribution/metrics/activity/core.rs +++ b/crates/brk_computer/src/distribution/metrics/activity/core.rs @@ -6,7 +6,7 @@ use vecdb::{AnyStoredVec, AnyVec, Exit, Rw, StorageMode, WritableVec}; use crate::{ distribution::{metrics::ImportConfig, state::{CohortState, CostBasisOps, RealizedOps}}, - internal::{AmountPerBlockCumulativeWithSums, PerBlockCumulativeWithSums}, + internal::{AmountPerBlockCumulativeRolling, PerBlockCumulativeRolling}, prices, }; @@ -19,11 +19,11 @@ pub struct ActivityCore { #[traversable(flatten)] pub minimal: ActivityMinimal, - pub coindays_destroyed: PerBlockCumulativeWithSums, + pub coindays_destroyed: PerBlockCumulativeRolling, #[traversable(wrap = "transfer_volume", rename = "in_profit")] - pub transfer_volume_in_profit: AmountPerBlockCumulativeWithSums, + pub transfer_volume_in_profit: AmountPerBlockCumulativeRolling, #[traversable(wrap = "transfer_volume", rename = "in_loss")] - pub transfer_volume_in_loss: AmountPerBlockCumulativeWithSums, + pub transfer_volume_in_loss: AmountPerBlockCumulativeRolling, } impl ActivityCore { @@ -69,10 +69,10 @@ impl ActivityCore { pub(crate) fn collect_vecs_mut(&mut self) -> Vec<&mut dyn AnyStoredVec> { let mut vecs = self.minimal.collect_vecs_mut(); vecs.push(&mut self.coindays_destroyed.base.height); - vecs.push(&mut self.transfer_volume_in_profit.base.sats.height); - vecs.push(&mut self.transfer_volume_in_profit.base.cents.height); - vecs.push(&mut self.transfer_volume_in_loss.base.sats.height); - vecs.push(&mut self.transfer_volume_in_loss.base.cents.height); + vecs.push(&mut self.transfer_volume_in_profit.inner.base.sats.height); + vecs.push(&mut self.transfer_volume_in_profit.inner.base.cents.height); + vecs.push(&mut self.transfer_volume_in_loss.inner.base.sats.height); + vecs.push(&mut self.transfer_volume_in_loss.inner.base.cents.height); vecs } diff --git a/crates/brk_computer/src/distribution/metrics/activity/minimal.rs b/crates/brk_computer/src/distribution/metrics/activity/minimal.rs index 57f0409f7..060b39746 100644 --- a/crates/brk_computer/src/distribution/metrics/activity/minimal.rs +++ b/crates/brk_computer/src/distribution/metrics/activity/minimal.rs @@ -5,13 +5,13 @@ use vecdb::{AnyStoredVec, AnyVec, Exit, Rw, StorageMode, WritableVec}; use crate::{ distribution::{metrics::ImportConfig, state::{CohortState, CostBasisOps, RealizedOps}}, - internal::AmountPerBlockCumulativeWithSums, + internal::AmountPerBlockCumulativeRolling, prices, }; #[derive(Traversable)] pub struct ActivityMinimal { - pub transfer_volume: AmountPerBlockCumulativeWithSums, + pub transfer_volume: AmountPerBlockCumulativeRolling, } impl ActivityMinimal { @@ -39,9 +39,10 @@ impl ActivityMinimal { } pub(crate) fn collect_vecs_mut(&mut self) -> Vec<&mut dyn AnyStoredVec> { + let inner = &mut self.transfer_volume.inner; vec![ - &mut self.transfer_volume.base.sats.height as &mut dyn AnyStoredVec, - &mut self.transfer_volume.base.cents.height, + &mut inner.base.sats.height as &mut dyn AnyStoredVec, + &mut inner.base.cents.height, ] } diff --git a/crates/brk_computer/src/distribution/metrics/config.rs b/crates/brk_computer/src/distribution/metrics/config.rs index c173131af..ef11c8b3d 100644 --- a/crates/brk_computer/src/distribution/metrics/config.rs +++ b/crates/brk_computer/src/distribution/metrics/config.rs @@ -7,9 +7,9 @@ use vecdb::{BytesVec, BytesVecValue, Database, ImportableVec}; use crate::{ indexes, internal::{ - AmountPerBlock, AmountPerBlockCumulative, AmountPerBlockCumulativeWithSums, + AmountPerBlock, AmountPerBlockCumulative, AmountPerBlockCumulativeRolling, CachedWindowStarts, CentsType, FiatPerBlock, FiatPerBlockCumulativeWithSums, NumericValue, - PerBlock, PerBlockCumulativeWithSums, PercentPerBlock, PercentRollingWindows, Price, + PerBlock, PerBlockCumulativeRolling, PercentPerBlock, PercentRollingWindows, Price, PriceWithRatioExtendedPerBlock, PriceWithRatioPerBlock, RatioPerBlock, RollingWindow24hPerBlock, RollingWindows, RollingWindowsFrom1w, }, @@ -54,7 +54,7 @@ impl ConfigImport for PerBlock { Self::forced_import(cfg.db, &cfg.name(suffix), cfg.version + offset, cfg.indexes) } } -impl ConfigImport for PerBlockCumulativeWithSums +impl ConfigImport for PerBlockCumulativeRolling where T: NumericValue + JsonSchema + Into, C: NumericValue + JsonSchema, @@ -79,7 +79,7 @@ impl ConfigImport for RollingWindow24hPerBlock Self::forced_import(cfg.db, &cfg.name(suffix), cfg.version + offset, cfg.indexes) } } -impl ConfigImport for AmountPerBlockCumulativeWithSums { +impl ConfigImport for AmountPerBlockCumulativeRolling { fn config_import(cfg: &ImportConfig, suffix: &str, offset: Version) -> Result { Self::forced_import( cfg.db, diff --git a/crates/brk_computer/src/distribution/metrics/cost_basis/mod.rs b/crates/brk_computer/src/distribution/metrics/cost_basis/mod.rs index ecb6a779a..363e85d87 100644 --- a/crates/brk_computer/src/distribution/metrics/cost_basis/mod.rs +++ b/crates/brk_computer/src/distribution/metrics/cost_basis/mod.rs @@ -24,8 +24,8 @@ pub struct CostBasis { pub in_loss: CostBasisSide, pub min: Price>, pub max: Price>, - pub percentiles: PercentilesVecs, - pub invested_capital: PercentilesVecs, + pub per_coin: PercentilesVecs, + pub per_dollar: PercentilesVecs, pub supply_density: PercentPerBlock, } @@ -42,15 +42,15 @@ impl CostBasis { }, min: cfg.import("cost_basis_min", Version::ZERO)?, max: cfg.import("cost_basis_max", Version::ZERO)?, - percentiles: PercentilesVecs::forced_import( + per_coin: PercentilesVecs::forced_import( cfg.db, - &cfg.name("cost_basis"), + &cfg.name("cost_basis_per_coin"), cfg.version, cfg.indexes, )?, - invested_capital: PercentilesVecs::forced_import( + per_dollar: PercentilesVecs::forced_import( cfg.db, - &cfg.name("invested_capital"), + &cfg.name("cost_basis_per_dollar"), cfg.version, cfg.indexes, )?, @@ -84,8 +84,8 @@ impl CostBasis { sat_prices: &[Cents; PERCENTILES_LEN], usd_prices: &[Cents; PERCENTILES_LEN], ) { - self.percentiles.push(sat_prices); - self.invested_capital.push(usd_prices); + self.per_coin.push(sat_prices); + self.per_dollar.push(usd_prices); } #[inline(always)] @@ -94,9 +94,9 @@ impl CostBasis { } pub(crate) fn validate_computed_versions(&mut self, base_version: Version) -> Result<()> { - self.percentiles + self.per_coin .validate_computed_version_or_reset(base_version)?; - self.invested_capital + self.per_dollar .validate_computed_version_or_reset(base_version)?; Ok(()) } @@ -112,13 +112,13 @@ impl CostBasis { &mut self.supply_density.bps.height, ]; vecs.extend( - self.percentiles + self.per_coin .vecs .iter_mut() .map(|v| &mut v.cents.height as &mut dyn AnyStoredVec), ); vecs.extend( - self.invested_capital + self.per_dollar .vecs .iter_mut() .map(|v| &mut v.cents.height as &mut dyn AnyStoredVec), diff --git a/crates/brk_computer/src/distribution/metrics/realized/adjusted.rs b/crates/brk_computer/src/distribution/metrics/realized/adjusted.rs index 3de650a59..e626f5f48 100644 --- a/crates/brk_computer/src/distribution/metrics/realized/adjusted.rs +++ b/crates/brk_computer/src/distribution/metrics/realized/adjusted.rs @@ -5,14 +5,14 @@ use vecdb::{Exit, ReadableVec, Rw, StorageMode}; use crate::{ distribution::metrics::ImportConfig, - internal::{PerBlockCumulativeWithSums, RatioCents64, RollingWindows}, + internal::{PerBlockCumulativeRolling, RatioCents64, RollingWindows}, }; #[derive(Traversable)] pub struct AdjustedSopr { pub ratio: RollingWindows, - pub transfer_volume: PerBlockCumulativeWithSums, - pub value_destroyed: PerBlockCumulativeWithSums, + pub transfer_volume: PerBlockCumulativeRolling, + pub value_destroyed: PerBlockCumulativeRolling, } impl AdjustedSopr { diff --git a/crates/brk_computer/src/distribution/metrics/realized/core.rs b/crates/brk_computer/src/distribution/metrics/realized/core.rs index 10de3f027..011a685e8 100644 --- a/crates/brk_computer/src/distribution/metrics/realized/core.rs +++ b/crates/brk_computer/src/distribution/metrics/realized/core.rs @@ -10,7 +10,7 @@ use crate::{ distribution::state::{CohortState, CostBasisOps, RealizedOps}, internal::{ FiatPerBlockCumulativeWithSumsAndDeltas, LazyPerBlock, NegCentsUnsignedToDollars, - PerBlockCumulativeWithSums, RatioCents64, RollingWindow24hPerBlock, Windows, + PerBlockCumulativeRolling, RatioCents64, RollingWindow24hPerBlock, Windows, }, prices, }; @@ -28,7 +28,7 @@ pub struct NegRealizedLoss { #[derive(Traversable)] pub struct RealizedSoprCore { - pub value_destroyed: PerBlockCumulativeWithSums, + pub value_destroyed: PerBlockCumulativeRolling, pub ratio: RollingWindow24hPerBlock, } @@ -81,7 +81,7 @@ impl RealizedCore { cfg.cached_starts, )?; - let value_destroyed = PerBlockCumulativeWithSums::forced_import( + let value_destroyed = PerBlockCumulativeRolling::forced_import( cfg.db, &cfg.name("value_destroyed"), cfg.version + v1, diff --git a/crates/brk_computer/src/distribution/metrics/realized/full.rs b/crates/brk_computer/src/distribution/metrics/realized/full.rs index c9b571903..997b05a2d 100644 --- a/crates/brk_computer/src/distribution/metrics/realized/full.rs +++ b/crates/brk_computer/src/distribution/metrics/realized/full.rs @@ -11,7 +11,7 @@ use crate::{ blocks, distribution::state::{CohortState, CostBasisData, RealizedState, WithCapital}, internal::{ - AmountPerBlockCumulativeWithSums, FiatPerBlockCumulativeWithSums, PercentPerBlock, + AmountPerBlockCumulativeRolling, FiatPerBlockCumulativeWithSums, PercentPerBlock, PercentRollingWindows, PriceWithRatioExtendedPerBlock, RatioCents64, RatioCentsBp32, RatioCentsSignedCentsBps32, RatioCentsSignedDollarsBps32, RatioDollarsBp32, RatioPerBlockPercentiles, RatioPerBlockStdDevBands, RatioSma, RollingWindows, @@ -274,7 +274,7 @@ impl RealizedFull { starting_indexes: &Indexes, height_to_supply: &impl ReadableVec, height_to_market_cap: &impl ReadableVec, - activity_transfer_volume: &AmountPerBlockCumulativeWithSums, + activity_transfer_volume: &AmountPerBlockCumulativeRolling, exit: &Exit, ) -> Result<()> { self.core.compute_rest_part2( diff --git a/crates/brk_computer/src/distribution/vecs.rs b/crates/brk_computer/src/distribution/vecs.rs index ab91cf665..c36ab4fa2 100644 --- a/crates/brk_computer/src/distribution/vecs.rs +++ b/crates/brk_computer/src/distribution/vecs.rs @@ -23,7 +23,7 @@ use crate::{ state::BlockState, }, indexes, inputs, - internal::{CachedWindowStarts, PerBlockCumulativeWithSums, db_utils::{finalize_db, open_db}}, + internal::{CachedWindowStarts, PerBlockCumulativeRolling, db_utils::{finalize_db, open_db}}, outputs, prices, transactions, }; @@ -70,7 +70,7 @@ pub struct Vecs { #[traversable(wrap = "cohorts", rename = "addr")] pub addr_cohorts: AddrCohorts, #[traversable(wrap = "cointime/activity")] - pub coinblocks_destroyed: PerBlockCumulativeWithSums, + pub coinblocks_destroyed: PerBlockCumulativeRolling, pub addrs: AddrMetricsVecs, /// In-memory block state for UTXO processing. Persisted via supply_state. @@ -173,7 +173,7 @@ impl Vecs { utxo_cohorts, addr_cohorts, - coinblocks_destroyed: PerBlockCumulativeWithSums::forced_import( + coinblocks_destroyed: PerBlockCumulativeRolling::forced_import( &db, "coinblocks_destroyed", version + Version::TWO, diff --git a/crates/brk_computer/src/internal/per_block/amount/cumulative_sum.rs b/crates/brk_computer/src/internal/per_block/amount/cumulative_rolling.rs similarity index 52% rename from crates/brk_computer/src/internal/per_block/amount/cumulative_sum.rs rename to crates/brk_computer/src/internal/per_block/amount/cumulative_rolling.rs index ed0e7a43d..f733e0450 100644 --- a/crates/brk_computer/src/internal/per_block/amount/cumulative_sum.rs +++ b/crates/brk_computer/src/internal/per_block/amount/cumulative_rolling.rs @@ -1,28 +1,31 @@ use brk_error::Result; use brk_traversable::Traversable; -use brk_types::{Cents, Height, Sats, Version}; +use brk_types::{Height, Sats, Version}; +use derive_more::{Deref, DerefMut}; use vecdb::{Database, EagerVec, Exit, PcoVec, Rw, StorageMode}; use crate::{ indexes, internal::{ - AmountPerBlock, CachedWindowStarts, LazyRollingAvgsAmountFromHeight, - LazyRollingSumsAmountFromHeight, SatsToCents, + AmountPerBlockCumulative, CachedWindowStarts, LazyRollingAvgsAmountFromHeight, + LazyRollingSumsAmountFromHeight, }, prices, }; -#[derive(Traversable)] -pub struct AmountPerBlockCumulativeWithSums { - pub base: AmountPerBlock, - pub cumulative: AmountPerBlock, +#[derive(Deref, DerefMut, Traversable)] +pub struct AmountPerBlockCumulativeRolling { + #[deref] + #[deref_mut] + #[traversable(flatten)] + pub inner: AmountPerBlockCumulative, pub sum: LazyRollingSumsAmountFromHeight, pub average: LazyRollingAvgsAmountFromHeight, } const VERSION: Version = Version::TWO; -impl AmountPerBlockCumulativeWithSums { +impl AmountPerBlockCumulativeRolling { pub(crate) fn forced_import( db: &Database, name: &str, @@ -32,29 +35,26 @@ impl AmountPerBlockCumulativeWithSums { ) -> Result { let v = version + VERSION; - let base = AmountPerBlock::forced_import(db, name, v, indexes)?; - let cumulative = - AmountPerBlock::forced_import(db, &format!("{name}_cumulative"), v, indexes)?; + let inner = AmountPerBlockCumulative::forced_import(db, name, v, indexes)?; let sum = LazyRollingSumsAmountFromHeight::new( &format!("{name}_sum"), v, - &cumulative.sats.height, - &cumulative.cents.height, + &inner.cumulative.sats.height, + &inner.cumulative.cents.height, cached_starts, indexes, ); let average = LazyRollingAvgsAmountFromHeight::new( &format!("{name}_average"), v, - &cumulative.sats.height, - &cumulative.cents.height, + &inner.cumulative.sats.height, + &inner.cumulative.cents.height, cached_starts, indexes, ); Ok(Self { - base, - cumulative, + inner, sum, average, }) @@ -77,26 +77,6 @@ impl AmountPerBlockCumulativeWithSums { prices: &prices::Vecs, exit: &Exit, ) -> Result<()> { - self.cumulative - .sats - .height - .compute_cumulative(max_from, &self.base.sats.height, exit)?; - - self.base - .cents - .height - .compute_binary::( - max_from, - &self.base.sats.height, - &prices.spot.cents.height, - exit, - )?; - - self.cumulative - .cents - .height - .compute_cumulative(max_from, &self.base.cents.height, exit)?; - - Ok(()) + self.inner.compute(prices, max_from, exit) } } diff --git a/crates/brk_computer/src/internal/per_block/amount/full.rs b/crates/brk_computer/src/internal/per_block/amount/full.rs index ce31676df..0e53b7ad6 100644 --- a/crates/brk_computer/src/internal/per_block/amount/full.rs +++ b/crates/brk_computer/src/internal/per_block/amount/full.rs @@ -1,24 +1,24 @@ use brk_error::Result; use brk_traversable::Traversable; -use brk_types::{Cents, Height, Sats, Version}; +use brk_types::{Height, Sats, Version}; +use derive_more::{Deref, DerefMut}; use vecdb::{Database, EagerVec, Exit, PcoVec, Rw, StorageMode}; use crate::{ indexes, internal::{ - AmountPerBlock, CachedWindowStarts, LazyRollingAvgsAmountFromHeight, - LazyRollingSumsAmountFromHeight, RollingDistributionAmountPerBlock, SatsToCents, + AmountPerBlockCumulativeRolling, CachedWindowStarts, RollingDistributionAmountPerBlock, WindowStarts, }, prices, }; -#[derive(Traversable)] +#[derive(Deref, DerefMut, Traversable)] pub struct AmountPerBlockFull { - pub base: AmountPerBlock, - pub cumulative: AmountPerBlock, - pub sum: LazyRollingSumsAmountFromHeight, - pub average: LazyRollingAvgsAmountFromHeight, + #[deref] + #[deref_mut] + #[traversable(flatten)] + pub inner: AmountPerBlockCumulativeRolling, #[traversable(flatten)] pub distribution: RollingDistributionAmountPerBlock, } @@ -35,33 +35,14 @@ impl AmountPerBlockFull { ) -> Result { let v = version + VERSION; - let base = AmountPerBlock::forced_import(db, name, v, indexes)?; - let cumulative = - AmountPerBlock::forced_import(db, &format!("{name}_cumulative"), v, indexes)?; - let sum = LazyRollingSumsAmountFromHeight::new( - &format!("{name}_sum"), - v, - &cumulative.sats.height, - &cumulative.cents.height, - cached_starts, - indexes, - ); - let average = LazyRollingAvgsAmountFromHeight::new( - &format!("{name}_average"), - v, - &cumulative.sats.height, - &cumulative.cents.height, - cached_starts, - indexes, - ); - let rolling = RollingDistributionAmountPerBlock::forced_import(db, name, v, indexes)?; + let inner = + AmountPerBlockCumulativeRolling::forced_import(db, name, v, indexes, cached_starts)?; + let distribution = + RollingDistributionAmountPerBlock::forced_import(db, name, v, indexes)?; Ok(Self { - base, - cumulative, - sum, - average, - distribution: rolling, + inner, + distribution, }) } @@ -73,33 +54,15 @@ impl AmountPerBlockFull { exit: &Exit, compute_sats: impl FnOnce(&mut EagerVec>) -> Result<()>, ) -> Result<()> { - compute_sats(&mut self.base.sats.height)?; + compute_sats(&mut self.inner.base.sats.height)?; - self.cumulative - .sats - .height - .compute_cumulative(max_from, &self.base.sats.height, exit)?; - - self.base - .cents - .height - .compute_binary::( - max_from, - &self.base.sats.height, - &prices.spot.cents.height, - exit, - )?; - - self.cumulative - .cents - .height - .compute_cumulative(max_from, &self.base.cents.height, exit)?; + self.inner.compute_rest(max_from, prices, exit)?; self.distribution.compute( max_from, windows, - &self.base.sats.height, - &self.base.cents.height, + &self.inner.base.sats.height, + &self.inner.base.cents.height, exit, )?; diff --git a/crates/brk_computer/src/internal/per_block/amount/mod.rs b/crates/brk_computer/src/internal/per_block/amount/mod.rs index d163d1f5c..c66f68d77 100644 --- a/crates/brk_computer/src/internal/per_block/amount/mod.rs +++ b/crates/brk_computer/src/internal/per_block/amount/mod.rs @@ -1,6 +1,6 @@ mod base; mod cumulative; -mod cumulative_sum; +mod cumulative_rolling; mod full; mod lazy; mod lazy_derived_resolutions; @@ -11,7 +11,7 @@ mod with_deltas; pub use base::*; pub use cumulative::*; -pub use cumulative_sum::*; +pub use cumulative_rolling::*; pub use full::*; pub use lazy::*; pub use lazy_derived_resolutions::*; diff --git a/crates/brk_computer/src/internal/per_block/computed/cumulative_sum.rs b/crates/brk_computer/src/internal/per_block/computed/cumulative_rolling.rs similarity index 93% rename from crates/brk_computer/src/internal/per_block/computed/cumulative_sum.rs rename to crates/brk_computer/src/internal/per_block/computed/cumulative_rolling.rs index 73e84fa6e..29bd26aae 100644 --- a/crates/brk_computer/src/internal/per_block/computed/cumulative_sum.rs +++ b/crates/brk_computer/src/internal/per_block/computed/cumulative_rolling.rs @@ -1,4 +1,4 @@ -//! PerBlockCumulativeWithSums - base PerBlock + cumulative PerBlock + lazy rolling sums. +//! PerBlockCumulativeRolling - base PerBlock + cumulative PerBlock + lazy rolling sums. //! //! Rolling sums are derived lazily from the cumulative vec via LazyDeltaVec. //! No rolling sum vecs are stored on disk. @@ -24,7 +24,7 @@ use crate::{ }; #[derive(Traversable)] -pub struct PerBlockCumulativeWithSums +pub struct PerBlockCumulativeRolling where T: NumericValue + JsonSchema, C: NumericValue + JsonSchema, @@ -35,7 +35,7 @@ where pub average: LazyRollingAvgsFromHeight, } -impl PerBlockCumulativeWithSums +impl PerBlockCumulativeRolling where T: NumericValue + JsonSchema + Into, C: NumericValue + JsonSchema, diff --git a/crates/brk_computer/src/internal/per_block/computed/mod.rs b/crates/brk_computer/src/internal/per_block/computed/mod.rs index b6e362127..136fa071b 100644 --- a/crates/brk_computer/src/internal/per_block/computed/mod.rs +++ b/crates/brk_computer/src/internal/per_block/computed/mod.rs @@ -1,6 +1,6 @@ mod aggregated; mod base; -mod cumulative_sum; +mod cumulative_rolling; mod distribution; mod full; mod lazy_distribution; @@ -12,7 +12,7 @@ mod with_deltas; pub use aggregated::*; pub use base::*; -pub use cumulative_sum::*; +pub use cumulative_rolling::*; pub use distribution::*; pub use full::*; pub use lazy_distribution::*; diff --git a/crates/brk_computer/src/mining/rewards/import.rs b/crates/brk_computer/src/mining/rewards/import.rs index f261f8d56..dd45e6a63 100644 --- a/crates/brk_computer/src/mining/rewards/import.rs +++ b/crates/brk_computer/src/mining/rewards/import.rs @@ -6,7 +6,7 @@ use super::Vecs; use crate::{ indexes, internal::{ - AmountPerBlockCumulative, AmountPerBlockCumulativeWithSums, AmountPerBlockFull, + AmountPerBlockCumulative, AmountPerBlockCumulativeRolling, AmountPerBlockFull, CachedWindowStarts, FiatPerBlock, LazyPercentRollingWindows, OneMinusBp16, PercentPerBlock, PercentRollingWindows, RatioRollingWindows, }, @@ -33,10 +33,10 @@ impl Vecs { ); Ok(Self { - coinbase: AmountPerBlockCumulativeWithSums::forced_import( + coinbase: AmountPerBlockCumulativeRolling::forced_import( db, "coinbase", version, indexes, cached_starts, )?, - subsidy: AmountPerBlockCumulativeWithSums::forced_import( + subsidy: AmountPerBlockCumulativeRolling::forced_import( db, "subsidy", version, indexes, cached_starts, )?, fees: AmountPerBlockFull::forced_import(db, "fees", version, indexes, cached_starts)?, diff --git a/crates/brk_computer/src/mining/rewards/vecs.rs b/crates/brk_computer/src/mining/rewards/vecs.rs index 9efc90008..50ef039b5 100644 --- a/crates/brk_computer/src/mining/rewards/vecs.rs +++ b/crates/brk_computer/src/mining/rewards/vecs.rs @@ -3,15 +3,15 @@ use brk_types::{BasisPoints16, BasisPoints32, Cents}; use vecdb::{Rw, StorageMode}; use crate::internal::{ - AmountPerBlockCumulative, AmountPerBlockCumulativeWithSums, AmountPerBlockFull, + AmountPerBlockCumulative, AmountPerBlockCumulativeRolling, AmountPerBlockFull, FiatPerBlock, LazyPercentRollingWindows, PercentPerBlock, PercentRollingWindows, RatioRollingWindows, }; #[derive(Traversable)] pub struct Vecs { - pub coinbase: AmountPerBlockCumulativeWithSums, - pub subsidy: AmountPerBlockCumulativeWithSums, + pub coinbase: AmountPerBlockCumulativeRolling, + pub subsidy: AmountPerBlockCumulativeRolling, pub fees: AmountPerBlockFull, pub unclaimed: AmountPerBlockCumulative, #[traversable(wrap = "fees", rename = "dominance")] diff --git a/crates/brk_computer/src/pools/major.rs b/crates/brk_computer/src/pools/major.rs index 37874d3e5..5c3fac711 100644 --- a/crates/brk_computer/src/pools/major.rs +++ b/crates/brk_computer/src/pools/major.rs @@ -7,7 +7,7 @@ use vecdb::{BinaryTransform, Database, Exit, ReadableVec, Rw, StorageMode, Versi use crate::{ blocks, indexes, internal::{ - AmountPerBlockCumulativeWithSums, CachedWindowStarts, MaskSats, PercentRollingWindows, + AmountPerBlockCumulativeRolling, CachedWindowStarts, MaskSats, PercentRollingWindows, RatioU64Bp16, }, mining, prices, @@ -22,7 +22,7 @@ pub struct Vecs { #[traversable(flatten)] pub base: minor::Vecs, - pub rewards: AmountPerBlockCumulativeWithSums, + pub rewards: AmountPerBlockCumulativeRolling, #[traversable(rename = "dominance")] pub dominance_rolling: PercentRollingWindows, } @@ -39,7 +39,7 @@ impl Vecs { let base = minor::Vecs::forced_import(db, slug, version, indexes, cached_starts)?; - let rewards = AmountPerBlockCumulativeWithSums::forced_import( + let rewards = AmountPerBlockCumulativeRolling::forced_import( db, &suffix("rewards"), version, diff --git a/crates/brk_computer/src/pools/minor.rs b/crates/brk_computer/src/pools/minor.rs index 2895ec93a..67aaa7cdd 100644 --- a/crates/brk_computer/src/pools/minor.rs +++ b/crates/brk_computer/src/pools/minor.rs @@ -8,7 +8,7 @@ use vecdb::{ use crate::{ blocks, indexes, internal::{ - CachedWindowStarts, PerBlockCumulativeWithSums, PercentPerBlock, RatioU64Bp16, + CachedWindowStarts, PerBlockCumulativeRolling, PercentPerBlock, RatioU64Bp16, }, }; @@ -17,7 +17,7 @@ pub struct Vecs { #[traversable(skip)] slug: PoolSlug, - pub blocks_mined: PerBlockCumulativeWithSums, + pub blocks_mined: PerBlockCumulativeRolling, pub dominance: PercentPerBlock, } @@ -31,7 +31,7 @@ impl Vecs { ) -> Result { let suffix = |s: &str| format!("{}_{s}", slug); - let blocks_mined = PerBlockCumulativeWithSums::forced_import( + let blocks_mined = PerBlockCumulativeRolling::forced_import( db, &suffix("blocks_mined"), version + Version::ONE, diff --git a/crates/brk_computer/src/scripts/count/import.rs b/crates/brk_computer/src/scripts/count/import.rs index d2a61d8bb..1d11f2eb3 100644 --- a/crates/brk_computer/src/scripts/count/import.rs +++ b/crates/brk_computer/src/scripts/count/import.rs @@ -5,7 +5,7 @@ use vecdb::Database; use super::Vecs; use crate::{ indexes, - internal::{CachedWindowStarts, PerBlockCumulativeWithSums}, + internal::{CachedWindowStarts, PerBlockCumulativeRolling}, }; impl Vecs { @@ -16,23 +16,23 @@ impl Vecs { cached_starts: &CachedWindowStarts, ) -> Result { let p2a = - PerBlockCumulativeWithSums::forced_import(db, "p2a_count", version, indexes, cached_starts)?; + PerBlockCumulativeRolling::forced_import(db, "p2a_count", version, indexes, cached_starts)?; let p2ms = - PerBlockCumulativeWithSums::forced_import(db, "p2ms_count", version, indexes, cached_starts)?; + PerBlockCumulativeRolling::forced_import(db, "p2ms_count", version, indexes, cached_starts)?; let p2pk33 = - PerBlockCumulativeWithSums::forced_import(db, "p2pk33_count", version, indexes, cached_starts)?; + PerBlockCumulativeRolling::forced_import(db, "p2pk33_count", version, indexes, cached_starts)?; let p2pk65 = - PerBlockCumulativeWithSums::forced_import(db, "p2pk65_count", version, indexes, cached_starts)?; + PerBlockCumulativeRolling::forced_import(db, "p2pk65_count", version, indexes, cached_starts)?; let p2pkh = - PerBlockCumulativeWithSums::forced_import(db, "p2pkh_count", version, indexes, cached_starts)?; + PerBlockCumulativeRolling::forced_import(db, "p2pkh_count", version, indexes, cached_starts)?; let p2sh = - PerBlockCumulativeWithSums::forced_import(db, "p2sh_count", version, indexes, cached_starts)?; + PerBlockCumulativeRolling::forced_import(db, "p2sh_count", version, indexes, cached_starts)?; let p2tr = - PerBlockCumulativeWithSums::forced_import(db, "p2tr_count", version, indexes, cached_starts)?; + PerBlockCumulativeRolling::forced_import(db, "p2tr_count", version, indexes, cached_starts)?; let p2wpkh = - PerBlockCumulativeWithSums::forced_import(db, "p2wpkh_count", version, indexes, cached_starts)?; + PerBlockCumulativeRolling::forced_import(db, "p2wpkh_count", version, indexes, cached_starts)?; let p2wsh = - PerBlockCumulativeWithSums::forced_import(db, "p2wsh_count", version, indexes, cached_starts)?; + PerBlockCumulativeRolling::forced_import(db, "p2wsh_count", version, indexes, cached_starts)?; Ok(Self { p2a, p2ms, @@ -43,21 +43,21 @@ impl Vecs { p2tr, p2wpkh, p2wsh, - op_return: PerBlockCumulativeWithSums::forced_import( + op_return: PerBlockCumulativeRolling::forced_import( db, "op_return_count", version, indexes, cached_starts, )?, - empty_output: PerBlockCumulativeWithSums::forced_import( + empty_output: PerBlockCumulativeRolling::forced_import( db, "empty_output_count", version, indexes, cached_starts, )?, - unknown_output: PerBlockCumulativeWithSums::forced_import( + unknown_output: PerBlockCumulativeRolling::forced_import( db, "unknown_output_count", version, diff --git a/crates/brk_computer/src/scripts/count/vecs.rs b/crates/brk_computer/src/scripts/count/vecs.rs index 1d625fb74..27df9fd1b 100644 --- a/crates/brk_computer/src/scripts/count/vecs.rs +++ b/crates/brk_computer/src/scripts/count/vecs.rs @@ -2,20 +2,20 @@ use brk_traversable::Traversable; use brk_types::StoredU64; use vecdb::{Rw, StorageMode}; -use crate::internal::PerBlockCumulativeWithSums; +use crate::internal::PerBlockCumulativeRolling; #[derive(Traversable)] pub struct Vecs { - pub p2a: PerBlockCumulativeWithSums, - pub p2ms: PerBlockCumulativeWithSums, - pub p2pk33: PerBlockCumulativeWithSums, - pub p2pk65: PerBlockCumulativeWithSums, - pub p2pkh: PerBlockCumulativeWithSums, - pub p2sh: PerBlockCumulativeWithSums, - pub p2tr: PerBlockCumulativeWithSums, - pub p2wpkh: PerBlockCumulativeWithSums, - pub p2wsh: PerBlockCumulativeWithSums, - pub op_return: PerBlockCumulativeWithSums, - pub empty_output: PerBlockCumulativeWithSums, - pub unknown_output: PerBlockCumulativeWithSums, + pub p2a: PerBlockCumulativeRolling, + pub p2ms: PerBlockCumulativeRolling, + pub p2pk33: PerBlockCumulativeRolling, + pub p2pk65: PerBlockCumulativeRolling, + pub p2pkh: PerBlockCumulativeRolling, + pub p2sh: PerBlockCumulativeRolling, + pub p2tr: PerBlockCumulativeRolling, + pub p2wpkh: PerBlockCumulativeRolling, + pub p2wsh: PerBlockCumulativeRolling, + pub op_return: PerBlockCumulativeRolling, + pub empty_output: PerBlockCumulativeRolling, + pub unknown_output: PerBlockCumulativeRolling, } diff --git a/crates/brk_computer/src/scripts/value/import.rs b/crates/brk_computer/src/scripts/value/import.rs index 449e0638c..1bafba9cb 100644 --- a/crates/brk_computer/src/scripts/value/import.rs +++ b/crates/brk_computer/src/scripts/value/import.rs @@ -3,7 +3,7 @@ use brk_types::Version; use vecdb::Database; use super::Vecs; -use crate::{indexes, internal::{AmountPerBlockCumulativeWithSums, CachedWindowStarts}}; +use crate::{indexes, internal::{AmountPerBlockCumulativeRolling, CachedWindowStarts}}; impl Vecs { pub(crate) fn forced_import( @@ -13,7 +13,7 @@ impl Vecs { cached_starts: &CachedWindowStarts, ) -> Result { Ok(Self { - op_return: AmountPerBlockCumulativeWithSums::forced_import( + op_return: AmountPerBlockCumulativeRolling::forced_import( db, "op_return_value", version, diff --git a/crates/brk_computer/src/scripts/value/vecs.rs b/crates/brk_computer/src/scripts/value/vecs.rs index 485744b05..c25267534 100644 --- a/crates/brk_computer/src/scripts/value/vecs.rs +++ b/crates/brk_computer/src/scripts/value/vecs.rs @@ -1,9 +1,9 @@ use brk_traversable::Traversable; use vecdb::{Rw, StorageMode}; -use crate::internal::AmountPerBlockCumulativeWithSums; +use crate::internal::AmountPerBlockCumulativeRolling; #[derive(Traversable)] pub struct Vecs { - pub op_return: AmountPerBlockCumulativeWithSums, + pub op_return: AmountPerBlockCumulativeRolling, } diff --git a/crates/brk_computer/src/supply/burned/import.rs b/crates/brk_computer/src/supply/burned/import.rs index 1eb46fabd..161e76c55 100644 --- a/crates/brk_computer/src/supply/burned/import.rs +++ b/crates/brk_computer/src/supply/burned/import.rs @@ -3,7 +3,7 @@ use brk_types::Version; use vecdb::Database; use super::Vecs; -use crate::{indexes, internal::{AmountPerBlockCumulativeWithSums, CachedWindowStarts}}; +use crate::{indexes, internal::{AmountPerBlockCumulativeRolling, CachedWindowStarts}}; impl Vecs { pub(crate) fn forced_import( @@ -13,7 +13,7 @@ impl Vecs { cached_starts: &CachedWindowStarts, ) -> Result { Ok(Self { - total: AmountPerBlockCumulativeWithSums::forced_import( + total: AmountPerBlockCumulativeRolling::forced_import( db, "unspendable_supply", version, diff --git a/crates/brk_computer/src/supply/burned/vecs.rs b/crates/brk_computer/src/supply/burned/vecs.rs index 2b036c3d2..e24aafd0b 100644 --- a/crates/brk_computer/src/supply/burned/vecs.rs +++ b/crates/brk_computer/src/supply/burned/vecs.rs @@ -1,10 +1,10 @@ use brk_traversable::Traversable; use vecdb::{Rw, StorageMode}; -use crate::internal::AmountPerBlockCumulativeWithSums; +use crate::internal::AmountPerBlockCumulativeRolling; #[derive(Traversable)] #[traversable(transparent)] pub struct Vecs { - pub total: AmountPerBlockCumulativeWithSums, + pub total: AmountPerBlockCumulativeRolling, } diff --git a/crates/brk_computer/src/transactions/versions/import.rs b/crates/brk_computer/src/transactions/versions/import.rs index 07c96335c..f51aa8d50 100644 --- a/crates/brk_computer/src/transactions/versions/import.rs +++ b/crates/brk_computer/src/transactions/versions/import.rs @@ -5,7 +5,7 @@ use vecdb::Database; use super::Vecs; use crate::{ indexes, - internal::{CachedWindowStarts, PerBlockCumulativeWithSums}, + internal::{CachedWindowStarts, PerBlockCumulativeRolling}, }; impl Vecs { @@ -16,9 +16,9 @@ impl Vecs { cached_starts: &CachedWindowStarts, ) -> Result { Ok(Self { - v1: PerBlockCumulativeWithSums::forced_import(db, "tx_v1", version, indexes, cached_starts)?, - v2: PerBlockCumulativeWithSums::forced_import(db, "tx_v2", version, indexes, cached_starts)?, - v3: PerBlockCumulativeWithSums::forced_import(db, "tx_v3", version, indexes, cached_starts)?, + v1: PerBlockCumulativeRolling::forced_import(db, "tx_v1", version, indexes, cached_starts)?, + v2: PerBlockCumulativeRolling::forced_import(db, "tx_v2", version, indexes, cached_starts)?, + v3: PerBlockCumulativeRolling::forced_import(db, "tx_v3", version, indexes, cached_starts)?, }) } } diff --git a/crates/brk_computer/src/transactions/versions/vecs.rs b/crates/brk_computer/src/transactions/versions/vecs.rs index 161503916..8aaed73e0 100644 --- a/crates/brk_computer/src/transactions/versions/vecs.rs +++ b/crates/brk_computer/src/transactions/versions/vecs.rs @@ -2,11 +2,11 @@ use brk_traversable::Traversable; use brk_types::StoredU64; use vecdb::{Rw, StorageMode}; -use crate::internal::PerBlockCumulativeWithSums; +use crate::internal::PerBlockCumulativeRolling; #[derive(Traversable)] pub struct Vecs { - pub v1: PerBlockCumulativeWithSums, - pub v2: PerBlockCumulativeWithSums, - pub v3: PerBlockCumulativeWithSums, + pub v1: PerBlockCumulativeRolling, + pub v2: PerBlockCumulativeRolling, + pub v3: PerBlockCumulativeRolling, } diff --git a/crates/brk_computer/src/transactions/volume/import.rs b/crates/brk_computer/src/transactions/volume/import.rs index 1bd589216..43e79cd66 100644 --- a/crates/brk_computer/src/transactions/volume/import.rs +++ b/crates/brk_computer/src/transactions/volume/import.rs @@ -5,7 +5,7 @@ use vecdb::Database; use super::Vecs; use crate::{ indexes, - internal::{AmountPerBlockCumulativeWithSums, CachedWindowStarts, PerBlock, Windows}, + internal::{AmountPerBlockCumulativeRolling, CachedWindowStarts, PerBlock, Windows}, }; impl Vecs { @@ -17,7 +17,7 @@ impl Vecs { ) -> Result { let v = version + Version::TWO; Ok(Self { - transfer_volume: AmountPerBlockCumulativeWithSums::forced_import( + transfer_volume: AmountPerBlockCumulativeRolling::forced_import( db, "transfer_volume_bis", version, diff --git a/crates/brk_computer/src/transactions/volume/vecs.rs b/crates/brk_computer/src/transactions/volume/vecs.rs index 22b1a5d5c..6f09e4c3e 100644 --- a/crates/brk_computer/src/transactions/volume/vecs.rs +++ b/crates/brk_computer/src/transactions/volume/vecs.rs @@ -2,11 +2,11 @@ use brk_traversable::Traversable; use brk_types::StoredF32; use vecdb::{Rw, StorageMode}; -use crate::internal::{AmountPerBlockCumulativeWithSums, PerBlock, Windows}; +use crate::internal::{AmountPerBlockCumulativeRolling, PerBlock, Windows}; #[derive(Traversable)] pub struct Vecs { - pub transfer_volume: AmountPerBlockCumulativeWithSums, + pub transfer_volume: AmountPerBlockCumulativeRolling, pub tx_per_sec: Windows>, pub outputs_per_sec: Windows>, pub inputs_per_sec: Windows>, diff --git a/modules/brk-client/index.js b/modules/brk-client/index.js index 85eca1b8e..678a0aeba 100644 --- a/modules/brk-client/index.js +++ b/modules/brk-client/index.js @@ -2067,13 +2067,13 @@ function createCapLossMvrvNetPriceProfitSoprPattern(client, acc) { } /** - * @typedef {Object} InInvestedMaxMinPercentilesSupplyPattern + * @typedef {Object} InMaxMinPerSupplyPattern * @property {PerPattern} inLoss * @property {PerPattern} inProfit - * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} investedCapital * @property {CentsSatsUsdPattern} max * @property {CentsSatsUsdPattern} min - * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} percentiles + * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} perCoin + * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} perDollar * @property {BpsPercentRatioPattern3} supplyDensity */ @@ -4413,6 +4413,8 @@ function createUnspentPattern(client, acc) { * @typedef {Object} SeriesTree_Mining_Rewards_Subsidy * @property {BtcCentsSatsUsdPattern} base * @property {BtcCentsSatsUsdPattern} cumulative + * @property {_1m1w1y24hPattern3} sum + * @property {_1m1w1y24hPattern3} average * @property {_1m1w1y24hBpsPercentRatioPattern} dominance * @property {CentsUsdPattern2} sma1y */ @@ -5556,8 +5558,8 @@ function createUnspentPattern(client, acc) { * @property {PerPattern} inLoss * @property {CentsSatsUsdPattern} min * @property {CentsSatsUsdPattern} max - * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} percentiles - * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} investedCapital + * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} perCoin + * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} perDollar * @property {BpsPercentRatioPattern3} supplyDensity */ @@ -5764,8 +5766,8 @@ function createUnspentPattern(client, acc) { * @property {PerPattern} inLoss * @property {CentsSatsUsdPattern} min * @property {CentsSatsUsdPattern} max - * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} percentiles - * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} investedCapital + * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} perCoin + * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} perDollar * @property {BpsPercentRatioPattern3} supplyDensity */ @@ -5940,8 +5942,8 @@ function createUnspentPattern(client, acc) { * @property {PerPattern} inLoss * @property {CentsSatsUsdPattern} min * @property {CentsSatsUsdPattern} max - * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} percentiles - * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} investedCapital + * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} perCoin + * @property {Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern} perDollar * @property {BpsPercentRatioPattern3} supplyDensity */ @@ -7786,6 +7788,8 @@ class BrkClient extends BrkClientBase { subsidy: { base: createBtcCentsSatsUsdPattern(this, 'subsidy'), cumulative: createBtcCentsSatsUsdPattern(this, 'subsidy_cumulative'), + sum: create_1m1w1y24hPattern3(this, 'subsidy_sum'), + average: create_1m1w1y24hPattern3(this, 'subsidy_average'), dominance: create_1m1w1y24hBpsPercentRatioPattern(this, 'subsidy_dominance'), sma1y: createCentsUsdPattern2(this, 'subsidy_sma_1y'), }, @@ -8611,8 +8615,8 @@ class BrkClient extends BrkClientBase { inLoss: createPerPattern(this, 'cost_basis_in_loss_per'), min: createCentsSatsUsdPattern(this, 'cost_basis_min'), max: createCentsSatsUsdPattern(this, 'cost_basis_max'), - percentiles: createPct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(this, 'cost_basis'), - investedCapital: createPct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(this, 'invested_capital'), + perCoin: createPct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(this, 'cost_basis_per_coin'), + perDollar: createPct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(this, 'cost_basis_per_dollar'), supplyDensity: createBpsPercentRatioPattern3(this, 'supply_density'), }, unrealized: { @@ -8766,8 +8770,8 @@ class BrkClient extends BrkClientBase { inLoss: createPerPattern(this, 'sth_cost_basis_in_loss_per'), min: createCentsSatsUsdPattern(this, 'sth_cost_basis_min'), max: createCentsSatsUsdPattern(this, 'sth_cost_basis_max'), - percentiles: createPct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(this, 'sth_cost_basis'), - investedCapital: createPct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(this, 'sth_invested_capital'), + perCoin: createPct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(this, 'sth_cost_basis_per_coin'), + perDollar: createPct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(this, 'sth_cost_basis_per_dollar'), supplyDensity: createBpsPercentRatioPattern3(this, 'sth_supply_density'), }, unrealized: { @@ -8901,8 +8905,8 @@ class BrkClient extends BrkClientBase { inLoss: createPerPattern(this, 'lth_cost_basis_in_loss_per'), min: createCentsSatsUsdPattern(this, 'lth_cost_basis_min'), max: createCentsSatsUsdPattern(this, 'lth_cost_basis_max'), - percentiles: createPct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(this, 'lth_cost_basis'), - investedCapital: createPct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(this, 'lth_invested_capital'), + perCoin: createPct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(this, 'lth_cost_basis_per_coin'), + perDollar: createPct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(this, 'lth_cost_basis_per_dollar'), supplyDensity: createBpsPercentRatioPattern3(this, 'lth_supply_density'), }, unrealized: { diff --git a/packages/brk_client/brk_client/__init__.py b/packages/brk_client/brk_client/__init__.py index 68a113291..64c54822f 100644 --- a/packages/brk_client/brk_client/__init__.py +++ b/packages/brk_client/brk_client/__init__.py @@ -2339,7 +2339,7 @@ class CapLossMvrvNetPriceProfitSoprPattern: self.profit: BaseCumulativeSumPattern = BaseCumulativeSumPattern(client, _m(acc, 'realized_profit')) self.sopr: RatioValuePattern = RatioValuePattern(client, acc) -class InInvestedMaxMinPercentilesSupplyPattern: +class InMaxMinPerSupplyPattern: """Pattern struct for repeated tree structure.""" pass @@ -3639,6 +3639,8 @@ class SeriesTree_Mining_Rewards_Subsidy: def __init__(self, client: BrkClientBase, base_path: str = ''): self.base: BtcCentsSatsUsdPattern = BtcCentsSatsUsdPattern(client, 'subsidy') self.cumulative: BtcCentsSatsUsdPattern = BtcCentsSatsUsdPattern(client, 'subsidy_cumulative') + self.sum: _1m1w1y24hPattern3 = _1m1w1y24hPattern3(client, 'subsidy_sum') + self.average: _1m1w1y24hPattern3 = _1m1w1y24hPattern3(client, 'subsidy_average') self.dominance: _1m1w1y24hBpsPercentRatioPattern = _1m1w1y24hBpsPercentRatioPattern(client, 'subsidy_dominance') self.sma_1y: CentsUsdPattern2 = CentsUsdPattern2(client, 'subsidy_sma_1y') @@ -4866,8 +4868,8 @@ class SeriesTree_Cohorts_Utxo_All_CostBasis: self.in_loss: PerPattern = PerPattern(client, 'cost_basis_in_loss_per') self.min: CentsSatsUsdPattern = CentsSatsUsdPattern(client, 'cost_basis_min') self.max: CentsSatsUsdPattern = CentsSatsUsdPattern(client, 'cost_basis_max') - self.percentiles: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern = Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(client, 'cost_basis') - self.invested_capital: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern = Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(client, 'invested_capital') + self.per_coin: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern = Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(client, 'cost_basis_per_coin') + self.per_dollar: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern = Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(client, 'cost_basis_per_dollar') self.supply_density: BpsPercentRatioPattern3 = BpsPercentRatioPattern3(client, 'supply_density') class SeriesTree_Cohorts_Utxo_All_Unrealized_Profit: @@ -5092,8 +5094,8 @@ class SeriesTree_Cohorts_Utxo_Sth_CostBasis: self.in_loss: PerPattern = PerPattern(client, 'sth_cost_basis_in_loss_per') self.min: CentsSatsUsdPattern = CentsSatsUsdPattern(client, 'sth_cost_basis_min') self.max: CentsSatsUsdPattern = CentsSatsUsdPattern(client, 'sth_cost_basis_max') - self.percentiles: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern = Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(client, 'sth_cost_basis') - self.invested_capital: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern = Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(client, 'sth_invested_capital') + self.per_coin: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern = Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(client, 'sth_cost_basis_per_coin') + self.per_dollar: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern = Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(client, 'sth_cost_basis_per_dollar') self.supply_density: BpsPercentRatioPattern3 = BpsPercentRatioPattern3(client, 'sth_supply_density') class SeriesTree_Cohorts_Utxo_Sth_Unrealized_Sentiment: @@ -5282,8 +5284,8 @@ class SeriesTree_Cohorts_Utxo_Lth_CostBasis: self.in_loss: PerPattern = PerPattern(client, 'lth_cost_basis_in_loss_per') self.min: CentsSatsUsdPattern = CentsSatsUsdPattern(client, 'lth_cost_basis_min') self.max: CentsSatsUsdPattern = CentsSatsUsdPattern(client, 'lth_cost_basis_max') - self.percentiles: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern = Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(client, 'lth_cost_basis') - self.invested_capital: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern = Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(client, 'lth_invested_capital') + self.per_coin: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern = Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(client, 'lth_cost_basis_per_coin') + self.per_dollar: Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern = Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern(client, 'lth_cost_basis_per_dollar') self.supply_density: BpsPercentRatioPattern3 = BpsPercentRatioPattern3(client, 'lth_supply_density') class SeriesTree_Cohorts_Utxo_Lth_Unrealized_Sentiment: diff --git a/website/scripts/options/cointime.js b/website/scripts/options/cointime.js index c45d9bfda..6d0855305 100644 --- a/website/scripts/options/cointime.js +++ b/website/scripts/options/cointime.js @@ -5,9 +5,9 @@ import { dots, line, price, - sumsArray, multiSeriesTree, percentRatioDots, + sumsAndAveragesCumulative, } from "./series.js"; import { satsBtcUsd, priceRatioPercentilesTree } from "./shared.js"; @@ -277,50 +277,27 @@ export function createCointimeSection() { { name: "Coinblocks", tree: [ - { - name: "Compare", - tree: multiSeriesTree({ - entries: coinblocks.map(({ pattern, name, color }) => ({ - name, - color, - base: pattern.base, - average: pattern.average, - rolling: pattern.sum, - cumulative: pattern.cumulative, - })), - title: "Coinblocks", - unit: Unit.coinblocks, - }), - }, + ...multiSeriesTree({ + entries: coinblocks.map(({ pattern, name, color }) => ({ + name, + color, + average: pattern.average, + sum: pattern.sum, + cumulative: pattern.cumulative, + })), + title: "Coinblocks", + unit: Unit.coinblocks, + }), ...coinblocks.map(({ pattern, name, title, color }) => ({ name, - tree: [ - { - name: "Per Block", - title, - bottom: [ - line({ - series: pattern.base, - name, - color, - unit: Unit.coinblocks, - }), - ], - }, - ...sumsArray({ windows: pattern.sum, title, unit: Unit.coinblocks }), - { - name: "Cumulative", - title: `${title} (Total)`, - bottom: [ - line({ - series: pattern.cumulative, - name, - color, - unit: Unit.coinblocks, - }), - ], - }, - ], + tree: sumsAndAveragesCumulative({ + sum: pattern.sum, + average: pattern.average, + cumulative: pattern.cumulative, + title, + unit: Unit.coinblocks, + color, + }), })), ], }, @@ -328,95 +305,47 @@ export function createCointimeSection() { { name: "Value", tree: [ - { - name: "Compare", - tree: multiSeriesTree({ - entries: [ - ...cointimeValues.map(({ pattern, name, color }) => ({ - name, - color, - base: pattern.base, - average: pattern.average, - rolling: pattern.sum, - cumulative: pattern.cumulative, - })), - { - name: vocdd.name, - color: vocdd.color, - base: vocdd.pattern.base, - average: vocdd.pattern.average, - rolling: vocdd.pattern.sum, - cumulative: vocdd.pattern.cumulative, - }, - ], - title: "Cointime Value", - unit: Unit.usd, - }), - }, - ...cointimeValues.map(({ pattern, name, title, color }) => ({ - name, - tree: [ + ...multiSeriesTree({ + entries: [ + ...cointimeValues.map(({ pattern, name, color }) => ({ + name, + color, + average: pattern.average, + sum: pattern.sum, + cumulative: pattern.cumulative, + })), { - name: "Per Block", - title, - bottom: [ - line({ series: pattern.base, name, color, unit: Unit.usd }), - ], - }, - ...sumsArray({ windows: pattern.sum, title, unit: Unit.usd }), - { - name: "Cumulative", - title: `${title} (Total)`, - bottom: [ - line({ - series: pattern.cumulative, - name, - color, - unit: Unit.usd, - }), - ], + name: vocdd.name, + color: vocdd.color, + average: vocdd.pattern.average, + sum: vocdd.pattern.sum, + cumulative: vocdd.pattern.cumulative, }, ], + title: "Cointime Value", + unit: Unit.usd, + }), + ...cointimeValues.map(({ pattern, name, title, color }) => ({ + name, + tree: sumsAndAveragesCumulative({ + sum: pattern.sum, + average: pattern.average, + cumulative: pattern.cumulative, + title, + unit: Unit.usd, + color, + }), })), { name: vocdd.name, - tree: [ - { - name: "Per Block", - title: vocdd.title, - bottom: [ - line({ - series: vocdd.pattern.base, - name: vocdd.name, - color: vocdd.color, - unit: Unit.usd, - }), - line({ - series: reserveRisk.vocddMedian1y, - name: "365d Median", - color: colors.time._1y, - unit: Unit.usd, - }), - ], - }, - ...sumsArray({ - windows: vocdd.pattern.sum, - title: vocdd.title, - unit: Unit.usd, - }), - { - name: "Cumulative", - title: `${vocdd.title} (Total)`, - bottom: [ - line({ - series: vocdd.pattern.cumulative, - name: vocdd.name, - color: vocdd.color, - unit: Unit.usd, - }), - ], - }, - ], + tree: sumsAndAveragesCumulative({ + sum: vocdd.pattern.sum, + average: vocdd.pattern.average, + cumulative: vocdd.pattern.cumulative, + title: vocdd.title, + unit: Unit.usd, + color: vocdd.color, + }), }, ], }, diff --git a/website/scripts/options/distribution/activity.js b/website/scripts/options/distribution/activity.js index 6bead00f4..d899aa35c 100644 --- a/website/scripts/options/distribution/activity.js +++ b/website/scripts/options/distribution/activity.js @@ -9,7 +9,15 @@ */ import { Unit } from "../../utils/units.js"; -import { line, baseline, dotsBaseline, percentRatio, chartsFromCount, averagesTree, ROLLING_WINDOWS } from "../series.js"; +import { + line, + baseline, + dotsBaseline, + percentRatio, + chartsFromCount, + averagesArray, + ROLLING_WINDOWS, +} from "../series.js"; import { satsBtcUsdFullTree, mapCohortsWithAll, @@ -33,7 +41,6 @@ function volumeAndCoinsTree(activity, color, title) { name: "Volume", tree: satsBtcUsdFullTree({ pattern: activity.transferVolume, - name: "Volume", title: title("Sent Volume"), color, }), @@ -62,7 +69,6 @@ function sentProfitLossTree(sent, title) { name: "Sent In Profit", tree: satsBtcUsdFullTree({ pattern: sent.inProfit, - name: "In Profit", title: title("Sent Volume In Profit"), color: colors.profit, }), @@ -71,7 +77,6 @@ function sentProfitLossTree(sent, title) { name: "Sent In Loss", tree: satsBtcUsdFullTree({ pattern: sent.inLoss, - name: "In Loss", title: title("Sent Volume In Loss"), color: colors.loss, }), @@ -90,7 +95,14 @@ function fullVolumeTree(activity, color, title) { return [ ...volumeAndCoinsTree(activity, color, title), ...sentProfitLossTree(activity.transferVolume, title), - averagesTree({ windows: activity.dormancy, title: title("Dormancy"), unit: Unit.days, name: "Dormancy" }), + { + name: "Dormancy", + tree: averagesArray({ + windows: activity.dormancy, + title: title("Dormancy"), + unit: Unit.days, + }), + }, ]; } @@ -110,13 +122,26 @@ function singleRollingSoprTree(ratio, title, prefix = "") { name: "Compare", title: title(`${prefix}SOPR`), bottom: ROLLING_WINDOWS.map((w) => - baseline({ series: ratio[w.key], name: w.name, color: w.color, unit: Unit.ratio, base: 1 }), + baseline({ + series: ratio[w.key], + name: w.name, + color: w.color, + unit: Unit.ratio, + base: 1, + }), ), }, ...ROLLING_WINDOWS.map((w) => ({ name: w.name, title: title(`${prefix}SOPR (${w.title})`), - bottom: [baseline({ series: ratio[w.key], name: "SOPR", unit: Unit.ratio, base: 1 })], + bottom: [ + baseline({ + series: ratio[w.key], + name: "SOPR", + unit: Unit.ratio, + base: 1, + }), + ], })), ]; } @@ -136,7 +161,11 @@ function singleSellSideRiskTree(sellSideRisk, title) { name: "Compare", title: title("Sell Side Risk"), bottom: ROLLING_WINDOWS.flatMap((w) => - percentRatio({ pattern: sellSideRisk[w.key], name: w.name, color: w.color }), + percentRatio({ + pattern: sellSideRisk[w.key], + name: w.name, + color: w.color, + }), ), }, ...ROLLING_WINDOWS.map((w) => ({ @@ -171,11 +200,18 @@ export function createActivitySectionWithAdjusted({ cohort, title }) { ...singleRollingSoprTree(sopr.ratio, title), { name: "Adjusted", - tree: singleRollingSoprTree(sopr.adjusted.ratio, title, "Adjusted "), + tree: singleRollingSoprTree( + sopr.adjusted.ratio, + title, + "Adjusted ", + ), }, ], }, - { name: "Sell Side Risk", tree: singleSellSideRiskTree(r.sellSideRiskRatio, title) }, + { + name: "Sell Side Risk", + tree: singleSellSideRiskTree(r.sellSideRiskRatio, title), + }, ], }; } @@ -198,7 +234,10 @@ export function createActivitySection({ cohort, title }) { name: "SOPR", tree: singleRollingSoprTree(sopr.ratio, title), }, - { name: "Sell Side Risk", tree: singleSellSideRiskTree(r.sellSideRiskRatio, title) }, + { + name: "Sell Side Risk", + tree: singleSellSideRiskTree(r.sellSideRiskRatio, title), + }, ], }; } @@ -220,13 +259,19 @@ export function createActivitySectionWithActivity({ cohort, title }) { { name: "SOPR", title: title("SOPR (24h)"), - bottom: [dotsBaseline({ series: sopr.ratio._24h, name: "SOPR", unit: Unit.ratio, base: 1 })], + bottom: [ + dotsBaseline({ + series: sopr.ratio._24h, + name: "SOPR", + unit: Unit.ratio, + base: 1, + }), + ], }, ], }; } - /** * Minimal activity section: volume only * @param {{ cohort: CohortBasicWithMarketCap | CohortBasicWithoutMarketCap | CohortWithoutRelative | CohortAddr | AddrCohortObject, title: (name: string) => string }} args @@ -237,7 +282,6 @@ export function createActivitySectionMinimal({ cohort, title }) { name: "Activity", tree: satsBtcUsdFullTree({ pattern: cohort.tree.activity.transferVolume, - name: "Volume", title: title("Volume"), }), }; @@ -255,7 +299,12 @@ export function createGroupedActivitySectionMinimal({ list, all, title }) { name: w.name, title: title(`Volume (${w.title})`), bottom: mapCohortsWithAll(list, all, ({ name, color, tree }) => - line({ series: tree.activity.transferVolume.sum[w.key].sats, name, color, unit: Unit.sats }), + line({ + series: tree.activity.transferVolume.sum[w.key].sats, + name, + color, + unit: Unit.sats, + }), ), })), }; @@ -280,7 +329,13 @@ function groupedSoprCharts(list, all, getRatio, title, prefix = "") { name: w.name, title: title(`${prefix}SOPR (${w.title})`), bottom: mapCohortsWithAll(list, all, (c) => - baseline({ series: getRatio(c)[w.key], name: c.name, color: c.color, unit: Unit.ratio, base: 1 }), + baseline({ + series: getRatio(c)[w.key], + name: c.name, + color: c.color, + unit: Unit.ratio, + base: 1, + }), ), })); } @@ -300,7 +355,6 @@ function groupedSoprCharts(list, all, getRatio, title, prefix = "") { * @returns {PartialOptionsTree} */ - // ============================================================================ // Grouped Activity Sections // ============================================================================ @@ -317,16 +371,32 @@ export function createGroupedActivitySectionWithAdjusted({ list, all, title }) { name: "Volume", title: title("Sent Volume"), bottom: flatMapCohortsWithAll(list, all, ({ name, color, tree }) => [ - line({ series: tree.activity.transferVolume.sum._24h.sats, name, color, unit: Unit.sats }), + line({ + series: tree.activity.transferVolume.sum._24h.sats, + name, + color, + unit: Unit.sats, + }), ]), }, { name: "SOPR", tree: [ - ...groupedSoprCharts(list, all, (c) => c.tree.realized.sopr.ratio, title), + ...groupedSoprCharts( + list, + all, + (c) => c.tree.realized.sopr.ratio, + title, + ), { name: "Adjusted", - tree: groupedSoprCharts(list, all, (c) => c.tree.realized.sopr.adjusted.ratio, title, "Adjusted "), + tree: groupedSoprCharts( + list, + all, + (c) => c.tree.realized.sopr.adjusted.ratio, + title, + "Adjusted ", + ), }, ], }, @@ -336,7 +406,12 @@ export function createGroupedActivitySectionWithAdjusted({ list, all, title }) { name: w.name, title: title(`Sell Side Risk (${w.title})`), bottom: mapCohortsWithAll(list, all, ({ name, color, tree }) => - line({ series: tree.realized.sellSideRiskRatio[w.key].ratio, name, color, unit: Unit.ratio }), + line({ + series: tree.realized.sellSideRiskRatio[w.key].ratio, + name, + color, + unit: Unit.ratio, + }), ), })), }, @@ -344,7 +419,12 @@ export function createGroupedActivitySectionWithAdjusted({ list, all, title }) { name: "Coindays Destroyed", title: title("Coindays Destroyed"), bottom: flatMapCohortsWithAll(list, all, ({ name, color, tree }) => [ - line({ series: tree.activity.coindaysDestroyed.sum._24h, name, color, unit: Unit.coindays }), + line({ + series: tree.activity.coindaysDestroyed.sum._24h, + name, + color, + unit: Unit.coindays, + }), ]), }, ], @@ -364,13 +444,23 @@ export function createGroupedActivitySection({ list, all, title }) { name: "Volume", title: title("Sent Volume"), bottom: flatMapCohortsWithAll(list, all, ({ name, color, tree }) => [ - line({ series: tree.activity.transferVolume.sum._24h.sats, name, color, unit: Unit.sats }), + line({ + series: tree.activity.transferVolume.sum._24h.sats, + name, + color, + unit: Unit.sats, + }), ]), }, { name: "SOPR", tree: [ - ...groupedSoprCharts(list, all, (c) => c.tree.realized.sopr.ratio, title), + ...groupedSoprCharts( + list, + all, + (c) => c.tree.realized.sopr.ratio, + title, + ), ], }, { @@ -379,7 +469,12 @@ export function createGroupedActivitySection({ list, all, title }) { name: w.name, title: title(`Sell Side Risk (${w.title})`), bottom: mapCohortsWithAll(list, all, ({ name, color, tree }) => - line({ series: tree.realized.sellSideRiskRatio[w.key].ratio, name, color, unit: Unit.ratio }), + line({ + series: tree.realized.sellSideRiskRatio[w.key].ratio, + name, + color, + unit: Unit.ratio, + }), ), })), }, @@ -387,7 +482,12 @@ export function createGroupedActivitySection({ list, all, title }) { name: "Coindays Destroyed", title: title("Coindays Destroyed"), bottom: flatMapCohortsWithAll(list, all, ({ name, color, tree }) => [ - line({ series: tree.activity.coindaysDestroyed.sum._24h, name, color, unit: Unit.coindays }), + line({ + series: tree.activity.coindaysDestroyed.sum._24h, + name, + color, + unit: Unit.coindays, + }), ]), }, ], @@ -407,24 +507,39 @@ export function createGroupedActivitySectionWithActivity({ list, all, title }) { name: "Volume", title: title("Sent Volume"), bottom: flatMapCohortsWithAll(list, all, ({ name, color, tree }) => [ - line({ series: tree.activity.transferVolume.sum._24h.sats, name, color, unit: Unit.sats }), + line({ + series: tree.activity.transferVolume.sum._24h.sats, + name, + color, + unit: Unit.sats, + }), ]), }, { name: "SOPR", title: title("SOPR (24h)"), bottom: mapCohortsWithAll(list, all, ({ name, color, tree }) => - baseline({ series: tree.realized.sopr.ratio._24h, name, color, unit: Unit.ratio, base: 1 }), + baseline({ + series: tree.realized.sopr.ratio._24h, + name, + color, + unit: Unit.ratio, + base: 1, + }), ), }, { name: "Coindays Destroyed", title: title("Coindays Destroyed"), bottom: flatMapCohortsWithAll(list, all, ({ name, color, tree }) => [ - line({ series: tree.activity.coindaysDestroyed.sum._24h, name, color, unit: Unit.coindays }), + line({ + series: tree.activity.coindaysDestroyed.sum._24h, + name, + color, + unit: Unit.coindays, + }), ]), }, ], }; } - diff --git a/website/scripts/options/distribution/cost-basis.js b/website/scripts/options/distribution/cost-basis.js index 71434eb27..b88152598 100644 --- a/website/scripts/options/distribution/cost-basis.js +++ b/website/scripts/options/distribution/cost-basis.js @@ -93,7 +93,7 @@ export function createCostBasisSectionWithPercentiles({ cohort, title }) { tree: singleWeightFolder({ avgPrice: tree.realized.price, avgName: "Average", inProfit: cb.inProfit.perCoin, inLoss: cb.inLoss.perCoin, - percentiles: cb.percentiles, color, weightLabel: "BTC-weighted", title, + percentiles: cb.perCoin, color, weightLabel: "BTC-weighted", title, min: cb.min, max: cb.max, }), }, @@ -102,7 +102,7 @@ export function createCostBasisSectionWithPercentiles({ cohort, title }) { tree: singleWeightFolder({ avgPrice: tree.realized.investor.price, avgName: "Average", inProfit: cb.inProfit.perDollar, inLoss: cb.inLoss.perDollar, - percentiles: cb.investedCapital, color, weightLabel: "USD-weighted", title, + percentiles: cb.perDollar, color, weightLabel: "USD-weighted", title, }), }, { @@ -215,7 +215,7 @@ export function createGroupedCostBasisSectionWithPercentiles({ list, all, title getAvgPrice: (c) => c.tree.realized.price, getInProfit: (c) => c.tree.costBasis.inProfit.perCoin, getInLoss: (c) => c.tree.costBasis.inLoss.perCoin, - getPercentiles: (c) => c.tree.costBasis.percentiles, + getPercentiles: (c) => c.tree.costBasis.perCoin, avgTitle: "Average", weightLabel: "BTC-weighted", }), }, @@ -226,7 +226,7 @@ export function createGroupedCostBasisSectionWithPercentiles({ list, all, title getAvgPrice: (c) => c.tree.realized.investor.price, getInProfit: (c) => c.tree.costBasis.inProfit.perDollar, getInLoss: (c) => c.tree.costBasis.inLoss.perDollar, - getPercentiles: (c) => c.tree.costBasis.investedCapital, + getPercentiles: (c) => c.tree.costBasis.perDollar, avgTitle: "Average", weightLabel: "USD-weighted", }), }, diff --git a/website/scripts/options/distribution/index.js b/website/scripts/options/distribution/index.js index 8478a026a..3d41384f6 100644 --- a/website/scripts/options/distribution/index.js +++ b/website/scripts/options/distribution/index.js @@ -10,8 +10,19 @@ * - activity.js: SOPR, Volume, Lifespan */ -import { formatCohortTitle, satsBtcUsd, satsBtcUsdFullTree } from "../shared.js"; -import { ROLLING_WINDOWS, line, baseline, percentRatio, sumsTree, rollingPercentRatioTree } from "../series.js"; +import { + formatCohortTitle, + satsBtcUsd, + satsBtcUsdFullTree, +} from "../shared.js"; +import { + ROLLING_WINDOWS, + line, + baseline, + percentRatio, + sumsTree, + rollingPercentRatioTree, +} from "../series.js"; import { Unit } from "../../utils/units.js"; import { colors } from "../../utils/colors.js"; @@ -210,7 +221,6 @@ export function createCohortFolderAgeRangeWithMatured(cohort) { name: "Matured", tree: satsBtcUsdFullTree({ pattern: cohort.matured, - name: cohort.name, title: title("Matured Supply"), }), }); @@ -452,13 +462,22 @@ export function createGroupedCohortFolderAgeRangeWithMatured({ list, all, }) { - const folder = createGroupedCohortFolderAgeRange({ name, title: groupTitle, list, all }); + const folder = createGroupedCohortFolderAgeRange({ + name, + title: groupTitle, + list, + all, + }); const title = formatCohortTitle(groupTitle); folder.tree.push({ name: "Matured", title: title("Matured Supply"), bottom: list.flatMap((cohort) => - satsBtcUsd({ pattern: cohort.matured.base, name: cohort.name, color: cohort.color }), + satsBtcUsd({ + pattern: cohort.matured.base, + name: cohort.name, + color: cohort.color, + }), ), }); return folder; @@ -607,14 +626,32 @@ function singleBucketFolder({ name, color, pattern }) { title: `${name}: Supply`, bottom: [ ...satsBtcUsd({ pattern: pattern.supply.all, name: "Total" }), - ...satsBtcUsd({ pattern: pattern.supply.sth, name: "STH", color: colors.term.short }), + ...satsBtcUsd({ + pattern: pattern.supply.sth, + name: "STH", + color: colors.term.short, + }), ], }, { name: "Change", tree: [ - { ...sumsTree({ windows: pattern.supply.all.delta.absolute, title: `${name}: Supply Change`, unit: Unit.sats, series: baseline }), name: "Absolute" }, - { ...rollingPercentRatioTree({ windows: pattern.supply.all.delta.rate, title: `${name}: Supply Rate` }), name: "Rate" }, + { + ...sumsTree({ + windows: pattern.supply.all.delta.absolute, + title: `${name}: Supply Change`, + unit: Unit.sats, + series: baseline, + }), + name: "Absolute", + }, + { + ...rollingPercentRatioTree({ + windows: pattern.supply.all.delta.rate, + title: `${name}: Supply Rate`, + }), + name: "Rate", + }, ], }, ], @@ -623,14 +660,25 @@ function singleBucketFolder({ name, color, pattern }) { name: "Realized Cap", title: `${name}: Realized Cap`, bottom: [ - line({ series: pattern.realizedCap.all, name: "Total", unit: Unit.usd }), - line({ series: pattern.realizedCap.sth, name: "STH", color: colors.term.short, unit: Unit.usd }), + line({ + series: pattern.realizedCap.all, + name: "Total", + unit: Unit.usd, + }), + line({ + series: pattern.realizedCap.sth, + name: "STH", + color: colors.term.short, + unit: Unit.usd, + }), ], }, { name: "NUPL", title: `${name}: NUPL`, - bottom: [line({ series: pattern.nupl.ratio, name, color, unit: Unit.ratio })], + bottom: [ + line({ series: pattern.nupl.ratio, name, color, unit: Unit.ratio }), + ], }, ], }; @@ -671,7 +719,12 @@ function groupedBucketCharts(list, titlePrefix) { title: `${titlePrefix}: Supply Change`, bottom: ROLLING_WINDOWS.flatMap((w) => list.map(({ name, color, pattern }) => - baseline({ series: pattern.supply.all.delta.absolute[w.key], name: `${name} ${w.name}`, color, unit: Unit.sats }), + baseline({ + series: pattern.supply.all.delta.absolute[w.key], + name: `${name} ${w.name}`, + color, + unit: Unit.sats, + }), ), ), }, @@ -679,7 +732,12 @@ function groupedBucketCharts(list, titlePrefix) { name: w.name, title: `${titlePrefix}: Supply Change (${w.title})`, bottom: list.map(({ name, color, pattern }) => - baseline({ series: pattern.supply.all.delta.absolute[w.key], name, color, unit: Unit.sats }), + baseline({ + series: pattern.supply.all.delta.absolute[w.key], + name, + color, + unit: Unit.sats, + }), ), })), ], @@ -692,7 +750,11 @@ function groupedBucketCharts(list, titlePrefix) { title: `${titlePrefix}: Supply Rate`, bottom: ROLLING_WINDOWS.flatMap((w) => list.flatMap(({ name, color, pattern }) => - percentRatio({ pattern: pattern.supply.all.delta.rate[w.key], name: `${name} ${w.name}`, color }), + percentRatio({ + pattern: pattern.supply.all.delta.rate[w.key], + name: `${name} ${w.name}`, + color, + }), ), ), }, @@ -700,7 +762,11 @@ function groupedBucketCharts(list, titlePrefix) { name: w.name, title: `${titlePrefix}: Supply Rate (${w.title})`, bottom: list.flatMap(({ name, color, pattern }) => - percentRatio({ pattern: pattern.supply.all.delta.rate[w.key], name, color }), + percentRatio({ + pattern: pattern.supply.all.delta.rate[w.key], + name, + color, + }), ), })), ], @@ -716,14 +782,24 @@ function groupedBucketCharts(list, titlePrefix) { name: "All", title: `${titlePrefix}: Realized Cap`, bottom: list.map(({ name, color, pattern }) => - line({ series: pattern.realizedCap.all, name, color, unit: Unit.usd }), + line({ + series: pattern.realizedCap.all, + name, + color, + unit: Unit.usd, + }), ), }, { name: "STH", title: `${titlePrefix}: STH Realized Cap`, bottom: list.map(({ name, color, pattern }) => - line({ series: pattern.realizedCap.sth, name, color, unit: Unit.usd }), + line({ + series: pattern.realizedCap.sth, + name, + color, + unit: Unit.usd, + }), ), }, ], @@ -749,7 +825,10 @@ export function createUtxoProfitabilitySection({ range, profit, loss }) { { name: "Range", tree: [ - { name: "Compare", tree: groupedBucketCharts(range, "Profitability Range") }, + { + name: "Compare", + tree: groupedBucketCharts(range, "Profitability Range"), + }, ...range.map(singleBucketFolder), ], }, diff --git a/website/scripts/options/distribution/profitability.js b/website/scripts/options/distribution/profitability.js index a16104475..e67a721cd 100644 --- a/website/scripts/options/distribution/profitability.js +++ b/website/scripts/options/distribution/profitability.js @@ -11,7 +11,7 @@ */ import { Unit } from "../../utils/units.js"; -import { ROLLING_WINDOWS, line, dotted, baseline, dots, dotsBaseline, percentRatio, percentRatioBaseline } from "../series.js"; +import { ROLLING_WINDOWS, line, dotted, baseline, percentRatio, percentRatioBaseline } from "../series.js"; import { colors } from "../../utils/colors.js"; import { priceLine } from "../constants.js"; import { @@ -236,7 +236,7 @@ function nuplSeries(nupl) { // ============================================================================ /** - * Flat metric folder: Compare + windows + Cumulative + Per Block + optional % of Realized Cap + * Flat metric folder: Compare + windows + Cumulative + optional % of Realized Cap * @param {Object} args * @param {{ sum: Record, cumulative: { usd: AnySeriesPattern }, base: { usd: AnySeriesPattern } }} args.pattern * @param {string} args.metricTitle @@ -264,11 +264,6 @@ function realizedMetricFolder({ pattern, metricTitle, color, title, toRcap }) { title: title(`Realized ${metricTitle} (Total)`), bottom: [line({ series: pattern.cumulative.usd, name: metricTitle, color, unit: Unit.usd })], }, - { - name: "Per Block", - title: title(`Realized ${metricTitle} per Block`), - bottom: [dots({ series: pattern.base.usd, name: metricTitle, color, unit: Unit.usd })], - }, ...(toRcap ? [{ name: "% of Realized Cap", title: title(`Realized ${metricTitle} (% of Realized Cap)`), @@ -278,7 +273,7 @@ function realizedMetricFolder({ pattern, metricTitle, color, title, toRcap }) { } /** - * Net P&L folder: Compare + windows + Cumulative + Per Block + optional % of Rcap + Change/ + * Net P&L folder: Compare + windows + Cumulative + optional % of Rcap + Change/ * @param {Object} args * @param {NetPnlFullPattern | NetPnlBasicPattern} args.netPnl * @param {(name: string) => string} args.title @@ -307,11 +302,6 @@ function realizedNetFolder({ netPnl, title, toRcap, extraChange = [] }) { title: title("Net Realized P&L (Total)"), bottom: [baseline({ series: netPnl.cumulative.usd, name: "Net", unit: Unit.usd })], }, - { - name: "Per Block", - title: title("Net Realized P&L per Block"), - bottom: [dotsBaseline({ series: netPnl.base.usd, name: "Net", unit: Unit.usd })], - }, ...(toRcap ? [{ name: "% of Realized Cap", title: title("Net Realized P&L (% of Realized Cap)"), @@ -464,11 +454,6 @@ function realizedSubfolderFull(r, title) { title: title("Peak Regret (Total)"), bottom: [line({ series: r.peakRegret.cumulative.usd, name: "Peak Regret", unit: Unit.usd })], }, - { - name: "Per Block", - title: title("Peak Regret per Block"), - bottom: [dots({ series: r.peakRegret.base.usd, name: "Peak Regret", unit: Unit.usd })], - }, { name: "% of Realized Cap", title: title("Peak Regret (% of Realized Cap)"), diff --git a/website/scripts/options/mining.js b/website/scripts/options/mining.js index 67c1774d0..67c654ed4 100644 --- a/website/scripts/options/mining.js +++ b/website/scripts/options/mining.js @@ -18,6 +18,7 @@ import { satsBtcUsdFrom, satsBtcUsdFullTree, revenueBtcSatsUsd, + revenueRollingBtcSatsUsd, } from "./shared.js"; import { brk } from "../client.js"; @@ -122,7 +123,6 @@ export function createMiningSection() { name: "Rewards", tree: satsBtcUsdFullTree({ pattern: pool.rewards, - name: "Rewards", title: `Rewards: ${name}`, }), }, @@ -283,77 +283,44 @@ export function createMiningSection() { { name: "Revenue", tree: [ + ...ROLLING_WINDOWS.map((w) => ({ + name: w.name, + title: `Revenue ${w.title} Averages`, + bottom: revenueRollingBtcSatsUsd({ + coinbase: mining.rewards.coinbase.average[w.key], + subsidy: mining.rewards.subsidy.average[w.key], + fee: mining.rewards.fees.average[w.key], + }), + })), { - name: "Compare", - tree: [ - { - name: "Per Block", - title: "Revenue Comparison", - bottom: revenueBtcSatsUsd({ - coinbase: mining.rewards.coinbase, - subsidy: mining.rewards.subsidy, - fee: mining.rewards.fees, - key: "base", - }), - }, - { - name: "Cumulative", - title: "Revenue Comparison (Total)", - bottom: revenueBtcSatsUsd({ - coinbase: mining.rewards.coinbase, - subsidy: mining.rewards.subsidy, - fee: mining.rewards.fees, - key: "cumulative", - }), - }, - ], + name: "Cumulative", + title: "Revenue Comparison (Total)", + bottom: revenueBtcSatsUsd({ + coinbase: mining.rewards.coinbase, + subsidy: mining.rewards.subsidy, + fee: mining.rewards.fees, + key: "cumulative", + }), }, { name: "Coinbase", tree: satsBtcUsdFullTree({ pattern: mining.rewards.coinbase, - name: "Coinbase", title: "Coinbase Rewards", }), }, { name: "Subsidy", - tree: [ - { - name: "Per Block", - title: "Block Subsidy", - bottom: [ - ...satsBtcUsdFrom({ - source: mining.rewards.subsidy, - key: "base", - name: "base", - }), - line({ - series: mining.rewards.subsidy.sma1y.usd, - name: "1y SMA", - color: colors.time._1y, - unit: Unit.usd, - defaultActive: false, - }), - ], - }, - { - name: "Cumulative", - title: "Block Subsidy (Total)", - bottom: satsBtcUsdFrom({ - source: mining.rewards.subsidy, - key: "cumulative", - name: "all-time", - }), - }, - ], + tree: satsBtcUsdFullTree({ + pattern: mining.rewards.subsidy, + title: "Block Subsidy", + }), }, { name: "Fees", tree: [ ...satsBtcUsdFullTree({ pattern: mining.rewards.fees, - name: "Fees", title: "Transaction Fee Revenue", }), { diff --git a/website/scripts/options/network.js b/website/scripts/options/network.js index 0ff84e227..a222b00fa 100644 --- a/website/scripts/options/network.js +++ b/website/scripts/options/network.js @@ -4,16 +4,14 @@ import { colors } from "../utils/colors.js"; import { brk } from "../client.js"; import { Unit } from "../utils/units.js"; import { entries } from "../utils/array.js"; -import { priceLine } from "./constants.js"; import { line, - dots, fromSupplyPattern, chartsFromFullPerBlock, chartsFromCount, chartsFromCountEntries, chartsFromAggregatedPerBlock, - averagesTree, + averagesArray, simpleDeltaTree, ROLLING_WINDOWS, chartsFromBlockAnd6b, @@ -169,14 +167,14 @@ export function createNetworkSection() { ), })), }, - ...activityTypes.map((t) => - averagesTree({ + ...activityTypes.map((t) => ({ + name: t.name, + tree: averagesArray({ windows: addrs.activity[key][t.key], title: `${titlePrefix}${t.name} Addresses`, unit: Unit.count, - name: t.name, }), - ), + })), ], }, ]; @@ -308,7 +306,6 @@ export function createNetworkSection() { name: "Volume", tree: satsBtcUsdFullTree({ pattern: transactions.volume.transferVolume, - name: "base", title: "Transaction Volume", }), }, @@ -429,31 +426,11 @@ export function createNetworkSection() { }, { name: "Interval", - tree: [ - { - name: "Per Block", - title: "Block Interval", - bottom: [ - dots({ - series: blocks.interval.base, - name: "base", - unit: Unit.secs, - }), - line({ - series: blocks.interval._24h, - name: "24h avg", - color: colors.stat.avg, - unit: Unit.secs, - }), - priceLine({ unit: Unit.secs, name: "Target", number: 600 }), - ], - }, - averagesTree({ - windows: blocks.interval, - title: "Block Interval", - unit: Unit.secs, - }), - ], + tree: averagesArray({ + windows: blocks.interval, + title: "Block Interval", + unit: Unit.secs, + }), }, { name: "Size", @@ -509,17 +486,15 @@ export function createNetworkSection() { { name: "Created", color: colors.entity.output, - base: outputs.count.total.sum, average: outputs.count.total.rolling.average, - rolling: outputs.count.total.rolling.sum, + sum: outputs.count.total.rolling.sum, cumulative: outputs.count.total.cumulative, }, { name: "Spent", color: colors.entity.input, - base: inputs.count.sum, average: inputs.count.rolling.average, - rolling: inputs.count.rolling.sum, + sum: inputs.count.rolling.sum, cumulative: inputs.count.cumulative, }, ], diff --git a/website/scripts/options/series.js b/website/scripts/options/series.js index 67c7bba1f..16cbb82ec 100644 --- a/website/scripts/options/series.js +++ b/website/scripts/options/series.js @@ -517,6 +517,61 @@ export function sumsArray({ windows, title, unit }) { })); } +/** + * Flat array of per-window charts with both sum (active) and average (off by default) + * @param {Object} args + * @param {{ _24h: AnySeriesPattern, _1w: AnySeriesPattern, _1m: AnySeriesPattern, _1y: AnySeriesPattern }} args.sum + * @param {{ _24h: AnySeriesPattern, _1w: AnySeriesPattern, _1m: AnySeriesPattern, _1y: AnySeriesPattern }} args.average + * @param {string} args.title + * @param {Unit} args.unit + * @returns {PartialChartOption[]} + */ +export function sumsAndAveragesArray({ sum, average, title, unit }) { + return ROLLING_WINDOWS.map((w) => ({ + name: w.name, + title: `${title} ${w.title}`, + bottom: [ + line({ series: sum[w.key], name: "Sum", color: w.color, unit }), + line({ + series: average[w.key], + name: "Avg", + color: w.color, + unit, + defaultActive: false, + }), + ], + })); +} + +/** + * Windowed sum+avg charts + cumulative + * @param {Object} args + * @param {{ _24h: AnySeriesPattern, _1w: AnySeriesPattern, _1m: AnySeriesPattern, _1y: AnySeriesPattern }} args.sum + * @param {{ _24h: AnySeriesPattern, _1w: AnySeriesPattern, _1m: AnySeriesPattern, _1y: AnySeriesPattern }} args.average + * @param {AnySeriesPattern} args.cumulative + * @param {string} args.title + * @param {Unit} args.unit + * @param {Color} [args.color] + * @returns {PartialChartOption[]} + */ +export function sumsAndAveragesCumulative({ sum, average, cumulative, title, unit, color }) { + return [ + { + name: "Compare", + title: `${title} Averages`, + bottom: ROLLING_WINDOWS.map((w) => + line({ series: average[w.key], name: w.name, color: w.color, unit }), + ), + }, + ...sumsAndAveragesArray({ sum, average, title, unit }), + { + name: "Cumulative", + title: `${title} (Total)`, + bottom: [{ series: cumulative, title: "all-time", color, unit }], + }, + ]; +} + /** * Rolling sums tree (Compare + individual windows in a folder) * @param {Object} args @@ -538,22 +593,21 @@ export function sumsTree({ windows, title, unit, series }) { } /** - * Rolling averages tree + * Flat array of per-window average charts * @param {Object} args * @param {{ _24h: AnySeriesPattern, _1w: AnySeriesPattern, _1m: AnySeriesPattern, _1y: AnySeriesPattern }} args.windows * @param {string} args.title * @param {Unit} args.unit - * @param {string} [args.name] - * @returns {PartialOptionsGroup} + * @returns {PartialChartOption[]} */ -export function averagesTree({ windows, title, unit, name = "Averages" }) { - return rollingWindowsTree({ - windows, - title, - windowTitle: (w) => `${title} ${w.title} Average`, - unit, - name, - }); +export function averagesArray({ windows, title, unit }) { + return ROLLING_WINDOWS.map((w) => ({ + name: w.name, + title: `${title} ${w.title} Average`, + bottom: [ + line({ series: windows[w.key], name: w.name, color: w.color, unit }), + ], + })); } /** @@ -854,7 +908,7 @@ export function simpleDeltaTree({ delta, title, unit }) { // These split patterns into separate Sum/Distribution/Cumulative charts /** - * Split flat per-block pattern into charts (Sum/Rolling/Distribution/Cumulative) + * Split flat per-block pattern into charts (Averages/Sums/Distribution/Cumulative) * Pattern has: .height, .cumulative, .sum (windowed), .average/.pct10/... (windowed, flat) * @param {Object} args * @param {FullPerBlockPattern} args.pattern @@ -873,14 +927,14 @@ export function chartsFromFull({ ? `${title} ${distributionSuffix}` : title; return [ - averagesTree({ windows: pattern.average, title, unit }), - sumsTree({ windows: pattern.sum, title, unit }), + ...sumsAndAveragesCumulative({ + sum: pattern.sum, + average: pattern.average, + cumulative: pattern.cumulative, + title, + unit, + }), distributionWindowsTree({ pattern, title: distTitle, unit }), - { - name: "Cumulative", - title: `${title} (Total)`, - bottom: [{ series: pattern.cumulative, title: "all-time", unit }], - }, ]; } @@ -914,18 +968,18 @@ export function chartsFromAggregated({ ? `${title} ${distributionSuffix}` : title; return [ - averagesTree({ windows: pattern.rolling.average, title, unit }), - sumsTree({ windows: pattern.rolling.sum, title, unit }), + ...sumsAndAveragesCumulative({ + sum: pattern.rolling.sum, + average: pattern.rolling.average, + cumulative: pattern.cumulative, + title, + unit, + }), distributionWindowsTree({ pattern: pattern.rolling, title: distTitle, unit, }), - { - name: "Cumulative", - title: `${title} (Total)`, - bottom: [{ series: pattern.cumulative, title: "all-time", unit }], - }, ]; } @@ -964,27 +1018,7 @@ export function chartsFromBlockAnd6b({ pattern, title, unit }) { } /** - * Sums + Cumulative charts (no Per Block) - * @param {Object} args - * @param {{ sum: { _24h: AnySeriesPattern, _1w: AnySeriesPattern, _1m: AnySeriesPattern, _1y: AnySeriesPattern }, cumulative: AnySeriesPattern }} args.pattern - * @param {string} args.title - * @param {Unit} args.unit - * @param {Color} [args.color] - * @returns {PartialOptionsTree} - */ -export function chartsFromSumsCumulative({ pattern, title, unit, color }) { - return [ - ...sumsArray({ windows: pattern.sum, title, unit }), - { - name: "Cumulative", - title: `${title} (Total)`, - bottom: [{ series: pattern.cumulative, title: "all-time", color, unit }], - }, - ]; -} - -/** - * Per Block + Sums + Cumulative charts + * Averages + Sums + Cumulative charts * @param {Object} args * @param {CountPattern} args.pattern * @param {string} args.title @@ -993,14 +1027,26 @@ export function chartsFromSumsCumulative({ pattern, title, unit, color }) { * @returns {PartialOptionsTree} */ export function chartsFromCount({ pattern, title, unit, color }) { - return [ - averagesTree({ windows: pattern.average, title, unit }), - ...chartsFromSumsCumulative({ pattern, title, unit, color }), - ]; + return sumsAndAveragesCumulative({ + sum: pattern.sum, + average: pattern.average, + cumulative: pattern.cumulative, + title, + unit, + color, + }); } /** - * Split multiple named entries (each with base/sum/cumulative) into Per Block/Sums/Cumulative charts + * Windowed sums + cumulative for multiple named entries (e.g. transaction versions) + * @param {Object} args + * @param {Array<[string, CountPattern]>} args.entries + * @param {string} args.title + * @param {Unit} args.unit + * @returns {PartialOptionsTree} + */ +/** + * Windowed sums + cumulative for multiple named entries (e.g. transaction versions) * @param {Object} args * @param {Array<[string, CountPattern]>} args.entries * @param {string} args.title @@ -1008,49 +1054,45 @@ export function chartsFromCount({ pattern, title, unit, color }) { * @returns {PartialOptionsTree} */ export function chartsFromCountEntries({ entries, title, unit }) { - return multiSeriesTree({ - entries: entries.map(([name, data], i, arr) => ({ - name, - color: colors.at(i, arr.length), - base: data.base, - average: data.average, - rolling: data.sum, - cumulative: data.cumulative, + const items = entries.map(([name, data], i, arr) => ({ + name, + color: colors.at(i, arr.length), + sum: data.sum, + cumulative: data.cumulative, + })); + return [ + ...ROLLING_WINDOWS.map((w) => ({ + name: w.name, + title: `${title} ${w.title} Sum`, + bottom: items.map((e) => + line({ series: e.sum[w.key], name: e.name, color: e.color, unit }), + ), })), - title, - unit, - }); + { + name: "Cumulative", + title: `${title} (Total)`, + bottom: items.map((e) => + line({ series: e.cumulative, name: e.name, color: e.color, unit }), + ), + }, + ]; } /** - * Per Block + Sums + Cumulative tree for multiple named series shown side-by-side + * Windowed averages + sums + cumulative for multiple named series (e.g. UTXO flow) * @param {Object} args - * @param {Array<{ name: string, color: Color, base: AnySeriesPattern, average: { _24h: AnySeriesPattern, _1w: AnySeriesPattern, _1m: AnySeriesPattern, _1y: AnySeriesPattern }, rolling: { _24h: AnySeriesPattern, _1w: AnySeriesPattern, _1m: AnySeriesPattern, _1y: AnySeriesPattern }, cumulative: AnySeriesPattern }>} args.entries + * @param {Array<{ name: string, color: Color, average: { _24h: AnySeriesPattern, _1w: AnySeriesPattern, _1m: AnySeriesPattern, _1y: AnySeriesPattern }, sum: { _24h: AnySeriesPattern, _1w: AnySeriesPattern, _1m: AnySeriesPattern, _1y: AnySeriesPattern }, cumulative: AnySeriesPattern }>} args.entries * @param {string} args.title * @param {Unit} args.unit * @returns {PartialOptionsTree} */ export function multiSeriesTree({ entries, title, unit }) { return [ - { - name: "Compare", - title: `${title} Average`, - bottom: ROLLING_WINDOWS.flatMap((w) => - entries.map((e) => - line({ - series: e.average[w.key], - name: `${e.name} ${w.name}`, - color: e.color, - unit, - }), - ), - ), - }, ...ROLLING_WINDOWS.map((w) => ({ name: w.name, - title: `${title} ${w.title} Sum`, + title: `${title} ${w.title} Averages`, bottom: entries.map((e) => - line({ series: e.rolling[w.key], name: e.name, color: e.color, unit }), + line({ series: e.average[w.key], name: e.name, color: e.color, unit }), ), })), { diff --git a/website/scripts/options/shared.js b/website/scripts/options/shared.js index 7872f2ef1..b87d2bd31 100644 --- a/website/scripts/options/shared.js +++ b/website/scripts/options/shared.js @@ -219,7 +219,6 @@ export function satsBtcUsdRolling({ pattern, name, color, defaultActive }) { * Build a full Sum / Rolling / Cumulative tree from a FullValuePattern * @param {Object} args * @param {FullValuePattern} args.pattern - * @param {string} args.name * @param {string} args.title * @param {Color} [args.color] * @returns {PartialOptionsTree}