From 21a0226a19b636bd6bf3152c417d302a16054782 Mon Sep 17 00:00:00 2001 From: nym21 Date: Thu, 9 Apr 2026 11:52:01 +0200 Subject: [PATCH] global: speed improvement --- Cargo.lock | 1 + crates/brk_client/src/lib.rs | 5890 +++-------------- crates/brk_computer/src/indexes/mod.rs | 7 + crates/brk_computer/src/indexes/tx_heights.rs | 61 + crates/brk_computer/src/pools/mod.rs | 16 +- crates/brk_computer/src/pools/pool_heights.rs | 39 + crates/brk_error/src/lib.rs | 15 + crates/brk_query/Cargo.toml | 1 + crates/brk_query/src/impl/addr.rs | 16 +- crates/brk_query/src/impl/block/info.rs | 4 +- crates/brk_query/src/impl/block/raw.rs | 6 +- crates/brk_query/src/impl/block/timestamp.rs | 8 +- crates/brk_query/src/impl/block/txs.rs | 231 +- .../brk_query/src/impl/mining/difficulty.rs | 16 +- crates/brk_query/src/impl/mining/hashrate.rs | 8 +- crates/brk_query/src/impl/mining/pools.rs | 29 +- crates/brk_query/src/impl/tx.rs | 60 +- crates/brk_server/src/extended/encoding.rs | 11 +- crates/brk_types/src/pool_slug.rs | 1 + crates/brk_types/src/range_map.rs | 11 + 20 files changed, 1489 insertions(+), 4942 deletions(-) create mode 100644 crates/brk_computer/src/indexes/tx_heights.rs create mode 100644 crates/brk_computer/src/pools/pool_heights.rs diff --git a/Cargo.lock b/Cargo.lock index 3479148cd..7592f3418 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -630,6 +630,7 @@ dependencies = [ "jiff", "parking_lot", "quickmatch", + "rustc-hash", "serde_json", "tokio", "vecdb", diff --git a/crates/brk_client/src/lib.rs b/crates/brk_client/src/lib.rs index e2a616fec..676896395 100644 --- a/crates/brk_client/src/lib.rs +++ b/crates/brk_client/src/lib.rs @@ -7,11 +7,12 @@ #![allow(clippy::useless_format)] #![allow(clippy::unnecessary_to_owned)] +use std::sync::Arc; +use std::ops::{Bound, RangeBounds}; +use serde::de::DeserializeOwned; pub use brk_cohort::*; pub use brk_types::*; -use serde::de::DeserializeOwned; -use std::ops::{Bound, RangeBounds}; -use std::sync::Arc; + /// Error type for BRK client operations. #[derive(Debug)] @@ -56,10 +57,7 @@ pub struct BrkClientBase { impl BrkClientBase { /// Create a new client with the given base URL. pub fn new(base_url: impl Into) -> Self { - Self::with_options(BrkClientOptions { - base_url: base_url.into(), - ..Default::default() - }) + Self::with_options(BrkClientOptions { base_url: base_url.into(), ..Default::default() }) } /// Create a new client with options. @@ -80,49 +78,36 @@ impl BrkClientBase { /// Make a GET request and deserialize JSON response. pub fn get_json(&self, path: &str) -> Result { - self.agent - .get(&self.url(path)) + self.agent.get(&self.url(path)) .call() .and_then(|mut r| r.body_mut().read_json()) - .map_err(|e| BrkError { - message: e.to_string(), - }) + .map_err(|e| BrkError { message: e.to_string() }) } /// Make a GET request and return raw text response. pub fn get_text(&self, path: &str) -> Result { - self.agent - .get(&self.url(path)) + self.agent.get(&self.url(path)) .call() .and_then(|mut r| r.body_mut().read_to_string()) - .map_err(|e| BrkError { - message: e.to_string(), - }) + .map_err(|e| BrkError { message: e.to_string() }) } } /// Build series name with suffix. #[inline] fn _m(acc: &str, s: &str) -> String { - if s.is_empty() { - acc.to_string() - } else if acc.is_empty() { - s.to_string() - } else { - format!("{acc}_{s}") - } + if s.is_empty() { acc.to_string() } + else if acc.is_empty() { s.to_string() } + else { format!("{acc}_{s}") } } /// Build series name with prefix. #[inline] fn _p(prefix: &str, acc: &str) -> String { - if acc.is_empty() { - prefix.to_string() - } else { - format!("{prefix}_{acc}") - } + if acc.is_empty() { prefix.to_string() } else { format!("{prefix}_{acc}") } } + /// Non-generic trait for series patterns (usable in collections). pub trait AnySeriesPattern { /// Get the series name. @@ -138,6 +123,7 @@ pub trait SeriesPattern: AnySeriesPattern { fn get(&self, index: Index) -> Option>; } + /// Shared endpoint configuration. #[derive(Clone)] struct EndpointConfig { @@ -150,13 +136,7 @@ struct EndpointConfig { impl EndpointConfig { fn new(client: Arc, name: Arc, index: Index) -> Self { - Self { - client, - name, - index, - start: None, - end: None, - } + Self { client, name, index, start: None, end: None } } fn path(&self) -> String { @@ -165,21 +145,11 @@ impl EndpointConfig { fn build_path(&self, format: Option<&str>) -> String { let mut params = Vec::new(); - if let Some(s) = self.start { - params.push(format!("start={}", s)); - } - if let Some(e) = self.end { - params.push(format!("end={}", e)); - } - if let Some(fmt) = format { - params.push(format!("format={}", fmt)); - } + if let Some(s) = self.start { params.push(format!("start={}", s)); } + if let Some(e) = self.end { params.push(format!("end={}", e)); } + if let Some(fmt) = format { params.push(format!("format={}", fmt)); } let p = self.path(); - if params.is_empty() { - p - } else { - format!("{}?{}", p, params.join("&")) - } + if params.is_empty() { p } else { format!("{}?{}", p, params.join("&")) } } fn get_json(&self, format: Option<&str>) -> Result { @@ -219,20 +189,14 @@ pub type DateSeriesEndpoint = SeriesEndpoint>; impl SeriesEndpoint { pub fn new(client: Arc, name: Arc, index: Index) -> Self { - Self { - config: EndpointConfig::new(client, name, index), - _marker: std::marker::PhantomData, - } + Self { config: EndpointConfig::new(client, name, index), _marker: std::marker::PhantomData } } /// Select a specific index position. pub fn get(mut self, index: usize) -> SingleItemBuilder { self.config.start = Some(index as i64); self.config.end = Some(index as i64 + 1); - SingleItemBuilder { - config: self.config, - _marker: std::marker::PhantomData, - } + SingleItemBuilder { config: self.config, _marker: std::marker::PhantomData } } /// Select a range using Rust range syntax. @@ -254,10 +218,7 @@ impl SeriesEndpoint { Bound::Excluded(&n) => Some(n as i64), Bound::Unbounded => None, }; - RangeBuilder { - config: self.config, - _marker: std::marker::PhantomData, - } + RangeBuilder { config: self.config, _marker: std::marker::PhantomData } } /// Take the first n items. @@ -272,19 +233,13 @@ impl SeriesEndpoint { } else { self.config.start = Some(-(n as i64)); } - RangeBuilder { - config: self.config, - _marker: std::marker::PhantomData, - } + RangeBuilder { config: self.config, _marker: std::marker::PhantomData } } /// Skip the first n items. Chain with `take(n)` to get a range. pub fn skip(mut self, n: usize) -> SkippedBuilder { self.config.start = Some(n as i64); - SkippedBuilder { - config: self.config, - _marker: std::marker::PhantomData, - } + SkippedBuilder { config: self.config, _marker: std::marker::PhantomData } } /// Fetch all data as parsed JSON. @@ -325,11 +280,7 @@ impl SeriesEndpoint> { } /// Select a timestamp range (works for all date-based indexes including sub-daily). - pub fn timestamp_range( - self, - start: Timestamp, - end: Timestamp, - ) -> RangeBuilder> { + pub fn timestamp_range(self, start: Timestamp, end: Timestamp) -> RangeBuilder> { let s = self.config.index.timestamp_to_index(start).unwrap_or(0); let e = self.config.index.timestamp_to_index(end).unwrap_or(0); self.range(s..e) @@ -371,10 +322,7 @@ impl SkippedBuilder { pub fn take(mut self, n: usize) -> RangeBuilder { let start = self.config.start.unwrap_or(0); self.config.end = Some(start + n as i64); - RangeBuilder { - config: self.config, - _marker: std::marker::PhantomData, - } + RangeBuilder { config: self.config, _marker: std::marker::PhantomData } } /// Fetch from the skipped position to the end. @@ -409,42 +357,10 @@ impl RangeBuilder { } } + // Static index arrays -const _I1: &[Index] = &[ - Index::Minute10, - Index::Minute30, - Index::Hour1, - Index::Hour4, - Index::Hour12, - Index::Day1, - Index::Day3, - Index::Week1, - Index::Month1, - Index::Month3, - Index::Month6, - Index::Year1, - Index::Year10, - Index::Halving, - Index::Epoch, - Index::Height, -]; -const _I2: &[Index] = &[ - Index::Minute10, - Index::Minute30, - Index::Hour1, - Index::Hour4, - Index::Hour12, - Index::Day1, - Index::Day3, - Index::Week1, - Index::Month1, - Index::Month3, - Index::Month6, - Index::Year1, - Index::Year10, - Index::Halving, - Index::Epoch, -]; +const _I1: &[Index] = &[Index::Minute10, Index::Minute30, Index::Hour1, Index::Hour4, Index::Hour12, Index::Day1, Index::Day3, Index::Week1, Index::Month1, Index::Month3, Index::Month6, Index::Year1, Index::Year10, Index::Halving, Index::Epoch, Index::Height]; +const _I2: &[Index] = &[Index::Minute10, Index::Minute30, Index::Hour1, Index::Hour4, Index::Hour12, Index::Day1, Index::Day3, Index::Week1, Index::Month1, Index::Month3, Index::Month6, Index::Year1, Index::Year10, Index::Halving, Index::Epoch]; const _I3: &[Index] = &[Index::Minute10]; const _I4: &[Index] = &[Index::Minute30]; const _I5: &[Index] = &[Index::Hour1]; @@ -485,1753 +401,535 @@ fn _ep(c: &Arc, n: &Arc, i: Index) -> S } #[inline] -fn _dep( - c: &Arc, - n: &Arc, - i: Index, -) -> DateSeriesEndpoint { +fn _dep(c: &Arc, n: &Arc, i: Index) -> DateSeriesEndpoint { DateSeriesEndpoint::new(c.clone(), n.clone(), i) } // Index accessor structs -pub struct SeriesPattern1By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern1By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern1By { - pub fn minute10(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Minute10) - } - pub fn minute30(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Minute30) - } - pub fn hour1(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Hour1) - } - pub fn hour4(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Hour4) - } - pub fn hour12(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Hour12) - } - pub fn day1(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Day1) - } - pub fn day3(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Day3) - } - pub fn week1(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Week1) - } - pub fn month1(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Month1) - } - pub fn month3(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Month3) - } - pub fn month6(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Month6) - } - pub fn year1(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Year1) - } - pub fn year10(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Year10) - } - pub fn halving(&self) -> SeriesEndpoint { - _ep(&self.client, &self.name, Index::Halving) - } - pub fn epoch(&self) -> SeriesEndpoint { - _ep(&self.client, &self.name, Index::Epoch) - } - pub fn height(&self) -> SeriesEndpoint { - _ep(&self.client, &self.name, Index::Height) - } + pub fn minute10(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Minute10) } + pub fn minute30(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Minute30) } + pub fn hour1(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Hour1) } + pub fn hour4(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Hour4) } + pub fn hour12(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Hour12) } + pub fn day1(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Day1) } + pub fn day3(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Day3) } + pub fn week1(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Week1) } + pub fn month1(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Month1) } + pub fn month3(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Month3) } + pub fn month6(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Month6) } + pub fn year1(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Year1) } + pub fn year10(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Year10) } + pub fn halving(&self) -> SeriesEndpoint { _ep(&self.client, &self.name, Index::Halving) } + pub fn epoch(&self) -> SeriesEndpoint { _ep(&self.client, &self.name, Index::Epoch) } + pub fn height(&self) -> SeriesEndpoint { _ep(&self.client, &self.name, Index::Height) } } -pub struct SeriesPattern1 { - name: Arc, - pub by: SeriesPattern1By, -} +pub struct SeriesPattern1 { name: Arc, pub by: SeriesPattern1By } impl SeriesPattern1 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern1By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern1By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern1 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I1 - } -} -impl SeriesPattern for SeriesPattern1 { - fn get(&self, index: Index) -> Option> { - _I1.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern1 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I1 } } +impl SeriesPattern for SeriesPattern1 { fn get(&self, index: Index) -> Option> { _I1.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern2By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern2By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern2By { - pub fn minute10(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Minute10) - } - pub fn minute30(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Minute30) - } - pub fn hour1(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Hour1) - } - pub fn hour4(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Hour4) - } - pub fn hour12(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Hour12) - } - pub fn day1(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Day1) - } - pub fn day3(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Day3) - } - pub fn week1(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Week1) - } - pub fn month1(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Month1) - } - pub fn month3(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Month3) - } - pub fn month6(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Month6) - } - pub fn year1(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Year1) - } - pub fn year10(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Year10) - } - pub fn halving(&self) -> SeriesEndpoint { - _ep(&self.client, &self.name, Index::Halving) - } - pub fn epoch(&self) -> SeriesEndpoint { - _ep(&self.client, &self.name, Index::Epoch) - } + pub fn minute10(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Minute10) } + pub fn minute30(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Minute30) } + pub fn hour1(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Hour1) } + pub fn hour4(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Hour4) } + pub fn hour12(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Hour12) } + pub fn day1(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Day1) } + pub fn day3(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Day3) } + pub fn week1(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Week1) } + pub fn month1(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Month1) } + pub fn month3(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Month3) } + pub fn month6(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Month6) } + pub fn year1(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Year1) } + pub fn year10(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Year10) } + pub fn halving(&self) -> SeriesEndpoint { _ep(&self.client, &self.name, Index::Halving) } + pub fn epoch(&self) -> SeriesEndpoint { _ep(&self.client, &self.name, Index::Epoch) } } -pub struct SeriesPattern2 { - name: Arc, - pub by: SeriesPattern2By, -} +pub struct SeriesPattern2 { name: Arc, pub by: SeriesPattern2By } impl SeriesPattern2 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern2By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern2By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern2 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I2 - } -} -impl SeriesPattern for SeriesPattern2 { - fn get(&self, index: Index) -> Option> { - _I2.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern2 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I2 } } +impl SeriesPattern for SeriesPattern2 { fn get(&self, index: Index) -> Option> { _I2.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern3By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern3By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern3By { - pub fn minute10(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Minute10) - } + pub fn minute10(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Minute10) } } -pub struct SeriesPattern3 { - name: Arc, - pub by: SeriesPattern3By, -} +pub struct SeriesPattern3 { name: Arc, pub by: SeriesPattern3By } impl SeriesPattern3 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern3By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern3By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern3 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I3 - } -} -impl SeriesPattern for SeriesPattern3 { - fn get(&self, index: Index) -> Option> { - _I3.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern3 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I3 } } +impl SeriesPattern for SeriesPattern3 { fn get(&self, index: Index) -> Option> { _I3.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern4By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern4By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern4By { - pub fn minute30(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Minute30) - } + pub fn minute30(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Minute30) } } -pub struct SeriesPattern4 { - name: Arc, - pub by: SeriesPattern4By, -} +pub struct SeriesPattern4 { name: Arc, pub by: SeriesPattern4By } impl SeriesPattern4 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern4By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern4By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern4 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I4 - } -} -impl SeriesPattern for SeriesPattern4 { - fn get(&self, index: Index) -> Option> { - _I4.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern4 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I4 } } +impl SeriesPattern for SeriesPattern4 { fn get(&self, index: Index) -> Option> { _I4.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern5By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern5By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern5By { - pub fn hour1(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Hour1) - } + pub fn hour1(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Hour1) } } -pub struct SeriesPattern5 { - name: Arc, - pub by: SeriesPattern5By, -} +pub struct SeriesPattern5 { name: Arc, pub by: SeriesPattern5By } impl SeriesPattern5 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern5By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern5By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern5 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I5 - } -} -impl SeriesPattern for SeriesPattern5 { - fn get(&self, index: Index) -> Option> { - _I5.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern5 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I5 } } +impl SeriesPattern for SeriesPattern5 { fn get(&self, index: Index) -> Option> { _I5.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern6By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern6By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern6By { - pub fn hour4(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Hour4) - } + pub fn hour4(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Hour4) } } -pub struct SeriesPattern6 { - name: Arc, - pub by: SeriesPattern6By, -} +pub struct SeriesPattern6 { name: Arc, pub by: SeriesPattern6By } impl SeriesPattern6 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern6By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern6By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern6 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I6 - } -} -impl SeriesPattern for SeriesPattern6 { - fn get(&self, index: Index) -> Option> { - _I6.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern6 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I6 } } +impl SeriesPattern for SeriesPattern6 { fn get(&self, index: Index) -> Option> { _I6.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern7By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern7By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern7By { - pub fn hour12(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Hour12) - } + pub fn hour12(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Hour12) } } -pub struct SeriesPattern7 { - name: Arc, - pub by: SeriesPattern7By, -} +pub struct SeriesPattern7 { name: Arc, pub by: SeriesPattern7By } impl SeriesPattern7 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern7By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern7By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern7 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I7 - } -} -impl SeriesPattern for SeriesPattern7 { - fn get(&self, index: Index) -> Option> { - _I7.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern7 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I7 } } +impl SeriesPattern for SeriesPattern7 { fn get(&self, index: Index) -> Option> { _I7.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern8By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern8By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern8By { - pub fn day1(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Day1) - } + pub fn day1(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Day1) } } -pub struct SeriesPattern8 { - name: Arc, - pub by: SeriesPattern8By, -} +pub struct SeriesPattern8 { name: Arc, pub by: SeriesPattern8By } impl SeriesPattern8 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern8By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern8By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern8 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I8 - } -} -impl SeriesPattern for SeriesPattern8 { - fn get(&self, index: Index) -> Option> { - _I8.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern8 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I8 } } +impl SeriesPattern for SeriesPattern8 { fn get(&self, index: Index) -> Option> { _I8.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern9By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern9By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern9By { - pub fn day3(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Day3) - } + pub fn day3(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Day3) } } -pub struct SeriesPattern9 { - name: Arc, - pub by: SeriesPattern9By, -} +pub struct SeriesPattern9 { name: Arc, pub by: SeriesPattern9By } impl SeriesPattern9 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern9By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern9By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern9 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I9 - } -} -impl SeriesPattern for SeriesPattern9 { - fn get(&self, index: Index) -> Option> { - _I9.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern9 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I9 } } +impl SeriesPattern for SeriesPattern9 { fn get(&self, index: Index) -> Option> { _I9.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern10By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern10By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern10By { - pub fn week1(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Week1) - } + pub fn week1(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Week1) } } -pub struct SeriesPattern10 { - name: Arc, - pub by: SeriesPattern10By, -} +pub struct SeriesPattern10 { name: Arc, pub by: SeriesPattern10By } impl SeriesPattern10 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern10By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern10By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern10 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I10 - } -} -impl SeriesPattern for SeriesPattern10 { - fn get(&self, index: Index) -> Option> { - _I10.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern10 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I10 } } +impl SeriesPattern for SeriesPattern10 { fn get(&self, index: Index) -> Option> { _I10.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern11By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern11By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern11By { - pub fn month1(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Month1) - } + pub fn month1(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Month1) } } -pub struct SeriesPattern11 { - name: Arc, - pub by: SeriesPattern11By, -} +pub struct SeriesPattern11 { name: Arc, pub by: SeriesPattern11By } impl SeriesPattern11 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern11By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern11By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern11 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I11 - } -} -impl SeriesPattern for SeriesPattern11 { - fn get(&self, index: Index) -> Option> { - _I11.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern11 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I11 } } +impl SeriesPattern for SeriesPattern11 { fn get(&self, index: Index) -> Option> { _I11.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern12By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern12By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern12By { - pub fn month3(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Month3) - } + pub fn month3(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Month3) } } -pub struct SeriesPattern12 { - name: Arc, - pub by: SeriesPattern12By, -} +pub struct SeriesPattern12 { name: Arc, pub by: SeriesPattern12By } impl SeriesPattern12 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern12By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern12By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern12 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I12 - } -} -impl SeriesPattern for SeriesPattern12 { - fn get(&self, index: Index) -> Option> { - _I12.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern12 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I12 } } +impl SeriesPattern for SeriesPattern12 { fn get(&self, index: Index) -> Option> { _I12.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern13By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern13By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern13By { - pub fn month6(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Month6) - } + pub fn month6(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Month6) } } -pub struct SeriesPattern13 { - name: Arc, - pub by: SeriesPattern13By, -} +pub struct SeriesPattern13 { name: Arc, pub by: SeriesPattern13By } impl SeriesPattern13 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern13By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern13By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern13 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I13 - } -} -impl SeriesPattern for SeriesPattern13 { - fn get(&self, index: Index) -> Option> { - _I13.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern13 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I13 } } +impl SeriesPattern for SeriesPattern13 { fn get(&self, index: Index) -> Option> { _I13.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern14By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern14By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern14By { - pub fn year1(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Year1) - } + pub fn year1(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Year1) } } -pub struct SeriesPattern14 { - name: Arc, - pub by: SeriesPattern14By, -} +pub struct SeriesPattern14 { name: Arc, pub by: SeriesPattern14By } impl SeriesPattern14 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern14By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern14By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern14 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I14 - } -} -impl SeriesPattern for SeriesPattern14 { - fn get(&self, index: Index) -> Option> { - _I14.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern14 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I14 } } +impl SeriesPattern for SeriesPattern14 { fn get(&self, index: Index) -> Option> { _I14.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern15By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern15By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern15By { - pub fn year10(&self) -> DateSeriesEndpoint { - _dep(&self.client, &self.name, Index::Year10) - } + pub fn year10(&self) -> DateSeriesEndpoint { _dep(&self.client, &self.name, Index::Year10) } } -pub struct SeriesPattern15 { - name: Arc, - pub by: SeriesPattern15By, -} +pub struct SeriesPattern15 { name: Arc, pub by: SeriesPattern15By } impl SeriesPattern15 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern15By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern15By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern15 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I15 - } -} -impl SeriesPattern for SeriesPattern15 { - fn get(&self, index: Index) -> Option> { - _I15.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern15 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I15 } } +impl SeriesPattern for SeriesPattern15 { fn get(&self, index: Index) -> Option> { _I15.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern16By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern16By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern16By { - pub fn halving(&self) -> SeriesEndpoint { - _ep(&self.client, &self.name, Index::Halving) - } + pub fn halving(&self) -> SeriesEndpoint { _ep(&self.client, &self.name, Index::Halving) } } -pub struct SeriesPattern16 { - name: Arc, - pub by: SeriesPattern16By, -} +pub struct SeriesPattern16 { name: Arc, pub by: SeriesPattern16By } impl SeriesPattern16 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern16By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern16By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern16 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I16 - } -} -impl SeriesPattern for SeriesPattern16 { - fn get(&self, index: Index) -> Option> { - _I16.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern16 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I16 } } +impl SeriesPattern for SeriesPattern16 { fn get(&self, index: Index) -> Option> { _I16.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern17By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern17By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern17By { - pub fn epoch(&self) -> SeriesEndpoint { - _ep(&self.client, &self.name, Index::Epoch) - } + pub fn epoch(&self) -> SeriesEndpoint { _ep(&self.client, &self.name, Index::Epoch) } } -pub struct SeriesPattern17 { - name: Arc, - pub by: SeriesPattern17By, -} +pub struct SeriesPattern17 { name: Arc, pub by: SeriesPattern17By } impl SeriesPattern17 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern17By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern17By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern17 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I17 - } -} -impl SeriesPattern for SeriesPattern17 { - fn get(&self, index: Index) -> Option> { - _I17.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern17 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I17 } } +impl SeriesPattern for SeriesPattern17 { fn get(&self, index: Index) -> Option> { _I17.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern18By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern18By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern18By { - pub fn height(&self) -> SeriesEndpoint { - _ep(&self.client, &self.name, Index::Height) - } + pub fn height(&self) -> SeriesEndpoint { _ep(&self.client, &self.name, Index::Height) } } -pub struct SeriesPattern18 { - name: Arc, - pub by: SeriesPattern18By, -} +pub struct SeriesPattern18 { name: Arc, pub by: SeriesPattern18By } impl SeriesPattern18 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern18By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern18By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern18 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I18 - } -} -impl SeriesPattern for SeriesPattern18 { - fn get(&self, index: Index) -> Option> { - _I18.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern18 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I18 } } +impl SeriesPattern for SeriesPattern18 { fn get(&self, index: Index) -> Option> { _I18.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern19By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern19By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern19By { - pub fn tx_index(&self) -> SeriesEndpoint { - _ep(&self.client, &self.name, Index::TxIndex) - } + pub fn tx_index(&self) -> SeriesEndpoint { _ep(&self.client, &self.name, Index::TxIndex) } } -pub struct SeriesPattern19 { - name: Arc, - pub by: SeriesPattern19By, -} +pub struct SeriesPattern19 { name: Arc, pub by: SeriesPattern19By } impl SeriesPattern19 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern19By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern19By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern19 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I19 - } -} -impl SeriesPattern for SeriesPattern19 { - fn get(&self, index: Index) -> Option> { - _I19.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern19 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I19 } } +impl SeriesPattern for SeriesPattern19 { fn get(&self, index: Index) -> Option> { _I19.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern20By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern20By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern20By { - pub fn txin_index(&self) -> SeriesEndpoint { - _ep(&self.client, &self.name, Index::TxInIndex) - } + pub fn txin_index(&self) -> SeriesEndpoint { _ep(&self.client, &self.name, Index::TxInIndex) } } -pub struct SeriesPattern20 { - name: Arc, - pub by: SeriesPattern20By, -} +pub struct SeriesPattern20 { name: Arc, pub by: SeriesPattern20By } impl SeriesPattern20 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern20By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern20By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern20 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I20 - } -} -impl SeriesPattern for SeriesPattern20 { - fn get(&self, index: Index) -> Option> { - _I20.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern20 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I20 } } +impl SeriesPattern for SeriesPattern20 { fn get(&self, index: Index) -> Option> { _I20.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern21By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern21By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern21By { - pub fn txout_index(&self) -> SeriesEndpoint { - _ep(&self.client, &self.name, Index::TxOutIndex) - } + pub fn txout_index(&self) -> SeriesEndpoint { _ep(&self.client, &self.name, Index::TxOutIndex) } } -pub struct SeriesPattern21 { - name: Arc, - pub by: SeriesPattern21By, -} +pub struct SeriesPattern21 { name: Arc, pub by: SeriesPattern21By } impl SeriesPattern21 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern21By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern21By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern21 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I21 - } -} -impl SeriesPattern for SeriesPattern21 { - fn get(&self, index: Index) -> Option> { - _I21.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern21 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I21 } } +impl SeriesPattern for SeriesPattern21 { fn get(&self, index: Index) -> Option> { _I21.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern22By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern22By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern22By { - pub fn empty_output_index(&self) -> SeriesEndpoint { - _ep(&self.client, &self.name, Index::EmptyOutputIndex) - } + pub fn empty_output_index(&self) -> SeriesEndpoint { _ep(&self.client, &self.name, Index::EmptyOutputIndex) } } -pub struct SeriesPattern22 { - name: Arc, - pub by: SeriesPattern22By, -} +pub struct SeriesPattern22 { name: Arc, pub by: SeriesPattern22By } impl SeriesPattern22 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern22By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern22By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern22 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I22 - } -} -impl SeriesPattern for SeriesPattern22 { - fn get(&self, index: Index) -> Option> { - _I22.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern22 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I22 } } +impl SeriesPattern for SeriesPattern22 { fn get(&self, index: Index) -> Option> { _I22.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern23By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern23By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern23By { - pub fn op_return_index(&self) -> SeriesEndpoint { - _ep(&self.client, &self.name, Index::OpReturnIndex) - } + pub fn op_return_index(&self) -> SeriesEndpoint { _ep(&self.client, &self.name, Index::OpReturnIndex) } } -pub struct SeriesPattern23 { - name: Arc, - pub by: SeriesPattern23By, -} +pub struct SeriesPattern23 { name: Arc, pub by: SeriesPattern23By } impl SeriesPattern23 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern23By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern23By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern23 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I23 - } -} -impl SeriesPattern for SeriesPattern23 { - fn get(&self, index: Index) -> Option> { - _I23.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern23 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I23 } } +impl SeriesPattern for SeriesPattern23 { fn get(&self, index: Index) -> Option> { _I23.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern24By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern24By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern24By { - pub fn p2a_addr_index(&self) -> SeriesEndpoint { - _ep(&self.client, &self.name, Index::P2AAddrIndex) - } + pub fn p2a_addr_index(&self) -> SeriesEndpoint { _ep(&self.client, &self.name, Index::P2AAddrIndex) } } -pub struct SeriesPattern24 { - name: Arc, - pub by: SeriesPattern24By, -} +pub struct SeriesPattern24 { name: Arc, pub by: SeriesPattern24By } impl SeriesPattern24 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern24By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern24By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern24 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I24 - } -} -impl SeriesPattern for SeriesPattern24 { - fn get(&self, index: Index) -> Option> { - _I24.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern24 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I24 } } +impl SeriesPattern for SeriesPattern24 { fn get(&self, index: Index) -> Option> { _I24.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern25By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern25By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern25By { - pub fn p2ms_output_index(&self) -> SeriesEndpoint { - _ep(&self.client, &self.name, Index::P2MSOutputIndex) - } + pub fn p2ms_output_index(&self) -> SeriesEndpoint { _ep(&self.client, &self.name, Index::P2MSOutputIndex) } } -pub struct SeriesPattern25 { - name: Arc, - pub by: SeriesPattern25By, -} +pub struct SeriesPattern25 { name: Arc, pub by: SeriesPattern25By } impl SeriesPattern25 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern25By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern25By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern25 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I25 - } -} -impl SeriesPattern for SeriesPattern25 { - fn get(&self, index: Index) -> Option> { - _I25.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern25 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I25 } } +impl SeriesPattern for SeriesPattern25 { fn get(&self, index: Index) -> Option> { _I25.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern26By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern26By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern26By { - pub fn p2pk33_addr_index(&self) -> SeriesEndpoint { - _ep(&self.client, &self.name, Index::P2PK33AddrIndex) - } + pub fn p2pk33_addr_index(&self) -> SeriesEndpoint { _ep(&self.client, &self.name, Index::P2PK33AddrIndex) } } -pub struct SeriesPattern26 { - name: Arc, - pub by: SeriesPattern26By, -} +pub struct SeriesPattern26 { name: Arc, pub by: SeriesPattern26By } impl SeriesPattern26 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern26By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern26By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern26 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I26 - } -} -impl SeriesPattern for SeriesPattern26 { - fn get(&self, index: Index) -> Option> { - _I26.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern26 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I26 } } +impl SeriesPattern for SeriesPattern26 { fn get(&self, index: Index) -> Option> { _I26.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern27By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern27By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern27By { - pub fn p2pk65_addr_index(&self) -> SeriesEndpoint { - _ep(&self.client, &self.name, Index::P2PK65AddrIndex) - } + pub fn p2pk65_addr_index(&self) -> SeriesEndpoint { _ep(&self.client, &self.name, Index::P2PK65AddrIndex) } } -pub struct SeriesPattern27 { - name: Arc, - pub by: SeriesPattern27By, -} +pub struct SeriesPattern27 { name: Arc, pub by: SeriesPattern27By } impl SeriesPattern27 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern27By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern27By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern27 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I27 - } -} -impl SeriesPattern for SeriesPattern27 { - fn get(&self, index: Index) -> Option> { - _I27.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern27 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I27 } } +impl SeriesPattern for SeriesPattern27 { fn get(&self, index: Index) -> Option> { _I27.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern28By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern28By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern28By { - pub fn p2pkh_addr_index(&self) -> SeriesEndpoint { - _ep(&self.client, &self.name, Index::P2PKHAddrIndex) - } + pub fn p2pkh_addr_index(&self) -> SeriesEndpoint { _ep(&self.client, &self.name, Index::P2PKHAddrIndex) } } -pub struct SeriesPattern28 { - name: Arc, - pub by: SeriesPattern28By, -} +pub struct SeriesPattern28 { name: Arc, pub by: SeriesPattern28By } impl SeriesPattern28 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern28By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern28By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern28 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I28 - } -} -impl SeriesPattern for SeriesPattern28 { - fn get(&self, index: Index) -> Option> { - _I28.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern28 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I28 } } +impl SeriesPattern for SeriesPattern28 { fn get(&self, index: Index) -> Option> { _I28.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern29By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern29By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern29By { - pub fn p2sh_addr_index(&self) -> SeriesEndpoint { - _ep(&self.client, &self.name, Index::P2SHAddrIndex) - } + pub fn p2sh_addr_index(&self) -> SeriesEndpoint { _ep(&self.client, &self.name, Index::P2SHAddrIndex) } } -pub struct SeriesPattern29 { - name: Arc, - pub by: SeriesPattern29By, -} +pub struct SeriesPattern29 { name: Arc, pub by: SeriesPattern29By } impl SeriesPattern29 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern29By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern29By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern29 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I29 - } -} -impl SeriesPattern for SeriesPattern29 { - fn get(&self, index: Index) -> Option> { - _I29.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern29 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I29 } } +impl SeriesPattern for SeriesPattern29 { fn get(&self, index: Index) -> Option> { _I29.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern30By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern30By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern30By { - pub fn p2tr_addr_index(&self) -> SeriesEndpoint { - _ep(&self.client, &self.name, Index::P2TRAddrIndex) - } + pub fn p2tr_addr_index(&self) -> SeriesEndpoint { _ep(&self.client, &self.name, Index::P2TRAddrIndex) } } -pub struct SeriesPattern30 { - name: Arc, - pub by: SeriesPattern30By, -} +pub struct SeriesPattern30 { name: Arc, pub by: SeriesPattern30By } impl SeriesPattern30 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern30By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern30By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern30 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I30 - } -} -impl SeriesPattern for SeriesPattern30 { - fn get(&self, index: Index) -> Option> { - _I30.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern30 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I30 } } +impl SeriesPattern for SeriesPattern30 { fn get(&self, index: Index) -> Option> { _I30.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern31By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern31By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern31By { - pub fn p2wpkh_addr_index(&self) -> SeriesEndpoint { - _ep(&self.client, &self.name, Index::P2WPKHAddrIndex) - } + pub fn p2wpkh_addr_index(&self) -> SeriesEndpoint { _ep(&self.client, &self.name, Index::P2WPKHAddrIndex) } } -pub struct SeriesPattern31 { - name: Arc, - pub by: SeriesPattern31By, -} +pub struct SeriesPattern31 { name: Arc, pub by: SeriesPattern31By } impl SeriesPattern31 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern31By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern31By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern31 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I31 - } -} -impl SeriesPattern for SeriesPattern31 { - fn get(&self, index: Index) -> Option> { - _I31.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern31 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I31 } } +impl SeriesPattern for SeriesPattern31 { fn get(&self, index: Index) -> Option> { _I31.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern32By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern32By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern32By { - pub fn p2wsh_addr_index(&self) -> SeriesEndpoint { - _ep(&self.client, &self.name, Index::P2WSHAddrIndex) - } + pub fn p2wsh_addr_index(&self) -> SeriesEndpoint { _ep(&self.client, &self.name, Index::P2WSHAddrIndex) } } -pub struct SeriesPattern32 { - name: Arc, - pub by: SeriesPattern32By, -} +pub struct SeriesPattern32 { name: Arc, pub by: SeriesPattern32By } impl SeriesPattern32 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern32By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern32By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern32 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I32 - } -} -impl SeriesPattern for SeriesPattern32 { - fn get(&self, index: Index) -> Option> { - _I32.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern32 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I32 } } +impl SeriesPattern for SeriesPattern32 { fn get(&self, index: Index) -> Option> { _I32.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern33By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern33By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern33By { - pub fn unknown_output_index(&self) -> SeriesEndpoint { - _ep(&self.client, &self.name, Index::UnknownOutputIndex) - } + pub fn unknown_output_index(&self) -> SeriesEndpoint { _ep(&self.client, &self.name, Index::UnknownOutputIndex) } } -pub struct SeriesPattern33 { - name: Arc, - pub by: SeriesPattern33By, -} +pub struct SeriesPattern33 { name: Arc, pub by: SeriesPattern33By } impl SeriesPattern33 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern33By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern33By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern33 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I33 - } -} -impl SeriesPattern for SeriesPattern33 { - fn get(&self, index: Index) -> Option> { - _I33.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern33 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I33 } } +impl SeriesPattern for SeriesPattern33 { fn get(&self, index: Index) -> Option> { _I33.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern34By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern34By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern34By { - pub fn funded_addr_index(&self) -> SeriesEndpoint { - _ep(&self.client, &self.name, Index::FundedAddrIndex) - } + pub fn funded_addr_index(&self) -> SeriesEndpoint { _ep(&self.client, &self.name, Index::FundedAddrIndex) } } -pub struct SeriesPattern34 { - name: Arc, - pub by: SeriesPattern34By, -} +pub struct SeriesPattern34 { name: Arc, pub by: SeriesPattern34By } impl SeriesPattern34 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern34By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern34By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern34 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I34 - } -} -impl SeriesPattern for SeriesPattern34 { - fn get(&self, index: Index) -> Option> { - _I34.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern34 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I34 } } +impl SeriesPattern for SeriesPattern34 { fn get(&self, index: Index) -> Option> { _I34.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } -pub struct SeriesPattern35By { - client: Arc, - name: Arc, - _marker: std::marker::PhantomData, -} +pub struct SeriesPattern35By { client: Arc, name: Arc, _marker: std::marker::PhantomData } impl SeriesPattern35By { - pub fn empty_addr_index(&self) -> SeriesEndpoint { - _ep(&self.client, &self.name, Index::EmptyAddrIndex) - } + pub fn empty_addr_index(&self) -> SeriesEndpoint { _ep(&self.client, &self.name, Index::EmptyAddrIndex) } } -pub struct SeriesPattern35 { - name: Arc, - pub by: SeriesPattern35By, -} +pub struct SeriesPattern35 { name: Arc, pub by: SeriesPattern35By } impl SeriesPattern35 { - pub fn new(client: Arc, name: String) -> Self { - let name: Arc = name.into(); - Self { - name: name.clone(), - by: SeriesPattern35By { - client, - name, - _marker: std::marker::PhantomData, - }, - } - } - pub fn name(&self) -> &str { - &self.name - } + pub fn new(client: Arc, name: String) -> Self { let name: Arc = name.into(); Self { name: name.clone(), by: SeriesPattern35By { client, name, _marker: std::marker::PhantomData } } } + pub fn name(&self) -> &str { &self.name } } -impl AnySeriesPattern for SeriesPattern35 { - fn name(&self) -> &str { - &self.name - } - fn indexes(&self) -> &'static [Index] { - _I35 - } -} -impl SeriesPattern for SeriesPattern35 { - fn get(&self, index: Index) -> Option> { - _I35.contains(&index) - .then(|| _ep(&self.by.client, &self.by.name, index)) - } -} +impl AnySeriesPattern for SeriesPattern35 { fn name(&self) -> &str { &self.name } fn indexes(&self) -> &'static [Index] { _I35 } } +impl SeriesPattern for SeriesPattern35 { fn get(&self, index: Index) -> Option> { _I35.contains(&index).then(|| _ep(&self.by.client, &self.by.name, index)) } } // Reusable pattern structs /// Pattern struct for repeated tree structure. -pub struct Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern -{ +pub struct Pct05Pct10Pct15Pct20Pct25Pct30Pct35Pct40Pct45Pct50Pct55Pct60Pct65Pct70Pct75Pct80Pct85Pct90Pct95Pattern { pub pct05: CentsSatsUsdPattern, pub pct10: CentsSatsUsdPattern, pub pct15: CentsSatsUsdPattern, @@ -2534,14 +1232,8 @@ impl GrossInvestedInvestorLossNetNuplProfitSentimentPattern2 { Self { gross_pnl: CentsUsdPattern3::new(client.clone(), _m(&acc, "unrealized_gross_pnl")), invested_capital: InPattern::new(client.clone(), _m(&acc, "invested_capital_in")), - investor_cap_in_loss_raw: SeriesPattern18::new( - client.clone(), - _m(&acc, "investor_cap_in_loss_raw"), - ), - investor_cap_in_profit_raw: SeriesPattern18::new( - client.clone(), - _m(&acc, "investor_cap_in_profit_raw"), - ), + investor_cap_in_loss_raw: SeriesPattern18::new(client.clone(), _m(&acc, "investor_cap_in_loss_raw")), + investor_cap_in_profit_raw: SeriesPattern18::new(client.clone(), _m(&acc, "investor_cap_in_profit_raw")), loss: CentsNegativeToUsdPattern2::new(client.clone(), _m(&acc, "unrealized_loss")), net_pnl: CentsToUsdPattern3::new(client.clone(), _m(&acc, "net_unrealized_pnl")), nupl: BpsRatioPattern::new(client.clone(), _m(&acc, "nupl")), @@ -2661,10 +1353,7 @@ impl CapLossMvrvNetPriceProfitSoprPattern { cap: CentsDeltaUsdPattern::new(client.clone(), _m(&acc, "realized_cap")), loss: BlockCumulativeNegativeSumPattern::new(client.clone(), _m(&acc, "realized_loss")), mvrv: SeriesPattern1::new(client.clone(), _m(&acc, "mvrv")), - net_pnl: BlockCumulativeDeltaSumPattern::new( - client.clone(), - _m(&acc, "net_realized_pnl"), - ), + net_pnl: BlockCumulativeDeltaSumPattern::new(client.clone(), _m(&acc, "net_realized_pnl")), price: BpsCentsRatioSatsUsdPattern::new(client.clone(), _m(&acc, "realized_price")), profit: BlockCumulativeSumPattern::new(client.clone(), _m(&acc, "realized_profit")), sopr: RatioValuePattern::new(client.clone(), acc.clone()), @@ -2816,10 +1505,7 @@ impl AverageBlockCumulativeInSumPattern { block: BtcCentsSatsUsdPattern2::new(client.clone(), acc.clone()), cumulative: BtcCentsSatsUsdPattern3::new(client.clone(), _m(&acc, "cumulative")), in_loss: AverageBlockCumulativeSumPattern3::new(client.clone(), _m(&acc, "in_loss")), - in_profit: AverageBlockCumulativeSumPattern3::new( - client.clone(), - _m(&acc, "in_profit"), - ), + in_profit: AverageBlockCumulativeSumPattern3::new(client.clone(), _m(&acc, "in_profit")), sum: _1m1w1y24hPattern4::new(client.clone(), _m(&acc, "sum")), } } @@ -2866,10 +1552,7 @@ impl BtcCentsSatsToUsdPattern3 { btc: SeriesPattern1::new(client.clone(), acc.clone()), cents: SeriesPattern1::new(client.clone(), _m(&acc, "cents")), sats: SeriesPattern1::new(client.clone(), _m(&acc, "sats")), - to_circulating: BpsPercentRatioPattern3::new( - client.clone(), - _m(&acc, "to_circulating"), - ), + to_circulating: BpsPercentRatioPattern3::new(client.clone(), _m(&acc, "to_circulating")), to_own: BpsPercentRatioPattern3::new(client.clone(), _m(&acc, "to_own")), usd: SeriesPattern1::new(client.clone(), _m(&acc, "usd")), } @@ -2893,10 +1576,7 @@ impl CentsNegativeToUsdPattern2 { cents: SeriesPattern1::new(client.clone(), _m(&acc, "cents")), negative: SeriesPattern1::new(client.clone(), _m(&acc, "neg")), to_mcap: BpsPercentRatioPattern3::new(client.clone(), _m(&acc, "to_mcap")), - to_own_gross_pnl: BpsPercentRatioPattern3::new( - client.clone(), - _m(&acc, "to_own_gross_pnl"), - ), + to_own_gross_pnl: BpsPercentRatioPattern3::new(client.clone(), _m(&acc, "to_own_gross_pnl")), to_own_mcap: BpsPercentRatioPattern4::new(client.clone(), _m(&acc, "to_own_mcap")), usd: SeriesPattern1::new(client.clone(), acc.clone()), } @@ -2921,10 +1601,7 @@ impl DeltaHalfInToTotalPattern { half: BtcCentsSatsUsdPattern3::new(client.clone(), _m(&acc, "half")), in_loss: BtcCentsSatsToUsdPattern::new(client.clone(), _m(&acc, "in_loss")), in_profit: BtcCentsSatsToUsdPattern::new(client.clone(), _m(&acc, "in_profit")), - to_circulating: BpsPercentRatioPattern3::new( - client.clone(), - _m(&acc, "to_circulating"), - ), + to_circulating: BpsPercentRatioPattern3::new(client.clone(), _m(&acc, "to_circulating")), total: BtcCentsSatsUsdPattern3::new(client.clone(), acc.clone()), } } @@ -2948,10 +1625,7 @@ impl DeltaHalfInToTotalPattern2 { half: BtcCentsSatsUsdPattern3::new(client.clone(), _m(&acc, "half")), in_loss: BtcCentsSatsToUsdPattern3::new(client.clone(), _m(&acc, "in_loss")), in_profit: BtcCentsSatsToUsdPattern3::new(client.clone(), _m(&acc, "in_profit")), - to_circulating: BpsPercentRatioPattern3::new( - client.clone(), - _m(&acc, "to_circulating"), - ), + to_circulating: BpsPercentRatioPattern3::new(client.clone(), _m(&acc, "to_circulating")), total: BtcCentsSatsUsdPattern3::new(client.clone(), acc.clone()), } } @@ -3127,10 +1801,7 @@ impl BtcCentsSatsToUsdPattern { btc: SeriesPattern1::new(client.clone(), acc.clone()), cents: SeriesPattern1::new(client.clone(), _m(&acc, "cents")), sats: SeriesPattern1::new(client.clone(), _m(&acc, "sats")), - to_circulating: BpsPercentRatioPattern3::new( - client.clone(), - _m(&acc, "to_circulating"), - ), + to_circulating: BpsPercentRatioPattern3::new(client.clone(), _m(&acc, "to_circulating")), usd: SeriesPattern1::new(client.clone(), _m(&acc, "usd")), } } @@ -3195,10 +1866,7 @@ impl CentsToUsdPattern4 { Self { cents: SeriesPattern1::new(client.clone(), _m(&acc, "cents")), to_mcap: BpsPercentRatioPattern3::new(client.clone(), _m(&acc, "to_mcap")), - to_own_gross_pnl: BpsPercentRatioPattern3::new( - client.clone(), - _m(&acc, "to_own_gross_pnl"), - ), + to_own_gross_pnl: BpsPercentRatioPattern3::new(client.clone(), _m(&acc, "to_own_gross_pnl")), to_own_mcap: BpsPercentRatioPattern3::new(client.clone(), _m(&acc, "to_own_mcap")), usd: SeriesPattern1::new(client.clone(), acc.clone()), } @@ -3599,10 +2267,7 @@ impl CentsToUsdPattern3 { pub fn new(client: Arc, acc: String) -> Self { Self { cents: SeriesPattern1::new(client.clone(), _m(&acc, "cents")), - to_own_gross_pnl: BpsPercentRatioPattern::new( - client.clone(), - _m(&acc, "to_own_gross_pnl"), - ), + to_own_gross_pnl: BpsPercentRatioPattern::new(client.clone(), _m(&acc, "to_own_gross_pnl")), to_own_mcap: BpsPercentRatioPattern::new(client.clone(), _m(&acc, "to_own_mcap")), usd: SeriesPattern1::new(client.clone(), acc.clone()), } @@ -3621,19 +2286,10 @@ impl CoindaysCoinyearsDormancyTransferPattern { /// Create a new pattern node with accumulated series name. pub fn new(client: Arc, acc: String) -> Self { Self { - coindays_destroyed: AverageBlockCumulativeSumPattern::new( - client.clone(), - _m(&acc, "coindays_destroyed"), - ), - coinyears_destroyed: SeriesPattern1::new( - client.clone(), - _m(&acc, "coinyears_destroyed"), - ), + coindays_destroyed: AverageBlockCumulativeSumPattern::new(client.clone(), _m(&acc, "coindays_destroyed")), + coinyears_destroyed: SeriesPattern1::new(client.clone(), _m(&acc, "coinyears_destroyed")), dormancy: _1m1w1y24hPattern::new(client.clone(), _m(&acc, "dormancy")), - transfer_volume: AverageBlockCumulativeInSumPattern::new( - client.clone(), - _m(&acc, "transfer_volume"), - ), + transfer_volume: AverageBlockCumulativeInSumPattern::new(client.clone(), _m(&acc, "transfer_volume")), } } } @@ -3671,17 +2327,9 @@ impl NuplRealizedSupplyUnrealizedPattern { pub fn new(client: Arc, acc: String) -> Self { Self { nupl: BpsRatioPattern::new(client.clone(), _m(&acc, "nupl")), - realized_cap: AllSthPattern::new( - client.clone(), - acc.clone(), - "realized_cap".to_string(), - ), + realized_cap: AllSthPattern::new(client.clone(), acc.clone(), "realized_cap".to_string()), supply: AllSthPattern2::new(client.clone(), acc.clone()), - unrealized_pnl: AllSthPattern::new( - client.clone(), - acc.clone(), - "unrealized_pnl".to_string(), - ), + unrealized_pnl: AllSthPattern::new(client.clone(), acc.clone(), "unrealized_pnl".to_string()), } } } @@ -3739,10 +2387,7 @@ impl AdjustedRatioValuePattern { Self { adjusted: RatioTransferValuePattern::new(client.clone(), acc.clone()), ratio: _1m1w1y24hPattern::new(client.clone(), _m(&acc, "sopr")), - value_destroyed: AverageBlockCumulativeSumPattern::new( - client.clone(), - _m(&acc, "value_destroyed"), - ), + value_destroyed: AverageBlockCumulativeSumPattern::new(client.clone(), _m(&acc, "value_destroyed")), } } } @@ -3776,10 +2421,7 @@ impl BlocksDominanceRewardsPattern { /// Create a new pattern node with accumulated series name. pub fn new(client: Arc, acc: String) -> Self { Self { - blocks_mined: AverageBlockCumulativeSumPattern2::new( - client.clone(), - _m(&acc, "blocks_mined"), - ), + blocks_mined: AverageBlockCumulativeSumPattern2::new(client.clone(), _m(&acc, "blocks_mined")), dominance: _1m1w1y24hBpsPercentRatioPattern::new(client.clone(), _m(&acc, "dominance")), rewards: AverageBlockCumulativeSumPattern3::new(client.clone(), _m(&acc, "rewards")), } @@ -3833,15 +2475,9 @@ impl BpsPriceRatioPattern { /// Create a new pattern node with accumulated series name. pub fn new(client: Arc, acc: String, disc: String) -> Self { Self { - bps: SeriesPattern1::new( - client.clone(), - _m(&acc, &format!("ratio_{disc}_bps", disc = disc)), - ), + bps: SeriesPattern1::new(client.clone(), _m(&acc, &format!("ratio_{disc}_bps", disc=disc))), price: CentsSatsUsdPattern::new(client.clone(), _m(&acc, &disc)), - ratio: SeriesPattern1::new( - client.clone(), - _m(&acc, &format!("ratio_{disc}", disc = disc)), - ), + ratio: SeriesPattern1::new(client.clone(), _m(&acc, &format!("ratio_{disc}", disc=disc))), } } } @@ -3966,10 +2602,7 @@ impl CumulativeRollingSumPattern { pub fn new(client: Arc, acc: String) -> Self { Self { cumulative: SeriesPattern1::new(client.clone(), _m(&acc, "cumulative")), - rolling: AverageMaxMedianMinPct10Pct25Pct75Pct90SumPattern::new( - client.clone(), - acc.clone(), - ), + rolling: AverageMaxMedianMinPct10Pct25Pct75Pct90SumPattern::new(client.clone(), acc.clone()), sum: SeriesPattern18::new(client.clone(), _m(&acc, "sum")), } } @@ -4023,14 +2656,8 @@ impl RatioTransferValuePattern { pub fn new(client: Arc, acc: String) -> Self { Self { ratio: _1m1w1y24hPattern::new(client.clone(), _m(&acc, "asopr")), - transfer_volume: AverageBlockCumulativeSumPattern::new( - client.clone(), - _m(&acc, "adj_value_created"), - ), - value_destroyed: AverageBlockCumulativeSumPattern::new( - client.clone(), - _m(&acc, "adj_value_destroyed"), - ), + transfer_volume: AverageBlockCumulativeSumPattern::new(client.clone(), _m(&acc, "adj_value_created")), + value_destroyed: AverageBlockCumulativeSumPattern::new(client.clone(), _m(&acc, "adj_value_destroyed")), } } } @@ -4047,14 +2674,8 @@ impl RsiStochPattern { pub fn new(client: Arc, acc: String, disc: String) -> Self { Self { rsi: BpsPercentRatioPattern3::new(client.clone(), _m(&acc, &disc)), - stoch_rsi_d: BpsPercentRatioPattern3::new( - client.clone(), - _m(&acc, &format!("stoch_d_{disc}", disc = disc)), - ), - stoch_rsi_k: BpsPercentRatioPattern3::new( - client.clone(), - _m(&acc, &format!("stoch_k_{disc}", disc = disc)), - ), + stoch_rsi_d: BpsPercentRatioPattern3::new(client.clone(), _m(&acc, &format!("stoch_d_{disc}", disc=disc))), + stoch_rsi_k: BpsPercentRatioPattern3::new(client.clone(), _m(&acc, &format!("stoch_k_{disc}", disc=disc))), } } } @@ -4071,10 +2692,7 @@ impl SpendingSpentUnspentPattern { pub fn new(client: Arc, acc: String) -> Self { Self { spending_rate: SeriesPattern1::new(client.clone(), _m(&acc, "spending_rate")), - spent_count: AverageBlockCumulativeSumPattern2::new( - client.clone(), - _m(&acc, "spent_utxo_count"), - ), + spent_count: AverageBlockCumulativeSumPattern2::new(client.clone(), _m(&acc, "spent_utxo_count")), unspent_count: BaseDeltaPattern::new(client.clone(), _m(&acc, "utxo_count")), } } @@ -4157,10 +2775,7 @@ impl AllSthPattern { pub fn new(client: Arc, acc: String, disc: String) -> Self { Self { all: SeriesPattern1::new(client.clone(), _m(&acc, &disc)), - sth: SeriesPattern1::new( - client.clone(), - _m(&acc, &format!("sth_{disc}", disc = disc)), - ), + sth: SeriesPattern1::new(client.clone(), _m(&acc, &format!("sth_{disc}", disc=disc))), } } } @@ -4223,10 +2838,7 @@ impl BlocksDominancePattern { /// Create a new pattern node with accumulated series name. pub fn new(client: Arc, acc: String) -> Self { Self { - blocks_mined: AverageBlockCumulativeSumPattern2::new( - client.clone(), - _m(&acc, "blocks_mined"), - ), + blocks_mined: AverageBlockCumulativeSumPattern2::new(client.clone(), _m(&acc, "blocks_mined")), dominance: BpsPercentRatioPattern3::new(client.clone(), _m(&acc, "dominance")), } } @@ -4338,14 +2950,8 @@ impl CoindaysTransferPattern { /// Create a new pattern node with accumulated series name. pub fn new(client: Arc, acc: String) -> Self { Self { - coindays_destroyed: AverageBlockCumulativeSumPattern::new( - client.clone(), - _m(&acc, "coindays_destroyed"), - ), - transfer_volume: AverageBlockCumulativeInSumPattern::new( - client.clone(), - _m(&acc, "transfer_volume"), - ), + coindays_destroyed: AverageBlockCumulativeSumPattern::new(client.clone(), _m(&acc, "coindays_destroyed")), + transfer_volume: AverageBlockCumulativeInSumPattern::new(client.clone(), _m(&acc, "transfer_volume")), } } } @@ -4409,10 +3015,7 @@ impl PriceRatioPattern { pub fn new(client: Arc, acc: String, disc: String) -> Self { Self { price: CentsSatsUsdPattern::new(client.clone(), _m(&acc, &disc)), - ratio: SeriesPattern1::new( - client.clone(), - _m(&acc, &format!("ratio_{disc}", disc = disc)), - ), + ratio: SeriesPattern1::new(client.clone(), _m(&acc, &format!("ratio_{disc}", disc=disc))), } } } @@ -4428,10 +3031,7 @@ impl RatioValuePattern { pub fn new(client: Arc, acc: String) -> Self { Self { ratio: _24hPattern::new(client.clone(), _m(&acc, "sopr_24h")), - value_destroyed: AverageBlockCumulativeSumPattern::new( - client.clone(), - _m(&acc, "value_destroyed"), - ), + value_destroyed: AverageBlockCumulativeSumPattern::new(client.clone(), _m(&acc, "value_destroyed")), } } } @@ -4541,10 +3141,7 @@ impl SeriesTree { pub fn new(client: Arc, base_path: String) -> Self { Self { blocks: SeriesTree_Blocks::new(client.clone(), format!("{base_path}_blocks")), - transactions: SeriesTree_Transactions::new( - client.clone(), - format!("{base_path}_transactions"), - ), + transactions: SeriesTree_Transactions::new(client.clone(), format!("{base_path}_transactions")), inputs: SeriesTree_Inputs::new(client.clone(), format!("{base_path}_inputs")), outputs: SeriesTree_Outputs::new(client.clone(), format!("{base_path}_outputs")), addrs: SeriesTree_Addrs::new(client.clone(), format!("{base_path}_addrs")), @@ -4553,10 +3150,7 @@ impl SeriesTree { cointime: SeriesTree_Cointime::new(client.clone(), format!("{base_path}_cointime")), constants: SeriesTree_Constants::new(client.clone(), format!("{base_path}_constants")), indexes: SeriesTree_Indexes::new(client.clone(), format!("{base_path}_indexes")), - indicators: SeriesTree_Indicators::new( - client.clone(), - format!("{base_path}_indicators"), - ), + indicators: SeriesTree_Indicators::new(client.clone(), format!("{base_path}_indicators")), investing: SeriesTree_Investing::new(client.clone(), format!("{base_path}_investing")), market: SeriesTree_Market::new(client.clone(), format!("{base_path}_market")), pools: SeriesTree_Pools::new(client.clone(), format!("{base_path}_pools")), @@ -4591,36 +3185,18 @@ impl SeriesTree_Blocks { Self { blockhash: SeriesPattern18::new(client.clone(), "blockhash".to_string()), coinbase_tag: SeriesPattern18::new(client.clone(), "coinbase_tag".to_string()), - difficulty: SeriesTree_Blocks_Difficulty::new( - client.clone(), - format!("{base_path}_difficulty"), - ), + difficulty: SeriesTree_Blocks_Difficulty::new(client.clone(), format!("{base_path}_difficulty")), time: SeriesTree_Blocks_Time::new(client.clone(), format!("{base_path}_time")), size: SeriesTree_Blocks_Size::new(client.clone(), format!("{base_path}_size")), - weight: AverageBaseCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern::new( - client.clone(), - "block_weight".to_string(), - ), + weight: AverageBaseCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern::new(client.clone(), "block_weight".to_string()), segwit_txs: SeriesPattern18::new(client.clone(), "segwit_txs".to_string()), segwit_size: SeriesPattern18::new(client.clone(), "segwit_size".to_string()), segwit_weight: SeriesPattern18::new(client.clone(), "segwit_weight".to_string()), count: SeriesTree_Blocks_Count::new(client.clone(), format!("{base_path}_count")), - lookback: SeriesTree_Blocks_Lookback::new( - client.clone(), - format!("{base_path}_lookback"), - ), - interval: SeriesTree_Blocks_Interval::new( - client.clone(), - format!("{base_path}_interval"), - ), - vbytes: AverageBlockCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern::new( - client.clone(), - "block_vbytes".to_string(), - ), - fullness: SeriesTree_Blocks_Fullness::new( - client.clone(), - format!("{base_path}_fullness"), - ), + lookback: SeriesTree_Blocks_Lookback::new(client.clone(), format!("{base_path}_lookback")), + interval: SeriesTree_Blocks_Interval::new(client.clone(), format!("{base_path}_interval")), + vbytes: AverageBlockCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern::new(client.clone(), "block_vbytes".to_string()), + fullness: SeriesTree_Blocks_Fullness::new(client.clone(), format!("{base_path}_fullness")), halving: SeriesTree_Blocks_Halving::new(client.clone(), format!("{base_path}_halving")), } } @@ -4641,15 +3217,9 @@ impl SeriesTree_Blocks_Difficulty { Self { value: SeriesPattern1::new(client.clone(), "difficulty".to_string()), hashrate: SeriesPattern1::new(client.clone(), "difficulty_hashrate".to_string()), - adjustment: BpsPercentRatioPattern::new( - client.clone(), - "difficulty_adjustment".to_string(), - ), + adjustment: BpsPercentRatioPattern::new(client.clone(), "difficulty_adjustment".to_string()), epoch: SeriesPattern1::new(client.clone(), "difficulty_epoch".to_string()), - blocks_to_retarget: SeriesPattern1::new( - client.clone(), - "blocks_to_retarget".to_string(), - ), + blocks_to_retarget: SeriesPattern1::new(client.clone(), "blocks_to_retarget".to_string()), days_to_retarget: SeriesPattern1::new(client.clone(), "days_to_retarget".to_string()), } } @@ -4711,10 +3281,7 @@ impl SeriesTree_Blocks_Count { pub fn new(client: Arc, base_path: String) -> Self { Self { target: _1m1w1y24hPattern::new(client.clone(), "block_count_target".to_string()), - total: AverageBlockCumulativeSumPattern2::new( - client.clone(), - "block_count".to_string(), - ), + total: AverageBlockCumulativeSumPattern2::new(client.clone(), "block_count".to_string()), } } } @@ -4888,14 +3455,8 @@ impl SeriesTree_Transactions { count: SeriesTree_Transactions_Count::new(client.clone(), format!("{base_path}_count")), size: SeriesTree_Transactions_Size::new(client.clone(), format!("{base_path}_size")), fees: SeriesTree_Transactions_Fees::new(client.clone(), format!("{base_path}_fees")), - versions: SeriesTree_Transactions_Versions::new( - client.clone(), - format!("{base_path}_versions"), - ), - volume: SeriesTree_Transactions_Volume::new( - client.clone(), - format!("{base_path}_volume"), - ), + versions: SeriesTree_Transactions_Versions::new(client.clone(), format!("{base_path}_versions")), + volume: SeriesTree_Transactions_Volume::new(client.clone(), format!("{base_path}_volume")), } } } @@ -4924,15 +3485,9 @@ impl SeriesTree_Transactions_Raw { raw_locktime: SeriesPattern19::new(client.clone(), "raw_locktime".to_string()), base_size: SeriesPattern19::new(client.clone(), "base_size".to_string()), total_size: SeriesPattern19::new(client.clone(), "total_size".to_string()), - is_explicitly_rbf: SeriesPattern19::new( - client.clone(), - "is_explicitly_rbf".to_string(), - ), + is_explicitly_rbf: SeriesPattern19::new(client.clone(), "is_explicitly_rbf".to_string()), first_txin_index: SeriesPattern19::new(client.clone(), "first_txin_index".to_string()), - first_txout_index: SeriesPattern19::new( - client.clone(), - "first_txout_index".to_string(), - ), + first_txout_index: SeriesPattern19::new(client.clone(), "first_txout_index".to_string()), } } } @@ -4946,10 +3501,7 @@ pub struct SeriesTree_Transactions_Count { impl SeriesTree_Transactions_Count { pub fn new(client: Arc, base_path: String) -> Self { Self { - total: AverageBlockCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern::new( - client.clone(), - "tx_count".to_string(), - ), + total: AverageBlockCumulativeMaxMedianMinPct10Pct25Pct75Pct90SumPattern::new(client.clone(), "tx_count".to_string()), is_coinbase: SeriesPattern19::new(client.clone(), "is_coinbase".to_string()), } } @@ -4965,10 +3517,7 @@ impl SeriesTree_Transactions_Size { pub fn new(client: Arc, base_path: String) -> Self { Self { vsize: _6bBlockTxPattern::new(client.clone(), "tx_vsize".to_string()), - weight: SeriesTree_Transactions_Size_Weight::new( - client.clone(), - format!("{base_path}_weight"), - ), + weight: SeriesTree_Transactions_Size_Weight::new(client.clone(), format!("{base_path}_weight")), } } } @@ -4984,14 +3533,8 @@ impl SeriesTree_Transactions_Size_Weight { pub fn new(client: Arc, base_path: String) -> Self { Self { tx_index: SeriesPattern19::new(client.clone(), "tx_weight".to_string()), - block: MaxMedianMinPct10Pct25Pct75Pct90Pattern2::new( - client.clone(), - "tx_weight".to_string(), - ), - _6b: MaxMedianMinPct10Pct25Pct75Pct90Pattern2::new( - client.clone(), - "tx_weight_6b".to_string(), - ), + block: MaxMedianMinPct10Pct25Pct75Pct90Pattern2::new(client.clone(), "tx_weight".to_string()), + _6b: MaxMedianMinPct10Pct25Pct75Pct90Pattern2::new(client.clone(), "tx_weight_6b".to_string()), } } } @@ -5012,10 +3555,7 @@ impl SeriesTree_Transactions_Fees { output_value: SeriesPattern19::new(client.clone(), "output_value".to_string()), fee: _6bBlockTxPattern::new(client.clone(), "fee".to_string()), fee_rate: _6bBlockTxPattern::new(client.clone(), "fee_rate".to_string()), - effective_fee_rate: _6bBlockTxPattern::new( - client.clone(), - "effective_fee_rate".to_string(), - ), + effective_fee_rate: _6bBlockTxPattern::new(client.clone(), "effective_fee_rate".to_string()), } } } @@ -5048,10 +3588,7 @@ pub struct SeriesTree_Transactions_Volume { impl SeriesTree_Transactions_Volume { pub fn new(client: Arc, base_path: String) -> Self { Self { - transfer_volume: AverageBlockCumulativeSumPattern3::new( - client.clone(), - "transfer_volume_bis".to_string(), - ), + transfer_volume: AverageBlockCumulativeSumPattern3::new(client.clone(), "transfer_volume_bis".to_string()), tx_per_sec: _1m1w1y24hPattern::new(client.clone(), "tx_per_sec".to_string()), outputs_per_sec: _1m1w1y24hPattern::new(client.clone(), "outputs_per_sec".to_string()), inputs_per_sec: _1m1w1y24hPattern::new(client.clone(), "inputs_per_sec".to_string()), @@ -5141,10 +3678,7 @@ pub struct SeriesTree_Outputs_Raw { impl SeriesTree_Outputs_Raw { pub fn new(client: Arc, base_path: String) -> Self { Self { - first_txout_index: SeriesPattern18::new( - client.clone(), - "first_txout_index".to_string(), - ), + first_txout_index: SeriesPattern18::new(client.clone(), "first_txout_index".to_string()), value: SeriesPattern21::new(client.clone(), "value".to_string()), output_type: SeriesPattern21::new(client.clone(), "output_type".to_string()), type_index: SeriesPattern21::new(client.clone(), "type_index".to_string()), @@ -5200,22 +3734,10 @@ impl SeriesTree_Addrs { raw: SeriesTree_Addrs_Raw::new(client.clone(), format!("{base_path}_raw")), indexes: SeriesTree_Addrs_Indexes::new(client.clone(), format!("{base_path}_indexes")), data: SeriesTree_Addrs_Data::new(client.clone(), format!("{base_path}_data")), - funded: AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern3::new( - client.clone(), - "addr_count".to_string(), - ), - empty: AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern3::new( - client.clone(), - "empty_addr_count".to_string(), - ), - activity: SeriesTree_Addrs_Activity::new( - client.clone(), - format!("{base_path}_activity"), - ), - total: AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern3::new( - client.clone(), - "total_addr_count".to_string(), - ), + funded: AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern3::new(client.clone(), "addr_count".to_string()), + empty: AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern3::new(client.clone(), "empty_addr_count".to_string()), + activity: SeriesTree_Addrs_Activity::new(client.clone(), format!("{base_path}_activity")), + total: AllP2aP2pk33P2pk65P2pkhP2shP2trP2wpkhP2wshPattern3::new(client.clone(), "total_addr_count".to_string()), new: SeriesTree_Addrs_New::new(client.clone(), format!("{base_path}_new")), delta: SeriesTree_Addrs_Delta::new(client.clone(), format!("{base_path}_delta")), } @@ -5258,10 +3780,7 @@ pub struct SeriesTree_Addrs_Raw_P2pk65 { impl SeriesTree_Addrs_Raw_P2pk65 { pub fn new(client: Arc, base_path: String) -> Self { Self { - first_index: SeriesPattern18::new( - client.clone(), - "first_p2pk65_addr_index".to_string(), - ), + first_index: SeriesPattern18::new(client.clone(), "first_p2pk65_addr_index".to_string()), bytes: SeriesPattern27::new(client.clone(), "p2pk65_bytes".to_string()), } } @@ -5276,10 +3795,7 @@ pub struct SeriesTree_Addrs_Raw_P2pk33 { impl SeriesTree_Addrs_Raw_P2pk33 { pub fn new(client: Arc, base_path: String) -> Self { Self { - first_index: SeriesPattern18::new( - client.clone(), - "first_p2pk33_addr_index".to_string(), - ), + first_index: SeriesPattern18::new(client.clone(), "first_p2pk33_addr_index".to_string()), bytes: SeriesPattern26::new(client.clone(), "p2pk33_bytes".to_string()), } } @@ -5324,10 +3840,7 @@ pub struct SeriesTree_Addrs_Raw_P2wpkh { impl SeriesTree_Addrs_Raw_P2wpkh { pub fn new(client: Arc, base_path: String) -> Self { Self { - first_index: SeriesPattern18::new( - client.clone(), - "first_p2wpkh_addr_index".to_string(), - ), + first_index: SeriesPattern18::new(client.clone(), "first_p2wpkh_addr_index".to_string()), bytes: SeriesPattern31::new(client.clone(), "p2wpkh_bytes".to_string()), } } @@ -5440,42 +3953,15 @@ pub struct SeriesTree_Addrs_Activity { impl SeriesTree_Addrs_Activity { pub fn new(client: Arc, base_path: String) -> Self { Self { - all: BothReactivatedReceivingSendingPattern::new( - client.clone(), - "addr_activity".to_string(), - ), - p2pk65: BothReactivatedReceivingSendingPattern::new( - client.clone(), - "p2pk65_addr_activity".to_string(), - ), - p2pk33: BothReactivatedReceivingSendingPattern::new( - client.clone(), - "p2pk33_addr_activity".to_string(), - ), - p2pkh: BothReactivatedReceivingSendingPattern::new( - client.clone(), - "p2pkh_addr_activity".to_string(), - ), - p2sh: BothReactivatedReceivingSendingPattern::new( - client.clone(), - "p2sh_addr_activity".to_string(), - ), - p2wpkh: BothReactivatedReceivingSendingPattern::new( - client.clone(), - "p2wpkh_addr_activity".to_string(), - ), - p2wsh: BothReactivatedReceivingSendingPattern::new( - client.clone(), - "p2wsh_addr_activity".to_string(), - ), - p2tr: BothReactivatedReceivingSendingPattern::new( - client.clone(), - "p2tr_addr_activity".to_string(), - ), - p2a: BothReactivatedReceivingSendingPattern::new( - client.clone(), - "p2a_addr_activity".to_string(), - ), + all: BothReactivatedReceivingSendingPattern::new(client.clone(), "addr_activity".to_string()), + p2pk65: BothReactivatedReceivingSendingPattern::new(client.clone(), "p2pk65_addr_activity".to_string()), + p2pk33: BothReactivatedReceivingSendingPattern::new(client.clone(), "p2pk33_addr_activity".to_string()), + p2pkh: BothReactivatedReceivingSendingPattern::new(client.clone(), "p2pkh_addr_activity".to_string()), + p2sh: BothReactivatedReceivingSendingPattern::new(client.clone(), "p2sh_addr_activity".to_string()), + p2wpkh: BothReactivatedReceivingSendingPattern::new(client.clone(), "p2wpkh_addr_activity".to_string()), + p2wsh: BothReactivatedReceivingSendingPattern::new(client.clone(), "p2wsh_addr_activity".to_string()), + p2tr: BothReactivatedReceivingSendingPattern::new(client.clone(), "p2tr_addr_activity".to_string()), + p2a: BothReactivatedReceivingSendingPattern::new(client.clone(), "p2a_addr_activity".to_string()), } } } @@ -5496,42 +3982,15 @@ pub struct SeriesTree_Addrs_New { impl SeriesTree_Addrs_New { pub fn new(client: Arc, base_path: String) -> Self { Self { - all: AverageBlockCumulativeSumPattern::new( - client.clone(), - "new_addr_count".to_string(), - ), - p2pk65: AverageBlockCumulativeSumPattern::new( - client.clone(), - "p2pk65_new_addr_count".to_string(), - ), - p2pk33: AverageBlockCumulativeSumPattern::new( - client.clone(), - "p2pk33_new_addr_count".to_string(), - ), - p2pkh: AverageBlockCumulativeSumPattern::new( - client.clone(), - "p2pkh_new_addr_count".to_string(), - ), - p2sh: AverageBlockCumulativeSumPattern::new( - client.clone(), - "p2sh_new_addr_count".to_string(), - ), - p2wpkh: AverageBlockCumulativeSumPattern::new( - client.clone(), - "p2wpkh_new_addr_count".to_string(), - ), - p2wsh: AverageBlockCumulativeSumPattern::new( - client.clone(), - "p2wsh_new_addr_count".to_string(), - ), - p2tr: AverageBlockCumulativeSumPattern::new( - client.clone(), - "p2tr_new_addr_count".to_string(), - ), - p2a: AverageBlockCumulativeSumPattern::new( - client.clone(), - "p2a_new_addr_count".to_string(), - ), + all: AverageBlockCumulativeSumPattern::new(client.clone(), "new_addr_count".to_string()), + p2pk65: AverageBlockCumulativeSumPattern::new(client.clone(), "p2pk65_new_addr_count".to_string()), + p2pk33: AverageBlockCumulativeSumPattern::new(client.clone(), "p2pk33_new_addr_count".to_string()), + p2pkh: AverageBlockCumulativeSumPattern::new(client.clone(), "p2pkh_new_addr_count".to_string()), + p2sh: AverageBlockCumulativeSumPattern::new(client.clone(), "p2sh_new_addr_count".to_string()), + p2wpkh: AverageBlockCumulativeSumPattern::new(client.clone(), "p2wpkh_new_addr_count".to_string()), + p2wsh: AverageBlockCumulativeSumPattern::new(client.clone(), "p2wsh_new_addr_count".to_string()), + p2tr: AverageBlockCumulativeSumPattern::new(client.clone(), "p2tr_new_addr_count".to_string()), + p2a: AverageBlockCumulativeSumPattern::new(client.clone(), "p2a_new_addr_count".to_string()), } } } @@ -5594,15 +4053,9 @@ impl SeriesTree_Scripts_Raw { pub fn new(client: Arc, base_path: String) -> Self { Self { empty: SeriesTree_Scripts_Raw_Empty::new(client.clone(), format!("{base_path}_empty")), - op_return: SeriesTree_Scripts_Raw_OpReturn::new( - client.clone(), - format!("{base_path}_op_return"), - ), + op_return: SeriesTree_Scripts_Raw_OpReturn::new(client.clone(), format!("{base_path}_op_return")), p2ms: SeriesTree_Scripts_Raw_P2ms::new(client.clone(), format!("{base_path}_p2ms")), - unknown: SeriesTree_Scripts_Raw_Unknown::new( - client.clone(), - format!("{base_path}_unknown"), - ), + unknown: SeriesTree_Scripts_Raw_Unknown::new(client.clone(), format!("{base_path}_unknown")), } } } @@ -5616,10 +4069,7 @@ pub struct SeriesTree_Scripts_Raw_Empty { impl SeriesTree_Scripts_Raw_Empty { pub fn new(client: Arc, base_path: String) -> Self { Self { - first_index: SeriesPattern18::new( - client.clone(), - "first_empty_output_index".to_string(), - ), + first_index: SeriesPattern18::new(client.clone(), "first_empty_output_index".to_string()), to_tx_index: SeriesPattern22::new(client.clone(), "tx_index".to_string()), } } @@ -5649,10 +4099,7 @@ pub struct SeriesTree_Scripts_Raw_P2ms { impl SeriesTree_Scripts_Raw_P2ms { pub fn new(client: Arc, base_path: String) -> Self { Self { - first_index: SeriesPattern18::new( - client.clone(), - "first_p2ms_output_index".to_string(), - ), + first_index: SeriesPattern18::new(client.clone(), "first_p2ms_output_index".to_string()), to_tx_index: SeriesPattern25::new(client.clone(), "tx_index".to_string()), } } @@ -5667,10 +4114,7 @@ pub struct SeriesTree_Scripts_Raw_Unknown { impl SeriesTree_Scripts_Raw_Unknown { pub fn new(client: Arc, base_path: String) -> Self { Self { - first_index: SeriesPattern18::new( - client.clone(), - "first_unknown_output_index".to_string(), - ), + first_index: SeriesPattern18::new(client.clone(), "first_unknown_output_index".to_string()), to_tx_index: SeriesPattern33::new(client.clone(), "tx_index".to_string()), } } @@ -5697,34 +4141,16 @@ impl SeriesTree_Scripts_Count { Self { p2a: AverageBlockCumulativeSumPattern::new(client.clone(), "p2a_count".to_string()), p2ms: AverageBlockCumulativeSumPattern::new(client.clone(), "p2ms_count".to_string()), - p2pk33: AverageBlockCumulativeSumPattern::new( - client.clone(), - "p2pk33_count".to_string(), - ), - p2pk65: AverageBlockCumulativeSumPattern::new( - client.clone(), - "p2pk65_count".to_string(), - ), + p2pk33: AverageBlockCumulativeSumPattern::new(client.clone(), "p2pk33_count".to_string()), + p2pk65: AverageBlockCumulativeSumPattern::new(client.clone(), "p2pk65_count".to_string()), p2pkh: AverageBlockCumulativeSumPattern::new(client.clone(), "p2pkh_count".to_string()), p2sh: AverageBlockCumulativeSumPattern::new(client.clone(), "p2sh_count".to_string()), p2tr: AverageBlockCumulativeSumPattern::new(client.clone(), "p2tr_count".to_string()), - p2wpkh: AverageBlockCumulativeSumPattern::new( - client.clone(), - "p2wpkh_count".to_string(), - ), + p2wpkh: AverageBlockCumulativeSumPattern::new(client.clone(), "p2wpkh_count".to_string()), p2wsh: AverageBlockCumulativeSumPattern::new(client.clone(), "p2wsh_count".to_string()), - op_return: AverageBlockCumulativeSumPattern::new( - client.clone(), - "op_return_count".to_string(), - ), - empty_output: AverageBlockCumulativeSumPattern::new( - client.clone(), - "empty_output_count".to_string(), - ), - unknown_output: AverageBlockCumulativeSumPattern::new( - client.clone(), - "unknown_output_count".to_string(), - ), + op_return: AverageBlockCumulativeSumPattern::new(client.clone(), "op_return_count".to_string()), + empty_output: AverageBlockCumulativeSumPattern::new(client.clone(), "empty_output_count".to_string()), + unknown_output: AverageBlockCumulativeSumPattern::new(client.clone(), "unknown_output_count".to_string()), } } } @@ -5752,10 +4178,7 @@ impl SeriesTree_Mining { pub fn new(client: Arc, base_path: String) -> Self { Self { rewards: SeriesTree_Mining_Rewards::new(client.clone(), format!("{base_path}_rewards")), - hashrate: SeriesTree_Mining_Hashrate::new( - client.clone(), - format!("{base_path}_hashrate"), - ), + hashrate: SeriesTree_Mining_Hashrate::new(client.clone(), format!("{base_path}_hashrate")), } } } @@ -5772,14 +4195,8 @@ pub struct SeriesTree_Mining_Rewards { impl SeriesTree_Mining_Rewards { pub fn new(client: Arc, base_path: String) -> Self { Self { - coinbase: AverageBlockCumulativeSumPattern3::new( - client.clone(), - "coinbase".to_string(), - ), - subsidy: SeriesTree_Mining_Rewards_Subsidy::new( - client.clone(), - format!("{base_path}_subsidy"), - ), + coinbase: AverageBlockCumulativeSumPattern3::new(client.clone(), "coinbase".to_string()), + subsidy: SeriesTree_Mining_Rewards_Subsidy::new(client.clone(), format!("{base_path}_subsidy")), fees: SeriesTree_Mining_Rewards_Fees::new(client.clone(), format!("{base_path}_fees")), output_volume: SeriesPattern18::new(client.clone(), "output_volume".to_string()), unclaimed: BlockCumulativePattern::new(client.clone(), "unclaimed_rewards".to_string()), @@ -5800,16 +4217,10 @@ impl SeriesTree_Mining_Rewards_Subsidy { pub fn new(client: Arc, base_path: String) -> Self { Self { block: BtcCentsSatsUsdPattern2::new(client.clone(), "subsidy".to_string()), - cumulative: BtcCentsSatsUsdPattern3::new( - client.clone(), - "subsidy_cumulative".to_string(), - ), + cumulative: BtcCentsSatsUsdPattern3::new(client.clone(), "subsidy_cumulative".to_string()), sum: _1m1w1y24hPattern4::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(), - ), + dominance: _1m1w1y24hBpsPercentRatioPattern::new(client.clone(), "subsidy_dominance".to_string()), } } } @@ -5845,14 +4256,8 @@ impl SeriesTree_Mining_Rewards_Fees { median: _1m1w1y24hPattern4::new(client.clone(), "fees_median".to_string()), pct75: _1m1w1y24hPattern4::new(client.clone(), "fees_pct75".to_string()), pct90: _1m1w1y24hPattern4::new(client.clone(), "fees_pct90".to_string()), - dominance: _1m1w1y24hBpsPercentRatioPattern::new( - client.clone(), - "fee_dominance".to_string(), - ), - to_subsidy_ratio: SeriesTree_Mining_Rewards_Fees_ToSubsidyRatio::new( - client.clone(), - format!("{base_path}_to_subsidy_ratio"), - ), + dominance: _1m1w1y24hBpsPercentRatioPattern::new(client.clone(), "fee_dominance".to_string()), + to_subsidy_ratio: SeriesTree_Mining_Rewards_Fees_ToSubsidyRatio::new(client.clone(), format!("{base_path}_to_subsidy_ratio")), } } } @@ -5905,15 +4310,9 @@ impl SeriesTree_Mining_Hashrate_Rate { pub fn new(client: Arc, base_path: String) -> Self { Self { base: SeriesPattern1::new(client.clone(), "hash_rate".to_string()), - sma: SeriesTree_Mining_Hashrate_Rate_Sma::new( - client.clone(), - format!("{base_path}_sma"), - ), + sma: SeriesTree_Mining_Hashrate_Rate_Sma::new(client.clone(), format!("{base_path}_sma")), ath: SeriesPattern1::new(client.clone(), "hash_rate_ath".to_string()), - drawdown: BpsPercentRatioPattern5::new( - client.clone(), - "hash_rate_drawdown".to_string(), - ), + drawdown: BpsPercentRatioPattern5::new(client.clone(), "hash_rate_drawdown".to_string()), } } } @@ -5951,22 +4350,13 @@ pub struct SeriesTree_Cointime { impl SeriesTree_Cointime { pub fn new(client: Arc, base_path: String) -> Self { Self { - activity: SeriesTree_Cointime_Activity::new( - client.clone(), - format!("{base_path}_activity"), - ), + activity: SeriesTree_Cointime_Activity::new(client.clone(), format!("{base_path}_activity")), supply: SeriesTree_Cointime_Supply::new(client.clone(), format!("{base_path}_supply")), value: SeriesTree_Cointime_Value::new(client.clone(), format!("{base_path}_value")), cap: SeriesTree_Cointime_Cap::new(client.clone(), format!("{base_path}_cap")), prices: SeriesTree_Cointime_Prices::new(client.clone(), format!("{base_path}_prices")), - adjusted: SeriesTree_Cointime_Adjusted::new( - client.clone(), - format!("{base_path}_adjusted"), - ), - reserve_risk: SeriesTree_Cointime_ReserveRisk::new( - client.clone(), - format!("{base_path}_reserve_risk"), - ), + adjusted: SeriesTree_Cointime_Adjusted::new(client.clone(), format!("{base_path}_adjusted")), + reserve_risk: SeriesTree_Cointime_ReserveRisk::new(client.clone(), format!("{base_path}_reserve_risk")), } } } @@ -5984,21 +4374,12 @@ pub struct SeriesTree_Cointime_Activity { impl SeriesTree_Cointime_Activity { pub fn new(client: Arc, base_path: String) -> Self { Self { - coinblocks_created: AverageBlockCumulativeSumPattern::new( - client.clone(), - "coinblocks_created".to_string(), - ), - coinblocks_stored: AverageBlockCumulativeSumPattern::new( - client.clone(), - "coinblocks_stored".to_string(), - ), + coinblocks_created: AverageBlockCumulativeSumPattern::new(client.clone(), "coinblocks_created".to_string()), + coinblocks_stored: AverageBlockCumulativeSumPattern::new(client.clone(), "coinblocks_stored".to_string()), liveliness: SeriesPattern1::new(client.clone(), "liveliness".to_string()), vaultedness: SeriesPattern1::new(client.clone(), "vaultedness".to_string()), ratio: SeriesPattern1::new(client.clone(), "activity_to_vaultedness".to_string()), - coinblocks_destroyed: AverageBlockCumulativeSumPattern::new( - client.clone(), - "coinblocks_destroyed".to_string(), - ), + coinblocks_destroyed: AverageBlockCumulativeSumPattern::new(client.clone(), "coinblocks_destroyed".to_string()), } } } @@ -6029,18 +4410,9 @@ pub struct SeriesTree_Cointime_Value { impl SeriesTree_Cointime_Value { pub fn new(client: Arc, base_path: String) -> Self { Self { - destroyed: AverageBlockCumulativeSumPattern::new( - client.clone(), - "cointime_value_destroyed".to_string(), - ), - created: AverageBlockCumulativeSumPattern::new( - client.clone(), - "cointime_value_created".to_string(), - ), - stored: AverageBlockCumulativeSumPattern::new( - client.clone(), - "cointime_value_stored".to_string(), - ), + destroyed: AverageBlockCumulativeSumPattern::new(client.clone(), "cointime_value_destroyed".to_string()), + created: AverageBlockCumulativeSumPattern::new(client.clone(), "cointime_value_created".to_string()), + stored: AverageBlockCumulativeSumPattern::new(client.clone(), "cointime_value_stored".to_string()), vocdd: AverageBlockCumulativeSumPattern::new(client.clone(), "vocdd".to_string()), } } @@ -6080,22 +4452,10 @@ pub struct SeriesTree_Cointime_Prices { impl SeriesTree_Cointime_Prices { pub fn new(client: Arc, base_path: String) -> Self { Self { - vaulted: BpsCentsPercentilesRatioSatsUsdPattern::new( - client.clone(), - "vaulted_price".to_string(), - ), - active: BpsCentsPercentilesRatioSatsUsdPattern::new( - client.clone(), - "active_price".to_string(), - ), - true_market_mean: BpsCentsPercentilesRatioSatsUsdPattern::new( - client.clone(), - "true_market_mean".to_string(), - ), - cointime: BpsCentsPercentilesRatioSatsUsdPattern::new( - client.clone(), - "cointime_price".to_string(), - ), + vaulted: BpsCentsPercentilesRatioSatsUsdPattern::new(client.clone(), "vaulted_price".to_string()), + active: BpsCentsPercentilesRatioSatsUsdPattern::new(client.clone(), "active_price".to_string()), + true_market_mean: BpsCentsPercentilesRatioSatsUsdPattern::new(client.clone(), "true_market_mean".to_string()), + cointime: BpsCentsPercentilesRatioSatsUsdPattern::new(client.clone(), "cointime_price".to_string()), } } } @@ -6110,18 +4470,9 @@ pub struct SeriesTree_Cointime_Adjusted { impl SeriesTree_Cointime_Adjusted { pub fn new(client: Arc, base_path: String) -> Self { Self { - inflation_rate: BpsPercentRatioPattern::new( - client.clone(), - "cointime_adj_inflation_rate".to_string(), - ), - tx_velocity_native: SeriesPattern1::new( - client.clone(), - "cointime_adj_tx_velocity_btc".to_string(), - ), - tx_velocity_fiat: SeriesPattern1::new( - client.clone(), - "cointime_adj_tx_velocity_usd".to_string(), - ), + inflation_rate: BpsPercentRatioPattern::new(client.clone(), "cointime_adj_inflation_rate".to_string()), + tx_velocity_native: SeriesPattern1::new(client.clone(), "cointime_adj_tx_velocity_btc".to_string()), + tx_velocity_fiat: SeriesPattern1::new(client.clone(), "cointime_adj_tx_velocity_usd".to_string()), } } } @@ -6221,18 +4572,9 @@ impl SeriesTree_Indexes { addr: SeriesTree_Indexes_Addr::new(client.clone(), format!("{base_path}_addr")), height: SeriesTree_Indexes_Height::new(client.clone(), format!("{base_path}_height")), epoch: SeriesTree_Indexes_Epoch::new(client.clone(), format!("{base_path}_epoch")), - halving: SeriesTree_Indexes_Halving::new( - client.clone(), - format!("{base_path}_halving"), - ), - minute10: SeriesTree_Indexes_Minute10::new( - client.clone(), - format!("{base_path}_minute10"), - ), - minute30: SeriesTree_Indexes_Minute30::new( - client.clone(), - format!("{base_path}_minute30"), - ), + halving: SeriesTree_Indexes_Halving::new(client.clone(), format!("{base_path}_halving")), + minute10: SeriesTree_Indexes_Minute10::new(client.clone(), format!("{base_path}_minute10")), + minute30: SeriesTree_Indexes_Minute30::new(client.clone(), format!("{base_path}_minute30")), hour1: SeriesTree_Indexes_Hour1::new(client.clone(), format!("{base_path}_hour1")), hour4: SeriesTree_Indexes_Hour4::new(client.clone(), format!("{base_path}_hour4")), hour12: SeriesTree_Indexes_Hour12::new(client.clone(), format!("{base_path}_hour12")), @@ -6244,22 +4586,10 @@ impl SeriesTree_Indexes { month6: SeriesTree_Indexes_Month6::new(client.clone(), format!("{base_path}_month6")), year1: SeriesTree_Indexes_Year1::new(client.clone(), format!("{base_path}_year1")), year10: SeriesTree_Indexes_Year10::new(client.clone(), format!("{base_path}_year10")), - tx_index: SeriesTree_Indexes_TxIndex::new( - client.clone(), - format!("{base_path}_tx_index"), - ), - txin_index: SeriesTree_Indexes_TxinIndex::new( - client.clone(), - format!("{base_path}_txin_index"), - ), - txout_index: SeriesTree_Indexes_TxoutIndex::new( - client.clone(), - format!("{base_path}_txout_index"), - ), - timestamp: SeriesTree_Indexes_Timestamp::new( - client.clone(), - format!("{base_path}_timestamp"), - ), + tx_index: SeriesTree_Indexes_TxIndex::new(client.clone(), format!("{base_path}_tx_index")), + txin_index: SeriesTree_Indexes_TxinIndex::new(client.clone(), format!("{base_path}_txin_index")), + txout_index: SeriesTree_Indexes_TxoutIndex::new(client.clone(), format!("{base_path}_txout_index")), + timestamp: SeriesTree_Indexes_Timestamp::new(client.clone(), format!("{base_path}_timestamp")), } } } @@ -6283,33 +4613,18 @@ pub struct SeriesTree_Indexes_Addr { impl SeriesTree_Indexes_Addr { pub fn new(client: Arc, base_path: String) -> Self { Self { - p2pk33: SeriesTree_Indexes_Addr_P2pk33::new( - client.clone(), - format!("{base_path}_p2pk33"), - ), - p2pk65: SeriesTree_Indexes_Addr_P2pk65::new( - client.clone(), - format!("{base_path}_p2pk65"), - ), + p2pk33: SeriesTree_Indexes_Addr_P2pk33::new(client.clone(), format!("{base_path}_p2pk33")), + p2pk65: SeriesTree_Indexes_Addr_P2pk65::new(client.clone(), format!("{base_path}_p2pk65")), p2pkh: SeriesTree_Indexes_Addr_P2pkh::new(client.clone(), format!("{base_path}_p2pkh")), p2sh: SeriesTree_Indexes_Addr_P2sh::new(client.clone(), format!("{base_path}_p2sh")), p2tr: SeriesTree_Indexes_Addr_P2tr::new(client.clone(), format!("{base_path}_p2tr")), - p2wpkh: SeriesTree_Indexes_Addr_P2wpkh::new( - client.clone(), - format!("{base_path}_p2wpkh"), - ), + p2wpkh: SeriesTree_Indexes_Addr_P2wpkh::new(client.clone(), format!("{base_path}_p2wpkh")), p2wsh: SeriesTree_Indexes_Addr_P2wsh::new(client.clone(), format!("{base_path}_p2wsh")), p2a: SeriesTree_Indexes_Addr_P2a::new(client.clone(), format!("{base_path}_p2a")), p2ms: SeriesTree_Indexes_Addr_P2ms::new(client.clone(), format!("{base_path}_p2ms")), empty: SeriesTree_Indexes_Addr_Empty::new(client.clone(), format!("{base_path}_empty")), - unknown: SeriesTree_Indexes_Addr_Unknown::new( - client.clone(), - format!("{base_path}_unknown"), - ), - op_return: SeriesTree_Indexes_Addr_OpReturn::new( - client.clone(), - format!("{base_path}_op_return"), - ), + unknown: SeriesTree_Indexes_Addr_Unknown::new(client.clone(), format!("{base_path}_unknown")), + op_return: SeriesTree_Indexes_Addr_OpReturn::new(client.clone(), format!("{base_path}_op_return")), } } } @@ -6854,28 +5169,13 @@ impl SeriesTree_Indicators { nvt: BpsRatioPattern2::new(client.clone(), "nvt".to_string()), gini: BpsPercentRatioPattern3::new(client.clone(), "gini".to_string()), rhodl_ratio: BpsRatioPattern2::new(client.clone(), "rhodl_ratio".to_string()), - thermo_cap_multiple: BpsRatioPattern2::new( - client.clone(), - "thermo_cap_multiple".to_string(), - ), - coindays_destroyed_supply_adjusted: SeriesPattern1::new( - client.clone(), - "coindays_destroyed_supply_adjusted".to_string(), - ), - coinyears_destroyed_supply_adjusted: SeriesPattern1::new( - client.clone(), - "coinyears_destroyed_supply_adjusted".to_string(), - ), - dormancy: SeriesTree_Indicators_Dormancy::new( - client.clone(), - format!("{base_path}_dormancy"), - ), + thermo_cap_multiple: BpsRatioPattern2::new(client.clone(), "thermo_cap_multiple".to_string()), + coindays_destroyed_supply_adjusted: SeriesPattern1::new(client.clone(), "coindays_destroyed_supply_adjusted".to_string()), + coinyears_destroyed_supply_adjusted: SeriesPattern1::new(client.clone(), "coinyears_destroyed_supply_adjusted".to_string()), + dormancy: SeriesTree_Indicators_Dormancy::new(client.clone(), format!("{base_path}_dormancy")), stock_to_flow: SeriesPattern1::new(client.clone(), "stock_to_flow".to_string()), seller_exhaustion: SeriesPattern1::new(client.clone(), "seller_exhaustion".to_string()), - realized_envelope: SeriesTree_Indicators_RealizedEnvelope::new( - client.clone(), - format!("{base_path}_realized_envelope"), - ), + realized_envelope: SeriesTree_Indicators_RealizedEnvelope::new(client.clone(), format!("{base_path}_realized_envelope")), } } } @@ -6889,10 +5189,7 @@ pub struct SeriesTree_Indicators_Dormancy { impl SeriesTree_Indicators_Dormancy { pub fn new(client: Arc, base_path: String) -> Self { Self { - supply_adjusted: SeriesPattern1::new( - client.clone(), - "dormancy_supply_adjusted".to_string(), - ), + supply_adjusted: SeriesPattern1::new(client.clone(), "dormancy_supply_adjusted".to_string()), flow: SeriesPattern1::new(client.clone(), "dormancy_flow".to_string()), } } @@ -6915,20 +5212,14 @@ pub struct SeriesTree_Indicators_RealizedEnvelope { impl SeriesTree_Indicators_RealizedEnvelope { pub fn new(client: Arc, base_path: String) -> Self { Self { - pct0_5: CentsSatsUsdPattern::new( - client.clone(), - "realized_envelope_pct0_5".to_string(), - ), + pct0_5: CentsSatsUsdPattern::new(client.clone(), "realized_envelope_pct0_5".to_string()), pct1: CentsSatsUsdPattern::new(client.clone(), "realized_envelope_pct01".to_string()), pct2: CentsSatsUsdPattern::new(client.clone(), "realized_envelope_pct02".to_string()), pct5: CentsSatsUsdPattern::new(client.clone(), "realized_envelope_pct05".to_string()), pct95: CentsSatsUsdPattern::new(client.clone(), "realized_envelope_pct95".to_string()), pct98: CentsSatsUsdPattern::new(client.clone(), "realized_envelope_pct98".to_string()), pct99: CentsSatsUsdPattern::new(client.clone(), "realized_envelope_pct99".to_string()), - pct99_5: CentsSatsUsdPattern::new( - client.clone(), - "realized_envelope_pct99_5".to_string(), - ), + pct99_5: CentsSatsUsdPattern::new(client.clone(), "realized_envelope_pct99_5".to_string()), index: SeriesPattern1::new(client.clone(), "realized_envelope_index".to_string()), score: SeriesPattern1::new(client.clone(), "realized_envelope_score".to_string()), } @@ -6965,27 +5256,12 @@ pub struct SeriesTree_Investing_Period { impl SeriesTree_Investing_Period { pub fn new(client: Arc, base_path: String) -> Self { Self { - dca_stack: _10y1m1w1y2y3m3y4y5y6m6y8yPattern3::new( - client.clone(), - "dca_stack".to_string(), - ), - dca_cost_basis: SeriesTree_Investing_Period_DcaCostBasis::new( - client.clone(), - format!("{base_path}_dca_cost_basis"), - ), - dca_return: _10y1m1w1y2y3m3y4y5y6m6y8yPattern2::new( - client.clone(), - "dca_return".to_string(), - ), + dca_stack: _10y1m1w1y2y3m3y4y5y6m6y8yPattern3::new(client.clone(), "dca_stack".to_string()), + dca_cost_basis: SeriesTree_Investing_Period_DcaCostBasis::new(client.clone(), format!("{base_path}_dca_cost_basis")), + dca_return: _10y1m1w1y2y3m3y4y5y6m6y8yPattern2::new(client.clone(), "dca_return".to_string()), dca_cagr: _10y2y3y4y5y6y8yPattern::new(client.clone(), "dca_cagr".to_string()), - lump_sum_stack: _10y1m1w1y2y3m3y4y5y6m6y8yPattern3::new( - client.clone(), - "lump_sum_stack".to_string(), - ), - lump_sum_return: _10y1m1w1y2y3m3y4y5y6m6y8yPattern2::new( - client.clone(), - "lump_sum_return".to_string(), - ), + lump_sum_stack: _10y1m1w1y2y3m3y4y5y6m6y8yPattern3::new(client.clone(), "lump_sum_stack".to_string()), + lump_sum_return: _10y1m1w1y2y3m3y4y5y6m6y8yPattern2::new(client.clone(), "lump_sum_return".to_string()), } } } @@ -7035,18 +5311,9 @@ pub struct SeriesTree_Investing_Class { impl SeriesTree_Investing_Class { pub fn new(client: Arc, base_path: String) -> Self { Self { - dca_stack: SeriesTree_Investing_Class_DcaStack::new( - client.clone(), - format!("{base_path}_dca_stack"), - ), - dca_cost_basis: SeriesTree_Investing_Class_DcaCostBasis::new( - client.clone(), - format!("{base_path}_dca_cost_basis"), - ), - dca_return: SeriesTree_Investing_Class_DcaReturn::new( - client.clone(), - format!("{base_path}_dca_return"), - ), + dca_stack: SeriesTree_Investing_Class_DcaStack::new(client.clone(), format!("{base_path}_dca_stack")), + dca_cost_basis: SeriesTree_Investing_Class_DcaCostBasis::new(client.clone(), format!("{base_path}_dca_cost_basis")), + dca_return: SeriesTree_Investing_Class_DcaReturn::new(client.clone(), format!("{base_path}_dca_return")), } } } @@ -7070,54 +5337,18 @@ pub struct SeriesTree_Investing_Class_DcaStack { impl SeriesTree_Investing_Class_DcaStack { pub fn new(client: Arc, base_path: String) -> Self { Self { - from_2015: BtcCentsSatsUsdPattern3::new( - client.clone(), - "dca_stack_from_2015".to_string(), - ), - from_2016: BtcCentsSatsUsdPattern3::new( - client.clone(), - "dca_stack_from_2016".to_string(), - ), - from_2017: BtcCentsSatsUsdPattern3::new( - client.clone(), - "dca_stack_from_2017".to_string(), - ), - from_2018: BtcCentsSatsUsdPattern3::new( - client.clone(), - "dca_stack_from_2018".to_string(), - ), - from_2019: BtcCentsSatsUsdPattern3::new( - client.clone(), - "dca_stack_from_2019".to_string(), - ), - from_2020: BtcCentsSatsUsdPattern3::new( - client.clone(), - "dca_stack_from_2020".to_string(), - ), - from_2021: BtcCentsSatsUsdPattern3::new( - client.clone(), - "dca_stack_from_2021".to_string(), - ), - from_2022: BtcCentsSatsUsdPattern3::new( - client.clone(), - "dca_stack_from_2022".to_string(), - ), - from_2023: BtcCentsSatsUsdPattern3::new( - client.clone(), - "dca_stack_from_2023".to_string(), - ), - from_2024: BtcCentsSatsUsdPattern3::new( - client.clone(), - "dca_stack_from_2024".to_string(), - ), - from_2025: BtcCentsSatsUsdPattern3::new( - client.clone(), - "dca_stack_from_2025".to_string(), - ), - from_2026: BtcCentsSatsUsdPattern3::new( - client.clone(), - "dca_stack_from_2026".to_string(), - ), + from_2015: BtcCentsSatsUsdPattern3::new(client.clone(), "dca_stack_from_2015".to_string()), + from_2016: BtcCentsSatsUsdPattern3::new(client.clone(), "dca_stack_from_2016".to_string()), + from_2017: BtcCentsSatsUsdPattern3::new(client.clone(), "dca_stack_from_2017".to_string()), + from_2018: BtcCentsSatsUsdPattern3::new(client.clone(), "dca_stack_from_2018".to_string()), + from_2019: BtcCentsSatsUsdPattern3::new(client.clone(), "dca_stack_from_2019".to_string()), + from_2020: BtcCentsSatsUsdPattern3::new(client.clone(), "dca_stack_from_2020".to_string()), + from_2021: BtcCentsSatsUsdPattern3::new(client.clone(), "dca_stack_from_2021".to_string()), + from_2022: BtcCentsSatsUsdPattern3::new(client.clone(), "dca_stack_from_2022".to_string()), + from_2023: BtcCentsSatsUsdPattern3::new(client.clone(), "dca_stack_from_2023".to_string()), + from_2024: BtcCentsSatsUsdPattern3::new(client.clone(), "dca_stack_from_2024".to_string()), + from_2025: BtcCentsSatsUsdPattern3::new(client.clone(), "dca_stack_from_2025".to_string()), + from_2026: BtcCentsSatsUsdPattern3::new(client.clone(), "dca_stack_from_2026".to_string()), } } } @@ -7141,54 +5372,18 @@ pub struct SeriesTree_Investing_Class_DcaCostBasis { impl SeriesTree_Investing_Class_DcaCostBasis { pub fn new(client: Arc, base_path: String) -> Self { Self { - from_2015: CentsSatsUsdPattern::new( - client.clone(), - "dca_cost_basis_from_2015".to_string(), - ), - from_2016: CentsSatsUsdPattern::new( - client.clone(), - "dca_cost_basis_from_2016".to_string(), - ), - from_2017: CentsSatsUsdPattern::new( - client.clone(), - "dca_cost_basis_from_2017".to_string(), - ), - from_2018: CentsSatsUsdPattern::new( - client.clone(), - "dca_cost_basis_from_2018".to_string(), - ), - from_2019: CentsSatsUsdPattern::new( - client.clone(), - "dca_cost_basis_from_2019".to_string(), - ), - from_2020: CentsSatsUsdPattern::new( - client.clone(), - "dca_cost_basis_from_2020".to_string(), - ), - from_2021: CentsSatsUsdPattern::new( - client.clone(), - "dca_cost_basis_from_2021".to_string(), - ), - from_2022: CentsSatsUsdPattern::new( - client.clone(), - "dca_cost_basis_from_2022".to_string(), - ), - from_2023: CentsSatsUsdPattern::new( - client.clone(), - "dca_cost_basis_from_2023".to_string(), - ), - from_2024: CentsSatsUsdPattern::new( - client.clone(), - "dca_cost_basis_from_2024".to_string(), - ), - from_2025: CentsSatsUsdPattern::new( - client.clone(), - "dca_cost_basis_from_2025".to_string(), - ), - from_2026: CentsSatsUsdPattern::new( - client.clone(), - "dca_cost_basis_from_2026".to_string(), - ), + from_2015: CentsSatsUsdPattern::new(client.clone(), "dca_cost_basis_from_2015".to_string()), + from_2016: CentsSatsUsdPattern::new(client.clone(), "dca_cost_basis_from_2016".to_string()), + from_2017: CentsSatsUsdPattern::new(client.clone(), "dca_cost_basis_from_2017".to_string()), + from_2018: CentsSatsUsdPattern::new(client.clone(), "dca_cost_basis_from_2018".to_string()), + from_2019: CentsSatsUsdPattern::new(client.clone(), "dca_cost_basis_from_2019".to_string()), + from_2020: CentsSatsUsdPattern::new(client.clone(), "dca_cost_basis_from_2020".to_string()), + from_2021: CentsSatsUsdPattern::new(client.clone(), "dca_cost_basis_from_2021".to_string()), + from_2022: CentsSatsUsdPattern::new(client.clone(), "dca_cost_basis_from_2022".to_string()), + from_2023: CentsSatsUsdPattern::new(client.clone(), "dca_cost_basis_from_2023".to_string()), + from_2024: CentsSatsUsdPattern::new(client.clone(), "dca_cost_basis_from_2024".to_string()), + from_2025: CentsSatsUsdPattern::new(client.clone(), "dca_cost_basis_from_2025".to_string()), + from_2026: CentsSatsUsdPattern::new(client.clone(), "dca_cost_basis_from_2026".to_string()), } } } @@ -7212,54 +5407,18 @@ pub struct SeriesTree_Investing_Class_DcaReturn { impl SeriesTree_Investing_Class_DcaReturn { pub fn new(client: Arc, base_path: String) -> Self { Self { - from_2015: BpsPercentRatioPattern::new( - client.clone(), - "dca_return_from_2015".to_string(), - ), - from_2016: BpsPercentRatioPattern::new( - client.clone(), - "dca_return_from_2016".to_string(), - ), - from_2017: BpsPercentRatioPattern::new( - client.clone(), - "dca_return_from_2017".to_string(), - ), - from_2018: BpsPercentRatioPattern::new( - client.clone(), - "dca_return_from_2018".to_string(), - ), - from_2019: BpsPercentRatioPattern::new( - client.clone(), - "dca_return_from_2019".to_string(), - ), - from_2020: BpsPercentRatioPattern::new( - client.clone(), - "dca_return_from_2020".to_string(), - ), - from_2021: BpsPercentRatioPattern::new( - client.clone(), - "dca_return_from_2021".to_string(), - ), - from_2022: BpsPercentRatioPattern::new( - client.clone(), - "dca_return_from_2022".to_string(), - ), - from_2023: BpsPercentRatioPattern::new( - client.clone(), - "dca_return_from_2023".to_string(), - ), - from_2024: BpsPercentRatioPattern::new( - client.clone(), - "dca_return_from_2024".to_string(), - ), - from_2025: BpsPercentRatioPattern::new( - client.clone(), - "dca_return_from_2025".to_string(), - ), - from_2026: BpsPercentRatioPattern::new( - client.clone(), - "dca_return_from_2026".to_string(), - ), + from_2015: BpsPercentRatioPattern::new(client.clone(), "dca_return_from_2015".to_string()), + from_2016: BpsPercentRatioPattern::new(client.clone(), "dca_return_from_2016".to_string()), + from_2017: BpsPercentRatioPattern::new(client.clone(), "dca_return_from_2017".to_string()), + from_2018: BpsPercentRatioPattern::new(client.clone(), "dca_return_from_2018".to_string()), + from_2019: BpsPercentRatioPattern::new(client.clone(), "dca_return_from_2019".to_string()), + from_2020: BpsPercentRatioPattern::new(client.clone(), "dca_return_from_2020".to_string()), + from_2021: BpsPercentRatioPattern::new(client.clone(), "dca_return_from_2021".to_string()), + from_2022: BpsPercentRatioPattern::new(client.clone(), "dca_return_from_2022".to_string()), + from_2023: BpsPercentRatioPattern::new(client.clone(), "dca_return_from_2023".to_string()), + from_2024: BpsPercentRatioPattern::new(client.clone(), "dca_return_from_2024".to_string()), + from_2025: BpsPercentRatioPattern::new(client.clone(), "dca_return_from_2025".to_string()), + from_2026: BpsPercentRatioPattern::new(client.clone(), "dca_return_from_2026".to_string()), } } } @@ -7279,21 +5438,12 @@ impl SeriesTree_Market { pub fn new(client: Arc, base_path: String) -> Self { Self { ath: SeriesTree_Market_Ath::new(client.clone(), format!("{base_path}_ath")), - lookback: SeriesTree_Market_Lookback::new( - client.clone(), - format!("{base_path}_lookback"), - ), + lookback: SeriesTree_Market_Lookback::new(client.clone(), format!("{base_path}_lookback")), returns: SeriesTree_Market_Returns::new(client.clone(), format!("{base_path}_returns")), volatility: _1m1w1y24hPattern::new(client.clone(), "price_volatility".to_string()), range: SeriesTree_Market_Range::new(client.clone(), format!("{base_path}_range")), - moving_average: SeriesTree_Market_MovingAverage::new( - client.clone(), - format!("{base_path}_moving_average"), - ), - technical: SeriesTree_Market_Technical::new( - client.clone(), - format!("{base_path}_technical"), - ), + moving_average: SeriesTree_Market_MovingAverage::new(client.clone(), format!("{base_path}_moving_average")), + technical: SeriesTree_Market_Technical::new(client.clone(), format!("{base_path}_technical")), } } } @@ -7315,14 +5465,8 @@ impl SeriesTree_Market_Ath { drawdown: BpsPercentRatioPattern5::new(client.clone(), "price_drawdown".to_string()), days_since: SeriesPattern1::new(client.clone(), "days_since_price_ath".to_string()), years_since: SeriesPattern1::new(client.clone(), "years_since_price_ath".to_string()), - max_days_between: SeriesPattern1::new( - client.clone(), - "max_days_between_price_ath".to_string(), - ), - max_years_between: SeriesPattern1::new( - client.clone(), - "max_years_between_price_ath".to_string(), - ), + max_days_between: SeriesPattern1::new(client.clone(), "max_days_between_price_ath".to_string()), + max_years_between: SeriesPattern1::new(client.clone(), "max_years_between_price_ath".to_string()), } } } @@ -7374,15 +5518,9 @@ pub struct SeriesTree_Market_Returns { impl SeriesTree_Market_Returns { pub fn new(client: Arc, base_path: String) -> Self { Self { - periods: SeriesTree_Market_Returns_Periods::new( - client.clone(), - format!("{base_path}_periods"), - ), + periods: SeriesTree_Market_Returns_Periods::new(client.clone(), format!("{base_path}_periods")), cagr: _10y2y3y4y5y6y8yPattern::new(client.clone(), "price_cagr".to_string()), - sd_24h: SeriesTree_Market_Returns_Sd24h::new( - client.clone(), - format!("{base_path}_sd_24h"), - ), + sd_24h: SeriesTree_Market_Returns_Sd24h::new(client.clone(), format!("{base_path}_sd_24h")), } } } @@ -7435,10 +5573,7 @@ pub struct SeriesTree_Market_Returns_Sd24h { impl SeriesTree_Market_Returns_Sd24h { pub fn new(client: Arc, base_path: String) -> Self { Self { - _24h: SeriesTree_Market_Returns_Sd24h_24h::new( - client.clone(), - format!("{base_path}_24h"), - ), + _24h: SeriesTree_Market_Returns_Sd24h_24h::new(client.clone(), format!("{base_path}_24h")), _1w: SeriesTree_Market_Returns_Sd24h_1w::new(client.clone(), format!("{base_path}_1w")), _1m: SeriesTree_Market_Returns_Sd24h_1m::new(client.clone(), format!("{base_path}_1m")), _1y: SeriesTree_Market_Returns_Sd24h_1y::new(client.clone(), format!("{base_path}_1y")), @@ -7521,14 +5656,8 @@ impl SeriesTree_Market_Range { min: _1m1w1y2wPattern::new(client.clone(), "price_min".to_string()), max: _1m1w1y2wPattern::new(client.clone(), "price_max".to_string()), true_range: SeriesPattern1::new(client.clone(), "price_true_range".to_string()), - true_range_sum_2w: SeriesPattern1::new( - client.clone(), - "price_true_range_sum_2w".to_string(), - ), - choppiness_index_2w: BpsPercentRatioPattern3::new( - client.clone(), - "price_choppiness_index_2w".to_string(), - ), + true_range_sum_2w: SeriesPattern1::new(client.clone(), "price_true_range_sum_2w".to_string()), + choppiness_index_2w: BpsPercentRatioPattern3::new(client.clone(), "price_choppiness_index_2w".to_string()), } } } @@ -7542,14 +5671,8 @@ pub struct SeriesTree_Market_MovingAverage { impl SeriesTree_Market_MovingAverage { pub fn new(client: Arc, base_path: String) -> Self { Self { - sma: SeriesTree_Market_MovingAverage_Sma::new( - client.clone(), - format!("{base_path}_sma"), - ), - ema: SeriesTree_Market_MovingAverage_Ema::new( - client.clone(), - format!("{base_path}_ema"), - ), + sma: SeriesTree_Market_MovingAverage_Sma::new(client.clone(), format!("{base_path}_sma")), + ema: SeriesTree_Market_MovingAverage_Ema::new(client.clone(), format!("{base_path}_ema")), } } } @@ -7587,14 +5710,8 @@ impl SeriesTree_Market_MovingAverage_Sma { _89d: BpsCentsRatioSatsUsdPattern::new(client.clone(), "price_sma_89d".to_string()), _111d: BpsCentsRatioSatsUsdPattern::new(client.clone(), "price_sma_111d".to_string()), _144d: BpsCentsRatioSatsUsdPattern::new(client.clone(), "price_sma_144d".to_string()), - _200d: SeriesTree_Market_MovingAverage_Sma_200d::new( - client.clone(), - format!("{base_path}_200d"), - ), - _350d: SeriesTree_Market_MovingAverage_Sma_350d::new( - client.clone(), - format!("{base_path}_350d"), - ), + _200d: SeriesTree_Market_MovingAverage_Sma_200d::new(client.clone(), format!("{base_path}_200d")), + _350d: SeriesTree_Market_MovingAverage_Sma_350d::new(client.clone(), format!("{base_path}_350d")), _1y: BpsCentsRatioSatsUsdPattern::new(client.clone(), "price_sma_1y".to_string()), _2y: BpsCentsRatioSatsUsdPattern::new(client.clone(), "price_sma_2y".to_string()), _200w: BpsCentsRatioSatsUsdPattern::new(client.clone(), "price_sma_200w".to_string()), @@ -7706,10 +5823,7 @@ impl SeriesTree_Market_Technical { Self { rsi: SeriesTree_Market_Technical_Rsi::new(client.clone(), format!("{base_path}_rsi")), pi_cycle: BpsRatioPattern2::new(client.clone(), "pi_cycle".to_string()), - macd: SeriesTree_Market_Technical_Macd::new( - client.clone(), - format!("{base_path}_macd"), - ), + macd: SeriesTree_Market_Technical_Macd::new(client.clone(), format!("{base_path}_macd")), } } } @@ -7741,18 +5855,9 @@ pub struct SeriesTree_Market_Technical_Macd { impl SeriesTree_Market_Technical_Macd { pub fn new(client: Arc, base_path: String) -> Self { Self { - _24h: SeriesTree_Market_Technical_Macd_24h::new( - client.clone(), - format!("{base_path}_24h"), - ), - _1w: SeriesTree_Market_Technical_Macd_1w::new( - client.clone(), - format!("{base_path}_1w"), - ), - _1m: SeriesTree_Market_Technical_Macd_1m::new( - client.clone(), - format!("{base_path}_1m"), - ), + _24h: SeriesTree_Market_Technical_Macd_24h::new(client.clone(), format!("{base_path}_24h")), + _1w: SeriesTree_Market_Technical_Macd_1w::new(client.clone(), format!("{base_path}_1w")), + _1m: SeriesTree_Market_Technical_Macd_1m::new(client.clone(), format!("{base_path}_1m")), } } } @@ -7873,28 +5978,16 @@ impl SeriesTree_Pools_Major { btcguild: BlocksDominanceRewardsPattern::new(client.clone(), "btcguild".to_string()), eligius: BlocksDominanceRewardsPattern::new(client.clone(), "eligius".to_string()), f2pool: BlocksDominanceRewardsPattern::new(client.clone(), "f2pool".to_string()), - braiinspool: BlocksDominanceRewardsPattern::new( - client.clone(), - "braiinspool".to_string(), - ), + braiinspool: BlocksDominanceRewardsPattern::new(client.clone(), "braiinspool".to_string()), antpool: BlocksDominanceRewardsPattern::new(client.clone(), "antpool".to_string()), btcc: BlocksDominanceRewardsPattern::new(client.clone(), "btcc".to_string()), bwpool: BlocksDominanceRewardsPattern::new(client.clone(), "bwpool".to_string()), bitfury: BlocksDominanceRewardsPattern::new(client.clone(), "bitfury".to_string()), viabtc: BlocksDominanceRewardsPattern::new(client.clone(), "viabtc".to_string()), poolin: BlocksDominanceRewardsPattern::new(client.clone(), "poolin".to_string()), - spiderpool: BlocksDominanceRewardsPattern::new( - client.clone(), - "spiderpool".to_string(), - ), - binancepool: BlocksDominanceRewardsPattern::new( - client.clone(), - "binancepool".to_string(), - ), - foundryusa: BlocksDominanceRewardsPattern::new( - client.clone(), - "foundryusa".to_string(), - ), + spiderpool: BlocksDominanceRewardsPattern::new(client.clone(), "spiderpool".to_string()), + binancepool: BlocksDominanceRewardsPattern::new(client.clone(), "binancepool".to_string()), + foundryusa: BlocksDominanceRewardsPattern::new(client.clone(), "foundryusa".to_string()), sbicrypto: BlocksDominanceRewardsPattern::new(client.clone(), "sbicrypto".to_string()), marapool: BlocksDominanceRewardsPattern::new(client.clone(), "marapool".to_string()), secpool: BlocksDominanceRewardsPattern::new(client.clone(), "secpool".to_string()), @@ -8097,10 +6190,7 @@ impl SeriesTree_Pools_Minor { ckpool: BlocksDominancePattern::new(client.clone(), "ckpool".to_string()), nicehash: BlocksDominancePattern::new(client.clone(), "nicehash".to_string()), bitclub: BlocksDominancePattern::new(client.clone(), "bitclub".to_string()), - bitcoinaffiliatenetwork: BlocksDominancePattern::new( - client.clone(), - "bitcoinaffiliatenetwork".to_string(), - ), + bitcoinaffiliatenetwork: BlocksDominancePattern::new(client.clone(), "bitcoinaffiliatenetwork".to_string()), exxbw: BlocksDominancePattern::new(client.clone(), "exxbw".to_string()), bitsolo: BlocksDominancePattern::new(client.clone(), "bitsolo".to_string()), twentyoneinc: BlocksDominancePattern::new(client.clone(), "twentyoneinc".to_string()), @@ -8123,10 +6213,7 @@ impl SeriesTree_Pools_Minor { dcexploration: BlocksDominancePattern::new(client.clone(), "dcexploration".to_string()), dcex: BlocksDominancePattern::new(client.clone(), "dcex".to_string()), btpool: BlocksDominancePattern::new(client.clone(), "btpool".to_string()), - fiftyeightcoin: BlocksDominancePattern::new( - client.clone(), - "fiftyeightcoin".to_string(), - ), + fiftyeightcoin: BlocksDominancePattern::new(client.clone(), "fiftyeightcoin".to_string()), bitcoinindia: BlocksDominancePattern::new(client.clone(), "bitcoinindia".to_string()), shawnp0wers: BlocksDominancePattern::new(client.clone(), "shawnp0wers".to_string()), phashio: BlocksDominancePattern::new(client.clone(), "phashio".to_string()), @@ -8139,14 +6226,8 @@ impl SeriesTree_Pools_Minor { rawpool: BlocksDominancePattern::new(client.clone(), "rawpool".to_string()), haominer: BlocksDominancePattern::new(client.clone(), "haominer".to_string()), helix: BlocksDominancePattern::new(client.clone(), "helix".to_string()), - bitcoinukraine: BlocksDominancePattern::new( - client.clone(), - "bitcoinukraine".to_string(), - ), - secretsuperstar: BlocksDominancePattern::new( - client.clone(), - "secretsuperstar".to_string(), - ), + bitcoinukraine: BlocksDominancePattern::new(client.clone(), "bitcoinukraine".to_string()), + secretsuperstar: BlocksDominancePattern::new(client.clone(), "secretsuperstar".to_string()), tigerpoolnet: BlocksDominancePattern::new(client.clone(), "tigerpoolnet".to_string()), sigmapoolcom: BlocksDominancePattern::new(client.clone(), "sigmapoolcom".to_string()), okpooltop: BlocksDominancePattern::new(client.clone(), "okpooltop".to_string()), @@ -8163,40 +6244,25 @@ impl SeriesTree_Pools_Minor { arkpool: BlocksDominancePattern::new(client.clone(), "arkpool".to_string()), purebtccom: BlocksDominancePattern::new(client.clone(), "purebtccom".to_string()), kucoinpool: BlocksDominancePattern::new(client.clone(), "kucoinpool".to_string()), - entrustcharitypool: BlocksDominancePattern::new( - client.clone(), - "entrustcharitypool".to_string(), - ), + entrustcharitypool: BlocksDominancePattern::new(client.clone(), "entrustcharitypool".to_string()), okminer: BlocksDominancePattern::new(client.clone(), "okminer".to_string()), titan: BlocksDominancePattern::new(client.clone(), "titan".to_string()), pegapool: BlocksDominancePattern::new(client.clone(), "pegapool".to_string()), btcnuggets: BlocksDominancePattern::new(client.clone(), "btcnuggets".to_string()), cloudhashing: BlocksDominancePattern::new(client.clone(), "cloudhashing".to_string()), - digitalxmintsy: BlocksDominancePattern::new( - client.clone(), - "digitalxmintsy".to_string(), - ), + digitalxmintsy: BlocksDominancePattern::new(client.clone(), "digitalxmintsy".to_string()), telco214: BlocksDominancePattern::new(client.clone(), "telco214".to_string()), btcpoolparty: BlocksDominancePattern::new(client.clone(), "btcpoolparty".to_string()), multipool: BlocksDominancePattern::new(client.clone(), "multipool".to_string()), - transactioncoinmining: BlocksDominancePattern::new( - client.clone(), - "transactioncoinmining".to_string(), - ), + transactioncoinmining: BlocksDominancePattern::new(client.clone(), "transactioncoinmining".to_string()), btcdig: BlocksDominancePattern::new(client.clone(), "btcdig".to_string()), - trickysbtcpool: BlocksDominancePattern::new( - client.clone(), - "trickysbtcpool".to_string(), - ), + trickysbtcpool: BlocksDominancePattern::new(client.clone(), "trickysbtcpool".to_string()), btcmp: BlocksDominancePattern::new(client.clone(), "btcmp".to_string()), eobot: BlocksDominancePattern::new(client.clone(), "eobot".to_string()), unomp: BlocksDominancePattern::new(client.clone(), "unomp".to_string()), patels: BlocksDominancePattern::new(client.clone(), "patels".to_string()), gogreenlight: BlocksDominancePattern::new(client.clone(), "gogreenlight".to_string()), - bitcoinindiapool: BlocksDominancePattern::new( - client.clone(), - "bitcoinindiapool".to_string(), - ), + bitcoinindiapool: BlocksDominancePattern::new(client.clone(), "bitcoinindiapool".to_string()), ekanembtc: BlocksDominancePattern::new(client.clone(), "ekanembtc".to_string()), canoe: BlocksDominancePattern::new(client.clone(), "canoe".to_string()), tiger: BlocksDominancePattern::new(client.clone(), "tiger".to_string()), @@ -8204,14 +6270,8 @@ impl SeriesTree_Pools_Minor { zulupool: BlocksDominancePattern::new(client.clone(), "zulupool".to_string()), wiz: BlocksDominancePattern::new(client.clone(), "wiz".to_string()), wk057: BlocksDominancePattern::new(client.clone(), "wk057".to_string()), - futurebitapollosolo: BlocksDominancePattern::new( - client.clone(), - "futurebitapollosolo".to_string(), - ), - carbonnegative: BlocksDominancePattern::new( - client.clone(), - "carbonnegative".to_string(), - ), + futurebitapollosolo: BlocksDominancePattern::new(client.clone(), "futurebitapollosolo".to_string()), + carbonnegative: BlocksDominancePattern::new(client.clone(), "carbonnegative".to_string()), portlandhodl: BlocksDominancePattern::new(client.clone(), "portlandhodl".to_string()), phoenix: BlocksDominancePattern::new(client.clone(), "phoenix".to_string()), neopool: BlocksDominancePattern::new(client.clone(), "neopool".to_string()), @@ -8318,28 +6378,13 @@ impl SeriesTree_Supply { pub fn new(client: Arc, base_path: String) -> Self { Self { state: SeriesPattern18::new(client.clone(), "supply_state".to_string()), - circulating: BtcCentsSatsUsdPattern3::new( - client.clone(), - "circulating_supply".to_string(), - ), + circulating: BtcCentsSatsUsdPattern3::new(client.clone(), "circulating_supply".to_string()), burned: BlockCumulativePattern::new(client.clone(), "unspendable_supply".to_string()), - inflation_rate: BpsPercentRatioPattern::new( - client.clone(), - "inflation_rate".to_string(), - ), - velocity: SeriesTree_Supply_Velocity::new( - client.clone(), - format!("{base_path}_velocity"), - ), + inflation_rate: BpsPercentRatioPattern::new(client.clone(), "inflation_rate".to_string()), + velocity: SeriesTree_Supply_Velocity::new(client.clone(), format!("{base_path}_velocity")), market_cap: CentsDeltaUsdPattern::new(client.clone(), "market_cap".to_string()), - market_minus_realized_cap_growth_rate: _1m1w1y24hPattern::new( - client.clone(), - "market_minus_realized_cap_growth_rate".to_string(), - ), - hodled_or_lost: BtcCentsSatsUsdPattern3::new( - client.clone(), - "hodled_or_lost_supply".to_string(), - ), + market_minus_realized_cap_growth_rate: _1m1w1y24hPattern::new(client.clone(), "market_minus_realized_cap_growth_rate".to_string()), + hodled_or_lost: BtcCentsSatsUsdPattern3::new(client.clone(), "hodled_or_lost_supply".to_string()), } } } @@ -8398,41 +6443,17 @@ impl SeriesTree_Cohorts_Utxo { all: SeriesTree_Cohorts_Utxo_All::new(client.clone(), format!("{base_path}_all")), sth: SeriesTree_Cohorts_Utxo_Sth::new(client.clone(), format!("{base_path}_sth")), lth: SeriesTree_Cohorts_Utxo_Lth::new(client.clone(), format!("{base_path}_lth")), - age_range: SeriesTree_Cohorts_Utxo_AgeRange::new( - client.clone(), - format!("{base_path}_age_range"), - ), - under_age: SeriesTree_Cohorts_Utxo_UnderAge::new( - client.clone(), - format!("{base_path}_under_age"), - ), - over_age: SeriesTree_Cohorts_Utxo_OverAge::new( - client.clone(), - format!("{base_path}_over_age"), - ), + age_range: SeriesTree_Cohorts_Utxo_AgeRange::new(client.clone(), format!("{base_path}_age_range")), + under_age: SeriesTree_Cohorts_Utxo_UnderAge::new(client.clone(), format!("{base_path}_under_age")), + over_age: SeriesTree_Cohorts_Utxo_OverAge::new(client.clone(), format!("{base_path}_over_age")), epoch: SeriesTree_Cohorts_Utxo_Epoch::new(client.clone(), format!("{base_path}_epoch")), class: SeriesTree_Cohorts_Utxo_Class::new(client.clone(), format!("{base_path}_class")), - over_amount: SeriesTree_Cohorts_Utxo_OverAmount::new( - client.clone(), - format!("{base_path}_over_amount"), - ), - amount_range: SeriesTree_Cohorts_Utxo_AmountRange::new( - client.clone(), - format!("{base_path}_amount_range"), - ), - under_amount: SeriesTree_Cohorts_Utxo_UnderAmount::new( - client.clone(), - format!("{base_path}_under_amount"), - ), + over_amount: SeriesTree_Cohorts_Utxo_OverAmount::new(client.clone(), format!("{base_path}_over_amount")), + amount_range: SeriesTree_Cohorts_Utxo_AmountRange::new(client.clone(), format!("{base_path}_amount_range")), + under_amount: SeriesTree_Cohorts_Utxo_UnderAmount::new(client.clone(), format!("{base_path}_under_amount")), type_: SeriesTree_Cohorts_Utxo_Type::new(client.clone(), format!("{base_path}_type")), - profitability: SeriesTree_Cohorts_Utxo_Profitability::new( - client.clone(), - format!("{base_path}_profitability"), - ), - matured: SeriesTree_Cohorts_Utxo_Matured::new( - client.clone(), - format!("{base_path}_matured"), - ), + profitability: SeriesTree_Cohorts_Utxo_Profitability::new(client.clone(), format!("{base_path}_profitability")), + matured: SeriesTree_Cohorts_Utxo_Matured::new(client.clone(), format!("{base_path}_matured")), } } } @@ -8450,30 +6471,12 @@ pub struct SeriesTree_Cohorts_Utxo_All { impl SeriesTree_Cohorts_Utxo_All { pub fn new(client: Arc, base_path: String) -> Self { Self { - supply: SeriesTree_Cohorts_Utxo_All_Supply::new( - client.clone(), - format!("{base_path}_supply"), - ), - outputs: SeriesTree_Cohorts_Utxo_All_Outputs::new( - client.clone(), - format!("{base_path}_outputs"), - ), - activity: SeriesTree_Cohorts_Utxo_All_Activity::new( - client.clone(), - format!("{base_path}_activity"), - ), - realized: SeriesTree_Cohorts_Utxo_All_Realized::new( - client.clone(), - format!("{base_path}_realized"), - ), - cost_basis: SeriesTree_Cohorts_Utxo_All_CostBasis::new( - client.clone(), - format!("{base_path}_cost_basis"), - ), - unrealized: SeriesTree_Cohorts_Utxo_All_Unrealized::new( - client.clone(), - format!("{base_path}_unrealized"), - ), + supply: SeriesTree_Cohorts_Utxo_All_Supply::new(client.clone(), format!("{base_path}_supply")), + outputs: SeriesTree_Cohorts_Utxo_All_Outputs::new(client.clone(), format!("{base_path}_outputs")), + activity: SeriesTree_Cohorts_Utxo_All_Activity::new(client.clone(), format!("{base_path}_activity")), + realized: SeriesTree_Cohorts_Utxo_All_Realized::new(client.clone(), format!("{base_path}_realized")), + cost_basis: SeriesTree_Cohorts_Utxo_All_CostBasis::new(client.clone(), format!("{base_path}_cost_basis")), + unrealized: SeriesTree_Cohorts_Utxo_All_Unrealized::new(client.clone(), format!("{base_path}_unrealized")), } } } @@ -8493,10 +6496,7 @@ impl SeriesTree_Cohorts_Utxo_All_Supply { total: BtcCentsSatsUsdPattern3::new(client.clone(), "supply".to_string()), delta: AbsoluteRatePattern::new(client.clone(), "supply_delta".to_string()), half: BtcCentsSatsUsdPattern3::new(client.clone(), "supply_half".to_string()), - in_profit: BtcCentsSatsToUsdPattern2::new( - client.clone(), - "supply_in_profit".to_string(), - ), + in_profit: BtcCentsSatsToUsdPattern2::new(client.clone(), "supply_in_profit".to_string()), in_loss: BtcCentsSatsToUsdPattern2::new(client.clone(), "supply_in_loss".to_string()), } } @@ -8513,10 +6513,7 @@ impl SeriesTree_Cohorts_Utxo_All_Outputs { pub fn new(client: Arc, base_path: String) -> Self { Self { unspent_count: BaseDeltaPattern::new(client.clone(), "utxo_count".to_string()), - spent_count: AverageBlockCumulativeSumPattern2::new( - client.clone(), - "spent_utxo_count".to_string(), - ), + spent_count: AverageBlockCumulativeSumPattern2::new(client.clone(), "spent_utxo_count".to_string()), spending_rate: SeriesPattern1::new(client.clone(), "spending_rate".to_string()), } } @@ -8533,18 +6530,9 @@ pub struct SeriesTree_Cohorts_Utxo_All_Activity { impl SeriesTree_Cohorts_Utxo_All_Activity { pub fn new(client: Arc, base_path: String) -> Self { Self { - transfer_volume: AverageBlockCumulativeInSumPattern::new( - client.clone(), - "transfer_volume".to_string(), - ), - coindays_destroyed: AverageBlockCumulativeSumPattern::new( - client.clone(), - "coindays_destroyed".to_string(), - ), - coinyears_destroyed: SeriesPattern1::new( - client.clone(), - "coinyears_destroyed".to_string(), - ), + transfer_volume: AverageBlockCumulativeInSumPattern::new(client.clone(), "transfer_volume".to_string()), + coindays_destroyed: AverageBlockCumulativeSumPattern::new(client.clone(), "coindays_destroyed".to_string()), + coinyears_destroyed: SeriesPattern1::new(client.clone(), "coinyears_destroyed".to_string()), dormancy: _1m1w1y24hPattern::new(client.clone(), "dormancy".to_string()), } } @@ -8571,37 +6559,16 @@ impl SeriesTree_Cohorts_Utxo_All_Realized { Self { cap: CentsDeltaToUsdPattern::new(client.clone(), "realized_cap".to_string()), profit: BlockCumulativeSumPattern::new(client.clone(), "realized_profit".to_string()), - loss: BlockCumulativeNegativeSumPattern::new( - client.clone(), - "realized_loss".to_string(), - ), - price: SeriesTree_Cohorts_Utxo_All_Realized_Price::new( - client.clone(), - format!("{base_path}_price"), - ), + loss: BlockCumulativeNegativeSumPattern::new(client.clone(), "realized_loss".to_string()), + price: SeriesTree_Cohorts_Utxo_All_Realized_Price::new(client.clone(), format!("{base_path}_price")), mvrv: SeriesPattern1::new(client.clone(), "mvrv".to_string()), net_pnl: BlockChangeCumulativeDeltaSumPattern::new(client.clone(), "net".to_string()), - sopr: SeriesTree_Cohorts_Utxo_All_Realized_Sopr::new( - client.clone(), - format!("{base_path}_sopr"), - ), - gross_pnl: BlockCumulativeSumPattern::new( - client.clone(), - "realized_gross_pnl".to_string(), - ), - sell_side_risk_ratio: _1m1w1y24hPattern7::new( - client.clone(), - "sell_side_risk_ratio".to_string(), - ), - peak_regret: BlockCumulativeSumPattern::new( - client.clone(), - "realized_peak_regret".to_string(), - ), + sopr: SeriesTree_Cohorts_Utxo_All_Realized_Sopr::new(client.clone(), format!("{base_path}_sopr")), + gross_pnl: BlockCumulativeSumPattern::new(client.clone(), "realized_gross_pnl".to_string()), + sell_side_risk_ratio: _1m1w1y24hPattern7::new(client.clone(), "sell_side_risk_ratio".to_string()), + peak_regret: BlockCumulativeSumPattern::new(client.clone(), "realized_peak_regret".to_string()), investor: PricePattern::new(client.clone(), "investor_price".to_string()), - profit_to_loss_ratio: _1m1w1y24hPattern::new( - client.clone(), - "realized_profit_to_loss_ratio".to_string(), - ), + profit_to_loss_ratio: _1m1w1y24hPattern::new(client.clone(), "realized_profit_to_loss_ratio".to_string()), } } } @@ -8626,15 +6593,9 @@ impl SeriesTree_Cohorts_Utxo_All_Realized_Price { sats: SeriesPattern1::new(client.clone(), "realized_price_sats".to_string()), bps: SeriesPattern1::new(client.clone(), "realized_price_ratio_bps".to_string()), ratio: SeriesPattern1::new(client.clone(), "realized_price_ratio".to_string()), - percentiles: Pct0Pct1Pct2Pct5Pct95Pct98Pct99Pattern::new( - client.clone(), - "realized_price".to_string(), - ), + percentiles: Pct0Pct1Pct2Pct5Pct95Pct98Pct99Pattern::new(client.clone(), "realized_price".to_string()), sma: _1m1w1y2y4yAllPattern::new(client.clone(), "realized_price_ratio_sma".to_string()), - std_dev: SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev::new( - client.clone(), - format!("{base_path}_std_dev"), - ), + std_dev: SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev::new(client.clone(), format!("{base_path}_std_dev")), } } } @@ -8650,22 +6611,10 @@ pub struct SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev { impl SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev { pub fn new(client: Arc, base_path: String) -> Self { Self { - all: SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_All::new( - client.clone(), - format!("{base_path}_all"), - ), - _4y: SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_4y::new( - client.clone(), - format!("{base_path}_4y"), - ), - _2y: SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_2y::new( - client.clone(), - format!("{base_path}_2y"), - ), - _1y: SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_1y::new( - client.clone(), - format!("{base_path}_1y"), - ), + all: SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_All::new(client.clone(), format!("{base_path}_all")), + _4y: SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_4y::new(client.clone(), format!("{base_path}_4y")), + _2y: SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_2y::new(client.clone(), format!("{base_path}_2y")), + _1y: SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_1y::new(client.clone(), format!("{base_path}_1y")), } } } @@ -8695,66 +6644,18 @@ impl SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_All { sd: SeriesPattern1::new(client.clone(), "realized_price_ratio_sd".to_string()), zscore: SeriesPattern1::new(client.clone(), "realized_price_ratio_zscore".to_string()), _0sd: CentsSatsUsdPattern::new(client.clone(), "realized_price_0sd".to_string()), - p0_5sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "p0_5sd".to_string(), - ), - p1sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "p1sd".to_string(), - ), - p1_5sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "p1_5sd".to_string(), - ), - p2sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "p2sd".to_string(), - ), - p2_5sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "p2_5sd".to_string(), - ), - p3sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "p3sd".to_string(), - ), - m0_5sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "m0_5sd".to_string(), - ), - m1sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "m1sd".to_string(), - ), - m1_5sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "m1_5sd".to_string(), - ), - m2sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "m2sd".to_string(), - ), - m2_5sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "m2_5sd".to_string(), - ), - m3sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "m3sd".to_string(), - ), + p0_5sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "p0_5sd".to_string()), + p1sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "p1sd".to_string()), + p1_5sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "p1_5sd".to_string()), + p2sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "p2sd".to_string()), + p2_5sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "p2_5sd".to_string()), + p3sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "p3sd".to_string()), + m0_5sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "m0_5sd".to_string()), + m1sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "m1sd".to_string()), + m1_5sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "m1_5sd".to_string()), + m2sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "m2sd".to_string()), + m2_5sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "m2_5sd".to_string()), + m3sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "m3sd".to_string()), } } } @@ -8782,71 +6683,20 @@ impl SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_4y { pub fn new(client: Arc, base_path: String) -> Self { Self { sd: SeriesPattern1::new(client.clone(), "realized_price_ratio_sd_4y".to_string()), - zscore: SeriesPattern1::new( - client.clone(), - "realized_price_ratio_zscore_4y".to_string(), - ), + zscore: SeriesPattern1::new(client.clone(), "realized_price_ratio_zscore_4y".to_string()), _0sd: CentsSatsUsdPattern::new(client.clone(), "realized_price_0sd_4y".to_string()), - p0_5sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "p0_5sd_4y".to_string(), - ), - p1sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "p1sd_4y".to_string(), - ), - p1_5sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "p1_5sd_4y".to_string(), - ), - p2sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "p2sd_4y".to_string(), - ), - p2_5sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "p2_5sd_4y".to_string(), - ), - p3sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "p3sd_4y".to_string(), - ), - m0_5sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "m0_5sd_4y".to_string(), - ), - m1sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "m1sd_4y".to_string(), - ), - m1_5sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "m1_5sd_4y".to_string(), - ), - m2sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "m2sd_4y".to_string(), - ), - m2_5sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "m2_5sd_4y".to_string(), - ), - m3sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "m3sd_4y".to_string(), - ), + p0_5sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "p0_5sd_4y".to_string()), + p1sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "p1sd_4y".to_string()), + p1_5sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "p1_5sd_4y".to_string()), + p2sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "p2sd_4y".to_string()), + p2_5sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "p2_5sd_4y".to_string()), + p3sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "p3sd_4y".to_string()), + m0_5sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "m0_5sd_4y".to_string()), + m1sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "m1sd_4y".to_string()), + m1_5sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "m1_5sd_4y".to_string()), + m2sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "m2sd_4y".to_string()), + m2_5sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "m2_5sd_4y".to_string()), + m3sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "m3sd_4y".to_string()), } } } @@ -8874,71 +6724,20 @@ impl SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_2y { pub fn new(client: Arc, base_path: String) -> Self { Self { sd: SeriesPattern1::new(client.clone(), "realized_price_ratio_sd_2y".to_string()), - zscore: SeriesPattern1::new( - client.clone(), - "realized_price_ratio_zscore_2y".to_string(), - ), + zscore: SeriesPattern1::new(client.clone(), "realized_price_ratio_zscore_2y".to_string()), _0sd: CentsSatsUsdPattern::new(client.clone(), "realized_price_0sd_2y".to_string()), - p0_5sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "p0_5sd_2y".to_string(), - ), - p1sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "p1sd_2y".to_string(), - ), - p1_5sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "p1_5sd_2y".to_string(), - ), - p2sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "p2sd_2y".to_string(), - ), - p2_5sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "p2_5sd_2y".to_string(), - ), - p3sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "p3sd_2y".to_string(), - ), - m0_5sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "m0_5sd_2y".to_string(), - ), - m1sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "m1sd_2y".to_string(), - ), - m1_5sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "m1_5sd_2y".to_string(), - ), - m2sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "m2sd_2y".to_string(), - ), - m2_5sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "m2_5sd_2y".to_string(), - ), - m3sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "m3sd_2y".to_string(), - ), + p0_5sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "p0_5sd_2y".to_string()), + p1sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "p1sd_2y".to_string()), + p1_5sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "p1_5sd_2y".to_string()), + p2sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "p2sd_2y".to_string()), + p2_5sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "p2_5sd_2y".to_string()), + p3sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "p3sd_2y".to_string()), + m0_5sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "m0_5sd_2y".to_string()), + m1sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "m1sd_2y".to_string()), + m1_5sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "m1_5sd_2y".to_string()), + m2sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "m2sd_2y".to_string()), + m2_5sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "m2_5sd_2y".to_string()), + m3sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "m3sd_2y".to_string()), } } } @@ -8966,71 +6765,20 @@ impl SeriesTree_Cohorts_Utxo_All_Realized_Price_StdDev_1y { pub fn new(client: Arc, base_path: String) -> Self { Self { sd: SeriesPattern1::new(client.clone(), "realized_price_ratio_sd_1y".to_string()), - zscore: SeriesPattern1::new( - client.clone(), - "realized_price_ratio_zscore_1y".to_string(), - ), + zscore: SeriesPattern1::new(client.clone(), "realized_price_ratio_zscore_1y".to_string()), _0sd: CentsSatsUsdPattern::new(client.clone(), "realized_price_0sd_1y".to_string()), - p0_5sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "p0_5sd_1y".to_string(), - ), - p1sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "p1sd_1y".to_string(), - ), - p1_5sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "p1_5sd_1y".to_string(), - ), - p2sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "p2sd_1y".to_string(), - ), - p2_5sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "p2_5sd_1y".to_string(), - ), - p3sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "p3sd_1y".to_string(), - ), - m0_5sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "m0_5sd_1y".to_string(), - ), - m1sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "m1sd_1y".to_string(), - ), - m1_5sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "m1_5sd_1y".to_string(), - ), - m2sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "m2sd_1y".to_string(), - ), - m2_5sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "m2_5sd_1y".to_string(), - ), - m3sd: PriceRatioPattern::new( - client.clone(), - "realized_price".to_string(), - "m3sd_1y".to_string(), - ), + p0_5sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "p0_5sd_1y".to_string()), + p1sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "p1sd_1y".to_string()), + p1_5sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "p1_5sd_1y".to_string()), + p2sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "p2sd_1y".to_string()), + p2_5sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "p2_5sd_1y".to_string()), + p3sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "p3sd_1y".to_string()), + m0_5sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "m0_5sd_1y".to_string()), + m1sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "m1sd_1y".to_string()), + m1_5sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "m1_5sd_1y".to_string()), + m2sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "m2sd_1y".to_string()), + m2_5sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "m2_5sd_1y".to_string()), + m3sd: PriceRatioPattern::new(client.clone(), "realized_price".to_string(), "m3sd_1y".to_string()), } } } @@ -9045,15 +6793,9 @@ pub struct SeriesTree_Cohorts_Utxo_All_Realized_Sopr { impl SeriesTree_Cohorts_Utxo_All_Realized_Sopr { pub fn new(client: Arc, base_path: String) -> Self { Self { - value_destroyed: AverageBlockCumulativeSumPattern::new( - client.clone(), - "value_destroyed".to_string(), - ), + value_destroyed: AverageBlockCumulativeSumPattern::new(client.clone(), "value_destroyed".to_string()), ratio: _1m1w1y24hPattern::new(client.clone(), "sopr".to_string()), - adjusted: SeriesTree_Cohorts_Utxo_All_Realized_Sopr_Adjusted::new( - client.clone(), - format!("{base_path}_adjusted"), - ), + adjusted: SeriesTree_Cohorts_Utxo_All_Realized_Sopr_Adjusted::new(client.clone(), format!("{base_path}_adjusted")), } } } @@ -9069,14 +6811,8 @@ impl SeriesTree_Cohorts_Utxo_All_Realized_Sopr_Adjusted { pub fn new(client: Arc, base_path: String) -> Self { Self { ratio: _1m1w1y24hPattern::new(client.clone(), "asopr".to_string()), - transfer_volume: AverageBlockCumulativeSumPattern::new( - client.clone(), - "adj_value_created".to_string(), - ), - value_destroyed: AverageBlockCumulativeSumPattern::new( - client.clone(), - "adj_value_destroyed".to_string(), - ), + transfer_volume: AverageBlockCumulativeSumPattern::new(client.clone(), "adj_value_created".to_string()), + value_destroyed: AverageBlockCumulativeSumPattern::new(client.clone(), "adj_value_destroyed".to_string()), } } } @@ -9123,32 +6859,14 @@ impl SeriesTree_Cohorts_Utxo_All_Unrealized { pub fn new(client: Arc, base_path: String) -> Self { Self { nupl: BpsRatioPattern::new(client.clone(), "nupl".to_string()), - profit: SeriesTree_Cohorts_Utxo_All_Unrealized_Profit::new( - client.clone(), - format!("{base_path}_profit"), - ), - loss: SeriesTree_Cohorts_Utxo_All_Unrealized_Loss::new( - client.clone(), - format!("{base_path}_loss"), - ), - net_pnl: SeriesTree_Cohorts_Utxo_All_Unrealized_NetPnl::new( - client.clone(), - format!("{base_path}_net_pnl"), - ), + profit: SeriesTree_Cohorts_Utxo_All_Unrealized_Profit::new(client.clone(), format!("{base_path}_profit")), + loss: SeriesTree_Cohorts_Utxo_All_Unrealized_Loss::new(client.clone(), format!("{base_path}_loss")), + net_pnl: SeriesTree_Cohorts_Utxo_All_Unrealized_NetPnl::new(client.clone(), format!("{base_path}_net_pnl")), gross_pnl: CentsUsdPattern3::new(client.clone(), "unrealized_gross_pnl".to_string()), invested_capital: InPattern::new(client.clone(), "invested_capital_in".to_string()), - investor_cap_in_profit_raw: SeriesPattern18::new( - client.clone(), - "investor_cap_in_profit_raw".to_string(), - ), - investor_cap_in_loss_raw: SeriesPattern18::new( - client.clone(), - "investor_cap_in_loss_raw".to_string(), - ), - sentiment: SeriesTree_Cohorts_Utxo_All_Unrealized_Sentiment::new( - client.clone(), - format!("{base_path}_sentiment"), - ), + investor_cap_in_profit_raw: SeriesPattern18::new(client.clone(), "investor_cap_in_profit_raw".to_string()), + investor_cap_in_loss_raw: SeriesPattern18::new(client.clone(), "investor_cap_in_loss_raw".to_string()), + sentiment: SeriesTree_Cohorts_Utxo_All_Unrealized_Sentiment::new(client.clone(), format!("{base_path}_sentiment")), } } } @@ -9166,14 +6884,8 @@ impl SeriesTree_Cohorts_Utxo_All_Unrealized_Profit { Self { usd: SeriesPattern1::new(client.clone(), "unrealized_profit".to_string()), cents: SeriesPattern1::new(client.clone(), "unrealized_profit_cents".to_string()), - to_mcap: BpsPercentRatioPattern3::new( - client.clone(), - "unrealized_profit_to_mcap".to_string(), - ), - to_own_gross_pnl: BpsPercentRatioPattern3::new( - client.clone(), - "unrealized_profit_to_own_gross_pnl".to_string(), - ), + to_mcap: BpsPercentRatioPattern3::new(client.clone(), "unrealized_profit_to_mcap".to_string()), + to_own_gross_pnl: BpsPercentRatioPattern3::new(client.clone(), "unrealized_profit_to_own_gross_pnl".to_string()), } } } @@ -9193,14 +6905,8 @@ impl SeriesTree_Cohorts_Utxo_All_Unrealized_Loss { usd: SeriesPattern1::new(client.clone(), "unrealized_loss".to_string()), cents: SeriesPattern1::new(client.clone(), "unrealized_loss_cents".to_string()), negative: SeriesPattern1::new(client.clone(), "unrealized_loss_neg".to_string()), - to_mcap: BpsPercentRatioPattern3::new( - client.clone(), - "unrealized_loss_to_mcap".to_string(), - ), - to_own_gross_pnl: BpsPercentRatioPattern3::new( - client.clone(), - "unrealized_loss_to_own_gross_pnl".to_string(), - ), + to_mcap: BpsPercentRatioPattern3::new(client.clone(), "unrealized_loss_to_mcap".to_string()), + to_own_gross_pnl: BpsPercentRatioPattern3::new(client.clone(), "unrealized_loss_to_own_gross_pnl".to_string()), } } } @@ -9217,10 +6923,7 @@ impl SeriesTree_Cohorts_Utxo_All_Unrealized_NetPnl { Self { usd: SeriesPattern1::new(client.clone(), "net_unrealized_pnl".to_string()), cents: SeriesPattern1::new(client.clone(), "net_unrealized_pnl_cents".to_string()), - to_own_gross_pnl: BpsPercentRatioPattern::new( - client.clone(), - "net_unrealized_pnl_to_own_gross_pnl".to_string(), - ), + to_own_gross_pnl: BpsPercentRatioPattern::new(client.clone(), "net_unrealized_pnl_to_own_gross_pnl".to_string()), } } } @@ -9257,19 +6960,10 @@ impl SeriesTree_Cohorts_Utxo_Sth { Self { supply: DeltaHalfInToTotalPattern2::new(client.clone(), "sth_supply".to_string()), outputs: SpendingSpentUnspentPattern::new(client.clone(), "sth".to_string()), - activity: CoindaysCoinyearsDormancyTransferPattern::new( - client.clone(), - "sth".to_string(), - ), - realized: SeriesTree_Cohorts_Utxo_Sth_Realized::new( - client.clone(), - format!("{base_path}_realized"), - ), + activity: CoindaysCoinyearsDormancyTransferPattern::new(client.clone(), "sth".to_string()), + realized: SeriesTree_Cohorts_Utxo_Sth_Realized::new(client.clone(), format!("{base_path}_realized")), cost_basis: InMaxMinPerSupplyPattern::new(client.clone(), "sth".to_string()), - unrealized: GrossInvestedInvestorLossNetNuplProfitSentimentPattern2::new( - client.clone(), - "sth".to_string(), - ), + unrealized: GrossInvestedInvestorLossNetNuplProfitSentimentPattern2::new(client.clone(), "sth".to_string()), } } } @@ -9294,41 +6988,17 @@ impl SeriesTree_Cohorts_Utxo_Sth_Realized { pub fn new(client: Arc, base_path: String) -> Self { Self { cap: CentsDeltaToUsdPattern::new(client.clone(), "sth_realized_cap".to_string()), - profit: BlockCumulativeSumPattern::new( - client.clone(), - "sth_realized_profit".to_string(), - ), - loss: BlockCumulativeNegativeSumPattern::new( - client.clone(), - "sth_realized_loss".to_string(), - ), - price: SeriesTree_Cohorts_Utxo_Sth_Realized_Price::new( - client.clone(), - format!("{base_path}_price"), - ), + profit: BlockCumulativeSumPattern::new(client.clone(), "sth_realized_profit".to_string()), + loss: BlockCumulativeNegativeSumPattern::new(client.clone(), "sth_realized_loss".to_string()), + price: SeriesTree_Cohorts_Utxo_Sth_Realized_Price::new(client.clone(), format!("{base_path}_price")), mvrv: SeriesPattern1::new(client.clone(), "sth_mvrv".to_string()), - net_pnl: BlockChangeCumulativeDeltaSumPattern::new( - client.clone(), - "sth_net".to_string(), - ), + net_pnl: BlockChangeCumulativeDeltaSumPattern::new(client.clone(), "sth_net".to_string()), sopr: AdjustedRatioValuePattern::new(client.clone(), "sth".to_string()), - gross_pnl: BlockCumulativeSumPattern::new( - client.clone(), - "sth_realized_gross_pnl".to_string(), - ), - sell_side_risk_ratio: _1m1w1y24hPattern7::new( - client.clone(), - "sth_sell_side_risk_ratio".to_string(), - ), - peak_regret: BlockCumulativeSumPattern::new( - client.clone(), - "sth_realized_peak_regret".to_string(), - ), + gross_pnl: BlockCumulativeSumPattern::new(client.clone(), "sth_realized_gross_pnl".to_string()), + sell_side_risk_ratio: _1m1w1y24hPattern7::new(client.clone(), "sth_sell_side_risk_ratio".to_string()), + peak_regret: BlockCumulativeSumPattern::new(client.clone(), "sth_realized_peak_regret".to_string()), investor: PricePattern::new(client.clone(), "sth_investor_price".to_string()), - profit_to_loss_ratio: _1m1w1y24hPattern::new( - client.clone(), - "sth_realized_profit_to_loss_ratio".to_string(), - ), + profit_to_loss_ratio: _1m1w1y24hPattern::new(client.clone(), "sth_realized_profit_to_loss_ratio".to_string()), } } } @@ -9353,18 +7023,9 @@ impl SeriesTree_Cohorts_Utxo_Sth_Realized_Price { sats: SeriesPattern1::new(client.clone(), "sth_realized_price_sats".to_string()), bps: SeriesPattern1::new(client.clone(), "sth_realized_price_ratio_bps".to_string()), ratio: SeriesPattern1::new(client.clone(), "sth_realized_price_ratio".to_string()), - percentiles: Pct0Pct1Pct2Pct5Pct95Pct98Pct99Pattern::new( - client.clone(), - "sth_realized_price".to_string(), - ), - sma: _1m1w1y2y4yAllPattern::new( - client.clone(), - "sth_realized_price_ratio_sma".to_string(), - ), - std_dev: SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev::new( - client.clone(), - format!("{base_path}_std_dev"), - ), + percentiles: Pct0Pct1Pct2Pct5Pct95Pct98Pct99Pattern::new(client.clone(), "sth_realized_price".to_string()), + sma: _1m1w1y2y4yAllPattern::new(client.clone(), "sth_realized_price_ratio_sma".to_string()), + std_dev: SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev::new(client.clone(), format!("{base_path}_std_dev")), } } } @@ -9380,22 +7041,10 @@ pub struct SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev { impl SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev { pub fn new(client: Arc, base_path: String) -> Self { Self { - all: SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_All::new( - client.clone(), - format!("{base_path}_all"), - ), - _4y: SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_4y::new( - client.clone(), - format!("{base_path}_4y"), - ), - _2y: SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_2y::new( - client.clone(), - format!("{base_path}_2y"), - ), - _1y: SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_1y::new( - client.clone(), - format!("{base_path}_1y"), - ), + all: SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_All::new(client.clone(), format!("{base_path}_all")), + _4y: SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_4y::new(client.clone(), format!("{base_path}_4y")), + _2y: SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_2y::new(client.clone(), format!("{base_path}_2y")), + _1y: SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_1y::new(client.clone(), format!("{base_path}_1y")), } } } @@ -9423,71 +7072,20 @@ impl SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_All { pub fn new(client: Arc, base_path: String) -> Self { Self { sd: SeriesPattern1::new(client.clone(), "sth_realized_price_ratio_sd".to_string()), - zscore: SeriesPattern1::new( - client.clone(), - "sth_realized_price_ratio_zscore".to_string(), - ), + zscore: SeriesPattern1::new(client.clone(), "sth_realized_price_ratio_zscore".to_string()), _0sd: CentsSatsUsdPattern::new(client.clone(), "sth_realized_price_0sd".to_string()), - p0_5sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "p0_5sd".to_string(), - ), - p1sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "p1sd".to_string(), - ), - p1_5sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "p1_5sd".to_string(), - ), - p2sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "p2sd".to_string(), - ), - p2_5sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "p2_5sd".to_string(), - ), - p3sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "p3sd".to_string(), - ), - m0_5sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "m0_5sd".to_string(), - ), - m1sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "m1sd".to_string(), - ), - m1_5sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "m1_5sd".to_string(), - ), - m2sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "m2sd".to_string(), - ), - m2_5sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "m2_5sd".to_string(), - ), - m3sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "m3sd".to_string(), - ), + p0_5sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "p0_5sd".to_string()), + p1sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "p1sd".to_string()), + p1_5sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "p1_5sd".to_string()), + p2sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "p2sd".to_string()), + p2_5sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "p2_5sd".to_string()), + p3sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "p3sd".to_string()), + m0_5sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "m0_5sd".to_string()), + m1sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "m1sd".to_string()), + m1_5sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "m1_5sd".to_string()), + m2sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "m2sd".to_string()), + m2_5sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "m2_5sd".to_string()), + m3sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "m3sd".to_string()), } } } @@ -9515,71 +7113,20 @@ impl SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_4y { pub fn new(client: Arc, base_path: String) -> Self { Self { sd: SeriesPattern1::new(client.clone(), "sth_realized_price_ratio_sd_4y".to_string()), - zscore: SeriesPattern1::new( - client.clone(), - "sth_realized_price_ratio_zscore_4y".to_string(), - ), + zscore: SeriesPattern1::new(client.clone(), "sth_realized_price_ratio_zscore_4y".to_string()), _0sd: CentsSatsUsdPattern::new(client.clone(), "sth_realized_price_0sd_4y".to_string()), - p0_5sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "p0_5sd_4y".to_string(), - ), - p1sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "p1sd_4y".to_string(), - ), - p1_5sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "p1_5sd_4y".to_string(), - ), - p2sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "p2sd_4y".to_string(), - ), - p2_5sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "p2_5sd_4y".to_string(), - ), - p3sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "p3sd_4y".to_string(), - ), - m0_5sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "m0_5sd_4y".to_string(), - ), - m1sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "m1sd_4y".to_string(), - ), - m1_5sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "m1_5sd_4y".to_string(), - ), - m2sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "m2sd_4y".to_string(), - ), - m2_5sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "m2_5sd_4y".to_string(), - ), - m3sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "m3sd_4y".to_string(), - ), + p0_5sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "p0_5sd_4y".to_string()), + p1sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "p1sd_4y".to_string()), + p1_5sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "p1_5sd_4y".to_string()), + p2sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "p2sd_4y".to_string()), + p2_5sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "p2_5sd_4y".to_string()), + p3sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "p3sd_4y".to_string()), + m0_5sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "m0_5sd_4y".to_string()), + m1sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "m1sd_4y".to_string()), + m1_5sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "m1_5sd_4y".to_string()), + m2sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "m2sd_4y".to_string()), + m2_5sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "m2_5sd_4y".to_string()), + m3sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "m3sd_4y".to_string()), } } } @@ -9607,71 +7154,20 @@ impl SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_2y { pub fn new(client: Arc, base_path: String) -> Self { Self { sd: SeriesPattern1::new(client.clone(), "sth_realized_price_ratio_sd_2y".to_string()), - zscore: SeriesPattern1::new( - client.clone(), - "sth_realized_price_ratio_zscore_2y".to_string(), - ), + zscore: SeriesPattern1::new(client.clone(), "sth_realized_price_ratio_zscore_2y".to_string()), _0sd: CentsSatsUsdPattern::new(client.clone(), "sth_realized_price_0sd_2y".to_string()), - p0_5sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "p0_5sd_2y".to_string(), - ), - p1sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "p1sd_2y".to_string(), - ), - p1_5sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "p1_5sd_2y".to_string(), - ), - p2sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "p2sd_2y".to_string(), - ), - p2_5sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "p2_5sd_2y".to_string(), - ), - p3sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "p3sd_2y".to_string(), - ), - m0_5sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "m0_5sd_2y".to_string(), - ), - m1sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "m1sd_2y".to_string(), - ), - m1_5sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "m1_5sd_2y".to_string(), - ), - m2sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "m2sd_2y".to_string(), - ), - m2_5sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "m2_5sd_2y".to_string(), - ), - m3sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "m3sd_2y".to_string(), - ), + p0_5sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "p0_5sd_2y".to_string()), + p1sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "p1sd_2y".to_string()), + p1_5sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "p1_5sd_2y".to_string()), + p2sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "p2sd_2y".to_string()), + p2_5sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "p2_5sd_2y".to_string()), + p3sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "p3sd_2y".to_string()), + m0_5sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "m0_5sd_2y".to_string()), + m1sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "m1sd_2y".to_string()), + m1_5sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "m1_5sd_2y".to_string()), + m2sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "m2sd_2y".to_string()), + m2_5sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "m2_5sd_2y".to_string()), + m3sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "m3sd_2y".to_string()), } } } @@ -9699,71 +7195,20 @@ impl SeriesTree_Cohorts_Utxo_Sth_Realized_Price_StdDev_1y { pub fn new(client: Arc, base_path: String) -> Self { Self { sd: SeriesPattern1::new(client.clone(), "sth_realized_price_ratio_sd_1y".to_string()), - zscore: SeriesPattern1::new( - client.clone(), - "sth_realized_price_ratio_zscore_1y".to_string(), - ), + zscore: SeriesPattern1::new(client.clone(), "sth_realized_price_ratio_zscore_1y".to_string()), _0sd: CentsSatsUsdPattern::new(client.clone(), "sth_realized_price_0sd_1y".to_string()), - p0_5sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "p0_5sd_1y".to_string(), - ), - p1sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "p1sd_1y".to_string(), - ), - p1_5sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "p1_5sd_1y".to_string(), - ), - p2sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "p2sd_1y".to_string(), - ), - p2_5sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "p2_5sd_1y".to_string(), - ), - p3sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "p3sd_1y".to_string(), - ), - m0_5sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "m0_5sd_1y".to_string(), - ), - m1sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "m1sd_1y".to_string(), - ), - m1_5sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "m1_5sd_1y".to_string(), - ), - m2sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "m2sd_1y".to_string(), - ), - m2_5sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "m2_5sd_1y".to_string(), - ), - m3sd: PriceRatioPattern::new( - client.clone(), - "sth_realized_price".to_string(), - "m3sd_1y".to_string(), - ), + p0_5sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "p0_5sd_1y".to_string()), + p1sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "p1sd_1y".to_string()), + p1_5sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "p1_5sd_1y".to_string()), + p2sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "p2sd_1y".to_string()), + p2_5sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "p2_5sd_1y".to_string()), + p3sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "p3sd_1y".to_string()), + m0_5sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "m0_5sd_1y".to_string()), + m1sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "m1sd_1y".to_string()), + m1_5sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "m1_5sd_1y".to_string()), + m2sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "m2sd_1y".to_string()), + m2_5sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "m2_5sd_1y".to_string()), + m3sd: PriceRatioPattern::new(client.clone(), "sth_realized_price".to_string(), "m3sd_1y".to_string()), } } } @@ -9783,19 +7228,10 @@ impl SeriesTree_Cohorts_Utxo_Lth { Self { supply: DeltaHalfInToTotalPattern2::new(client.clone(), "lth_supply".to_string()), outputs: SpendingSpentUnspentPattern::new(client.clone(), "lth".to_string()), - activity: CoindaysCoinyearsDormancyTransferPattern::new( - client.clone(), - "lth".to_string(), - ), - realized: SeriesTree_Cohorts_Utxo_Lth_Realized::new( - client.clone(), - format!("{base_path}_realized"), - ), + activity: CoindaysCoinyearsDormancyTransferPattern::new(client.clone(), "lth".to_string()), + realized: SeriesTree_Cohorts_Utxo_Lth_Realized::new(client.clone(), format!("{base_path}_realized")), cost_basis: InMaxMinPerSupplyPattern::new(client.clone(), "lth".to_string()), - unrealized: GrossInvestedInvestorLossNetNuplProfitSentimentPattern2::new( - client.clone(), - "lth".to_string(), - ), + unrealized: GrossInvestedInvestorLossNetNuplProfitSentimentPattern2::new(client.clone(), "lth".to_string()), } } } @@ -9820,44 +7256,17 @@ impl SeriesTree_Cohorts_Utxo_Lth_Realized { pub fn new(client: Arc, base_path: String) -> Self { Self { cap: CentsDeltaToUsdPattern::new(client.clone(), "lth_realized_cap".to_string()), - profit: BlockCumulativeSumPattern::new( - client.clone(), - "lth_realized_profit".to_string(), - ), - loss: BlockCumulativeNegativeSumPattern::new( - client.clone(), - "lth_realized_loss".to_string(), - ), - price: SeriesTree_Cohorts_Utxo_Lth_Realized_Price::new( - client.clone(), - format!("{base_path}_price"), - ), + profit: BlockCumulativeSumPattern::new(client.clone(), "lth_realized_profit".to_string()), + loss: BlockCumulativeNegativeSumPattern::new(client.clone(), "lth_realized_loss".to_string()), + price: SeriesTree_Cohorts_Utxo_Lth_Realized_Price::new(client.clone(), format!("{base_path}_price")), mvrv: SeriesPattern1::new(client.clone(), "lth_mvrv".to_string()), - net_pnl: BlockChangeCumulativeDeltaSumPattern::new( - client.clone(), - "lth_net".to_string(), - ), - sopr: SeriesTree_Cohorts_Utxo_Lth_Realized_Sopr::new( - client.clone(), - format!("{base_path}_sopr"), - ), - gross_pnl: BlockCumulativeSumPattern::new( - client.clone(), - "lth_realized_gross_pnl".to_string(), - ), - sell_side_risk_ratio: _1m1w1y24hPattern7::new( - client.clone(), - "lth_sell_side_risk_ratio".to_string(), - ), - peak_regret: BlockCumulativeSumPattern::new( - client.clone(), - "lth_realized_peak_regret".to_string(), - ), + net_pnl: BlockChangeCumulativeDeltaSumPattern::new(client.clone(), "lth_net".to_string()), + sopr: SeriesTree_Cohorts_Utxo_Lth_Realized_Sopr::new(client.clone(), format!("{base_path}_sopr")), + gross_pnl: BlockCumulativeSumPattern::new(client.clone(), "lth_realized_gross_pnl".to_string()), + sell_side_risk_ratio: _1m1w1y24hPattern7::new(client.clone(), "lth_sell_side_risk_ratio".to_string()), + peak_regret: BlockCumulativeSumPattern::new(client.clone(), "lth_realized_peak_regret".to_string()), investor: PricePattern::new(client.clone(), "lth_investor_price".to_string()), - profit_to_loss_ratio: _1m1w1y24hPattern::new( - client.clone(), - "lth_realized_profit_to_loss_ratio".to_string(), - ), + profit_to_loss_ratio: _1m1w1y24hPattern::new(client.clone(), "lth_realized_profit_to_loss_ratio".to_string()), } } } @@ -9882,18 +7291,9 @@ impl SeriesTree_Cohorts_Utxo_Lth_Realized_Price { sats: SeriesPattern1::new(client.clone(), "lth_realized_price_sats".to_string()), bps: SeriesPattern1::new(client.clone(), "lth_realized_price_ratio_bps".to_string()), ratio: SeriesPattern1::new(client.clone(), "lth_realized_price_ratio".to_string()), - percentiles: Pct0Pct1Pct2Pct5Pct95Pct98Pct99Pattern::new( - client.clone(), - "lth_realized_price".to_string(), - ), - sma: _1m1w1y2y4yAllPattern::new( - client.clone(), - "lth_realized_price_ratio_sma".to_string(), - ), - std_dev: SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev::new( - client.clone(), - format!("{base_path}_std_dev"), - ), + percentiles: Pct0Pct1Pct2Pct5Pct95Pct98Pct99Pattern::new(client.clone(), "lth_realized_price".to_string()), + sma: _1m1w1y2y4yAllPattern::new(client.clone(), "lth_realized_price_ratio_sma".to_string()), + std_dev: SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev::new(client.clone(), format!("{base_path}_std_dev")), } } } @@ -9909,22 +7309,10 @@ pub struct SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev { impl SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev { pub fn new(client: Arc, base_path: String) -> Self { Self { - all: SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_All::new( - client.clone(), - format!("{base_path}_all"), - ), - _4y: SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_4y::new( - client.clone(), - format!("{base_path}_4y"), - ), - _2y: SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_2y::new( - client.clone(), - format!("{base_path}_2y"), - ), - _1y: SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_1y::new( - client.clone(), - format!("{base_path}_1y"), - ), + all: SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_All::new(client.clone(), format!("{base_path}_all")), + _4y: SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_4y::new(client.clone(), format!("{base_path}_4y")), + _2y: SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_2y::new(client.clone(), format!("{base_path}_2y")), + _1y: SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_1y::new(client.clone(), format!("{base_path}_1y")), } } } @@ -9952,71 +7340,20 @@ impl SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_All { pub fn new(client: Arc, base_path: String) -> Self { Self { sd: SeriesPattern1::new(client.clone(), "lth_realized_price_ratio_sd".to_string()), - zscore: SeriesPattern1::new( - client.clone(), - "lth_realized_price_ratio_zscore".to_string(), - ), + zscore: SeriesPattern1::new(client.clone(), "lth_realized_price_ratio_zscore".to_string()), _0sd: CentsSatsUsdPattern::new(client.clone(), "lth_realized_price_0sd".to_string()), - p0_5sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "p0_5sd".to_string(), - ), - p1sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "p1sd".to_string(), - ), - p1_5sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "p1_5sd".to_string(), - ), - p2sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "p2sd".to_string(), - ), - p2_5sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "p2_5sd".to_string(), - ), - p3sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "p3sd".to_string(), - ), - m0_5sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "m0_5sd".to_string(), - ), - m1sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "m1sd".to_string(), - ), - m1_5sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "m1_5sd".to_string(), - ), - m2sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "m2sd".to_string(), - ), - m2_5sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "m2_5sd".to_string(), - ), - m3sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "m3sd".to_string(), - ), + p0_5sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "p0_5sd".to_string()), + p1sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "p1sd".to_string()), + p1_5sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "p1_5sd".to_string()), + p2sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "p2sd".to_string()), + p2_5sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "p2_5sd".to_string()), + p3sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "p3sd".to_string()), + m0_5sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "m0_5sd".to_string()), + m1sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "m1sd".to_string()), + m1_5sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "m1_5sd".to_string()), + m2sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "m2sd".to_string()), + m2_5sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "m2_5sd".to_string()), + m3sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "m3sd".to_string()), } } } @@ -10044,71 +7381,20 @@ impl SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_4y { pub fn new(client: Arc, base_path: String) -> Self { Self { sd: SeriesPattern1::new(client.clone(), "lth_realized_price_ratio_sd_4y".to_string()), - zscore: SeriesPattern1::new( - client.clone(), - "lth_realized_price_ratio_zscore_4y".to_string(), - ), + zscore: SeriesPattern1::new(client.clone(), "lth_realized_price_ratio_zscore_4y".to_string()), _0sd: CentsSatsUsdPattern::new(client.clone(), "lth_realized_price_0sd_4y".to_string()), - p0_5sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "p0_5sd_4y".to_string(), - ), - p1sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "p1sd_4y".to_string(), - ), - p1_5sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "p1_5sd_4y".to_string(), - ), - p2sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "p2sd_4y".to_string(), - ), - p2_5sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "p2_5sd_4y".to_string(), - ), - p3sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "p3sd_4y".to_string(), - ), - m0_5sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "m0_5sd_4y".to_string(), - ), - m1sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "m1sd_4y".to_string(), - ), - m1_5sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "m1_5sd_4y".to_string(), - ), - m2sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "m2sd_4y".to_string(), - ), - m2_5sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "m2_5sd_4y".to_string(), - ), - m3sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "m3sd_4y".to_string(), - ), + p0_5sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "p0_5sd_4y".to_string()), + p1sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "p1sd_4y".to_string()), + p1_5sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "p1_5sd_4y".to_string()), + p2sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "p2sd_4y".to_string()), + p2_5sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "p2_5sd_4y".to_string()), + p3sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "p3sd_4y".to_string()), + m0_5sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "m0_5sd_4y".to_string()), + m1sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "m1sd_4y".to_string()), + m1_5sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "m1_5sd_4y".to_string()), + m2sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "m2sd_4y".to_string()), + m2_5sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "m2_5sd_4y".to_string()), + m3sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "m3sd_4y".to_string()), } } } @@ -10136,71 +7422,20 @@ impl SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_2y { pub fn new(client: Arc, base_path: String) -> Self { Self { sd: SeriesPattern1::new(client.clone(), "lth_realized_price_ratio_sd_2y".to_string()), - zscore: SeriesPattern1::new( - client.clone(), - "lth_realized_price_ratio_zscore_2y".to_string(), - ), + zscore: SeriesPattern1::new(client.clone(), "lth_realized_price_ratio_zscore_2y".to_string()), _0sd: CentsSatsUsdPattern::new(client.clone(), "lth_realized_price_0sd_2y".to_string()), - p0_5sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "p0_5sd_2y".to_string(), - ), - p1sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "p1sd_2y".to_string(), - ), - p1_5sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "p1_5sd_2y".to_string(), - ), - p2sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "p2sd_2y".to_string(), - ), - p2_5sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "p2_5sd_2y".to_string(), - ), - p3sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "p3sd_2y".to_string(), - ), - m0_5sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "m0_5sd_2y".to_string(), - ), - m1sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "m1sd_2y".to_string(), - ), - m1_5sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "m1_5sd_2y".to_string(), - ), - m2sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "m2sd_2y".to_string(), - ), - m2_5sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "m2_5sd_2y".to_string(), - ), - m3sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "m3sd_2y".to_string(), - ), + p0_5sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "p0_5sd_2y".to_string()), + p1sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "p1sd_2y".to_string()), + p1_5sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "p1_5sd_2y".to_string()), + p2sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "p2sd_2y".to_string()), + p2_5sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "p2_5sd_2y".to_string()), + p3sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "p3sd_2y".to_string()), + m0_5sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "m0_5sd_2y".to_string()), + m1sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "m1sd_2y".to_string()), + m1_5sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "m1_5sd_2y".to_string()), + m2sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "m2sd_2y".to_string()), + m2_5sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "m2_5sd_2y".to_string()), + m3sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "m3sd_2y".to_string()), } } } @@ -10228,71 +7463,20 @@ impl SeriesTree_Cohorts_Utxo_Lth_Realized_Price_StdDev_1y { pub fn new(client: Arc, base_path: String) -> Self { Self { sd: SeriesPattern1::new(client.clone(), "lth_realized_price_ratio_sd_1y".to_string()), - zscore: SeriesPattern1::new( - client.clone(), - "lth_realized_price_ratio_zscore_1y".to_string(), - ), + zscore: SeriesPattern1::new(client.clone(), "lth_realized_price_ratio_zscore_1y".to_string()), _0sd: CentsSatsUsdPattern::new(client.clone(), "lth_realized_price_0sd_1y".to_string()), - p0_5sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "p0_5sd_1y".to_string(), - ), - p1sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "p1sd_1y".to_string(), - ), - p1_5sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "p1_5sd_1y".to_string(), - ), - p2sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "p2sd_1y".to_string(), - ), - p2_5sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "p2_5sd_1y".to_string(), - ), - p3sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "p3sd_1y".to_string(), - ), - m0_5sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "m0_5sd_1y".to_string(), - ), - m1sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "m1sd_1y".to_string(), - ), - m1_5sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "m1_5sd_1y".to_string(), - ), - m2sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "m2sd_1y".to_string(), - ), - m2_5sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "m2_5sd_1y".to_string(), - ), - m3sd: PriceRatioPattern::new( - client.clone(), - "lth_realized_price".to_string(), - "m3sd_1y".to_string(), - ), + p0_5sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "p0_5sd_1y".to_string()), + p1sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "p1sd_1y".to_string()), + p1_5sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "p1_5sd_1y".to_string()), + p2sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "p2sd_1y".to_string()), + p2_5sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "p2_5sd_1y".to_string()), + p3sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "p3sd_1y".to_string()), + m0_5sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "m0_5sd_1y".to_string()), + m1sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "m1sd_1y".to_string()), + m1_5sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "m1_5sd_1y".to_string()), + m2sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "m2sd_1y".to_string()), + m2_5sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "m2_5sd_1y".to_string()), + m3sd: PriceRatioPattern::new(client.clone(), "lth_realized_price".to_string(), "m3sd_1y".to_string()), } } } @@ -10306,10 +7490,7 @@ pub struct SeriesTree_Cohorts_Utxo_Lth_Realized_Sopr { impl SeriesTree_Cohorts_Utxo_Lth_Realized_Sopr { pub fn new(client: Arc, base_path: String) -> Self { Self { - value_destroyed: AverageBlockCumulativeSumPattern::new( - client.clone(), - "lth_value_destroyed".to_string(), - ), + value_destroyed: AverageBlockCumulativeSumPattern::new(client.clone(), "lth_value_destroyed".to_string()), ratio: _1m1w1y24hPattern::new(client.clone(), "lth_sopr".to_string()), } } @@ -10343,90 +7524,27 @@ pub struct SeriesTree_Cohorts_Utxo_AgeRange { impl SeriesTree_Cohorts_Utxo_AgeRange { pub fn new(client: Arc, base_path: String) -> Self { Self { - under_1h: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_under_1h_old".to_string(), - ), - _1h_to_1d: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_1h_to_1d_old".to_string(), - ), - _1d_to_1w: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_1d_to_1w_old".to_string(), - ), - _1w_to_1m: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_1w_to_1m_old".to_string(), - ), - _1m_to_2m: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_1m_to_2m_old".to_string(), - ), - _2m_to_3m: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_2m_to_3m_old".to_string(), - ), - _3m_to_4m: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_3m_to_4m_old".to_string(), - ), - _4m_to_5m: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_4m_to_5m_old".to_string(), - ), - _5m_to_6m: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_5m_to_6m_old".to_string(), - ), - _6m_to_1y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_6m_to_1y_old".to_string(), - ), - _1y_to_2y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_1y_to_2y_old".to_string(), - ), - _2y_to_3y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_2y_to_3y_old".to_string(), - ), - _3y_to_4y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_3y_to_4y_old".to_string(), - ), - _4y_to_5y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_4y_to_5y_old".to_string(), - ), - _5y_to_6y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_5y_to_6y_old".to_string(), - ), - _6y_to_7y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_6y_to_7y_old".to_string(), - ), - _7y_to_8y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_7y_to_8y_old".to_string(), - ), - _8y_to_10y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_8y_to_10y_old".to_string(), - ), - _10y_to_12y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_10y_to_12y_old".to_string(), - ), - _12y_to_15y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_12y_to_15y_old".to_string(), - ), - over_15y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_15y_old".to_string(), - ), + under_1h: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_under_1h_old".to_string()), + _1h_to_1d: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_1h_to_1d_old".to_string()), + _1d_to_1w: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_1d_to_1w_old".to_string()), + _1w_to_1m: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_1w_to_1m_old".to_string()), + _1m_to_2m: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_1m_to_2m_old".to_string()), + _2m_to_3m: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_2m_to_3m_old".to_string()), + _3m_to_4m: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_3m_to_4m_old".to_string()), + _4m_to_5m: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_4m_to_5m_old".to_string()), + _5m_to_6m: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_5m_to_6m_old".to_string()), + _6m_to_1y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_6m_to_1y_old".to_string()), + _1y_to_2y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_1y_to_2y_old".to_string()), + _2y_to_3y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_2y_to_3y_old".to_string()), + _3y_to_4y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_3y_to_4y_old".to_string()), + _4y_to_5y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_4y_to_5y_old".to_string()), + _5y_to_6y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_5y_to_6y_old".to_string()), + _6y_to_7y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_6y_to_7y_old".to_string()), + _7y_to_8y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_7y_to_8y_old".to_string()), + _8y_to_10y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_8y_to_10y_old".to_string()), + _10y_to_12y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_10y_to_12y_old".to_string()), + _12y_to_15y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_12y_to_15y_old".to_string()), + over_15y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_15y_old".to_string()), } } } @@ -10456,78 +7574,24 @@ pub struct SeriesTree_Cohorts_Utxo_UnderAge { impl SeriesTree_Cohorts_Utxo_UnderAge { pub fn new(client: Arc, base_path: String) -> Self { Self { - _1w: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_under_1w_old".to_string(), - ), - _1m: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_under_1m_old".to_string(), - ), - _2m: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_under_2m_old".to_string(), - ), - _3m: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_under_3m_old".to_string(), - ), - _4m: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_under_4m_old".to_string(), - ), - _5m: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_under_5m_old".to_string(), - ), - _6m: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_under_6m_old".to_string(), - ), - _1y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_under_1y_old".to_string(), - ), - _2y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_under_2y_old".to_string(), - ), - _3y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_under_3y_old".to_string(), - ), - _4y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_under_4y_old".to_string(), - ), - _5y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_under_5y_old".to_string(), - ), - _6y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_under_6y_old".to_string(), - ), - _7y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_under_7y_old".to_string(), - ), - _8y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_under_8y_old".to_string(), - ), - _10y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_under_10y_old".to_string(), - ), - _12y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_under_12y_old".to_string(), - ), - _15y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_under_15y_old".to_string(), - ), + _1w: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_under_1w_old".to_string()), + _1m: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_under_1m_old".to_string()), + _2m: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_under_2m_old".to_string()), + _3m: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_under_3m_old".to_string()), + _4m: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_under_4m_old".to_string()), + _5m: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_under_5m_old".to_string()), + _6m: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_under_6m_old".to_string()), + _1y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_under_1y_old".to_string()), + _2y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_under_2y_old".to_string()), + _3y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_under_3y_old".to_string()), + _4y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_under_4y_old".to_string()), + _5y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_under_5y_old".to_string()), + _6y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_under_6y_old".to_string()), + _7y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_under_7y_old".to_string()), + _8y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_under_8y_old".to_string()), + _10y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_under_10y_old".to_string()), + _12y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_under_12y_old".to_string()), + _15y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_under_15y_old".to_string()), } } } @@ -10557,78 +7621,24 @@ pub struct SeriesTree_Cohorts_Utxo_OverAge { impl SeriesTree_Cohorts_Utxo_OverAge { pub fn new(client: Arc, base_path: String) -> Self { Self { - _1d: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_1d_old".to_string(), - ), - _1w: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_1w_old".to_string(), - ), - _1m: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_1m_old".to_string(), - ), - _2m: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_2m_old".to_string(), - ), - _3m: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_3m_old".to_string(), - ), - _4m: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_4m_old".to_string(), - ), - _5m: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_5m_old".to_string(), - ), - _6m: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_6m_old".to_string(), - ), - _1y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_1y_old".to_string(), - ), - _2y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_2y_old".to_string(), - ), - _3y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_3y_old".to_string(), - ), - _4y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_4y_old".to_string(), - ), - _5y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_5y_old".to_string(), - ), - _6y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_6y_old".to_string(), - ), - _7y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_7y_old".to_string(), - ), - _8y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_8y_old".to_string(), - ), - _10y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_10y_old".to_string(), - ), - _12y: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_12y_old".to_string(), - ), + _1d: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_1d_old".to_string()), + _1w: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_1w_old".to_string()), + _1m: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_1m_old".to_string()), + _2m: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_2m_old".to_string()), + _3m: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_3m_old".to_string()), + _4m: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_4m_old".to_string()), + _5m: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_5m_old".to_string()), + _6m: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_6m_old".to_string()), + _1y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_1y_old".to_string()), + _2y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_2y_old".to_string()), + _3y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_3y_old".to_string()), + _4y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_4y_old".to_string()), + _5y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_5y_old".to_string()), + _6y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_6y_old".to_string()), + _7y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_7y_old".to_string()), + _8y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_8y_old".to_string()), + _10y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_10y_old".to_string()), + _12y: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_12y_old".to_string()), } } } @@ -10645,26 +7655,11 @@ pub struct SeriesTree_Cohorts_Utxo_Epoch { impl SeriesTree_Cohorts_Utxo_Epoch { pub fn new(client: Arc, base_path: String) -> Self { Self { - _0: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "epoch_0".to_string(), - ), - _1: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "epoch_1".to_string(), - ), - _2: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "epoch_2".to_string(), - ), - _3: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "epoch_3".to_string(), - ), - _4: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "epoch_4".to_string(), - ), + _0: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "epoch_0".to_string()), + _1: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "epoch_1".to_string()), + _2: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "epoch_2".to_string()), + _3: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "epoch_3".to_string()), + _4: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "epoch_4".to_string()), } } } @@ -10694,78 +7689,24 @@ pub struct SeriesTree_Cohorts_Utxo_Class { impl SeriesTree_Cohorts_Utxo_Class { pub fn new(client: Arc, base_path: String) -> Self { Self { - _2009: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "class_2009".to_string(), - ), - _2010: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "class_2010".to_string(), - ), - _2011: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "class_2011".to_string(), - ), - _2012: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "class_2012".to_string(), - ), - _2013: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "class_2013".to_string(), - ), - _2014: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "class_2014".to_string(), - ), - _2015: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "class_2015".to_string(), - ), - _2016: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "class_2016".to_string(), - ), - _2017: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "class_2017".to_string(), - ), - _2018: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "class_2018".to_string(), - ), - _2019: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "class_2019".to_string(), - ), - _2020: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "class_2020".to_string(), - ), - _2021: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "class_2021".to_string(), - ), - _2022: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "class_2022".to_string(), - ), - _2023: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "class_2023".to_string(), - ), - _2024: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "class_2024".to_string(), - ), - _2025: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "class_2025".to_string(), - ), - _2026: ActivityOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "class_2026".to_string(), - ), + _2009: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "class_2009".to_string()), + _2010: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "class_2010".to_string()), + _2011: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "class_2011".to_string()), + _2012: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "class_2012".to_string()), + _2013: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "class_2013".to_string()), + _2014: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "class_2014".to_string()), + _2015: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "class_2015".to_string()), + _2016: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "class_2016".to_string()), + _2017: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "class_2017".to_string()), + _2018: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "class_2018".to_string()), + _2019: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "class_2019".to_string()), + _2020: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "class_2020".to_string()), + _2021: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "class_2021".to_string()), + _2022: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "class_2022".to_string()), + _2023: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "class_2023".to_string()), + _2024: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "class_2024".to_string()), + _2025: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "class_2025".to_string()), + _2026: ActivityOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "class_2026".to_string()), } } } @@ -10790,58 +7731,19 @@ pub struct SeriesTree_Cohorts_Utxo_OverAmount { impl SeriesTree_Cohorts_Utxo_OverAmount { pub fn new(client: Arc, base_path: String) -> Self { Self { - _1sat: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_over_1sat".to_string(), - ), - _10sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_over_10sats".to_string(), - ), - _100sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_over_100sats".to_string(), - ), - _1k_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_over_1k_sats".to_string(), - ), - _10k_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_over_10k_sats".to_string(), - ), - _100k_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_over_100k_sats".to_string(), - ), - _1m_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_over_1m_sats".to_string(), - ), - _10m_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_over_10m_sats".to_string(), - ), - _1btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_over_1btc".to_string(), - ), - _10btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_over_10btc".to_string(), - ), - _100btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_over_100btc".to_string(), - ), - _1k_btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_over_1k_btc".to_string(), - ), - _10k_btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_over_10k_btc".to_string(), - ), + _1sat: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_over_1sat".to_string()), + _10sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_over_10sats".to_string()), + _100sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_over_100sats".to_string()), + _1k_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_over_1k_sats".to_string()), + _10k_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_over_10k_sats".to_string()), + _100k_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_over_100k_sats".to_string()), + _1m_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_over_1m_sats".to_string()), + _10m_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_over_10m_sats".to_string()), + _1btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_over_1btc".to_string()), + _10btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_over_10btc".to_string()), + _100btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_over_100btc".to_string()), + _1k_btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_over_1k_btc".to_string()), + _10k_btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_over_10k_btc".to_string()), } } } @@ -10868,66 +7770,21 @@ pub struct SeriesTree_Cohorts_Utxo_AmountRange { impl SeriesTree_Cohorts_Utxo_AmountRange { pub fn new(client: Arc, base_path: String) -> Self { Self { - _0sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_0sats".to_string(), - ), - _1sat_to_10sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_1sat_to_10sats".to_string(), - ), - _10sats_to_100sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_10sats_to_100sats".to_string(), - ), - _100sats_to_1k_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_100sats_to_1k_sats".to_string(), - ), - _1k_sats_to_10k_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_1k_sats_to_10k_sats".to_string(), - ), - _10k_sats_to_100k_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_10k_sats_to_100k_sats".to_string(), - ), - _100k_sats_to_1m_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_100k_sats_to_1m_sats".to_string(), - ), - _1m_sats_to_10m_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_1m_sats_to_10m_sats".to_string(), - ), - _10m_sats_to_1btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_10m_sats_to_1btc".to_string(), - ), - _1btc_to_10btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_1btc_to_10btc".to_string(), - ), - _10btc_to_100btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_10btc_to_100btc".to_string(), - ), - _100btc_to_1k_btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_100btc_to_1k_btc".to_string(), - ), - _1k_btc_to_10k_btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_1k_btc_to_10k_btc".to_string(), - ), - _10k_btc_to_100k_btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_10k_btc_to_100k_btc".to_string(), - ), - over_100k_btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_over_100k_btc".to_string(), - ), + _0sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_0sats".to_string()), + _1sat_to_10sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_1sat_to_10sats".to_string()), + _10sats_to_100sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_10sats_to_100sats".to_string()), + _100sats_to_1k_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_100sats_to_1k_sats".to_string()), + _1k_sats_to_10k_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_1k_sats_to_10k_sats".to_string()), + _10k_sats_to_100k_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_10k_sats_to_100k_sats".to_string()), + _100k_sats_to_1m_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_100k_sats_to_1m_sats".to_string()), + _1m_sats_to_10m_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_1m_sats_to_10m_sats".to_string()), + _10m_sats_to_1btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_10m_sats_to_1btc".to_string()), + _1btc_to_10btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_1btc_to_10btc".to_string()), + _10btc_to_100btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_10btc_to_100btc".to_string()), + _100btc_to_1k_btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_100btc_to_1k_btc".to_string()), + _1k_btc_to_10k_btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_1k_btc_to_10k_btc".to_string()), + _10k_btc_to_100k_btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_10k_btc_to_100k_btc".to_string()), + over_100k_btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_over_100k_btc".to_string()), } } } @@ -10952,58 +7809,19 @@ pub struct SeriesTree_Cohorts_Utxo_UnderAmount { impl SeriesTree_Cohorts_Utxo_UnderAmount { pub fn new(client: Arc, base_path: String) -> Self { Self { - _10sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_under_10sats".to_string(), - ), - _100sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_under_100sats".to_string(), - ), - _1k_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_under_1k_sats".to_string(), - ), - _10k_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_under_10k_sats".to_string(), - ), - _100k_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_under_100k_sats".to_string(), - ), - _1m_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_under_1m_sats".to_string(), - ), - _10m_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_under_10m_sats".to_string(), - ), - _1btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_under_1btc".to_string(), - ), - _10btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_under_10btc".to_string(), - ), - _100btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_under_100btc".to_string(), - ), - _1k_btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_under_1k_btc".to_string(), - ), - _10k_btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_under_10k_btc".to_string(), - ), - _100k_btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new( - client.clone(), - "utxos_under_100k_btc".to_string(), - ), + _10sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_under_10sats".to_string()), + _100sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_under_100sats".to_string()), + _1k_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_under_1k_sats".to_string()), + _10k_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_under_10k_sats".to_string()), + _100k_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_under_100k_sats".to_string()), + _1m_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_under_1m_sats".to_string()), + _10m_sats: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_under_10m_sats".to_string()), + _1btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_under_1btc".to_string()), + _10btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_under_10btc".to_string()), + _100btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_under_100btc".to_string()), + _1k_btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_under_1k_btc".to_string()), + _10k_btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_under_10k_btc".to_string()), + _100k_btc: ActivityOutputsRealizedSupplyUnrealizedPattern2::new(client.clone(), "utxos_under_100k_btc".to_string()), } } } @@ -11026,50 +7844,17 @@ pub struct SeriesTree_Cohorts_Utxo_Type { impl SeriesTree_Cohorts_Utxo_Type { pub fn new(client: Arc, base_path: String) -> Self { Self { - p2pk65: ActivityOutputsRealizedSupplyUnrealizedPattern3::new( - client.clone(), - "p2pk65".to_string(), - ), - p2pk33: ActivityOutputsRealizedSupplyUnrealizedPattern3::new( - client.clone(), - "p2pk33".to_string(), - ), - p2pkh: ActivityOutputsRealizedSupplyUnrealizedPattern3::new( - client.clone(), - "p2pkh".to_string(), - ), - p2ms: ActivityOutputsRealizedSupplyUnrealizedPattern3::new( - client.clone(), - "p2ms".to_string(), - ), - p2sh: ActivityOutputsRealizedSupplyUnrealizedPattern3::new( - client.clone(), - "p2sh".to_string(), - ), - p2wpkh: ActivityOutputsRealizedSupplyUnrealizedPattern3::new( - client.clone(), - "p2wpkh".to_string(), - ), - p2wsh: ActivityOutputsRealizedSupplyUnrealizedPattern3::new( - client.clone(), - "p2wsh".to_string(), - ), - p2tr: ActivityOutputsRealizedSupplyUnrealizedPattern3::new( - client.clone(), - "p2tr".to_string(), - ), - p2a: ActivityOutputsRealizedSupplyUnrealizedPattern3::new( - client.clone(), - "p2a".to_string(), - ), - unknown: ActivityOutputsRealizedSupplyUnrealizedPattern3::new( - client.clone(), - "unknown_outputs".to_string(), - ), - empty: ActivityOutputsRealizedSupplyUnrealizedPattern3::new( - client.clone(), - "empty_outputs".to_string(), - ), + p2pk65: ActivityOutputsRealizedSupplyUnrealizedPattern3::new(client.clone(), "p2pk65".to_string()), + p2pk33: ActivityOutputsRealizedSupplyUnrealizedPattern3::new(client.clone(), "p2pk33".to_string()), + p2pkh: ActivityOutputsRealizedSupplyUnrealizedPattern3::new(client.clone(), "p2pkh".to_string()), + p2ms: ActivityOutputsRealizedSupplyUnrealizedPattern3::new(client.clone(), "p2ms".to_string()), + p2sh: ActivityOutputsRealizedSupplyUnrealizedPattern3::new(client.clone(), "p2sh".to_string()), + p2wpkh: ActivityOutputsRealizedSupplyUnrealizedPattern3::new(client.clone(), "p2wpkh".to_string()), + p2wsh: ActivityOutputsRealizedSupplyUnrealizedPattern3::new(client.clone(), "p2wsh".to_string()), + p2tr: ActivityOutputsRealizedSupplyUnrealizedPattern3::new(client.clone(), "p2tr".to_string()), + p2a: ActivityOutputsRealizedSupplyUnrealizedPattern3::new(client.clone(), "p2a".to_string()), + unknown: ActivityOutputsRealizedSupplyUnrealizedPattern3::new(client.clone(), "unknown_outputs".to_string()), + empty: ActivityOutputsRealizedSupplyUnrealizedPattern3::new(client.clone(), "empty_outputs".to_string()), } } } @@ -11084,18 +7869,9 @@ pub struct SeriesTree_Cohorts_Utxo_Profitability { impl SeriesTree_Cohorts_Utxo_Profitability { pub fn new(client: Arc, base_path: String) -> Self { Self { - range: SeriesTree_Cohorts_Utxo_Profitability_Range::new( - client.clone(), - format!("{base_path}_range"), - ), - profit: SeriesTree_Cohorts_Utxo_Profitability_Profit::new( - client.clone(), - format!("{base_path}_profit"), - ), - loss: SeriesTree_Cohorts_Utxo_Profitability_Loss::new( - client.clone(), - format!("{base_path}_loss"), - ), + range: SeriesTree_Cohorts_Utxo_Profitability_Range::new(client.clone(), format!("{base_path}_range")), + profit: SeriesTree_Cohorts_Utxo_Profitability_Profit::new(client.clone(), format!("{base_path}_profit")), + loss: SeriesTree_Cohorts_Utxo_Profitability_Loss::new(client.clone(), format!("{base_path}_loss")), } } } @@ -11132,106 +7908,31 @@ pub struct SeriesTree_Cohorts_Utxo_Profitability_Range { impl SeriesTree_Cohorts_Utxo_Profitability_Range { pub fn new(client: Arc, base_path: String) -> Self { Self { - over_1000pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_1000pct_in_profit".to_string(), - ), - _500pct_to_1000pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_500pct_to_1000pct_in_profit".to_string(), - ), - _300pct_to_500pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_300pct_to_500pct_in_profit".to_string(), - ), - _200pct_to_300pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_200pct_to_300pct_in_profit".to_string(), - ), - _100pct_to_200pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_100pct_to_200pct_in_profit".to_string(), - ), - _90pct_to_100pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_90pct_to_100pct_in_profit".to_string(), - ), - _80pct_to_90pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_80pct_to_90pct_in_profit".to_string(), - ), - _70pct_to_80pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_70pct_to_80pct_in_profit".to_string(), - ), - _60pct_to_70pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_60pct_to_70pct_in_profit".to_string(), - ), - _50pct_to_60pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_50pct_to_60pct_in_profit".to_string(), - ), - _40pct_to_50pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_40pct_to_50pct_in_profit".to_string(), - ), - _30pct_to_40pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_30pct_to_40pct_in_profit".to_string(), - ), - _20pct_to_30pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_20pct_to_30pct_in_profit".to_string(), - ), - _10pct_to_20pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_10pct_to_20pct_in_profit".to_string(), - ), - _0pct_to_10pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_0pct_to_10pct_in_profit".to_string(), - ), - _0pct_to_10pct_in_loss: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_0pct_to_10pct_in_loss".to_string(), - ), - _10pct_to_20pct_in_loss: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_10pct_to_20pct_in_loss".to_string(), - ), - _20pct_to_30pct_in_loss: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_20pct_to_30pct_in_loss".to_string(), - ), - _30pct_to_40pct_in_loss: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_30pct_to_40pct_in_loss".to_string(), - ), - _40pct_to_50pct_in_loss: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_40pct_to_50pct_in_loss".to_string(), - ), - _50pct_to_60pct_in_loss: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_50pct_to_60pct_in_loss".to_string(), - ), - _60pct_to_70pct_in_loss: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_60pct_to_70pct_in_loss".to_string(), - ), - _70pct_to_80pct_in_loss: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_70pct_to_80pct_in_loss".to_string(), - ), - _80pct_to_90pct_in_loss: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_80pct_to_90pct_in_loss".to_string(), - ), - _90pct_to_100pct_in_loss: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_90pct_to_100pct_in_loss".to_string(), - ), + over_1000pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_1000pct_in_profit".to_string()), + _500pct_to_1000pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_500pct_to_1000pct_in_profit".to_string()), + _300pct_to_500pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_300pct_to_500pct_in_profit".to_string()), + _200pct_to_300pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_200pct_to_300pct_in_profit".to_string()), + _100pct_to_200pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_100pct_to_200pct_in_profit".to_string()), + _90pct_to_100pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_90pct_to_100pct_in_profit".to_string()), + _80pct_to_90pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_80pct_to_90pct_in_profit".to_string()), + _70pct_to_80pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_70pct_to_80pct_in_profit".to_string()), + _60pct_to_70pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_60pct_to_70pct_in_profit".to_string()), + _50pct_to_60pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_50pct_to_60pct_in_profit".to_string()), + _40pct_to_50pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_40pct_to_50pct_in_profit".to_string()), + _30pct_to_40pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_30pct_to_40pct_in_profit".to_string()), + _20pct_to_30pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_20pct_to_30pct_in_profit".to_string()), + _10pct_to_20pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_10pct_to_20pct_in_profit".to_string()), + _0pct_to_10pct_in_profit: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_0pct_to_10pct_in_profit".to_string()), + _0pct_to_10pct_in_loss: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_0pct_to_10pct_in_loss".to_string()), + _10pct_to_20pct_in_loss: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_10pct_to_20pct_in_loss".to_string()), + _20pct_to_30pct_in_loss: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_20pct_to_30pct_in_loss".to_string()), + _30pct_to_40pct_in_loss: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_30pct_to_40pct_in_loss".to_string()), + _40pct_to_50pct_in_loss: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_40pct_to_50pct_in_loss".to_string()), + _50pct_to_60pct_in_loss: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_50pct_to_60pct_in_loss".to_string()), + _60pct_to_70pct_in_loss: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_60pct_to_70pct_in_loss".to_string()), + _70pct_to_80pct_in_loss: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_70pct_to_80pct_in_loss".to_string()), + _80pct_to_90pct_in_loss: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_80pct_to_90pct_in_loss".to_string()), + _90pct_to_100pct_in_loss: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_90pct_to_100pct_in_loss".to_string()), } } } @@ -11257,62 +7958,20 @@ pub struct SeriesTree_Cohorts_Utxo_Profitability_Profit { impl SeriesTree_Cohorts_Utxo_Profitability_Profit { pub fn new(client: Arc, base_path: String) -> Self { Self { - all: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_in_profit".to_string(), - ), - _10pct: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_10pct_in_profit".to_string(), - ), - _20pct: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_20pct_in_profit".to_string(), - ), - _30pct: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_30pct_in_profit".to_string(), - ), - _40pct: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_40pct_in_profit".to_string(), - ), - _50pct: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_50pct_in_profit".to_string(), - ), - _60pct: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_60pct_in_profit".to_string(), - ), - _70pct: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_70pct_in_profit".to_string(), - ), - _80pct: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_80pct_in_profit".to_string(), - ), - _90pct: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_90pct_in_profit".to_string(), - ), - _100pct: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_100pct_in_profit".to_string(), - ), - _200pct: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_200pct_in_profit".to_string(), - ), - _300pct: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_300pct_in_profit".to_string(), - ), - _500pct: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_500pct_in_profit".to_string(), - ), + all: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_in_profit".to_string()), + _10pct: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_10pct_in_profit".to_string()), + _20pct: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_20pct_in_profit".to_string()), + _30pct: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_30pct_in_profit".to_string()), + _40pct: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_40pct_in_profit".to_string()), + _50pct: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_50pct_in_profit".to_string()), + _60pct: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_60pct_in_profit".to_string()), + _70pct: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_70pct_in_profit".to_string()), + _80pct: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_80pct_in_profit".to_string()), + _90pct: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_90pct_in_profit".to_string()), + _100pct: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_100pct_in_profit".to_string()), + _200pct: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_200pct_in_profit".to_string()), + _300pct: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_300pct_in_profit".to_string()), + _500pct: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_500pct_in_profit".to_string()), } } } @@ -11333,42 +7992,15 @@ pub struct SeriesTree_Cohorts_Utxo_Profitability_Loss { impl SeriesTree_Cohorts_Utxo_Profitability_Loss { pub fn new(client: Arc, base_path: String) -> Self { Self { - all: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_in_loss".to_string(), - ), - _10pct: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_10pct_in_loss".to_string(), - ), - _20pct: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_20pct_in_loss".to_string(), - ), - _30pct: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_30pct_in_loss".to_string(), - ), - _40pct: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_40pct_in_loss".to_string(), - ), - _50pct: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_50pct_in_loss".to_string(), - ), - _60pct: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_60pct_in_loss".to_string(), - ), - _70pct: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_70pct_in_loss".to_string(), - ), - _80pct: NuplRealizedSupplyUnrealizedPattern::new( - client.clone(), - "utxos_over_80pct_in_loss".to_string(), - ), + all: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_in_loss".to_string()), + _10pct: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_10pct_in_loss".to_string()), + _20pct: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_20pct_in_loss".to_string()), + _30pct: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_30pct_in_loss".to_string()), + _40pct: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_40pct_in_loss".to_string()), + _50pct: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_50pct_in_loss".to_string()), + _60pct: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_60pct_in_loss".to_string()), + _70pct: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_70pct_in_loss".to_string()), + _80pct: NuplRealizedSupplyUnrealizedPattern::new(client.clone(), "utxos_over_80pct_in_loss".to_string()), } } } @@ -11401,90 +8033,27 @@ pub struct SeriesTree_Cohorts_Utxo_Matured { impl SeriesTree_Cohorts_Utxo_Matured { pub fn new(client: Arc, base_path: String) -> Self { Self { - under_1h: AverageBlockCumulativeSumPattern3::new( - client.clone(), - "utxos_under_1h_old_matured_supply".to_string(), - ), - _1h_to_1d: AverageBlockCumulativeSumPattern3::new( - client.clone(), - "utxos_1h_to_1d_old_matured_supply".to_string(), - ), - _1d_to_1w: AverageBlockCumulativeSumPattern3::new( - client.clone(), - "utxos_1d_to_1w_old_matured_supply".to_string(), - ), - _1w_to_1m: AverageBlockCumulativeSumPattern3::new( - client.clone(), - "utxos_1w_to_1m_old_matured_supply".to_string(), - ), - _1m_to_2m: AverageBlockCumulativeSumPattern3::new( - client.clone(), - "utxos_1m_to_2m_old_matured_supply".to_string(), - ), - _2m_to_3m: AverageBlockCumulativeSumPattern3::new( - client.clone(), - "utxos_2m_to_3m_old_matured_supply".to_string(), - ), - _3m_to_4m: AverageBlockCumulativeSumPattern3::new( - client.clone(), - "utxos_3m_to_4m_old_matured_supply".to_string(), - ), - _4m_to_5m: AverageBlockCumulativeSumPattern3::new( - client.clone(), - "utxos_4m_to_5m_old_matured_supply".to_string(), - ), - _5m_to_6m: AverageBlockCumulativeSumPattern3::new( - client.clone(), - "utxos_5m_to_6m_old_matured_supply".to_string(), - ), - _6m_to_1y: AverageBlockCumulativeSumPattern3::new( - client.clone(), - "utxos_6m_to_1y_old_matured_supply".to_string(), - ), - _1y_to_2y: AverageBlockCumulativeSumPattern3::new( - client.clone(), - "utxos_1y_to_2y_old_matured_supply".to_string(), - ), - _2y_to_3y: AverageBlockCumulativeSumPattern3::new( - client.clone(), - "utxos_2y_to_3y_old_matured_supply".to_string(), - ), - _3y_to_4y: AverageBlockCumulativeSumPattern3::new( - client.clone(), - "utxos_3y_to_4y_old_matured_supply".to_string(), - ), - _4y_to_5y: AverageBlockCumulativeSumPattern3::new( - client.clone(), - "utxos_4y_to_5y_old_matured_supply".to_string(), - ), - _5y_to_6y: AverageBlockCumulativeSumPattern3::new( - client.clone(), - "utxos_5y_to_6y_old_matured_supply".to_string(), - ), - _6y_to_7y: AverageBlockCumulativeSumPattern3::new( - client.clone(), - "utxos_6y_to_7y_old_matured_supply".to_string(), - ), - _7y_to_8y: AverageBlockCumulativeSumPattern3::new( - client.clone(), - "utxos_7y_to_8y_old_matured_supply".to_string(), - ), - _8y_to_10y: AverageBlockCumulativeSumPattern3::new( - client.clone(), - "utxos_8y_to_10y_old_matured_supply".to_string(), - ), - _10y_to_12y: AverageBlockCumulativeSumPattern3::new( - client.clone(), - "utxos_10y_to_12y_old_matured_supply".to_string(), - ), - _12y_to_15y: AverageBlockCumulativeSumPattern3::new( - client.clone(), - "utxos_12y_to_15y_old_matured_supply".to_string(), - ), - over_15y: AverageBlockCumulativeSumPattern3::new( - client.clone(), - "utxos_over_15y_old_matured_supply".to_string(), - ), + under_1h: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_under_1h_old_matured_supply".to_string()), + _1h_to_1d: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_1h_to_1d_old_matured_supply".to_string()), + _1d_to_1w: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_1d_to_1w_old_matured_supply".to_string()), + _1w_to_1m: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_1w_to_1m_old_matured_supply".to_string()), + _1m_to_2m: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_1m_to_2m_old_matured_supply".to_string()), + _2m_to_3m: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_2m_to_3m_old_matured_supply".to_string()), + _3m_to_4m: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_3m_to_4m_old_matured_supply".to_string()), + _4m_to_5m: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_4m_to_5m_old_matured_supply".to_string()), + _5m_to_6m: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_5m_to_6m_old_matured_supply".to_string()), + _6m_to_1y: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_6m_to_1y_old_matured_supply".to_string()), + _1y_to_2y: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_1y_to_2y_old_matured_supply".to_string()), + _2y_to_3y: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_2y_to_3y_old_matured_supply".to_string()), + _3y_to_4y: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_3y_to_4y_old_matured_supply".to_string()), + _4y_to_5y: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_4y_to_5y_old_matured_supply".to_string()), + _5y_to_6y: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_5y_to_6y_old_matured_supply".to_string()), + _6y_to_7y: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_6y_to_7y_old_matured_supply".to_string()), + _7y_to_8y: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_7y_to_8y_old_matured_supply".to_string()), + _8y_to_10y: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_8y_to_10y_old_matured_supply".to_string()), + _10y_to_12y: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_10y_to_12y_old_matured_supply".to_string()), + _12y_to_15y: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_12y_to_15y_old_matured_supply".to_string()), + over_15y: AverageBlockCumulativeSumPattern3::new(client.clone(), "utxos_over_15y_old_matured_supply".to_string()), } } } @@ -11499,18 +8068,9 @@ pub struct SeriesTree_Cohorts_Addr { impl SeriesTree_Cohorts_Addr { pub fn new(client: Arc, base_path: String) -> Self { Self { - over_amount: SeriesTree_Cohorts_Addr_OverAmount::new( - client.clone(), - format!("{base_path}_over_amount"), - ), - amount_range: SeriesTree_Cohorts_Addr_AmountRange::new( - client.clone(), - format!("{base_path}_amount_range"), - ), - under_amount: SeriesTree_Cohorts_Addr_UnderAmount::new( - client.clone(), - format!("{base_path}_under_amount"), - ), + over_amount: SeriesTree_Cohorts_Addr_OverAmount::new(client.clone(), format!("{base_path}_over_amount")), + amount_range: SeriesTree_Cohorts_Addr_AmountRange::new(client.clone(), format!("{base_path}_amount_range")), + under_amount: SeriesTree_Cohorts_Addr_UnderAmount::new(client.clone(), format!("{base_path}_under_amount")), } } } @@ -11535,58 +8095,19 @@ pub struct SeriesTree_Cohorts_Addr_OverAmount { impl SeriesTree_Cohorts_Addr_OverAmount { pub fn new(client: Arc, base_path: String) -> Self { Self { - _1sat: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_over_1sat".to_string(), - ), - _10sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_over_10sats".to_string(), - ), - _100sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_over_100sats".to_string(), - ), - _1k_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_over_1k_sats".to_string(), - ), - _10k_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_over_10k_sats".to_string(), - ), - _100k_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_over_100k_sats".to_string(), - ), - _1m_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_over_1m_sats".to_string(), - ), - _10m_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_over_10m_sats".to_string(), - ), - _1btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_over_1btc".to_string(), - ), - _10btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_over_10btc".to_string(), - ), - _100btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_over_100btc".to_string(), - ), - _1k_btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_over_1k_btc".to_string(), - ), - _10k_btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_over_10k_btc".to_string(), - ), + _1sat: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_over_1sat".to_string()), + _10sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_over_10sats".to_string()), + _100sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_over_100sats".to_string()), + _1k_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_over_1k_sats".to_string()), + _10k_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_over_10k_sats".to_string()), + _100k_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_over_100k_sats".to_string()), + _1m_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_over_1m_sats".to_string()), + _10m_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_over_10m_sats".to_string()), + _1btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_over_1btc".to_string()), + _10btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_over_10btc".to_string()), + _100btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_over_100btc".to_string()), + _1k_btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_over_1k_btc".to_string()), + _10k_btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_over_10k_btc".to_string()), } } } @@ -11613,66 +8134,21 @@ pub struct SeriesTree_Cohorts_Addr_AmountRange { impl SeriesTree_Cohorts_Addr_AmountRange { pub fn new(client: Arc, base_path: String) -> Self { Self { - _0sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_0sats".to_string(), - ), - _1sat_to_10sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_1sat_to_10sats".to_string(), - ), - _10sats_to_100sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_10sats_to_100sats".to_string(), - ), - _100sats_to_1k_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_100sats_to_1k_sats".to_string(), - ), - _1k_sats_to_10k_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_1k_sats_to_10k_sats".to_string(), - ), - _10k_sats_to_100k_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_10k_sats_to_100k_sats".to_string(), - ), - _100k_sats_to_1m_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_100k_sats_to_1m_sats".to_string(), - ), - _1m_sats_to_10m_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_1m_sats_to_10m_sats".to_string(), - ), - _10m_sats_to_1btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_10m_sats_to_1btc".to_string(), - ), - _1btc_to_10btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_1btc_to_10btc".to_string(), - ), - _10btc_to_100btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_10btc_to_100btc".to_string(), - ), - _100btc_to_1k_btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_100btc_to_1k_btc".to_string(), - ), - _1k_btc_to_10k_btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_1k_btc_to_10k_btc".to_string(), - ), - _10k_btc_to_100k_btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_10k_btc_to_100k_btc".to_string(), - ), - over_100k_btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_over_100k_btc".to_string(), - ), + _0sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_0sats".to_string()), + _1sat_to_10sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_1sat_to_10sats".to_string()), + _10sats_to_100sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_10sats_to_100sats".to_string()), + _100sats_to_1k_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_100sats_to_1k_sats".to_string()), + _1k_sats_to_10k_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_1k_sats_to_10k_sats".to_string()), + _10k_sats_to_100k_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_10k_sats_to_100k_sats".to_string()), + _100k_sats_to_1m_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_100k_sats_to_1m_sats".to_string()), + _1m_sats_to_10m_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_1m_sats_to_10m_sats".to_string()), + _10m_sats_to_1btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_10m_sats_to_1btc".to_string()), + _1btc_to_10btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_1btc_to_10btc".to_string()), + _10btc_to_100btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_10btc_to_100btc".to_string()), + _100btc_to_1k_btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_100btc_to_1k_btc".to_string()), + _1k_btc_to_10k_btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_1k_btc_to_10k_btc".to_string()), + _10k_btc_to_100k_btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_10k_btc_to_100k_btc".to_string()), + over_100k_btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_over_100k_btc".to_string()), } } } @@ -11697,58 +8173,19 @@ pub struct SeriesTree_Cohorts_Addr_UnderAmount { impl SeriesTree_Cohorts_Addr_UnderAmount { pub fn new(client: Arc, base_path: String) -> Self { Self { - _10sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_under_10sats".to_string(), - ), - _100sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_under_100sats".to_string(), - ), - _1k_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_under_1k_sats".to_string(), - ), - _10k_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_under_10k_sats".to_string(), - ), - _100k_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_under_100k_sats".to_string(), - ), - _1m_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_under_1m_sats".to_string(), - ), - _10m_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_under_10m_sats".to_string(), - ), - _1btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_under_1btc".to_string(), - ), - _10btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_under_10btc".to_string(), - ), - _100btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_under_100btc".to_string(), - ), - _1k_btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_under_1k_btc".to_string(), - ), - _10k_btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_under_10k_btc".to_string(), - ), - _100k_btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new( - client.clone(), - "addrs_under_100k_btc".to_string(), - ), + _10sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_under_10sats".to_string()), + _100sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_under_100sats".to_string()), + _1k_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_under_1k_sats".to_string()), + _10k_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_under_10k_sats".to_string()), + _100k_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_under_100k_sats".to_string()), + _1m_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_under_1m_sats".to_string()), + _10m_sats: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_under_10m_sats".to_string()), + _1btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_under_1btc".to_string()), + _10btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_under_10btc".to_string()), + _100btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_under_100btc".to_string()), + _1k_btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_under_1k_btc".to_string()), + _10k_btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_under_10k_btc".to_string()), + _100k_btc: ActivityAddrOutputsRealizedSupplyUnrealizedPattern::new(client.clone(), "addrs_under_100k_btc".to_string()), } } } @@ -11761,7 +8198,7 @@ pub struct BrkClient { impl BrkClient { /// Client version. - pub const VERSION: &'static str = "v0.3.0-alpha.6"; + pub const VERSION: &'static str = "v0.3.0-beta.1"; /// Create a new client with the given base URL. pub fn new(base_url: impl Into) -> Self { @@ -11793,26 +8230,20 @@ impl BrkClient { /// .last(10) /// .json::()?; /// ``` - pub fn series_endpoint( - &self, - series: impl Into, - index: Index, - ) -> SeriesEndpoint { - SeriesEndpoint::new(self.base.clone(), Arc::from(series.into().as_str()), index) + pub fn series_endpoint(&self, series: impl Into, index: Index) -> SeriesEndpoint { + SeriesEndpoint::new( + self.base.clone(), + Arc::from(series.into().as_str()), + index, + ) } /// Create a dynamic date-based series endpoint builder. /// /// Returns `Err` if the index is not date-based. - pub fn date_series_endpoint( - &self, - series: impl Into, - index: Index, - ) -> Result> { + pub fn date_series_endpoint(&self, series: impl Into, index: Index) -> Result> { if !index.is_date_based() { - return Err(BrkError { - message: format!("{} is not a date-based index", index.name()), - }); + return Err(BrkError { message: format!("{} is not a date-based index", index.name()) }); } Ok(DateSeriesEndpoint::new( self.base.clone(), @@ -11848,20 +8279,10 @@ impl BrkClient { /// *[Mempool.space docs](https://mempool.space/docs/api/rest#get-address-transactions)* /// /// Endpoint: `GET /api/address/{address}/txs` - pub fn get_address_txs( - &self, - address: Addr, - after_txid: Option, - ) -> Result> { + pub fn get_address_txs(&self, address: Addr, after_txid: Option) -> Result> { let mut query = Vec::new(); - if let Some(v) = after_txid { - query.push(format!("after_txid={}", v)); - } - let query_str = if query.is_empty() { - String::new() - } else { - format!("?{}", query.join("&")) - }; + if let Some(v) = after_txid { query.push(format!("after_txid={}", v)); } + let query_str = if query.is_empty() { String::new() } else { format!("?{}", query.join("&")) }; let path = format!("/api/address/{address}/txs{}", query_str); self.base.get_json(&path) } @@ -11873,20 +8294,10 @@ impl BrkClient { /// *[Mempool.space docs](https://mempool.space/docs/api/rest#get-address-transactions-chain)* /// /// Endpoint: `GET /api/address/{address}/txs/chain` - pub fn get_address_confirmed_txs( - &self, - address: Addr, - after_txid: Option, - ) -> Result> { + pub fn get_address_confirmed_txs(&self, address: Addr, after_txid: Option) -> Result> { let mut query = Vec::new(); - if let Some(v) = after_txid { - query.push(format!("after_txid={}", v)); - } - let query_str = if query.is_empty() { - String::new() - } else { - format!("?{}", query.join("&")) - }; + if let Some(v) = after_txid { query.push(format!("after_txid={}", v)); } + let query_str = if query.is_empty() { String::new() } else { format!("?{}", query.join("&")) }; let path = format!("/api/address/{address}/txs/chain{}", query_str); self.base.get_json(&path) } @@ -11899,8 +8310,7 @@ impl BrkClient { /// /// Endpoint: `GET /api/address/{address}/txs/mempool` pub fn get_address_mempool_txs(&self, address: Addr) -> Result> { - self.base - .get_json(&format!("/api/address/{address}/txs/mempool")) + self.base.get_json(&format!("/api/address/{address}/txs/mempool")) } /// Address UTXOs @@ -11977,8 +8387,7 @@ impl BrkClient { /// /// Endpoint: `GET /api/block/{hash}/txid/{index}` pub fn get_block_txid(&self, hash: BlockHash, index: TxIndex) -> Result { - self.base - .get_text(&format!("/api/block/{hash}/txid/{index}")) + self.base.get_text(&format!("/api/block/{hash}/txid/{index}")) } /// Block transaction IDs @@ -12010,13 +8419,8 @@ impl BrkClient { /// *[Mempool.space docs](https://mempool.space/docs/api/rest#get-block-transactions)* /// /// Endpoint: `GET /api/block/{hash}/txs/{start_index}` - pub fn get_block_txs_from_index( - &self, - hash: BlockHash, - start_index: TxIndex, - ) -> Result> { - self.base - .get_json(&format!("/api/block/{hash}/txs/{start_index}")) + pub fn get_block_txs_from_index(&self, hash: BlockHash, start_index: TxIndex) -> Result> { + self.base.get_json(&format!("/api/block/{hash}/txs/{start_index}")) } /// Recent blocks @@ -12119,35 +8523,15 @@ impl BrkClient { /// Fetch multiple series in a single request. Supports filtering by index and date range. Returns an array of SeriesData objects. For a single series, use `get_series` instead. /// /// Endpoint: `GET /api/series/bulk` - pub fn get_series_bulk( - &self, - series: SeriesList, - index: Index, - start: Option, - end: Option, - limit: Option, - format: Option, - ) -> Result>> { + pub fn get_series_bulk(&self, series: SeriesList, index: Index, start: Option, end: Option, limit: Option, format: Option) -> Result>> { let mut query = Vec::new(); query.push(format!("series={}", series)); query.push(format!("index={}", index)); - if let Some(v) = start { - query.push(format!("start={}", v)); - } - if let Some(v) = end { - query.push(format!("end={}", v)); - } - if let Some(v) = limit { - query.push(format!("limit={}", v)); - } - if let Some(v) = format { - query.push(format!("format={}", v)); - } - let query_str = if query.is_empty() { - String::new() - } else { - format!("?{}", query.join("&")) - }; + if let Some(v) = start { query.push(format!("start={}", v)); } + if let Some(v) = end { query.push(format!("end={}", v)); } + if let Some(v) = limit { query.push(format!("limit={}", v)); } + if let Some(v) = format { query.push(format!("format={}", v)); } + let query_str = if query.is_empty() { String::new() } else { format!("?{}", query.join("&")) }; let path = format!("/api/series/bulk{}", query_str); if format == Some(Format::CSV) { self.base.get_text(&path).map(FormatResponse::Csv) @@ -12171,8 +8555,7 @@ impl BrkClient { /// /// Endpoint: `GET /api/series/cost-basis/{cohort}/dates` pub fn get_cost_basis_dates(&self, cohort: Cohort) -> Result> { - self.base - .get_json(&format!("/api/series/cost-basis/{cohort}/dates")) + self.base.get_json(&format!("/api/series/cost-basis/{cohort}/dates")) } /// Cost basis distribution @@ -12184,25 +8567,11 @@ impl BrkClient { /// - `value`: supply (default, in BTC), realized (USD), unrealized (USD) /// /// Endpoint: `GET /api/series/cost-basis/{cohort}/{date}` - pub fn get_cost_basis( - &self, - cohort: Cohort, - date: &str, - bucket: Option, - value: Option, - ) -> Result { + pub fn get_cost_basis(&self, cohort: Cohort, date: &str, bucket: Option, value: Option) -> Result { let mut query = Vec::new(); - if let Some(v) = bucket { - query.push(format!("bucket={}", v)); - } - if let Some(v) = value { - query.push(format!("value={}", v)); - } - let query_str = if query.is_empty() { - String::new() - } else { - format!("?{}", query.join("&")) - }; + if let Some(v) = bucket { query.push(format!("bucket={}", v)); } + if let Some(v) = value { query.push(format!("value={}", v)); } + let query_str = if query.is_empty() { String::new() } else { format!("?{}", query.join("&")) }; let path = format!("/api/series/cost-basis/{cohort}/{date}{}", query_str); self.base.get_json(&path) } @@ -12232,17 +8601,9 @@ impl BrkClient { /// Endpoint: `GET /api/series/list` pub fn list_series(&self, page: Option, per_page: Option) -> Result { let mut query = Vec::new(); - if let Some(v) = page { - query.push(format!("page={}", v)); - } - if let Some(v) = per_page { - query.push(format!("per_page={}", v)); - } - let query_str = if query.is_empty() { - String::new() - } else { - format!("?{}", query.join("&")) - }; + if let Some(v) = page { query.push(format!("page={}", v)); } + if let Some(v) = per_page { query.push(format!("per_page={}", v)); } + let query_str = if query.is_empty() { String::new() } else { format!("?{}", query.join("&")) }; let path = format!("/api/series/list{}", query_str); self.base.get_json(&path) } @@ -12255,14 +8616,8 @@ impl BrkClient { pub fn search_series(&self, q: SeriesName, limit: Option) -> Result> { let mut query = Vec::new(); query.push(format!("q={}", q)); - if let Some(v) = limit { - query.push(format!("limit={}", v)); - } - let query_str = if query.is_empty() { - String::new() - } else { - format!("?{}", query.join("&")) - }; + if let Some(v) = limit { query.push(format!("limit={}", v)); } + let query_str = if query.is_empty() { String::new() } else { format!("?{}", query.join("&")) }; let path = format!("/api/series/search{}", query_str); self.base.get_json(&path) } @@ -12281,33 +8636,13 @@ impl BrkClient { /// Fetch data for a specific series at the given index. Use query parameters to filter by date range and format (json/csv). /// /// Endpoint: `GET /api/series/{series}/{index}` - pub fn get_series( - &self, - series: SeriesName, - index: Index, - start: Option, - end: Option, - limit: Option, - format: Option, - ) -> Result> { + pub fn get_series(&self, series: SeriesName, index: Index, start: Option, end: Option, limit: Option, format: Option) -> Result> { let mut query = Vec::new(); - if let Some(v) = start { - query.push(format!("start={}", v)); - } - if let Some(v) = end { - query.push(format!("end={}", v)); - } - if let Some(v) = limit { - query.push(format!("limit={}", v)); - } - if let Some(v) = format { - query.push(format!("format={}", v)); - } - let query_str = if query.is_empty() { - String::new() - } else { - format!("?{}", query.join("&")) - }; + if let Some(v) = start { query.push(format!("start={}", v)); } + if let Some(v) = end { query.push(format!("end={}", v)); } + if let Some(v) = limit { query.push(format!("limit={}", v)); } + if let Some(v) = format { query.push(format!("format={}", v)); } + let query_str = if query.is_empty() { String::new() } else { format!("?{}", query.join("&")) }; let path = format!("/api/series/{series}/{}{}", index.name(), query_str); if format == Some(Format::CSV) { self.base.get_text(&path).map(FormatResponse::Csv) @@ -12321,33 +8656,13 @@ impl BrkClient { /// Returns just the data array without the SeriesData wrapper. Supports the same range and format parameters as the standard endpoint. /// /// Endpoint: `GET /api/series/{series}/{index}/data` - pub fn get_series_data( - &self, - series: SeriesName, - index: Index, - start: Option, - end: Option, - limit: Option, - format: Option, - ) -> Result>> { + pub fn get_series_data(&self, series: SeriesName, index: Index, start: Option, end: Option, limit: Option, format: Option) -> Result>> { let mut query = Vec::new(); - if let Some(v) = start { - query.push(format!("start={}", v)); - } - if let Some(v) = end { - query.push(format!("end={}", v)); - } - if let Some(v) = limit { - query.push(format!("limit={}", v)); - } - if let Some(v) = format { - query.push(format!("format={}", v)); - } - let query_str = if query.is_empty() { - String::new() - } else { - format!("?{}", query.join("&")) - }; + if let Some(v) = start { query.push(format!("start={}", v)); } + if let Some(v) = end { query.push(format!("end={}", v)); } + if let Some(v) = limit { query.push(format!("limit={}", v)); } + if let Some(v) = format { query.push(format!("format={}", v)); } + let query_str = if query.is_empty() { String::new() } else { format!("?{}", query.join("&")) }; let path = format!("/api/series/{series}/{}/data{}", index.name(), query_str); if format == Some(Format::CSV) { self.base.get_text(&path).map(FormatResponse::Csv) @@ -12362,8 +8677,7 @@ impl BrkClient { /// /// Endpoint: `GET /api/series/{series}/{index}/latest` pub fn get_series_latest(&self, series: SeriesName, index: Index) -> Result { - self.base - .get_text(&format!("/api/series/{series}/{}/latest", index.name())) + self.base.get_text(&format!("/api/series/{series}/{}/latest", index.name())) } /// Get series data length @@ -12372,8 +8686,7 @@ impl BrkClient { /// /// Endpoint: `GET /api/series/{series}/{index}/len` pub fn get_series_len(&self, series: SeriesName, index: Index) -> Result { - self.base - .get_json(&format!("/api/series/{series}/{}/len", index.name())) + self.base.get_json(&format!("/api/series/{series}/{}/len", index.name())) } /// Get series version @@ -12382,8 +8695,7 @@ impl BrkClient { /// /// Endpoint: `GET /api/series/{series}/{index}/version` pub fn get_series_version(&self, series: SeriesName, index: Index) -> Result { - self.base - .get_json(&format!("/api/series/{series}/{}/version", index.name())) + self.base.get_json(&format!("/api/series/{series}/{}/version", index.name())) } /// Disk usage @@ -12445,8 +8757,7 @@ impl BrkClient { /// /// Endpoint: `GET /api/tx/{txid}/merkleblock-proof` pub fn get_tx_merkleblock_proof(&self, txid: Txid) -> Result { - self.base - .get_text(&format!("/api/tx/{txid}/merkleblock-proof")) + self.base.get_text(&format!("/api/tx/{txid}/merkleblock-proof")) } /// Output spend status @@ -12457,8 +8768,7 @@ impl BrkClient { /// /// Endpoint: `GET /api/tx/{txid}/outspend/{vout}` pub fn get_tx_outspend(&self, txid: Txid, vout: Vout) -> Result { - self.base - .get_json(&format!("/api/tx/{txid}/outspend/{vout}")) + self.base.get_json(&format!("/api/tx/{txid}/outspend/{vout}")) } /// All output spend statuses @@ -12546,8 +8856,7 @@ impl BrkClient { /// /// Endpoint: `GET /api/v1/difficulty-adjustment` pub fn get_difficulty_adjustment(&self) -> Result { - self.base - .get_json(&format!("/api/v1/difficulty-adjustment")) + self.base.get_json(&format!("/api/v1/difficulty-adjustment")) } /// Projected mempool blocks @@ -12592,14 +8901,8 @@ impl BrkClient { /// Endpoint: `GET /api/v1/historical-price` pub fn get_historical_price(&self, timestamp: Option) -> Result { let mut query = Vec::new(); - if let Some(v) = timestamp { - query.push(format!("timestamp={}", v)); - } - let query_str = if query.is_empty() { - String::new() - } else { - format!("?{}", query.join("&")) - }; + if let Some(v) = timestamp { query.push(format!("timestamp={}", v)); } + let query_str = if query.is_empty() { String::new() } else { format!("?{}", query.join("&")) }; let path = format!("/api/v1/historical-price{}", query_str); self.base.get_json(&path) } @@ -12612,8 +8915,7 @@ impl BrkClient { /// /// Endpoint: `GET /api/v1/mining/blocks/fee-rates/{time_period}` pub fn get_block_fee_rates(&self, time_period: TimePeriod) -> Result> { - self.base - .get_json(&format!("/api/v1/mining/blocks/fee-rates/{time_period}")) + self.base.get_json(&format!("/api/v1/mining/blocks/fee-rates/{time_period}")) } /// Block fees @@ -12624,8 +8926,7 @@ impl BrkClient { /// /// Endpoint: `GET /api/v1/mining/blocks/fees/{time_period}` pub fn get_block_fees(&self, time_period: TimePeriod) -> Result> { - self.base - .get_json(&format!("/api/v1/mining/blocks/fees/{time_period}")) + self.base.get_json(&format!("/api/v1/mining/blocks/fees/{time_period}")) } /// Block rewards @@ -12636,8 +8937,7 @@ impl BrkClient { /// /// Endpoint: `GET /api/v1/mining/blocks/rewards/{time_period}` pub fn get_block_rewards(&self, time_period: TimePeriod) -> Result> { - self.base - .get_json(&format!("/api/v1/mining/blocks/rewards/{time_period}")) + self.base.get_json(&format!("/api/v1/mining/blocks/rewards/{time_period}")) } /// Block sizes and weights @@ -12648,9 +8948,7 @@ impl BrkClient { /// /// Endpoint: `GET /api/v1/mining/blocks/sizes-weights/{time_period}` pub fn get_block_sizes_weights(&self, time_period: TimePeriod) -> Result { - self.base.get_json(&format!( - "/api/v1/mining/blocks/sizes-weights/{time_period}" - )) + self.base.get_json(&format!("/api/v1/mining/blocks/sizes-weights/{time_period}")) } /// Block by timestamp @@ -12661,8 +8959,7 @@ impl BrkClient { /// /// Endpoint: `GET /api/v1/mining/blocks/timestamp/{timestamp}` pub fn get_block_by_timestamp(&self, timestamp: Timestamp) -> Result { - self.base - .get_json(&format!("/api/v1/mining/blocks/timestamp/{timestamp}")) + self.base.get_json(&format!("/api/v1/mining/blocks/timestamp/{timestamp}")) } /// Difficulty adjustments (all time) @@ -12673,8 +8970,7 @@ impl BrkClient { /// /// Endpoint: `GET /api/v1/mining/difficulty-adjustments` pub fn get_difficulty_adjustments(&self) -> Result> { - self.base - .get_json(&format!("/api/v1/mining/difficulty-adjustments")) + self.base.get_json(&format!("/api/v1/mining/difficulty-adjustments")) } /// Difficulty adjustments @@ -12684,13 +8980,8 @@ impl BrkClient { /// *[Mempool.space docs](https://mempool.space/docs/api/rest#get-difficulty-adjustments)* /// /// Endpoint: `GET /api/v1/mining/difficulty-adjustments/{time_period}` - pub fn get_difficulty_adjustments_by_period( - &self, - time_period: TimePeriod, - ) -> Result> { - self.base.get_json(&format!( - "/api/v1/mining/difficulty-adjustments/{time_period}" - )) + pub fn get_difficulty_adjustments_by_period(&self, time_period: TimePeriod) -> Result> { + self.base.get_json(&format!("/api/v1/mining/difficulty-adjustments/{time_period}")) } /// Network hashrate (all time) @@ -12712,8 +9003,7 @@ impl BrkClient { /// /// Endpoint: `GET /api/v1/mining/hashrate/pools` pub fn get_pools_hashrate(&self) -> Result> { - self.base - .get_json(&format!("/api/v1/mining/hashrate/pools")) + self.base.get_json(&format!("/api/v1/mining/hashrate/pools")) } /// All pools hashrate @@ -12723,12 +9013,8 @@ impl BrkClient { /// *[Mempool.space docs](https://mempool.space/docs/api/rest#get-mining-pool-hashrates)* /// /// Endpoint: `GET /api/v1/mining/hashrate/pools/{time_period}` - pub fn get_pools_hashrate_by_period( - &self, - time_period: TimePeriod, - ) -> Result> { - self.base - .get_json(&format!("/api/v1/mining/hashrate/pools/{time_period}")) + pub fn get_pools_hashrate_by_period(&self, time_period: TimePeriod) -> Result> { + self.base.get_json(&format!("/api/v1/mining/hashrate/pools/{time_period}")) } /// Network hashrate @@ -12739,8 +9025,7 @@ impl BrkClient { /// /// Endpoint: `GET /api/v1/mining/hashrate/{time_period}` pub fn get_hashrate_by_period(&self, time_period: TimePeriod) -> Result { - self.base - .get_json(&format!("/api/v1/mining/hashrate/{time_period}")) + self.base.get_json(&format!("/api/v1/mining/hashrate/{time_period}")) } /// Mining pool details @@ -12762,8 +9047,7 @@ impl BrkClient { /// /// Endpoint: `GET /api/v1/mining/pool/{slug}/blocks` pub fn get_pool_blocks(&self, slug: PoolSlug) -> Result> { - self.base - .get_json(&format!("/api/v1/mining/pool/{slug}/blocks")) + self.base.get_json(&format!("/api/v1/mining/pool/{slug}/blocks")) } /// Mining pool blocks from height @@ -12774,8 +9058,7 @@ impl BrkClient { /// /// Endpoint: `GET /api/v1/mining/pool/{slug}/blocks/{height}` pub fn get_pool_blocks_from(&self, slug: PoolSlug, height: Height) -> Result> { - self.base - .get_json(&format!("/api/v1/mining/pool/{slug}/blocks/{height}")) + self.base.get_json(&format!("/api/v1/mining/pool/{slug}/blocks/{height}")) } /// Mining pool hashrate @@ -12786,8 +9069,7 @@ impl BrkClient { /// /// Endpoint: `GET /api/v1/mining/pool/{slug}/hashrate` pub fn get_pool_hashrate(&self, slug: PoolSlug) -> Result> { - self.base - .get_json(&format!("/api/v1/mining/pool/{slug}/hashrate")) + self.base.get_json(&format!("/api/v1/mining/pool/{slug}/hashrate")) } /// List all mining pools @@ -12809,8 +9091,7 @@ impl BrkClient { /// /// Endpoint: `GET /api/v1/mining/pools/{time_period}` pub fn get_pool_stats(&self, time_period: TimePeriod) -> Result { - self.base - .get_json(&format!("/api/v1/mining/pools/{time_period}")) + self.base.get_json(&format!("/api/v1/mining/pools/{time_period}")) } /// Mining reward statistics @@ -12821,8 +9102,7 @@ impl BrkClient { /// /// Endpoint: `GET /api/v1/mining/reward-stats/{block_count}` pub fn get_reward_stats(&self, block_count: i64) -> Result { - self.base - .get_json(&format!("/api/v1/mining/reward-stats/{block_count}")) + self.base.get_json(&format!("/api/v1/mining/reward-stats/{block_count}")) } /// Current BTC price @@ -12855,8 +9135,7 @@ impl BrkClient { /// /// Endpoint: `GET /api/v1/validate-address/{address}` pub fn validate_address(&self, address: &str) -> Result { - self.base - .get_json(&format!("/api/v1/validate-address/{address}")) + self.base.get_json(&format!("/api/v1/validate-address/{address}")) } /// Health check @@ -12885,4 +9164,5 @@ impl BrkClient { pub fn get_version(&self) -> Result { self.base.get_json(&format!("/version")) } + } diff --git a/crates/brk_computer/src/indexes/mod.rs b/crates/brk_computer/src/indexes/mod.rs index 48d55721a..98790abf0 100644 --- a/crates/brk_computer/src/indexes/mod.rs +++ b/crates/brk_computer/src/indexes/mod.rs @@ -14,6 +14,7 @@ mod month1; mod month3; mod month6; pub mod timestamp; +mod tx_heights; mod tx_index; mod txin_index; mod txout_index; @@ -50,6 +51,7 @@ pub use month1::Vecs as Month1Vecs; pub use month3::Vecs as Month3Vecs; pub use month6::Vecs as Month6Vecs; pub use timestamp::Timestamps; +pub use tx_heights::TxHeights; pub use tx_index::Vecs as TxIndexVecs; pub use txin_index::Vecs as TxInIndexVecs; pub use txout_index::Vecs as TxOutIndexVecs; @@ -64,6 +66,8 @@ pub struct Vecs { db: Database, #[traversable(skip)] pub cached_mappings: CachedMappings, + #[traversable(skip)] + pub tx_heights: TxHeights, pub addr: AddrVecs, pub height: HeightVecs, pub epoch: EpochVecs, @@ -143,6 +147,7 @@ impl Vecs { let this = Self { cached_mappings, + tx_heights: TxHeights::init(indexer), addr, height, epoch, @@ -179,6 +184,8 @@ impl Vecs { ) -> Result { self.db.sync_bg_tasks()?; + self.tx_heights.update(indexer, starting_indexes.height); + // timestamp_monotonic must be computed first — other mappings read it self.timestamp .compute_monotonic(indexer, starting_indexes.height, exit)?; diff --git a/crates/brk_computer/src/indexes/tx_heights.rs b/crates/brk_computer/src/indexes/tx_heights.rs new file mode 100644 index 000000000..688c19961 --- /dev/null +++ b/crates/brk_computer/src/indexes/tx_heights.rs @@ -0,0 +1,61 @@ +use std::sync::Arc; + +use brk_indexer::Indexer; +use brk_types::{Height, RangeMap, TxIndex}; +use parking_lot::RwLock; +use vecdb::{AnyVec, ReadableVec, VecIndex}; + +/// Reverse mapping from `TxIndex` → `Height` via binary search on block boundaries. +/// +/// Built from `first_tx_index` (the first TxIndex in each block). A floor lookup +/// on any TxIndex gives the block height that contains it. +/// +/// Wrapped in `Arc>` so the compute thread can extend it while +/// query threads read concurrently — the inner `RangeMap` is purely in-memory +/// and wouldn't stay current through mmap like PcoVec/BytesVec do. +#[derive(Clone)] +pub struct TxHeights(Arc>>); + +impl TxHeights { + /// Build from the full `first_tx_index` vec at startup. + pub fn init(indexer: &Indexer) -> Self { + let len = indexer.vecs.transactions.first_tx_index.len(); + let entries: Vec = if len > 0 { + indexer + .vecs + .transactions + .first_tx_index + .collect_range_at(0, len) + } else { + Vec::new() + }; + Self(Arc::new(RwLock::new(RangeMap::from(entries)))) + } + + /// Extend with new blocks since last call. Truncates on reorg. + pub fn update(&self, indexer: &Indexer, reorg_height: Height) { + let mut inner = self.0.write(); + let reorg_len = reorg_height.to_usize(); + if inner.len() > reorg_len { + inner.truncate(reorg_len); + } + let target_len = indexer.vecs.transactions.first_tx_index.len(); + let current_len = inner.len(); + if current_len < target_len { + let new_entries: Vec = indexer + .vecs + .transactions + .first_tx_index + .collect_range_at(current_len, target_len); + for entry in new_entries { + inner.push(entry); + } + } + } + + /// Look up the block height for a given tx_index. + #[inline] + pub fn get_shared(&self, tx_index: TxIndex) -> Option { + self.0.read().get_shared(tx_index) + } +} diff --git a/crates/brk_computer/src/pools/mod.rs b/crates/brk_computer/src/pools/mod.rs index 9d1a642c2..8d8585d0d 100644 --- a/crates/brk_computer/src/pools/mod.rs +++ b/crates/brk_computer/src/pools/mod.rs @@ -12,6 +12,9 @@ use vecdb::{ pub mod major; pub mod minor; +mod pool_heights; + +pub use pool_heights::PoolHeights; use crate::{ blocks, indexes, @@ -30,6 +33,8 @@ pub struct Vecs { pools: &'static Pools, pub pool: M::Stored>, + #[traversable(skip)] + pub pool_heights: PoolHeights, pub major: BTreeMap>, pub minor: BTreeMap>, } @@ -63,8 +68,12 @@ impl Vecs { } } + let pool = BytesVec::forced_import(&db, "pool", version)?; + let pool_heights = PoolHeights::build(&pool); + let this = Self { - pool: BytesVec::forced_import(&db, "pool", version)?, + pool, + pool_heights, major: major_map, minor: minor_map, pools, @@ -149,8 +158,10 @@ impl Vecs { let mut output_count_cursor = indexes.tx_index.output_count.cursor(); self.pool.truncate_if_needed_at(min)?; + self.pool_heights.truncate(min); let len = indexer.vecs.blocks.coinbase_tag.len(); + let mut next_height = min; indexer.vecs.blocks.coinbase_tag.try_for_each_range_at( min, @@ -186,6 +197,9 @@ impl Vecs { .unwrap_or(unknown); self.pool.push(pool.slug); + self.pool_heights.push(pool.slug, Height::from(next_height)); + next_height += 1; + Ok(()) }, )?; diff --git a/crates/brk_computer/src/pools/pool_heights.rs b/crates/brk_computer/src/pools/pool_heights.rs new file mode 100644 index 000000000..1ec674b56 --- /dev/null +++ b/crates/brk_computer/src/pools/pool_heights.rs @@ -0,0 +1,39 @@ +use std::sync::Arc; + +use brk_types::{Height, PoolSlug}; +use parking_lot::RwLock; +use rustc_hash::FxHashMap; +use vecdb::{AnyVec, BytesVec, VecIndex}; + +#[derive(Clone, Default)] +pub struct PoolHeights(Arc>>>); + +impl PoolHeights { + pub fn build(pool: &BytesVec) -> Self { + let len = pool.len(); + let mut map: FxHashMap> = FxHashMap::default(); + let reader = pool.reader(); + for h in 0..len { + map.entry(reader.get(h)) + .or_default() + .push(Height::from(h)); + } + Self(Arc::new(RwLock::new(map))) + } + + pub fn truncate(&self, min: usize) { + let mut cache = self.0.write(); + for heights in cache.values_mut() { + let cut = heights.partition_point(|h| h.to_usize() < min); + heights.truncate(cut); + } + } + + pub fn push(&self, slug: PoolSlug, height: Height) { + self.0.write().entry(slug).or_default().push(height); + } + + pub fn read(&self) -> parking_lot::RwLockReadGuard<'_, FxHashMap>> { + self.0.read() + } +} diff --git a/crates/brk_error/src/lib.rs b/crates/brk_error/src/lib.rs index acb15b272..0730bceac 100644 --- a/crates/brk_error/src/lib.rs +++ b/crates/brk_error/src/lib.rs @@ -6,6 +6,21 @@ use thiserror::Error; pub type Result = result::Result; +/// Convert `Option` → `Result` without panicking. +/// +/// Replaces `.unwrap()` in query paths so a missing value returns +/// HTTP 500 instead of crashing the server (`panic = "abort"`). +pub trait OptionData { + fn data(self) -> Result; +} + +impl OptionData for Option { + #[inline] + fn data(self) -> Result { + self.ok_or(Error::Internal("data unavailable")) + } +} + #[derive(Debug, Error)] pub enum Error { #[error(transparent)] diff --git a/crates/brk_query/Cargo.toml b/crates/brk_query/Cargo.toml index ebf3be49b..60e1dc47d 100644 --- a/crates/brk_query/Cargo.toml +++ b/crates/brk_query/Cargo.toml @@ -26,6 +26,7 @@ jiff = { workspace = true } parking_lot = { workspace = true } # quickmatch = { path = "../../../quickmatch" } quickmatch = "0.4.0" +rustc-hash = { workspace = true } tokio = { workspace = true, optional = true } serde_json = { workspace = true } vecdb = { workspace = true } diff --git a/crates/brk_query/src/impl/addr.rs b/crates/brk_query/src/impl/addr.rs index 835fedfbf..bc5c660e9 100644 --- a/crates/brk_query/src/impl/addr.rs +++ b/crates/brk_query/src/impl/addr.rs @@ -1,7 +1,7 @@ use std::str::FromStr; use bitcoin::{Network, PublicKey, ScriptBuf}; -use brk_error::{Error, Result}; +use brk_error::{Error, OptionData, Result}; use brk_types::{ Addr, AddrBytes, AddrChainStats, AddrHash, AddrIndexOutPoint, AddrIndexTxIndex, AddrStats, AnyAddrDataIndexEnum, BlockHash, Dollars, Height, OutputType, Timestamp, Transaction, TxIndex, @@ -136,7 +136,7 @@ impl Query { let store = stores .addr_type_to_addr_index_and_tx_index .get(output_type) - .unwrap(); + .data()?; if let Some(after_txid) = after_txid { let after_tx_index = stores @@ -177,7 +177,7 @@ impl Query { let store = stores .addr_type_to_addr_index_and_unspent_outpoint .get(output_type) - .unwrap(); + .data()?; let prefix = u32::from(type_index).to_be_bytes(); @@ -190,7 +190,7 @@ impl Query { let first_txout_index_reader = vecs.transactions.first_txout_index.reader(); let value_reader = vecs.outputs.value.reader(); let blockhash_reader = vecs.blocks.blockhash.reader(); - let mut height_cursor = vecs.transactions.height.cursor(); + let tx_heights = &self.computer().indexes.tx_heights; let mut block_ts_cursor = vecs.blocks.timestamp.cursor(); let mut cached_block: Option<(Height, BlockHash, Timestamp)> = None; @@ -198,7 +198,7 @@ impl Query { for (tx_index, vout) in outpoints { let txid = txid_reader.get(tx_index.to_usize()); - let height: Height = height_cursor.get(tx_index.to_usize()).unwrap(); + let height: Height = tx_heights.get_shared(tx_index).data()?; let first_txout_index = first_txout_index_reader.get(tx_index.to_usize()); let value = value_reader.get(usize::from(first_txout_index + vout)); @@ -208,7 +208,7 @@ impl Query { (bh.clone(), bt) } else { let bh = blockhash_reader.get(height.to_usize()); - let bt = block_ts_cursor.get(height.to_usize()).unwrap(); + let bt = block_ts_cursor.get(height.to_usize()).data()?; cached_block = Some((height, bh.clone(), bt)); (bh, bt) }; @@ -261,7 +261,7 @@ impl Query { .stores .addr_type_to_addr_index_and_tx_index .get(output_type) - .unwrap(); + .data()?; let prefix = u32::from(type_index).to_be_bytes(); let last_tx_index = store .prefix(prefix) @@ -287,7 +287,7 @@ impl Query { let Ok(Some(type_index)) = stores .addr_type_to_addr_hash_to_addr_index .get(output_type) - .unwrap() + .data()? .get(&hash) .map(|opt| opt.map(|cow| cow.into_owned())) else { diff --git a/crates/brk_query/src/impl/block/info.rs b/crates/brk_query/src/impl/block/info.rs index 5b8bf1959..3f4841294 100644 --- a/crates/brk_query/src/impl/block/info.rs +++ b/crates/brk_query/src/impl/block/info.rs @@ -2,7 +2,7 @@ use std::io::Read; use bitcoin::consensus::Decodable; use bitcoin::hex::DisplayHex; -use brk_error::{Error, Result}; +use brk_error::{Error, OptionData, Result}; use brk_types::{ BlockExtras, BlockHash, BlockHashPrefix, BlockHeader, BlockInfo, BlockInfoV1, BlockPool, FeeRate, Height, PoolSlug, Sats, Timestamp, TxIndex, VSize, pools, @@ -443,7 +443,7 @@ impl Query { .blocks .position .collect_one(height) - .unwrap(); + .data()?; let raw = self.reader().read_raw_bytes(position, HEADER_SIZE)?; bitcoin::block::Header::consensus_decode(&mut raw.as_slice()) .map_err(|_| Error::Internal("Failed to decode block header")) diff --git a/crates/brk_query/src/impl/block/raw.rs b/crates/brk_query/src/impl/block/raw.rs index 1f863284b..5e82499c9 100644 --- a/crates/brk_query/src/impl/block/raw.rs +++ b/crates/brk_query/src/impl/block/raw.rs @@ -1,4 +1,4 @@ -use brk_error::{Error, Result}; +use brk_error::{Error, OptionData, Result}; use brk_types::{BlockHash, Height}; use vecdb::{AnyVec, ReadableVec}; @@ -19,8 +19,8 @@ impl Query { return Err(Error::OutOfRange("Block height out of range".into())); } - let position = indexer.vecs.blocks.position.collect_one(height).unwrap(); - let size = indexer.vecs.blocks.total.collect_one(height).unwrap(); + let position = indexer.vecs.blocks.position.collect_one(height).data()?; + let size = indexer.vecs.blocks.total.collect_one(height).data()?; reader.read_raw_bytes(position, *size as usize) } diff --git a/crates/brk_query/src/impl/block/timestamp.rs b/crates/brk_query/src/impl/block/timestamp.rs index 8f53da9af..f5d1090a6 100644 --- a/crates/brk_query/src/impl/block/timestamp.rs +++ b/crates/brk_query/src/impl/block/timestamp.rs @@ -1,4 +1,4 @@ -use brk_error::{Error, Result}; +use brk_error::{Error, OptionData, Result}; use brk_types::{BlockTimestamp, Date, Day1, Height, Timestamp}; use jiff::Timestamp as JiffTimestamp; use vecdb::ReadableVec; @@ -35,10 +35,10 @@ impl Query { // Search forward from start to find the last block <= target timestamp let mut best_height = start; - let mut best_ts = ts_cursor.get(start).unwrap(); + let mut best_ts = ts_cursor.get(start).data()?; for h in (start + 1)..=max_height_usize { - let block_ts = ts_cursor.get(h).unwrap(); + let block_ts = ts_cursor.get(h).data()?; if block_ts <= target { best_height = h; best_ts = block_ts; @@ -49,7 +49,7 @@ impl Query { // Check one block before start in case we need to go backward if start > 0 && best_ts > target { - let prev_ts = ts_cursor.get(start - 1).unwrap(); + let prev_ts = ts_cursor.get(start - 1).data()?; if prev_ts <= target { best_height = start - 1; best_ts = prev_ts; diff --git a/crates/brk_query/src/impl/block/txs.rs b/crates/brk_query/src/impl/block/txs.rs index 75b87b26b..95235b253 100644 --- a/crates/brk_query/src/impl/block/txs.rs +++ b/crates/brk_query/src/impl/block/txs.rs @@ -1,11 +1,12 @@ use std::io::Cursor; use bitcoin::{consensus::Decodable, hex::DisplayHex}; -use brk_error::{Error, Result}; +use brk_error::{Error, OptionData, Result}; use brk_types::{ - BlockHash, Height, OutputType, Sats, Timestamp, Transaction, TxIn, TxIndex, TxOut, TxStatus, - Txid, Vout, Weight, + BlkPosition, BlockHash, Height, OutPoint, OutputType, RawLockTime, Sats, StoredU32, Timestamp, + Transaction, TxIn, TxInIndex, TxIndex, TxOut, TxOutIndex, TxStatus, Txid, Vout, Weight, }; +use rustc_hash::FxHashMap; use vecdb::{AnyVec, ReadableVec, VecIndex}; use super::BLOCK_TXS_PAGE_SIZE; @@ -64,6 +65,11 @@ impl Query { /// Batch-read transactions at arbitrary indices. /// Reads in ascending index order for I/O locality, returns in caller's order. + /// + /// Three-phase approach for optimal I/O: + /// Phase 1 — Decode transactions & collect outpoints (sorted by tx_index) + /// Phase 2 — Batch-read all prevout data (sorted by prev_tx_index, then txout_index) + /// Phase 3 — Assemble Transaction objects from pre-fetched data pub fn transactions_by_indices(&self, indices: &[TxIndex]) -> Result> { if indices.is_empty() { return Ok(Vec::new()); @@ -78,37 +84,46 @@ impl Query { let indexer = self.indexer(); let reader = self.reader(); + // ── Phase 1: Decode all transactions, collect outpoints ───────── + + let tx_heights = &self.computer().indexes.tx_heights; let mut txid_cursor = indexer.vecs.transactions.txid.cursor(); - let mut height_cursor = indexer.vecs.transactions.height.cursor(); let mut locktime_cursor = indexer.vecs.transactions.raw_locktime.cursor(); let mut total_size_cursor = indexer.vecs.transactions.total_size.cursor(); let mut first_txin_cursor = indexer.vecs.transactions.first_txin_index.cursor(); let mut position_cursor = indexer.vecs.transactions.position.cursor(); - - let txid_reader = indexer.vecs.transactions.txid.reader(); - let first_txout_index_reader = indexer.vecs.transactions.first_txout_index.reader(); - let value_reader = indexer.vecs.outputs.value.reader(); - let output_type_reader = indexer.vecs.outputs.output_type.reader(); - let type_index_reader = indexer.vecs.outputs.type_index.reader(); - let addr_readers = indexer.vecs.addrs.addr_readers(); let blockhash_reader = indexer.vecs.blocks.blockhash.reader(); let mut block_ts_cursor = indexer.vecs.blocks.timestamp.cursor(); + struct DecodedTx { + pos: usize, + tx_index: TxIndex, + txid: Txid, + height: Height, + lock_time: RawLockTime, + total_size: StoredU32, + block_hash: BlockHash, + block_time: Timestamp, + decoded: bitcoin::Transaction, + first_txin_index: TxInIndex, + outpoints: Vec, + } + let mut cached_block: Option<(Height, BlockHash, Timestamp)> = None; + let mut decoded_txs: Vec = Vec::with_capacity(len); + let mut total_inputs: usize = 0; - // Read in sorted order, write directly to original position - let mut txs: Vec> = (0..len).map(|_| None).collect(); - + // Phase 1a: Read metadata + decode transactions (no outpoint reads yet) for &pos in &order { let tx_index = indices[pos]; let idx = tx_index.to_usize(); - let txid = txid_cursor.get(idx).unwrap(); - let height = height_cursor.get(idx).unwrap(); - let lock_time = locktime_cursor.get(idx).unwrap(); - let total_size = total_size_cursor.get(idx).unwrap(); - let first_txin_index = first_txin_cursor.get(idx).unwrap(); - let position = position_cursor.get(idx).unwrap(); + let txid: Txid = txid_cursor.get(idx).data()?; + let height: Height = tx_heights.get_shared(tx_index).data()?; + let lock_time: RawLockTime = locktime_cursor.get(idx).data()?; + let total_size: StoredU32 = total_size_cursor.get(idx).data()?; + let first_txin_index: TxInIndex = first_txin_cursor.get(idx).data()?; + let position: BlkPosition = position_cursor.get(idx).data()?; let (block_hash, block_time) = if let Some((h, ref bh, bt)) = cached_block && h == height @@ -116,48 +131,126 @@ impl Query { (bh.clone(), bt) } else { let bh = blockhash_reader.get(height.to_usize()); - let bt = block_ts_cursor.get(height.to_usize()).unwrap(); + let bt = block_ts_cursor.get(height.to_usize()).data()?; cached_block = Some((height, bh.clone(), bt)); (bh, bt) }; let buffer = reader.read_raw_bytes(position, *total_size as usize)?; - let tx = bitcoin::Transaction::consensus_decode(&mut Cursor::new(buffer)) + let decoded = bitcoin::Transaction::consensus_decode(&mut Cursor::new(buffer)) .map_err(|_| Error::Parse("Failed to decode transaction".into()))?; - let outpoints = indexer.vecs.inputs.outpoint.collect_range_at( - usize::from(first_txin_index), - usize::from(first_txin_index) + tx.input.len(), - ); + total_inputs += decoded.input.len(); - let input: Vec = tx + decoded_txs.push(DecodedTx { + pos, + tx_index, + txid, + height, + lock_time, + total_size, + block_hash, + block_time, + decoded, + first_txin_index, + outpoints: Vec::new(), + }); + } + + // Phase 1b: Batch-read outpoints via cursor (PcoVec — sequential + // cursor avoids re-decompressing the same pages) + let mut outpoint_cursor = indexer.vecs.inputs.outpoint.cursor(); + for dtx in &mut decoded_txs { + let start = usize::from(dtx.first_txin_index); + let count = dtx.decoded.input.len(); + let mut outpoints = Vec::with_capacity(count); + for i in 0..count { + outpoints.push(outpoint_cursor.get(start + i).data()?); + } + dtx.outpoints = outpoints; + } + + // ── Phase 2: Batch-read prevout data in sorted order ──────────── + + // Collect all non-coinbase outpoints, deduplicate, sort by tx_index + let mut prevout_keys: Vec = Vec::with_capacity(total_inputs); + for dtx in &decoded_txs { + for &op in &dtx.outpoints { + if op.is_not_coinbase() { + prevout_keys.push(op); + } + } + } + prevout_keys.sort_unstable(); + prevout_keys.dedup(); + + // Batch-read txid + first_txout_index sorted by prev_tx_index + let txid_reader = indexer.vecs.transactions.txid.reader(); + let first_txout_index_reader = indexer.vecs.transactions.first_txout_index.reader(); + + struct PrevoutIntermediate { + outpoint: OutPoint, + txid: Txid, + txout_index: TxOutIndex, + } + + let mut intermediates: Vec = Vec::with_capacity(prevout_keys.len()); + + for &op in &prevout_keys { + let prev_tx_idx = op.tx_index().to_usize(); + let txid = txid_reader.get(prev_tx_idx); + let first_txout = first_txout_index_reader.get(prev_tx_idx); + let txout_index = first_txout + op.vout(); + intermediates.push(PrevoutIntermediate { + outpoint: op, + txid, + txout_index, + }); + } + + // Re-sort by txout_index for sequential output data reads + intermediates.sort_unstable_by_key(|i| i.txout_index); + + let value_reader = indexer.vecs.outputs.value.reader(); + let output_type_reader = indexer.vecs.outputs.output_type.reader(); + let type_index_reader = indexer.vecs.outputs.type_index.reader(); + let addr_readers = indexer.vecs.addrs.addr_readers(); + + let mut prevout_map: FxHashMap = + FxHashMap::with_capacity_and_hasher(intermediates.len(), Default::default()); + + for inter in &intermediates { + let txout_idx = usize::from(inter.txout_index); + let value: Sats = value_reader.get(txout_idx); + let output_type: OutputType = output_type_reader.get(txout_idx); + let type_index = type_index_reader.get(txout_idx); + let script_pubkey = addr_readers.script_pubkey(output_type, type_index); + prevout_map.insert( + inter.outpoint, + (inter.txid.clone(), TxOut::from((script_pubkey, value))), + ); + } + + // ── Phase 3: Assemble Transaction objects ─────────────────────── + + let mut txs: Vec> = (0..len).map(|_| None).collect(); + + for dtx in decoded_txs { + let input: Vec = dtx + .decoded .input .iter() .enumerate() .map(|(j, txin)| { - let outpoint = outpoints[j]; + let outpoint = dtx.outpoints[j]; let is_coinbase = outpoint.is_coinbase(); let (prev_txid, prev_vout, prevout) = if is_coinbase { (Txid::COINBASE, Vout::MAX, None) } else { - let prev_tx_index = outpoint.tx_index(); - let prev_vout = outpoint.vout(); - let prev_txid = txid_reader.get(prev_tx_index.to_usize()); - let prev_first_txout_index = - first_txout_index_reader.get(prev_tx_index.to_usize()); - let prev_txout_index = prev_first_txout_index + prev_vout; - let prev_value = value_reader.get(usize::from(prev_txout_index)); - let prev_output_type: OutputType = - output_type_reader.get(usize::from(prev_txout_index)); - let prev_type_index = type_index_reader.get(usize::from(prev_txout_index)); - let script_pubkey = - addr_readers.script_pubkey(prev_output_type, prev_type_index); - ( - prev_txid, - prev_vout, - Some(TxOut::from((script_pubkey, prev_value))), - ) + let (prev_txid, prev_txout) = + prevout_map.get(&outpoint).data()?.clone(); + (prev_txid, outpoint.vout(), Some(prev_txout)) }; let witness = txin @@ -166,7 +259,7 @@ impl Query { .map(|w| w.to_lower_hex_string()) .collect(); - TxIn { + Ok(TxIn { txid: prev_txid, vout: prev_vout, prevout, @@ -177,29 +270,39 @@ impl Query { sequence: txin.sequence.0, inner_redeem_script_asm: (), inner_witness_script_asm: (), - } + }) }) + .collect::>()?; + + let weight = Weight::from(dtx.decoded.weight()); + + // O(n) sigop cost via FxHashMap instead of O(n²) linear scan + let outpoint_to_idx: FxHashMap = dtx + .decoded + .input + .iter() + .enumerate() + .map(|(j, txin)| (txin.previous_output, j)) .collect(); - let weight = Weight::from(tx.weight()); - let total_sigop_cost = tx.total_sigop_cost(|outpoint| { - tx.input - .iter() - .position(|i| i.previous_output == *outpoint) - .and_then(|j| input[j].prevout.as_ref()) + let total_sigop_cost = dtx.decoded.total_sigop_cost(|outpoint| { + outpoint_to_idx + .get(outpoint) + .and_then(|&j| input[j].prevout.as_ref()) .map(|p| bitcoin::TxOut { value: bitcoin::Amount::from_sat(u64::from(p.value)), script_pubkey: p.script_pubkey.clone(), }) }); - let output: Vec = tx.output.into_iter().map(TxOut::from).collect(); + + let output: Vec = dtx.decoded.output.into_iter().map(TxOut::from).collect(); let mut transaction = Transaction { - index: Some(tx_index), - txid, - version: tx.version.into(), - lock_time, - total_size: *total_size as usize, + index: Some(dtx.tx_index), + txid: dtx.txid, + version: dtx.decoded.version.into(), + lock_time: dtx.lock_time, + total_size: *dtx.total_size as usize, weight, total_sigop_cost, fee: Sats::ZERO, @@ -207,14 +310,14 @@ impl Query { output, status: TxStatus { confirmed: true, - block_height: Some(height), - block_hash: Some(block_hash), - block_time: Some(block_time), + block_height: Some(dtx.height), + block_hash: Some(dtx.block_hash), + block_time: Some(dtx.block_time), }, }; transaction.compute_fee(); - txs[pos] = Some(transaction); + txs[dtx.pos] = Some(transaction); } Ok(txs.into_iter().map(Option::unwrap).collect()) @@ -231,7 +334,7 @@ impl Query { .transactions .first_tx_index .collect_one(height) - .unwrap() + .data()? .into(); let next: usize = indexer .vecs diff --git a/crates/brk_query/src/impl/mining/difficulty.rs b/crates/brk_query/src/impl/mining/difficulty.rs index 4ec559ffa..e9939038f 100644 --- a/crates/brk_query/src/impl/mining/difficulty.rs +++ b/crates/brk_query/src/impl/mining/difficulty.rs @@ -1,6 +1,6 @@ use std::time::{SystemTime, UNIX_EPOCH}; -use brk_error::Result; +use brk_error::{OptionData, Result}; use brk_types::{DifficultyAdjustment, Epoch, Height}; use vecdb::ReadableVec; @@ -25,7 +25,7 @@ impl Query { .height .epoch .collect_one(current_height) - .unwrap(); + .data()?; let current_epoch_usize: usize = current_epoch.into(); // Get epoch start height @@ -34,7 +34,7 @@ impl Query { .epoch .first_height .collect_one(current_epoch) - .unwrap(); + .data()?; let epoch_start_u32: u32 = epoch_start_height.into(); // Calculate epoch progress @@ -49,13 +49,13 @@ impl Query { .timestamp .epoch .collect_one(current_epoch) - .unwrap(); + .data()?; let current_timestamp = indexer .vecs .blocks .timestamp .collect_one(current_height) - .unwrap(); + .data()?; // Calculate average block time in current epoch let elapsed_time = (*current_timestamp - *epoch_start_timestamp) as u64; @@ -92,20 +92,20 @@ impl Query { .epoch .first_height .collect_one(prev_epoch) - .unwrap(); + .data()?; let prev_difficulty = indexer .vecs .blocks .difficulty .collect_one(prev_epoch_start) - .unwrap(); + .data()?; let curr_difficulty = indexer .vecs .blocks .difficulty .collect_one(epoch_start_height) - .unwrap(); + .data()?; let retarget = if *prev_difficulty > 0.0 { ((*curr_difficulty / *prev_difficulty) - 1.0) * 100.0 diff --git a/crates/brk_query/src/impl/mining/hashrate.rs b/crates/brk_query/src/impl/mining/hashrate.rs index 7a7e22c49..4ac11aaa1 100644 --- a/crates/brk_query/src/impl/mining/hashrate.rs +++ b/crates/brk_query/src/impl/mining/hashrate.rs @@ -1,4 +1,4 @@ -use brk_error::Result; +use brk_error::{OptionData, Result}; use brk_types::{DifficultyEntry, HashrateEntry, HashrateSummary, Height, TimePeriod}; use vecdb::{ReadableOptionVec, ReadableVec, VecIndex}; @@ -17,7 +17,7 @@ impl Query { .blocks .difficulty .collect_one(current_height) - .unwrap(); + .data()?; // Get current hashrate let current_day1 = computer @@ -25,7 +25,7 @@ impl Query { .height .day1 .collect_one(current_height) - .unwrap(); + .data()?; let current_hashrate = *computer .mining @@ -49,7 +49,7 @@ impl Query { .height .day1 .collect_one(Height::from(start)) - .unwrap(); + .data()?; let end_day1 = current_day1; // Sample at regular intervals to avoid too many data points diff --git a/crates/brk_query/src/impl/mining/pools.rs b/crates/brk_query/src/impl/mining/pools.rs index a334dcb02..218dbc26c 100644 --- a/crates/brk_query/src/impl/mining/pools.rs +++ b/crates/brk_query/src/impl/mining/pools.rs @@ -291,20 +291,25 @@ impl Query { let computer = self.computer(); let max_height = self.height().to_usize(); let start = start_height.map(|h| h.to_usize()).unwrap_or(max_height); - - let reader = computer.pools.pool.reader(); - let end = start.min(reader.len().saturating_sub(1)); + let end = start.min(computer.pools.pool.len().saturating_sub(1)); const POOL_BLOCKS_LIMIT: usize = 100; - let mut heights = Vec::with_capacity(POOL_BLOCKS_LIMIT); - for h in (0..=end).rev() { - if reader.get(h) == slug { - heights.push(h); - if heights.len() >= POOL_BLOCKS_LIMIT { - break; - } - } - } + + let heights: Vec = computer + .pools + .pool_heights + .read() + .get(&slug) + .map(|pool_heights| { + let pos = pool_heights.partition_point(|h| h.to_usize() <= end); + let start = pos.saturating_sub(POOL_BLOCKS_LIMIT); + pool_heights[start..pos] + .iter() + .rev() + .map(|h| h.to_usize()) + .collect() + }) + .unwrap_or_default(); // Group consecutive descending heights into ranges for batch reads let mut blocks = Vec::with_capacity(heights.len()); diff --git a/crates/brk_query/src/impl/tx.rs b/crates/brk_query/src/impl/tx.rs index 6ef701acd..3e6e07b19 100644 --- a/crates/brk_query/src/impl/tx.rs +++ b/crates/brk_query/src/impl/tx.rs @@ -1,5 +1,5 @@ use bitcoin::hex::{DisplayHex, FromHex}; -use brk_error::{Error, Result}; +use brk_error::{Error, OptionData, Result}; use brk_types::{ BlockHash, Height, MerkleProof, Timestamp, Transaction, TxInIndex, TxIndex, TxOutIndex, TxOutspend, TxStatus, Txid, TxidPrefix, Vin, Vout, @@ -53,19 +53,19 @@ impl Query { }; // Get block info for status - let height = indexer - .vecs - .transactions - .height - .collect_one(tx_index) - .unwrap(); + let height = self + .computer() + .indexes + .tx_heights + .get_shared(tx_index) + .data()?; let block_hash = indexer .vecs .blocks .blockhash .reader() .get(height.to_usize()); - let block_time = indexer.vecs.blocks.timestamp.collect_one(height).unwrap(); + let block_time = indexer.vecs.blocks.timestamp.collect_one(height).data()?; Ok(TxStatus { confirmed: true, @@ -146,9 +146,9 @@ impl Query { let txid_reader = indexer.vecs.transactions.txid.reader(); let blockhash_reader = indexer.vecs.blocks.blockhash.reader(); + let tx_heights = &self.computer().indexes.tx_heights; let mut input_tx_cursor = indexer.vecs.inputs.tx_index.cursor(); let mut first_txin_cursor = indexer.vecs.transactions.first_txin_index.cursor(); - let mut height_cursor = indexer.vecs.transactions.height.cursor(); let mut block_ts_cursor = indexer.vecs.blocks.timestamp.cursor(); let mut cached_block: Option<(Height, BlockHash, Timestamp)> = None; @@ -162,11 +162,11 @@ impl Query { continue; } - let spending_tx_index = input_tx_cursor.get(usize::from(txin_index)).unwrap(); - let spending_first_txin = first_txin_cursor.get(spending_tx_index.to_usize()).unwrap(); + let spending_tx_index = input_tx_cursor.get(usize::from(txin_index)).data()?; + let spending_first_txin = first_txin_cursor.get(spending_tx_index.to_usize()).data()?; let vin = Vin::from(usize::from(txin_index) - usize::from(spending_first_txin)); let spending_txid = txid_reader.get(spending_tx_index.to_usize()); - let spending_height = height_cursor.get(spending_tx_index.to_usize()).unwrap(); + let spending_height = tx_heights.get_shared(spending_tx_index).data()?; let (block_hash, block_time) = if let Some((h, ref bh, bt)) = cached_block && h == spending_height @@ -174,7 +174,7 @@ impl Query { (bh.clone(), bt) } else { let bh = blockhash_reader.get(spending_height.to_usize()); - let bt = block_ts_cursor.get(spending_height.to_usize()).unwrap(); + let bt = block_ts_cursor.get(spending_height.to_usize()).data()?; cached_block = Some((spending_height, bh.clone(), bt)); (bh, bt) }; @@ -238,19 +238,19 @@ impl Query { .inputs .tx_index .collect_one_at(usize::from(txin_index)) - .unwrap(); + .data()?; let spending_first_txin = indexer .vecs .transactions .first_txin_index .collect_one(spending_tx_index) - .unwrap(); - let spending_height = indexer - .vecs - .transactions - .height - .collect_one(spending_tx_index) - .unwrap(); + .data()?; + let spending_height = self + .computer() + .indexes + .tx_heights + .get_shared(spending_tx_index) + .data()?; Ok(TxOutspend { spent: true, @@ -282,7 +282,7 @@ impl Query { .blocks .timestamp .collect_one(spending_height) - .unwrap(), + .data()?, ), }), }) @@ -304,13 +304,13 @@ impl Query { .transactions .total_size .collect_one(tx_index) - .unwrap(); + .data()?; let position = indexer .vecs .transactions .position .collect_one(tx_index) - .unwrap(); + .data()?; self.reader().read_raw_bytes(position, *total_size as usize) } @@ -329,12 +329,12 @@ impl Query { .get(&prefix)? .map(|cow| cow.into_owned()) .ok_or(Error::UnknownTxid)?; - let height: Height = indexer - .vecs - .transactions - .height - .collect_one(tx_index) - .unwrap(); + let height: Height = self + .computer() + .indexes + .tx_heights + .get_shared(tx_index) + .data()?; Ok((tx_index, height)) } diff --git a/crates/brk_server/src/extended/encoding.rs b/crates/brk_server/src/extended/encoding.rs index 548ee9fca..6b734d1a0 100644 --- a/crates/brk_server/src/extended/encoding.rs +++ b/crates/brk_server/src/extended/encoding.rs @@ -16,6 +16,7 @@ impl ContentEncoding { /// Negotiate the best encoding from the Accept-Encoding header. /// Priority: zstd > br > gzip > identity. /// zstd is preferred over brotli: ~3-5x faster compression at comparable ratios. + /// Respects q=0 (RFC 9110 §12.5.3): encodings explicitly rejected are never selected. pub fn negotiate(headers: &HeaderMap) -> Self { let accept = match headers.get(header::ACCEPT_ENCODING) { Some(v) => v, @@ -28,7 +29,15 @@ impl ContentEncoding { let mut best = Self::Identity; for part in s.split(',') { - let name = part.split(';').next().unwrap_or("").trim(); + let mut iter = part.split(';'); + let name = iter.next().unwrap_or("").trim(); + let rejected = iter.any(|p| { + let p = p.trim(); + p == "q=0" || p == "q=0.0" || p == "q=0.00" || p == "q=0.000" + }); + if rejected { + continue; + } match name { "zstd" => return Self::Zstd, "br" => best = Self::Brotli, diff --git a/crates/brk_types/src/pool_slug.rs b/crates/brk_types/src/pool_slug.rs index 83ab00ab2..e158d6a29 100644 --- a/crates/brk_types/src/pool_slug.rs +++ b/crates/brk_types/src/pool_slug.rs @@ -15,6 +15,7 @@ use vecdb::{Bytes, Formattable}; Eq, PartialOrd, Ord, + Hash, Serialize, Deserialize, JsonSchema, diff --git a/crates/brk_types/src/range_map.rs b/crates/brk_types/src/range_map.rs index d6fa4c57e..c79a572dd 100644 --- a/crates/brk_types/src/range_map.rs +++ b/crates/brk_types/src/range_map.rs @@ -132,6 +132,17 @@ impl, V: From + Copy + Default> Ran } } + /// Shared (immutable) floor lookup — binary search only, no cache update. + /// Use when you only have `&self` (e.g. read-only clones in the query layer). + #[inline] + pub fn get_shared(&self, index: I) -> Option { + if self.first_indexes.is_empty() { + return None; + } + let pos = self.first_indexes.partition_point(|&first| first <= index); + if pos > 0 { Some(V::from(pos - 1)) } else { None } + } + #[inline] fn cache_slot(index: &I) -> usize { let v: usize = (*index).into();