diff --git a/Cargo.lock b/Cargo.lock index 55bd8a9fc..cce60647b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -75,9 +75,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.18" +version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" dependencies = [ "anstyle", "anstyle-parse", @@ -90,33 +90,33 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" [[package]] name = "anstyle-parse" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" dependencies = [ "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.8" +version = "3.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6680de5231bd6ee4c6191b8a1325daa282b415391ec9d3a37bd34f2060dc73fa" +checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" dependencies = [ "anstyle", "once_cell_polyfill", @@ -273,6 +273,26 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" +[[package]] +name = "bincode" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" +dependencies = [ + "bincode_derive", + "serde", + "unty", +] + +[[package]] +name = "bincode_derive" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf95709a440f45e986983918d0e8a1f30a9b1df04918fc828670606804ac3c09" +dependencies = [ + "virtue", +] + [[package]] name = "bitcoin" version = "0.32.6" @@ -435,6 +455,7 @@ dependencies = [ name = "brk_core" version = "0.0.40" dependencies = [ + "bincode", "bitcoin", "bitcoincore-rpc", "byteview", @@ -567,8 +588,10 @@ dependencies = [ name = "brk_state" version = "0.0.40" dependencies = [ + "bincode", "brk_core", "brk_store", + "derive_deref", "fjall", "serde", "zerocopy", @@ -688,9 +711,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.25" +version = "1.2.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0fc897dc1e865cc67c0e05a836d9d3f1df3cbe442aa4a9473b18e12624a4951" +checksum = "956a5e21988b87f372569b66183b78babf23ebc2e744b733e4350a752c4dafac" dependencies = [ "jobserver", "libc", @@ -800,9 +823,9 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "compact_str" @@ -1390,9 +1413,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c293b6b3d21eca78250dc7dbebd6b9210ec5530e038cbfe0661b5c47ab06e8" +checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb" dependencies = [ "bytes", "futures-core", @@ -1597,9 +1620,9 @@ dependencies = [ [[package]] name = "liblzma-sys" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5839bad90c3cc2e0b8c4ed8296b80e86040240f81d46b9c0e9bc8dd51ddd3af1" +checksum = "01b9596486f6d60c3bbe644c0e1be1aa6ccc472ad630fe8927b456973d7cb736" dependencies = [ "cc", "libc", @@ -1608,9 +1631,9 @@ dependencies = [ [[package]] name = "libz-rs-sys" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6489ca9bd760fe9642d7644e827b0c9add07df89857b0416ee15c1cc1a3b8c5a" +checksum = "172a788537a2221661b480fee8dc5f96c580eb34fa88764d3205dc356c7e4221" dependencies = [ "zlib-rs", ] @@ -2217,9 +2240,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "petgraph" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a98c6720655620a521dcc722d0ad66cd8afd5d86e34a89ef691c50b7b24de06" +checksum = "54acf3a685220b533e437e264e4d932cfbdc4cc7ec0cd232ed73c08d03b8a7ca" dependencies = [ "fixedbitset", "hashbrown 0.15.3", @@ -2289,9 +2312,9 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "portable-atomic" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "portable-atomic-util" @@ -2657,9 +2680,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" dependencies = [ "serde", ] @@ -2977,9 +3000,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.22" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", "serde_spanned", @@ -2989,18 +3012,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.9" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.22.26" +version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap 2.9.0", "serde", @@ -3012,9 +3035,9 @@ dependencies = [ [[package]] name = "toml_write" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "tower" @@ -3078,9 +3101,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "1b1ffbcf9c6f6b99d386e7444eb608ba646ae452a36b39737deb9663b610f662" dependencies = [ "proc-macro2", "quote", @@ -3089,9 +3112,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", "valuable", @@ -3154,6 +3177,12 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +[[package]] +name = "unty" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" + [[package]] name = "utf8parse" version = "0.2.2" @@ -3195,6 +3224,12 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "virtue" +version = "0.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "051eb1abcf10076295e815102942cc58f9d5e3b4560e46e53c21e8ff6f3af7b1" + [[package]] name = "vsimd" version = "0.8.0" @@ -3513,9 +3548,9 @@ dependencies = [ [[package]] name = "zlib-rs" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "868b928d7949e09af2f6086dfc1e01936064cc7a819253bce650d4e2a2d63ba8" +checksum = "626bd9fa9734751fc50d6060752170984d7053f5a39061f524cda68023d4db8a" [[package]] name = "zopfli" diff --git a/Cargo.toml b/Cargo.toml index 830c00ed5..c7ebfe5cd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,6 +19,7 @@ inherits = "release" [workspace.dependencies] arc-swap = "1.7.1" axum = "0.8.4" +bincode = { version = "2.0.1", features = ["serde"] } bitcoin = { version = "0.32.6", features = ["serde"] } bitcoincore-rpc = "0.19.0" brk_cli = { version = "0", path = "crates/brk_cli" } @@ -45,6 +46,7 @@ log = { version = "0.4.27" } minreq = { version = "2.13.4", features = ["https", "serde_json"] } rayon = "1.10.0" serde = { version = "1.0.219" } +serde_bytes = "0.11.17" serde_derive = "1.0.219" serde_json = { version = "1.0.140", features = ["float_roundtrip"] } tabled = "0.20.0" diff --git a/crates/brk_cli/Cargo.toml b/crates/brk_cli/Cargo.toml index a7afe02eb..7958a20b4 100644 --- a/crates/brk_cli/Cargo.toml +++ b/crates/brk_cli/Cargo.toml @@ -26,7 +26,7 @@ log = { workspace = true } serde = { workspace = true } tabled = { workspace = true } tokio = { workspace = true } -toml = "0.8.22" +toml = "0.8.23" [[bin]] name = "brk" diff --git a/crates/brk_computer/src/lib.rs b/crates/brk_computer/src/lib.rs index 5ed1ad7f6..d40a0daf3 100644 --- a/crates/brk_computer/src/lib.rs +++ b/crates/brk_computer/src/lib.rs @@ -54,7 +54,6 @@ impl Computer { self.fetcher.is_some(), computation, self.format, - indexer.keyspace(), )?); Ok(()) } diff --git a/crates/brk_computer/src/vecs/mod.rs b/crates/brk_computer/src/vecs/mod.rs index 38038f35e..daafaba55 100644 --- a/crates/brk_computer/src/vecs/mod.rs +++ b/crates/brk_computer/src/vecs/mod.rs @@ -5,7 +5,6 @@ use brk_exit::Exit; use brk_fetcher::Fetcher; use brk_indexer::Indexer; use brk_vec::{AnyCollectableVec, Computation, Format}; -use fjall::TransactionalKeyspace; pub mod blocks; pub mod constants; @@ -42,7 +41,6 @@ impl Vecs { fetch: bool, computation: Computation, format: Format, - keyspace: &TransactionalKeyspace, ) -> color_eyre::Result { fs::create_dir_all(path)?; @@ -95,7 +93,6 @@ impl Vecs { computation, format, fetched.as_ref(), - keyspace, )?, transactions: transactions::Vecs::forced_import( path, diff --git a/crates/brk_computer/src/vecs/stateful/cohort.rs b/crates/brk_computer/src/vecs/stateful/cohort.rs index bc0fe2d56..c3ccc2215 100644 --- a/crates/brk_computer/src/vecs/stateful/cohort.rs +++ b/crates/brk_computer/src/vecs/stateful/cohort.rs @@ -11,7 +11,6 @@ use brk_vec::{ AnyCollectableVec, AnyIterableVec, AnyVec, Computation, EagerVec, Format, StoredIndex, VecIterator, }; -use fjall::TransactionalKeyspace; use crate::vecs::{ Indexes, fetched, @@ -129,8 +128,7 @@ impl Vecs { format: Format, version: Version, fetched: Option<&fetched::Vecs>, - keyspace: &TransactionalKeyspace, - stores_path: &Path, + states_path: &Path, compute_relative_to_all: bool, ) -> color_eyre::Result { let compute_dollars = fetched.is_some(); @@ -142,10 +140,8 @@ impl Vecs { let suffix = |s: &str| cohort_name.map_or(s.to_string(), |name| format!("{name}_{s}")); let state = CohortState::default_and_import( - keyspace, - stores_path, + states_path, cohort_name.unwrap_or_default(), - version + VERSION + Version::ZERO, compute_dollars, )?; @@ -671,7 +667,7 @@ impl Vecs { EagerVec::forced_import( path, &suffix("net_unrealized_profit_and_loss_relative_to_market_cap"), - version + VERSION + Version::ZERO, + version + VERSION + Version::ONE, format, ) .unwrap() @@ -683,7 +679,7 @@ impl Vecs { path, &suffix("net_unrealized_profit_and_loss_relative_to_market_cap"), true, - version + VERSION + Version::ZERO, + version + VERSION + Version::ONE, format, StorableVecGeneatorOptions::default().add_last(), ) @@ -740,7 +736,7 @@ impl Vecs { EagerVec::forced_import( path, &suffix("supply_even_relative_to_own_supply"), - version + VERSION + Version::ZERO, + version + VERSION + Version::ONE, format, ) .unwrap() @@ -749,7 +745,7 @@ impl Vecs { EagerVec::forced_import( path, &suffix("supply_in_loss_relative_to_own_supply"), - version + VERSION + Version::ZERO, + version + VERSION + Version::ONE, format, ) .unwrap() @@ -758,7 +754,7 @@ impl Vecs { EagerVec::forced_import( path, &suffix("supply_in_profit_relative_to_own_supply"), - version + VERSION + Version::ZERO, + version + VERSION + Version::ONE, format, ) .unwrap() @@ -768,7 +764,7 @@ impl Vecs { path, &suffix("supply_even_relative_to_own_supply"), true, - version + VERSION + Version::ZERO, + version + VERSION + Version::ONE, format, StorableVecGeneatorOptions::default().add_last(), ) @@ -779,7 +775,7 @@ impl Vecs { path, &suffix("supply_in_loss_relative_to_own_supply"), true, - version + VERSION + Version::ZERO, + version + VERSION + Version::ONE, format, StorableVecGeneatorOptions::default().add_last(), ) @@ -790,7 +786,7 @@ impl Vecs { path, &suffix("supply_in_profit_relative_to_own_supply"), true, - version + VERSION + Version::ZERO, + version + VERSION + Version::ONE, format, StorableVecGeneatorOptions::default().add_last(), ) @@ -801,7 +797,7 @@ impl Vecs { path, &suffix("supply_relative_to_circulating_supply"), true, - version + VERSION + Version::ZERO, + version + VERSION + Version::ONE, format, StorableVecGeneatorOptions::default().add_last(), ) @@ -813,7 +809,7 @@ impl Vecs { EagerVec::forced_import( path, &suffix("supply_even_relative_to_circulating_supply"), - version + VERSION + Version::ZERO, + version + VERSION + Version::ONE, format, ) .unwrap() @@ -824,7 +820,7 @@ impl Vecs { EagerVec::forced_import( path, &suffix("supply_in_loss_relative_to_circulating_supply"), - version + VERSION + Version::ZERO, + version + VERSION + Version::ONE, format, ) .unwrap() @@ -835,7 +831,7 @@ impl Vecs { EagerVec::forced_import( path, &suffix("supply_in_profit_relative_to_circulating_supply"), - version + VERSION + Version::ZERO, + version + VERSION + Version::ONE, format, ) .unwrap() @@ -847,7 +843,7 @@ impl Vecs { path, &suffix("supply_even_relative_to_circulating_supply"), true, - version + VERSION + Version::ZERO, + version + VERSION + Version::ONE, format, StorableVecGeneatorOptions::default().add_last(), ) @@ -860,7 +856,7 @@ impl Vecs { path, &suffix("supply_in_loss_relative_to_circulating_supply"), true, - version + VERSION + Version::ZERO, + version + VERSION + Version::ONE, format, StorableVecGeneatorOptions::default().add_last(), ) @@ -873,7 +869,7 @@ impl Vecs { path, &suffix("supply_in_profit_relative_to_circulating_supply"), true, - version + VERSION + Version::ZERO, + version + VERSION + Version::ONE, format, StorableVecGeneatorOptions::default().add_last(), ) @@ -986,8 +982,6 @@ impl Vecs { .into_iter() .unwrap_get_inner(prev_height); - self.state.price_to_amount.copy_db_to_puts(); - if let Some(height_to_realized_cap) = self.height_to_realized_cap.as_mut() { self.state.realized.as_mut().unwrap().cap = height_to_realized_cap .into_iter() @@ -1300,7 +1294,7 @@ impl Vecs { height, self.state .price_to_amount - .puts_first_key_value() + .first_key_value() .map(|(&dollars, _)| dollars) .unwrap_or(Dollars::NAN), exit, @@ -1312,7 +1306,7 @@ impl Vecs { height, self.state .price_to_amount - .puts_last_key_value() + .last_key_value() .map(|(&dollars, _)| dollars) .unwrap_or(Dollars::NAN), exit, @@ -2339,8 +2333,8 @@ impl Vecs { .unwrap() .compute_percentage( starting_indexes.height, - self.height_to_supply_even.as_ref().unwrap(), - &self.height_to_supply, + &self.height_to_supply_even_value.as_ref().unwrap().bitcoin, + &self.height_to_supply_value.bitcoin, exit, )?; self.height_to_supply_in_loss_relative_to_own_supply @@ -2348,8 +2342,12 @@ impl Vecs { .unwrap() .compute_percentage( starting_indexes.height, - self.height_to_supply_in_loss.as_ref().unwrap(), - &self.height_to_supply, + &self + .height_to_supply_in_loss_value + .as_ref() + .unwrap() + .bitcoin, + &self.height_to_supply_value.bitcoin, exit, )?; self.height_to_supply_in_profit_relative_to_own_supply @@ -2357,8 +2355,12 @@ impl Vecs { .unwrap() .compute_percentage( starting_indexes.height, - self.height_to_supply_even.as_ref().unwrap(), - &self.height_to_supply, + &self + .height_to_supply_in_profit_value + .as_ref() + .unwrap() + .bitcoin, + &self.height_to_supply_value.bitcoin, exit, )?; self.indexes_to_supply_even_relative_to_own_supply @@ -2372,8 +2374,14 @@ impl Vecs { |v, _, _, starting_indexes, exit| { v.compute_percentage( starting_indexes.dateindex, - self.dateindex_to_supply_even.as_ref().unwrap(), - self.indexes_to_supply.sats.dateindex.as_ref().unwrap(), + self.indexes_to_supply_even + .as_ref() + .unwrap() + .bitcoin + .dateindex + .as_ref() + .unwrap(), + self.indexes_to_supply.bitcoin.dateindex.as_ref().unwrap(), exit, ) }, @@ -2389,8 +2397,14 @@ impl Vecs { |v, _, _, starting_indexes, exit| { v.compute_percentage( starting_indexes.dateindex, - self.dateindex_to_supply_even.as_ref().unwrap(), - self.indexes_to_supply.sats.dateindex.as_ref().unwrap(), + self.indexes_to_supply_in_loss + .as_ref() + .unwrap() + .bitcoin + .dateindex + .as_ref() + .unwrap(), + self.indexes_to_supply.bitcoin.dateindex.as_ref().unwrap(), exit, ) }, @@ -2406,8 +2420,14 @@ impl Vecs { |v, _, _, starting_indexes, exit| { v.compute_percentage( starting_indexes.dateindex, - self.dateindex_to_supply_even.as_ref().unwrap(), - self.indexes_to_supply.sats.dateindex.as_ref().unwrap(), + self.indexes_to_supply_in_profit + .as_ref() + .unwrap() + .bitcoin + .dateindex + .as_ref() + .unwrap(), + self.indexes_to_supply.bitcoin.dateindex.as_ref().unwrap(), exit, ) }, diff --git a/crates/brk_computer/src/vecs/stateful/mod.rs b/crates/brk_computer/src/vecs/stateful/mod.rs index bb4182734..eb5126271 100644 --- a/crates/brk_computer/src/vecs/stateful/mod.rs +++ b/crates/brk_computer/src/vecs/stateful/mod.rs @@ -7,7 +7,6 @@ use brk_vec::{ AnyCollectableVec, AnyVec, BaseVecIterator, CollectableVec, Computation, EagerVec, Format, GenericStoredVec, StoredIndex, StoredVec, UnsafeSlice, VecIterator, }; -use fjall::TransactionalKeyspace; use log::info; use outputs::OutputCohorts; use rayon::prelude::*; @@ -29,7 +28,7 @@ use super::{ pub mod cohort; mod outputs; -const VERSION: Version = Version::new(4); +const VERSION: Version = Version::new(5); #[derive(Clone)] pub struct Vecs { @@ -50,15 +49,13 @@ impl Vecs { _computation: Computation, format: Format, fetched: Option<&fetched::Vecs>, - keyspace: &TransactionalKeyspace, ) -> color_eyre::Result { let compute_dollars = fetched.is_some(); let mut root_path = path.to_owned(); root_path.pop(); - let states_path = root_path.join("states"); root_path.pop(); - let stores_path = root_path.join("stores"); + let states_path = root_path.join("states"); Ok(Self { chain_state: StoredVec::forced_import( @@ -107,8 +104,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, false, )?, by_term: OutputsByTerm { @@ -119,8 +115,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, long: cohort::Vecs::forced_import( @@ -130,8 +125,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, }, @@ -143,8 +137,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _1w: cohort::Vecs::forced_import( @@ -154,8 +147,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _1m: cohort::Vecs::forced_import( @@ -165,8 +157,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _2m: cohort::Vecs::forced_import( @@ -176,8 +167,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _3m: cohort::Vecs::forced_import( @@ -187,8 +177,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _4m: cohort::Vecs::forced_import( @@ -198,8 +187,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _5m: cohort::Vecs::forced_import( @@ -209,8 +197,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _6m: cohort::Vecs::forced_import( @@ -220,8 +207,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _1y: cohort::Vecs::forced_import( @@ -231,8 +217,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _2y: cohort::Vecs::forced_import( @@ -242,8 +227,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _3y: cohort::Vecs::forced_import( @@ -253,8 +237,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _4y: cohort::Vecs::forced_import( @@ -264,8 +247,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _5y: cohort::Vecs::forced_import( @@ -275,8 +257,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _6y: cohort::Vecs::forced_import( @@ -286,8 +267,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _7y: cohort::Vecs::forced_import( @@ -297,8 +277,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _8y: cohort::Vecs::forced_import( @@ -308,8 +287,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _10y: cohort::Vecs::forced_import( @@ -319,8 +297,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _15y: cohort::Vecs::forced_import( @@ -330,8 +307,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, }, @@ -343,8 +319,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _1w: cohort::Vecs::forced_import( @@ -354,8 +329,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _1m: cohort::Vecs::forced_import( @@ -365,8 +339,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _2m: cohort::Vecs::forced_import( @@ -376,8 +349,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _3m: cohort::Vecs::forced_import( @@ -387,8 +359,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _4m: cohort::Vecs::forced_import( @@ -398,8 +369,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _5m: cohort::Vecs::forced_import( @@ -409,8 +379,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _6m: cohort::Vecs::forced_import( @@ -420,8 +389,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _1y: cohort::Vecs::forced_import( @@ -431,8 +399,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _2y: cohort::Vecs::forced_import( @@ -442,8 +409,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _3y: cohort::Vecs::forced_import( @@ -453,8 +419,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _4y: cohort::Vecs::forced_import( @@ -464,8 +429,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _5y: cohort::Vecs::forced_import( @@ -475,8 +439,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _6y: cohort::Vecs::forced_import( @@ -486,8 +449,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _7y: cohort::Vecs::forced_import( @@ -497,8 +459,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _8y: cohort::Vecs::forced_import( @@ -508,8 +469,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _10y: cohort::Vecs::forced_import( @@ -519,8 +479,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _15y: cohort::Vecs::forced_import( @@ -530,8 +489,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, }, @@ -543,8 +501,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _1d_to_1w: cohort::Vecs::forced_import( @@ -554,8 +511,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _1w_to_1m: cohort::Vecs::forced_import( @@ -565,8 +521,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _1m_to_2m: cohort::Vecs::forced_import( @@ -576,8 +531,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _2m_to_3m: cohort::Vecs::forced_import( @@ -587,8 +541,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _3m_to_4m: cohort::Vecs::forced_import( @@ -598,8 +551,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _4m_to_5m: cohort::Vecs::forced_import( @@ -609,8 +561,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _5m_to_6m: cohort::Vecs::forced_import( @@ -620,8 +571,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _6m_to_1y: cohort::Vecs::forced_import( @@ -631,8 +581,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _1y_to_2y: cohort::Vecs::forced_import( @@ -642,8 +591,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _2y_to_3y: cohort::Vecs::forced_import( @@ -653,8 +601,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _3y_to_4y: cohort::Vecs::forced_import( @@ -664,8 +611,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _4y_to_5y: cohort::Vecs::forced_import( @@ -675,8 +621,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _5y_to_6y: cohort::Vecs::forced_import( @@ -686,8 +631,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _6y_to_7y: cohort::Vecs::forced_import( @@ -697,8 +641,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _7y_to_8y: cohort::Vecs::forced_import( @@ -708,8 +651,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _8y_to_10y: cohort::Vecs::forced_import( @@ -719,8 +661,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _10y_to_15y: cohort::Vecs::forced_import( @@ -730,8 +671,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _15y_to_end: cohort::Vecs::forced_import( @@ -741,8 +681,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, }, @@ -754,8 +693,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _1: cohort::Vecs::forced_import( @@ -765,8 +703,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _2: cohort::Vecs::forced_import( @@ -776,8 +713,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _3: cohort::Vecs::forced_import( @@ -787,8 +723,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _4: cohort::Vecs::forced_import( @@ -798,8 +733,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, }, @@ -811,8 +745,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, from_1sat_to_10sats: cohort::Vecs::forced_import( @@ -822,8 +755,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, from_10sats_to_100sats: cohort::Vecs::forced_import( @@ -833,8 +765,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, from_100sats_to_1_000sats: cohort::Vecs::forced_import( @@ -844,8 +775,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, from_1_000sats_to_10_000sats: cohort::Vecs::forced_import( @@ -855,8 +785,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, from_10_000sats_to_100_000sats: cohort::Vecs::forced_import( @@ -866,8 +795,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, from_100_000sats_to_1_000_000sats: cohort::Vecs::forced_import( @@ -877,8 +805,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, from_1_000_000sats_to_10_000_000sats: cohort::Vecs::forced_import( @@ -888,8 +815,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, from_10_000_000sats_to_1btc: cohort::Vecs::forced_import( @@ -899,8 +825,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, from_1btc_to_10btc: cohort::Vecs::forced_import( @@ -910,8 +835,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, from_10btc_to_100btc: cohort::Vecs::forced_import( @@ -921,8 +845,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, from_100btc_to_1_000btc: cohort::Vecs::forced_import( @@ -932,8 +855,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, from_1_000btc_to_10_000btc: cohort::Vecs::forced_import( @@ -943,8 +865,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, from_10_000btc_to_100_000btc: cohort::Vecs::forced_import( @@ -954,8 +875,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, from_100_000btc: cohort::Vecs::forced_import( @@ -965,8 +885,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, }, @@ -978,8 +897,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _10_000sats: cohort::Vecs::forced_import( @@ -989,8 +907,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _1btc: cohort::Vecs::forced_import( @@ -1000,8 +917,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _10btc: cohort::Vecs::forced_import( @@ -1011,8 +927,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _100btc: cohort::Vecs::forced_import( @@ -1022,8 +937,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, }, @@ -1035,8 +949,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _1btc: cohort::Vecs::forced_import( @@ -1046,8 +959,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _10btc: cohort::Vecs::forced_import( @@ -1057,8 +969,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, _100btc: cohort::Vecs::forced_import( @@ -1068,8 +979,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, }, @@ -1174,8 +1084,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, p2pk33: cohort::Vecs::forced_import( @@ -1185,8 +1094,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, p2pkh: cohort::Vecs::forced_import( @@ -1196,8 +1104,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, p2ms: cohort::Vecs::forced_import( @@ -1207,8 +1114,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, p2sh: cohort::Vecs::forced_import( @@ -1218,8 +1124,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, p2wpkh: cohort::Vecs::forced_import( @@ -1229,8 +1134,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, p2wsh: cohort::Vecs::forced_import( @@ -1240,8 +1144,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, p2tr: cohort::Vecs::forced_import( @@ -1251,8 +1154,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, p2a: cohort::Vecs::forced_import( @@ -1262,8 +1164,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, empty: cohort::Vecs::forced_import( @@ -1273,8 +1174,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, unknown: cohort::Vecs::forced_import( @@ -1284,8 +1184,7 @@ impl Vecs { format, version + VERSION + Version::ZERO, fetched, - keyspace, - &stores_path, + &states_path, true, )?, }, @@ -1434,7 +1333,7 @@ impl Vecs { info!("Starting processing utxos from the start"); separate_utxo_vecs .par_iter_mut() - .try_for_each(|(_, v)| v.state.price_to_amount.reset_partition())?; + .try_for_each(|(_, v)| v.state.price_to_amount.reset())?; } let starting_height = starting_indexes .height diff --git a/crates/brk_computer/src/vecs/stateful/outputs.rs b/crates/brk_computer/src/vecs/stateful/outputs.rs index 4b6f5c9a9..312e8f46a 100644 --- a/crates/brk_computer/src/vecs/stateful/outputs.rs +++ b/crates/brk_computer/src/vecs/stateful/outputs.rs @@ -109,12 +109,8 @@ impl OutputCohorts for Outputs<(OutputFilter, cohort::Vecs)> { ); }); - sent.by_type - .spendable - .as_typed_vec() - .into_iter() - .filter(|(_, suply_state)| suply_state.utxos > 0) - .for_each(|(output_type, supply_state)| { + sent.by_type.spendable.as_typed_vec().into_iter().for_each( + |(output_type, supply_state)| { self.by_type.get_mut(output_type).1.state.send( supply_state, current_price, @@ -123,7 +119,8 @@ impl OutputCohorts for Outputs<(OutputFilter, cohort::Vecs)> { days_old_foat, older_than_hour, ) - }); + }, + ); sent.by_size_group .into_iter() diff --git a/crates/brk_core/Cargo.toml b/crates/brk_core/Cargo.toml index 4ee19867c..65813202b 100644 --- a/crates/brk_core/Cargo.toml +++ b/crates/brk_core/Cargo.toml @@ -8,6 +8,7 @@ homepage.workspace = true repository.workspace = true [dependencies] +bincode = { workspace = true } bitcoin = { workspace = true } bitcoincore-rpc = { workspace = true } byteview = { workspace = true } @@ -18,7 +19,7 @@ log = { workspace = true } rapidhash = "1.4.0" rlimit = "0.10.2" serde = { workspace = true } -serde_bytes = "0.11.17" +serde_bytes = { workspace = true } serde_json = { workspace = true } zerocopy = { workspace = true } zerocopy-derive = { workspace = true } diff --git a/crates/brk_core/src/enums/error.rs b/crates/brk_core/src/enums/error.rs index a5da19113..60ef08d1b 100644 --- a/crates/brk_core/src/enums/error.rs +++ b/crates/brk_core/src/enums/error.rs @@ -15,6 +15,8 @@ pub enum Error { Fjall(fjall::Error), SystemTimeError(time::SystemTimeError), ZeroCopyError, + BincodeEncodeError(bincode::error::EncodeError), + BincodeDecodeError(bincode::error::DecodeError), WrongEndian, DifferentVersion { found: Version, expected: Version }, @@ -77,6 +79,18 @@ impl From for Error { } } +impl From for Error { + fn from(error: bincode::error::DecodeError) -> Self { + Self::BincodeDecodeError(error) + } +} + +impl From for Error { + fn from(error: bincode::error::EncodeError) -> Self { + Self::BincodeEncodeError(error) + } +} + impl fmt::Display for Error { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { @@ -85,6 +99,8 @@ impl fmt::Display for Error { Error::SerdeJson(error) => Debug::fmt(&error, f), Error::Jiff(error) => Debug::fmt(&error, f), Error::Fjall(error) => Debug::fmt(&error, f), + Error::BincodeDecodeError(error) => Debug::fmt(&error, f), + Error::BincodeEncodeError(error) => Debug::fmt(&error, f), Error::ZeroCopyError => write!(f, "ZeroCopy error"), Error::WrongEndian => write!(f, "Wrong endian"), diff --git a/crates/brk_core/src/structs/bitcoin.rs b/crates/brk_core/src/structs/bitcoin.rs index 03583a054..85f911a74 100644 --- a/crates/brk_core/src/structs/bitcoin.rs +++ b/crates/brk_core/src/structs/bitcoin.rs @@ -35,9 +35,10 @@ impl Mul for Bitcoin { } impl Div for Bitcoin { - type Output = Self; + type Output = StoredF64; fn div(self, rhs: Bitcoin) -> Self::Output { - Self::from(Sats::from(self) / Sats::from(rhs)) + StoredF64::from(self.0 / rhs.0) + // Self::from(Sats::from(self) / Sats::from(rhs)) } } diff --git a/crates/brk_core/src/structs/cents.rs b/crates/brk_core/src/structs/cents.rs index fa9d0245a..2aa93eca1 100644 --- a/crates/brk_core/src/structs/cents.rs +++ b/crates/brk_core/src/structs/cents.rs @@ -24,6 +24,12 @@ use super::Dollars; )] pub struct Cents(i64); +impl Cents { + pub const fn mint(value: i64) -> Self { + Self(value) + } +} + impl From for Cents { fn from(value: Dollars) -> Self { Self((*value * 100.0).round() as i64) @@ -48,6 +54,15 @@ impl From for Cents { } } +impl From for usize { + fn from(value: Cents) -> Self { + if value.0 < 0 { + panic!() + } + value.0 as usize + } +} + impl From for Cents { fn from(value: usize) -> Self { Self(value as i64) @@ -76,6 +91,13 @@ impl Add for Cents { } } +impl Div for Cents { + type Output = Self; + fn div(self, rhs: Self) -> Self::Output { + Self(self.0 / rhs.0) + } +} + impl Div for Cents { type Output = Self; fn div(self, rhs: usize) -> Self::Output { diff --git a/crates/brk_core/src/structs/dollars.rs b/crates/brk_core/src/structs/dollars.rs index 8afbb1263..0d12ce541 100644 --- a/crates/brk_core/src/structs/dollars.rs +++ b/crates/brk_core/src/structs/dollars.rs @@ -4,9 +4,10 @@ use std::{ ops::{Add, AddAssign, Div, Mul}, }; +use bincode::{Decode, Encode}; use byteview::ByteView; use derive_deref::Deref; -use serde::Serialize; +use serde::{Deserialize, Serialize}; use zerocopy_derive::{FromBytes, Immutable, IntoBytes, KnownLayout}; use crate::{CheckedSub, copy_first_8bytes}; @@ -14,7 +15,19 @@ use crate::{CheckedSub, copy_first_8bytes}; use super::{Bitcoin, Cents, Close, High, Sats, StoredF32, StoredF64}; #[derive( - Debug, Default, Clone, Copy, Deref, FromBytes, Immutable, IntoBytes, KnownLayout, Serialize, + Debug, + Default, + Clone, + Copy, + Deref, + FromBytes, + Immutable, + IntoBytes, + KnownLayout, + Serialize, + Deserialize, + Encode, + Decode, )] pub struct Dollars(f64); @@ -85,10 +98,10 @@ impl Add for Dollars { impl Div for Dollars { type Output = StoredF64; fn div(self, rhs: Dollars) -> Self::Output { - if self.is_nan() { - StoredF64::from(self.0) + if self.is_nan() || rhs == Dollars::ZERO { + StoredF64::NAN } else { - StoredF64::from(self.0 / rhs.0) + StoredF64::from(f64::from(self) / f64::from(rhs)) } } } @@ -96,10 +109,10 @@ impl Div for Dollars { impl Div> for Dollars { type Output = StoredF64; fn div(self, rhs: Close) -> Self::Output { - if self.is_nan() { - StoredF64::from(self.0) + if self.is_nan() || *rhs == Dollars::ZERO { + StoredF64::NAN } else { - StoredF64::from(self.0 / rhs.0) + StoredF64::from(f64::from(self) / f64::from(*rhs)) } } } @@ -107,10 +120,10 @@ impl Div> for Dollars { impl Div for Close { type Output = StoredF64; fn div(self, rhs: Dollars) -> Self::Output { - if self.is_nan() { - StoredF64::from(self.0) + if self.is_nan() || rhs == Dollars::ZERO { + StoredF64::NAN } else { - StoredF64::from(self.0 / rhs.0) + StoredF64::from(f64::from(*self) / f64::from(rhs)) } } } @@ -118,8 +131,8 @@ impl Div for Close { impl Div for Dollars { type Output = Self; fn div(self, rhs: usize) -> Self::Output { - if self.is_nan() { - self + if self.is_nan() || rhs == 0 { + Dollars::NAN } else { Self::from(Cents::from(self) / rhs) } @@ -158,6 +171,13 @@ impl Mul for Close { } } +impl Mul for Close { + type Output = Dollars; + fn mul(self, rhs: usize) -> Self::Output { + Dollars::from(Cents::from(*self) * rhs) + } +} + impl Mul for Dollars { type Output = Self; fn mul(self, rhs: Bitcoin) -> Self::Output { diff --git a/crates/brk_core/src/structs/sats.rs b/crates/brk_core/src/structs/sats.rs index 8e7e0cede..68236504c 100644 --- a/crates/brk_core/src/structs/sats.rs +++ b/crates/brk_core/src/structs/sats.rs @@ -3,9 +3,10 @@ use std::{ ops::{Add, AddAssign, Div, Mul, SubAssign}, }; +use bincode::{Decode, Encode}; use bitcoin::Amount; use byteview::ByteView; -use serde::Serialize; +use serde::{Deserialize, Serialize}; use zerocopy_derive::{FromBytes, Immutable, IntoBytes, KnownLayout}; use crate::{CheckedSub, copy_first_8bytes}; @@ -26,6 +27,9 @@ use super::{Bitcoin, Cents, Dollars, Height}; IntoBytes, KnownLayout, Serialize, + Deserialize, + Encode, + Decode, )] pub struct Sats(u64); diff --git a/crates/brk_core/src/structs/stored_f32.rs b/crates/brk_core/src/structs/stored_f32.rs index ae5e274bf..39b136331 100644 --- a/crates/brk_core/src/structs/stored_f32.rs +++ b/crates/brk_core/src/structs/stored_f32.rs @@ -76,6 +76,12 @@ impl From for f32 { } } +impl From for StoredF32 { + fn from(value: Dollars) -> Self { + StoredF32::from(f64::from(value)) + } +} + impl Div for StoredF32 { type Output = Self; fn div(self, rhs: Dollars) -> Self::Output { diff --git a/crates/brk_core/src/structs/stored_f64.rs b/crates/brk_core/src/structs/stored_f64.rs index df564df99..778f83bd2 100644 --- a/crates/brk_core/src/structs/stored_f64.rs +++ b/crates/brk_core/src/structs/stored_f64.rs @@ -1,5 +1,6 @@ use std::{ cmp::Ordering, + f64, ops::{Add, Div, Mul}, }; @@ -7,13 +8,17 @@ use derive_deref::Deref; use serde::Serialize; use zerocopy_derive::{FromBytes, Immutable, IntoBytes, KnownLayout}; -use crate::{Bitcoin, CheckedSub, Sats}; +use crate::{Bitcoin, CheckedSub, Dollars}; #[derive( Debug, Deref, Default, Clone, Copy, FromBytes, Immutable, IntoBytes, KnownLayout, Serialize, )] pub struct StoredF64(f64); +impl StoredF64 { + pub const NAN: Self = Self(f64::NAN); +} + impl From for StoredF64 { fn from(value: f64) -> Self { Self(value) @@ -59,6 +64,12 @@ impl From for f64 { } } +impl From for StoredF64 { + fn from(value: Dollars) -> Self { + Self(f64::from(value)) + } +} + impl CheckedSub for StoredF64 { fn checked_sub(self, rhs: usize) -> Option { Some(Self(self.0 - rhs as f64)) @@ -97,12 +108,6 @@ impl Ord for StoredF64 { } } -impl From for StoredF64 { - fn from(value: Sats) -> Self { - Self(u64::from(value) as f64) - } -} - impl From for StoredF64 { fn from(value: Bitcoin) -> Self { Self(f64::from(value)) diff --git a/crates/brk_fetcher/src/fetchers/binance.rs b/crates/brk_fetcher/src/fetchers/binance.rs index fd7b1a34a..6c718036b 100644 --- a/crates/brk_fetcher/src/fetchers/binance.rs +++ b/crates/brk_fetcher/src/fetchers/binance.rs @@ -17,7 +17,7 @@ use crate::{Close, Date, Dollars, Fetcher, High, Low, Open, fetchers::retry}; pub struct Binance { path: Option, _1mn: Option>, - _1d: Option>, + pub _1d: Option>, har: Option>, } diff --git a/crates/brk_fetcher/src/fetchers/mod.rs b/crates/brk_fetcher/src/fetchers/mod.rs index 030432dee..27770f09d 100644 --- a/crates/brk_fetcher/src/fetchers/mod.rs +++ b/crates/brk_fetcher/src/fetchers/mod.rs @@ -1,9 +1,9 @@ mod binance; // mod kibo; -// mod kraken; +mod kraken; mod retry; pub use binance::*; // pub use kibo::*; -// pub use kraken::*; +pub use kraken::*; use retry::*; diff --git a/crates/brk_fetcher/src/lib.rs b/crates/brk_fetcher/src/lib.rs index ca0aaf645..375ecb133 100644 --- a/crates/brk_fetcher/src/lib.rs +++ b/crates/brk_fetcher/src/lib.rs @@ -13,12 +13,12 @@ mod fetchers; use fetchers::*; use log::info; -const TRIES: usize = 12 * 60 * 2; +const TRIES: usize = 12 * 60; #[derive(Clone)] pub struct Fetcher { binance: Binance, - // kraken: Kraken, + kraken: Kraken, // kibo: Kibo, } @@ -30,7 +30,7 @@ impl Fetcher { Ok(Self { binance: Binance::init(hars_path), - // kraken: Kraken::default(), + kraken: Kraken::default(), // kibo: Kibo::default(), }) } @@ -42,15 +42,16 @@ impl Fetcher { fn get_date_(&mut self, date: Date, tries: usize) -> color_eyre::Result { self.binance .get_from_1d(&date) - // .or_else(|_| { - // // eprintln!("{e}"); - // self.kibo.get_from_date(&date) - // }) + .or_else(|_| { + // eprintln!("{e}"); + self.kraken.get_from_1d(&date) + }) .or_else(|e| { - sleep(Duration::from_secs(30)); + sleep(Duration::from_secs(60)); if tries < TRIES { self.clear(); + // dbg!(e, date, &self.binance._1d); info!("Retrying to fetch date price..."); self.get_date_(date, tries + 1) } else { @@ -89,32 +90,32 @@ impl Fetcher { .get_from_1mn(timestamp, previous_timestamp) .unwrap_or_else(|_report| { // eprintln!("{_report}"); - // self.kraken - // .get_from_1mn(timestamp, previous_timestamp) - // .unwrap_or_else(|_report| { - // // eprintln!("{_report}"); - // self.kibo.get_from_height(height).unwrap_or_else(|_report| { - // eprintln!("{_report}"); + self.kraken + .get_from_1mn(timestamp, previous_timestamp) + .unwrap_or_else(|_report| { + // // eprintln!("{_report}"); + // self.kibo.get_from_height(height).unwrap_or_else(|_report| { + // eprintln!("{_report}"); - sleep(Duration::from_secs(30)); + sleep(Duration::from_secs(60)); - if tries < TRIES { - self.clear(); + if tries < TRIES { + self.clear(); - info!("Retrying to fetch height prices..."); - // dbg!((height, timestamp, previous_timestamp)); + info!("Retrying to fetch height prices..."); + // dbg!((height, timestamp, previous_timestamp)); - return self - .get_height_(height, timestamp, previous_timestamp, tries + 1) - .unwrap(); - } + return self + .get_height_(height, timestamp, previous_timestamp, tries + 1) + .unwrap(); + } - info!("Failed to fetch height prices"); + info!("Failed to fetch height prices"); - let date = Date::from(timestamp); - // eprintln!("{e}"); - panic!( - " + let date = Date::from(timestamp); + // eprintln!("{e}"); + panic!( + " Can't find the price for: height: {height} - date: {date} 1mn APIs are limited to the last 16 hours for Binance's and the last 10 hours for Kraken's How to fix this: @@ -129,9 +130,9 @@ How to fix this: 8. Export to a har file (if there is no explicit button, click on the cog button) 9. Move the file to 'parser/imports/binance.har' " - ) - // }) - // }) + ) + // }) + }) }); Ok(ohlc) @@ -182,6 +183,6 @@ How to fix this: pub fn clear(&mut self) { self.binance.clear(); // self.kibo.clear(); - // self.kraken.clear(); + self.kraken.clear(); } } diff --git a/crates/brk_state/Cargo.toml b/crates/brk_state/Cargo.toml index 1cc31ba4b..edb71a32a 100644 --- a/crates/brk_state/Cargo.toml +++ b/crates/brk_state/Cargo.toml @@ -8,8 +8,10 @@ homepage.workspace = true repository.workspace = true [dependencies] +bincode = { workspace = true } brk_core = { workspace = true } brk_store = { workspace = true } +derive_deref = { workspace = true } fjall = { workspace = true } serde = { workspace = true } zerocopy = { workspace = true } diff --git a/crates/brk_state/src/cohort.rs b/crates/brk_state/src/cohort.rs index f389f9b3e..dde7d5435 100644 --- a/crates/brk_state/src/cohort.rs +++ b/crates/brk_state/src/cohort.rs @@ -1,10 +1,8 @@ use std::{cmp::Ordering, path::Path}; -use brk_core::{CheckedSub, Dollars, Height, Result, Sats, Version}; -use brk_store::Store; -use fjall::TransactionalKeyspace; +use brk_core::{CheckedSub, Dollars, Height, Result, Sats}; -use crate::UnrealizedState; +use crate::{PriceToAmount, UnrealizedState}; use super::{RealizedState, SupplyState}; @@ -14,29 +12,17 @@ pub struct CohortState { pub realized: Option, pub satblocks_destroyed: Sats, pub satdays_destroyed: Sats, - pub price_to_amount: Store, + pub price_to_amount: PriceToAmount, } impl CohortState { - pub fn default_and_import( - keyspace: &TransactionalKeyspace, - path: &Path, - name: &str, - version: Version, - compute_dollars: bool, - ) -> Result { + pub fn default_and_import(path: &Path, name: &str, compute_dollars: bool) -> Result { Ok(Self { supply: SupplyState::default(), realized: compute_dollars.then_some(RealizedState::NAN), satblocks_destroyed: Sats::ZERO, satdays_destroyed: Sats::ZERO, - price_to_amount: Store::import( - keyspace, - path, - &format!("{name}_price_to_amount"), - version + Version::new(3), - Some(None), - )?, + price_to_amount: PriceToAmount::forced_import(path, name), }) } @@ -50,41 +36,45 @@ impl CohortState { pub fn increment(&mut self, supply_state: &SupplyState, price: Option) { self.supply += supply_state; - if let Some(realized) = self.realized.as_mut() { - let price = price.unwrap(); - realized.increment(supply_state, price); - *self.price_to_amount.puts_entry_or_default(&price) += supply_state.value; + + if supply_state.value > Sats::ZERO { + if let Some(realized) = self.realized.as_mut() { + let price = price.unwrap(); + realized.increment(supply_state, price); + *self.price_to_amount.entry(price).or_default() += supply_state.value; + } } } pub fn decrement(&mut self, supply_state: &SupplyState, price: Option) { self.supply -= supply_state; - if let Some(realized) = self.realized.as_mut() { - let price = price.unwrap(); - realized.decrement(supply_state, price); - self.decrement_price_to_amount(supply_state, price); + + if supply_state.value > Sats::ZERO { + if let Some(realized) = self.realized.as_mut() { + let price = price.unwrap(); + realized.decrement(supply_state, price); + self.decrement_price_to_amount(supply_state, price); + } } } fn decrement_price_to_amount(&mut self, supply_state: &SupplyState, price: Dollars) { - let amount = self.price_to_amount.puts_entry_or_default(&price); + let amount = self.price_to_amount.get_mut(&price).unwrap(); *amount -= supply_state.value; if *amount == Sats::ZERO { - if self.price_to_amount.puts_remove(&price).is_none() { - unreachable!() - } - if !self.price_to_amount.dels_insert(price) { - unreachable!() - } + self.price_to_amount.remove(&price); } } pub fn receive(&mut self, supply_state: &SupplyState, price: Option) { self.supply += supply_state; - if let Some(realized) = self.realized.as_mut() { - let price = price.unwrap(); - realized.receive(supply_state, price); - *self.price_to_amount.puts_entry_or_default(&price) += supply_state.value; + + if supply_state.value > Sats::ZERO { + if let Some(realized) = self.realized.as_mut() { + let price = price.unwrap(); + realized.receive(supply_state, price); + *self.price_to_amount.entry(price).or_default() += supply_state.value; + } } } @@ -99,16 +89,18 @@ impl CohortState { ) { self.supply -= supply_state; - self.satblocks_destroyed += supply_state.value * blocks_old; + if supply_state.value > Sats::ZERO { + self.satblocks_destroyed += supply_state.value * blocks_old; - self.satdays_destroyed += - Sats::from((u64::from(supply_state.value) as f64 * days_old).floor() as u64); + self.satdays_destroyed += + Sats::from((u64::from(supply_state.value) as f64 * days_old).floor() as u64); - if let Some(realized) = self.realized.as_mut() { - let current_price = current_price.unwrap(); - let prev_price = prev_price.unwrap(); - realized.send(supply_state, current_price, prev_price, older_than_hour); - self.decrement_price_to_amount(supply_state, prev_price); + if let Some(realized) = self.realized.as_mut() { + let current_price = current_price.unwrap(); + let prev_price = prev_price.unwrap(); + realized.send(supply_state, current_price, prev_price, older_than_hour); + self.decrement_price_to_amount(supply_state, prev_price); + } } } @@ -158,30 +150,23 @@ impl CohortState { } }; - self.price_to_amount - .puts_iter() - .for_each(|(&price, &sats)| { - update_state(price, height_price, sats, &mut height_unrealized_state); + self.price_to_amount.iter().for_each(|(&price, &sats)| { + update_state(price, height_price, sats, &mut height_unrealized_state); - if let Some(date_price) = date_price { - update_state( - price, - date_price, - sats, - date_unrealized_state.as_mut().unwrap(), - ) - } - }); + if let Some(date_price) = date_price { + update_state( + price, + date_price, + sats, + date_unrealized_state.as_mut().unwrap(), + ) + } + }); (height_unrealized_state, date_unrealized_state) } pub fn commit(&mut self, height: Height) -> Result<()> { - // self.price_to_amount - // .retain_or_del(|_, sats| *sats > Sats::ZERO); - let price_to_amount_puts = self.price_to_amount.clone_puts(); - self.price_to_amount.commit(height)?; - self.price_to_amount.append_puts(price_to_amount_puts); - Ok(()) + self.price_to_amount.flush(height) } } diff --git a/crates/brk_state/src/lib.rs b/crates/brk_state/src/lib.rs index 5d86434d3..1145ace04 100644 --- a/crates/brk_state/src/lib.rs +++ b/crates/brk_state/src/lib.rs @@ -3,6 +3,7 @@ mod cohort; mod outputs; mod realized; // mod hot; +mod price_to_amount; mod supply; mod transacted; mod unrealized; @@ -13,5 +14,6 @@ pub use outputs::*; pub use realized::*; pub use unrealized::*; // pub use hot::*; +pub use price_to_amount::*; pub use supply::*; pub use transacted::*; diff --git a/crates/brk_state/src/price_to_amount.rs b/crates/brk_state/src/price_to_amount.rs new file mode 100644 index 000000000..1b68adca5 --- /dev/null +++ b/crates/brk_state/src/price_to_amount.rs @@ -0,0 +1,104 @@ +use std::{ + collections::BTreeMap, + fs::{self, File}, + io::{BufReader, BufWriter}, + ops::{Deref, DerefMut}, + path::{Path, PathBuf}, +}; + +use bincode::{Decode, Encode, config, decode_from_std_read, encode_into_std_write}; +use brk_core::{Dollars, Height, Result, Sats}; +use derive_deref::{Deref, DerefMut}; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug)] +pub struct PriceToAmount { + pathbuf: PathBuf, + height: Option, + state: State, +} + +#[derive(Clone, Default, Debug, Deref, DerefMut, Serialize, Deserialize, Encode, Decode)] +struct State(BTreeMap); + +impl PriceToAmount { + pub fn forced_import(path: &Path, name: &str) -> Self { + Self::import(path, name).unwrap_or_else(|_| Self { + pathbuf: Self::path_(path, name), + height: None, + state: State::default(), + }) + } + + pub fn import(path: &Path, name: &str) -> Result { + let path = Self::path_(path, name); + fs::create_dir_all(&path)?; + + let config = config::standard(); + let file = File::open(Self::path_state_(&path))?; + let mut reader = BufReader::new(file); + let state = decode_from_std_read(&mut reader, config)?; + + Ok(Self { + height: Height::try_from(Self::path_height_(&path).as_path()).ok(), + pathbuf: path, + state, + }) + } + + pub fn reset(&mut self) -> Result<()> { + self.clear(); + self.height = None; + fs::remove_dir_all(&self.pathbuf)?; + fs::create_dir_all(&self.pathbuf)?; + Ok(()) + } + + pub fn flush(&mut self, height: Height) -> Result<()> { + self.height = Some(height); + height.write(&self.path_height())?; + + let config = config::standard(); + let file = File::create(self.path_state()).inspect_err(|_| { + dbg!(self.path_state()); + })?; + let mut writer = BufWriter::new(file); + encode_into_std_write(&self.state, &mut writer, config)?; + Ok(()) + } + + pub fn height(&self) -> Option { + self.height + } + + fn path_(path: &Path, name: &str) -> PathBuf { + path.join(format!("{name}_price_to_amount")) + } + + fn path_state(&self) -> PathBuf { + Self::path_state_(&self.pathbuf) + } + fn path_state_(path: &Path) -> PathBuf { + path.join("state") + } + + fn path_height(&self) -> PathBuf { + Self::path_height_(&self.pathbuf) + } + fn path_height_(path: &Path) -> PathBuf { + path.join("height") + } +} + +impl Deref for PriceToAmount { + type Target = BTreeMap; + fn deref(&self) -> &Self::Target { + &self.state + } +} + +impl DerefMut for PriceToAmount { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.state + } +} diff --git a/crates/brk_store/examples/main.rs b/crates/brk_store/examples/main.rs index e8fced8a4..d7f80d31d 100644 --- a/crates/brk_store/examples/main.rs +++ b/crates/brk_store/examples/main.rs @@ -11,33 +11,9 @@ fn main() -> Result<()> { let mut store: Store = brk_store::Store::import(&keyspace, p, "n", Version::ZERO, None)?; - store.copy_db_to_puts(); - - *store.puts_entry_or_default(&Dollars::from(10.0)) += Sats::ONE_BTC; - *store.puts_entry_or_default(&Dollars::from(1.0)) += Sats::ONE_BTC; - *store.puts_entry_or_default(&Dollars::ZERO) += Sats::ONE_BTC; - *store.puts_entry_or_default(&Dollars::ZERO) += Sats::ONE_BTC; - - dbg!(store.tx_iter().collect::>()); + store.insert_if_needed(Dollars::from(10.0), Sats::FIFTY_BTC, Height::ZERO); store.commit(Height::ZERO)?; - store.copy_db_to_puts(); - - dbg!(store.tx_iter().collect::>()); - - *store.puts_entry_or_default(&Dollars::from(10.0)) += Sats::ONE_BTC; - *store.puts_entry_or_default(&Dollars::from(1.0)) += Sats::ONE_BTC; - *store.puts_entry_or_default(&Dollars::ZERO) += Sats::ONE_BTC; - *store.puts_entry_or_default(&Dollars::ZERO) += Sats::ONE_BTC; - - dbg!(store.tx_iter().collect::>()); - - store.commit(Height::from(1_u32))?; - - store.copy_db_to_puts(); - - dbg!(store.tx_iter().collect::>()); - Ok(()) } diff --git a/crates/brk_store/src/lib.rs b/crates/brk_store/src/lib.rs index 5da7cd179..b849cfdfa 100644 --- a/crates/brk_store/src/lib.rs +++ b/crates/brk_store/src/lib.rs @@ -31,7 +31,6 @@ pub struct Store { puts: BTreeMap, dels: BTreeSet, bloom_filter_bits: Option>, - override_partition: bool, } /// Use default if will read @@ -81,7 +80,6 @@ where puts: BTreeMap::new(), dels: BTreeSet::new(), bloom_filter_bits, - override_partition: false, }) } @@ -95,79 +93,33 @@ where } } - pub fn puts_first_key_value(&self) -> Option<(&K, &V)> { - self.puts.first_key_value() - } + // pub fn puts_first_key_value(&self) -> Option<(&K, &V)> { + // self.puts.first_key_value() + // } - pub fn puts_last_key_value(&self) -> Option<(&K, &V)> { - self.puts.last_key_value() - } + // pub fn puts_last_key_value(&self) -> Option<(&K, &V)> { + // self.puts.last_key_value() + // } - pub fn rtx_first_key_value(&self) -> Result> { - Ok(self - .rtx - .first_key_value(&self.partition.load())? - .map(|(k, v)| (K::from(ByteView::from(k)), V::from(ByteView::from(v))))) - } + // pub fn rtx_first_key_value(&self) -> Result> { + // Ok(self + // .rtx + // .first_key_value(&self.partition.load())? + // .map(|(k, v)| (K::from(ByteView::from(k)), V::from(ByteView::from(v))))) + // } - pub fn rtx_last_key_value(&self) -> Result> { - Ok(self - .rtx - .last_key_value(&self.partition.load())? - .map(|(k, v)| (K::from(ByteView::from(k)), V::from(ByteView::from(v))))) - } + // pub fn rtx_last_key_value(&self) -> Result> { + // Ok(self + // .rtx + // .last_key_value(&self.partition.load())? + // .map(|(k, v)| (K::from(ByteView::from(k)), V::from(ByteView::from(v))))) + // } - pub fn puts_entry_or_default(&mut self, key: &'a K) -> &mut V - where - V: Default, - { - if !self.dels.is_empty() { - self.dels.remove(key); - } - self.puts.entry(key.clone()).or_default() - } - - pub fn puts_remove(&mut self, key: &K) -> Option { - self.puts.remove(key) - } - - pub fn dels_insert(&mut self, key: K) -> bool { - self.dels.insert(key) - } - - pub fn tx_iter(&self) -> impl Iterator { - self.rtx - .iter(&self.partition.load()) - .map(|res| res.unwrap()) - .map(|(k, v)| (K::from(ByteView::from(k)), V::from(ByteView::from(v)))) - } - - pub fn puts_iter(&self) -> impl Iterator { - self.puts.iter() - } - - pub fn clone_puts(&self) -> BTreeMap { - self.puts.clone() - } - - pub fn append_puts(&mut self, mut other: BTreeMap) { - self.puts.append(&mut other); - } - - pub fn copy_db_to_puts(&mut self) { - self.override_partition = true; - self.append_puts(self.tx_iter().collect()); - self.meta.reset_len(); - } - - // pub fn unordered_clone_iter(&self) -> impl Iterator { + // pub fn tx_iter(&self) -> impl Iterator { // self.rtx - // .keys(&self.partition.load()) + // .iter(&self.partition.load()) // .map(|res| res.unwrap()) - // .map(|k| K::from(ByteView::from(k))) - // .filter(|k| !self.puts.contains_key(k) && !self.dels.contains(k)) - // .map(|k| (k, self.rtx.get(partition, key) V::from(ByteView::from(v)))) - // .chain(self.puts.iter().map(|(k, v)| (k.clone(), v.clone()))) + // .map(|(k, v)| (K::from(ByteView::from(k)), V::from(ByteView::from(v)))) // } pub fn insert_if_needed(&mut self, key: K, value: V, height: Height) { @@ -215,10 +167,6 @@ where self.meta.export(self.len(), height)?; - if self.override_partition { - self.reset_partition()?; - } - let mut wtx = self.keyspace.write_tx(); let partition = &self.partition.load(); @@ -338,7 +286,6 @@ where puts: self.puts.clone(), dels: self.dels.clone(), bloom_filter_bits: self.bloom_filter_bits, - override_partition: self.override_partition, } } } diff --git a/crates/brk_store/src/meta.rs b/crates/brk_store/src/meta.rs index 86c46ad25..8b662236b 100644 --- a/crates/brk_store/src/meta.rs +++ b/crates/brk_store/src/meta.rs @@ -36,10 +36,7 @@ impl StoreMeta { let mut partition = open_partition_handle()?; - let mut did_reset = false; - if !is_same_version { - did_reset = true; Self::reset_(path)?; keyspace.delete_partition(partition)?; keyspace.persist(fjall::PersistMode::SyncAll)?; @@ -48,11 +45,6 @@ impl StoreMeta { let len = Self::read_length_(path); - if did_reset && len != 0 { - dbg!(&path); - unreachable!(); - } - let slf = Self { pathbuf: path.to_owned(), version, @@ -69,9 +61,6 @@ impl StoreMeta { self.len } - pub fn reset_len(&mut self) { - self.len = 0 - } // pub fn is_empty(&self) -> bool { // self.len() == 0 // } diff --git a/crates/brk_vec/src/variants/eager.rs b/crates/brk_vec/src/variants/eager.rs index 45d19895a..c5fbc7c7a 100644 --- a/crates/brk_vec/src/variants/eager.rs +++ b/crates/brk_vec/src/variants/eager.rs @@ -344,7 +344,7 @@ where self.safe_flush(exit) } - pub fn compute_divide( + pub fn compute_divide( &mut self, max_from: I, divided: &impl AnyIterableVec, @@ -352,15 +352,16 @@ where exit: &Exit, ) -> Result<()> where - T2: StoredType + Div, + T2: StoredType + Mul, T3: StoredType, - T4: Mul + CheckedSub, - T: From, + T4: Div + From, + T5: CheckedSub, + T: From, { self.compute_divide_(max_from, divided, divider, exit, false, false) } - pub fn compute_percentage( + pub fn compute_percentage( &mut self, max_from: I, divided: &impl AnyIterableVec, @@ -368,15 +369,16 @@ where exit: &Exit, ) -> Result<()> where - T2: StoredType + Div, + T2: StoredType + Mul, T3: StoredType, - T4: Mul + CheckedSub, - T: From, + T4: Div + From, + T5: CheckedSub, + T: From, { self.compute_divide_(max_from, divided, divider, exit, true, false) } - pub fn compute_percentage_difference( + pub fn compute_percentage_difference( &mut self, max_from: I, divided: &impl AnyIterableVec, @@ -384,15 +386,16 @@ where exit: &Exit, ) -> Result<()> where - T2: StoredType + Div, + T2: StoredType + Mul, T3: StoredType, - T4: Mul + CheckedSub, - T: From, + T4: Div + From, + T5: CheckedSub, + T: From, { self.compute_divide_(max_from, divided, divider, exit, true, true) } - pub fn compute_divide_( + pub fn compute_divide_( &mut self, max_from: I, divided: &impl AnyIterableVec, @@ -402,10 +405,11 @@ where as_difference: bool, ) -> Result<()> where - T2: StoredType + Div, + T2: StoredType + Mul, T3: StoredType, - T4: Mul + CheckedSub, - T: From, + T4: Div + From, + T5: CheckedSub, + T: From, { self.validate_computed_version_or_reset_file( Version::ONE + self.inner.version() + divided.version() + divider.version(), @@ -418,10 +422,13 @@ where divided.iter_at(index).try_for_each(|(i, divided)| { let divided = divided.into_inner(); let divider = divider_iter.unwrap_get_inner(i); - let mut v = divided / divider; - if as_percentage { - v = v * multiplier; - } + + let v = if as_percentage { + divided * multiplier + } else { + T4::from(divided) + }; + let mut v = v / divider; if as_difference { v = v.checked_sub(multiplier).unwrap(); } diff --git a/websites/default/scripts/options.js b/websites/default/scripts/options.js index 90c2f5ec4..8f20652e9 100644 --- a/websites/default/scripts/options.js +++ b/websites/default/scripts/options.js @@ -1256,6 +1256,15 @@ function createPartialOptions(colors) { name: useGroupName ? name : "Supply", color: "list" in args ? color : colors.default, }), + ...(key + ? [ + createBaseSeries({ + key: `${key}supply-relative-to-circulating-supply`, + name: useGroupName ? name : "Supply", + color: "list" in args ? color : colors.default, + }), + ] + : []), ...(!("list" in args) ? [ createBaseSeries({ @@ -1329,11 +1338,6 @@ function createPartialOptions(colors) { }), ...(key ? [ - createBaseSeries({ - key: `${key}supply-relative-to-circulating-supply`, - name: useGroupName ? name : "Supply", - color: colors.default, - }), createBaseSeries({ key: `${key}supply-in-profit-relative-to-circulating-supply`, name: useGroupName ? name : "In Profit", @@ -1791,16 +1795,6 @@ function createPartialOptions(colors) { name: useGroupName ? name : "destroyed", color, }), - createBaseSeries({ - key: `${key}coinblocks-destroyed`, - name: useGroupName ? name : "destroyed", - color, - }), - createBaseSeries({ - key: `${key}coindays-destroyed`, - name: useGroupName ? name : "destroyed", - color, - }), ]); }), },