global: BIG snapshot

This commit is contained in:
nym21
2026-01-04 01:47:03 +01:00
parent c33444a92e
commit 3cae817915
127 changed files with 4750 additions and 9474 deletions

View File

@@ -60,7 +60,7 @@ where
first: options.first.then(|| {
Box::new(LazyVecFrom2::init(
&maybe_suffix("first"),
version + VERSION + Version::ZERO,
version + VERSION,
source_extra
.first
.as_ref()
@@ -77,7 +77,7 @@ where
last: options.last.then(|| {
Box::new(LazyVecFrom2::init(
name,
version + VERSION + Version::ZERO,
version + VERSION,
source_extra.last.as_ref().map_or_else(
|| {
source
@@ -102,7 +102,7 @@ where
min: options.min.then(|| {
Box::new(LazyVecFrom2::init(
&maybe_suffix("min"),
version + VERSION + Version::ZERO,
version + VERSION,
source_extra
.min
.as_ref()
@@ -121,7 +121,7 @@ where
max: options.max.then(|| {
Box::new(LazyVecFrom2::init(
&maybe_suffix("max"),
version + VERSION + Version::ZERO,
version + VERSION,
source_extra
.max
.as_ref()
@@ -140,7 +140,7 @@ where
average: options.average.then(|| {
Box::new(LazyVecFrom2::init(
&maybe_suffix("avg"),
version + VERSION + Version::ZERO,
version + VERSION,
source_extra
.average
.as_ref()
@@ -172,7 +172,7 @@ where
} else {
maybe_suffix("sum")
}),
version + VERSION + Version::ZERO,
version + VERSION,
source_extra
.sum
.as_ref()
@@ -200,7 +200,7 @@ where
cumulative: options.cumulative.then(|| {
Box::new(LazyVecFrom2::init(
&suffix("cumulative"),
version + VERSION + Version::ZERO,
version + VERSION,
source_extra.cumulative.u().boxed_clone(),
len_source.clone(),
|i: I, source, len_source| {

View File

@@ -1,7 +1,8 @@
use brk_error::Result;
use brk_traversable::Traversable;
use brk_types::{
DateIndex, DecadeIndex, MonthIndex, QuarterIndex, SemesterIndex, Version, WeekIndex, YearIndex,
DateIndex, DecadeIndex, MonthIndex, QuarterIndex, SemesterIndex, TreeNode, Version, WeekIndex,
YearIndex,
};
use schemars::JsonSchema;
use vecdb::{
@@ -9,7 +10,7 @@ use vecdb::{
PcoVec,
};
use crate::{ComputeIndexes, internal::LazyVecsBuilder, indexes, utils::OptionExt};
use crate::{ComputeIndexes, indexes, internal::LazyVecsBuilder, utils::OptionExt};
use crate::internal::{ComputedVecValue, EagerVecsBuilder, Source, VecBuilderOptions};
@@ -45,12 +46,12 @@ where
) -> Result<Self> {
let dateindex = source
.is_compute()
.then(|| EagerVec::forced_import(db, name, version + VERSION + Version::ZERO).unwrap());
.then(|| EagerVec::forced_import(db, name, version + VERSION).unwrap());
let dateindex_extra = EagerVecsBuilder::forced_import(
db,
name,
version + VERSION + Version::ZERO,
version + VERSION,
options.copy_self_extra(),
)?;
@@ -61,7 +62,7 @@ where
Ok(Self {
weekindex: LazyVecsBuilder::forced_import(
name,
version + VERSION + Version::ZERO,
version + VERSION,
dateindex_source.clone(),
&dateindex_extra,
indexes.time.weekindex_to_weekindex.boxed_clone(),
@@ -69,7 +70,7 @@ where
),
monthindex: LazyVecsBuilder::forced_import(
name,
version + VERSION + Version::ZERO,
version + VERSION,
dateindex_source.clone(),
&dateindex_extra,
indexes.time.monthindex_to_monthindex.boxed_clone(),
@@ -77,7 +78,7 @@ where
),
quarterindex: LazyVecsBuilder::forced_import(
name,
version + VERSION + Version::ZERO,
version + VERSION,
dateindex_source.clone(),
&dateindex_extra,
indexes.time.quarterindex_to_quarterindex.boxed_clone(),
@@ -85,7 +86,7 @@ where
),
semesterindex: LazyVecsBuilder::forced_import(
name,
version + VERSION + Version::ZERO,
version + VERSION,
dateindex_source.clone(),
&dateindex_extra,
indexes.time.semesterindex_to_semesterindex.boxed_clone(),
@@ -93,7 +94,7 @@ where
),
yearindex: LazyVecsBuilder::forced_import(
name,
version + VERSION + Version::ZERO,
version + VERSION,
dateindex_source.clone(),
&dateindex_extra,
indexes.time.yearindex_to_yearindex.boxed_clone(),
@@ -101,7 +102,7 @@ where
),
decadeindex: LazyVecsBuilder::forced_import(
name,
version + VERSION + Version::ZERO,
version + VERSION,
dateindex_source.clone(),
&dateindex_extra,
indexes.time.decadeindex_to_decadeindex.boxed_clone(),
@@ -151,9 +152,9 @@ impl<T> Traversable for ComputedVecsFromDateIndex<T>
where
T: ComputedVecValue + JsonSchema,
{
fn to_tree_node(&self) -> brk_traversable::TreeNode {
fn to_tree_node(&self) -> TreeNode {
let dateindex_extra_node = self.dateindex_extra.to_tree_node();
brk_traversable::TreeNode::Branch(
TreeNode::Branch(
[
self.dateindex
.as_ref()

View File

@@ -3,7 +3,7 @@ use brk_error::Result;
use brk_traversable::Traversable;
use brk_types::{
DateIndex, DecadeIndex, DifficultyEpoch, Height, MonthIndex, QuarterIndex, SemesterIndex,
Version, WeekIndex, YearIndex,
TreeNode, Version, WeekIndex, YearIndex,
};
use schemars::JsonSchema;
use vecdb::{
@@ -12,9 +12,8 @@ use vecdb::{
};
use crate::{
ComputeIndexes,
ComputeIndexes, indexes,
internal::{LazyVecsBuilder, Source},
indexes,
utils::OptionExt,
};
@@ -56,17 +55,16 @@ where
) -> Result<Self> {
let height = source
.is_compute()
.then(|| EagerVec::forced_import(db, name, version + VERSION + Version::ZERO).unwrap());
.then(|| EagerVec::forced_import(db, name, version + VERSION).unwrap());
let height_extra = EagerVecsBuilder::forced_import(
db,
name,
version + VERSION + Version::ZERO,
version + VERSION,
options.copy_self_extra(),
)?;
let dateindex =
EagerVecsBuilder::forced_import(db, name, version + VERSION + Version::ZERO, options)?;
let dateindex = EagerVecsBuilder::forced_import(db, name, version + VERSION, options)?;
let options = options.remove_percentiles();
@@ -75,7 +73,7 @@ where
Ok(Self {
weekindex: LazyVecsBuilder::forced_import(
name,
version + VERSION + Version::ZERO,
version + VERSION,
None,
&dateindex,
indexes.time.weekindex_to_weekindex.boxed_clone(),
@@ -83,7 +81,7 @@ where
),
monthindex: LazyVecsBuilder::forced_import(
name,
version + VERSION + Version::ZERO,
version + VERSION,
None,
&dateindex,
indexes.time.monthindex_to_monthindex.boxed_clone(),
@@ -91,7 +89,7 @@ where
),
quarterindex: LazyVecsBuilder::forced_import(
name,
version + VERSION + Version::ZERO,
version + VERSION,
None,
&dateindex,
indexes.time.quarterindex_to_quarterindex.boxed_clone(),
@@ -99,7 +97,7 @@ where
),
semesterindex: LazyVecsBuilder::forced_import(
name,
version + VERSION + Version::ZERO,
version + VERSION,
None,
&dateindex,
indexes.time.semesterindex_to_semesterindex.boxed_clone(),
@@ -107,7 +105,7 @@ where
),
yearindex: LazyVecsBuilder::forced_import(
name,
version + VERSION + Version::ZERO,
version + VERSION,
None,
&dateindex,
indexes.time.yearindex_to_yearindex.boxed_clone(),
@@ -115,19 +113,22 @@ where
),
decadeindex: LazyVecsBuilder::forced_import(
name,
version + VERSION + Version::ZERO,
version + VERSION,
None,
&dateindex,
indexes.time.decadeindex_to_decadeindex.boxed_clone(),
options.into(),
),
// halvingepoch: StorableVecGeneator::forced_import(db, name, version + VERSION + Version::ZERO, format, options)?,
// halvingepoch: StorableVecGeneator::forced_import(db, name, version + VERSION , format, options)?,
difficultyepoch: LazyVecsBuilder::forced_import(
name,
version + VERSION + Version::ZERO,
version + VERSION,
height_source,
&height_extra,
indexes.block.difficultyepoch_to_difficultyepoch.boxed_clone(),
indexes
.block
.difficultyepoch_to_difficultyepoch
.boxed_clone(),
options.into(),
),
height,
@@ -193,9 +194,9 @@ impl<T> Traversable for ComputedVecsFromHeight<T>
where
T: ComputedVecValue + JsonSchema,
{
fn to_tree_node(&self) -> brk_traversable::TreeNode {
fn to_tree_node(&self) -> TreeNode {
let height_extra_node = self.height_extra.to_tree_node();
brk_traversable::TreeNode::Branch(
TreeNode::Branch(
[
self.height
.as_ref()

View File

@@ -1,7 +1,7 @@
use brk_error::Result;
use brk_traversable::Traversable;
use brk_types::{DifficultyEpoch, Height, Version};
use brk_types::{DifficultyEpoch, Height, TreeNode, Version};
use schemars::JsonSchema;
use vecdb::{
AnyExportableVec, Database, EagerVec, Exit, ImportableVec, IterableCloneableVec, PcoVec,
@@ -36,12 +36,12 @@ where
indexes: &indexes::Vecs,
options: VecBuilderOptions,
) -> Result<Self> {
let height = EagerVec::forced_import(db, name, version + VERSION + Version::ZERO)?;
let height = EagerVec::forced_import(db, name, version + VERSION)?;
let height_extra = EagerVecsBuilder::forced_import(
db,
name,
version + VERSION + Version::ZERO,
version + VERSION,
options.copy_self_extra(),
)?;
@@ -50,15 +50,18 @@ where
Ok(Self {
difficultyepoch: LazyVecsBuilder::forced_import(
name,
version + VERSION + Version::ZERO,
version + VERSION,
Some(height.boxed_clone()),
&height_extra,
indexes.block.difficultyepoch_to_difficultyepoch.boxed_clone(),
indexes
.block
.difficultyepoch_to_difficultyepoch
.boxed_clone(),
options.into(),
),
height,
height_extra,
// halvingepoch: StorableVecGeneator::forced_import(db, name, version + VERSION + Version::ZERO, format, options)?,
// halvingepoch: StorableVecGeneator::forced_import(db, name, version + VERSION , format, options)?,
})
}
@@ -84,9 +87,9 @@ impl<T> Traversable for ComputedVecsFromHeightStrict<T>
where
T: ComputedVecValue + JsonSchema,
{
fn to_tree_node(&self) -> brk_traversable::TreeNode {
fn to_tree_node(&self) -> TreeNode {
let height_extra_node = self.height_extra.to_tree_node();
brk_traversable::TreeNode::Branch(
TreeNode::Branch(
[
Some(("height".to_string(), self.height.to_tree_node())),
if height_extra_node.is_empty() {

View File

@@ -3,7 +3,7 @@ use brk_indexer::Indexer;
use brk_traversable::Traversable;
use brk_types::{
Bitcoin, DateIndex, DecadeIndex, DifficultyEpoch, Dollars, Height, MonthIndex, QuarterIndex,
Sats, SemesterIndex, TxIndex, Version, WeekIndex, YearIndex,
Sats, SemesterIndex, TreeNode, TxIndex, Version, WeekIndex, YearIndex,
};
use schemars::JsonSchema;
use vecdb::{
@@ -12,9 +12,9 @@ use vecdb::{
};
use crate::{
ComputeIndexes,
ComputeIndexes, indexes,
internal::{LazyVecsBuilder, Source},
indexes, price,
price,
utils::OptionExt,
};
@@ -54,22 +54,20 @@ where
indexes: &indexes::Vecs,
options: VecBuilderOptions,
) -> Result<Self> {
let txindex = source.is_compute().then(|| {
Box::new(EagerVec::forced_import(db, name, version + VERSION + Version::ZERO).unwrap())
});
let txindex = source
.is_compute()
.then(|| Box::new(EagerVec::forced_import(db, name, version + VERSION).unwrap()));
let height =
EagerVecsBuilder::forced_import(db, name, version + VERSION + Version::ZERO, options)?;
let height = EagerVecsBuilder::forced_import(db, name, version + VERSION, options)?;
let options = options.remove_percentiles();
let dateindex =
EagerVecsBuilder::forced_import(db, name, version + VERSION + Version::ZERO, options)?;
let dateindex = EagerVecsBuilder::forced_import(db, name, version + VERSION, options)?;
Ok(Self {
weekindex: LazyVecsBuilder::forced_import(
name,
version + VERSION + Version::ZERO,
version + VERSION,
None,
&dateindex,
indexes.time.weekindex_to_weekindex.boxed_clone(),
@@ -77,15 +75,18 @@ where
),
difficultyepoch: LazyVecsBuilder::forced_import(
name,
version + VERSION + Version::ZERO,
version + VERSION,
None,
&height,
indexes.block.difficultyepoch_to_difficultyepoch.boxed_clone(),
indexes
.block
.difficultyepoch_to_difficultyepoch
.boxed_clone(),
options.into(),
),
monthindex: LazyVecsBuilder::forced_import(
name,
version + VERSION + Version::ZERO,
version + VERSION,
None,
&dateindex,
indexes.time.monthindex_to_monthindex.boxed_clone(),
@@ -93,7 +94,7 @@ where
),
quarterindex: LazyVecsBuilder::forced_import(
name,
version + VERSION + Version::ZERO,
version + VERSION,
None,
&dateindex,
indexes.time.quarterindex_to_quarterindex.boxed_clone(),
@@ -101,7 +102,7 @@ where
),
semesterindex: LazyVecsBuilder::forced_import(
name,
version + VERSION + Version::ZERO,
version + VERSION,
None,
&dateindex,
indexes.time.semesterindex_to_semesterindex.boxed_clone(),
@@ -109,7 +110,7 @@ where
),
yearindex: LazyVecsBuilder::forced_import(
name,
version + VERSION + Version::ZERO,
version + VERSION,
None,
&dateindex,
indexes.time.yearindex_to_yearindex.boxed_clone(),
@@ -117,7 +118,7 @@ where
),
decadeindex: LazyVecsBuilder::forced_import(
name,
version + VERSION + Version::ZERO,
version + VERSION,
None,
&dateindex,
indexes.time.decadeindex_to_decadeindex.boxed_clone(),
@@ -127,7 +128,7 @@ where
txindex,
height,
dateindex,
// halvingepoch: StorableVecGeneator::forced_import(db, name, version + VERSION + Version::ZERO, format, options)?,
// halvingepoch: StorableVecGeneator::forced_import(db, name, version + VERSION , format, options)?,
})
}
@@ -402,8 +403,8 @@ impl<T> Traversable for ComputedVecsFromTxindex<T>
where
T: ComputedVecValue + JsonSchema,
{
fn to_tree_node(&self) -> brk_traversable::TreeNode {
brk_traversable::TreeNode::Branch(
fn to_tree_node(&self) -> TreeNode {
TreeNode::Branch(
[
self.txindex
.as_ref()

View File

@@ -1,11 +1,14 @@
use brk_traversable::Traversable;
use brk_types::{
DateIndex, DecadeIndex, MonthIndex, QuarterIndex, SemesterIndex, Version, WeekIndex, YearIndex,
DateIndex, DecadeIndex, MonthIndex, QuarterIndex, SemesterIndex, TreeNode, Version, WeekIndex,
YearIndex,
};
use schemars::JsonSchema;
use vecdb::{AnyExportableVec, BinaryTransform, IterableCloneableVec, LazyVecFrom2};
use crate::internal::{ComputedVecValue, ComputedVecsFromDateIndex, ComputedVecsFromHeight, LazyTransform2Builder};
use crate::internal::{
ComputedVecValue, ComputedVecsFromDateIndex, ComputedVecsFromHeight, LazyTransform2Builder,
};
const VERSION: Version = Version::ZERO;
@@ -215,8 +218,8 @@ where
S1T: ComputedVecValue,
S2T: ComputedVecValue,
{
fn to_tree_node(&self) -> brk_traversable::TreeNode {
brk_traversable::TreeNode::Branch(
fn to_tree_node(&self) -> TreeNode {
TreeNode::Branch(
[
self.dateindex
.as_ref()

View File

@@ -1,7 +1,7 @@
use brk_traversable::Traversable;
use brk_types::{
DateIndex, DecadeIndex, DifficultyEpoch, Height, MonthIndex, QuarterIndex, SemesterIndex,
Version, WeekIndex, YearIndex,
TreeNode, Version, WeekIndex, YearIndex,
};
use schemars::JsonSchema;
use vecdb::{AnyExportableVec, BinaryTransform, IterableBoxedVec, LazyVecFrom2};
@@ -192,9 +192,9 @@ where
S1T: ComputedVecValue,
S2T: ComputedVecValue,
{
fn to_tree_node(&self) -> brk_traversable::TreeNode {
fn to_tree_node(&self) -> TreeNode {
let height_extra_node = self.height_extra.to_tree_node();
brk_traversable::TreeNode::Branch(
TreeNode::Branch(
[
Some(("height".to_string(), self.height.to_tree_node())),
if height_extra_node.is_empty() {

View File

@@ -1,6 +1,7 @@
use brk_traversable::Traversable;
use brk_types::{
DateIndex, DecadeIndex, MonthIndex, QuarterIndex, SemesterIndex, Version, WeekIndex, YearIndex,
DateIndex, DecadeIndex, MonthIndex, QuarterIndex, SemesterIndex, TreeNode, Version, WeekIndex,
YearIndex,
};
use schemars::JsonSchema;
use vecdb::{AnyExportableVec, IterableBoxedVec, LazyVecFrom1, UnaryTransform};
@@ -65,9 +66,9 @@ where
T: ComputedVecValue + JsonSchema,
S1T: ComputedVecValue,
{
fn to_tree_node(&self) -> brk_traversable::TreeNode {
fn to_tree_node(&self) -> TreeNode {
let dateindex_extra_node = self.dateindex_extra.to_tree_node();
brk_traversable::TreeNode::Branch(
TreeNode::Branch(
[
self.dateindex
.as_ref()

View File

@@ -1,7 +1,7 @@
use brk_traversable::Traversable;
use brk_types::{
DateIndex, DecadeIndex, DifficultyEpoch, Height, MonthIndex, QuarterIndex, SemesterIndex,
Version, WeekIndex, YearIndex,
TreeNode, Version, WeekIndex, YearIndex,
};
use schemars::JsonSchema;
use vecdb::{AnyExportableVec, IterableBoxedVec, LazyVecFrom1, UnaryTransform};
@@ -72,9 +72,9 @@ where
T: ComputedVecValue + JsonSchema,
S1T: ComputedVecValue,
{
fn to_tree_node(&self) -> brk_traversable::TreeNode {
fn to_tree_node(&self) -> TreeNode {
let height_extra_node = self.height_extra.to_tree_node();
brk_traversable::TreeNode::Branch(
TreeNode::Branch(
[
Some(("height".to_string(), self.height.to_tree_node())),
if height_extra_node.is_empty() {

View File

@@ -1,17 +1,19 @@
use brk_traversable::Traversable;
use brk_types::{
DateIndex, DecadeIndex, Height, MonthIndex, QuarterIndex, SemesterIndex, Version, WeekIndex,
YearIndex,
DateIndex, DecadeIndex, Height, MonthIndex, QuarterIndex, SemesterIndex, TreeNode, Version,
WeekIndex, YearIndex,
};
use schemars::JsonSchema;
use serde::Serialize;
use vecdb::{Formattable, IterableCloneableVec, LazyVecFrom1, UnaryTransform, VecValue};
use vecdb::{
AnyExportableVec, Formattable, IterableCloneableVec, LazyVecFrom1, UnaryTransform, VecValue,
};
use crate::indexes;
use crate::{indexes, internal::ComputedVecValue};
/// Lazy constant vecs for all index levels.
/// Uses const generic transforms to return the same value for every index.
#[derive(Clone, Traversable)]
#[derive(Clone)]
pub struct ConstantVecs<T>
where
T: VecValue + Formattable + Serialize + JsonSchema,
@@ -83,3 +85,44 @@ impl<T: VecValue + Formattable + Serialize + JsonSchema> ConstantVecs<T> {
}
}
}
impl<T> Traversable for ConstantVecs<T>
where
T: ComputedVecValue + JsonSchema,
{
fn to_tree_node(&self) -> TreeNode {
TreeNode::Branch(
[
Some(("height".to_string(), self.height.to_tree_node())),
Some(("dateindex".to_string(), self.dateindex.to_tree_node())),
Some(("weekindex".to_string(), self.weekindex.to_tree_node())),
Some(("monthindex".to_string(), self.monthindex.to_tree_node())),
Some(("quarterindex".to_string(), self.quarterindex.to_tree_node())),
Some((
"semesterindex".to_string(),
self.semesterindex.to_tree_node(),
)),
Some(("yearindex".to_string(), self.yearindex.to_tree_node())),
Some(("decadeindex".to_string(), self.decadeindex.to_tree_node())),
]
.into_iter()
.flatten()
.collect(),
)
.merge_branches()
.unwrap()
}
fn iter_any_exportable(&self) -> impl Iterator<Item = &dyn AnyExportableVec> {
let mut regular_iter: Box<dyn Iterator<Item = &dyn AnyExportableVec>> =
Box::new(self.height.iter_any_exportable());
regular_iter = Box::new(regular_iter.chain(self.dateindex.iter_any_exportable()));
regular_iter = Box::new(regular_iter.chain(self.weekindex.iter_any_exportable()));
regular_iter = Box::new(regular_iter.chain(self.monthindex.iter_any_exportable()));
regular_iter = Box::new(regular_iter.chain(self.quarterindex.iter_any_exportable()));
regular_iter = Box::new(regular_iter.chain(self.semesterindex.iter_any_exportable()));
regular_iter = Box::new(regular_iter.chain(self.yearindex.iter_any_exportable()));
regular_iter = Box::new(regular_iter.chain(self.decadeindex.iter_any_exportable()));
regular_iter
}
}

View File

@@ -35,14 +35,14 @@ impl LazyValueVecsFromDateIndex {
let sats = LazyVecsFromDateIndex::from_computed::<SatsTransform>(
name,
v + Version::ZERO,
v,
source.sats.dateindex.as_ref().map(|v| v.boxed_clone()),
&source.sats,
);
let bitcoin = LazyVecsFromDateIndex::from_computed::<BitcoinTransform>(
&format!("{name}_btc"),
v + Version::ZERO,
v,
source.sats.dateindex.as_ref().map(|v| v.boxed_clone()),
&source.sats,
);
@@ -50,7 +50,7 @@ impl LazyValueVecsFromDateIndex {
let dollars = source.dollars.as_ref().map(|dollars_source| {
LazyVecsFromDateIndex::from_computed::<DollarsTransform>(
&format!("{name}_usd"),
v + Version::ZERO,
v,
dollars_source.dateindex.as_ref().map(|v| v.boxed_clone()),
dollars_source,
)

View File

@@ -32,15 +32,11 @@ impl LazyHeightValueVecs {
{
let v = version + VERSION;
let sats = LazyVecFrom1::transformed::<SatsTransform>(
name,
v + Version::ZERO,
sats_source.clone(),
);
let sats = LazyVecFrom1::transformed::<SatsTransform>(name, v, sats_source.clone());
let bitcoin = LazyVecFrom1::transformed::<BitcoinTransform>(
&format!("{name}_btc"),
v + Version::ZERO,
v,
sats_source.clone(),
);
@@ -48,7 +44,7 @@ impl LazyHeightValueVecs {
let dollars = price_source.map(|price| {
LazyVecFrom2::transformed::<DollarsTransform>(
&format!("{name}_usd"),
v + Version::ZERO,
v,
price,
sats_source,
)

View File

@@ -27,7 +27,7 @@ impl ComputedHeightValueVecs {
) -> Result<Self> {
let sats = source
.is_compute()
.then(|| EagerVec::forced_import(db, name, version + VERSION + Version::ZERO).unwrap());
.then(|| EagerVec::forced_import(db, name, version + VERSION).unwrap());
let sats_source: IterableBoxedVec<Height, Sats> = source
.vec()
@@ -35,14 +35,14 @@ impl ComputedHeightValueVecs {
let bitcoin = LazyVecFrom1::transformed::<SatsToBitcoin>(
&format!("{name}_btc"),
version + VERSION + Version::ZERO,
version + VERSION,
sats_source.clone(),
);
let dollars = price_source.map(|price| {
LazyVecFrom2::transformed::<ClosePriceTimesSats>(
&format!("{name}_usd"),
version + VERSION + Version::ZERO,
version + VERSION,
price,
sats_source.clone(),
)