mirror of
https://github.com/bitcoinresearchkit/brk.git
synced 2026-08-04 22:53:05 -07:00
global: part X
This commit is contained in:
Generated
+1
@@ -593,6 +593,7 @@ dependencies = [
|
||||
"rustc-hash",
|
||||
"schemars",
|
||||
"serde",
|
||||
"tempfile",
|
||||
"tracing",
|
||||
"vecdb",
|
||||
]
|
||||
|
||||
+276
-145
@@ -3226,6 +3226,24 @@ impl PpmPriceRatioPattern {
|
||||
}
|
||||
}
|
||||
|
||||
/// Pattern struct for repeated tree structure.
|
||||
pub struct RankTailThresholdPattern {
|
||||
pub rank: SeriesPattern1<StoredI8>,
|
||||
pub tail: PercentPpmRatioPattern2,
|
||||
pub threshold: SeriesPattern1<Dollars>,
|
||||
}
|
||||
|
||||
impl RankTailThresholdPattern {
|
||||
/// Create a new pattern node with accumulated series name.
|
||||
pub fn new(client: Arc<BrkClientBase>, acc: String) -> Self {
|
||||
Self {
|
||||
rank: SeriesPattern1::new(client.clone(), _m(&acc, "rank")),
|
||||
tail: PercentPpmRatioPattern2::new(client.clone(), _m(&acc, "tail")),
|
||||
threshold: SeriesPattern1::new(client.clone(), _m(&acc, "threshold")),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Pattern struct for repeated tree structure.
|
||||
pub struct RatioTransferValuePattern {
|
||||
pub ratio: _1m1w1y24hPattern<StoredF64>,
|
||||
@@ -3872,9 +3890,8 @@ pub struct SeriesTree {
|
||||
pub scripts: SeriesTree_Scripts,
|
||||
pub op_return: SeriesTree_OpReturn,
|
||||
pub mining: SeriesTree_Mining,
|
||||
pub cointime: SeriesTree_Cointime,
|
||||
pub coinflow: SeriesTree_Coinflow,
|
||||
pub bedrock: SeriesTree_Bedrock,
|
||||
pub frameworks: SeriesTree_Frameworks,
|
||||
pub models: SeriesTree_Models,
|
||||
pub constants: SeriesTree_Constants,
|
||||
pub indexes: SeriesTree_Indexes,
|
||||
pub indicators: SeriesTree_Indicators,
|
||||
@@ -3884,6 +3901,7 @@ pub struct SeriesTree {
|
||||
pub price: SeriesTree_Price,
|
||||
pub supply: SeriesTree_Supply,
|
||||
pub cohorts: SeriesTree_Cohorts,
|
||||
pub cointime: SeriesTree_Cointime,
|
||||
}
|
||||
|
||||
impl SeriesTree {
|
||||
@@ -3897,9 +3915,8 @@ impl SeriesTree {
|
||||
scripts: SeriesTree_Scripts::new(client.clone(), format!("{base_path}_scripts")),
|
||||
op_return: SeriesTree_OpReturn::new(client.clone(), format!("{base_path}_op_return")),
|
||||
mining: SeriesTree_Mining::new(client.clone(), format!("{base_path}_mining")),
|
||||
cointime: SeriesTree_Cointime::new(client.clone(), format!("{base_path}_cointime")),
|
||||
coinflow: SeriesTree_Coinflow::new(client.clone(), format!("{base_path}_coinflow")),
|
||||
bedrock: SeriesTree_Bedrock::new(client.clone(), format!("{base_path}_bedrock")),
|
||||
frameworks: SeriesTree_Frameworks::new(client.clone(), format!("{base_path}_frameworks")),
|
||||
models: SeriesTree_Models::new(client.clone(), format!("{base_path}_models")),
|
||||
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")),
|
||||
@@ -3909,6 +3926,7 @@ impl SeriesTree {
|
||||
price: SeriesTree_Price::new(client.clone(), format!("{base_path}_price")),
|
||||
supply: SeriesTree_Supply::new(client.clone(), format!("{base_path}_supply")),
|
||||
cohorts: SeriesTree_Cohorts::new(client.clone(), format!("{base_path}_cohorts")),
|
||||
cointime: SeriesTree_Cointime::new(client.clone(), format!("{base_path}_cointime")),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4562,7 +4580,6 @@ impl SeriesTree_Transactions_Volume {
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Inputs {
|
||||
pub raw: SeriesTree_Inputs_Raw,
|
||||
pub spent: SeriesTree_Inputs_Spent,
|
||||
pub count: CumulativeRollingSumPattern,
|
||||
pub per_sec: _1m1w1y24hPattern<StoredF32>,
|
||||
pub by_type: SeriesTree_Inputs_ByType,
|
||||
@@ -4572,7 +4589,6 @@ impl SeriesTree_Inputs {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
raw: SeriesTree_Inputs_Raw::new(client.clone(), format!("{base_path}_raw")),
|
||||
spent: SeriesTree_Inputs_Spent::new(client.clone(), format!("{base_path}_spent")),
|
||||
count: CumulativeRollingSumPattern::new(client.clone(), "input_count".to_string()),
|
||||
per_sec: _1m1w1y24hPattern::new(client.clone(), "inputs_per_sec".to_string()),
|
||||
by_type: SeriesTree_Inputs_ByType::new(client.clone(), format!("{base_path}_by_type")),
|
||||
@@ -4584,6 +4600,8 @@ impl SeriesTree_Inputs {
|
||||
pub struct SeriesTree_Inputs_Raw {
|
||||
pub first_txin_index: SeriesPattern18<TxInIndex>,
|
||||
pub outpoint: SeriesPattern20<OutPoint>,
|
||||
pub txout_index: SeriesPattern20<TxOutIndex>,
|
||||
pub value: SeriesPattern20<Sats>,
|
||||
pub tx_index: SeriesPattern20<TxIndex>,
|
||||
pub output_type: SeriesPattern20<OutputType>,
|
||||
pub type_index: SeriesPattern20<TypeIndex>,
|
||||
@@ -4594,6 +4612,8 @@ impl SeriesTree_Inputs_Raw {
|
||||
Self {
|
||||
first_txin_index: SeriesPattern18::new(client.clone(), "first_txin_index".to_string()),
|
||||
outpoint: SeriesPattern20::new(client.clone(), "outpoint".to_string()),
|
||||
txout_index: SeriesPattern20::new(client.clone(), "txout_index".to_string()),
|
||||
value: SeriesPattern20::new(client.clone(), "value".to_string()),
|
||||
tx_index: SeriesPattern20::new(client.clone(), "tx_index".to_string()),
|
||||
output_type: SeriesPattern20::new(client.clone(), "output_type".to_string()),
|
||||
type_index: SeriesPattern20::new(client.clone(), "type_index".to_string()),
|
||||
@@ -4601,21 +4621,6 @@ impl SeriesTree_Inputs_Raw {
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Inputs_Spent {
|
||||
pub txout_index: SeriesPattern20<TxOutIndex>,
|
||||
pub value: SeriesPattern20<Sats>,
|
||||
}
|
||||
|
||||
impl SeriesTree_Inputs_Spent {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
txout_index: SeriesPattern20::new(client.clone(), "txout_index".to_string()),
|
||||
value: SeriesPattern20::new(client.clone(), "value".to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Inputs_ByType {
|
||||
pub input_count: SeriesTree_Inputs_ByType_InputCount,
|
||||
@@ -5844,43 +5849,57 @@ impl SeriesTree_Mining_Hashrate_Rate_Sma {
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Cointime {
|
||||
pub activity: SeriesTree_Cointime_Activity,
|
||||
pub age_range: SeriesTree_Cointime_AgeRange,
|
||||
pub supply: SeriesTree_Cointime_Supply,
|
||||
pub value: SeriesTree_Cointime_Value,
|
||||
pub cap: SeriesTree_Cointime_Cap,
|
||||
pub prices: SeriesTree_Cointime_Prices,
|
||||
pub adjusted: SeriesTree_Cointime_Adjusted,
|
||||
pub reserve_risk: SeriesTree_Cointime_ReserveRisk,
|
||||
pub struct SeriesTree_Frameworks {
|
||||
pub cointime: SeriesTree_Frameworks_Cointime,
|
||||
pub coinflow: SeriesTree_Frameworks_Coinflow,
|
||||
}
|
||||
|
||||
impl SeriesTree_Cointime {
|
||||
impl SeriesTree_Frameworks {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
activity: SeriesTree_Cointime_Activity::new(client.clone(), format!("{base_path}_activity")),
|
||||
age_range: SeriesTree_Cointime_AgeRange::new(client.clone(), format!("{base_path}_age_range")),
|
||||
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")),
|
||||
cointime: SeriesTree_Frameworks_Cointime::new(client.clone(), format!("{base_path}_cointime")),
|
||||
coinflow: SeriesTree_Frameworks_Coinflow::new(client.clone(), format!("{base_path}_coinflow")),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Cointime_Activity {
|
||||
pub struct SeriesTree_Frameworks_Cointime {
|
||||
pub activity: SeriesTree_Frameworks_Cointime_Activity,
|
||||
pub age_range: SeriesTree_Frameworks_Cointime_AgeRange,
|
||||
pub supply: SeriesTree_Frameworks_Cointime_Supply,
|
||||
pub value: SeriesTree_Frameworks_Cointime_Value,
|
||||
pub cap: SeriesTree_Frameworks_Cointime_Cap,
|
||||
pub prices: SeriesTree_Frameworks_Cointime_Prices,
|
||||
pub adjusted: SeriesTree_Frameworks_Cointime_Adjusted,
|
||||
pub reserve_risk: SeriesTree_Frameworks_Cointime_ReserveRisk,
|
||||
}
|
||||
|
||||
impl SeriesTree_Frameworks_Cointime {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
activity: SeriesTree_Frameworks_Cointime_Activity::new(client.clone(), format!("{base_path}_activity")),
|
||||
age_range: SeriesTree_Frameworks_Cointime_AgeRange::new(client.clone(), format!("{base_path}_age_range")),
|
||||
supply: SeriesTree_Frameworks_Cointime_Supply::new(client.clone(), format!("{base_path}_supply")),
|
||||
value: SeriesTree_Frameworks_Cointime_Value::new(client.clone(), format!("{base_path}_value")),
|
||||
cap: SeriesTree_Frameworks_Cointime_Cap::new(client.clone(), format!("{base_path}_cap")),
|
||||
prices: SeriesTree_Frameworks_Cointime_Prices::new(client.clone(), format!("{base_path}_prices")),
|
||||
adjusted: SeriesTree_Frameworks_Cointime_Adjusted::new(client.clone(), format!("{base_path}_adjusted")),
|
||||
reserve_risk: SeriesTree_Frameworks_Cointime_ReserveRisk::new(client.clone(), format!("{base_path}_reserve_risk")),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Frameworks_Cointime_Activity {
|
||||
pub coinblocks_created: AverageBlockCumulativeSumPattern<StoredF64>,
|
||||
pub coinblocks_stored: AverageBlockCumulativeSumPattern<StoredF64>,
|
||||
pub liveliness: SeriesPattern1<StoredF64>,
|
||||
pub vaultedness: SeriesPattern1<StoredF64>,
|
||||
pub ratio: SeriesPattern1<StoredF64>,
|
||||
pub coinblocks_destroyed: AverageBlockCumulativeSumPattern<StoredF64>,
|
||||
}
|
||||
|
||||
impl SeriesTree_Cointime_Activity {
|
||||
impl SeriesTree_Frameworks_Cointime_Activity {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
coinblocks_created: AverageBlockCumulativeSumPattern::new(client.clone(), "coinblocks_created".to_string()),
|
||||
@@ -5888,13 +5907,12 @@ impl SeriesTree_Cointime_Activity {
|
||||
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()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Cointime_AgeRange {
|
||||
pub struct SeriesTree_Frameworks_Cointime_AgeRange {
|
||||
pub under_1h: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
pub _1h_to_1d: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
pub _1d_to_1w: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
@@ -5920,7 +5938,7 @@ pub struct SeriesTree_Cointime_AgeRange {
|
||||
pub over_15y: CoindaysLivelinessRatioSupplyVaultednessPattern,
|
||||
}
|
||||
|
||||
impl SeriesTree_Cointime_AgeRange {
|
||||
impl SeriesTree_Frameworks_Cointime_AgeRange {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
under_1h: CoindaysLivelinessRatioSupplyVaultednessPattern::new(client.clone(), "utxos_under_1h_old".to_string()),
|
||||
@@ -5951,22 +5969,22 @@ impl SeriesTree_Cointime_AgeRange {
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Cointime_Supply {
|
||||
pub struct SeriesTree_Frameworks_Cointime_Supply {
|
||||
pub vaulted: BtcCentsSatsUsdPattern,
|
||||
pub active: SeriesTree_Cointime_Supply_Active,
|
||||
pub active: SeriesTree_Frameworks_Cointime_Supply_Active,
|
||||
}
|
||||
|
||||
impl SeriesTree_Cointime_Supply {
|
||||
impl SeriesTree_Frameworks_Cointime_Supply {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
vaulted: BtcCentsSatsUsdPattern::new(client.clone(), "vaulted_supply".to_string()),
|
||||
active: SeriesTree_Cointime_Supply_Active::new(client.clone(), format!("{base_path}_active")),
|
||||
active: SeriesTree_Frameworks_Cointime_Supply_Active::new(client.clone(), format!("{base_path}_active")),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Cointime_Supply_Active {
|
||||
pub struct SeriesTree_Frameworks_Cointime_Supply_Active {
|
||||
pub btc: SeriesPattern1<Bitcoin>,
|
||||
pub sats: SeriesPattern1<Sats>,
|
||||
pub usd: SeriesPattern1<Dollars>,
|
||||
@@ -5974,7 +5992,7 @@ pub struct SeriesTree_Cointime_Supply_Active {
|
||||
pub in_loss: SharePattern2,
|
||||
}
|
||||
|
||||
impl SeriesTree_Cointime_Supply_Active {
|
||||
impl SeriesTree_Frameworks_Cointime_Supply_Active {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
btc: SeriesPattern1::new(client.clone(), "active_supply".to_string()),
|
||||
@@ -5987,14 +6005,14 @@ impl SeriesTree_Cointime_Supply_Active {
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Cointime_Value {
|
||||
pub struct SeriesTree_Frameworks_Cointime_Value {
|
||||
pub destroyed: AverageBlockCumulativeSumPattern<StoredF64>,
|
||||
pub created: AverageBlockCumulativeSumPattern<StoredF64>,
|
||||
pub stored: AverageBlockCumulativeSumPattern<StoredF64>,
|
||||
pub vocdd: AverageBlockCumulativeSumPattern<StoredF64>,
|
||||
}
|
||||
|
||||
impl SeriesTree_Cointime_Value {
|
||||
impl SeriesTree_Frameworks_Cointime_Value {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
destroyed: AverageBlockCumulativeSumPattern::new(client.clone(), "cointime_value_destroyed".to_string()),
|
||||
@@ -6006,7 +6024,7 @@ impl SeriesTree_Cointime_Value {
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Cointime_Cap {
|
||||
pub struct SeriesTree_Frameworks_Cointime_Cap {
|
||||
pub thermo: CentsUsdPattern3,
|
||||
pub investor: CentsUsdPattern3,
|
||||
pub vaulted: CentsUsdPattern3,
|
||||
@@ -6015,7 +6033,7 @@ pub struct SeriesTree_Cointime_Cap {
|
||||
pub aviv: PpmRatioPattern2,
|
||||
}
|
||||
|
||||
impl SeriesTree_Cointime_Cap {
|
||||
impl SeriesTree_Frameworks_Cointime_Cap {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
thermo: CentsUsdPattern3::new(client.clone(), "thermo_cap".to_string()),
|
||||
@@ -6029,14 +6047,14 @@ impl SeriesTree_Cointime_Cap {
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Cointime_Prices {
|
||||
pub struct SeriesTree_Frameworks_Cointime_Prices {
|
||||
pub vaulted: CentsPpmRatioSatsUsdPattern,
|
||||
pub active: CentsPpmRatioSatsUsdPattern,
|
||||
pub true_market_mean: CentsPpmRatioSatsUsdPattern,
|
||||
pub cointime: CentsPpmRatioSatsUsdPattern,
|
||||
}
|
||||
|
||||
impl SeriesTree_Cointime_Prices {
|
||||
impl SeriesTree_Frameworks_Cointime_Prices {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
vaulted: CentsPpmRatioSatsUsdPattern::new(client.clone(), "vaulted_price".to_string()),
|
||||
@@ -6048,13 +6066,13 @@ impl SeriesTree_Cointime_Prices {
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Cointime_Adjusted {
|
||||
pub struct SeriesTree_Frameworks_Cointime_Adjusted {
|
||||
pub inflation_rate: PercentPpmRatioPattern,
|
||||
pub tx_velocity_native: SeriesPattern1<StoredF64>,
|
||||
pub tx_velocity_fiat: SeriesPattern1<StoredF64>,
|
||||
}
|
||||
|
||||
impl SeriesTree_Cointime_Adjusted {
|
||||
impl SeriesTree_Frameworks_Cointime_Adjusted {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
inflation_rate: PercentPpmRatioPattern::new(client.clone(), "cointime_adj_inflation_rate".to_string()),
|
||||
@@ -6065,13 +6083,13 @@ impl SeriesTree_Cointime_Adjusted {
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Cointime_ReserveRisk {
|
||||
pub struct SeriesTree_Frameworks_Cointime_ReserveRisk {
|
||||
pub value: SeriesPattern1<StoredF64>,
|
||||
pub vocdd_median_1y: SeriesPattern18<StoredF64>,
|
||||
pub hodl_bank: SeriesPattern18<StoredF64>,
|
||||
}
|
||||
|
||||
impl SeriesTree_Cointime_ReserveRisk {
|
||||
impl SeriesTree_Frameworks_Cointime_ReserveRisk {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
value: SeriesPattern1::new(client.clone(), "reserve_risk".to_string()),
|
||||
@@ -6082,20 +6100,20 @@ impl SeriesTree_Cointime_ReserveRisk {
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Coinflow {
|
||||
pub age_range: SeriesTree_Coinflow_AgeRange,
|
||||
pub supply: SeriesTree_Coinflow_Supply,
|
||||
pub horizon: SeriesTree_Coinflow_Horizon,
|
||||
pub struct SeriesTree_Frameworks_Coinflow {
|
||||
pub age_range: SeriesTree_Frameworks_Coinflow_AgeRange,
|
||||
pub supply: SeriesTree_Frameworks_Coinflow_Supply,
|
||||
pub horizon: SeriesTree_Frameworks_Coinflow_Horizon,
|
||||
pub cap: CentsUsdPattern3,
|
||||
pub price: CentsPpmRatioSatsUsdPattern,
|
||||
}
|
||||
|
||||
impl SeriesTree_Coinflow {
|
||||
impl SeriesTree_Frameworks_Coinflow {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
age_range: SeriesTree_Coinflow_AgeRange::new(client.clone(), format!("{base_path}_age_range")),
|
||||
supply: SeriesTree_Coinflow_Supply::new(client.clone(), format!("{base_path}_supply")),
|
||||
horizon: SeriesTree_Coinflow_Horizon::new(client.clone(), format!("{base_path}_horizon")),
|
||||
age_range: SeriesTree_Frameworks_Coinflow_AgeRange::new(client.clone(), format!("{base_path}_age_range")),
|
||||
supply: SeriesTree_Frameworks_Coinflow_Supply::new(client.clone(), format!("{base_path}_supply")),
|
||||
horizon: SeriesTree_Frameworks_Coinflow_Horizon::new(client.clone(), format!("{base_path}_horizon")),
|
||||
cap: CentsUsdPattern3::new(client.clone(), "coinflow_cap".to_string()),
|
||||
price: CentsPpmRatioSatsUsdPattern::new(client.clone(), "coinflow_price".to_string()),
|
||||
}
|
||||
@@ -6103,7 +6121,7 @@ impl SeriesTree_Coinflow {
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Coinflow_AgeRange {
|
||||
pub struct SeriesTree_Frameworks_Coinflow_AgeRange {
|
||||
pub under_1h: MobilitySpendingSupplyPattern,
|
||||
pub _1h_to_1d: MobilitySpendingSupplyPattern,
|
||||
pub _1d_to_1w: MobilitySpendingSupplyPattern,
|
||||
@@ -6129,7 +6147,7 @@ pub struct SeriesTree_Coinflow_AgeRange {
|
||||
pub over_15y: MobilitySpendingSupplyPattern,
|
||||
}
|
||||
|
||||
impl SeriesTree_Coinflow_AgeRange {
|
||||
impl SeriesTree_Frameworks_Coinflow_AgeRange {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
under_1h: MobilitySpendingSupplyPattern::new(client.clone(), "utxos_under_1h_old".to_string()),
|
||||
@@ -6160,22 +6178,22 @@ impl SeriesTree_Coinflow_AgeRange {
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Coinflow_Supply {
|
||||
pub mobile: SeriesTree_Coinflow_Supply_Mobile,
|
||||
pub struct SeriesTree_Frameworks_Coinflow_Supply {
|
||||
pub mobile: SeriesTree_Frameworks_Coinflow_Supply_Mobile,
|
||||
pub immobile: BtcCentsSatsUsdPattern,
|
||||
}
|
||||
|
||||
impl SeriesTree_Coinflow_Supply {
|
||||
impl SeriesTree_Frameworks_Coinflow_Supply {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
mobile: SeriesTree_Coinflow_Supply_Mobile::new(client.clone(), format!("{base_path}_mobile")),
|
||||
mobile: SeriesTree_Frameworks_Coinflow_Supply_Mobile::new(client.clone(), format!("{base_path}_mobile")),
|
||||
immobile: BtcCentsSatsUsdPattern::new(client.clone(), "immobile_supply".to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Coinflow_Supply_Mobile {
|
||||
pub struct SeriesTree_Frameworks_Coinflow_Supply_Mobile {
|
||||
pub btc: SeriesPattern1<Bitcoin>,
|
||||
pub sats: SeriesPattern1<Sats>,
|
||||
pub usd: SeriesPattern1<Dollars>,
|
||||
@@ -6183,7 +6201,7 @@ pub struct SeriesTree_Coinflow_Supply_Mobile {
|
||||
pub in_loss: SharePattern2,
|
||||
}
|
||||
|
||||
impl SeriesTree_Coinflow_Supply_Mobile {
|
||||
impl SeriesTree_Frameworks_Coinflow_Supply_Mobile {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
btc: SeriesPattern1::new(client.clone(), "mobile_supply".to_string()),
|
||||
@@ -6196,7 +6214,7 @@ impl SeriesTree_Coinflow_Supply_Mobile {
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Coinflow_Horizon {
|
||||
pub struct SeriesTree_Frameworks_Coinflow_Horizon {
|
||||
pub _8y: SupplyPattern,
|
||||
pub _4y: SupplyPattern,
|
||||
pub _2y: SupplyPattern,
|
||||
@@ -6206,7 +6224,7 @@ pub struct SeriesTree_Coinflow_Horizon {
|
||||
pub _1m: SupplyPattern,
|
||||
}
|
||||
|
||||
impl SeriesTree_Coinflow_Horizon {
|
||||
impl SeriesTree_Frameworks_Coinflow_Horizon {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
_8y: SupplyPattern::new(client.clone(), "coinflow_8y_supply_in_loss_share".to_string()),
|
||||
@@ -6221,7 +6239,24 @@ impl SeriesTree_Coinflow_Horizon {
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Bedrock {
|
||||
pub struct SeriesTree_Models {
|
||||
pub bedrock: SeriesTree_Models_Bedrock,
|
||||
pub capital_sentiment: SeriesTree_Models_CapitalSentiment,
|
||||
pub rarity_meter: SeriesTree_Models_RarityMeter,
|
||||
}
|
||||
|
||||
impl SeriesTree_Models {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
bedrock: SeriesTree_Models_Bedrock::new(client.clone(), format!("{base_path}_bedrock")),
|
||||
capital_sentiment: SeriesTree_Models_CapitalSentiment::new(client.clone(), format!("{base_path}_capital_sentiment")),
|
||||
rarity_meter: SeriesTree_Models_RarityMeter::new(client.clone(), format!("{base_path}_rarity_meter")),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Models_Bedrock {
|
||||
pub raw: FloorLevelLossPattern,
|
||||
pub cointime: FloorLevelLossPattern,
|
||||
pub coinflow: FloorLevelLossPattern,
|
||||
@@ -6234,7 +6269,7 @@ pub struct SeriesTree_Bedrock {
|
||||
pub coinflow_1m: FloorLevelLossPattern,
|
||||
}
|
||||
|
||||
impl SeriesTree_Bedrock {
|
||||
impl SeriesTree_Models_Bedrock {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
raw: FloorLevelLossPattern::new(client.clone(), "bedrock_raw".to_string()),
|
||||
@@ -6251,6 +6286,138 @@ impl SeriesTree_Bedrock {
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Models_CapitalSentiment {
|
||||
pub phase: SeriesPattern1<CapitalSentimentPhase>,
|
||||
pub score: SeriesPattern1<StoredI8>,
|
||||
}
|
||||
|
||||
impl SeriesTree_Models_CapitalSentiment {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
phase: SeriesPattern1::new(client.clone(), "capital_sentiment_phase".to_string()),
|
||||
score: SeriesPattern1::new(client.clone(), "capital_sentiment_score".to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Models_RarityMeter {
|
||||
pub components: SeriesTree_Models_RarityMeter_Components,
|
||||
pub extremes: SeriesTree_Models_RarityMeter_Extremes,
|
||||
pub full: IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern,
|
||||
pub local: IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern,
|
||||
pub cycle: IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern,
|
||||
}
|
||||
|
||||
impl SeriesTree_Models_RarityMeter {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
components: SeriesTree_Models_RarityMeter_Components::new(client.clone(), format!("{base_path}_components")),
|
||||
extremes: SeriesTree_Models_RarityMeter_Extremes::new(client.clone(), format!("{base_path}_extremes")),
|
||||
full: IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern::new(client.clone(), "rarity_meter".to_string()),
|
||||
local: IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern::new(client.clone(), "local_rarity_meter".to_string()),
|
||||
cycle: IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern::new(client.clone(), "cycle_rarity_meter".to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Models_RarityMeter_Components {
|
||||
pub realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub capitalized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub sth_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub sth_capitalized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub lth_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub lth_capitalized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub over_6m_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub over_4m_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub under_4m_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub under_6m_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub vaulted_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub active_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub true_market_mean_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub cointime_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub coinflow_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
}
|
||||
|
||||
impl SeriesTree_Models_RarityMeter_Components {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "realized_price".to_string()),
|
||||
capitalized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "capitalized_price".to_string()),
|
||||
sth_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "sth_realized_price".to_string()),
|
||||
sth_capitalized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "sth_capitalized_price".to_string()),
|
||||
lth_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "lth_realized_price".to_string()),
|
||||
lth_capitalized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "lth_capitalized_price".to_string()),
|
||||
over_6m_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "over_6m_realized_price".to_string()),
|
||||
over_4m_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "over_4m_realized_price".to_string()),
|
||||
under_4m_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "under_4m_realized_price".to_string()),
|
||||
under_6m_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "under_6m_realized_price".to_string()),
|
||||
vaulted_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "vaulted_price".to_string()),
|
||||
active_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "active_price".to_string()),
|
||||
true_market_mean_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "true_market_mean_price".to_string()),
|
||||
cointime_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "cointime_price".to_string()),
|
||||
coinflow_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "coinflow_price".to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Models_RarityMeter_Extremes {
|
||||
pub coins_in_loss: SeriesTree_Models_RarityMeter_Extremes_CoinsInLoss,
|
||||
pub profit_taking: RankTailThresholdPattern,
|
||||
pub capitulation: RankTailThresholdPattern,
|
||||
pub peak_regret: RankTailThresholdPattern,
|
||||
pub seller_exhaustion: SeriesTree_Models_RarityMeter_Extremes_SellerExhaustion,
|
||||
}
|
||||
|
||||
impl SeriesTree_Models_RarityMeter_Extremes {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
coins_in_loss: SeriesTree_Models_RarityMeter_Extremes_CoinsInLoss::new(client.clone(), format!("{base_path}_coins_in_loss")),
|
||||
profit_taking: RankTailThresholdPattern::new(client.clone(), "rarity_meter_profit_taking".to_string()),
|
||||
capitulation: RankTailThresholdPattern::new(client.clone(), "rarity_meter_capitulation".to_string()),
|
||||
peak_regret: RankTailThresholdPattern::new(client.clone(), "rarity_meter_peak_regret".to_string()),
|
||||
seller_exhaustion: SeriesTree_Models_RarityMeter_Extremes_SellerExhaustion::new(client.clone(), format!("{base_path}_seller_exhaustion")),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Models_RarityMeter_Extremes_CoinsInLoss {
|
||||
pub threshold: SeriesPattern1<Bitcoin>,
|
||||
pub tail: PercentPpmRatioPattern2,
|
||||
pub rank: SeriesPattern1<StoredI8>,
|
||||
}
|
||||
|
||||
impl SeriesTree_Models_RarityMeter_Extremes_CoinsInLoss {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
threshold: SeriesPattern1::new(client.clone(), "rarity_meter_coins_in_loss_threshold".to_string()),
|
||||
tail: PercentPpmRatioPattern2::new(client.clone(), "rarity_meter_coins_in_loss_tail".to_string()),
|
||||
rank: SeriesPattern1::new(client.clone(), "rarity_meter_coins_in_loss_rank".to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Models_RarityMeter_Extremes_SellerExhaustion {
|
||||
pub threshold: SeriesPattern1<StoredF32>,
|
||||
pub tail: PercentPpmRatioPattern2,
|
||||
pub rank: SeriesPattern1<StoredI8>,
|
||||
}
|
||||
|
||||
impl SeriesTree_Models_RarityMeter_Extremes_SellerExhaustion {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
threshold: SeriesPattern1::new(client.clone(), "rarity_meter_seller_exhaustion_threshold".to_string()),
|
||||
tail: PercentPpmRatioPattern2::new(client.clone(), "rarity_meter_seller_exhaustion_tail".to_string()),
|
||||
rank: SeriesPattern1::new(client.clone(), "rarity_meter_seller_exhaustion_rank".to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Constants {
|
||||
pub _0: SeriesPattern1<StoredU16>,
|
||||
@@ -6882,7 +7049,6 @@ pub struct SeriesTree_Indicators {
|
||||
pub dormancy: SeriesTree_Indicators_Dormancy,
|
||||
pub stock_to_flow: SeriesPattern1<StoredF32>,
|
||||
pub seller_exhaustion: SeriesPattern1<StoredF32>,
|
||||
pub rarity_meter: SeriesTree_Indicators_RarityMeter,
|
||||
}
|
||||
|
||||
impl SeriesTree_Indicators {
|
||||
@@ -6898,7 +7064,6 @@ impl SeriesTree_Indicators {
|
||||
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()),
|
||||
rarity_meter: SeriesTree_Indicators_RarityMeter::new(client.clone(), format!("{base_path}_rarity_meter")),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6918,66 +7083,6 @@ impl SeriesTree_Indicators_Dormancy {
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Indicators_RarityMeter {
|
||||
pub components: SeriesTree_Indicators_RarityMeter_Components,
|
||||
pub full: IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern,
|
||||
pub local: IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern,
|
||||
pub cycle: IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern,
|
||||
}
|
||||
|
||||
impl SeriesTree_Indicators_RarityMeter {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
components: SeriesTree_Indicators_RarityMeter_Components::new(client.clone(), format!("{base_path}_components")),
|
||||
full: IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern::new(client.clone(), "rarity_meter".to_string()),
|
||||
local: IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern::new(client.clone(), "local_rarity_meter".to_string()),
|
||||
cycle: IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern::new(client.clone(), "cycle_rarity_meter".to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Indicators_RarityMeter_Components {
|
||||
pub realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub capitalized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub sth_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub sth_capitalized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub lth_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub lth_capitalized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub over_6m_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub over_4m_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub under_4m_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub under_6m_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub vaulted_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub active_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub true_market_mean_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub cointime_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
pub coinflow_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern,
|
||||
}
|
||||
|
||||
impl SeriesTree_Indicators_RarityMeter_Components {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "realized_price".to_string()),
|
||||
capitalized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "capitalized_price".to_string()),
|
||||
sth_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "sth_realized_price".to_string()),
|
||||
sth_capitalized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "sth_capitalized_price".to_string()),
|
||||
lth_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "lth_realized_price".to_string()),
|
||||
lth_capitalized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "lth_capitalized_price".to_string()),
|
||||
over_6m_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "over_6m_realized_price".to_string()),
|
||||
over_4m_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "over_4m_realized_price".to_string()),
|
||||
under_4m_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "under_4m_realized_price".to_string()),
|
||||
under_6m_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "under_6m_realized_price".to_string()),
|
||||
vaulted_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "vaulted_price".to_string()),
|
||||
active_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "active_price".to_string()),
|
||||
true_market_mean_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "true_market_mean_price".to_string()),
|
||||
cointime_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "cointime_price".to_string()),
|
||||
coinflow_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern::new(client.clone(), "coinflow_price".to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Investing {
|
||||
pub sats_per_day: SeriesPattern18<Sats>,
|
||||
@@ -9297,6 +9402,32 @@ impl SeriesTree_Cohorts_Addr_UnderAmount {
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Cointime {
|
||||
pub activity: SeriesTree_Cointime_Activity,
|
||||
}
|
||||
|
||||
impl SeriesTree_Cointime {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
activity: SeriesTree_Cointime_Activity::new(client.clone(), format!("{base_path}_activity")),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Series tree node.
|
||||
pub struct SeriesTree_Cointime_Activity {
|
||||
pub coinblocks_destroyed: AverageBlockCumulativeSumPattern<StoredF64>,
|
||||
}
|
||||
|
||||
impl SeriesTree_Cointime_Activity {
|
||||
pub fn new(client: Arc<BrkClientBase>, base_path: String) -> Self {
|
||||
Self {
|
||||
coinblocks_destroyed: AverageBlockCumulativeSumPattern::new(client.clone(), "coinblocks_destroyed".to_string()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Main BRK client with series tree and API methods.
|
||||
pub struct BrkClient {
|
||||
base: Arc<BrkClientBase>,
|
||||
|
||||
@@ -136,7 +136,7 @@ pub(crate) fn process_blocks(
|
||||
|
||||
// Create reusable iterators and buffers for per-block reads
|
||||
let mut txout_iters = TxOutReaders::new(indexer);
|
||||
let mut txin_iters = TxInReaders::new(indexer, inputs, tx_index_to_height);
|
||||
let mut txin_iters = TxInReaders::new(indexer, tx_index_to_height);
|
||||
let mut txout_to_tx_index_buf = IndexToTxIndexBuf::new();
|
||||
let mut txin_to_tx_index_buf = IndexToTxIndexBuf::new();
|
||||
|
||||
|
||||
@@ -6,12 +6,9 @@ use brk_types::{
|
||||
};
|
||||
use vecdb::{BytesVecReader, ReadableVec, VecIndex};
|
||||
|
||||
use crate::{
|
||||
distribution::{
|
||||
RangeMap,
|
||||
addr::{AddrsDataVecs, AnyAddrIndexesVecs},
|
||||
},
|
||||
inputs,
|
||||
use crate::distribution::{
|
||||
RangeMap,
|
||||
addr::{AddrsDataVecs, AnyAddrIndexesVecs},
|
||||
};
|
||||
|
||||
/// Output data collected from separate vecs.
|
||||
@@ -84,7 +81,6 @@ impl<'a> TxOutReaders<'a> {
|
||||
/// Readers for txin vectors. Reuses all buffers across blocks.
|
||||
pub struct TxInReaders<'a> {
|
||||
indexer: &'a Indexer,
|
||||
txins: &'a inputs::Vecs,
|
||||
tx_index_to_height: &'a mut RangeMap<TxIndex, Height>,
|
||||
outpoints_buf: Vec<OutPoint>,
|
||||
values_buf: Vec<Sats>,
|
||||
@@ -96,12 +92,10 @@ pub struct TxInReaders<'a> {
|
||||
impl<'a> TxInReaders<'a> {
|
||||
pub(crate) fn new(
|
||||
indexer: &'a Indexer,
|
||||
txins: &'a inputs::Vecs,
|
||||
tx_index_to_height: &'a mut RangeMap<TxIndex, Height>,
|
||||
) -> Self {
|
||||
Self {
|
||||
indexer,
|
||||
txins,
|
||||
tx_index_to_height,
|
||||
outpoints_buf: Vec::new(),
|
||||
values_buf: Vec::new(),
|
||||
@@ -119,10 +113,11 @@ impl<'a> TxInReaders<'a> {
|
||||
current_height: Height,
|
||||
) -> (&[Sats], &[Height], &[OutputType], &[TypeIndex]) {
|
||||
let end = first_txin_index + input_count;
|
||||
self.txins
|
||||
.spent
|
||||
.value
|
||||
.collect_range_into_at(first_txin_index, end, &mut self.values_buf);
|
||||
self.indexer.vecs.inputs.value.collect_range_into_at(
|
||||
first_txin_index,
|
||||
end,
|
||||
&mut self.values_buf,
|
||||
);
|
||||
self.indexer.vecs.inputs.outpoint.collect_range_into_at(
|
||||
first_txin_index,
|
||||
end,
|
||||
|
||||
@@ -365,7 +365,7 @@ impl Vecs {
|
||||
indexer.vecs.outputs.value.version(),
|
||||
indexer.vecs.outputs.output_type.version(),
|
||||
indexer.vecs.outputs.type_index.version(),
|
||||
inputs.spent.value.version(),
|
||||
indexer.vecs.inputs.value.version(),
|
||||
indexer.vecs.inputs.outpoint.version(),
|
||||
indexer.vecs.inputs.output_type.version(),
|
||||
indexer.vecs.inputs.type_index.version(),
|
||||
|
||||
@@ -14,7 +14,6 @@ impl Vecs {
|
||||
) -> Result<()> {
|
||||
self.db.sync_bg_tasks()?;
|
||||
|
||||
self.spent.compute(indexer, exit)?;
|
||||
self.count.compute(indexer, blocks, exit)?;
|
||||
self.by_type.compute(indexer, exit)?;
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ use crate::{
|
||||
},
|
||||
};
|
||||
|
||||
use super::{ByTypeVecs, CountVecs, SpentVecs, Vecs};
|
||||
use super::{ByTypeVecs, CountVecs, Vecs};
|
||||
|
||||
impl Vecs {
|
||||
pub(crate) fn forced_import(
|
||||
@@ -23,14 +23,12 @@ impl Vecs {
|
||||
let db = open_db(parent_path, super::DB_NAME, 20_000_000)?;
|
||||
let version = parent_version;
|
||||
|
||||
let spent = SpentVecs::forced_import(&db, version)?;
|
||||
let count = CountVecs::forced_import(&db, version, indexes, cached_starts)?;
|
||||
let per_sec = LazyPerSecondWindows::new("inputs_per_sec", version, &count.rolling.sum);
|
||||
let by_type = ByTypeVecs::forced_import(&db, version, indexes, cached_starts)?;
|
||||
|
||||
let this = Self {
|
||||
db,
|
||||
spent,
|
||||
count,
|
||||
per_sec,
|
||||
by_type,
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
pub mod by_type;
|
||||
pub mod count;
|
||||
pub mod spent;
|
||||
|
||||
mod compute;
|
||||
mod import;
|
||||
@@ -12,7 +11,6 @@ use crate::internal::LazyPerSecondWindows;
|
||||
|
||||
pub use by_type::Vecs as ByTypeVecs;
|
||||
pub use count::Vecs as CountVecs;
|
||||
pub use spent::Vecs as SpentVecs;
|
||||
|
||||
pub const DB_NAME: &str = "inputs";
|
||||
|
||||
@@ -21,7 +19,6 @@ pub struct Vecs<M: StorageMode = Rw> {
|
||||
#[traversable(skip)]
|
||||
pub(crate) db: Database,
|
||||
|
||||
pub spent: SpentVecs<M>,
|
||||
pub count: CountVecs<M>,
|
||||
pub per_sec: LazyPerSecondWindows,
|
||||
pub by_type: ByTypeVecs<M>,
|
||||
|
||||
@@ -1,125 +0,0 @@
|
||||
use brk_error::Result;
|
||||
use brk_indexer::Indexer;
|
||||
use brk_types::{Sats, TxIndex, TxOutIndex, Vout};
|
||||
use rayon::prelude::*;
|
||||
use tracing::info;
|
||||
use vecdb::{AnyStoredVec, AnyVec, Exit, ReadableVec, VecIndex, WritableVec};
|
||||
|
||||
use super::Vecs;
|
||||
|
||||
const BATCH_SIZE: usize = 2 * 1024 * 1024 * 1024 / size_of::<Entry>();
|
||||
|
||||
impl Vecs {
|
||||
pub(crate) fn compute(&mut self, indexer: &Indexer, exit: &Exit) -> Result<()> {
|
||||
let starting_lengths = indexer.safe_lengths();
|
||||
// Validate computed versions against dependencies
|
||||
let dep_version = indexer.vecs.inputs.outpoint.version()
|
||||
+ indexer.vecs.transactions.first_txout_index.version()
|
||||
+ indexer.vecs.outputs.value.version();
|
||||
self.txout_index
|
||||
.validate_computed_version_or_reset(dep_version)?;
|
||||
self.value.validate_computed_version_or_reset(dep_version)?;
|
||||
|
||||
let target = indexer.vecs.inputs.outpoint.len();
|
||||
if target == 0 {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let len1 = self.txout_index.len();
|
||||
let len2 = self.value.len();
|
||||
let starting = starting_lengths.txin_index.to_usize();
|
||||
let min = len1.min(len2).min(starting);
|
||||
|
||||
if min >= target {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let first_txout_index_reader = indexer.vecs.transactions.first_txout_index.reader();
|
||||
let value_reader = indexer.vecs.outputs.value.reader();
|
||||
let actual_total = target - min;
|
||||
let mut entries: Vec<Entry> = Vec::with_capacity(actual_total.min(BATCH_SIZE));
|
||||
// Pre-allocate output buffers for scatter-write pattern
|
||||
let mut out_txout_index: Vec<TxOutIndex> = Vec::new();
|
||||
let mut out_value: Vec<Sats> = Vec::new();
|
||||
|
||||
let mut batch_start = min;
|
||||
while batch_start < target {
|
||||
let batch_end = (batch_start + BATCH_SIZE).min(target);
|
||||
let batch_len = batch_end - batch_start;
|
||||
|
||||
entries.clear();
|
||||
let mut j = 0usize;
|
||||
indexer
|
||||
.vecs
|
||||
.inputs
|
||||
.outpoint
|
||||
.for_each_range_at(batch_start, batch_end, |outpoint| {
|
||||
entries.push(Entry {
|
||||
original_idx: j,
|
||||
tx_index: outpoint.tx_index(),
|
||||
vout: outpoint.vout(),
|
||||
txout_index: TxOutIndex::COINBASE,
|
||||
value: Sats::MAX,
|
||||
});
|
||||
j += 1;
|
||||
});
|
||||
|
||||
// Sort 1: by tx_index (group by transaction for sequential first_txout_index reads)
|
||||
entries.par_sort_unstable_by_key(|e| e.tx_index);
|
||||
for entry in &mut entries {
|
||||
if entry.tx_index.is_coinbase() {
|
||||
break;
|
||||
}
|
||||
entry.txout_index = first_txout_index_reader.get(entry.tx_index) + entry.vout;
|
||||
}
|
||||
|
||||
// Sort 2: by txout_index (sequential value reads)
|
||||
entries.par_sort_unstable_by_key(|e| e.txout_index);
|
||||
for entry in &mut entries {
|
||||
if entry.txout_index.is_coinbase() {
|
||||
break;
|
||||
}
|
||||
entry.value = value_reader.get(entry.txout_index);
|
||||
}
|
||||
|
||||
// Scatter-write to output buffers using original_idx (avoids Sort 3)
|
||||
out_txout_index.clear();
|
||||
out_txout_index.resize(batch_len, TxOutIndex::COINBASE);
|
||||
out_value.clear();
|
||||
out_value.resize(batch_len, Sats::MAX);
|
||||
|
||||
for entry in &entries {
|
||||
out_txout_index[entry.original_idx] = entry.txout_index;
|
||||
out_value[entry.original_idx] = entry.value;
|
||||
}
|
||||
|
||||
self.txout_index.truncate_if_needed_at(batch_start)?;
|
||||
self.value.truncate_if_needed_at(batch_start)?;
|
||||
for i in 0..batch_len {
|
||||
self.txout_index.push(out_txout_index[i]);
|
||||
self.value.push(out_value[i]);
|
||||
}
|
||||
|
||||
let _lock = exit.lock();
|
||||
let (r1, r2) = rayon::join(|| self.txout_index.write(), || self.value.write());
|
||||
r1?;
|
||||
r2?;
|
||||
|
||||
if batch_end < target {
|
||||
info!("TxIns: {:.2}%", batch_end as f64 / target as f64 * 100.0);
|
||||
}
|
||||
|
||||
batch_start = batch_end;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
struct Entry {
|
||||
original_idx: usize,
|
||||
tx_index: TxIndex,
|
||||
vout: Vout,
|
||||
txout_index: TxOutIndex,
|
||||
value: Sats,
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
use brk_error::Result;
|
||||
use brk_types::Version;
|
||||
use vecdb::{Database, ImportableVec, PcoVec};
|
||||
|
||||
use super::Vecs;
|
||||
|
||||
impl Vecs {
|
||||
pub(crate) fn forced_import(db: &Database, version: Version) -> Result<Self> {
|
||||
Ok(Self {
|
||||
txout_index: PcoVec::forced_import(db, "txout_index", version)?,
|
||||
value: PcoVec::forced_import(db, "value", version)?,
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
mod compute;
|
||||
mod import;
|
||||
mod vecs;
|
||||
|
||||
pub use vecs::Vecs;
|
||||
@@ -1,9 +0,0 @@
|
||||
use brk_traversable::Traversable;
|
||||
use brk_types::{Sats, TxInIndex, TxOutIndex};
|
||||
use vecdb::{PcoVec, Rw, StorageMode};
|
||||
|
||||
#[derive(Traversable)]
|
||||
pub struct Vecs<M: StorageMode = Rw> {
|
||||
pub txout_index: M::Stored<PcoVec<TxInIndex, TxOutIndex>>,
|
||||
pub value: M::Stored<PcoVec<TxInIndex, Sats>>,
|
||||
}
|
||||
@@ -50,7 +50,7 @@ pub struct Computer<M: StorageMode = Rw> {
|
||||
pub op_return: Box<op_return::Vecs<M>>,
|
||||
}
|
||||
|
||||
const VERSION: Version = Version::new(7);
|
||||
const VERSION: Version = Version::new(8);
|
||||
|
||||
impl Computer {
|
||||
pub fn forced_import(outputs_path: &Path, indexer: &Indexer) -> Result<Self> {
|
||||
@@ -363,7 +363,6 @@ impl Computer {
|
||||
indexer,
|
||||
&self.indexes,
|
||||
&self.blocks,
|
||||
&self.inputs,
|
||||
&self.price,
|
||||
exit,
|
||||
)
|
||||
|
||||
@@ -118,7 +118,7 @@ fn classify_phase(
|
||||
let above_sth = price >= sth;
|
||||
let above_lth = price >= lth;
|
||||
let above_sma = price >= sma;
|
||||
let bull_structure = sth > lth;
|
||||
let bull_structure = sth >= lth;
|
||||
let above_slow_refs = above_all && above_lth;
|
||||
let references_above_price = [all, sth, lth, sma]
|
||||
.into_iter()
|
||||
@@ -166,6 +166,8 @@ fn classify_phase(
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use std::{cmp::Reverse, collections::BTreeSet};
|
||||
|
||||
use super::*;
|
||||
|
||||
fn cents(value: u64) -> Cents {
|
||||
@@ -177,35 +179,56 @@ mod tests {
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn classifies_all_ten_phases() {
|
||||
fn classifies_all_ten_phases_across_all_eight_reference_orders() {
|
||||
use CapitalSentimentPhase as Phase;
|
||||
|
||||
let cases = [
|
||||
((100, 70, 80, 60, 50), Phase::RagingBull),
|
||||
((100, 50, 70, 40, 60), Phase::Bull),
|
||||
((50, 40, 30, 60, 70), Phase::CautiousBull),
|
||||
((50, 70, 60, 80, 40), Phase::HopefulBull),
|
||||
((40, 20, 30, 50, 10), Phase::EarlyBull),
|
||||
((100, 50, 110, 60, 70), Phase::WeakBull),
|
||||
((30, 40, 50, 20, 10), Phase::Limbo),
|
||||
((10, 20, 30, 40, 50), Phase::DeepBear),
|
||||
((10, 40, 30, 20, 50), Phase::Bear),
|
||||
((30, 40, 50, 20, 60), Phase::EarlyBear),
|
||||
((100, 70, 80, 50, 60), Phase::RagingBull),
|
||||
((100, 70, 80, 60, 90), Phase::Bull),
|
||||
((90, 70, 60, 80, 100), Phase::CautiousBull),
|
||||
((40, 80, 60, 100, 20), Phase::HopefulBull),
|
||||
((90, 70, 60, 100, 80), Phase::EarlyBull),
|
||||
((90, 70, 100, 60, 80), Phase::WeakBull),
|
||||
((70, 80, 100, 60, 40), Phase::Limbo),
|
||||
((40, 80, 60, 100, 70), Phase::DeepBear),
|
||||
((40, 80, 100, 60, 50), Phase::Bear),
|
||||
((60, 80, 100, 50, 70), Phase::EarlyBear),
|
||||
];
|
||||
|
||||
let mut reference_orders = BTreeSet::new();
|
||||
|
||||
for ((price, all, sth, lth, sma), expected) in cases {
|
||||
assert!(
|
||||
(sth > all && all > lth) || (lth > all && all > sth),
|
||||
"All capitalized price must be between STH and LTH"
|
||||
);
|
||||
|
||||
let mut references = [("SMA", sma), ("STH", sth), ("All", all), ("LTH", lth)];
|
||||
references.sort_unstable_by_key(|(_, value)| Reverse(*value));
|
||||
reference_orders.insert(references.map(|(name, _)| name));
|
||||
|
||||
assert_eq!(classify(price, all, sth, lth, sma), expected);
|
||||
}
|
||||
|
||||
assert_eq!(reference_orders.len(), 8);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn sma_confirms_the_capitalized_price_structure() {
|
||||
use CapitalSentimentPhase as Phase;
|
||||
|
||||
assert_eq!(classify(100, 70, 80, 60, 80), Phase::Bull);
|
||||
assert_eq!(classify(100, 70, 80, 60, 90), Phase::Bull);
|
||||
assert_eq!(classify(100, 70, 80, 60, 50), Phase::RagingBull);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn capitalized_crossover_uses_sth_led_tie_break() {
|
||||
assert_eq!(
|
||||
classify(70, 50, 50, 50, 100),
|
||||
CapitalSentimentPhase::EarlyBear
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn missing_reference_has_no_phase() {
|
||||
assert_eq!(
|
||||
|
||||
@@ -8,7 +8,7 @@ use crate::internal::{LazyPerBlock, PerBlock};
|
||||
pub struct Vecs<M: StorageMode = Rw> {
|
||||
/// Compact, per-block source of truth.
|
||||
#[traversable(hidden)]
|
||||
pub(crate) phase_code: PerBlock<StoredI8, M>,
|
||||
pub phase_code: PerBlock<StoredI8, M>,
|
||||
|
||||
pub phase: LazyPerBlock<Option<CapitalSentimentPhase>, StoredI8>,
|
||||
pub score: LazyPerBlock<Option<StoredI8>, Option<CapitalSentimentPhase>>,
|
||||
|
||||
@@ -0,0 +1,375 @@
|
||||
use std::collections::VecDeque;
|
||||
|
||||
use brk_error::Result;
|
||||
use brk_indexer::Indexer;
|
||||
use brk_traversable::Traversable;
|
||||
use brk_types::{Bitcoin, Dollars, Height, PartsPerMillion32, StoredF32, StoredI8, Version};
|
||||
use schemars::JsonSchema;
|
||||
use vecdb::{
|
||||
AnyStoredVec, AnyVec, Database, Exit, ReadableVec, Rw, StorageMode, VecIndex, WritableVec,
|
||||
};
|
||||
|
||||
use crate::{
|
||||
indexes,
|
||||
internal::{
|
||||
NumericValue, PerBlock, PercentPerBlock, algo::FenwickTree,
|
||||
db_utils::validate_any_computed_version_or_reset,
|
||||
},
|
||||
};
|
||||
|
||||
const VERSION: Version = Version::new(4);
|
||||
const MIN_HISTORY_BLOCKS: usize = 210_000;
|
||||
const WRITE_INTERVAL: usize = 10_000;
|
||||
const BANDS: [(f64, i8); 3] = [(0.00025, 3), (0.0005, 2), (0.001, 1)];
|
||||
|
||||
#[derive(Clone, Copy)]
|
||||
struct Config {
|
||||
upper_tail: bool,
|
||||
rolling: bool,
|
||||
positive_only: bool,
|
||||
}
|
||||
|
||||
const REALIZED: Config = Config {
|
||||
upper_tail: true,
|
||||
rolling: false,
|
||||
positive_only: false,
|
||||
};
|
||||
|
||||
const COINS_IN_LOSS: Config = Config {
|
||||
upper_tail: true,
|
||||
rolling: false,
|
||||
positive_only: true,
|
||||
};
|
||||
|
||||
const SELLER_EXHAUSTION: Config = Config {
|
||||
upper_tail: false,
|
||||
rolling: true,
|
||||
positive_only: true,
|
||||
};
|
||||
|
||||
/// Historical extremeness of one metric.
|
||||
///
|
||||
/// `tail` is the current observation's top- or bottom-tail share, `threshold`
|
||||
/// is the highlight boundary, and `rank` is 0 through 3.
|
||||
#[derive(Traversable)]
|
||||
pub struct Extreme<T, M: StorageMode = Rw>
|
||||
where
|
||||
T: NumericValue + JsonSchema,
|
||||
{
|
||||
pub threshold: PerBlock<T, M>,
|
||||
pub tail: PercentPerBlock<PartsPerMillion32, M>,
|
||||
pub rank: PerBlock<StoredI8, M>,
|
||||
}
|
||||
|
||||
impl<T> Extreme<T>
|
||||
where
|
||||
T: NumericValue + JsonSchema,
|
||||
{
|
||||
fn forced_import(
|
||||
db: &Database,
|
||||
name: &str,
|
||||
version: Version,
|
||||
indexes: &indexes::Vecs,
|
||||
) -> Result<Self> {
|
||||
Ok(Self {
|
||||
threshold: PerBlock::forced_import(db, &format!("{name}_threshold"), version, indexes)?,
|
||||
tail: PercentPerBlock::forced_import(db, &format!("{name}_tail"), version, indexes)?,
|
||||
rank: PerBlock::forced_import(db, &format!("{name}_rank"), version, indexes)?,
|
||||
})
|
||||
}
|
||||
|
||||
fn compute(
|
||||
&mut self,
|
||||
indexer: &Indexer,
|
||||
source: &impl ReadableVec<Height, T>,
|
||||
config: Config,
|
||||
exit: &Exit,
|
||||
) -> Result<()> {
|
||||
let dependency_version = source.version();
|
||||
for output in [
|
||||
&mut self.threshold.height as &mut dyn AnyStoredVec,
|
||||
&mut self.tail.ppm.height,
|
||||
&mut self.rank.height,
|
||||
] {
|
||||
validate_any_computed_version_or_reset(output, dependency_version)?;
|
||||
}
|
||||
|
||||
let source_end = source.len();
|
||||
let start = [
|
||||
self.threshold.height.len(),
|
||||
self.tail.ppm.height.len(),
|
||||
self.rank.height.len(),
|
||||
indexer.safe_lengths().height.to_usize(),
|
||||
source_end,
|
||||
]
|
||||
.into_iter()
|
||||
.min()
|
||||
.unwrap_or_default();
|
||||
|
||||
self.threshold.height.any_truncate_if_needed_at(start)?;
|
||||
self.tail.ppm.height.any_truncate_if_needed_at(start)?;
|
||||
self.rank.height.any_truncate_if_needed_at(start)?;
|
||||
|
||||
let values: Vec<f64> = source
|
||||
.collect_range_at(0, source_end)
|
||||
.into_iter()
|
||||
.map(Into::into)
|
||||
.collect();
|
||||
let is_valid = |value: f64| value.is_finite() && (!config.positive_only || value > 0.0);
|
||||
let mut coordinates: Vec<f64> = values.iter().copied().filter(|&v| is_valid(v)).collect();
|
||||
coordinates.sort_unstable_by(f64::total_cmp);
|
||||
coordinates.dedup_by(|a, b| a.total_cmp(b).is_eq());
|
||||
|
||||
let mut history = History::new(coordinates.len().max(1), config.rolling);
|
||||
for &value in &values[..start] {
|
||||
if is_valid(value) {
|
||||
history.add(bucket(&coordinates, value));
|
||||
}
|
||||
}
|
||||
|
||||
for (height_index, &value) in values.iter().enumerate().skip(start) {
|
||||
let state = if is_valid(value) && history.len >= MIN_HISTORY_BLOCKS {
|
||||
event_state(value, &coordinates, &history, config)
|
||||
} else {
|
||||
EventState::missing()
|
||||
};
|
||||
|
||||
self.threshold.height.push(T::from(state.threshold));
|
||||
self.tail
|
||||
.ppm
|
||||
.height
|
||||
.push(PartsPerMillion32::from(state.tail));
|
||||
self.rank.height.push(StoredI8::new(state.rank));
|
||||
|
||||
if is_valid(value) {
|
||||
history.add(bucket(&coordinates, value));
|
||||
}
|
||||
|
||||
if (height_index + 1).is_multiple_of(WRITE_INTERVAL) || height_index + 1 == source_end {
|
||||
let _lock = exit.lock();
|
||||
self.threshold.height.write()?;
|
||||
self.tail.ppm.height.write()?;
|
||||
self.rank.height.write()?;
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Traversable)]
|
||||
pub struct Extremes<M: StorageMode = Rw> {
|
||||
pub coins_in_loss: Extreme<Bitcoin, M>,
|
||||
pub profit_taking: Extreme<Dollars, M>,
|
||||
pub capitulation: Extreme<Dollars, M>,
|
||||
pub peak_regret: Extreme<Dollars, M>,
|
||||
pub seller_exhaustion: Extreme<StoredF32, M>,
|
||||
}
|
||||
|
||||
impl Extremes {
|
||||
pub(super) fn forced_import(
|
||||
db: &Database,
|
||||
parent_version: Version,
|
||||
indexes: &indexes::Vecs,
|
||||
) -> Result<Self> {
|
||||
let version = parent_version + VERSION;
|
||||
Ok(Self {
|
||||
coins_in_loss: Extreme::forced_import(
|
||||
db,
|
||||
"rarity_meter_coins_in_loss",
|
||||
version,
|
||||
indexes,
|
||||
)?,
|
||||
profit_taking: Extreme::forced_import(
|
||||
db,
|
||||
"rarity_meter_profit_taking",
|
||||
version,
|
||||
indexes,
|
||||
)?,
|
||||
capitulation: Extreme::forced_import(
|
||||
db,
|
||||
"rarity_meter_capitulation",
|
||||
version,
|
||||
indexes,
|
||||
)?,
|
||||
peak_regret: Extreme::forced_import(db, "rarity_meter_peak_regret", version, indexes)?,
|
||||
seller_exhaustion: Extreme::forced_import(
|
||||
db,
|
||||
"rarity_meter_seller_exhaustion",
|
||||
version,
|
||||
indexes,
|
||||
)?,
|
||||
})
|
||||
}
|
||||
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
pub(super) fn compute(
|
||||
&mut self,
|
||||
indexer: &Indexer,
|
||||
coins_in_loss: &impl ReadableVec<Height, Bitcoin>,
|
||||
realized_profit: &impl ReadableVec<Height, Dollars>,
|
||||
realized_loss: &impl ReadableVec<Height, Dollars>,
|
||||
peak_regret: &impl ReadableVec<Height, Dollars>,
|
||||
seller_exhaustion: &impl ReadableVec<Height, StoredF32>,
|
||||
exit: &Exit,
|
||||
) -> Result<()> {
|
||||
self.coins_in_loss
|
||||
.compute(indexer, coins_in_loss, COINS_IN_LOSS, exit)?;
|
||||
self.profit_taking
|
||||
.compute(indexer, realized_profit, REALIZED, exit)?;
|
||||
self.capitulation
|
||||
.compute(indexer, realized_loss, REALIZED, exit)?;
|
||||
self.peak_regret
|
||||
.compute(indexer, peak_regret, REALIZED, exit)?;
|
||||
self.seller_exhaustion
|
||||
.compute(indexer, seller_exhaustion, SELLER_EXHAUSTION, exit)?;
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
struct History {
|
||||
tree: FenwickTree<f64>,
|
||||
len: usize,
|
||||
rolling: Option<VecDeque<usize>>,
|
||||
}
|
||||
|
||||
impl History {
|
||||
fn new(size: usize, rolling: bool) -> Self {
|
||||
Self {
|
||||
tree: FenwickTree::new(size),
|
||||
len: 0,
|
||||
rolling: rolling.then(VecDeque::new),
|
||||
}
|
||||
}
|
||||
|
||||
fn add(&mut self, bucket: usize) {
|
||||
self.tree.add(bucket, &1.0);
|
||||
self.len += 1;
|
||||
|
||||
if let Some(rolling) = &mut self.rolling {
|
||||
rolling.push_back(bucket);
|
||||
if rolling.len() > MIN_HISTORY_BLOCKS {
|
||||
let expired = rolling.pop_front().unwrap();
|
||||
self.tree.add(expired, &-1.0);
|
||||
self.len -= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn quantile(&self, coordinates: &[f64], percentile: f64) -> f64 {
|
||||
let target = ((self.len - 1) as f64 * percentile).floor();
|
||||
let mut index = [0];
|
||||
self.tree.kth(&[target], &|count: &f64| *count, &mut index);
|
||||
coordinates[index[0]]
|
||||
}
|
||||
|
||||
fn tail(&self, bucket: usize, upper: bool) -> f64 {
|
||||
let less = if bucket == 0 {
|
||||
0.0
|
||||
} else {
|
||||
self.tree.prefix_sum(bucket - 1)
|
||||
};
|
||||
let less_or_equal = self.tree.prefix_sum(bucket);
|
||||
let count = if upper {
|
||||
self.len as f64 - less
|
||||
} else {
|
||||
less_or_equal
|
||||
};
|
||||
(count + 1.0) / (self.len as f64 + 1.0)
|
||||
}
|
||||
}
|
||||
|
||||
struct EventState {
|
||||
threshold: f64,
|
||||
tail: f64,
|
||||
rank: i8,
|
||||
}
|
||||
|
||||
impl EventState {
|
||||
fn missing() -> Self {
|
||||
Self {
|
||||
threshold: f64::NAN,
|
||||
tail: f64::NAN,
|
||||
rank: 0,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn event_state(value: f64, coordinates: &[f64], history: &History, config: Config) -> EventState {
|
||||
let percentile = |tail: f64| {
|
||||
if config.upper_tail { 1.0 - tail } else { tail }
|
||||
};
|
||||
let threshold = history.quantile(coordinates, percentile(BANDS[0].0));
|
||||
let rank = BANDS
|
||||
.into_iter()
|
||||
.find_map(|(tail, rank)| {
|
||||
let boundary = history.quantile(coordinates, percentile(tail));
|
||||
let reached = if config.upper_tail {
|
||||
value >= boundary
|
||||
} else {
|
||||
value <= boundary
|
||||
};
|
||||
reached.then_some(rank)
|
||||
})
|
||||
.unwrap_or_default();
|
||||
|
||||
EventState {
|
||||
threshold,
|
||||
tail: history.tail(bucket(coordinates, value), config.upper_tail),
|
||||
rank,
|
||||
}
|
||||
}
|
||||
|
||||
fn bucket(coordinates: &[f64], value: f64) -> usize {
|
||||
coordinates
|
||||
.binary_search_by(|candidate| candidate.total_cmp(&value))
|
||||
.expect("event value must exist in coordinate set")
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
fn history(values: &[f64]) -> (Vec<f64>, History) {
|
||||
let mut coordinates = values.to_vec();
|
||||
coordinates.sort_unstable_by(f64::total_cmp);
|
||||
coordinates.dedup_by(|a, b| a.total_cmp(b).is_eq());
|
||||
let mut history = History::new(coordinates.len(), false);
|
||||
for &value in values {
|
||||
history.add(bucket(&coordinates, value));
|
||||
}
|
||||
(coordinates, history)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn upper_tail_includes_current_observation() {
|
||||
let (mut coordinates, mut history) = history(&(1..=100).map(f64::from).collect::<Vec<_>>());
|
||||
coordinates.push(101.0);
|
||||
history.tree = {
|
||||
let mut tree = FenwickTree::new(coordinates.len());
|
||||
for value in 1..=100 {
|
||||
tree.add(bucket(&coordinates, f64::from(value)), &1.0);
|
||||
}
|
||||
tree
|
||||
};
|
||||
|
||||
let state = event_state(101.0, &coordinates, &history, REALIZED);
|
||||
assert!((state.tail - 1.0 / 101.0).abs() < f64::EPSILON);
|
||||
assert_eq!(state.rank, 3);
|
||||
assert_eq!(state.threshold, 99.0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn lower_tail_includes_current_observation() {
|
||||
let coordinates: Vec<_> = (0..=100).map(f64::from).collect();
|
||||
let mut history = History::new(coordinates.len(), false);
|
||||
for value in 1..=100 {
|
||||
history.add(bucket(&coordinates, f64::from(value)));
|
||||
}
|
||||
let state = event_state(0.0, &coordinates, &history, SELLER_EXHAUSTION);
|
||||
|
||||
assert!((state.tail - 1.0 / 101.0).abs() < f64::EPSILON);
|
||||
assert_eq!(state.rank, 3);
|
||||
assert_eq!(state.threshold, 1.0);
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
mod components;
|
||||
mod extremes;
|
||||
mod inner;
|
||||
mod percentiles;
|
||||
|
||||
@@ -15,11 +16,13 @@ use crate::{
|
||||
};
|
||||
|
||||
pub use components::{Component, Components};
|
||||
pub use extremes::Extremes;
|
||||
pub use inner::RarityMeterInner;
|
||||
|
||||
#[derive(Traversable)]
|
||||
pub struct RarityMeter<M: StorageMode = Rw> {
|
||||
pub components: Components<M>,
|
||||
pub extremes: Extremes<M>,
|
||||
pub full: RarityMeterInner<M>,
|
||||
pub local: RarityMeterInner<M>,
|
||||
pub cycle: RarityMeterInner<M>,
|
||||
@@ -36,6 +39,7 @@ impl RarityMeter {
|
||||
let v = version + VERSION;
|
||||
Ok(Self {
|
||||
components: Components::forced_import(db, v, indexes)?,
|
||||
extremes: Extremes::forced_import(db, v, indexes)?,
|
||||
full: RarityMeterInner::forced_import(db, "rarity_meter", v, indexes)?,
|
||||
local: RarityMeterInner::forced_import(db, "local_rarity_meter", v, indexes)?,
|
||||
cycle: RarityMeterInner::forced_import(db, "cycle_rarity_meter", v, indexes)?,
|
||||
@@ -52,9 +56,20 @@ impl RarityMeter {
|
||||
exit: &Exit,
|
||||
) -> Result<()> {
|
||||
let spot = &prices.spot.cents.height;
|
||||
let all = &distribution.utxo_cohorts.all.metrics;
|
||||
let realized = &all.realized;
|
||||
|
||||
self.components
|
||||
.compute(indexer, distribution, cointime, coinflow, exit)?;
|
||||
self.extremes.compute(
|
||||
indexer,
|
||||
&all.supply.in_loss.btc.height,
|
||||
&realized.profit.sum._24h.usd.height,
|
||||
&realized.loss.sum._24h.usd.height,
|
||||
&realized.peak_regret.value.sum._24h.usd.height,
|
||||
&realized.sell_side_risk_ratio._24h.percent.height,
|
||||
exit,
|
||||
)?;
|
||||
|
||||
// Full: all Rainbow components, 10 models
|
||||
self.full.compute(
|
||||
|
||||
@@ -29,7 +29,7 @@ impl Vecs {
|
||||
&starting_lengths,
|
||||
exit,
|
||||
)?;
|
||||
let lock = self.spent.compute(indexer, inputs, exit)?;
|
||||
let lock = self.spent.compute(indexer, exit)?;
|
||||
self.db.run_bg(move |db| {
|
||||
let _lock = lock;
|
||||
db.compact_deferred_default()
|
||||
|
||||
@@ -5,20 +5,14 @@ use tracing::info;
|
||||
use vecdb::{AnyStoredVec, AnyVec, Exit, ExitGuard, ReadableVec, Stamp, VecIndex, WritableVec};
|
||||
|
||||
use super::Vecs;
|
||||
use crate::inputs;
|
||||
|
||||
const HEIGHT_BATCH: u32 = 10_000;
|
||||
|
||||
impl Vecs {
|
||||
pub(crate) fn compute(
|
||||
&mut self,
|
||||
indexer: &Indexer,
|
||||
inputs: &inputs::Vecs,
|
||||
exit: &Exit,
|
||||
) -> Result<ExitGuard> {
|
||||
pub(crate) fn compute(&mut self, indexer: &Indexer, exit: &Exit) -> Result<ExitGuard> {
|
||||
let starting_lengths = indexer.safe_lengths();
|
||||
|
||||
let dep_version = inputs.spent.txout_index.version()
|
||||
let dep_version = indexer.vecs.inputs.txout_index.version()
|
||||
+ indexer.vecs.outputs.first_txout_index.version()
|
||||
+ indexer.vecs.inputs.first_txin_index.version()
|
||||
+ indexer.vecs.outputs.value.version();
|
||||
@@ -41,7 +35,7 @@ impl Vecs {
|
||||
self.txin_index
|
||||
.truncate_if_needed(TxOutIndex::from(min_txout_index))?;
|
||||
|
||||
let txin_index_to_txout_index = &inputs.spent.txout_index;
|
||||
let txin_index_to_txout_index = &indexer.vecs.inputs.txout_index;
|
||||
|
||||
// Find min_height via binary search (first_txout_index is monotonically non-decreasing)
|
||||
let first_txout_index_vec = &indexer.vecs.outputs.first_txout_index;
|
||||
@@ -105,7 +99,7 @@ impl Vecs {
|
||||
let txin_start =
|
||||
first_txin_index_data[batch_start_height.to_usize() - offset].to_usize();
|
||||
let txin_end = if batch_end_height >= target_height {
|
||||
inputs.spent.txout_index.len()
|
||||
indexer.vecs.inputs.txout_index.len()
|
||||
} else {
|
||||
first_txin_index_data[batch_end_height.to_usize() + 1 - offset].to_usize()
|
||||
};
|
||||
|
||||
@@ -3,7 +3,7 @@ use brk_indexer::Indexer;
|
||||
use vecdb::Exit;
|
||||
|
||||
use super::Vecs;
|
||||
use crate::{blocks, indexes, inputs, price};
|
||||
use crate::{blocks, indexes, price};
|
||||
|
||||
impl Vecs {
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
@@ -12,7 +12,6 @@ impl Vecs {
|
||||
indexer: &Indexer,
|
||||
indexes: &indexes::Vecs,
|
||||
blocks: &blocks::Vecs,
|
||||
inputs: &inputs::Vecs,
|
||||
prices: &price::Vecs,
|
||||
exit: &Exit,
|
||||
) -> Result<()> {
|
||||
@@ -31,11 +30,9 @@ impl Vecs {
|
||||
r2?;
|
||||
r3?;
|
||||
|
||||
self.fees
|
||||
.compute(indexer, indexes, &inputs.spent, &self.size, exit)?;
|
||||
self.fees.compute(indexer, indexes, &self.size, exit)?;
|
||||
|
||||
self.patterns
|
||||
.compute(indexer, indexes, &inputs.spent, exit)?;
|
||||
self.patterns.compute(indexer, indexes, exit)?;
|
||||
|
||||
self.policy.compute(indexer, indexes, &self.fees, exit)?;
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ use vecdb::{AnyStoredVec, AnyVec, Exit, ReadableVec, VecIndex, WritableVec, unli
|
||||
|
||||
use super::super::size;
|
||||
use super::Vecs;
|
||||
use crate::{indexes, inputs};
|
||||
use crate::indexes;
|
||||
|
||||
impl Vecs {
|
||||
#[allow(clippy::too_many_arguments)]
|
||||
@@ -17,7 +17,6 @@ impl Vecs {
|
||||
&mut self,
|
||||
indexer: &Indexer,
|
||||
indexes: &indexes::Vecs,
|
||||
spent: &inputs::SpentVecs,
|
||||
size_vecs: &size::Vecs,
|
||||
exit: &Exit,
|
||||
) -> Result<()> {
|
||||
@@ -27,7 +26,7 @@ impl Vecs {
|
||||
starting_lengths.tx_index,
|
||||
&indexer.vecs.transactions.first_txin_index,
|
||||
&indexes.tx_index.input_count,
|
||||
&spent.value,
|
||||
&indexer.vecs.inputs.value,
|
||||
exit,
|
||||
)?;
|
||||
self.output_value.compute_sum_from_indexes(
|
||||
|
||||
@@ -4,7 +4,7 @@ use brk_types::{StoredBool, StoredU64, TxIndex};
|
||||
use vecdb::{AnyStoredVec, AnyVec, Exit, ReadableVec, VecIndex, WritableVec};
|
||||
|
||||
use super::{Vecs, coinjoin::Candidate};
|
||||
use crate::{indexes, inputs};
|
||||
use crate::indexes;
|
||||
|
||||
const WRITE_INTERVAL: usize = 10_000;
|
||||
|
||||
@@ -13,7 +13,6 @@ impl Vecs {
|
||||
&mut self,
|
||||
indexer: &Indexer,
|
||||
indexes: &indexes::Vecs,
|
||||
spent: &inputs::SpentVecs,
|
||||
exit: &Exit,
|
||||
) -> Result<()> {
|
||||
let features = &indexer.vecs.transaction_features;
|
||||
@@ -22,7 +21,7 @@ impl Vecs {
|
||||
+ indexer.vecs.transactions.first_tx_index.version()
|
||||
+ indexer.vecs.transactions.first_txin_index.version()
|
||||
+ indexer.vecs.transactions.first_txout_index.version()
|
||||
+ spent.value.version()
|
||||
+ indexer.vecs.inputs.value.version()
|
||||
+ indexer.vecs.inputs.output_type.version()
|
||||
+ indexer.vecs.inputs.type_index.version()
|
||||
+ indexer.vecs.outputs.value.version()
|
||||
@@ -98,7 +97,7 @@ impl Vecs {
|
||||
|
||||
let mut input_count = indexes.tx_index.input_count.cursor();
|
||||
let mut output_count = indexes.tx_index.output_count.cursor();
|
||||
let mut input_value = spent.value.cursor();
|
||||
let mut input_value = indexer.vecs.inputs.value.cursor();
|
||||
let mut input_type = indexer.vecs.inputs.output_type.cursor();
|
||||
let mut input_type_index = indexer.vecs.inputs.type_index.cursor();
|
||||
let mut output_value = indexer.vecs.outputs.value.reader().cursor();
|
||||
|
||||
@@ -31,3 +31,4 @@ vecdb = { workspace = true }
|
||||
brk_alloc = { workspace = true }
|
||||
brk_bencher = { workspace = true }
|
||||
color-eyre = { workspace = true }
|
||||
tempfile = { workspace = true }
|
||||
|
||||
@@ -4,7 +4,7 @@ use brk_types::{TxIndex, Txid, TxidPrefix, Version};
|
||||
|
||||
// One version for all data sources
|
||||
// Increment on **change _OR_ addition**
|
||||
pub const VERSION: Version = Version::new(27);
|
||||
pub const VERSION: Version = Version::new(28);
|
||||
pub const SNAPSHOT_BLOCK_RANGE: usize = 1_000;
|
||||
|
||||
/// Known duplicate Bitcoin transactions (BIP30)
|
||||
|
||||
@@ -9,8 +9,8 @@ use brk_cohort::ByAddrType;
|
||||
use brk_error::Result;
|
||||
use brk_store::Store;
|
||||
use brk_types::{
|
||||
AddrIndexOutPoint, AddrIndexTxIndex, OutPoint, OutputType, TxInIndex, TxIndex, TypeIndex, Unit,
|
||||
Vin,
|
||||
AddrIndexOutPoint, AddrIndexTxIndex, OutPoint, OutputType, Sats, TxInIndex, TxIndex,
|
||||
TxOutIndex, TypeIndex, Unit, Vin,
|
||||
};
|
||||
use vecdb::{PcoVec, WritableVec, unlikely};
|
||||
|
||||
@@ -48,22 +48,36 @@ pub(super) fn finalize_inputs(
|
||||
let block_txin_index = input_offset + vin;
|
||||
let txin_index = base_txin_index + TxInIndex::from(block_txin_index);
|
||||
let vin = Vin::from(vin);
|
||||
let (outpoint, output_type, type_index) = match input_source {
|
||||
let (outpoint, txout_index, value, output_type, type_index) = match input_source {
|
||||
InputSource::PreviousBlock {
|
||||
outpoint,
|
||||
txout_index,
|
||||
value,
|
||||
output_type,
|
||||
legacy_sigops: _,
|
||||
type_index,
|
||||
} => (*outpoint, *output_type, *type_index),
|
||||
InputSource::Coinbase => {
|
||||
(OutPoint::COINBASE, OutputType::Unknown, TypeIndex::COINBASE)
|
||||
}
|
||||
} => (*outpoint, *txout_index, *value, *output_type, *type_index),
|
||||
InputSource::Coinbase => (
|
||||
OutPoint::COINBASE,
|
||||
TxOutIndex::COINBASE,
|
||||
Sats::MAX,
|
||||
OutputType::Unknown,
|
||||
TypeIndex::COINBASE,
|
||||
),
|
||||
InputSource::SameBlock {
|
||||
outpoint,
|
||||
txout_offset,
|
||||
txout_index,
|
||||
value,
|
||||
} => {
|
||||
let output = &txouts[*txout_offset];
|
||||
(*outpoint, output.output_type, output.resolved_type_index())
|
||||
(
|
||||
*outpoint,
|
||||
*txout_index,
|
||||
*value,
|
||||
output.output_type,
|
||||
output.resolved_type_index(),
|
||||
)
|
||||
}
|
||||
};
|
||||
|
||||
@@ -73,6 +87,8 @@ pub(super) fn finalize_inputs(
|
||||
|
||||
inputs.tx_index.checked_push(txin_index, tx_index)?;
|
||||
inputs.outpoint.checked_push(txin_index, outpoint)?;
|
||||
inputs.txout_index.checked_push(txin_index, txout_index)?;
|
||||
inputs.value.checked_push(txin_index, value)?;
|
||||
inputs.output_type.checked_push(txin_index, output_type)?;
|
||||
inputs.type_index.checked_push(txin_index, type_index)?;
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ use std::collections::hash_map::Entry;
|
||||
|
||||
use brk_error::{Error, Result};
|
||||
use brk_types::{
|
||||
OutPoint, OutputType, SigOps, TxIndex, TxOutIndex, Txid, TxidPrefix, TypeIndex, Vout,
|
||||
OutPoint, OutputType, Sats, SigOps, TxIndex, TxOutIndex, Txid, TxidPrefix, TypeIndex, Vout,
|
||||
};
|
||||
use rayon::prelude::*;
|
||||
use rustc_hash::FxHashMap;
|
||||
@@ -29,7 +29,11 @@ impl InputResolver {
|
||||
processor: &BlockProcessor<'_>,
|
||||
txs: &[ComputedTx<'_>],
|
||||
) -> Result<&[InputSource]> {
|
||||
self.prepare(txs, processor.lengths.tx_index);
|
||||
self.prepare(
|
||||
txs,
|
||||
processor.lengths.tx_index,
|
||||
processor.lengths.txout_index,
|
||||
);
|
||||
self.reads.resolve(
|
||||
processor,
|
||||
&self.previous_parent_prefixes,
|
||||
@@ -53,17 +57,22 @@ impl InputResolver {
|
||||
UnresolvedInput::SameBlock {
|
||||
outpoint,
|
||||
txout_offset,
|
||||
txout_index,
|
||||
value,
|
||||
} => {
|
||||
*resolved = InputSource::SameBlock {
|
||||
outpoint,
|
||||
txout_offset,
|
||||
txout_index,
|
||||
value,
|
||||
};
|
||||
Ok(())
|
||||
}
|
||||
UnresolvedInput::PreviousBlock { parent_index, vout } => {
|
||||
let parent = reads.parent(parent_index);
|
||||
let outpoint = OutPoint::new(parent.tx_index, vout);
|
||||
let (output_type, type_index) = reads.output(input_index);
|
||||
let txout_index = parent.first_txout_index + vout;
|
||||
let (value, output_type, type_index) = reads.output(input_index);
|
||||
|
||||
let legacy_sigops = if tracks_executed_legacy_sigops {
|
||||
processor
|
||||
@@ -77,6 +86,8 @@ impl InputResolver {
|
||||
|
||||
*resolved = InputSource::PreviousBlock {
|
||||
outpoint,
|
||||
txout_index,
|
||||
value,
|
||||
output_type,
|
||||
legacy_sigops,
|
||||
type_index,
|
||||
@@ -90,7 +101,12 @@ impl InputResolver {
|
||||
Ok(&self.resolved)
|
||||
}
|
||||
|
||||
fn prepare(&mut self, txs: &[ComputedTx<'_>], block_first_tx_index: TxIndex) {
|
||||
fn prepare(
|
||||
&mut self,
|
||||
txs: &[ComputedTx<'_>],
|
||||
block_first_tx_index: TxIndex,
|
||||
block_first_txout_index: TxOutIndex,
|
||||
) {
|
||||
self.parent_locations.clear();
|
||||
self.previous_parent_prefixes.clear();
|
||||
self.inputs.clear();
|
||||
@@ -121,9 +137,15 @@ impl InputResolver {
|
||||
ParentLocation::SameBlock(tx_index) => {
|
||||
let block_tx_index =
|
||||
usize::from(tx_index) - usize::from(block_first_tx_index);
|
||||
let tx = &txs[block_tx_index];
|
||||
let txout_offset = tx.txout_offset(vout);
|
||||
let value = Sats::from(tx.tx.output[usize::from(vout)].value);
|
||||
self.inputs.push(UnresolvedInput::SameBlock {
|
||||
outpoint: OutPoint::new(tx_index, vout),
|
||||
txout_offset: txs[block_tx_index].txout_offset(vout),
|
||||
txout_offset,
|
||||
txout_index: block_first_txout_index
|
||||
+ TxOutIndex::from(txout_offset),
|
||||
value,
|
||||
});
|
||||
continue;
|
||||
}
|
||||
@@ -189,6 +211,7 @@ struct ReadBatch {
|
||||
outputs: Vec<OutputRead>,
|
||||
output_types: Vec<OutputType>,
|
||||
type_indices: Vec<TypeIndex>,
|
||||
values: Vec<Sats>,
|
||||
}
|
||||
|
||||
impl ReadBatch {
|
||||
@@ -290,6 +313,8 @@ impl ReadBatch {
|
||||
self.output_types.resize(inputs.len(), OutputType::Unknown);
|
||||
self.type_indices.clear();
|
||||
self.type_indices.resize(inputs.len(), TypeIndex::default());
|
||||
self.values.clear();
|
||||
self.values.resize(inputs.len(), Sats::MAX);
|
||||
}
|
||||
|
||||
fn read_outputs(&mut self, processor: &BlockProcessor<'_>) -> Result<()> {
|
||||
@@ -300,8 +325,20 @@ impl ReadBatch {
|
||||
|
||||
let output_types = &mut self.output_types;
|
||||
let type_indices = &mut self.type_indices;
|
||||
let values = &mut self.values;
|
||||
|
||||
let (output_types_result, type_indices_result) = rayon::join(
|
||||
let (values_result, metadata_result) = rayon::join(
|
||||
|| -> Result<()> {
|
||||
for read in outputs {
|
||||
values[read.input_index] = processor
|
||||
.vecs
|
||||
.outputs
|
||||
.value
|
||||
.get_append_only(read.txout_index, &processor.readers.txout_index_to_value)
|
||||
.ok_or(Error::Internal("Missing output value"))?;
|
||||
}
|
||||
Ok(())
|
||||
},
|
||||
|| -> Result<()> {
|
||||
for read in outputs {
|
||||
output_types[read.input_index] = processor
|
||||
@@ -313,11 +350,6 @@ impl ReadBatch {
|
||||
&processor.readers.txout_index_to_output_type,
|
||||
)
|
||||
.ok_or(Error::Internal("Missing output_type"))?;
|
||||
}
|
||||
Ok(())
|
||||
},
|
||||
|| -> Result<()> {
|
||||
for read in outputs {
|
||||
type_indices[read.input_index] = processor
|
||||
.vecs
|
||||
.outputs
|
||||
@@ -332,16 +364,17 @@ impl ReadBatch {
|
||||
},
|
||||
);
|
||||
|
||||
output_types_result?;
|
||||
type_indices_result
|
||||
values_result?;
|
||||
metadata_result
|
||||
}
|
||||
|
||||
fn parent(&self, original_index: usize) -> ParentRead {
|
||||
self.parents[original_index]
|
||||
}
|
||||
|
||||
fn output(&self, input_index: usize) -> (OutputType, TypeIndex) {
|
||||
fn output(&self, input_index: usize) -> (Sats, OutputType, TypeIndex) {
|
||||
(
|
||||
self.values[input_index],
|
||||
self.output_types[input_index],
|
||||
self.type_indices[input_index],
|
||||
)
|
||||
@@ -358,5 +391,7 @@ enum UnresolvedInput {
|
||||
SameBlock {
|
||||
outpoint: OutPoint,
|
||||
txout_offset: usize,
|
||||
txout_index: TxOutIndex,
|
||||
value: Sats,
|
||||
},
|
||||
}
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
use brk_types::{OutPoint, OutputType, SigOps, TypeIndex};
|
||||
use brk_types::{OutPoint, OutputType, Sats, SigOps, TxOutIndex, TypeIndex};
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub(crate) enum InputSource {
|
||||
Coinbase,
|
||||
PreviousBlock {
|
||||
outpoint: OutPoint,
|
||||
txout_index: TxOutIndex,
|
||||
value: Sats,
|
||||
output_type: OutputType,
|
||||
legacy_sigops: SigOps,
|
||||
type_index: TypeIndex,
|
||||
@@ -12,5 +14,7 @@ pub(crate) enum InputSource {
|
||||
SameBlock {
|
||||
outpoint: OutPoint,
|
||||
txout_offset: usize,
|
||||
txout_index: TxOutIndex,
|
||||
value: Sats,
|
||||
},
|
||||
}
|
||||
|
||||
@@ -2,8 +2,8 @@ use bitcoin::ScriptBuf;
|
||||
use brk_types::{
|
||||
AddrBytes, OutputType, P2AAddrIndex, P2ABytes, P2MSOutputIndex, P2PK33AddrIndex, P2PK33Bytes,
|
||||
P2PK65AddrIndex, P2PK65Bytes, P2PKHAddrIndex, P2PKHBytes, P2SHAddrIndex, P2SHBytes,
|
||||
P2TRAddrIndex, P2TRBytes, P2WPKHAddrIndex, P2WPKHBytes, P2WSHAddrIndex, P2WSHBytes, SigOps,
|
||||
TxIndex, TxOutIndex, Txid, TypeIndex, UnknownOutputIndex,
|
||||
P2TRAddrIndex, P2TRBytes, P2WPKHAddrIndex, P2WPKHBytes, P2WSHAddrIndex, P2WSHBytes, Sats,
|
||||
SigOps, TxIndex, TxOutIndex, Txid, TypeIndex, UnknownOutputIndex,
|
||||
};
|
||||
use vecdb::{BytesStrategy, VecReader};
|
||||
|
||||
@@ -45,6 +45,7 @@ impl AddrReaders {
|
||||
pub struct Readers {
|
||||
pub txid: VecReader<TxIndex, Txid, BytesStrategy<Txid>>,
|
||||
pub tx_index_to_first_txout_index: VecReader<TxIndex, TxOutIndex, BytesStrategy<TxOutIndex>>,
|
||||
pub txout_index_to_value: VecReader<TxOutIndex, Sats, BytesStrategy<Sats>>,
|
||||
pub txout_index_to_output_type: VecReader<TxOutIndex, OutputType, BytesStrategy<OutputType>>,
|
||||
pub txout_index_to_type_index: VecReader<TxOutIndex, TypeIndex, BytesStrategy<TypeIndex>>,
|
||||
pub scripts: ScriptReaders,
|
||||
@@ -56,6 +57,7 @@ impl Readers {
|
||||
Self {
|
||||
txid: vecs.transactions.txid.reader(),
|
||||
tx_index_to_first_txout_index: vecs.transactions.first_txout_index.reader(),
|
||||
txout_index_to_value: vecs.outputs.value.reader(),
|
||||
txout_index_to_output_type: vecs.outputs.output_type.reader(),
|
||||
txout_index_to_type_index: vecs.outputs.type_index.reader(),
|
||||
scripts: ScriptReaders {
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
use brk_error::Result;
|
||||
use brk_traversable::Traversable;
|
||||
use brk_types::{Height, OutPoint, OutputType, TxInIndex, TxIndex, TypeIndex, Version};
|
||||
use brk_types::{
|
||||
Height, OutPoint, OutputType, Sats, TxInIndex, TxIndex, TxOutIndex, TypeIndex, Version,
|
||||
};
|
||||
use rayon::prelude::*;
|
||||
use vecdb::{AnyStoredVec, Database, ImportableVec, PcoVec, Rw, Stamp, StorageMode, WritableVec};
|
||||
|
||||
@@ -10,6 +12,8 @@ use crate::parallel_import;
|
||||
pub struct InputsVecs<M: StorageMode = Rw> {
|
||||
pub first_txin_index: M::Stored<PcoVec<Height, TxInIndex>>,
|
||||
pub outpoint: M::Stored<PcoVec<TxInIndex, OutPoint>>,
|
||||
pub txout_index: M::Stored<PcoVec<TxInIndex, TxOutIndex>>,
|
||||
pub value: M::Stored<PcoVec<TxInIndex, Sats>>,
|
||||
pub tx_index: M::Stored<PcoVec<TxInIndex, TxIndex>>,
|
||||
pub output_type: M::Stored<PcoVec<TxInIndex, OutputType>>,
|
||||
pub type_index: M::Stored<PcoVec<TxInIndex, TypeIndex>>,
|
||||
@@ -17,9 +21,11 @@ pub struct InputsVecs<M: StorageMode = Rw> {
|
||||
|
||||
impl InputsVecs {
|
||||
pub fn forced_import(db: &Database, version: Version) -> Result<Self> {
|
||||
let (first_txin_index, outpoint, tx_index, output_type, type_index) = parallel_import! {
|
||||
let (first_txin_index, outpoint, txout_index, value, tx_index, output_type, type_index) = parallel_import! {
|
||||
first_txin_index = PcoVec::forced_import(db, "first_txin_index", version),
|
||||
outpoint = PcoVec::forced_import(db, "outpoint", version),
|
||||
txout_index = PcoVec::forced_import(db, "txout_index", version),
|
||||
value = PcoVec::forced_import(db, "value", version),
|
||||
tx_index = PcoVec::forced_import(db, "tx_index", version),
|
||||
output_type = PcoVec::forced_import(db, "output_type", version),
|
||||
type_index = PcoVec::forced_import(db, "type_index", version),
|
||||
@@ -27,6 +33,8 @@ impl InputsVecs {
|
||||
Ok(Self {
|
||||
first_txin_index,
|
||||
outpoint,
|
||||
txout_index,
|
||||
value,
|
||||
tx_index,
|
||||
output_type,
|
||||
type_index,
|
||||
@@ -38,6 +46,10 @@ impl InputsVecs {
|
||||
.truncate_if_needed_with_stamp(height, stamp)?;
|
||||
self.outpoint
|
||||
.truncate_if_needed_with_stamp(txin_index, stamp)?;
|
||||
self.txout_index
|
||||
.truncate_if_needed_with_stamp(txin_index, stamp)?;
|
||||
self.value
|
||||
.truncate_if_needed_with_stamp(txin_index, stamp)?;
|
||||
self.tx_index
|
||||
.truncate_if_needed_with_stamp(txin_index, stamp)?;
|
||||
self.output_type
|
||||
@@ -51,6 +63,8 @@ impl InputsVecs {
|
||||
[
|
||||
&mut self.first_txin_index as &mut dyn AnyStoredVec,
|
||||
&mut self.outpoint,
|
||||
&mut self.txout_index,
|
||||
&mut self.value,
|
||||
&mut self.tx_index,
|
||||
&mut self.output_type,
|
||||
&mut self.type_index,
|
||||
@@ -62,6 +76,8 @@ impl InputsVecs {
|
||||
[
|
||||
&self.first_txin_index as &dyn AnyStoredVec,
|
||||
&self.outpoint,
|
||||
&self.txout_index,
|
||||
&self.value,
|
||||
&self.tx_index,
|
||||
&self.output_type,
|
||||
&self.type_index,
|
||||
@@ -69,3 +85,106 @@ impl InputsVecs {
|
||||
.into_iter()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use brk_types::{Version, Vout};
|
||||
use rayon::prelude::*;
|
||||
use vecdb::{AnyVec, ReadableVec};
|
||||
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn rollback_keeps_all_input_facts_aligned() {
|
||||
let dir = tempfile::tempdir().unwrap();
|
||||
let db = Database::open(dir.path()).unwrap();
|
||||
let mut inputs = InputsVecs::forced_import(&db, Version::ONE).unwrap();
|
||||
|
||||
for (height, txin_index) in [(0_usize, 0_usize), (1, 2), (2, 4)] {
|
||||
inputs
|
||||
.first_txin_index
|
||||
.checked_push(Height::from(height), TxInIndex::from(txin_index))
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
let facts = [
|
||||
(
|
||||
OutPoint::COINBASE,
|
||||
TxOutIndex::COINBASE,
|
||||
Sats::MAX,
|
||||
TxIndex::ZERO,
|
||||
OutputType::Unknown,
|
||||
TypeIndex::COINBASE,
|
||||
),
|
||||
(
|
||||
OutPoint::new(TxIndex::from(1_usize), Vout::ZERO),
|
||||
TxOutIndex::from(2_usize),
|
||||
Sats::from(21_usize),
|
||||
TxIndex::from(2_usize),
|
||||
OutputType::P2PKH,
|
||||
TypeIndex::from(3_usize),
|
||||
),
|
||||
(
|
||||
OutPoint::new(TxIndex::from(2_usize), Vout::ZERO),
|
||||
TxOutIndex::from(4_usize),
|
||||
Sats::from(34_usize),
|
||||
TxIndex::from(3_usize),
|
||||
OutputType::P2TR,
|
||||
TypeIndex::from(5_usize),
|
||||
),
|
||||
(
|
||||
OutPoint::new(TxIndex::from(3_usize), Vout::ZERO),
|
||||
TxOutIndex::from(6_usize),
|
||||
Sats::from(55_usize),
|
||||
TxIndex::from(4_usize),
|
||||
OutputType::P2WPKH,
|
||||
TypeIndex::from(8_usize),
|
||||
),
|
||||
];
|
||||
|
||||
for (index, &(outpoint, txout_index, value, tx_index, output_type, type_index)) in
|
||||
facts.iter().enumerate()
|
||||
{
|
||||
let index = TxInIndex::from(index);
|
||||
inputs.outpoint.checked_push(index, outpoint).unwrap();
|
||||
inputs.txout_index.checked_push(index, txout_index).unwrap();
|
||||
inputs.value.checked_push(index, value).unwrap();
|
||||
inputs.tx_index.checked_push(index, tx_index).unwrap();
|
||||
inputs.output_type.checked_push(index, output_type).unwrap();
|
||||
inputs.type_index.checked_push(index, type_index).unwrap();
|
||||
}
|
||||
|
||||
inputs
|
||||
.par_iter_mut_any()
|
||||
.try_for_each(|vec| vec.stamped_write(Stamp::from(2_u64)))
|
||||
.unwrap();
|
||||
|
||||
inputs
|
||||
.truncate(
|
||||
Height::from(1_usize),
|
||||
TxInIndex::from(2_usize),
|
||||
Stamp::from(0_u64),
|
||||
)
|
||||
.unwrap();
|
||||
inputs
|
||||
.par_iter_mut_any()
|
||||
.try_for_each(|vec| vec.stamped_write(Stamp::from(0_u64)))
|
||||
.unwrap();
|
||||
|
||||
drop(inputs);
|
||||
drop(db);
|
||||
|
||||
let db = Database::open(dir.path()).unwrap();
|
||||
let inputs = InputsVecs::forced_import(&db, Version::ONE).unwrap();
|
||||
assert_eq!(inputs.first_txin_index.len(), 1);
|
||||
assert!(inputs.iter_any().skip(1).all(|vec| vec.len() == 2));
|
||||
assert_eq!(
|
||||
inputs.txout_index.collect_range_at(0, 2),
|
||||
[TxOutIndex::COINBASE, TxOutIndex::from(2_usize)]
|
||||
);
|
||||
assert_eq!(
|
||||
inputs.value.collect_range_at(0, 2),
|
||||
[Sats::MAX, Sats::from(21_usize)]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -194,7 +194,7 @@ impl Query {
|
||||
let mut outpoint_cursor = indexer.vecs.inputs.outpoint.cursor();
|
||||
let mut input_output_type_cursor = indexer.vecs.inputs.output_type.cursor();
|
||||
let mut input_type_index_cursor = indexer.vecs.inputs.type_index.cursor();
|
||||
let mut input_value_cursor = self.computer().inputs.spent.value.cursor();
|
||||
let mut input_value_cursor = indexer.vecs.inputs.value.cursor();
|
||||
|
||||
let mut prevout_input_data: FxHashMap<OutPoint, (OutputType, TypeIndex, Sats)> =
|
||||
FxHashMap::with_capacity_and_hasher(total_inputs, Default::default());
|
||||
|
||||
+323
-223
@@ -335,6 +335,14 @@ prior template's transactions or a full transaction body.
|
||||
* @property {Timestamp} timestamp - Unix timestamp at the window midpoint
|
||||
* @property {Weight} avgWeight - Rolling 24h median block weight (weight units)
|
||||
*/
|
||||
/**
|
||||
* Investor phase from the Capital Sentiment model.
|
||||
*
|
||||
* Codes are explicit because phase values are persisted. Code `0` represents
|
||||
* unavailable model inputs and is therefore not a phase.
|
||||
*
|
||||
* @typedef {("raging_bull"|"bull"|"cautious_bull"|"hopeful_bull"|"early_bull"|"weak_bull"|"limbo"|"deep_bear"|"bear"|"early_bear")} CapitalSentimentPhase
|
||||
*/
|
||||
/**
|
||||
* Unsigned cents (u64) - for values that should never be negative.
|
||||
* Used for invested capital, realized cap, etc.
|
||||
@@ -4906,6 +4914,27 @@ function createPpmPriceRatioPattern(client, acc, disc) {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @typedef {Object} RankTailThresholdPattern
|
||||
* @property {SeriesPattern1<StoredI8>} rank
|
||||
* @property {PercentPpmRatioPattern2} tail
|
||||
* @property {SeriesPattern1<Dollars>} threshold
|
||||
*/
|
||||
|
||||
/**
|
||||
* Create a RankTailThresholdPattern pattern node
|
||||
* @param {BrkClient} client
|
||||
* @param {string} acc - Accumulated series name
|
||||
* @returns {RankTailThresholdPattern}
|
||||
*/
|
||||
function createRankTailThresholdPattern(client, acc) {
|
||||
return {
|
||||
rank: createSeriesPattern1(client, _m(acc, 'rank')),
|
||||
tail: createPercentPpmRatioPattern2(client, _m(acc, 'tail')),
|
||||
threshold: createSeriesPattern1(client, _m(acc, 'threshold')),
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @typedef {Object} RatioTransferValuePattern
|
||||
* @property {_1m1w1y24hPattern<StoredF64>} ratio
|
||||
@@ -5676,9 +5705,8 @@ function createUnspentPattern(client, acc) {
|
||||
* @property {SeriesTree_Scripts} scripts
|
||||
* @property {SeriesTree_OpReturn} opReturn
|
||||
* @property {SeriesTree_Mining} mining
|
||||
* @property {SeriesTree_Cointime} cointime
|
||||
* @property {SeriesTree_Coinflow} coinflow
|
||||
* @property {SeriesTree_Bedrock} bedrock
|
||||
* @property {SeriesTree_Frameworks} frameworks
|
||||
* @property {SeriesTree_Models} models
|
||||
* @property {SeriesTree_Constants} constants
|
||||
* @property {SeriesTree_Indexes} indexes
|
||||
* @property {SeriesTree_Indicators} indicators
|
||||
@@ -5688,6 +5716,7 @@ function createUnspentPattern(client, acc) {
|
||||
* @property {SeriesTree_Price} price
|
||||
* @property {SeriesTree_Supply} supply
|
||||
* @property {SeriesTree_Cohorts} cohorts
|
||||
* @property {SeriesTree_Cointime} cointime
|
||||
*/
|
||||
|
||||
/**
|
||||
@@ -5980,7 +6009,6 @@ function createUnspentPattern(client, acc) {
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Inputs
|
||||
* @property {SeriesTree_Inputs_Raw} raw
|
||||
* @property {SeriesTree_Inputs_Spent} spent
|
||||
* @property {CumulativeRollingSumPattern} count
|
||||
* @property {_1m1w1y24hPattern<StoredF32>} perSec
|
||||
* @property {SeriesTree_Inputs_ByType} byType
|
||||
@@ -5990,17 +6018,13 @@ function createUnspentPattern(client, acc) {
|
||||
* @typedef {Object} SeriesTree_Inputs_Raw
|
||||
* @property {SeriesPattern18<TxInIndex>} firstTxinIndex
|
||||
* @property {SeriesPattern20<OutPoint>} outpoint
|
||||
* @property {SeriesPattern20<TxOutIndex>} txoutIndex
|
||||
* @property {SeriesPattern20<Sats>} value
|
||||
* @property {SeriesPattern20<TxIndex>} txIndex
|
||||
* @property {SeriesPattern20<OutputType>} outputType
|
||||
* @property {SeriesPattern20<TypeIndex>} typeIndex
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Inputs_Spent
|
||||
* @property {SeriesPattern20<TxOutIndex>} txoutIndex
|
||||
* @property {SeriesPattern20<Sats>} value
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Inputs_ByType
|
||||
* @property {SeriesTree_Inputs_ByType_InputCount} inputCount
|
||||
@@ -6533,29 +6557,34 @@ function createUnspentPattern(client, acc) {
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Cointime
|
||||
* @property {SeriesTree_Cointime_Activity} activity
|
||||
* @property {SeriesTree_Cointime_AgeRange} ageRange
|
||||
* @property {SeriesTree_Cointime_Supply} supply
|
||||
* @property {SeriesTree_Cointime_Value} value
|
||||
* @property {SeriesTree_Cointime_Cap} cap
|
||||
* @property {SeriesTree_Cointime_Prices} prices
|
||||
* @property {SeriesTree_Cointime_Adjusted} adjusted
|
||||
* @property {SeriesTree_Cointime_ReserveRisk} reserveRisk
|
||||
* @typedef {Object} SeriesTree_Frameworks
|
||||
* @property {SeriesTree_Frameworks_Cointime} cointime
|
||||
* @property {SeriesTree_Frameworks_Coinflow} coinflow
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Cointime_Activity
|
||||
* @typedef {Object} SeriesTree_Frameworks_Cointime
|
||||
* @property {SeriesTree_Frameworks_Cointime_Activity} activity
|
||||
* @property {SeriesTree_Frameworks_Cointime_AgeRange} ageRange
|
||||
* @property {SeriesTree_Frameworks_Cointime_Supply} supply
|
||||
* @property {SeriesTree_Frameworks_Cointime_Value} value
|
||||
* @property {SeriesTree_Frameworks_Cointime_Cap} cap
|
||||
* @property {SeriesTree_Frameworks_Cointime_Prices} prices
|
||||
* @property {SeriesTree_Frameworks_Cointime_Adjusted} adjusted
|
||||
* @property {SeriesTree_Frameworks_Cointime_ReserveRisk} reserveRisk
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Frameworks_Cointime_Activity
|
||||
* @property {AverageBlockCumulativeSumPattern<StoredF64>} coinblocksCreated
|
||||
* @property {AverageBlockCumulativeSumPattern<StoredF64>} coinblocksStored
|
||||
* @property {SeriesPattern1<StoredF64>} liveliness
|
||||
* @property {SeriesPattern1<StoredF64>} vaultedness
|
||||
* @property {SeriesPattern1<StoredF64>} ratio
|
||||
* @property {AverageBlockCumulativeSumPattern<StoredF64>} coinblocksDestroyed
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Cointime_AgeRange
|
||||
* @typedef {Object} SeriesTree_Frameworks_Cointime_AgeRange
|
||||
* @property {CoindaysLivelinessRatioSupplyVaultednessPattern} under1h
|
||||
* @property {CoindaysLivelinessRatioSupplyVaultednessPattern} _1hTo1d
|
||||
* @property {CoindaysLivelinessRatioSupplyVaultednessPattern} _1dTo1w
|
||||
@@ -6582,13 +6611,13 @@ function createUnspentPattern(client, acc) {
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Cointime_Supply
|
||||
* @typedef {Object} SeriesTree_Frameworks_Cointime_Supply
|
||||
* @property {BtcCentsSatsUsdPattern} vaulted
|
||||
* @property {SeriesTree_Cointime_Supply_Active} active
|
||||
* @property {SeriesTree_Frameworks_Cointime_Supply_Active} active
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Cointime_Supply_Active
|
||||
* @typedef {Object} SeriesTree_Frameworks_Cointime_Supply_Active
|
||||
* @property {SeriesPattern1<Bitcoin>} btc
|
||||
* @property {SeriesPattern1<Sats>} sats
|
||||
* @property {SeriesPattern1<Dollars>} usd
|
||||
@@ -6597,7 +6626,7 @@ function createUnspentPattern(client, acc) {
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Cointime_Value
|
||||
* @typedef {Object} SeriesTree_Frameworks_Cointime_Value
|
||||
* @property {AverageBlockCumulativeSumPattern<StoredF64>} destroyed
|
||||
* @property {AverageBlockCumulativeSumPattern<StoredF64>} created
|
||||
* @property {AverageBlockCumulativeSumPattern<StoredF64>} stored
|
||||
@@ -6605,7 +6634,7 @@ function createUnspentPattern(client, acc) {
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Cointime_Cap
|
||||
* @typedef {Object} SeriesTree_Frameworks_Cointime_Cap
|
||||
* @property {CentsUsdPattern3} thermo
|
||||
* @property {CentsUsdPattern3} investor
|
||||
* @property {CentsUsdPattern3} vaulted
|
||||
@@ -6615,7 +6644,7 @@ function createUnspentPattern(client, acc) {
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Cointime_Prices
|
||||
* @typedef {Object} SeriesTree_Frameworks_Cointime_Prices
|
||||
* @property {CentsPpmRatioSatsUsdPattern} vaulted
|
||||
* @property {CentsPpmRatioSatsUsdPattern} active
|
||||
* @property {CentsPpmRatioSatsUsdPattern} trueMarketMean
|
||||
@@ -6623,30 +6652,30 @@ function createUnspentPattern(client, acc) {
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Cointime_Adjusted
|
||||
* @typedef {Object} SeriesTree_Frameworks_Cointime_Adjusted
|
||||
* @property {PercentPpmRatioPattern} inflationRate
|
||||
* @property {SeriesPattern1<StoredF64>} txVelocityNative
|
||||
* @property {SeriesPattern1<StoredF64>} txVelocityFiat
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Cointime_ReserveRisk
|
||||
* @typedef {Object} SeriesTree_Frameworks_Cointime_ReserveRisk
|
||||
* @property {SeriesPattern1<StoredF64>} value
|
||||
* @property {SeriesPattern18<StoredF64>} vocddMedian1y
|
||||
* @property {SeriesPattern18<StoredF64>} hodlBank
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Coinflow
|
||||
* @property {SeriesTree_Coinflow_AgeRange} ageRange
|
||||
* @property {SeriesTree_Coinflow_Supply} supply
|
||||
* @property {SeriesTree_Coinflow_Horizon} horizon
|
||||
* @typedef {Object} SeriesTree_Frameworks_Coinflow
|
||||
* @property {SeriesTree_Frameworks_Coinflow_AgeRange} ageRange
|
||||
* @property {SeriesTree_Frameworks_Coinflow_Supply} supply
|
||||
* @property {SeriesTree_Frameworks_Coinflow_Horizon} horizon
|
||||
* @property {CentsUsdPattern3} cap
|
||||
* @property {CentsPpmRatioSatsUsdPattern} price
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Coinflow_AgeRange
|
||||
* @typedef {Object} SeriesTree_Frameworks_Coinflow_AgeRange
|
||||
* @property {MobilitySpendingSupplyPattern} under1h
|
||||
* @property {MobilitySpendingSupplyPattern} _1hTo1d
|
||||
* @property {MobilitySpendingSupplyPattern} _1dTo1w
|
||||
@@ -6673,13 +6702,13 @@ function createUnspentPattern(client, acc) {
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Coinflow_Supply
|
||||
* @property {SeriesTree_Coinflow_Supply_Mobile} mobile
|
||||
* @typedef {Object} SeriesTree_Frameworks_Coinflow_Supply
|
||||
* @property {SeriesTree_Frameworks_Coinflow_Supply_Mobile} mobile
|
||||
* @property {BtcCentsSatsUsdPattern} immobile
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Coinflow_Supply_Mobile
|
||||
* @typedef {Object} SeriesTree_Frameworks_Coinflow_Supply_Mobile
|
||||
* @property {SeriesPattern1<Bitcoin>} btc
|
||||
* @property {SeriesPattern1<Sats>} sats
|
||||
* @property {SeriesPattern1<Dollars>} usd
|
||||
@@ -6688,7 +6717,7 @@ function createUnspentPattern(client, acc) {
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Coinflow_Horizon
|
||||
* @typedef {Object} SeriesTree_Frameworks_Coinflow_Horizon
|
||||
* @property {SupplyPattern} _8y
|
||||
* @property {SupplyPattern} _4y
|
||||
* @property {SupplyPattern} _2y
|
||||
@@ -6699,7 +6728,14 @@ function createUnspentPattern(client, acc) {
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Bedrock
|
||||
* @typedef {Object} SeriesTree_Models
|
||||
* @property {SeriesTree_Models_Bedrock} bedrock
|
||||
* @property {SeriesTree_Models_CapitalSentiment} capitalSentiment
|
||||
* @property {SeriesTree_Models_RarityMeter} rarityMeter
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Models_Bedrock
|
||||
* @property {FloorLevelLossPattern} raw
|
||||
* @property {FloorLevelLossPattern} cointime
|
||||
* @property {FloorLevelLossPattern} coinflow
|
||||
@@ -6712,6 +6748,63 @@ function createUnspentPattern(client, acc) {
|
||||
* @property {FloorLevelLossPattern} coinflow1m
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Models_CapitalSentiment
|
||||
* @property {SeriesPattern1<CapitalSentimentPhase>} phase
|
||||
* @property {SeriesPattern1<StoredI8>} score
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Models_RarityMeter
|
||||
* @property {SeriesTree_Models_RarityMeter_Components} components
|
||||
* @property {SeriesTree_Models_RarityMeter_Extremes} extremes
|
||||
* @property {IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern} full
|
||||
* @property {IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern} local
|
||||
* @property {IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern} cycle
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Models_RarityMeter_Components
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} realizedPrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} capitalizedPrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} sthRealizedPrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} sthCapitalizedPrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} lthRealizedPrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} lthCapitalizedPrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} over6mRealizedPrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} over4mRealizedPrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} under4mRealizedPrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} under6mRealizedPrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} vaultedPrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} activePrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} trueMarketMeanPrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} cointimePrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} coinflowPrice
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Models_RarityMeter_Extremes
|
||||
* @property {SeriesTree_Models_RarityMeter_Extremes_CoinsInLoss} coinsInLoss
|
||||
* @property {RankTailThresholdPattern} profitTaking
|
||||
* @property {RankTailThresholdPattern} capitulation
|
||||
* @property {RankTailThresholdPattern} peakRegret
|
||||
* @property {SeriesTree_Models_RarityMeter_Extremes_SellerExhaustion} sellerExhaustion
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Models_RarityMeter_Extremes_CoinsInLoss
|
||||
* @property {SeriesPattern1<Bitcoin>} threshold
|
||||
* @property {PercentPpmRatioPattern2} tail
|
||||
* @property {SeriesPattern1<StoredI8>} rank
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Models_RarityMeter_Extremes_SellerExhaustion
|
||||
* @property {SeriesPattern1<StoredF32>} threshold
|
||||
* @property {PercentPpmRatioPattern2} tail
|
||||
* @property {SeriesPattern1<StoredI8>} rank
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Constants
|
||||
* @property {SeriesPattern1<StoredU16>} _0
|
||||
@@ -6981,7 +7074,6 @@ function createUnspentPattern(client, acc) {
|
||||
* @property {SeriesTree_Indicators_Dormancy} dormancy
|
||||
* @property {SeriesPattern1<StoredF32>} stockToFlow
|
||||
* @property {SeriesPattern1<StoredF32>} sellerExhaustion
|
||||
* @property {SeriesTree_Indicators_RarityMeter} rarityMeter
|
||||
*/
|
||||
|
||||
/**
|
||||
@@ -6990,33 +7082,6 @@ function createUnspentPattern(client, acc) {
|
||||
* @property {SeriesPattern1<StoredF32>} flow
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Indicators_RarityMeter
|
||||
* @property {SeriesTree_Indicators_RarityMeter_Components} components
|
||||
* @property {IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern} full
|
||||
* @property {IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern} local
|
||||
* @property {IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern} cycle
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Indicators_RarityMeter_Components
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} realizedPrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} capitalizedPrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} sthRealizedPrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} sthCapitalizedPrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} lthRealizedPrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} lthCapitalizedPrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} over6mRealizedPrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} over4mRealizedPrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} under4mRealizedPrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} under6mRealizedPrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} vaultedPrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} activePrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} trueMarketMeanPrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} cointimePrice
|
||||
* @property {Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern} coinflowPrice
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Investing
|
||||
* @property {SeriesPattern18<Sats>} satsPerDay
|
||||
@@ -8064,6 +8129,16 @@ function createUnspentPattern(client, acc) {
|
||||
* @property {ActivityAddrOutputsRealizedSupplyPattern} _100kBtc
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Cointime
|
||||
* @property {SeriesTree_Cointime_Activity} activity
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {Object} SeriesTree_Cointime_Activity
|
||||
* @property {AverageBlockCumulativeSumPattern<StoredF64>} coinblocksDestroyed
|
||||
*/
|
||||
|
||||
/**
|
||||
* Main BRK client with series tree and API methods
|
||||
* @extends BrkClientBase
|
||||
@@ -9549,14 +9624,12 @@ class BrkClient extends BrkClientBase {
|
||||
raw: {
|
||||
firstTxinIndex: createSeriesPattern18(this, 'first_txin_index'),
|
||||
outpoint: createSeriesPattern20(this, 'outpoint'),
|
||||
txoutIndex: createSeriesPattern20(this, 'txout_index'),
|
||||
value: createSeriesPattern20(this, 'value'),
|
||||
txIndex: createSeriesPattern20(this, 'tx_index'),
|
||||
outputType: createSeriesPattern20(this, 'output_type'),
|
||||
typeIndex: createSeriesPattern20(this, 'type_index'),
|
||||
},
|
||||
spent: {
|
||||
txoutIndex: createSeriesPattern20(this, 'txout_index'),
|
||||
value: createSeriesPattern20(this, 'value'),
|
||||
},
|
||||
count: createCumulativeRollingSumPattern(this, 'input_count'),
|
||||
perSec: create_1m1w1y24hPattern(this, 'inputs_per_sec'),
|
||||
byType: {
|
||||
@@ -9932,140 +10005,184 @@ class BrkClient extends BrkClientBase {
|
||||
value: createPhsReboundThsPattern(this, 'hash_value'),
|
||||
},
|
||||
},
|
||||
cointime: {
|
||||
activity: {
|
||||
coinblocksCreated: createAverageBlockCumulativeSumPattern(this, 'coinblocks_created'),
|
||||
coinblocksStored: createAverageBlockCumulativeSumPattern(this, 'coinblocks_stored'),
|
||||
liveliness: createSeriesPattern1(this, 'liveliness'),
|
||||
vaultedness: createSeriesPattern1(this, 'vaultedness'),
|
||||
ratio: createSeriesPattern1(this, 'activity_to_vaultedness'),
|
||||
coinblocksDestroyed: createAverageBlockCumulativeSumPattern(this, 'coinblocks_destroyed'),
|
||||
},
|
||||
ageRange: {
|
||||
under1h: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_under_1h_old'),
|
||||
_1hTo1d: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_1h_to_1d_old'),
|
||||
_1dTo1w: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_1d_to_1w_old'),
|
||||
_1wTo1m: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_1w_to_1m_old'),
|
||||
_1mTo2m: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_1m_to_2m_old'),
|
||||
_2mTo3m: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_2m_to_3m_old'),
|
||||
_3mTo4m: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_3m_to_4m_old'),
|
||||
_4mTo5m: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_4m_to_5m_old'),
|
||||
_5mTo6m: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_5m_to_6m_old'),
|
||||
_6mTo9m: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_6m_to_9m_old'),
|
||||
_9mTo1y: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_9m_to_1y_old'),
|
||||
_1yTo18m: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_1y_to_18m_old'),
|
||||
_18mTo2y: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_18m_to_2y_old'),
|
||||
_2yTo3y: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_2y_to_3y_old'),
|
||||
_3yTo4y: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_3y_to_4y_old'),
|
||||
_4yTo5y: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_4y_to_5y_old'),
|
||||
_5yTo6y: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_5y_to_6y_old'),
|
||||
_6yTo7y: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_6y_to_7y_old'),
|
||||
_7yTo8y: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_7y_to_8y_old'),
|
||||
_8yTo10y: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_8y_to_10y_old'),
|
||||
_10yTo12y: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_10y_to_12y_old'),
|
||||
_12yTo15y: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_12y_to_15y_old'),
|
||||
over15y: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_over_15y_old'),
|
||||
},
|
||||
supply: {
|
||||
vaulted: createBtcCentsSatsUsdPattern(this, 'vaulted_supply'),
|
||||
active: {
|
||||
btc: createSeriesPattern1(this, 'active_supply'),
|
||||
sats: createSeriesPattern1(this, 'active_supply_sats'),
|
||||
usd: createSeriesPattern1(this, 'active_supply_usd'),
|
||||
cents: createSeriesPattern1(this, 'active_supply_cents'),
|
||||
inLoss: createSharePattern2(this, 'cointime_supply_in_loss_share'),
|
||||
frameworks: {
|
||||
cointime: {
|
||||
activity: {
|
||||
coinblocksCreated: createAverageBlockCumulativeSumPattern(this, 'coinblocks_created'),
|
||||
coinblocksStored: createAverageBlockCumulativeSumPattern(this, 'coinblocks_stored'),
|
||||
liveliness: createSeriesPattern1(this, 'liveliness'),
|
||||
vaultedness: createSeriesPattern1(this, 'vaultedness'),
|
||||
ratio: createSeriesPattern1(this, 'activity_to_vaultedness'),
|
||||
},
|
||||
ageRange: {
|
||||
under1h: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_under_1h_old'),
|
||||
_1hTo1d: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_1h_to_1d_old'),
|
||||
_1dTo1w: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_1d_to_1w_old'),
|
||||
_1wTo1m: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_1w_to_1m_old'),
|
||||
_1mTo2m: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_1m_to_2m_old'),
|
||||
_2mTo3m: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_2m_to_3m_old'),
|
||||
_3mTo4m: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_3m_to_4m_old'),
|
||||
_4mTo5m: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_4m_to_5m_old'),
|
||||
_5mTo6m: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_5m_to_6m_old'),
|
||||
_6mTo9m: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_6m_to_9m_old'),
|
||||
_9mTo1y: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_9m_to_1y_old'),
|
||||
_1yTo18m: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_1y_to_18m_old'),
|
||||
_18mTo2y: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_18m_to_2y_old'),
|
||||
_2yTo3y: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_2y_to_3y_old'),
|
||||
_3yTo4y: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_3y_to_4y_old'),
|
||||
_4yTo5y: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_4y_to_5y_old'),
|
||||
_5yTo6y: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_5y_to_6y_old'),
|
||||
_6yTo7y: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_6y_to_7y_old'),
|
||||
_7yTo8y: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_7y_to_8y_old'),
|
||||
_8yTo10y: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_8y_to_10y_old'),
|
||||
_10yTo12y: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_10y_to_12y_old'),
|
||||
_12yTo15y: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_12y_to_15y_old'),
|
||||
over15y: createCoindaysLivelinessRatioSupplyVaultednessPattern(this, 'utxos_over_15y_old'),
|
||||
},
|
||||
supply: {
|
||||
vaulted: createBtcCentsSatsUsdPattern(this, 'vaulted_supply'),
|
||||
active: {
|
||||
btc: createSeriesPattern1(this, 'active_supply'),
|
||||
sats: createSeriesPattern1(this, 'active_supply_sats'),
|
||||
usd: createSeriesPattern1(this, 'active_supply_usd'),
|
||||
cents: createSeriesPattern1(this, 'active_supply_cents'),
|
||||
inLoss: createSharePattern2(this, 'cointime_supply_in_loss_share'),
|
||||
},
|
||||
},
|
||||
value: {
|
||||
destroyed: createAverageBlockCumulativeSumPattern(this, 'cointime_value_destroyed'),
|
||||
created: createAverageBlockCumulativeSumPattern(this, 'cointime_value_created'),
|
||||
stored: createAverageBlockCumulativeSumPattern(this, 'cointime_value_stored'),
|
||||
vocdd: createAverageBlockCumulativeSumPattern(this, 'vocdd'),
|
||||
},
|
||||
cap: {
|
||||
thermo: createCentsUsdPattern3(this, 'thermo_cap'),
|
||||
investor: createCentsUsdPattern3(this, 'investor_cap'),
|
||||
vaulted: createCentsUsdPattern3(this, 'vaulted_cap'),
|
||||
active: createCentsUsdPattern3(this, 'active_cap'),
|
||||
cointime: createCentsUsdPattern3(this, 'cointime_cap'),
|
||||
aviv: createPpmRatioPattern2(this, 'aviv_ratio'),
|
||||
},
|
||||
prices: {
|
||||
vaulted: createCentsPpmRatioSatsUsdPattern(this, 'vaulted_price'),
|
||||
active: createCentsPpmRatioSatsUsdPattern(this, 'active_price'),
|
||||
trueMarketMean: createCentsPpmRatioSatsUsdPattern(this, 'true_market_mean'),
|
||||
cointime: createCentsPpmRatioSatsUsdPattern(this, 'cointime_price'),
|
||||
},
|
||||
adjusted: {
|
||||
inflationRate: createPercentPpmRatioPattern(this, 'cointime_adj_inflation_rate'),
|
||||
txVelocityNative: createSeriesPattern1(this, 'cointime_adj_tx_velocity_btc'),
|
||||
txVelocityFiat: createSeriesPattern1(this, 'cointime_adj_tx_velocity_usd'),
|
||||
},
|
||||
reserveRisk: {
|
||||
value: createSeriesPattern1(this, 'reserve_risk'),
|
||||
vocddMedian1y: createSeriesPattern18(this, 'vocdd_median_1y'),
|
||||
hodlBank: createSeriesPattern18(this, 'hodl_bank'),
|
||||
},
|
||||
},
|
||||
value: {
|
||||
destroyed: createAverageBlockCumulativeSumPattern(this, 'cointime_value_destroyed'),
|
||||
created: createAverageBlockCumulativeSumPattern(this, 'cointime_value_created'),
|
||||
stored: createAverageBlockCumulativeSumPattern(this, 'cointime_value_stored'),
|
||||
vocdd: createAverageBlockCumulativeSumPattern(this, 'vocdd'),
|
||||
},
|
||||
cap: {
|
||||
thermo: createCentsUsdPattern3(this, 'thermo_cap'),
|
||||
investor: createCentsUsdPattern3(this, 'investor_cap'),
|
||||
vaulted: createCentsUsdPattern3(this, 'vaulted_cap'),
|
||||
active: createCentsUsdPattern3(this, 'active_cap'),
|
||||
cointime: createCentsUsdPattern3(this, 'cointime_cap'),
|
||||
aviv: createPpmRatioPattern2(this, 'aviv_ratio'),
|
||||
},
|
||||
prices: {
|
||||
vaulted: createCentsPpmRatioSatsUsdPattern(this, 'vaulted_price'),
|
||||
active: createCentsPpmRatioSatsUsdPattern(this, 'active_price'),
|
||||
trueMarketMean: createCentsPpmRatioSatsUsdPattern(this, 'true_market_mean'),
|
||||
cointime: createCentsPpmRatioSatsUsdPattern(this, 'cointime_price'),
|
||||
},
|
||||
adjusted: {
|
||||
inflationRate: createPercentPpmRatioPattern(this, 'cointime_adj_inflation_rate'),
|
||||
txVelocityNative: createSeriesPattern1(this, 'cointime_adj_tx_velocity_btc'),
|
||||
txVelocityFiat: createSeriesPattern1(this, 'cointime_adj_tx_velocity_usd'),
|
||||
},
|
||||
reserveRisk: {
|
||||
value: createSeriesPattern1(this, 'reserve_risk'),
|
||||
vocddMedian1y: createSeriesPattern18(this, 'vocdd_median_1y'),
|
||||
hodlBank: createSeriesPattern18(this, 'hodl_bank'),
|
||||
},
|
||||
},
|
||||
coinflow: {
|
||||
ageRange: {
|
||||
under1h: createMobilitySpendingSupplyPattern(this, 'utxos_under_1h_old'),
|
||||
_1hTo1d: createMobilitySpendingSupplyPattern(this, 'utxos_1h_to_1d_old'),
|
||||
_1dTo1w: createMobilitySpendingSupplyPattern(this, 'utxos_1d_to_1w_old'),
|
||||
_1wTo1m: createMobilitySpendingSupplyPattern(this, 'utxos_1w_to_1m_old'),
|
||||
_1mTo2m: createMobilitySpendingSupplyPattern(this, 'utxos_1m_to_2m_old'),
|
||||
_2mTo3m: createMobilitySpendingSupplyPattern(this, 'utxos_2m_to_3m_old'),
|
||||
_3mTo4m: createMobilitySpendingSupplyPattern(this, 'utxos_3m_to_4m_old'),
|
||||
_4mTo5m: createMobilitySpendingSupplyPattern(this, 'utxos_4m_to_5m_old'),
|
||||
_5mTo6m: createMobilitySpendingSupplyPattern(this, 'utxos_5m_to_6m_old'),
|
||||
_6mTo9m: createMobilitySpendingSupplyPattern(this, 'utxos_6m_to_9m_old'),
|
||||
_9mTo1y: createMobilitySpendingSupplyPattern(this, 'utxos_9m_to_1y_old'),
|
||||
_1yTo18m: createMobilitySpendingSupplyPattern(this, 'utxos_1y_to_18m_old'),
|
||||
_18mTo2y: createMobilitySpendingSupplyPattern(this, 'utxos_18m_to_2y_old'),
|
||||
_2yTo3y: createMobilitySpendingSupplyPattern(this, 'utxos_2y_to_3y_old'),
|
||||
_3yTo4y: createMobilitySpendingSupplyPattern(this, 'utxos_3y_to_4y_old'),
|
||||
_4yTo5y: createMobilitySpendingSupplyPattern(this, 'utxos_4y_to_5y_old'),
|
||||
_5yTo6y: createMobilitySpendingSupplyPattern(this, 'utxos_5y_to_6y_old'),
|
||||
_6yTo7y: createMobilitySpendingSupplyPattern(this, 'utxos_6y_to_7y_old'),
|
||||
_7yTo8y: createMobilitySpendingSupplyPattern(this, 'utxos_7y_to_8y_old'),
|
||||
_8yTo10y: createMobilitySpendingSupplyPattern(this, 'utxos_8y_to_10y_old'),
|
||||
_10yTo12y: createMobilitySpendingSupplyPattern(this, 'utxos_10y_to_12y_old'),
|
||||
_12yTo15y: createMobilitySpendingSupplyPattern(this, 'utxos_12y_to_15y_old'),
|
||||
over15y: createMobilitySpendingSupplyPattern(this, 'utxos_over_15y_old'),
|
||||
},
|
||||
supply: {
|
||||
mobile: {
|
||||
btc: createSeriesPattern1(this, 'mobile_supply'),
|
||||
sats: createSeriesPattern1(this, 'mobile_supply_sats'),
|
||||
usd: createSeriesPattern1(this, 'mobile_supply_usd'),
|
||||
cents: createSeriesPattern1(this, 'mobile_supply_cents'),
|
||||
inLoss: createSharePattern2(this, 'coinflow_supply_in_loss_share'),
|
||||
coinflow: {
|
||||
ageRange: {
|
||||
under1h: createMobilitySpendingSupplyPattern(this, 'utxos_under_1h_old'),
|
||||
_1hTo1d: createMobilitySpendingSupplyPattern(this, 'utxos_1h_to_1d_old'),
|
||||
_1dTo1w: createMobilitySpendingSupplyPattern(this, 'utxos_1d_to_1w_old'),
|
||||
_1wTo1m: createMobilitySpendingSupplyPattern(this, 'utxos_1w_to_1m_old'),
|
||||
_1mTo2m: createMobilitySpendingSupplyPattern(this, 'utxos_1m_to_2m_old'),
|
||||
_2mTo3m: createMobilitySpendingSupplyPattern(this, 'utxos_2m_to_3m_old'),
|
||||
_3mTo4m: createMobilitySpendingSupplyPattern(this, 'utxos_3m_to_4m_old'),
|
||||
_4mTo5m: createMobilitySpendingSupplyPattern(this, 'utxos_4m_to_5m_old'),
|
||||
_5mTo6m: createMobilitySpendingSupplyPattern(this, 'utxos_5m_to_6m_old'),
|
||||
_6mTo9m: createMobilitySpendingSupplyPattern(this, 'utxos_6m_to_9m_old'),
|
||||
_9mTo1y: createMobilitySpendingSupplyPattern(this, 'utxos_9m_to_1y_old'),
|
||||
_1yTo18m: createMobilitySpendingSupplyPattern(this, 'utxos_1y_to_18m_old'),
|
||||
_18mTo2y: createMobilitySpendingSupplyPattern(this, 'utxos_18m_to_2y_old'),
|
||||
_2yTo3y: createMobilitySpendingSupplyPattern(this, 'utxos_2y_to_3y_old'),
|
||||
_3yTo4y: createMobilitySpendingSupplyPattern(this, 'utxos_3y_to_4y_old'),
|
||||
_4yTo5y: createMobilitySpendingSupplyPattern(this, 'utxos_4y_to_5y_old'),
|
||||
_5yTo6y: createMobilitySpendingSupplyPattern(this, 'utxos_5y_to_6y_old'),
|
||||
_6yTo7y: createMobilitySpendingSupplyPattern(this, 'utxos_6y_to_7y_old'),
|
||||
_7yTo8y: createMobilitySpendingSupplyPattern(this, 'utxos_7y_to_8y_old'),
|
||||
_8yTo10y: createMobilitySpendingSupplyPattern(this, 'utxos_8y_to_10y_old'),
|
||||
_10yTo12y: createMobilitySpendingSupplyPattern(this, 'utxos_10y_to_12y_old'),
|
||||
_12yTo15y: createMobilitySpendingSupplyPattern(this, 'utxos_12y_to_15y_old'),
|
||||
over15y: createMobilitySpendingSupplyPattern(this, 'utxos_over_15y_old'),
|
||||
},
|
||||
immobile: createBtcCentsSatsUsdPattern(this, 'immobile_supply'),
|
||||
supply: {
|
||||
mobile: {
|
||||
btc: createSeriesPattern1(this, 'mobile_supply'),
|
||||
sats: createSeriesPattern1(this, 'mobile_supply_sats'),
|
||||
usd: createSeriesPattern1(this, 'mobile_supply_usd'),
|
||||
cents: createSeriesPattern1(this, 'mobile_supply_cents'),
|
||||
inLoss: createSharePattern2(this, 'coinflow_supply_in_loss_share'),
|
||||
},
|
||||
immobile: createBtcCentsSatsUsdPattern(this, 'immobile_supply'),
|
||||
},
|
||||
horizon: {
|
||||
_8y: createSupplyPattern(this, 'coinflow_8y_supply_in_loss_share'),
|
||||
_4y: createSupplyPattern(this, 'coinflow_4y_supply_in_loss_share'),
|
||||
_2y: createSupplyPattern(this, 'coinflow_2y_supply_in_loss_share'),
|
||||
_1y: createSupplyPattern(this, 'coinflow_1y_supply_in_loss_share'),
|
||||
_6m: createSupplyPattern(this, 'coinflow_6m_supply_in_loss_share'),
|
||||
_3m: createSupplyPattern(this, 'coinflow_3m_supply_in_loss_share'),
|
||||
_1m: createSupplyPattern(this, 'coinflow_1m_supply_in_loss_share'),
|
||||
},
|
||||
cap: createCentsUsdPattern3(this, 'coinflow_cap'),
|
||||
price: createCentsPpmRatioSatsUsdPattern(this, 'coinflow_price'),
|
||||
},
|
||||
horizon: {
|
||||
_8y: createSupplyPattern(this, 'coinflow_8y_supply_in_loss_share'),
|
||||
_4y: createSupplyPattern(this, 'coinflow_4y_supply_in_loss_share'),
|
||||
_2y: createSupplyPattern(this, 'coinflow_2y_supply_in_loss_share'),
|
||||
_1y: createSupplyPattern(this, 'coinflow_1y_supply_in_loss_share'),
|
||||
_6m: createSupplyPattern(this, 'coinflow_6m_supply_in_loss_share'),
|
||||
_3m: createSupplyPattern(this, 'coinflow_3m_supply_in_loss_share'),
|
||||
_1m: createSupplyPattern(this, 'coinflow_1m_supply_in_loss_share'),
|
||||
},
|
||||
cap: createCentsUsdPattern3(this, 'coinflow_cap'),
|
||||
price: createCentsPpmRatioSatsUsdPattern(this, 'coinflow_price'),
|
||||
},
|
||||
bedrock: {
|
||||
raw: createFloorLevelLossPattern(this, 'bedrock_raw'),
|
||||
cointime: createFloorLevelLossPattern(this, 'bedrock_cointime'),
|
||||
coinflow: createFloorLevelLossPattern(this, 'bedrock_coinflow'),
|
||||
coinflow8y: createFloorLevelLossPattern(this, 'bedrock_coinflow_8y'),
|
||||
coinflow4y: createFloorLevelLossPattern(this, 'bedrock_coinflow_4y'),
|
||||
coinflow2y: createFloorLevelLossPattern(this, 'bedrock_coinflow_2y'),
|
||||
coinflow1y: createFloorLevelLossPattern(this, 'bedrock_coinflow_1y'),
|
||||
coinflow6m: createFloorLevelLossPattern(this, 'bedrock_coinflow_6m'),
|
||||
coinflow3m: createFloorLevelLossPattern(this, 'bedrock_coinflow_3m'),
|
||||
coinflow1m: createFloorLevelLossPattern(this, 'bedrock_coinflow_1m'),
|
||||
models: {
|
||||
bedrock: {
|
||||
raw: createFloorLevelLossPattern(this, 'bedrock_raw'),
|
||||
cointime: createFloorLevelLossPattern(this, 'bedrock_cointime'),
|
||||
coinflow: createFloorLevelLossPattern(this, 'bedrock_coinflow'),
|
||||
coinflow8y: createFloorLevelLossPattern(this, 'bedrock_coinflow_8y'),
|
||||
coinflow4y: createFloorLevelLossPattern(this, 'bedrock_coinflow_4y'),
|
||||
coinflow2y: createFloorLevelLossPattern(this, 'bedrock_coinflow_2y'),
|
||||
coinflow1y: createFloorLevelLossPattern(this, 'bedrock_coinflow_1y'),
|
||||
coinflow6m: createFloorLevelLossPattern(this, 'bedrock_coinflow_6m'),
|
||||
coinflow3m: createFloorLevelLossPattern(this, 'bedrock_coinflow_3m'),
|
||||
coinflow1m: createFloorLevelLossPattern(this, 'bedrock_coinflow_1m'),
|
||||
},
|
||||
capitalSentiment: {
|
||||
phase: createSeriesPattern1(this, 'capital_sentiment_phase'),
|
||||
score: createSeriesPattern1(this, 'capital_sentiment_score'),
|
||||
},
|
||||
rarityMeter: {
|
||||
components: {
|
||||
realizedPrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'realized_price'),
|
||||
capitalizedPrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'capitalized_price'),
|
||||
sthRealizedPrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'sth_realized_price'),
|
||||
sthCapitalizedPrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'sth_capitalized_price'),
|
||||
lthRealizedPrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'lth_realized_price'),
|
||||
lthCapitalizedPrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'lth_capitalized_price'),
|
||||
over6mRealizedPrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'over_6m_realized_price'),
|
||||
over4mRealizedPrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'over_4m_realized_price'),
|
||||
under4mRealizedPrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'under_4m_realized_price'),
|
||||
under6mRealizedPrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'under_6m_realized_price'),
|
||||
vaultedPrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'vaulted_price'),
|
||||
activePrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'active_price'),
|
||||
trueMarketMeanPrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'true_market_mean_price'),
|
||||
cointimePrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'cointime_price'),
|
||||
coinflowPrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'coinflow_price'),
|
||||
},
|
||||
extremes: {
|
||||
coinsInLoss: {
|
||||
threshold: createSeriesPattern1(this, 'rarity_meter_coins_in_loss_threshold'),
|
||||
tail: createPercentPpmRatioPattern2(this, 'rarity_meter_coins_in_loss_tail'),
|
||||
rank: createSeriesPattern1(this, 'rarity_meter_coins_in_loss_rank'),
|
||||
},
|
||||
profitTaking: createRankTailThresholdPattern(this, 'rarity_meter_profit_taking'),
|
||||
capitulation: createRankTailThresholdPattern(this, 'rarity_meter_capitulation'),
|
||||
peakRegret: createRankTailThresholdPattern(this, 'rarity_meter_peak_regret'),
|
||||
sellerExhaustion: {
|
||||
threshold: createSeriesPattern1(this, 'rarity_meter_seller_exhaustion_threshold'),
|
||||
tail: createPercentPpmRatioPattern2(this, 'rarity_meter_seller_exhaustion_tail'),
|
||||
rank: createSeriesPattern1(this, 'rarity_meter_seller_exhaustion_rank'),
|
||||
},
|
||||
},
|
||||
full: createIndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern(this, 'rarity_meter'),
|
||||
local: createIndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern(this, 'local_rarity_meter'),
|
||||
cycle: createIndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern(this, 'cycle_rarity_meter'),
|
||||
},
|
||||
},
|
||||
constants: {
|
||||
_0: createSeriesPattern1(this, 'constant_0'),
|
||||
@@ -10235,28 +10352,6 @@ class BrkClient extends BrkClientBase {
|
||||
},
|
||||
stockToFlow: createSeriesPattern1(this, 'stock_to_flow'),
|
||||
sellerExhaustion: createSeriesPattern1(this, 'seller_exhaustion'),
|
||||
rarityMeter: {
|
||||
components: {
|
||||
realizedPrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'realized_price'),
|
||||
capitalizedPrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'capitalized_price'),
|
||||
sthRealizedPrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'sth_realized_price'),
|
||||
sthCapitalizedPrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'sth_capitalized_price'),
|
||||
lthRealizedPrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'lth_realized_price'),
|
||||
lthCapitalizedPrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'lth_capitalized_price'),
|
||||
over6mRealizedPrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'over_6m_realized_price'),
|
||||
over4mRealizedPrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'over_4m_realized_price'),
|
||||
under4mRealizedPrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'under_4m_realized_price'),
|
||||
under6mRealizedPrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'under_6m_realized_price'),
|
||||
vaultedPrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'vaulted_price'),
|
||||
activePrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'active_price'),
|
||||
trueMarketMeanPrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'true_market_mean_price'),
|
||||
cointimePrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'cointime_price'),
|
||||
coinflowPrice: createPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(this, 'coinflow_price'),
|
||||
},
|
||||
full: createIndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern(this, 'rarity_meter'),
|
||||
local: createIndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern(this, 'local_rarity_meter'),
|
||||
cycle: createIndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern(this, 'cycle_rarity_meter'),
|
||||
},
|
||||
},
|
||||
investing: {
|
||||
satsPerDay: createSeriesPattern18(this, 'dca_sats_per_day'),
|
||||
@@ -11086,6 +11181,11 @@ class BrkClient extends BrkClientBase {
|
||||
},
|
||||
},
|
||||
},
|
||||
cointime: {
|
||||
activity: {
|
||||
coinblocksDestroyed: createAverageBlockCumulativeSumPattern(this, 'coinblocks_destroyed'),
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -94,6 +94,11 @@ TxVersionRaw = int
|
||||
# Reconstruction is a single pass: for each entry, either copy
|
||||
# `prior[idx]` or append the inline body.
|
||||
BlockTemplateDiffEntry = Union[int, "Transaction"]
|
||||
# Investor phase from the Capital Sentiment model.
|
||||
#
|
||||
# Codes are explicit because phase values are persisted. Code `0` represents
|
||||
# unavailable model inputs and is therefore not a phase.
|
||||
CapitalSentimentPhase = Literal["raging_bull", "bull", "cautious_bull", "hopeful_bull", "early_bull", "weak_bull", "limbo", "deep_bear", "bear", "early_bear"]
|
||||
# Unsigned cents (u64) - for values that should never be negative.
|
||||
# Used for invested capital, realized cap, etc.
|
||||
# `u64::MAX` is reserved as a NaN sentinel.
|
||||
@@ -4068,6 +4073,15 @@ class PpmPriceRatioPattern:
|
||||
self.price: CentsSatsUsdPattern = CentsSatsUsdPattern(client, _m(acc, disc))
|
||||
self.ratio: SeriesPattern1[StoredF32] = SeriesPattern1(client, _m(acc, f'ratio_{disc}'))
|
||||
|
||||
class RankTailThresholdPattern:
|
||||
"""Pattern struct for repeated tree structure."""
|
||||
|
||||
def __init__(self, client: BrkClient, acc: str):
|
||||
"""Create pattern node with accumulated series name."""
|
||||
self.rank: SeriesPattern1[StoredI8] = SeriesPattern1(client, _m(acc, 'rank'))
|
||||
self.tail: PercentPpmRatioPattern2 = PercentPpmRatioPattern2(client, _m(acc, 'tail'))
|
||||
self.threshold: SeriesPattern1[Dollars] = SeriesPattern1(client, _m(acc, 'threshold'))
|
||||
|
||||
class RatioTransferValuePattern:
|
||||
"""Pattern struct for repeated tree structure."""
|
||||
|
||||
@@ -4705,17 +4719,12 @@ class SeriesTree_Inputs_Raw:
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
self.first_txin_index: SeriesPattern18[TxInIndex] = SeriesPattern18(client, 'first_txin_index')
|
||||
self.outpoint: SeriesPattern20[OutPoint] = SeriesPattern20(client, 'outpoint')
|
||||
self.txout_index: SeriesPattern20[TxOutIndex] = SeriesPattern20(client, 'txout_index')
|
||||
self.value: SeriesPattern20[Sats] = SeriesPattern20(client, 'value')
|
||||
self.tx_index: SeriesPattern20[TxIndex] = SeriesPattern20(client, 'tx_index')
|
||||
self.output_type: SeriesPattern20[OutputType] = SeriesPattern20(client, 'output_type')
|
||||
self.type_index: SeriesPattern20[TypeIndex] = SeriesPattern20(client, 'type_index')
|
||||
|
||||
class SeriesTree_Inputs_Spent:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
self.txout_index: SeriesPattern20[TxOutIndex] = SeriesPattern20(client, 'txout_index')
|
||||
self.value: SeriesPattern20[Sats] = SeriesPattern20(client, 'value')
|
||||
|
||||
class SeriesTree_Inputs_ByType_InputCount:
|
||||
"""Series tree node."""
|
||||
|
||||
@@ -4780,7 +4789,6 @@ class SeriesTree_Inputs:
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
self.raw: SeriesTree_Inputs_Raw = SeriesTree_Inputs_Raw(client)
|
||||
self.spent: SeriesTree_Inputs_Spent = SeriesTree_Inputs_Spent(client)
|
||||
self.count: CumulativeRollingSumPattern = CumulativeRollingSumPattern(client, 'input_count')
|
||||
self.per_sec: _1m1w1y24hPattern[StoredF32] = _1m1w1y24hPattern(client, 'inputs_per_sec')
|
||||
self.by_type: SeriesTree_Inputs_ByType = SeriesTree_Inputs_ByType(client)
|
||||
@@ -5312,7 +5320,7 @@ class SeriesTree_Mining:
|
||||
self.rewards: SeriesTree_Mining_Rewards = SeriesTree_Mining_Rewards(client)
|
||||
self.hashrate: SeriesTree_Mining_Hashrate = SeriesTree_Mining_Hashrate(client)
|
||||
|
||||
class SeriesTree_Cointime_Activity:
|
||||
class SeriesTree_Frameworks_Cointime_Activity:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
@@ -5321,9 +5329,8 @@ class SeriesTree_Cointime_Activity:
|
||||
self.liveliness: SeriesPattern1[StoredF64] = SeriesPattern1(client, 'liveliness')
|
||||
self.vaultedness: SeriesPattern1[StoredF64] = SeriesPattern1(client, 'vaultedness')
|
||||
self.ratio: SeriesPattern1[StoredF64] = SeriesPattern1(client, 'activity_to_vaultedness')
|
||||
self.coinblocks_destroyed: AverageBlockCumulativeSumPattern[StoredF64] = AverageBlockCumulativeSumPattern(client, 'coinblocks_destroyed')
|
||||
|
||||
class SeriesTree_Cointime_AgeRange:
|
||||
class SeriesTree_Frameworks_Cointime_AgeRange:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
@@ -5351,7 +5358,7 @@ class SeriesTree_Cointime_AgeRange:
|
||||
self._12y_to_15y: CoindaysLivelinessRatioSupplyVaultednessPattern = CoindaysLivelinessRatioSupplyVaultednessPattern(client, 'utxos_12y_to_15y_old')
|
||||
self.over_15y: CoindaysLivelinessRatioSupplyVaultednessPattern = CoindaysLivelinessRatioSupplyVaultednessPattern(client, 'utxos_over_15y_old')
|
||||
|
||||
class SeriesTree_Cointime_Supply_Active:
|
||||
class SeriesTree_Frameworks_Cointime_Supply_Active:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
@@ -5361,14 +5368,14 @@ class SeriesTree_Cointime_Supply_Active:
|
||||
self.cents: SeriesPattern1[Cents] = SeriesPattern1(client, 'active_supply_cents')
|
||||
self.in_loss: SharePattern2 = SharePattern2(client, 'cointime_supply_in_loss_share')
|
||||
|
||||
class SeriesTree_Cointime_Supply:
|
||||
class SeriesTree_Frameworks_Cointime_Supply:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
self.vaulted: BtcCentsSatsUsdPattern = BtcCentsSatsUsdPattern(client, 'vaulted_supply')
|
||||
self.active: SeriesTree_Cointime_Supply_Active = SeriesTree_Cointime_Supply_Active(client)
|
||||
self.active: SeriesTree_Frameworks_Cointime_Supply_Active = SeriesTree_Frameworks_Cointime_Supply_Active(client)
|
||||
|
||||
class SeriesTree_Cointime_Value:
|
||||
class SeriesTree_Frameworks_Cointime_Value:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
@@ -5377,7 +5384,7 @@ class SeriesTree_Cointime_Value:
|
||||
self.stored: AverageBlockCumulativeSumPattern[StoredF64] = AverageBlockCumulativeSumPattern(client, 'cointime_value_stored')
|
||||
self.vocdd: AverageBlockCumulativeSumPattern[StoredF64] = AverageBlockCumulativeSumPattern(client, 'vocdd')
|
||||
|
||||
class SeriesTree_Cointime_Cap:
|
||||
class SeriesTree_Frameworks_Cointime_Cap:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
@@ -5388,7 +5395,7 @@ class SeriesTree_Cointime_Cap:
|
||||
self.cointime: CentsUsdPattern3 = CentsUsdPattern3(client, 'cointime_cap')
|
||||
self.aviv: PpmRatioPattern2 = PpmRatioPattern2(client, 'aviv_ratio')
|
||||
|
||||
class SeriesTree_Cointime_Prices:
|
||||
class SeriesTree_Frameworks_Cointime_Prices:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
@@ -5397,7 +5404,7 @@ class SeriesTree_Cointime_Prices:
|
||||
self.true_market_mean: CentsPpmRatioSatsUsdPattern = CentsPpmRatioSatsUsdPattern(client, 'true_market_mean')
|
||||
self.cointime: CentsPpmRatioSatsUsdPattern = CentsPpmRatioSatsUsdPattern(client, 'cointime_price')
|
||||
|
||||
class SeriesTree_Cointime_Adjusted:
|
||||
class SeriesTree_Frameworks_Cointime_Adjusted:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
@@ -5405,7 +5412,7 @@ class SeriesTree_Cointime_Adjusted:
|
||||
self.tx_velocity_native: SeriesPattern1[StoredF64] = SeriesPattern1(client, 'cointime_adj_tx_velocity_btc')
|
||||
self.tx_velocity_fiat: SeriesPattern1[StoredF64] = SeriesPattern1(client, 'cointime_adj_tx_velocity_usd')
|
||||
|
||||
class SeriesTree_Cointime_ReserveRisk:
|
||||
class SeriesTree_Frameworks_Cointime_ReserveRisk:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
@@ -5413,20 +5420,20 @@ class SeriesTree_Cointime_ReserveRisk:
|
||||
self.vocdd_median_1y: SeriesPattern18[StoredF64] = SeriesPattern18(client, 'vocdd_median_1y')
|
||||
self.hodl_bank: SeriesPattern18[StoredF64] = SeriesPattern18(client, 'hodl_bank')
|
||||
|
||||
class SeriesTree_Cointime:
|
||||
class SeriesTree_Frameworks_Cointime:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
self.activity: SeriesTree_Cointime_Activity = SeriesTree_Cointime_Activity(client)
|
||||
self.age_range: SeriesTree_Cointime_AgeRange = SeriesTree_Cointime_AgeRange(client)
|
||||
self.supply: SeriesTree_Cointime_Supply = SeriesTree_Cointime_Supply(client)
|
||||
self.value: SeriesTree_Cointime_Value = SeriesTree_Cointime_Value(client)
|
||||
self.cap: SeriesTree_Cointime_Cap = SeriesTree_Cointime_Cap(client)
|
||||
self.prices: SeriesTree_Cointime_Prices = SeriesTree_Cointime_Prices(client)
|
||||
self.adjusted: SeriesTree_Cointime_Adjusted = SeriesTree_Cointime_Adjusted(client)
|
||||
self.reserve_risk: SeriesTree_Cointime_ReserveRisk = SeriesTree_Cointime_ReserveRisk(client)
|
||||
self.activity: SeriesTree_Frameworks_Cointime_Activity = SeriesTree_Frameworks_Cointime_Activity(client)
|
||||
self.age_range: SeriesTree_Frameworks_Cointime_AgeRange = SeriesTree_Frameworks_Cointime_AgeRange(client)
|
||||
self.supply: SeriesTree_Frameworks_Cointime_Supply = SeriesTree_Frameworks_Cointime_Supply(client)
|
||||
self.value: SeriesTree_Frameworks_Cointime_Value = SeriesTree_Frameworks_Cointime_Value(client)
|
||||
self.cap: SeriesTree_Frameworks_Cointime_Cap = SeriesTree_Frameworks_Cointime_Cap(client)
|
||||
self.prices: SeriesTree_Frameworks_Cointime_Prices = SeriesTree_Frameworks_Cointime_Prices(client)
|
||||
self.adjusted: SeriesTree_Frameworks_Cointime_Adjusted = SeriesTree_Frameworks_Cointime_Adjusted(client)
|
||||
self.reserve_risk: SeriesTree_Frameworks_Cointime_ReserveRisk = SeriesTree_Frameworks_Cointime_ReserveRisk(client)
|
||||
|
||||
class SeriesTree_Coinflow_AgeRange:
|
||||
class SeriesTree_Frameworks_Coinflow_AgeRange:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
@@ -5454,7 +5461,7 @@ class SeriesTree_Coinflow_AgeRange:
|
||||
self._12y_to_15y: MobilitySpendingSupplyPattern = MobilitySpendingSupplyPattern(client, 'utxos_12y_to_15y_old')
|
||||
self.over_15y: MobilitySpendingSupplyPattern = MobilitySpendingSupplyPattern(client, 'utxos_over_15y_old')
|
||||
|
||||
class SeriesTree_Coinflow_Supply_Mobile:
|
||||
class SeriesTree_Frameworks_Coinflow_Supply_Mobile:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
@@ -5464,14 +5471,14 @@ class SeriesTree_Coinflow_Supply_Mobile:
|
||||
self.cents: SeriesPattern1[Cents] = SeriesPattern1(client, 'mobile_supply_cents')
|
||||
self.in_loss: SharePattern2 = SharePattern2(client, 'coinflow_supply_in_loss_share')
|
||||
|
||||
class SeriesTree_Coinflow_Supply:
|
||||
class SeriesTree_Frameworks_Coinflow_Supply:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
self.mobile: SeriesTree_Coinflow_Supply_Mobile = SeriesTree_Coinflow_Supply_Mobile(client)
|
||||
self.mobile: SeriesTree_Frameworks_Coinflow_Supply_Mobile = SeriesTree_Frameworks_Coinflow_Supply_Mobile(client)
|
||||
self.immobile: BtcCentsSatsUsdPattern = BtcCentsSatsUsdPattern(client, 'immobile_supply')
|
||||
|
||||
class SeriesTree_Coinflow_Horizon:
|
||||
class SeriesTree_Frameworks_Coinflow_Horizon:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
@@ -5483,17 +5490,24 @@ class SeriesTree_Coinflow_Horizon:
|
||||
self._3m: SupplyPattern = SupplyPattern(client, 'coinflow_3m_supply_in_loss_share')
|
||||
self._1m: SupplyPattern = SupplyPattern(client, 'coinflow_1m_supply_in_loss_share')
|
||||
|
||||
class SeriesTree_Coinflow:
|
||||
class SeriesTree_Frameworks_Coinflow:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
self.age_range: SeriesTree_Coinflow_AgeRange = SeriesTree_Coinflow_AgeRange(client)
|
||||
self.supply: SeriesTree_Coinflow_Supply = SeriesTree_Coinflow_Supply(client)
|
||||
self.horizon: SeriesTree_Coinflow_Horizon = SeriesTree_Coinflow_Horizon(client)
|
||||
self.age_range: SeriesTree_Frameworks_Coinflow_AgeRange = SeriesTree_Frameworks_Coinflow_AgeRange(client)
|
||||
self.supply: SeriesTree_Frameworks_Coinflow_Supply = SeriesTree_Frameworks_Coinflow_Supply(client)
|
||||
self.horizon: SeriesTree_Frameworks_Coinflow_Horizon = SeriesTree_Frameworks_Coinflow_Horizon(client)
|
||||
self.cap: CentsUsdPattern3 = CentsUsdPattern3(client, 'coinflow_cap')
|
||||
self.price: CentsPpmRatioSatsUsdPattern = CentsPpmRatioSatsUsdPattern(client, 'coinflow_price')
|
||||
|
||||
class SeriesTree_Bedrock:
|
||||
class SeriesTree_Frameworks:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
self.cointime: SeriesTree_Frameworks_Cointime = SeriesTree_Frameworks_Cointime(client)
|
||||
self.coinflow: SeriesTree_Frameworks_Coinflow = SeriesTree_Frameworks_Coinflow(client)
|
||||
|
||||
class SeriesTree_Models_Bedrock:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
@@ -5508,6 +5522,77 @@ class SeriesTree_Bedrock:
|
||||
self.coinflow_3m: FloorLevelLossPattern = FloorLevelLossPattern(client, 'bedrock_coinflow_3m')
|
||||
self.coinflow_1m: FloorLevelLossPattern = FloorLevelLossPattern(client, 'bedrock_coinflow_1m')
|
||||
|
||||
class SeriesTree_Models_CapitalSentiment:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
self.phase: SeriesPattern1[CapitalSentimentPhase] = SeriesPattern1(client, 'capital_sentiment_phase')
|
||||
self.score: SeriesPattern1[StoredI8] = SeriesPattern1(client, 'capital_sentiment_score')
|
||||
|
||||
class SeriesTree_Models_RarityMeter_Components:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
self.realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'realized_price')
|
||||
self.capitalized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'capitalized_price')
|
||||
self.sth_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'sth_realized_price')
|
||||
self.sth_capitalized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'sth_capitalized_price')
|
||||
self.lth_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'lth_realized_price')
|
||||
self.lth_capitalized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'lth_capitalized_price')
|
||||
self.over_6m_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'over_6m_realized_price')
|
||||
self.over_4m_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'over_4m_realized_price')
|
||||
self.under_4m_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'under_4m_realized_price')
|
||||
self.under_6m_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'under_6m_realized_price')
|
||||
self.vaulted_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'vaulted_price')
|
||||
self.active_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'active_price')
|
||||
self.true_market_mean_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'true_market_mean_price')
|
||||
self.cointime_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'cointime_price')
|
||||
self.coinflow_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'coinflow_price')
|
||||
|
||||
class SeriesTree_Models_RarityMeter_Extremes_CoinsInLoss:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
self.threshold: SeriesPattern1[Bitcoin] = SeriesPattern1(client, 'rarity_meter_coins_in_loss_threshold')
|
||||
self.tail: PercentPpmRatioPattern2 = PercentPpmRatioPattern2(client, 'rarity_meter_coins_in_loss_tail')
|
||||
self.rank: SeriesPattern1[StoredI8] = SeriesPattern1(client, 'rarity_meter_coins_in_loss_rank')
|
||||
|
||||
class SeriesTree_Models_RarityMeter_Extremes_SellerExhaustion:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
self.threshold: SeriesPattern1[StoredF32] = SeriesPattern1(client, 'rarity_meter_seller_exhaustion_threshold')
|
||||
self.tail: PercentPpmRatioPattern2 = PercentPpmRatioPattern2(client, 'rarity_meter_seller_exhaustion_tail')
|
||||
self.rank: SeriesPattern1[StoredI8] = SeriesPattern1(client, 'rarity_meter_seller_exhaustion_rank')
|
||||
|
||||
class SeriesTree_Models_RarityMeter_Extremes:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
self.coins_in_loss: SeriesTree_Models_RarityMeter_Extremes_CoinsInLoss = SeriesTree_Models_RarityMeter_Extremes_CoinsInLoss(client)
|
||||
self.profit_taking: RankTailThresholdPattern = RankTailThresholdPattern(client, 'rarity_meter_profit_taking')
|
||||
self.capitulation: RankTailThresholdPattern = RankTailThresholdPattern(client, 'rarity_meter_capitulation')
|
||||
self.peak_regret: RankTailThresholdPattern = RankTailThresholdPattern(client, 'rarity_meter_peak_regret')
|
||||
self.seller_exhaustion: SeriesTree_Models_RarityMeter_Extremes_SellerExhaustion = SeriesTree_Models_RarityMeter_Extremes_SellerExhaustion(client)
|
||||
|
||||
class SeriesTree_Models_RarityMeter:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
self.components: SeriesTree_Models_RarityMeter_Components = SeriesTree_Models_RarityMeter_Components(client)
|
||||
self.extremes: SeriesTree_Models_RarityMeter_Extremes = SeriesTree_Models_RarityMeter_Extremes(client)
|
||||
self.full: IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern = IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern(client, 'rarity_meter')
|
||||
self.local: IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern = IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern(client, 'local_rarity_meter')
|
||||
self.cycle: IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern = IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern(client, 'cycle_rarity_meter')
|
||||
|
||||
class SeriesTree_Models:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
self.bedrock: SeriesTree_Models_Bedrock = SeriesTree_Models_Bedrock(client)
|
||||
self.capital_sentiment: SeriesTree_Models_CapitalSentiment = SeriesTree_Models_CapitalSentiment(client)
|
||||
self.rarity_meter: SeriesTree_Models_RarityMeter = SeriesTree_Models_RarityMeter(client)
|
||||
|
||||
class SeriesTree_Constants:
|
||||
"""Series tree node."""
|
||||
|
||||
@@ -5807,35 +5892,6 @@ class SeriesTree_Indicators_Dormancy:
|
||||
self.supply_adj: SeriesPattern1[StoredF32] = SeriesPattern1(client, 'dormancy_supply_adj')
|
||||
self.flow: SeriesPattern1[StoredF32] = SeriesPattern1(client, 'dormancy_flow')
|
||||
|
||||
class SeriesTree_Indicators_RarityMeter_Components:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
self.realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'realized_price')
|
||||
self.capitalized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'capitalized_price')
|
||||
self.sth_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'sth_realized_price')
|
||||
self.sth_capitalized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'sth_capitalized_price')
|
||||
self.lth_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'lth_realized_price')
|
||||
self.lth_capitalized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'lth_capitalized_price')
|
||||
self.over_6m_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'over_6m_realized_price')
|
||||
self.over_4m_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'over_4m_realized_price')
|
||||
self.under_4m_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'under_4m_realized_price')
|
||||
self.under_6m_realized_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'under_6m_realized_price')
|
||||
self.vaulted_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'vaulted_price')
|
||||
self.active_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'active_price')
|
||||
self.true_market_mean_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'true_market_mean_price')
|
||||
self.cointime_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'cointime_price')
|
||||
self.coinflow_price: Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern = Pct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99Pattern(client, 'coinflow_price')
|
||||
|
||||
class SeriesTree_Indicators_RarityMeter:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
self.components: SeriesTree_Indicators_RarityMeter_Components = SeriesTree_Indicators_RarityMeter_Components(client)
|
||||
self.full: IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern = IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern(client, 'rarity_meter')
|
||||
self.local: IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern = IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern(client, 'local_rarity_meter')
|
||||
self.cycle: IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern = IndexPct0Pct1Pct10Pct2Pct20Pct30Pct40Pct5Pct50Pct60Pct70Pct80Pct90Pct95Pct98Pct99ScorePattern(client, 'cycle_rarity_meter')
|
||||
|
||||
class SeriesTree_Indicators:
|
||||
"""Series tree node."""
|
||||
|
||||
@@ -5850,7 +5906,6 @@ class SeriesTree_Indicators:
|
||||
self.dormancy: SeriesTree_Indicators_Dormancy = SeriesTree_Indicators_Dormancy(client)
|
||||
self.stock_to_flow: SeriesPattern1[StoredF32] = SeriesPattern1(client, 'stock_to_flow')
|
||||
self.seller_exhaustion: SeriesPattern1[StoredF32] = SeriesPattern1(client, 'seller_exhaustion')
|
||||
self.rarity_meter: SeriesTree_Indicators_RarityMeter = SeriesTree_Indicators_RarityMeter(client)
|
||||
|
||||
class SeriesTree_Investing_Period_DcaCostBasis:
|
||||
"""Series tree node."""
|
||||
@@ -6974,6 +7029,18 @@ class SeriesTree_Cohorts:
|
||||
self.utxo: SeriesTree_Cohorts_Utxo = SeriesTree_Cohorts_Utxo(client)
|
||||
self.addr: SeriesTree_Cohorts_Addr = SeriesTree_Cohorts_Addr(client)
|
||||
|
||||
class SeriesTree_Cointime_Activity:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
self.coinblocks_destroyed: AverageBlockCumulativeSumPattern[StoredF64] = AverageBlockCumulativeSumPattern(client, 'coinblocks_destroyed')
|
||||
|
||||
class SeriesTree_Cointime:
|
||||
"""Series tree node."""
|
||||
|
||||
def __init__(self, client: BrkClient, base_path: str = ''):
|
||||
self.activity: SeriesTree_Cointime_Activity = SeriesTree_Cointime_Activity(client)
|
||||
|
||||
class SeriesTree:
|
||||
"""Series tree node."""
|
||||
|
||||
@@ -6986,9 +7053,8 @@ class SeriesTree:
|
||||
self.scripts: SeriesTree_Scripts = SeriesTree_Scripts(client)
|
||||
self.op_return: SeriesTree_OpReturn = SeriesTree_OpReturn(client)
|
||||
self.mining: SeriesTree_Mining = SeriesTree_Mining(client)
|
||||
self.cointime: SeriesTree_Cointime = SeriesTree_Cointime(client)
|
||||
self.coinflow: SeriesTree_Coinflow = SeriesTree_Coinflow(client)
|
||||
self.bedrock: SeriesTree_Bedrock = SeriesTree_Bedrock(client)
|
||||
self.frameworks: SeriesTree_Frameworks = SeriesTree_Frameworks(client)
|
||||
self.models: SeriesTree_Models = SeriesTree_Models(client)
|
||||
self.constants: SeriesTree_Constants = SeriesTree_Constants(client)
|
||||
self.indexes: SeriesTree_Indexes = SeriesTree_Indexes(client)
|
||||
self.indicators: SeriesTree_Indicators = SeriesTree_Indicators(client)
|
||||
@@ -6998,6 +7064,7 @@ class SeriesTree:
|
||||
self.price: SeriesTree_Price = SeriesTree_Price(client)
|
||||
self.supply: SeriesTree_Supply = SeriesTree_Supply(client)
|
||||
self.cohorts: SeriesTree_Cohorts = SeriesTree_Cohorts(client)
|
||||
self.cointime: SeriesTree_Cointime = SeriesTree_Cointime(client)
|
||||
|
||||
class BrkClient(BrkClientBase):
|
||||
"""Main BRK client with series tree and API methods."""
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
- Version: `v0.3.6`
|
||||
- Base URL: https://bitview.space
|
||||
- Metrics: 57754
|
||||
- Metrics: 57781
|
||||
- Operations: 97
|
||||
|
||||
For machine-readable tool construction, use [https://bitview.space/openapi.json](https://bitview.space/openapi.json). For the complete source-derived series tree, use [https://bitview.space/api/series](https://bitview.space/api/series).
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
# Bitcoin Research Kit (BRK)
|
||||
|
||||
> Free, open-source Bitcoin analytics API and block explorer. 57754 on-chain time-series and 97 API operations. No authentication required.
|
||||
> Free, open-source Bitcoin analytics API and block explorer. 57781 on-chain time-series and 97 API operations. No authentication required.
|
||||
|
||||
## API
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
- Version: `v0.3.6`
|
||||
- Base URL: https://bitview.space
|
||||
- Metrics: 57754
|
||||
- Metrics: 57781
|
||||
- Operations: 97
|
||||
|
||||
For machine-readable tool construction, use [https://bitview.space/openapi.json](https://bitview.space/openapi.json). For the complete source-derived series tree, use [https://bitview.space/api/series](https://bitview.space/api/series).
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Bitcoin Research Kit (BRK)
|
||||
|
||||
> Free, open-source Bitcoin analytics API and block explorer. 57754 on-chain time-series and 97 API operations. No authentication required.
|
||||
> Free, open-source Bitcoin analytics API and block explorer. 57781 on-chain time-series and 97 API operations. No authentication required.
|
||||
|
||||
## API
|
||||
|
||||
|
||||
Reference in New Issue
Block a user