diff --git a/CHANGELOG.md b/CHANGELOG.md index ae5122317..cc13603fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,7 +25,6 @@ - Created separate crate for indexing called `bindex` - Created a crate a storage engine specialized in storing datasets that have indexes as keys and thus can be represented by an array/vec called `storable-vec` - Removed the need for the `-txindex=1` parameter when starting your Bitcoin Core node as kibō has its own indexes now -- Tried different storage engines such as `fjall`, `canopydb` and `heed`, the first ended up being 3 times slower than `sanakirja` and had very fragile files (just looking at them would corrupt them), and the rest wouldn't play nice with `rayon` which is a dealbreaker - `snkrj` added a robust auto defragmentation to improve disk usage without the need for user's intervention ## Git diff --git a/Cargo.lock b/Cargo.lock index 4913a9beb..93e87f14b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -214,6 +214,14 @@ checksum = "8f68f53c83ab957f72c32642f3868eec03eb974d1fb82e453128456482613d36" [[package]] name = "bomputer" version = "0.1.0" +dependencies = [ + "bindex", + "color-eyre", + "derive_deref", + "exit", + "jiff", + "rayon", +] [[package]] name = "byteorder" @@ -546,9 +554,9 @@ checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "jiff" -version = "0.1.25" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb73dbeee753ae9411475ddd8861765fa7f25fe1eebf180c24e1bbabef3fbdcd" +checksum = "a85348106ab244d90fe2d70faad939b71c5dad1258e5da9116e176064fc6c078" dependencies = [ "jiff-tzdb-platform", "log", diff --git a/Cargo.toml b/Cargo.toml index 95fb25da8..8a7b88571 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,16 @@ # edition = "2021" [workspace] -members = ["bindex", "biter", "bomputer", "exit", "iterable", "snkrj", "storable_vec"] +members = [ + "bindex", + "biter", + "bomputer", + "exit", + # "server", + "snkrj", + "struct_iterable", + "storable_vec", +] resolver = "2" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/bindex/Cargo.toml b/bindex/Cargo.toml index f716175b6..f07cd8537 100644 --- a/bindex/Cargo.toml +++ b/bindex/Cargo.toml @@ -10,7 +10,7 @@ color-eyre = "0.6.3" derive_deref = "1.1.1" exit = { path = "../exit" } fjall = "2.5.0" -jiff = "0.1.24" +jiff = "0.1.27" rapidhash = "1.3.0" rayon = "1.10.0" snkrj = { path = "../snkrj" } diff --git a/bindex/src/lib.rs b/bindex/src/lib.rs index f04a6cdcd..0d8cdbac4 100644 --- a/bindex/src/lib.rs +++ b/bindex/src/lib.rs @@ -7,10 +7,9 @@ use std::{ time::Duration, }; -use biter::{ - bitcoin::{Transaction, TxIn, TxOut, Txid}, - rpc, -}; +pub use biter::*; + +use biter::bitcoin::{Transaction, TxIn, TxOut, Txid}; use color_eyre::eyre::{eyre, ContextCompat}; use exit::Exit; use fjall::{PersistMode, ReadTransaction, TransactionalKeyspace}; @@ -19,8 +18,10 @@ use rayon::prelude::*; mod storage; mod structs; -use storage::{Partitions, Vecs}; -use structs::{ +pub use biter; + +use storage::{Fjalls, StorableVecs}; +pub use structs::{ Addressbytes, AddressbytesPrefix, Addressindex, Addresstype, Amount, BlockHashPrefix, Height, Timestamp, TxidPrefix, Txindex, Txinindex, Txoutindex, Vin, Vout, }; @@ -28,18 +29,24 @@ use structs::{ const UNSAFE_BLOCKS: u32 = 100; const SNAPSHOT_BLOCK_RANGE: usize = 1000; -#[derive(Debug)] -pub struct Indexer; +pub struct Indexer { + vecs: StorableVecs, + parts: Fjalls, +} impl Indexer { - pub fn index(indexes_dir: &Path, bitcoin_dir: &Path, rpc: rpc::Client, exit: Exit) -> color_eyre::Result<()> { + pub fn import(indexes_dir: &Path) -> color_eyre::Result { + let vecs = StorableVecs::import(&indexes_dir.join("vecs"))?; + let parts = Fjalls::import(&indexes_dir.join("fjall"))?; + + Ok(Self { vecs, parts }) + } + + pub fn index(&mut self, bitcoin_dir: &Path, rpc: rpc::Client, exit: &Exit) -> color_eyre::Result<()> { let check_collisions = true; - let mut vecs = Vecs::import(&indexes_dir.join("vecs"))?; - - let keyspace = fjall::Config::new(indexes_dir.join("fjall")).open_transactional()?; - let mut parts = Partitions::import(&keyspace, &exit)?; - let rtx = keyspace.read_tx(); + let vecs = &mut self.vecs; + let parts = &mut self.parts; let mut height = vecs .min_height() @@ -66,24 +73,14 @@ impl Indexer { let mut p2wpkhindex_global = vecs.height_to_first_p2wpkhindex.get_or_default(height)?; let mut p2wshindex_global = vecs.height_to_first_p2wshindex.get_or_default(height)?; - let export = |keyspace: &TransactionalKeyspace, - rtx: ReadTransaction, - parts: &mut Partitions, - vecs: &mut Vecs, - height: Height| - -> color_eyre::Result<()> { + let export = |parts: &mut Fjalls, vecs: &mut StorableVecs, height: Height| -> color_eyre::Result<()> { println!("Exporting..."); - drop(rtx); - exit.block(); thread::scope(|scope| -> color_eyre::Result<()> { let vecs_handle = scope.spawn(|| vecs.flush(height)); - - parts.write(keyspace, height)?; - keyspace.persist(PersistMode::SyncAll)?; - + parts.commit(height)?; vecs_handle.join().unwrap()?; Ok(()) })?; @@ -93,8 +90,8 @@ impl Indexer { Ok(()) }; - // let mut stores_opt = Some(stores); - let mut rtx_opt = Some(rtx); + // // let mut stores_opt = Some(stores); + // let mut rtx_opt = Some(rtx); biter::new(bitcoin_dir, Some(height.into()), None, rpc) .iter() @@ -105,7 +102,7 @@ impl Indexer { let timestamp = Timestamp::try_from(block.header.time)?; // let mut stores = stores_opt.take().context("option should have store")?; - let rtx = rtx_opt.take().context("option should have rtx")?; + // let rtx = rtx_opt.take().context("option should have rtx")?; if let Some(saved_blockhash) = vecs.height_to_blockhash.get(height)? { if &blockhash != saved_blockhash.as_ref() { @@ -118,7 +115,7 @@ impl Indexer { if parts .blockhash_prefix_to_height - .get(&rtx, &blockhash_prefix)? + .get(&blockhash_prefix)? .is_some_and(|prev_height| prev_height != height) { dbg!(blockhash); @@ -205,7 +202,7 @@ impl Indexer { let prev_txindex_slice_opt = if check_collisions && parts.txid_prefix_to_txindex.needs(height) { // Should only find collisions for two txids (duplicates), see below - parts.txid_prefix_to_txindex.get(&rtx, &txid_prefix)? + parts.txid_prefix_to_txindex.get(&txid_prefix)? } else { None }; @@ -246,7 +243,7 @@ impl Indexer { let prev_txindex = if let Some(txindex) = parts .txid_prefix_to_txindex - .get(&rtx, &TxidPrefix::try_from(&outpoint.txid)?)? + .get(&TxidPrefix::try_from(&outpoint.txid)?)? .and_then(|txindex| { // Checking if not finding txindex from the future (txindex < txindex_global).then_some(txindex) @@ -323,7 +320,7 @@ impl Indexer { let addressindex_opt = addressbytes_res.as_ref().ok().and_then(|addressbytes| { parts .addressbytes_prefix_to_addressindex - .get(&rtx, &AddressbytesPrefix::from((addressbytes, addresstype))) + .get(&AddressbytesPrefix::from((addressbytes, addresstype))) .unwrap() // Checking if not in the future .and_then(|addressindex_local| { @@ -546,7 +543,10 @@ impl Indexer { let block_txindex = txid_prefix_to_txid_and_block_txindex_and_prev_txindex .get(&TxidPrefix::try_from(&txid)?) - .context("txid should be in same block")? + .context("txid should be in same block").inspect_err(|_| { + dbg!(&txid_prefix_to_txid_and_block_txindex_and_prev_txindex); + // panic!(); + })? .2; let prev_txindex = txindex_global + block_txindex; @@ -654,22 +654,13 @@ impl Indexer { let should_snapshot = _height != 0 && _height % SNAPSHOT_BLOCK_RANGE == 0 && !exit.active(); if should_snapshot { - export(&keyspace, rtx, &mut parts, &mut vecs, height)?; - rtx_opt.replace(keyspace.read_tx()); - } else { - rtx_opt.replace(rtx); + export(parts, vecs, height)?; } Ok(()) })?; - export( - &keyspace, - rtx_opt.take().context("option should have wtx")?, - &mut parts, - &mut vecs, - height, - )?; + export(parts, vecs, height)?; sleep(Duration::from_millis(100)); @@ -683,7 +674,6 @@ enum InputSource<'a> { SameBlock((&'a Transaction, Txindex, &'a TxIn, Vin)), } -#[allow(unused)] fn pause() { let mut stdin = std::io::stdin(); let mut stdout = std::io::stdout(); diff --git a/bindex/src/main.rs b/bindex/src/main.rs index 9a0ee8dc3..7d6e08eb4 100644 --- a/bindex/src/main.rs +++ b/bindex/src/main.rs @@ -4,8 +4,6 @@ use bindex::Indexer; use biter::rpc; use exit::Exit; -// https://github.com/romanz/electrs/blob/master/doc/schema.md - fn main() -> color_eyre::Result<()> { color_eyre::install()?; @@ -18,7 +16,9 @@ fn main() -> color_eyre::Result<()> { let i = std::time::Instant::now(); - Indexer::index(Path::new("indexes"), data_dir, rpc, exit)?; + let mut indexer = Indexer::import(Path::new("indexes"))?; + + indexer.index(data_dir, rpc, &exit)?; dbg!(i.elapsed()); diff --git a/bindex/src/storage/canopy/database.rs b/bindex/src/storage/canopies/database.rs similarity index 100% rename from bindex/src/storage/canopy/database.rs rename to bindex/src/storage/canopies/database.rs diff --git a/bindex/src/storage/canopy/environment.rs b/bindex/src/storage/canopies/environment.rs similarity index 100% rename from bindex/src/storage/canopy/environment.rs rename to bindex/src/storage/canopies/environment.rs diff --git a/bindex/src/storage/canopy/mod.rs b/bindex/src/storage/canopies/mod.rs similarity index 100% rename from bindex/src/storage/canopy/mod.rs rename to bindex/src/storage/canopies/mod.rs diff --git a/bindex/src/storage/canopy/transaction.rs b/bindex/src/storage/canopies/transaction.rs similarity index 100% rename from bindex/src/storage/canopy/transaction.rs rename to bindex/src/storage/canopies/transaction.rs diff --git a/bindex/src/storage/canopy/tree.rs b/bindex/src/storage/canopies/tree.rs similarity index 100% rename from bindex/src/storage/canopy/tree.rs rename to bindex/src/storage/canopies/tree.rs diff --git a/bindex/src/storage/fjall/base.rs b/bindex/src/storage/fjall/base.rs deleted file mode 100644 index 9ed674187..000000000 --- a/bindex/src/storage/fjall/base.rs +++ /dev/null @@ -1,145 +0,0 @@ -use std::{collections::BTreeMap, mem}; - -use exit::Exit; -use fjall::{ - PartitionCreateOptions, PersistMode, ReadTransaction, Result, Slice, TransactionalKeyspace, - TransactionalPartitionHandle, TxKeyspace, WriteTransaction, -}; - -use crate::structs::{Height, Version}; - -pub struct Partition { - version: Version, - data: TransactionalPartitionHandle, - meta: TransactionalPartitionHandle, - height: Option, - puts: BTreeMap, -} - -impl Partition -where - Key: Into + Ord, - Value: Into + TryFrom + Clone, -{ - pub const VERSION: &str = "version"; - pub const HEIGHT: &str = "height"; - - pub fn import( - keyspace: &TransactionalKeyspace, - name: &str, - version: Version, - exit: &Exit, - ) -> color_eyre::Result { - let data = Self::open_data(keyspace, name)?; - let meta = Self::open_meta(keyspace, name)?; - - let height = if let Some(slice) = meta.get(Self::HEIGHT)? { - Some(Height::try_from(slice)?) - } else { - None - }; - - let mut this = Self { - version, - height, - data, - meta, - puts: BTreeMap::new(), - }; - - if let Some(slice) = this.meta.get(Self::VERSION)? { - if version != Version::try_from(slice)? { - this = this.reset(keyspace, name, exit)?; - } - } - - Ok(this) - } - - fn open_data(keyspace: &TransactionalKeyspace, name: &str) -> Result { - keyspace.open_partition(&format!("{name}-data"), Self::create_options()) - } - - fn open_meta(keyspace: &TransactionalKeyspace, name: &str) -> Result { - keyspace.open_partition(&format!("{name}-meta"), Self::create_options()) - } - - fn create_options() -> PartitionCreateOptions { - PartitionCreateOptions::default().manual_journal_persist(true) - } - - pub fn has(&self, height: Height) -> bool { - self.height.is_some_and(|self_height| self_height >= height) - } - pub fn needs(&self, height: Height) -> bool { - !self.has(height) - } - - pub fn get<'a>(&self, rtx: &ReadTransaction, key: &'a Key) -> color_eyre::Result> - where - fjall::Slice: std::convert::From<&'a Key>, - >::Error: std::error::Error + Send + Sync, - >::Error: 'static, - { - if let Some(v) = self.puts.get(key) { - return Ok(Some(v.clone())); - } - - if let Some(slice) = rtx.get(&self.data, Slice::from(key))? { - let v_res = Value::try_from(slice); - let v = v_res?; - Ok(Some(v)) - } else { - Ok(None) - } - } - - pub fn insert_if_needed(&mut self, key: Key, value: Value, height: Height) { - if self.needs(height) { - self.puts.insert(key, value); - } - } - - fn update_meta(&self, wtx: &mut WriteTransaction, height: Height) { - wtx.insert(&self.meta, Self::VERSION, self.version()); - wtx.insert(&self.meta, Self::HEIGHT, height); - } - - pub fn write(&mut self, keyspace: &TxKeyspace, height: Height) -> Result<()> { - if self.has(height) && self.puts.is_empty() { - return Ok(()); - } - - let mut wtx = keyspace.write_tx(); - mem::take(&mut self.puts) - .into_iter() - .for_each(|(key, value)| wtx.insert(&self.data, key, value)); - self.update_meta(&mut wtx, height); - wtx.commit() - } - - pub fn version(&self) -> Version { - self.version - } - - fn reset(mut self, keyspace: &TransactionalKeyspace, name: &str, exit: &Exit) -> Result { - exit.block(); - - keyspace.delete_partition(self.data)?; - keyspace.delete_partition(self.meta)?; - - keyspace.persist(PersistMode::SyncAll)?; - - self.data = Self::open_data(keyspace, name)?; - self.meta = Self::open_meta(keyspace, name)?; - self.height = None; - - exit.unblock(); - - Ok(self) - } - - pub fn height(&self) -> Option<&Height> { - self.height.as_ref() - } -} diff --git a/bindex/src/storage/fjalls/base.rs b/bindex/src/storage/fjalls/base.rs new file mode 100644 index 000000000..43385992c --- /dev/null +++ b/bindex/src/storage/fjalls/base.rs @@ -0,0 +1,102 @@ +use std::{collections::BTreeMap, mem, path::Path}; + +use fjall::{ + PartitionCreateOptions, PersistMode, ReadTransaction, Result, Slice, TransactionalKeyspace, + TransactionalPartitionHandle, +}; + +use crate::structs::{Height, Version}; + +use super::Meta; + +pub struct Partition { + meta: Meta, + keyspace: TransactionalKeyspace, + part: TransactionalPartitionHandle, + rtx: ReadTransaction, + puts: BTreeMap, +} + +impl Partition +where + Key: Into + Ord, + Value: Into + TryFrom + Clone, +{ + pub fn import(path: &Path, version: Version) -> color_eyre::Result { + let meta = Meta::checked_open(path, version)?; + + let keyspace = fjall::Config::new(path.join("fjall")).open_transactional()?; + let handle = keyspace.open_partition( + "partition", + PartitionCreateOptions::default().manual_journal_persist(true), + )?; + let rtx = keyspace.read_tx(); + + Ok(Self { + meta, + keyspace, + part: handle, + rtx, + puts: BTreeMap::new(), + }) + } + + pub fn len(&self) -> usize { + self.meta.len() + self.puts.len() + } + + pub fn has(&self, height: Height) -> bool { + self.height().is_some_and(|self_height| self_height >= &height) + } + pub fn needs(&self, height: Height) -> bool { + !self.has(height) + } + + pub fn get<'a>(&self, key: &'a Key) -> color_eyre::Result> + where + fjall::Slice: std::convert::From<&'a Key>, + >::Error: std::error::Error + Send + Sync, + >::Error: 'static, + { + if let Some(v) = self.puts.get(key) { + return Ok(Some(v.clone())); + } + + if let Some(slice) = self.rtx.get(&self.part, Slice::from(key))? { + let v_res = Value::try_from(slice); + let v = v_res?; + Ok(Some(v)) + } else { + Ok(None) + } + } + + pub fn insert_if_needed(&mut self, key: Key, value: Value, height: Height) { + if self.needs(height) { + self.puts.insert(key, value); + } + } + + pub fn commit(&mut self, height: Height) -> Result<()> { + if self.has(height) && self.puts.is_empty() { + return Ok(()); + } + + let mut wtx = self.keyspace.write_tx(); + mem::take(&mut self.puts) + .into_iter() + .for_each(|(key, value)| wtx.insert(&self.part, key, value)); + self.meta.export(self.len(), height)?; + wtx.commit()?; + + self.keyspace.persist(PersistMode::SyncAll)?; + + self.rtx = self.keyspace.read_tx(); + + Ok(()) + } + + pub fn height(&self) -> Option<&Height> { + self.meta.height() + } +} diff --git a/bindex/src/storage/fjalls/meta.rs b/bindex/src/storage/fjalls/meta.rs new file mode 100644 index 000000000..3c04e38e2 --- /dev/null +++ b/bindex/src/storage/fjalls/meta.rs @@ -0,0 +1,92 @@ +use std::{ + fs, io, + path::{Path, PathBuf}, +}; + +use storable_vec::UnsafeSizedSerDe; + +use super::{Height, Version}; + +pub struct Meta { + pathbuf: PathBuf, + version: Version, + height: Option, + len: usize, +} + +impl Meta { + pub fn checked_open(path: &Path, version: Version) -> color_eyre::Result { + fs::create_dir_all(path)?; + + let is_same_version = + Version::try_from(Self::path_version_(path).as_path()).is_ok_and(|prev_version| version == prev_version); + + if !is_same_version { + fs::remove_dir_all(path)?; + fs::create_dir(path)?; + } + + let this = Self { + pathbuf: path.to_owned(), + version, + height: Height::try_from(Self::path_height_(path).as_path()).ok(), + len: Self::read_length_(path)?, + }; + + this.version.write(&this.path_version())?; + + Ok(this) + } + + pub fn len(&self) -> usize { + self.len + } + + pub fn export(&mut self, len: usize, height: Height) -> io::Result<()> { + self.len = len; + self.write_length()?; + self.height = Some(height); + height.write(&self.path_height()) + } + + fn path_version(&self) -> PathBuf { + Self::path_version_(&self.pathbuf) + } + fn path_version_(path: &Path) -> PathBuf { + path.join("version") + } + + pub fn height(&self) -> Option<&Height> { + self.height.as_ref() + } + pub fn needs(&self, height: Height) -> bool { + self.height.is_none_or(|self_height| height > self_height) + } + pub fn has(&self, height: Height) -> bool { + !self.needs(height) + } + fn path_height(&self) -> PathBuf { + Self::path_height_(&self.pathbuf) + } + fn path_height_(path: &Path) -> PathBuf { + path.join("height") + } + + fn read_length(&self) -> color_eyre::Result { + Self::read_length_(&self.pathbuf) + } + fn read_length_(path: &Path) -> color_eyre::Result { + Ok(fs::read(Self::path_length(path)) + .map(|v| usize::unsafe_try_from_slice(v.as_slice()).cloned().unwrap_or_default()) + .unwrap_or_default()) + } + fn write_length(&self) -> io::Result<()> { + Self::write_length_(&self.pathbuf, self.len) + } + fn write_length_(path: &Path, len: usize) -> Result<(), io::Error> { + fs::write(Self::path_length(path), len.to_le_bytes()) + } + fn path_length(path: &Path) -> PathBuf { + path.join("length") + } +} diff --git a/bindex/src/storage/fjall/mod.rs b/bindex/src/storage/fjalls/mod.rs similarity index 82% rename from bindex/src/storage/fjall/mod.rs rename to bindex/src/storage/fjalls/mod.rs index e458eacc6..3d17bb007 100644 --- a/bindex/src/storage/fjall/mod.rs +++ b/bindex/src/storage/fjalls/mod.rs @@ -1,34 +1,28 @@ -use std::thread; +use std::{path::Path, thread}; use crate::{structs::Version, AddressbytesPrefix, Addressindex, BlockHashPrefix, Height, TxidPrefix, Txindex}; mod base; -use base::*; -use exit::Exit; -use fjall::{TransactionalKeyspace, TxKeyspace}; +mod meta; -pub struct Partitions { +use base::*; +use meta::*; + +pub struct Fjalls { pub addressbytes_prefix_to_addressindex: Partition, pub blockhash_prefix_to_height: Partition, pub txid_prefix_to_txindex: Partition, } -impl Partitions { - pub fn import(keyspace: &TransactionalKeyspace, exit: &Exit) -> color_eyre::Result { +impl Fjalls { + pub fn import(path: &Path) -> color_eyre::Result { Ok(Self { addressbytes_prefix_to_addressindex: Partition::import( - keyspace, - "addressbytes_prefix_to_addressindex", + &path.join("addressbytes_prefix_to_addressindex"), Version::from(1), - exit, )?, - blockhash_prefix_to_height: Partition::import( - keyspace, - "blockhash_prefix_to_height", - Version::from(1), - exit, - )?, - txid_prefix_to_txindex: Partition::import(keyspace, "txid_prefix_to_txindex", Version::from(1), exit)?, + blockhash_prefix_to_height: Partition::import(&path.join("blockhash_prefix_to_height"), Version::from(1))?, + txid_prefix_to_txindex: Partition::import(&path.join("txid_prefix_to_txindex"), Version::from(1))?, }) } @@ -163,18 +157,17 @@ impl Partitions { .cloned() } - pub fn write(&mut self, keyspace: &TxKeyspace, height: Height) -> fjall::Result<()> { + pub fn commit(&mut self, height: Height) -> fjall::Result<()> { thread::scope(|scope| { - let addressbytes_prefix_to_addressindex_write_handle = - scope.spawn(|| self.addressbytes_prefix_to_addressindex.write(keyspace, height)); - let blockhash_prefix_to_height_write_handle = - scope.spawn(|| self.blockhash_prefix_to_height.write(keyspace, height)); - let txid_prefix_to_txindex_write_handle = - scope.spawn(|| self.txid_prefix_to_txindex.write(keyspace, height)); + let addressbytes_prefix_to_addressindex_commit_handle = + scope.spawn(|| self.addressbytes_prefix_to_addressindex.commit(height)); + let blockhash_prefix_to_height_commit_handle = + scope.spawn(|| self.blockhash_prefix_to_height.commit(height)); + let txid_prefix_to_txindex_commit_handle = scope.spawn(|| self.txid_prefix_to_txindex.commit(height)); - addressbytes_prefix_to_addressindex_write_handle.join().unwrap()?; - blockhash_prefix_to_height_write_handle.join().unwrap()?; - txid_prefix_to_txindex_write_handle.join().unwrap()?; + addressbytes_prefix_to_addressindex_commit_handle.join().unwrap()?; + blockhash_prefix_to_height_commit_handle.join().unwrap()?; + txid_prefix_to_txindex_commit_handle.join().unwrap()?; Ok(()) }) diff --git a/bindex/src/storage/mod.rs b/bindex/src/storage/mod.rs index c920d9e38..f25e0398a 100644 --- a/bindex/src/storage/mod.rs +++ b/bindex/src/storage/mod.rs @@ -1,9 +1,9 @@ // mod canopy; -mod fjall; +mod fjalls; // mod sanakirja; -mod storable_vec; +mod storable_vecs; // pub use canopy::*; -pub use fjall::*; +pub use fjalls::*; // pub use sanakirja::*; -pub use storable_vec::*; +pub use storable_vecs::*; diff --git a/bindex/src/storage/sanakirja/meta.rs b/bindex/src/storage/sanakirjas/meta.rs similarity index 100% rename from bindex/src/storage/sanakirja/meta.rs rename to bindex/src/storage/sanakirjas/meta.rs diff --git a/bindex/src/storage/sanakirja/mod.rs b/bindex/src/storage/sanakirjas/mod.rs similarity index 100% rename from bindex/src/storage/sanakirja/mod.rs rename to bindex/src/storage/sanakirjas/mod.rs diff --git a/bindex/src/storage/sanakirja/multi.rs b/bindex/src/storage/sanakirjas/multi.rs similarity index 100% rename from bindex/src/storage/sanakirja/multi.rs rename to bindex/src/storage/sanakirjas/multi.rs diff --git a/bindex/src/storage/sanakirja/unique.rs b/bindex/src/storage/sanakirjas/unique.rs similarity index 100% rename from bindex/src/storage/sanakirja/unique.rs rename to bindex/src/storage/sanakirjas/unique.rs diff --git a/bindex/src/storage/storable_vec/base.rs b/bindex/src/storage/storable_vecs/base.rs similarity index 100% rename from bindex/src/storage/storable_vec/base.rs rename to bindex/src/storage/storable_vecs/base.rs diff --git a/bindex/src/storage/storable_vec/mod.rs b/bindex/src/storage/storable_vecs/mod.rs similarity index 99% rename from bindex/src/storage/storable_vec/mod.rs rename to bindex/src/storage/storable_vecs/mod.rs index 83487ebab..a9ea76211 100644 --- a/bindex/src/storage/storable_vec/mod.rs +++ b/bindex/src/storage/storable_vecs/mod.rs @@ -14,7 +14,7 @@ mod base; use base::*; -pub struct Vecs { +pub struct StorableVecs { pub addressindex_to_addresstype: StorableVec, pub addressindex_to_addresstypeindex: StorableVec, pub addressindex_to_height: StorableVec, @@ -75,7 +75,7 @@ pub struct Vecs { // const UNSAFE_BLOCKS: usize = 100; -impl Vecs { +impl StorableVecs { pub fn import(path: &Path) -> color_eyre::Result { fs::create_dir_all(path)?; diff --git a/bomputer/Cargo.toml b/bomputer/Cargo.toml index ad1754861..cd8dcb5ea 100644 --- a/bomputer/Cargo.toml +++ b/bomputer/Cargo.toml @@ -4,3 +4,9 @@ version = "0.1.0" edition = "2021" [dependencies] +bindex = { path = "../bindex" } +color-eyre = "0.6.3" +derive_deref = "1.1.1" +exit = { path = "../exit" } +jiff = "0.1.27" +rayon = "1.10.0" diff --git a/bomputer/src/lib.rs b/bomputer/src/lib.rs index 00a8d195b..a1e960b65 100644 --- a/bomputer/src/lib.rs +++ b/bomputer/src/lib.rs @@ -1,18 +1,35 @@ +use std::path::Path; + +use bindex::{biter::rpc, Indexer}; +use exit::Exit; + mod structs; use structs::*; -pub fn add(left: u64, right: u64) -> u64 { - left + right +pub struct Bomputer; + +impl Bomputer { + pub fn compute() {} } -#[cfg(test)] -mod tests { - use super::*; +pub fn main() -> color_eyre::Result<()> { + color_eyre::install()?; - #[test] - fn it_works() { - let result = add(2, 2); - assert_eq!(result, 4); - } + let data_dir = Path::new("../../bitcoin"); + let rpc = rpc::Client::new( + "http://localhost:8332", + rpc::Auth::CookieFile(Path::new(data_dir).join(".cookie")), + )?; + let exit = Exit::new(); + + let i = std::time::Instant::now(); + + let mut indexer = Indexer::import(Path::new("indexes"))?; + + indexer.index(data_dir, rpc, &exit)?; + + dbg!(i.elapsed()); + + Ok(()) } diff --git a/bomputer/src/main.rs b/bomputer/src/main.rs new file mode 100644 index 000000000..164fa7fa1 --- /dev/null +++ b/bomputer/src/main.rs @@ -0,0 +1,13 @@ +use structs::Date; + +mod structs; + +pub fn main() -> color_eyre::Result<()> { + let date1 = Date::from(jiff::civil::Date::constant(2009, 1, 9)); + let date2 = Date::from(jiff::civil::Date::constant(2009, 1, 31)); + let date3 = Date::from(jiff::civil::Date::constant(2019, 1, 9)); + dbg!(usize::try_from(date1))?; + dbg!(usize::try_from(date2))?; + dbg!(usize::try_from(date3))?; + Ok(()) +} diff --git a/bomputer/src/structs/date.rs b/bomputer/src/structs/date.rs index 207c88d3d..c603135c1 100644 --- a/bomputer/src/structs/date.rs +++ b/bomputer/src/structs/date.rs @@ -1,19 +1,41 @@ -use jiff::tz::TimeZone; +use bindex::Timestamp; +use color_eyre::eyre::eyre; +use derive_deref::Deref; +use jiff::{civil::Date as _Date, tz::TimeZone}; -use super::Timestamp; +#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Deref)] +pub struct Date(_Date); -#[derive(Debug, Clone)] -pub struct Date(jiff::civil::Date); +impl Date { + const INDEX_ZERO: Self = Self(_Date::constant(2009, 1, 3)); + const INDEX_ONE: Self = Self(_Date::constant(2009, 1, 9)); +} -impl From<&Timestamp> for Date { - fn from(value: &Timestamp) -> Self { - Self(jiff::civil::Date::from(value.to_zoned(TimeZone::UTC))) +impl From<_Date> for Date { + fn from(value: _Date) -> Self { + Self(value) } } -impl From for usize { - // 2009-01-03 => 0 - // 2009-01-09 => 1 - // 2009-01-10 => 2 - // ... +impl From<&Timestamp> for Date { + fn from(value: &Timestamp) -> Self { + Self(_Date::from(value.to_zoned(TimeZone::UTC))) + } +} + +impl TryFrom for usize { + type Error = color_eyre::Report; + fn try_from(value: Date) -> Result { + if value < Date::INDEX_ZERO { + Err(eyre!("Date is too early")) + } else if value == Date::INDEX_ZERO { + Ok(0) + } else if value < Date::INDEX_ONE { + Err(eyre!("Date is between first and second")) + } else if value == Date::INDEX_ONE { + Ok(1) + } else { + Ok(Date::INDEX_ONE.until(*value)?.get_days() as usize + 1) + } + } } diff --git a/server/Cargo.toml b/server/Cargo.toml new file mode 100644 index 000000000..b453775bb --- /dev/null +++ b/server/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "kibo_server" +version = "0.6.0" +edition = "2021" + +[dependencies] +# allocative = "0.3.4" +axum = "0.7.9" +# bincode = { git = "https://github.com/bincode-org/bincode.git", features = [ +# "serde", +# ] } +# bitcoin_hashes = { version = "0.15.0" } +# biter = { path = "./src/crates/biter" } +# chrono = { version = "0.4.39", features = ["serde"] } +# clap = { version = "4.5.26", features = ["derive"] } +# color-eyre = "0.6.3" +# ctrlc = { version = "3.4.5", features = ["termination"] } +# derive_deref = "1.1.1" +# env_logger = "0.11.6" +# inferno = "0.12.1" +# itertools = "0.13.0" +# log = { version = "0.4.25", features = ["std", "serde"] } +# ordered-float = "4.6.0" +# rayon = "1.10.0" +# regex = "1.11.1" +# reqwest = { version = "0.12.12", features = ["blocking", "json"] } +# rlimit = "0.10.2" +# snkrj = { path = "./src/crates/snkrj" } +# serde = { version = "1.0.217", features = ["derive"] } +# serde_json = "1.0.135" +# struct_iterable = { path = "./src/crates/iterable" } +# swc = "9.0.2" +# swc_common = "5.0.0" +# tokio = { version = "1.43.0", features = ["full"] } +# toml = "0.8.19" +# tower-http = { version = "0.6.2", features = ["compression-full"] } +# zstd = "0.13.2" diff --git a/src/server/api/handlers/dataset.rs b/server/src/api/handlers/dataset.rs similarity index 100% rename from src/server/api/handlers/dataset.rs rename to server/src/api/handlers/dataset.rs diff --git a/src/server/api/handlers/last_values.rs b/server/src/api/handlers/last_values.rs similarity index 100% rename from src/server/api/handlers/last_values.rs rename to server/src/api/handlers/last_values.rs diff --git a/src/server/api/handlers/mod.rs b/server/src/api/handlers/mod.rs similarity index 100% rename from src/server/api/handlers/mod.rs rename to server/src/api/handlers/mod.rs diff --git a/src/server/api/mod.rs b/server/src/api/mod.rs similarity index 100% rename from src/server/api/mod.rs rename to server/src/api/mod.rs diff --git a/src/server/api/structs/chunk_metadata.rs b/server/src/api/structs/chunk_metadata.rs similarity index 100% rename from src/server/api/structs/chunk_metadata.rs rename to server/src/api/structs/chunk_metadata.rs diff --git a/src/server/api/structs/extension.rs b/server/src/api/structs/extension.rs similarity index 100% rename from src/server/api/structs/extension.rs rename to server/src/api/structs/extension.rs diff --git a/src/server/api/structs/kind.rs b/server/src/api/structs/kind.rs similarity index 100% rename from src/server/api/structs/kind.rs rename to server/src/api/structs/kind.rs diff --git a/src/server/api/structs/mod.rs b/server/src/api/structs/mod.rs similarity index 100% rename from src/server/api/structs/mod.rs rename to server/src/api/structs/mod.rs diff --git a/src/server/api/structs/range.rs b/server/src/api/structs/range.rs similarity index 100% rename from src/server/api/structs/range.rs rename to server/src/api/structs/range.rs diff --git a/src/server/api/structs/route.rs b/server/src/api/structs/route.rs similarity index 100% rename from src/server/api/structs/route.rs rename to server/src/api/structs/route.rs diff --git a/src/server/api/structs/routes.rs b/server/src/api/structs/routes.rs similarity index 100% rename from src/server/api/structs/routes.rs rename to server/src/api/structs/routes.rs diff --git a/src/server/header_map.rs b/server/src/header_map.rs similarity index 100% rename from src/server/header_map.rs rename to server/src/header_map.rs diff --git a/src/server/mod.rs b/server/src/lib.rs similarity index 100% rename from src/server/mod.rs rename to server/src/lib.rs diff --git a/src/server/response.rs b/server/src/response.rs similarity index 100% rename from src/server/response.rs rename to server/src/response.rs diff --git a/src/server/website/handlers/_minify.rs b/server/src/website/handlers/_minify.rs similarity index 100% rename from src/server/website/handlers/_minify.rs rename to server/src/website/handlers/_minify.rs diff --git a/src/server/website/handlers/file.rs b/server/src/website/handlers/file.rs similarity index 100% rename from src/server/website/handlers/file.rs rename to server/src/website/handlers/file.rs diff --git a/src/server/website/handlers/minify.rs b/server/src/website/handlers/minify.rs similarity index 100% rename from src/server/website/handlers/minify.rs rename to server/src/website/handlers/minify.rs diff --git a/src/server/website/handlers/mod.rs b/server/src/website/handlers/mod.rs similarity index 100% rename from src/server/website/handlers/mod.rs rename to server/src/website/handlers/mod.rs diff --git a/src/server/website/mod.rs b/server/src/website/mod.rs similarity index 100% rename from src/server/website/mod.rs rename to server/src/website/mod.rs diff --git a/iterable/Cargo.lock b/struct_iterable/Cargo.lock similarity index 100% rename from iterable/Cargo.lock rename to struct_iterable/Cargo.lock diff --git a/iterable/Cargo.toml b/struct_iterable/Cargo.toml similarity index 100% rename from iterable/Cargo.toml rename to struct_iterable/Cargo.toml diff --git a/iterable/README.md b/struct_iterable/README.md similarity index 100% rename from iterable/README.md rename to struct_iterable/README.md diff --git a/iterable/src/lib.rs b/struct_iterable/src/lib.rs similarity index 100% rename from iterable/src/lib.rs rename to struct_iterable/src/lib.rs diff --git a/iterable/struct_iterable_derive/Cargo.toml b/struct_iterable/struct_iterable_derive/Cargo.toml similarity index 100% rename from iterable/struct_iterable_derive/Cargo.toml rename to struct_iterable/struct_iterable_derive/Cargo.toml diff --git a/iterable/struct_iterable_derive/README.md b/struct_iterable/struct_iterable_derive/README.md similarity index 100% rename from iterable/struct_iterable_derive/README.md rename to struct_iterable/struct_iterable_derive/README.md diff --git a/iterable/struct_iterable_derive/src/lib.rs b/struct_iterable/struct_iterable_derive/src/lib.rs similarity index 100% rename from iterable/struct_iterable_derive/src/lib.rs rename to struct_iterable/struct_iterable_derive/src/lib.rs diff --git a/iterable/struct_iterable_internal/Cargo.toml b/struct_iterable/struct_iterable_internal/Cargo.toml similarity index 100% rename from iterable/struct_iterable_internal/Cargo.toml rename to struct_iterable/struct_iterable_internal/Cargo.toml diff --git a/iterable/struct_iterable_internal/README.md b/struct_iterable/struct_iterable_internal/README.md similarity index 100% rename from iterable/struct_iterable_internal/README.md rename to struct_iterable/struct_iterable_internal/README.md diff --git a/iterable/struct_iterable_internal/src/lib.rs b/struct_iterable/struct_iterable_internal/src/lib.rs similarity index 100% rename from iterable/struct_iterable_internal/src/lib.rs rename to struct_iterable/struct_iterable_internal/src/lib.rs diff --git a/src/website/assets/fonts/satoshi/2024-09/font.var.woff2 b/website/assets/fonts/satoshi/2024-09/font.var.woff2 similarity index 100% rename from src/website/assets/fonts/satoshi/2024-09/font.var.woff2 rename to website/assets/fonts/satoshi/2024-09/font.var.woff2 diff --git a/src/website/assets/fonts/satoshi/FFL.txt b/website/assets/fonts/satoshi/FFL.txt similarity index 100% rename from src/website/assets/fonts/satoshi/FFL.txt rename to website/assets/fonts/satoshi/FFL.txt diff --git a/src/website/assets/pdfs/block/2022-report.pdf b/website/assets/pdfs/block/2022-report.pdf similarity index 100% rename from src/website/assets/pdfs/block/2022-report.pdf rename to website/assets/pdfs/block/2022-report.pdf diff --git a/src/website/assets/pdfs/braiins/building-bitcoin-in-rust.pdf b/website/assets/pdfs/braiins/building-bitcoin-in-rust.pdf similarity index 100% rename from src/website/assets/pdfs/braiins/building-bitcoin-in-rust.pdf rename to website/assets/pdfs/braiins/building-bitcoin-in-rust.pdf diff --git a/src/website/assets/pdfs/glassnode/cointime-economics.pdf b/website/assets/pdfs/glassnode/cointime-economics.pdf similarity index 100% rename from src/website/assets/pdfs/glassnode/cointime-economics.pdf rename to website/assets/pdfs/glassnode/cointime-economics.pdf diff --git a/src/website/assets/pdfs/multi-author/bcap_v1.0.pdf b/website/assets/pdfs/multi-author/bcap_v1.0.pdf similarity index 100% rename from src/website/assets/pdfs/multi-author/bcap_v1.0.pdf rename to website/assets/pdfs/multi-author/bcap_v1.0.pdf diff --git a/src/website/assets/pdfs/nakamoto-project/understanding-bitcoin-adoption-in-the-united-states.pdf b/website/assets/pdfs/nakamoto-project/understanding-bitcoin-adoption-in-the-united-states.pdf similarity index 100% rename from src/website/assets/pdfs/nakamoto-project/understanding-bitcoin-adoption-in-the-united-states.pdf rename to website/assets/pdfs/nakamoto-project/understanding-bitcoin-adoption-in-the-united-states.pdf diff --git a/src/website/assets/pdfs/nydig/protection-under-first-amendment.pdf b/website/assets/pdfs/nydig/protection-under-first-amendment.pdf similarity index 100% rename from src/website/assets/pdfs/nydig/protection-under-first-amendment.pdf rename to website/assets/pdfs/nydig/protection-under-first-amendment.pdf diff --git a/src/website/assets/pdfs/satoshi-nakamoto/whitepaper.pdf b/website/assets/pdfs/satoshi-nakamoto/whitepaper.pdf similarity index 100% rename from src/website/assets/pdfs/satoshi-nakamoto/whitepaper.pdf rename to website/assets/pdfs/satoshi-nakamoto/whitepaper.pdf diff --git a/src/website/assets/pdfs/square/2021-bitcoin-clean-energy-initiative.pdf b/website/assets/pdfs/square/2021-bitcoin-clean-energy-initiative.pdf similarity index 100% rename from src/website/assets/pdfs/square/2021-bitcoin-clean-energy-initiative.pdf rename to website/assets/pdfs/square/2021-bitcoin-clean-energy-initiative.pdf diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-icon-180.png b/website/assets/pwa/2024-11-20_09-41-25/apple-icon-180.png similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-icon-180.png rename to website/assets/pwa/2024-11-20_09-41-25/apple-icon-180.png diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1125-2436.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1125-2436.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1125-2436.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-1125-2436.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1136-640.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1136-640.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1136-640.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-1136-640.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1170-2532.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1170-2532.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1170-2532.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-1170-2532.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1179-2556.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1179-2556.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1179-2556.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-1179-2556.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1242-2208.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1242-2208.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1242-2208.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-1242-2208.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1242-2688.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1242-2688.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1242-2688.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-1242-2688.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1284-2778.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1284-2778.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1284-2778.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-1284-2778.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1290-2796.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1290-2796.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1290-2796.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-1290-2796.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1334-750.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1334-750.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1334-750.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-1334-750.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1488-2266.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1488-2266.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1488-2266.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-1488-2266.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1536-2048.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1536-2048.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1536-2048.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-1536-2048.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1620-2160.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1620-2160.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1620-2160.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-1620-2160.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1640-2360.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1640-2360.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1640-2360.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-1640-2360.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1668-2224.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1668-2224.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1668-2224.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-1668-2224.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1668-2388.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1668-2388.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1668-2388.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-1668-2388.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1792-828.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1792-828.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-1792-828.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-1792-828.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2048-1536.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2048-1536.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2048-1536.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-2048-1536.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2048-2732.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2048-2732.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2048-2732.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-2048-2732.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2160-1620.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2160-1620.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2160-1620.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-2160-1620.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2208-1242.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2208-1242.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2208-1242.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-2208-1242.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2224-1668.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2224-1668.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2224-1668.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-2224-1668.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2266-1488.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2266-1488.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2266-1488.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-2266-1488.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2360-1640.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2360-1640.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2360-1640.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-2360-1640.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2388-1668.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2388-1668.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2388-1668.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-2388-1668.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2436-1125.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2436-1125.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2436-1125.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-2436-1125.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2532-1170.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2532-1170.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2532-1170.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-2532-1170.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2556-1179.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2556-1179.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2556-1179.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-2556-1179.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2688-1242.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2688-1242.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2688-1242.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-2688-1242.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2732-2048.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2732-2048.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2732-2048.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-2732-2048.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2778-1284.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2778-1284.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2778-1284.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-2778-1284.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2796-1290.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2796-1290.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-2796-1290.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-2796-1290.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-640-1136.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-640-1136.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-640-1136.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-640-1136.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-750-1334.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-750-1334.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-750-1334.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-750-1334.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-828-1792.jpg b/website/assets/pwa/2024-11-20_09-41-25/apple-splash-828-1792.jpg similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/apple-splash-828-1792.jpg rename to website/assets/pwa/2024-11-20_09-41-25/apple-splash-828-1792.jpg diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/favicon-196.png b/website/assets/pwa/2024-11-20_09-41-25/favicon-196.png similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/favicon-196.png rename to website/assets/pwa/2024-11-20_09-41-25/favicon-196.png diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/index.html b/website/assets/pwa/2024-11-20_09-41-25/index.html similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/index.html rename to website/assets/pwa/2024-11-20_09-41-25/index.html diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/manifest-icon-192.maskable.png b/website/assets/pwa/2024-11-20_09-41-25/manifest-icon-192.maskable.png similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/manifest-icon-192.maskable.png rename to website/assets/pwa/2024-11-20_09-41-25/manifest-icon-192.maskable.png diff --git a/src/website/assets/pwa/2024-11-20_09-41-25/manifest-icon-512.maskable.png b/website/assets/pwa/2024-11-20_09-41-25/manifest-icon-512.maskable.png similarity index 100% rename from src/website/assets/pwa/2024-11-20_09-41-25/manifest-icon-512.maskable.png rename to website/assets/pwa/2024-11-20_09-41-25/manifest-icon-512.maskable.png diff --git a/src/website/assets/pwa/index.html b/website/assets/pwa/index.html similarity index 100% rename from src/website/assets/pwa/index.html rename to website/assets/pwa/index.html diff --git a/src/website/generate-icons.sh b/website/generate-icons.sh similarity index 100% rename from src/website/generate-icons.sh rename to website/generate-icons.sh diff --git a/src/website/index.html b/website/index.html similarity index 100% rename from src/website/index.html rename to website/index.html diff --git a/src/website/jsconfig.json b/website/jsconfig.json similarity index 100% rename from src/website/jsconfig.json rename to website/jsconfig.json diff --git a/src/website/manifest.webmanifest b/website/manifest.webmanifest similarity index 100% rename from src/website/manifest.webmanifest rename to website/manifest.webmanifest diff --git a/src/website/misc/tailwindTo550.js b/website/misc/tailwindTo550.js similarity index 100% rename from src/website/misc/tailwindTo550.js rename to website/misc/tailwindTo550.js diff --git a/src/website/packages/lean-qr/README.md b/website/packages/lean-qr/README.md similarity index 100% rename from src/website/packages/lean-qr/README.md rename to website/packages/lean-qr/README.md diff --git a/src/website/packages/lean-qr/v2.3.4/script.js b/website/packages/lean-qr/v2.3.4/script.js similarity index 100% rename from src/website/packages/lean-qr/v2.3.4/script.js rename to website/packages/lean-qr/v2.3.4/script.js diff --git a/src/website/packages/lean-qr/v2.3.4/types.d.ts b/website/packages/lean-qr/v2.3.4/types.d.ts similarity index 100% rename from src/website/packages/lean-qr/v2.3.4/types.d.ts rename to website/packages/lean-qr/v2.3.4/types.d.ts diff --git a/src/website/packages/lightweight-charts/NOTICE.md b/website/packages/lightweight-charts/NOTICE.md similarity index 100% rename from src/website/packages/lightweight-charts/NOTICE.md rename to website/packages/lightweight-charts/NOTICE.md diff --git a/src/website/packages/lightweight-charts/README.md b/website/packages/lightweight-charts/README.md similarity index 100% rename from src/website/packages/lightweight-charts/README.md rename to website/packages/lightweight-charts/README.md diff --git a/src/website/packages/lightweight-charts/types.d.ts b/website/packages/lightweight-charts/types.d.ts similarity index 100% rename from src/website/packages/lightweight-charts/types.d.ts rename to website/packages/lightweight-charts/types.d.ts diff --git a/src/website/packages/lightweight-charts/v4.2.0/script.js b/website/packages/lightweight-charts/v4.2.0/script.js similarity index 100% rename from src/website/packages/lightweight-charts/v4.2.0/script.js rename to website/packages/lightweight-charts/v4.2.0/script.js diff --git a/src/website/packages/lightweight-charts/v4.2.0/types.d.ts b/website/packages/lightweight-charts/v4.2.0/types.d.ts similarity index 100% rename from src/website/packages/lightweight-charts/v4.2.0/types.d.ts rename to website/packages/lightweight-charts/v4.2.0/types.d.ts diff --git a/src/website/packages/lightweight-charts/v4.2.2/script.js b/website/packages/lightweight-charts/v4.2.2/script.js similarity index 100% rename from src/website/packages/lightweight-charts/v4.2.2/script.js rename to website/packages/lightweight-charts/v4.2.2/script.js diff --git a/src/website/packages/lightweight-charts/v4.2.2/types.d.ts b/website/packages/lightweight-charts/v4.2.2/types.d.ts similarity index 100% rename from src/website/packages/lightweight-charts/v4.2.2/types.d.ts rename to website/packages/lightweight-charts/v4.2.2/types.d.ts diff --git a/src/website/packages/lightweight-charts/wrapper.js b/website/packages/lightweight-charts/wrapper.js similarity index 100% rename from src/website/packages/lightweight-charts/wrapper.js rename to website/packages/lightweight-charts/wrapper.js diff --git a/src/website/packages/solid-signals/2024-11-02/script.js b/website/packages/solid-signals/2024-11-02/script.js similarity index 100% rename from src/website/packages/solid-signals/2024-11-02/script.js rename to website/packages/solid-signals/2024-11-02/script.js diff --git a/src/website/packages/solid-signals/2024-11-02/types/core/constants.d.ts b/website/packages/solid-signals/2024-11-02/types/core/constants.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-02/types/core/constants.d.ts rename to website/packages/solid-signals/2024-11-02/types/core/constants.d.ts diff --git a/src/website/packages/solid-signals/2024-11-02/types/core/core.d.ts b/website/packages/solid-signals/2024-11-02/types/core/core.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-02/types/core/core.d.ts rename to website/packages/solid-signals/2024-11-02/types/core/core.d.ts diff --git a/src/website/packages/solid-signals/2024-11-02/types/core/effect.d.ts b/website/packages/solid-signals/2024-11-02/types/core/effect.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-02/types/core/effect.d.ts rename to website/packages/solid-signals/2024-11-02/types/core/effect.d.ts diff --git a/src/website/packages/solid-signals/2024-11-02/types/core/error.d.ts b/website/packages/solid-signals/2024-11-02/types/core/error.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-02/types/core/error.d.ts rename to website/packages/solid-signals/2024-11-02/types/core/error.d.ts diff --git a/src/website/packages/solid-signals/2024-11-02/types/core/flags.d.ts b/website/packages/solid-signals/2024-11-02/types/core/flags.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-02/types/core/flags.d.ts rename to website/packages/solid-signals/2024-11-02/types/core/flags.d.ts diff --git a/src/website/packages/solid-signals/2024-11-02/types/core/index.d.ts b/website/packages/solid-signals/2024-11-02/types/core/index.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-02/types/core/index.d.ts rename to website/packages/solid-signals/2024-11-02/types/core/index.d.ts diff --git a/src/website/packages/solid-signals/2024-11-02/types/core/owner.d.ts b/website/packages/solid-signals/2024-11-02/types/core/owner.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-02/types/core/owner.d.ts rename to website/packages/solid-signals/2024-11-02/types/core/owner.d.ts diff --git a/src/website/packages/solid-signals/2024-11-02/types/core/scheduler.d.ts b/website/packages/solid-signals/2024-11-02/types/core/scheduler.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-02/types/core/scheduler.d.ts rename to website/packages/solid-signals/2024-11-02/types/core/scheduler.d.ts diff --git a/src/website/packages/solid-signals/2024-11-02/types/index.d.ts b/website/packages/solid-signals/2024-11-02/types/index.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-02/types/index.d.ts rename to website/packages/solid-signals/2024-11-02/types/index.d.ts diff --git a/src/website/packages/solid-signals/2024-11-02/types/map.d.ts b/website/packages/solid-signals/2024-11-02/types/map.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-02/types/map.d.ts rename to website/packages/solid-signals/2024-11-02/types/map.d.ts diff --git a/src/website/packages/solid-signals/2024-11-02/types/signals.d.ts b/website/packages/solid-signals/2024-11-02/types/signals.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-02/types/signals.d.ts rename to website/packages/solid-signals/2024-11-02/types/signals.d.ts diff --git a/src/website/packages/solid-signals/2024-11-02/types/store/index.d.ts b/website/packages/solid-signals/2024-11-02/types/store/index.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-02/types/store/index.d.ts rename to website/packages/solid-signals/2024-11-02/types/store/index.d.ts diff --git a/src/website/packages/solid-signals/2024-11-02/types/store/store.d.ts b/website/packages/solid-signals/2024-11-02/types/store/store.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-02/types/store/store.d.ts rename to website/packages/solid-signals/2024-11-02/types/store/store.d.ts diff --git a/src/website/packages/solid-signals/2024-11-02/types/utils.d.ts b/website/packages/solid-signals/2024-11-02/types/utils.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-02/types/utils.d.ts rename to website/packages/solid-signals/2024-11-02/types/utils.d.ts diff --git a/src/website/packages/solid-signals/2024-11-08/script.js b/website/packages/solid-signals/2024-11-08/script.js similarity index 100% rename from src/website/packages/solid-signals/2024-11-08/script.js rename to website/packages/solid-signals/2024-11-08/script.js diff --git a/src/website/packages/solid-signals/2024-11-08/types/core/constants.d.ts b/website/packages/solid-signals/2024-11-08/types/core/constants.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-08/types/core/constants.d.ts rename to website/packages/solid-signals/2024-11-08/types/core/constants.d.ts diff --git a/src/website/packages/solid-signals/2024-11-08/types/core/core.d.ts b/website/packages/solid-signals/2024-11-08/types/core/core.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-08/types/core/core.d.ts rename to website/packages/solid-signals/2024-11-08/types/core/core.d.ts diff --git a/src/website/packages/solid-signals/2024-11-08/types/core/effect.d.ts b/website/packages/solid-signals/2024-11-08/types/core/effect.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-08/types/core/effect.d.ts rename to website/packages/solid-signals/2024-11-08/types/core/effect.d.ts diff --git a/src/website/packages/solid-signals/2024-11-08/types/core/error.d.ts b/website/packages/solid-signals/2024-11-08/types/core/error.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-08/types/core/error.d.ts rename to website/packages/solid-signals/2024-11-08/types/core/error.d.ts diff --git a/src/website/packages/solid-signals/2024-11-08/types/core/flags.d.ts b/website/packages/solid-signals/2024-11-08/types/core/flags.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-08/types/core/flags.d.ts rename to website/packages/solid-signals/2024-11-08/types/core/flags.d.ts diff --git a/src/website/packages/solid-signals/2024-11-08/types/core/index.d.ts b/website/packages/solid-signals/2024-11-08/types/core/index.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-08/types/core/index.d.ts rename to website/packages/solid-signals/2024-11-08/types/core/index.d.ts diff --git a/src/website/packages/solid-signals/2024-11-08/types/core/owner.d.ts b/website/packages/solid-signals/2024-11-08/types/core/owner.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-08/types/core/owner.d.ts rename to website/packages/solid-signals/2024-11-08/types/core/owner.d.ts diff --git a/src/website/packages/solid-signals/2024-11-08/types/core/scheduler.d.ts b/website/packages/solid-signals/2024-11-08/types/core/scheduler.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-08/types/core/scheduler.d.ts rename to website/packages/solid-signals/2024-11-08/types/core/scheduler.d.ts diff --git a/src/website/packages/solid-signals/2024-11-08/types/index.d.ts b/website/packages/solid-signals/2024-11-08/types/index.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-08/types/index.d.ts rename to website/packages/solid-signals/2024-11-08/types/index.d.ts diff --git a/src/website/packages/solid-signals/2024-11-08/types/map.d.ts b/website/packages/solid-signals/2024-11-08/types/map.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-08/types/map.d.ts rename to website/packages/solid-signals/2024-11-08/types/map.d.ts diff --git a/src/website/packages/solid-signals/2024-11-08/types/signals.d.ts b/website/packages/solid-signals/2024-11-08/types/signals.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-08/types/signals.d.ts rename to website/packages/solid-signals/2024-11-08/types/signals.d.ts diff --git a/src/website/packages/solid-signals/2024-11-08/types/store/index.d.ts b/website/packages/solid-signals/2024-11-08/types/store/index.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-08/types/store/index.d.ts rename to website/packages/solid-signals/2024-11-08/types/store/index.d.ts diff --git a/src/website/packages/solid-signals/2024-11-08/types/store/store.d.ts b/website/packages/solid-signals/2024-11-08/types/store/store.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-08/types/store/store.d.ts rename to website/packages/solid-signals/2024-11-08/types/store/store.d.ts diff --git a/src/website/packages/solid-signals/2024-11-08/types/utils.d.ts b/website/packages/solid-signals/2024-11-08/types/utils.d.ts similarity index 100% rename from src/website/packages/solid-signals/2024-11-08/types/utils.d.ts rename to website/packages/solid-signals/2024-11-08/types/utils.d.ts diff --git a/src/website/packages/solid-signals/README.md b/website/packages/solid-signals/README.md similarity index 100% rename from src/website/packages/solid-signals/README.md rename to website/packages/solid-signals/README.md diff --git a/src/website/packages/solid-signals/types.d.ts b/website/packages/solid-signals/types.d.ts similarity index 100% rename from src/website/packages/solid-signals/types.d.ts rename to website/packages/solid-signals/types.d.ts diff --git a/src/website/packages/solid-signals/wrapper.js b/website/packages/solid-signals/wrapper.js similarity index 100% rename from src/website/packages/solid-signals/wrapper.js rename to website/packages/solid-signals/wrapper.js diff --git a/src/website/packages/ufuzzy/README.md b/website/packages/ufuzzy/README.md similarity index 100% rename from src/website/packages/ufuzzy/README.md rename to website/packages/ufuzzy/README.md diff --git a/src/website/packages/ufuzzy/v1.0.14/script.js b/website/packages/ufuzzy/v1.0.14/script.js similarity index 100% rename from src/website/packages/ufuzzy/v1.0.14/script.js rename to website/packages/ufuzzy/v1.0.14/script.js diff --git a/src/website/packages/ufuzzy/v1.0.14/types.d.ts b/website/packages/ufuzzy/v1.0.14/types.d.ts similarity index 100% rename from src/website/packages/ufuzzy/v1.0.14/types.d.ts rename to website/packages/ufuzzy/v1.0.14/types.d.ts diff --git a/src/website/robots.txt b/website/robots.txt similarity index 100% rename from src/website/robots.txt rename to website/robots.txt diff --git a/src/website/scripts/chart.js b/website/scripts/chart.js similarity index 100% rename from src/website/scripts/chart.js rename to website/scripts/chart.js diff --git a/src/website/scripts/live-price.js b/website/scripts/live-price.js similarity index 100% rename from src/website/scripts/live-price.js rename to website/scripts/live-price.js diff --git a/src/website/scripts/main.js b/website/scripts/main.js similarity index 100% rename from src/website/scripts/main.js rename to website/scripts/main.js diff --git a/src/website/scripts/moscow-time.js b/website/scripts/moscow-time.js similarity index 100% rename from src/website/scripts/moscow-time.js rename to website/scripts/moscow-time.js diff --git a/src/website/scripts/options.js b/website/scripts/options.js similarity index 100% rename from src/website/scripts/options.js rename to website/scripts/options.js diff --git a/src/website/scripts/service-worker.js b/website/scripts/service-worker.js similarity index 100% rename from src/website/scripts/service-worker.js rename to website/scripts/service-worker.js diff --git a/src/website/scripts/simulation.js b/website/scripts/simulation.js similarity index 100% rename from src/website/scripts/simulation.js rename to website/scripts/simulation.js diff --git a/src/website/scripts/types/self.d.ts b/website/scripts/types/self.d.ts similarity index 100% rename from src/website/scripts/types/self.d.ts rename to website/scripts/types/self.d.ts diff --git a/src/website/styles/chart.css b/website/styles/chart.css similarity index 100% rename from src/website/styles/chart.css rename to website/styles/chart.css diff --git a/src/website/styles/live-price.css b/website/styles/live-price.css similarity index 100% rename from src/website/styles/live-price.css rename to website/styles/live-price.css diff --git a/src/website/styles/moscow-time.css b/website/styles/moscow-time.css similarity index 100% rename from src/website/styles/moscow-time.css rename to website/styles/moscow-time.css diff --git a/src/website/styles/simulation.css b/website/styles/simulation.css similarity index 100% rename from src/website/styles/simulation.css rename to website/styles/simulation.css diff --git a/src/website/tsconfig.json b/website/tsconfig.json similarity index 100% rename from src/website/tsconfig.json rename to website/tsconfig.json