diff --git a/Cargo.lock b/Cargo.lock index 8ab007fb2..371401b85 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -393,6 +393,7 @@ dependencies = [ "brk_parser", "brk_query", "brk_server", + "brk_state", "brk_store", "brk_vec", ] @@ -434,6 +435,7 @@ dependencies = [ "brk_indexer", "brk_logger", "brk_parser", + "brk_state", "brk_vec", "clap", "clap_derive", @@ -583,6 +585,19 @@ dependencies = [ "zip", ] +[[package]] +name = "brk_state" +version = "0.0.40" +dependencies = [ + "brk_core", + "brk_store", + "brk_vec", + "rayon", + "serde", + "zerocopy", + "zerocopy-derive", +] + [[package]] name = "brk_store" version = "0.0.40" diff --git a/Cargo.toml b/Cargo.toml index 59db25d9f..24576099c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,6 +29,7 @@ brk_logger = { version = "0", path = "crates/brk_logger" } brk_parser = { version = "0", path = "crates/brk_parser" } brk_query = { version = "0", path = "crates/brk_query" } brk_server = { version = "0", path = "crates/brk_server" } +brk_state = { version = "0", path = "crates/brk_state" } brk_store = { version = "0", path = "crates/brk_store" } brk_vec = { version = "0", path = "crates/brk_vec" } byteview = "0.7.0" diff --git a/crates/brk/Cargo.toml b/crates/brk/Cargo.toml index 3a662a706..f0b39f007 100644 --- a/crates/brk/Cargo.toml +++ b/crates/brk/Cargo.toml @@ -18,6 +18,7 @@ full = [ "parser", "query", "server", + "state", "store", "vec", ] @@ -30,6 +31,7 @@ logger = ["brk_logger"] parser = ["brk_parser"] query = ["brk_query"] server = ["brk_server"] +state = ["brk_state"] store = ["brk_store"] vec = ["brk_vec"] @@ -44,6 +46,7 @@ brk_logger = { workspace = true, optional = true } brk_parser = { workspace = true, optional = true } brk_query = { workspace = true, optional = true } brk_server = { workspace = true, optional = true } +brk_state = { workspace = true, optional = true } brk_store = { workspace = true, optional = true } brk_vec = { workspace = true, optional = true } diff --git a/crates/brk/src/lib.rs b/crates/brk/src/lib.rs index f8d159f50..3660413ff 100644 --- a/crates/brk/src/lib.rs +++ b/crates/brk/src/lib.rs @@ -36,6 +36,10 @@ pub use brk_query as query; #[doc(inline)] pub use brk_server as server; +#[cfg(feature = "state")] +#[doc(inline)] +pub use brk_state as state; + #[cfg(feature = "store")] #[doc(inline)] pub use brk_store as store; diff --git a/crates/brk_computer/Cargo.toml b/crates/brk_computer/Cargo.toml index a183387c0..336a2320e 100644 --- a/crates/brk_computer/Cargo.toml +++ b/crates/brk_computer/Cargo.toml @@ -15,6 +15,7 @@ brk_fetcher = { workspace = true } brk_indexer = { workspace = true } brk_logger = { workspace = true } brk_parser = { workspace = true } +brk_state = { workspace = true } brk_vec = { workspace = true } clap = { workspace = true } clap_derive = { workspace = true } diff --git a/crates/brk_computer/src/lib.rs b/crates/brk_computer/src/lib.rs index 32024c048..b0e312a65 100644 --- a/crates/brk_computer/src/lib.rs +++ b/crates/brk_computer/src/lib.rs @@ -11,7 +11,6 @@ use brk_fetcher::Fetcher; use brk_indexer::Indexer; use brk_vec::{AnyCollectableVec, Compressed, Computation}; -mod states; mod stores; mod utils; mod vecs; diff --git a/crates/brk_computer/src/vecs/statefull/cohort.rs b/crates/brk_computer/src/vecs/statefull/cohort.rs index 1fcfcc02e..5a7948214 100644 --- a/crates/brk_computer/src/vecs/statefull/cohort.rs +++ b/crates/brk_computer/src/vecs/statefull/cohort.rs @@ -5,18 +5,16 @@ use brk_core::{ }; use brk_exit::Exit; use brk_indexer::Indexer; +use brk_state::{CohortState, RealizedState}; use brk_vec::{AnyCollectableVec, AnyVec, Compressed, Computation, EagerVec, VecIterator}; -use crate::{ - states::{CohortState, RealizedState}, - vecs::{ - Indexes, fetched, - grouped::{ - ComputedRatioVecsFromDateIndex, ComputedValueVecsFromHeight, ComputedVecsFromHeight, - StorableVecGeneatorOptions, - }, - indexes, +use crate::vecs::{ + Indexes, fetched, + grouped::{ + ComputedRatioVecsFromDateIndex, ComputedValueVecsFromHeight, ComputedVecsFromHeight, + StorableVecGeneatorOptions, }, + indexes, }; const VERSION: Version = Version::ZERO; diff --git a/crates/brk_computer/src/vecs/statefull/mod.rs b/crates/brk_computer/src/vecs/statefull/mod.rs index b94d197e1..d651ede43 100644 --- a/crates/brk_computer/src/vecs/statefull/mod.rs +++ b/crates/brk_computer/src/vecs/statefull/mod.rs @@ -8,9 +8,10 @@ use brk_vec::{ GenericStoredVec, StoredIndex, StoredVec, UnsafeSlice, VecIterator, }; use log::info; +use outputs::OutputCohorts; use rayon::prelude::*; -use crate::states::{ +use brk_state::{ BlockState, OutputFilter, Outputs, OutputsByEpoch, OutputsByFrom, OutputsByRange, OutputsBySize, OutputsBySpendableType, OutputsByTerm, OutputsByUpTo, SupplyState, Transacted, }; @@ -22,6 +23,7 @@ use super::{ }; pub mod cohort; +mod outputs; const VERSION: Version = Version::ZERO; const BYSIZE_VERSION: Version = Version::ONE; diff --git a/crates/brk_computer/src/states/outputs/mod.rs b/crates/brk_computer/src/vecs/statefull/outputs.rs similarity index 66% rename from crates/brk_computer/src/states/outputs/mod.rs rename to crates/brk_computer/src/vecs/statefull/outputs.rs index 9a33b35a3..54662da46 100644 --- a/crates/brk_computer/src/states/outputs/mod.rs +++ b/crates/brk_computer/src/vecs/statefull/outputs.rs @@ -1,69 +1,20 @@ -use brk_vec::StoredIndex; -use rayon::prelude::*; use std::{collections::BTreeMap, ops::ControlFlow}; use brk_core::{CheckedSub, Dollars, HalvingEpoch, Height, Timestamp}; +use brk_state::{BlockState, OutputFilter, Outputs, Transacted}; +use brk_vec::StoredIndex; +use rayon::prelude::*; -mod by_epoch; -mod by_from; -mod by_range; -mod by_size; -mod by_spendable_type; -mod by_term; -mod by_type; -mod by_unspendable_type; -mod by_up_to; -// mod by_value; -mod filter; +use super::cohort; -pub use by_epoch::*; -pub use by_from::*; -pub use by_range::*; -pub use by_size::*; -pub use by_spendable_type::*; -pub use by_term::*; -pub use by_type::*; -pub use by_unspendable_type::*; -pub use by_up_to::*; -// pub use by_value::*; -pub use filter::*; - -use crate::vecs; - -use super::{BlockState, Transacted}; - -#[derive(Default, Clone)] -pub struct Outputs { - pub all: T, - pub by_term: OutputsByTerm, - pub by_up_to: OutputsByUpTo, - pub by_from: OutputsByFrom, - pub by_range: OutputsByRange, - pub by_epoch: OutputsByEpoch, - pub by_type: OutputsBySpendableType, - pub by_size: OutputsBySize, - // // Needs whole UTXO set, TODO later - // // pub by_value: OutputsByValue, +pub trait OutputCohorts { + fn tick_tock_next_block(&mut self, chain_state: &[BlockState], timestamp: Timestamp); + fn send(&mut self, height_to_sent: BTreeMap, chain_state: &[BlockState]); + fn receive(&mut self, received: Transacted, height: Height, price: Option); } -impl Outputs { - pub fn as_mut_vec(&mut self) -> Vec<&mut T> { - [&mut self.all] - .into_iter() - .chain(self.by_term.as_mut_vec()) - .chain(self.by_up_to.as_mut_vec()) - .chain(self.by_from.as_mut_vec()) - .chain(self.by_range.as_mut_vec()) - .chain(self.by_epoch.as_mut_vec()) - .chain(self.by_size.as_mut_vec()) - .chain(self.by_type.as_mut_vec()) - // // .chain(self.by_value.as_mut_vec()) - .collect::>() - } -} - -impl Outputs<(OutputFilter, vecs::statefull::cohort::Vecs)> { - pub fn tick_tock_next_block(&mut self, chain_state: &[BlockState], timestamp: Timestamp) { +impl OutputCohorts for Outputs<(OutputFilter, cohort::Vecs)> { + fn tick_tock_next_block(&mut self, chain_state: &[BlockState], timestamp: Timestamp) { if chain_state.is_empty() { return; } @@ -117,11 +68,7 @@ impl Outputs<(OutputFilter, vecs::statefull::cohort::Vecs)> { }); } - pub fn send( - &mut self, - height_to_sent: BTreeMap, - chain_state: &[BlockState], - ) { + fn send(&mut self, height_to_sent: BTreeMap, chain_state: &[BlockState]) { let mut time_based_vecs = self .by_term .as_mut_vec() @@ -195,7 +142,7 @@ impl Outputs<(OutputFilter, vecs::statefull::cohort::Vecs)> { }); } - pub fn receive(&mut self, received: Transacted, height: Height, price: Option) { + fn receive(&mut self, received: Transacted, height: Height, price: Option) { let supply_state = received.spendable_supply; [ @@ -233,36 +180,3 @@ impl Outputs<(OutputFilter, vecs::statefull::cohort::Vecs)> { }); } } - -impl Outputs<(OutputFilter, T)> { - pub fn vecs(&self) -> Vec<&T> { - [&self.all.1] - .into_iter() - .chain(self.by_term.vecs()) - .chain(self.by_up_to.vecs()) - .chain(self.by_from.vecs()) - .chain(self.by_range.vecs()) - .chain(self.by_epoch.vecs()) - .chain(self.by_size.vecs()) - // // .chain(self.by_value.vecs()) - .chain(self.by_type.vecs()) - .collect::>() - } -} - -impl From> for Outputs<(OutputFilter, T)> { - fn from(value: Outputs) -> Self { - Self { - all: (OutputFilter::All, value.all), - by_term: OutputsByTerm::from(value.by_term), - by_up_to: OutputsByUpTo::from(value.by_up_to), - by_from: OutputsByFrom::from(value.by_from), - by_range: OutputsByRange::from(value.by_range), - by_epoch: OutputsByEpoch::from(value.by_epoch), - by_size: OutputsBySize::from(value.by_size), - // // Needs whole UTXO set, TODO later - // // by_value: OutputsByValue, - by_type: OutputsBySpendableType::from(value.by_type), - } - } -} diff --git a/crates/brk_state/Cargo.toml b/crates/brk_state/Cargo.toml new file mode 100644 index 000000000..d2433cbb4 --- /dev/null +++ b/crates/brk_state/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "brk_state" +description = "States used primarily by the computer" +version.workspace = true +edition.workspace = true +license.workspace = true +repository.workspace = true + +[dependencies] +brk_core = { workspace = true } +brk_vec = { workspace = true } +brk_store = { workspace = true } +rayon = { workspace = true } +serde = { workspace = true } +zerocopy = { workspace = true } +zerocopy-derive = { workspace = true } diff --git a/crates/brk_computer/src/states/block.rs b/crates/brk_state/src/block.rs similarity index 100% rename from crates/brk_computer/src/states/block.rs rename to crates/brk_state/src/block.rs diff --git a/crates/brk_computer/src/states/cohort.rs b/crates/brk_state/src/cohort.rs similarity index 100% rename from crates/brk_computer/src/states/cohort.rs rename to crates/brk_state/src/cohort.rs diff --git a/crates/brk_computer/src/states/hot.rs b/crates/brk_state/src/hot.rs similarity index 100% rename from crates/brk_computer/src/states/hot.rs rename to crates/brk_state/src/hot.rs diff --git a/crates/brk_computer/src/states/mod.rs b/crates/brk_state/src/lib.rs similarity index 100% rename from crates/brk_computer/src/states/mod.rs rename to crates/brk_state/src/lib.rs diff --git a/crates/brk_computer/src/states/outputs/by_epoch.rs b/crates/brk_state/src/outputs/by_epoch.rs similarity index 100% rename from crates/brk_computer/src/states/outputs/by_epoch.rs rename to crates/brk_state/src/outputs/by_epoch.rs diff --git a/crates/brk_computer/src/states/outputs/by_from.rs b/crates/brk_state/src/outputs/by_from.rs similarity index 100% rename from crates/brk_computer/src/states/outputs/by_from.rs rename to crates/brk_state/src/outputs/by_from.rs diff --git a/crates/brk_computer/src/states/outputs/by_range.rs b/crates/brk_state/src/outputs/by_range.rs similarity index 100% rename from crates/brk_computer/src/states/outputs/by_range.rs rename to crates/brk_state/src/outputs/by_range.rs diff --git a/crates/brk_computer/src/states/outputs/by_size.rs b/crates/brk_state/src/outputs/by_size.rs similarity index 100% rename from crates/brk_computer/src/states/outputs/by_size.rs rename to crates/brk_state/src/outputs/by_size.rs diff --git a/crates/brk_computer/src/states/outputs/by_spendable_type.rs b/crates/brk_state/src/outputs/by_spendable_type.rs similarity index 100% rename from crates/brk_computer/src/states/outputs/by_spendable_type.rs rename to crates/brk_state/src/outputs/by_spendable_type.rs diff --git a/crates/brk_computer/src/states/outputs/by_term.rs b/crates/brk_state/src/outputs/by_term.rs similarity index 100% rename from crates/brk_computer/src/states/outputs/by_term.rs rename to crates/brk_state/src/outputs/by_term.rs diff --git a/crates/brk_computer/src/states/outputs/by_type.rs b/crates/brk_state/src/outputs/by_type.rs similarity index 100% rename from crates/brk_computer/src/states/outputs/by_type.rs rename to crates/brk_state/src/outputs/by_type.rs diff --git a/crates/brk_computer/src/states/outputs/by_unspendable_type.rs b/crates/brk_state/src/outputs/by_unspendable_type.rs similarity index 100% rename from crates/brk_computer/src/states/outputs/by_unspendable_type.rs rename to crates/brk_state/src/outputs/by_unspendable_type.rs diff --git a/crates/brk_computer/src/states/outputs/by_up_to.rs b/crates/brk_state/src/outputs/by_up_to.rs similarity index 100% rename from crates/brk_computer/src/states/outputs/by_up_to.rs rename to crates/brk_state/src/outputs/by_up_to.rs diff --git a/crates/brk_computer/src/states/outputs/by_value.rs b/crates/brk_state/src/outputs/by_value.rs similarity index 100% rename from crates/brk_computer/src/states/outputs/by_value.rs rename to crates/brk_state/src/outputs/by_value.rs diff --git a/crates/brk_computer/src/states/outputs/filter.rs b/crates/brk_state/src/outputs/filter.rs similarity index 100% rename from crates/brk_computer/src/states/outputs/filter.rs rename to crates/brk_state/src/outputs/filter.rs diff --git a/crates/brk_state/src/outputs/mod.rs b/crates/brk_state/src/outputs/mod.rs new file mode 100644 index 000000000..8484b7018 --- /dev/null +++ b/crates/brk_state/src/outputs/mod.rs @@ -0,0 +1,86 @@ +mod by_epoch; +mod by_from; +mod by_range; +mod by_size; +mod by_spendable_type; +mod by_term; +mod by_type; +mod by_unspendable_type; +mod by_up_to; +// mod by_value; +mod filter; + +pub use by_epoch::*; +pub use by_from::*; +pub use by_range::*; +pub use by_size::*; +pub use by_spendable_type::*; +pub use by_term::*; +pub use by_type::*; +pub use by_unspendable_type::*; +pub use by_up_to::*; +// pub use by_value::*; +pub use filter::*; + +#[derive(Default, Clone)] +pub struct Outputs { + pub all: T, + pub by_term: OutputsByTerm, + pub by_up_to: OutputsByUpTo, + pub by_from: OutputsByFrom, + pub by_range: OutputsByRange, + pub by_epoch: OutputsByEpoch, + pub by_type: OutputsBySpendableType, + pub by_size: OutputsBySize, + // // Needs whole UTXO set, TODO later + // // pub by_value: OutputsByValue, +} + +impl Outputs { + pub fn as_mut_vec(&mut self) -> Vec<&mut T> { + [&mut self.all] + .into_iter() + .chain(self.by_term.as_mut_vec()) + .chain(self.by_up_to.as_mut_vec()) + .chain(self.by_from.as_mut_vec()) + .chain(self.by_range.as_mut_vec()) + .chain(self.by_epoch.as_mut_vec()) + .chain(self.by_size.as_mut_vec()) + .chain(self.by_type.as_mut_vec()) + // // .chain(self.by_value.as_mut_vec()) + .collect::>() + } +} + +impl Outputs<(OutputFilter, T)> { + pub fn vecs(&self) -> Vec<&T> { + [&self.all.1] + .into_iter() + .chain(self.by_term.vecs()) + .chain(self.by_up_to.vecs()) + .chain(self.by_from.vecs()) + .chain(self.by_range.vecs()) + .chain(self.by_epoch.vecs()) + .chain(self.by_size.vecs()) + // // .chain(self.by_value.vecs()) + .chain(self.by_type.vecs()) + .collect::>() + } +} + +impl From> for Outputs<(OutputFilter, T)> { + fn from(value: Outputs) -> Self { + Self { + all: (OutputFilter::All, value.all), + by_term: OutputsByTerm::from(value.by_term), + by_up_to: OutputsByUpTo::from(value.by_up_to), + by_from: OutputsByFrom::from(value.by_from), + by_range: OutputsByRange::from(value.by_range), + by_epoch: OutputsByEpoch::from(value.by_epoch), + by_size: OutputsBySize::from(value.by_size), + // // Needs whole UTXO set, TODO later + // // by_value: OutputsByValue, + by_type: OutputsBySpendableType::from(value.by_type), + } + } +} diff --git a/crates/brk_computer/src/states/realized.rs b/crates/brk_state/src/realized.rs similarity index 100% rename from crates/brk_computer/src/states/realized.rs rename to crates/brk_state/src/realized.rs diff --git a/crates/brk_computer/src/states/supply.rs b/crates/brk_state/src/supply.rs similarity index 100% rename from crates/brk_computer/src/states/supply.rs rename to crates/brk_state/src/supply.rs diff --git a/crates/brk_computer/src/states/transacted.rs b/crates/brk_state/src/transacted.rs similarity index 100% rename from crates/brk_computer/src/states/transacted.rs rename to crates/brk_state/src/transacted.rs diff --git a/websites/kibo.money/scripts/options.js b/websites/kibo.money/scripts/options.js index c3f4d51a3..68c2d2b16 100644 --- a/websites/kibo.money/scripts/options.js +++ b/websites/kibo.money/scripts/options.js @@ -875,9 +875,9 @@ function createPartialOptions(colors) { } /** - * @typedef {"-ratio"} RatioCapSuffix - * @typedef {EndsWith} VecIdRatioCap - * @typedef {WithoutSuffix} VecIdRatioCapBase + * @typedef {"-ratio-zscore"} RatioZScoreCapSuffix + * @typedef {EndsWith} VecIdRatioZScoreCap + * @typedef {WithoutSuffix} VecIdRatioZScoreCapBase */ /** @@ -886,7 +886,7 @@ function createPartialOptions(colors) { * @param {string} args.name * @param {string} args.legend * @param {string} args.title - * @param {VecIdRatioCapBase} args.key + * @param {VecIdRatioZScoreCapBase} args.key * @param {Color} [args.color] */ function createPriceWithRatio({ name, title, legend, key, color }) { @@ -1230,7 +1230,7 @@ function createPartialOptions(colors) { color: useGroupName ? color : colors.green, }), createBaseSeries({ - key: `${key}realized-profit-sum`, + key: `${key}realized-profit`, name: useGroupName ? name : "Profit", color: useGroupName ? color : colors.green, }), @@ -1249,7 +1249,7 @@ function createPartialOptions(colors) { color: useGroupName ? color : colors.red, }), createBaseSeries({ - key: `${key}realized-loss-sum`, + key: `${key}realized-loss`, name: useGroupName ? name : "Loss", color: useGroupName ? color : colors.red, }), diff --git a/websites/kibo.money/scripts/service-worker.js b/websites/kibo.money/scripts/service-worker.js index cbfdc76b3..489cce46f 100644 --- a/websites/kibo.money/scripts/service-worker.js +++ b/websites/kibo.money/scripts/service-worker.js @@ -1,23 +1,19 @@ const version = "v1"; -self.addEventListener("install", (_event) => { +/** @type {ServiceWorkerGlobalScope} */ +const sw = /** @type {any} */ (self); + +sw.addEventListener("install", (_event) => { console.log("sw: install"); - // The worker skips waiting and becomes active immediately - self.skipWaiting(); + sw.skipWaiting(); }); -self.addEventListener("activate", (event) => { +sw.addEventListener("activate", (event) => { console.log("sw: active"); - event.waitUntil( - // Claim clients, so the SW starts controlling pages immediately - self.clients.claim(), - ); + event.waitUntil(sw.clients.claim()); }); -self.addEventListener("fetch", (_event) => { - const event = /** @type {any} */ (_event); - - /** @type {Request} */ +sw.addEventListener("fetch", (event) => { let request = event.request; const method = request.method; let url = request.url; @@ -67,7 +63,13 @@ self.addEventListener("fetch", (_event) => { .catch(() => { console.log("service-worker: offline"); - return cachedResponse; + return ( + cachedResponse || + new Response("Offline", { + status: 503, + statusText: "Service Unavailable", + }) + ); }); }), ); diff --git a/websites/kibo.money/tsconfig.json b/websites/kibo.money/tsconfig.json index 6dec788c9..10c8b56a2 100644 --- a/websites/kibo.money/tsconfig.json +++ b/websites/kibo.money/tsconfig.json @@ -4,7 +4,8 @@ "strict": true, "target": "ESNext", "module": "ESNext", - "outDir": "/tmp/kibo" + "outDir": "/tmp/kibo", + "lib": ["DOM", "DOM.Iterable", "ESNext", "WebWorker"] }, "exclude": ["assets", "packages", "ignore"] }