diff --git a/Cargo.lock b/Cargo.lock index 1ba07c93a..258e77b3b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -549,6 +549,7 @@ dependencies = [ "brk_structs", "derive_deref", "log", + "num_enum", "pco", "rayon", "serde", @@ -596,8 +597,6 @@ dependencies = [ "fjall", "log", "rayon", - "serde", - "serde_json", "vecdb", ] @@ -611,6 +610,7 @@ dependencies = [ "brk_structs", "derive_deref", "nucleo-matcher", + "quick_cache", "schemars 1.0.4", "serde", "serde_json", @@ -1147,9 +1147,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.35" +version = "1.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "590f9024a68a8c40351881787f1934dc11afd69090f5edb6831464694d836ea3" +checksum = "5252b3d2648e5eedbc1a6f501e3c795e07025c1e93bbf8bbdd6eef7f447a6d54" dependencies = [ "find-msvc-tools", "jobserver", @@ -1770,9 +1770,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e178e4fba8a2726903f6ba98a6d221e76f9c12c650d5dc0e6afdc50677b49650" +checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d" [[package]] name = "fixedbitset" @@ -2403,9 +2403,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "0c0b063578492ceec17683ef2f8c5e89121fbd0b172cbc280635ab7567db2738" dependencies = [ "once_cell", "wasm-bindgen", @@ -2716,6 +2716,28 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_enum" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "object" version = "0.36.7" @@ -3469,6 +3491,15 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "proc-macro-crate" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +dependencies = [ + "toml_edit", +] + [[package]] name = "proc-macro-error-attr2" version = "2.0.0" @@ -4409,12 +4440,18 @@ dependencies = [ "indexmap 2.11.0", "serde", "serde_spanned", - "toml_datetime", + "toml_datetime 0.7.0", "toml_parser", "toml_writer", "winnow", ] +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" + [[package]] name = "toml_datetime" version = "0.7.0" @@ -4424,6 +4461,17 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap 2.11.0", + "toml_datetime 0.6.11", + "winnow", +] + [[package]] name = "toml_parser" version = "1.0.2" @@ -4818,21 +4866,22 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "7e14915cadd45b529bb8d1f343c4ed0ac1de926144b746e2710f9cd05df6603b" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.100" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +checksum = "e28d1ba982ca7923fd01448d5c30c6864d0a14109560296a162f80f305fb93bb" dependencies = [ "bumpalo", "log", @@ -4844,9 +4893,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "7c3d463ae3eff775b0c45df9da45d68837702ac35af998361e2c84e7c5ec1b0d" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4854,9 +4903,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "7bb4ce89b08211f923caf51d527662b75bdc9c9c7aab40f86dcb9fb85ac552aa" dependencies = [ "proc-macro2", "quote", @@ -4867,9 +4916,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "f143854a3b13752c6950862c906306adb27c7e839f7414cec8fea35beab624c1" dependencies = [ "unicode-ident", ] @@ -5109,6 +5158,9 @@ name = "winnow" version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +dependencies = [ + "memchr", +] [[package]] name = "wit-bindgen" @@ -5284,9 +5336,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.15+zstd.1.5.7" +version = "2.0.16+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" dependencies = [ "cc", "pkg-config", diff --git a/Cargo.toml b/Cargo.toml index 9419b1214..8931a3fc4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,6 +46,7 @@ jiff = "0.2.15" log = "0.4.28" minreq = { version = "2.14.1", features = ["https", "serde_json"] } parking_lot = "0.12.4" +quick_cache = "0.6.16" rayon = "1.11.0" serde = "1.0.219" serde_bytes = "0.11.17" diff --git a/crates/brk_computer/Cargo.toml b/crates/brk_computer/Cargo.toml index b3fa642e6..e440246c9 100644 --- a/crates/brk_computer/Cargo.toml +++ b/crates/brk_computer/Cargo.toml @@ -21,6 +21,7 @@ brk_parser = { workspace = true } vecdb = { workspace = true } derive_deref = { workspace = true } log = { workspace = true } +num_enum = "0.7.4" pco = "0.4.6" rayon = { workspace = true } serde = { workspace = true } diff --git a/crates/brk_computer/examples/pools.rs b/crates/brk_computer/examples/pools.rs new file mode 100644 index 000000000..506a0c657 --- /dev/null +++ b/crates/brk_computer/examples/pools.rs @@ -0,0 +1,55 @@ +use std::{collections::BTreeMap, path::Path, thread}; + +use brk_computer::{Computer, pools}; +use brk_error::Result; +use brk_fetcher::Fetcher; +use brk_indexer::Indexer; +use vecdb::Exit; + +fn main() -> Result<()> { + brk_logger::init(Some(Path::new(".log")))?; + + let exit = Exit::new(); + exit.set_ctrlc_handler(); + + thread::Builder::new() + .stack_size(256 * 1024 * 1024) + .spawn(move || -> Result<()> { + let outputs_dir = Path::new(&std::env::var("HOME").unwrap()).join(".brk"); + + let indexer = Indexer::forced_import(&outputs_dir)?; + + let fetcher = Fetcher::import(true, None)?; + + let computer = Computer::forced_import(&outputs_dir, &indexer, Some(fetcher))?; + + let pools = pools(); + + let mut res: BTreeMap<&'static str, usize> = BTreeMap::default(); + + let mut height_to_first_txindex_iter = indexer.vecs.height_to_first_txindex.iter(); + // let mut i = indexer.vecs.txz + + indexer + .stores + .height_to_coinbase_tag + .iter() + .for_each(|(_, coinbase_tag)| { + let pool = pools.find_from_coinbase_tag(&coinbase_tag); + if let Some(pool) = pool { + *res.entry(pool.name).or_default() += 1; + } else { + *res.entry(pools.get_unknown().name).or_default() += 1; + } + }); + + let mut v = res.into_iter().map(|(k, v)| (v, k)).collect::>(); + v.sort_unstable(); + println!("{:#?}", v); + println!("{:#?}", v.len()); + + Ok(()) + })? + .join() + .unwrap() +} diff --git a/crates/brk_computer/src/lib.rs b/crates/brk_computer/src/lib.rs index 5fc37ad63..966332a29 100644 --- a/crates/brk_computer/src/lib.rs +++ b/crates/brk_computer/src/lib.rs @@ -16,6 +16,7 @@ mod fetched; mod grouped; mod indexes; mod market; +mod pools; mod price; mod stateful; mod states; @@ -24,6 +25,7 @@ mod utils; use indexes::Indexes; +pub use pools::*; pub use states::PriceToAmount; use states::*; diff --git a/crates/brk_computer/src/pools/id.rs b/crates/brk_computer/src/pools/id.rs new file mode 100644 index 000000000..064adb43b --- /dev/null +++ b/crates/brk_computer/src/pools/id.rs @@ -0,0 +1,175 @@ +use num_enum::{FromPrimitive, IntoPrimitive}; +use serde::{Deserialize, Serialize}; + +#[allow(clippy::upper_case_acronyms)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, FromPrimitive, IntoPrimitive)] +#[repr(u16)] +pub enum PoolId { + #[default] + Unknown, + BlockFills, + Ultimuspool, + TerraPool, + Luxor, + OneTHash, + BTCCom, + Bitfarms, + HuobiPool, + WayiCn, + CanoePool, + BTCTop, + BitcoinCom, + OneSevenFiveBtc, + GBMiners, + AXbt, + ASICMiner, + BitMinter, + BitcoinRussia, + BTCServ, + SimplecoinUs, + BTCGuild, + Eligius, + OzCoin, + EclipseMC, + MaxBTC, + TripleMining, + CoinLab, + FiftyBTC, + GHashIO, + STMiningCorp, + Bitparking, + MMPool, + Polmine, + KnCMiner, + Bitalo, + F2Pool, + HHTT, + MegaBigPower, + MtRed, + NMCbit, + YourbtcNet, + GiveMeCoins, + BraiinsPool, + AntPool, + MultiCoinCo, + BCPoolIo, + Cointerra, + KanoPool, + SoloCK, + CKPool, + NiceHash, + BitClub, + BitcoinAffiliateNetwork, + BTCC, + BWPool, + EXXAndBW, + Bitsolo, + BitFury, + TwentyOneInc, + DigitalBTC, + EightBaochi, + MyBTCcoinPool, + TBDice, + HASHPOOL, + Nexious, + BravoMining, + HotPool, + OKExPool, + BCMonster, + OneHash, + Bixin, + TATMASPool, + ViaBTC, + ConnectBTC, + BATPOOL, + Waterhole, + DCExploration, + DCEX, + BTPOOL, + FiftyEightCoin, + BitcoinIndiaLowercase, + ShawnP0wers, + PHashIO, + RigPool, + HAOZHUZHU, + SevenPool, + MiningKings, + HashBX, + DPOOL, + Rawpool, + Haominer, + Helix, + BitcoinUkraine, + Poolin, + SecretSuperstar, + TigerpoolNet, + SigmapoolCom, + OkpoolTop, + Hummerpool, + Tangpool, + BytePool, + SpiderPool, + NovaBlock, + MiningCity, + BinancePool, + Minerium, + LubianCom, + OKKONG, + AAOPool, + EMCDPool, + FoundryUSA, + SBICrypto, + ArkPool, + PureBTCCom, + MARAPool, + KuCoinPool, + EntrustCharityPool, + OKMINER, + Titan, + PEGAPool, + BTCNuggets, + CloudHashing, + DigitalXMintsy, + Telco214, + BTCPoolParty, + Multipool, + TransactionCoinMining, + BTCDig, + TrickysBTCPool, + BTCMP, + Eobot, + UNOMP, + Patels, + GoGreenLight, + BitcoinIndiaCamel, // duplicate-ish entry preserved with slight name change + EkanemBTC, + CanoeUppercase, + TigerLowercase, + OneM1X, + Zulupool, + SECPOOL, + OCEAN, + WhitePool, + Wiz, + Mononaut, + Rijndael, + Wk057, + FutureBitApolloSolo, + Emzy, + Knorrium, + CarbonNegative, + PortlandHODL, + Phoenix, + Neopool, + MaxiPool, + DrDetroit, + BitFuFuPool, + LuckyPool, + MiningDutch, + PublicPool, + MiningSquared, + InnopolisTech, + Nymkappa, + BTCLab, + Parasite, +} diff --git a/crates/brk_computer/src/pools/mod.rs b/crates/brk_computer/src/pools/mod.rs new file mode 100644 index 000000000..f08336125 --- /dev/null +++ b/crates/brk_computer/src/pools/mod.rs @@ -0,0 +1,7 @@ +mod id; +mod pool; +mod pools; + +pub use id::*; +pub use pool::*; +pub use pools::*; diff --git a/crates/brk_computer/src/pools/pool.rs b/crates/brk_computer/src/pools/pool.rs new file mode 100644 index 000000000..2f2281cdc --- /dev/null +++ b/crates/brk_computer/src/pools/pool.rs @@ -0,0 +1,12 @@ +use serde::{Deserialize, Serialize}; + +use crate::pools::PoolId; + +#[derive(Debug, Serialize, Deserialize)] +pub struct Pool { + pub id: PoolId, + pub name: &'static str, + pub addresses: Box<[&'static str]>, + pub tags: Box<[&'static str]>, + pub link: &'static str, +} diff --git a/crates/brk_computer/src/pools/pools.rs b/crates/brk_computer/src/pools/pools.rs new file mode 100644 index 000000000..dd42d9b05 --- /dev/null +++ b/crates/brk_computer/src/pools/pools.rs @@ -0,0 +1,1356 @@ +use std::sync::OnceLock; + +use super::super::Pool; + +pub struct Pools([Pool; 166]); + +impl Pools { + pub fn find_from_coinbase_tag(&self, coinbase_tag: &str) -> Option<&Pool> { + self.0.iter().find(|pool| { + pool.tags + .iter() + .any(|pool_tag| coinbase_tag.contains(pool_tag)) + }) + } + + pub fn get_unknown(&self) -> &Pool { + &self.0[0] + } +} + +pub fn pools() -> &'static Pools { + static POOLS: OnceLock = OnceLock::new(); + POOLS.get_or_init(|| { + Pools([ + Pool { + id: 0.into(), + name: "Unknown", + addresses: Box::new([]), + tags: Box::new([]), + link: "", + }, + // Source: + // https://github.com/mempool/mining-pools/blob/master/pools-v2.json + Pool { + id: 1.into(), + name: "BlockFills", + addresses: Box::new(["1PzVut5X6Nx7Mv4JHHKPtVM9Jr9LJ4Rbry"]), + tags: Box::new(["/BlockfillsPool/"]), + link: "https://www.blockfills.com/mining", + }, + Pool { + id: 2.into(), + name: "ULTIMUSPOOL", + addresses: Box::new([ + "1EMVSMe1VJUuqv7D7SFzctnVXk4KdjXATi", + "3C9sAKXrBVpJVe3b738yik4LPHpPmceBgd", + ]), + tags: Box::new(["/ultimus/"]), + link: "https://www.ultimuspool.com", + }, + Pool { + id: 3.into(), + name: "Terra Pool", + addresses: Box::new([ + "32P5KVSbZYAkVmSHxDd2oBXaSk372rbV7L", + "3Qqp7LwxmSjPwRaKkDToysJsM3xA4ThqFk", + "bc1q39dled8an7enuxtmjql3pk7ny8kzvsxhd924sl", + ]), + tags: Box::new(["terrapool.io", "Validated with Clean Energy"]), + link: "https://terrapool.io", + }, + Pool { + id: 4.into(), + name: "Luxor", + addresses: Box::new([ + "1MkCDCzHpBsYQivp8MxjY5AkTGG1f2baoe", + "39bitUyBcUu3y3hRTtYprKbTp712t4ZWqK", + "32BfKjhByDSxx3BM5vUkQ3NQq9csZR6nt6", + ]), + tags: Box::new(["/LUXOR/", "Luxor Tech"]), + link: "https://mining.luxor.tech", + }, + Pool { + id: 5.into(), + name: "1THash", + addresses: Box::new([ + "147SwRQdpCfj5p8PnfsXV2SsVVpVcz3aPq", + "15vgygQ7ZsWdvZpctmTZK4673QBHsos6Sh", + ]), + tags: Box::new(["/1THash&58COIN/", "/1THash/"]), + link: "https://www.1thash.top", + }, + Pool { + id: 6.into(), + name: "BTC.com", + addresses: Box::new([ + "1Bf9sZvBHPFGVPX71WX2njhd1NXKv5y7v5", + "34qkc2iac6RsyxZVfyE2S5U5WcRsbg2dpK", + "3EhLZarJUNSfV6TWMZY1Nh5mi3FMsdHa5U", + "3NA8hsjfdgVkmmVS9moHmkZsVCoLxUkvvv", + "bc1qjl8uwezzlech723lpnyuza0h2cdkvxvh54v3dn", + ]), + tags: Box::new(["/BTC.COM/", "/BTC.com/", "btccom"]), + link: "https://pool.btc.com", + }, + Pool { + id: 7.into(), + name: "Bitfarms", + addresses: Box::new(["3GvEGtnvgeBJ3p3EpdZhvUkxY4pDARkbjd"]), + tags: Box::new(["BITFARMS"]), + link: "https://www.bitfarms.io", + }, + Pool { + id: 8.into(), + name: "Huobi.pool", + addresses: Box::new([ + "18Zcyxqna6h7Z7bRjhKvGpr8HSfieQWXqj", + "1EepjXgvWUoRyNvuLSAxjiqZ1QqKGDANLW", + "1MvYASoHjqynMaMnP7SBmenyEWiLsTqoU6", + "3HuobiNg2wHjdPU2mQczL9on8WF7hZmaGd", + ]), + tags: Box::new(["/HuoBi/", "/Huobi/"]), + link: "https://www.hpt.com", + }, + Pool { + id: 9.into(), + name: "WAYI.CN", + addresses: Box::new([]), + tags: Box::new(["/E2M & BTC.TOP/"]), + link: "https://www.easy2mine.com", + }, + Pool { + id: 10.into(), + name: "CanoePool", + addresses: Box::new(["1GP8eWArgpwRum76saJS4cZKCHWJHs9PQo"]), + tags: Box::new(["/CANOE/", "/canoepool/"]), + link: "https://btc.canoepool.com", + }, + Pool { + id: 11.into(), + name: "BTC.TOP", + addresses: Box::new(["1Hz96kJKF2HLPGY15JWLB5m9qGNxvt8tHJ"]), + tags: Box::new(["/BTC.TOP/"]), + link: "https://btc.top", + }, + Pool { + id: 12.into(), + name: "Bitcoin.com", + addresses: Box::new([]), + tags: Box::new(["pool.bitcoin.com"]), + link: "https://www.bitcoin.com", + }, + Pool { + id: 13.into(), + name: "175btc", + addresses: Box::new([]), + tags: Box::new(["Mined By 175btc.com"]), + link: "https://www.175btc.com", + }, + Pool { + id: 14.into(), + name: "GBMiners", + addresses: Box::new([]), + tags: Box::new(["/mined by gbminers/"]), + link: "https://gbminers.com", + }, + Pool { + id: 15.into(), + name: "A-XBT", + addresses: Box::new(["1MFsp2txCPwMMBJjNNeKaduGGs8Wi1Ce7X"]), + tags: Box::new(["/A-XBT/"]), + link: "https://www.a-xbt.com", + }, + Pool { + id: 16.into(), + name: "ASICMiner", + addresses: Box::new([]), + tags: Box::new(["ASICMiner"]), + link: "https://www.asicminer.co", + }, + Pool { + id: 17.into(), + name: "BitMinter", + addresses: Box::new(["19PkHafEN18mquJ9ChwZt5YEFoCdPP5vYB"]), + tags: Box::new(["BitMinter"]), + link: "https://bitminter.com", + }, + Pool { + id: 18.into(), + name: "BitcoinRussia", + addresses: Box::new([ + "14R2r9FkyDmyxGB9xUVwVLdgsX9YfdVamk", + "165GCEAx81wce33FWEnPCRhdjcXCrBJdKn", + ]), + tags: Box::new(["/Bitcoin-Russia.ru/"]), + link: "https://bitcoin-russia.ru", + }, + Pool { + id: 19.into(), + name: "BTCServ", + addresses: Box::new([]), + tags: Box::new(["btcserv"]), + link: "https://btcserv.net", + }, + Pool { + id: 20.into(), + name: "simplecoin.us", + addresses: Box::new([]), + tags: Box::new(["simplecoin"]), + link: "https://simplecoin.us", + }, + Pool { + id: 21.into(), + name: "BTC Guild", + addresses: Box::new([]), + tags: Box::new(["BTC Guild"]), + link: "https://www.btcguild.com", + }, + Pool { + id: 22.into(), + name: "Eligius", + addresses: Box::new([]), + tags: Box::new(["Eligius"]), + link: "https://eligius.st", + }, + Pool { + id: 23.into(), + name: "OzCoin", + addresses: Box::new([]), + tags: Box::new(["ozco.in", "ozcoin"]), + link: "https://ozcoin.net", + }, + Pool { + id: 24.into(), + name: "EclipseMC", + addresses: Box::new([ + "15xiShqUqerfjFdyfgBH1K7Gwp6cbYmsTW", + "18M9o2mXNjNR96yKe7eyY6pfP6Nx4Nso3d", + ]), + tags: Box::new(["EMC ", "EMC:"]), + link: "https://eclipsemc.com", + }, + Pool { + id: 25.into(), + name: "MaxBTC", + addresses: Box::new([]), + tags: Box::new(["MaxBTC"]), + link: "https://maxbtc.com", + }, + Pool { + id: 26.into(), + name: "TripleMining", + addresses: Box::new([]), + tags: Box::new(["Triplemining.com", "triplemining"]), + link: "https://www.triplemining.com", + }, + Pool { + id: 27.into(), + name: "CoinLab", + addresses: Box::new([]), + tags: Box::new(["CoinLab"]), + link: "https://coinlab.com", + }, + Pool { + id: 28.into(), + name: "50BTC", + addresses: Box::new([]), + tags: Box::new(["50BTC"]), + link: "https://www.50btc.com", + }, + Pool { + id: 29.into(), + name: "GHash.IO", + addresses: Box::new(["1CjPR7Z5ZSyWk6WtXvSFgkptmpoi4UM9BC"]), + tags: Box::new(["ghash.io"]), + link: "https://ghash.io", + }, + Pool { + id: 30.into(), + name: "ST Mining Corp", + addresses: Box::new([]), + tags: Box::new(["st mining corp"]), + link: "https://bitcointalk.org/index.php?topic=77000.msg3207708#msg3207708", + }, + Pool { + id: 31.into(), + name: "Bitparking", + addresses: Box::new([]), + tags: Box::new(["bitparking"]), + link: "https://mmpool.bitparking.com", + }, + Pool { + id: 32.into(), + name: "mmpool", + addresses: Box::new([]), + tags: Box::new(["mmpool"]), + link: "https://mmpool.org/pool", + }, + Pool { + id: 33.into(), + name: "Polmine", + addresses: Box::new([ + "13vWXwzNF5Ef9SUXNTdr7de7MqiV4G1gnL", + "16cv7wyeG6RRqhvJpY21CnsjxuKj2gAoK2", + "17kkmDx8eSwj2JTTULb3HkJhCmexfysExz", + "1AajKXkaq2DsnDmP8ZPTrE5gH1HFo1x3AU", + "1JrYhdhP2jCY6JwuVzdk9jUwc4pctcSes7", + "1Nsvmnv8VcTMD643xMYAo35Aco3XA5YPpe", + ]), + tags: Box::new(["by polmine.pl", "bypmneU"]), + link: "https://polmine.pl", + }, + Pool { + id: 34.into(), + name: "KnCMiner", + addresses: Box::new([]), + tags: Box::new(["KnCMiner"]), + link: "https://portal.kncminer.com/pool", + }, + Pool { + id: 35.into(), + name: "Bitalo", + addresses: Box::new(["1HTejfsPZQGi3afCMEZTn2xdmoNzp13n3F"]), + tags: Box::new(["Bitalo"]), + link: "https://bitalo.com/mining", + }, + Pool { + id: 36.into(), + name: "F2Pool", + addresses: Box::new([ + "1KFHE7w8BhaENAswwryaoccDb6qcT6DbYY", + "bc1qf274x7penhcd8hsv3jcmwa5xxzjl2a6pa9pxwm", + ]), + tags: Box::new(["七彩神仙鱼", "F2Pool", "🐟"]), + link: "https://www.f2pool.com", + }, + Pool { + id: 37.into(), + name: "HHTT", + addresses: Box::new([]), + tags: Box::new(["HHTT"]), + link: "https://hhtt.1209k.com", + }, + Pool { + id: 38.into(), + name: "MegaBigPower", + addresses: Box::new(["1K7znxRfkS8R1hcmyMvHDum1hAQreS4VQ4"]), + tags: Box::new(["megabigpower.com"]), + link: "https://megabigpower.com", + }, + Pool { + id: 39.into(), + name: "Mt Red", + addresses: Box::new([]), + tags: Box::new(["/mtred/"]), + link: "https://mtred.com", + }, + Pool { + id: 40.into(), + name: "NMCbit", + addresses: Box::new([]), + tags: Box::new(["nmcbit.com"]), + link: "https://nmcbit.com", + }, + Pool { + id: 41.into(), + name: "Yourbtc.net", + addresses: Box::new([]), + tags: Box::new(["yourbtc.net"]), + link: "https://yourbtc.net", + }, + Pool { + id: 42.into(), + name: "Give Me Coins", + addresses: Box::new([]), + tags: Box::new(["Give-Me-Coins"]), + link: "https://give-me-coins.com", + }, + Pool { + id: 43.into(), + name: "Braiins Pool", + addresses: Box::new([ + "1AqTMY7kmHZxBuLUR5wJjPFUvqGs23sesr", + "1CK6KHY6MHgYvmRQ4PAafKYDrg1ejbH1cE", + ]), + tags: Box::new(["/slush/"]), + link: "https://braiins.com/pool", + }, + Pool { + id: 44.into(), + name: "AntPool", + addresses: Box::new([ + "12dRugNcdxK39288NjcDV4GX7rMsKCGn6B", + "15kiNKfDWsq7UsPg87UwxA8rVvWAjzRkYS", + "16MdTdqmXusauybtXTmFEW4GNFPPgGxQYE", + "16kUc5B48qnASbxeZTisCqTNx6G3DPXuKn", + "17gVZssumiJqYMCHozHKXGyaAvyu6NCX6V", + "1AJQ3jXhUF8WiisEcuVd8Xmfq4QJ7n1SdL", + "1B7ZBX2C39b26M9chHLURGSFTJA6DDQkZv", + "1BWW3pg5jb6rxebrNeo9TATarwJ1rthnoe", + "1CBqo1w3hmm9SCmbu2Yg6Ls4uLfkUqZJsx", + "1CZHhV67Qos4xXb8uYqvAGjK8Wq52woPi5", + "1CyB8GJNEsNVXtPutB36nrDY3fMXBTzXSX", + "1D4UZG4qo8bF1MuZHSEyBHRZaxT8inatXS", + "1D9jw3QHNankXxtcGVihsDK7Z7THN6j7Pg", + "1DDXyKUT6q3H9e5QXm2Gv6BNNWgztFG55g", + "1DQaDTefKPjHz3beLuo8KHRZF9t2Sc6foP", + "1Dek9ArRHb9tyWb9gaaX8SWmkfi5V7U5Y6", + "1DyR7HPQWjM6Zrnk7SzHVY2GEpXRGNNH9o", + "1FdJkPdpXtK3t5utZHJAop3saLZWfPfgak", + "1FrHkVsW7csAYYaRbUUcrKSmv91hcQnsqQ", + "1GEG1JR81jvUXs7TMAuo3SPBHZrpJijcjt", + "1GRcX882sdBYCAWyG99iF2oz7j3nYzXhLM", + "1GT2N4dCufvbnTKMbS61QrQPN4SexCAFiH", + "1Gp7iCzDGMZiV55Kt8uKsux6VyoHe1aJaN", + "1H3u6R813MHGYhmGW6v86EYYriawRtACYD", + "1H6ckqNWikmVT3wpN3X1BQ6b156Xc9nT2L", + "1JBVrhSSDrZrRmm4RnoWouqgGGqJMvWHi8", + "1JwUDWVSbAY5NeCBJhxQk1E8AfETfZuPj4", + "1K8PNogxBZ6ts532DZnzxdbjgzJLjLdXqz", + "1KmgBTL7cFmFFYTD7HcdkMcZXRcTkh2WwS", + "1LTGvTjDxiy5S9YcKEE9Lb7xSpZcPSqinw", + "1MiQrT5sEKTUGNMbd9WS3yPPkSjWdpYA2r", + "1NS4gbx1G2D5rc9PnvVsPys12nKxGiQg72", + "1Nh7uHdvY6fNwtQtM1G5EZAFPLC33B59rB", + "1Pzf7qT7bBGouvnjRvtRD8VhTyqjX1NrJT", + "1Sjj2cPC3rTWcSTEYDeu2f3BavLosog4T", + "1jLVpwtNMfXWaHY4eiLDmGuBxokYLgv1X", + "3FaYVQF6wCMUB9NCeRe4tUp1zZx8qqM7H1", + ]), + tags: Box::new(["/AntPool/", "Mined By AntPool", "Mined by AntPool"]), + link: "https://www.antpool.com", + }, + Pool { + id: 45.into(), + name: "MultiCoin.co", + addresses: Box::new([]), + tags: Box::new(["Mined by MultiCoin.co"]), + link: "https://multicoin.co", + }, + Pool { + id: 46.into(), + name: "bcpool.io", + addresses: Box::new([]), + tags: Box::new(["bcpool.io"]), + link: "https://bcpool.io", + }, + Pool { + id: 47.into(), + name: "Cointerra", + addresses: Box::new(["1BX5YoLwvqzvVwSrdD4dC32vbouHQn2tuF"]), + tags: Box::new(["cointerra"]), + link: "https://cointerra.com", + }, + Pool { + id: 48.into(), + name: "KanoPool", + addresses: Box::new([]), + tags: Box::new(["Kano"]), + link: "https://kano.is", + }, + Pool { + id: 49.into(), + name: "Solo CK", + addresses: Box::new([]), + tags: Box::new(["/solo.ckpool.org/"]), + link: "https://solo.ckpool.org", + }, + Pool { + id: 50.into(), + name: "CKPool", + addresses: Box::new([]), + tags: Box::new(["/ckpool.org/"]), + link: "https://ckpool.org", + }, + Pool { + id: 51.into(), + name: "NiceHash", + addresses: Box::new([]), + tags: Box::new(["/NiceHashSolo", "/NiceHash/"]), + link: "https://www.nicehash.com", + }, + Pool { + id: 52.into(), + name: "BitClub", + addresses: Box::new(["155fzsEBHy9Ri2bMQ8uuuR3tv1YzcDywd4"]), + tags: Box::new(["/BitClub Network/"]), + link: "https://bitclubpool.com", + }, + Pool { + id: 53.into(), + name: "Bitcoin Affiliate Network", + addresses: Box::new([]), + tags: Box::new(["bitcoinaffiliatenetwork.com"]), + link: "https://mining.bitcoinaffiliatenetwork.com", + }, + Pool { + id: 54.into(), + name: "BTCC", + addresses: Box::new(["152f1muMCNa7goXYhYAQC61hxEgGacmncB"]), + tags: Box::new(["/BTCC/", "BTCChina Pool", "BTCChina.com", "btcchina.com"]), + link: "https://pool.btcc.com", + }, + Pool { + id: 55.into(), + name: "BWPool", + addresses: Box::new(["1JLRXD8rjRgQtTS9MvfQALfHgGWau9L9ky"]), + tags: Box::new(["BW Pool", "BWPool"]), + link: "https://bwpool.net", + }, + Pool { + id: 56.into(), + name: "EXX&BW", + addresses: Box::new([]), + tags: Box::new(["xbtc.exx.com&bw.com"]), + link: "https://xbtc.exx.com", + }, + Pool { + id: 57.into(), + name: "Bitsolo", + addresses: Box::new(["18zRehBcA2YkYvsC7dfQiFJNyjmWvXsvon"]), + tags: Box::new(["Bitsolo Pool"]), + link: "https://bitsolo.net", + }, + Pool { + id: 58.into(), + name: "BitFury", + addresses: Box::new([ + "14yfxkcpHnju97pecpM7fjuTkVdtbkcfE6", + "1AcAj9p6zJn4xLXdvmdiuPCtY7YkBPTAJo", + ]), + tags: Box::new(["/BitFury/", "/Bitfury/"]), + link: "https://bitfury.com", + }, + Pool { + id: 59.into(), + name: "21 Inc.", + addresses: Box::new([ + "15rQXUSBQRubShPpiJfDLxmwS8ze2RUm4z", + "1CdJi2xRTXJF6CEJqNHYyQDNEcM3X7fUhD", + "1GC6HxDvnchDdb5cGkFXsJMZBFRsKAXfwi", + ]), + tags: Box::new(["/pool34/"]), + link: "https://21.co", + }, + Pool { + id: 60.into(), + name: "digitalBTC", + addresses: Box::new(["1MimPd6LrPKGftPRHWdfk8S3KYBfN4ELnD"]), + tags: Box::new(["/agentD/"]), + link: "https://digitalbtc.com", + }, + Pool { + id: 61.into(), + name: "8baochi", + addresses: Box::new(["1Hk9gD8xMo2XBUhE73y5zXEM8xqgffTB5f"]), + tags: Box::new(["/八宝池 8baochi.com/"]), + link: "https://8baochi.com", + }, + Pool { + id: 62.into(), + name: "myBTCcoin Pool", + addresses: Box::new(["151T7r1MhizzJV6dskzzUkUdr7V8JxV2Dx"]), + tags: Box::new(["myBTCcoin Pool"]), + link: "https://mybtccoin.com", + }, + Pool { + id: 63.into(), + name: "TBDice", + addresses: Box::new(["1BUiW44WuJ2jiJgXiyxJVFMN8bc1GLdXRk"]), + tags: Box::new(["TBDice"]), + link: "https://tbdice.org", + }, + Pool { + id: 64.into(), + name: "HASHPOOL", + addresses: Box::new([]), + tags: Box::new(["HASHPOOL"]), + link: "https://hashpool.com", + }, + Pool { + id: 65.into(), + name: "Nexious", + addresses: Box::new(["1GBo1f2tzVx5jScV9kJXPUP9RjvYXuNzV7"]), + tags: Box::new(["/Nexious/"]), + link: "https://nexious.com", + }, + Pool { + id: 66.into(), + name: "Bravo Mining", + addresses: Box::new([]), + tags: Box::new(["/bravo-mining/"]), + link: "https://www.bravo-mining.com", + }, + Pool { + id: 67.into(), + name: "HotPool", + addresses: Box::new(["17judvK4AC2M6KhaBbAEGw8CTKc9Pg8wup"]), + tags: Box::new(["/HotPool/"]), + link: "https://hotpool.co", + }, + Pool { + id: 68.into(), + name: "OKExPool", + addresses: Box::new([]), + tags: Box::new(["/www.okex.com/"]), + link: "https://www.okex.com", + }, + Pool { + id: 69.into(), + name: "BCMonster", + addresses: Box::new(["1E18BNyobcoiejcDYAz5SjbrzifNDEpM88"]), + tags: Box::new(["/BCMonster/"]), + link: "https://www.bcmonster.com", + }, + Pool { + id: 70.into(), + name: "1Hash", + addresses: Box::new(["1F1xcRt8H8Wa623KqmkEontwAAVqDSAWCV"]), + tags: Box::new(["Mined by 1hash.com"]), + link: "https://www.1hash.com", + }, + Pool { + id: 71.into(), + name: "Bixin", + addresses: Box::new([ + "13hQVEstgo4iPQZv9C7VELnLWF7UWtF4Q3", + "1KsFhYKLs8qb1GHqrPxHoywNQpet2CtP9t", + ]), + tags: Box::new(["/Bixin/", "/HaoBTC/", "HAOBTC"]), + link: "https://haopool.com", + }, + Pool { + id: 72.into(), + name: "TATMAS Pool", + addresses: Box::new([]), + tags: Box::new(["/ViaBTC/TATMAS Pool/"]), + link: "https://tmsminer.com", + }, + Pool { + id: 73.into(), + name: "ViaBTC", + addresses: Box::new([]), + tags: Box::new(["/ViaBTC/", "viabtc.com deploy"]), + link: "https://viabtc.com", + }, + Pool { + id: 74.into(), + name: "ConnectBTC", + addresses: Box::new(["1KPQkehgYAqwiC6UCcbojM3mbGjURrQJF2"]), + tags: Box::new(["/ConnectBTC - Home for Miners/"]), + link: "https://www.connectbtc.com", + }, + Pool { + id: 75.into(), + name: "BATPOOL", + addresses: Box::new(["167ApWWxUSFQmz2jdz9xop3oAKdLejvMML"]), + tags: Box::new(["/BATPOOL/"]), + link: "https://www.batpool.com", + }, + Pool { + id: 76.into(), + name: "Waterhole", + addresses: Box::new(["1FLH1SoLv4U68yUERhDiWzrJn5TggMqkaZ"]), + tags: Box::new(["/WATERHOLE.IO/"]), + link: "https://btc.waterhole.io", + }, + Pool { + id: 77.into(), + name: "DCExploration", + addresses: Box::new([]), + tags: Box::new(["/DCExploration/"]), + link: "https://dcexploration.cn", + }, + Pool { + id: 78.into(), + name: "DCEX", + addresses: Box::new([]), + tags: Box::new(["/DCEX/"]), + link: "https://dcexploration.cn", + }, + Pool { + id: 79.into(), + name: "BTPOOL", + addresses: Box::new([]), + tags: Box::new(["/BTPOOL/"]), + link: "", + }, + Pool { + id: 80.into(), + name: "58COIN", + addresses: Box::new(["199EDJoCpqV672qESEkfFgEqNT1iR2gj3t"]), + tags: Box::new(["/58coin.com/"]), + link: "https://www.58coin.com", + }, + Pool { + id: 81.into(), + name: "Bitcoin India", + addresses: Box::new([]), + tags: Box::new(["/Bitcoin-India/"]), + link: "https://bitcoin-india.org", + }, + Pool { + id: 82.into(), + name: "shawnp0wers", + addresses: Box::new([ + "12znnESiJ3bgCLftwwrg9wzQKN8fJtoBDa", + "18HEMWFXM9UGPVZHUMdBPD3CMFWYn2NPRX", + ]), + tags: Box::new(["--Nug--"]), + link: "https://www.brainofshawn.com", + }, + Pool { + id: 83.into(), + name: "PHash.IO", + addresses: Box::new([]), + tags: Box::new(["/phash.cn/", "/phash.io/"]), + link: "https://phash.io", + }, + Pool { + id: 84.into(), + name: "RigPool", + addresses: Box::new(["1JpKmtspBJQVXK67DJP64eBJcAPhDvJ9Er"]), + tags: Box::new(["/RigPool.com/"]), + link: "https://www.rigpool.com", + }, + Pool { + id: 85.into(), + name: "HAOZHUZHU", + addresses: Box::new(["19qa95rTbDziNCS9EexUbh2hVY4viUU9tt"]), + tags: Box::new(["/haozhuzhu/"]), + link: "https://haozhuzhu.com", + }, + Pool { + id: 86.into(), + name: "7pool", + addresses: Box::new(["1JLc3JxvpdL1g5zoX8sKLP4BkJQiwnJftU"]), + tags: Box::new(["/$Mined by 7pool.com/"]), + link: "https://7pool.com", + }, + Pool { + id: 87.into(), + name: "MiningKings", + addresses: Box::new([ + "1ApE99VM5RJzMRRtwd2JMgmkGabtJqoMEz", + "1EowSPumj9D9AMTpE64Jr7vT3PJDNopVcz", + "1KGbsDDAgJN2HDNBjmMHp9828qATo5B9c9", + ]), + tags: Box::new(["/mined by poopbut/"]), + link: "https://miningkings.com", + }, + Pool { + id: 88.into(), + name: "HashBX", + addresses: Box::new([]), + tags: Box::new(["/Mined by HashBX.io/"]), + link: "https://hashbx.io", + }, + Pool { + id: 89.into(), + name: "DPOOL", + addresses: Box::new(["1ACAgPuFFidYzPMXbiKptSrwT74Dg8hq2v"]), + tags: Box::new(["/DPOOL.TOP/"]), + link: "https://www.dpool.top", + }, + Pool { + id: 90.into(), + name: "Rawpool", + addresses: Box::new([ + "1FbBbv5oYqFKwiPm4CAqvAy8345n8AQ74b", + "35y82tEPDa2wm6tzkEacMG8GPPW7zbMj83", + "3CLigLYNkrtoNgNcUwTaKoUSHCwr9W851W", + "3QYvfQoG9Gs9Vfvbpw6947muSqhoGagvF6", + "bc1q8ej2g5uxdsg0jwl0mpl606qfjxgkyv3p29yf37", + "bc1qnnl503n04cqacpwvhr89qr70metxr79ht3n380", + "bc1qru8mtv3e3u7ms6ecjmwgeakdakclemvhnw00q9", + "bc1qwlrsvgtn99rqp3fgaxq6f6jkgms80rnej0a8tc", + ]), + tags: Box::new(["/Rawpool.com/"]), + link: "https://www.rawpool.com", + }, + Pool { + id: 91.into(), + name: "haominer", + addresses: Box::new([]), + tags: Box::new(["/haominer/"]), + link: "https://haominer.com", + }, + Pool { + id: 92.into(), + name: "Helix", + addresses: Box::new([]), + tags: Box::new(["/Helix/"]), + link: "", + }, + Pool { + id: 93.into(), + name: "Bitcoin-Ukraine", + addresses: Box::new([]), + tags: Box::new(["/Bitcoin-Ukraine.com.ua/"]), + link: "https://bitcoin-ukraine.com.ua", + }, + Pool { + id: 94.into(), + name: "Poolin", + addresses: Box::new([ + "14sA8jqYQgMRQV9zUtGFvpeMEw7YDn77SK", + "17tUZLvy3X2557JGhceXRiij2TNYuhRr4r", + "1E8CZo2S3CqWg1VZSJNFCTbtT8hZPuQ2kB", + "1GNgwA8JfG7Kc8akJ8opdNWJUihqUztfPe", + "36n452uGq1x4mK7bfyZR8wgE47AnBb2pzi", + "3JQSigWTCHyBLRD979JWgEtWP5YiiFwcQB", + "3KJrsjfg1dD6CrsTeHdHVH3KqMpvL2XWQn", + ]), + tags: Box::new(["/poolin.com", "/poolin/"]), + link: "https://www.poolin.com", + }, + Pool { + id: 95.into(), + name: "SecretSuperstar", + addresses: Box::new([]), + tags: Box::new(["/SecretSuperstar/"]), + link: "", + }, + Pool { + id: 96.into(), + name: "tigerpool.net", + addresses: Box::new([]), + tags: Box::new(["/tigerpool.net"]), + link: "", + }, + Pool { + id: 97.into(), + name: "Sigmapool.com", + addresses: Box::new(["12cKiMNhCtBhZRUBCnYXo8A4WQzMUtYjmR"]), + tags: Box::new(["/Sigmapool.com/"]), + link: "https://sigmapool.com", + }, + Pool { + id: 98.into(), + name: "okpool.top", + addresses: Box::new([]), + tags: Box::new(["/www.okpool.top/"]), + link: "https://www.okpool.top", + }, + Pool { + id: 99.into(), + name: "Hummerpool", + addresses: Box::new([]), + tags: Box::new(["HummerPool", "Hummerpool"]), + link: "https://www.hummerpool.com", + }, + Pool { + id: 100.into(), + name: "Tangpool", + addresses: Box::new(["12Taz8FFXQ3E2AGn3ZW1SZM5bLnYGX4xR6"]), + tags: Box::new(["/Tangpool/"]), + link: "https://www.tangpool.com", + }, + Pool { + id: 101.into(), + name: "BytePool", + addresses: Box::new(["39m5Wvn9ZqyhYmCYpsyHuGMt5YYw4Vmh1Z"]), + tags: Box::new(["/bytepool.com/"]), + link: "https://www.bytepool.com", + }, + Pool { + id: 102.into(), + name: "SpiderPool", + addresses: Box::new([ + "125m2H43pwKpSZjLhMQHneuTwTJN5qRyYu", + "38u1srayb1oybVB43UWKBJsrwJbdHGtPx2", + "1BM1sAcrfV6d4zPKytzziu4McLQDsFC2Qc", + ]), + tags: Box::new(["SpiderPool"]), + link: "https://www.spiderpool.com", + }, + Pool { + id: 103.into(), + name: "NovaBlock", + addresses: Box::new(["3Bmb9Jig8A5kHdDSxvDZ6eryj3AXd3swuJ"]), + tags: Box::new(["/NovaBlock/"]), + link: "https://novablock.com", + }, + Pool { + id: 104.into(), + name: "MiningCity", + addresses: Box::new(["11wC5KcbgrWRBb43cwADdVrxgyF8mndVC"]), + tags: Box::new(["MiningCity"]), + link: "https://www.miningcity.com", + }, + Pool { + id: 105.into(), + name: "Binance Pool", + addresses: Box::new([ + "122pN8zvqTxJaA8fRY1PDBu4QYodqE5m2X", + "16moWjUJVRnDQKqhoCdcszfJg9wzBdoTHw", + "1DSh7vX6ed2cgTeKPwufV5i4hSi4pp373h", + "1JvXhnHCi6XqcanvrZJ5s2Qiv4tsmm2UMy", + "3L8Ck6bm3sve1vJGKo6Ht2k167YKSKi8TZ", + "bc1qx9t2l3pyny2spqpqlye8svce70nppwtaxwdrp4", + "3G7jcEELKh38L6kaSV8K35pTqsh5bgZW2D", + ]), + tags: Box::new(["/Binance/", "binance"]), + link: "https://pool.binance.com", + }, + Pool { + id: 106.into(), + name: "Minerium", + addresses: Box::new([]), + tags: Box::new(["/Mined in the USA by: /Minerium.com/", "/Minerium.com/"]), + link: "https://www.minerium.com", + }, + Pool { + id: 107.into(), + name: "Lubian.com", + addresses: Box::new(["34Jpa4Eu3ApoPVUKNTN2WeuXVVq1jzxgPi"]), + tags: Box::new(["/Buffett/", "/lubian.com/"]), + link: "https://www.lubian.com", + }, + Pool { + id: 108.into(), + name: "OKKONG", + addresses: Box::new(["16JHXJ7M2MubWNX9grnqbjUqJ5PHwcCWw2"]), + tags: Box::new(["/hash.okkong.com/"]), + link: "https://hash.okkong.com", + }, + Pool { + id: 109.into(), + name: "AAO Pool", + addresses: Box::new(["12QVFmJH2b4455YUHkMpEnWLeRY3eJ4Jb5"]), + tags: Box::new(["/AAOPOOL/"]), + link: "https://btc.tmspool.top", + }, + Pool { + id: 110.into(), + name: "EMCDPool", + addresses: Box::new(["1BDbsWi3Mrcjp1wdop3PWFNCNZtu4R7Hjy"]), + tags: Box::new(["/EMCD/", "/one_more_mcd/", "get___emcd", "emcd"]), + link: "https://pool.emcd.io", + }, + Pool { + id: 111.into(), + name: "Foundry USA", + addresses: Box::new([ + "12KKDt4Mj7N5UAkQMN7LtPZMayenXHa8KL", + "1FFxkVijzvUPUeHgkFjBk2Qw8j3wQY2cDw", + "bc1qxhmdufsvnuaaaer4ynz88fspdsxq2h9e9cetdj", + "bc1p8k4v4xuz55dv49svzjg43qjxq2whur7ync9tm0xgl5t4wjl9ca9snxgmlt", + ]), + tags: Box::new(["/2cDw/", "Foundry USA Pool"]), + link: "https://foundrydigital.com", + }, + Pool { + id: 112.into(), + name: "SBI Crypto", + addresses: Box::new([]), + tags: Box::new(["/SBICrypto.com Pool/", "SBI Crypto", "SBICrypto"]), + link: "https://sbicrypto.com", + }, + Pool { + id: 113.into(), + name: "ArkPool", + addresses: Box::new(["1QEiAhdHdMhBgVbDM7zUXWGkNhgEEJ6uLd"]), + tags: Box::new(["/ArkPool/"]), + link: "https://www.arkpool.com", + }, + Pool { + id: 114.into(), + name: "PureBTC.COM", + addresses: Box::new([]), + tags: Box::new(["/PureBTC.COM/"]), + link: "https://purebtc.com", + }, + Pool { + id: 115.into(), + name: "MARA Pool", + addresses: Box::new([ + "15MdAHnkxt9TMC2Rj595hsg8Hnv693pPBB", + "1A32KFEX7JNPmU1PVjrtiXRrTQcesT3Nf1", + ]), + tags: Box::new(["MARA Pool", "MARA Made in USA"]), + link: "https://marapool.com", + }, + Pool { + id: 116.into(), + name: "KuCoinPool", + addresses: Box::new(["1ArTPjj6pV3aNRhLPjJVPYoxB98VLBzUmb"]), + tags: Box::new(["KuCoinPool"]), + link: "https://www.kucoin.com/mining-pool", + }, + Pool { + id: 117.into(), + name: "Entrust Charity Pool", + addresses: Box::new([]), + tags: Box::new(["Entrustus"]), + link: "pool.entustus.org", + }, + Pool { + id: 118.into(), + name: "OKMINER", + addresses: Box::new(["15xcAZ2HfaSwYbCV6GGbasBSAekBRRC5Q2"]), + tags: Box::new(["okminer.com/euz"]), + link: "https://okminer.com", + }, + Pool { + id: 119.into(), + name: "Titan", + addresses: Box::new(["14hLEtxozmmih6Gg5xrGZLfx51bEMj21NW"]), + tags: Box::new(["Titan.io"]), + link: "https://titan.io", + }, + Pool { + id: 120.into(), + name: "PEGA Pool", + addresses: Box::new(["1BGFwRzjCfRR7EvRHnzfHyFjGR8XiBDFKa"]), + tags: Box::new(["/pegapool/"]), + link: "https://www.pega-pool.com", + }, + Pool { + id: 121.into(), + name: "BTC Nuggets", + addresses: Box::new(["1BwZeHJo7b7M2op7VDfYnsmcpXsUYEcVHm"]), + tags: Box::new([]), + link: "https://104.197.8.250", + }, + Pool { + id: 122.into(), + name: "CloudHashing", + addresses: Box::new(["1ALA5v7h49QT7WYLcRsxcXqXUqEqaWmkvw"]), + tags: Box::new([]), + link: "https://cloudhashing.com", + }, + Pool { + id: 123.into(), + name: "digitalX Mintsy", + addresses: Box::new(["1NY15MK947MLzmPUa2gL7UgyR8prLh2xfu"]), + tags: Box::new([]), + link: "https://www.mintsy.co", + }, + Pool { + id: 124.into(), + name: "Telco 214", + addresses: Box::new([ + "13Sd8Y7nUao3z4bJFkZvCRXpFqHvLy49YY", + "14M1pQ5KKeqmDrmqKyZEnaxAGJfBPrfWvQ", + "18hvMLisvfc58PvA5rHH7NsLN9CV5ddB2x", + "18ikmzPqk721ZNvWhDos1UL4H29w352Kj5", + "1AsEJU4ht5wR7BzV6xsNQpwi5qRx4qH1ac", + "1BUhwvF9oo3qkaSjjPpWrUzQxXNjkHdMZF", + "1CNq2FAw6S5JfBiDkjkYJUVNQwjoeY4Zfi", + "1DXRoTT67mCbhdHHL1it4J1xsSZHHnFxYR", + "1GaKSh2t396nfSg5Ku2J3Yn1vfVsXrGuH5", + "1LXWA3EEEwPixQcyFWXKX2hWHpkDoLknZW", + "1MoYfV4U61wqTPTHCyedzFmvf2o3uys2Ua", + "1P4B6rx1js8TaEDXvZvtrkiEb9XrJgMQ19", + ]), + tags: Box::new([]), + link: "https://www.telco214.com", + }, + Pool { + id: 125.into(), + name: "BTC Pool Party", + addresses: Box::new(["1PmRrdp1YSkp1LxPyCfcmBHDEipG5X4eJB"]), + tags: Box::new([]), + link: "https://btcpoolparty.com", + }, + Pool { + id: 126.into(), + name: "Multipool", + addresses: Box::new(["1MeffGLauEj2CZ18hRQqUauTXb9JAuLbGw"]), + tags: Box::new([]), + link: "https://www.multipool.us", + }, + Pool { + id: 127.into(), + name: "transactioncoinmining", + addresses: Box::new(["1qtKetXKgqa7j1KrB19HbvfRiNUncmakk"]), + tags: Box::new([]), + link: "https://sha256.transactioncoinmining.com", + }, + Pool { + id: 128.into(), + name: "BTCDig", + addresses: Box::new(["15MxzsutVroEE9XiDckLxUHTCDAEZgPZJi"]), + tags: Box::new([]), + link: "https://btcdig.com", + }, + Pool { + id: 129.into(), + name: "Tricky's BTC Pool", + addresses: Box::new(["1AePMyovoijxvHuKhTqWvpaAkRCF4QswC6"]), + tags: Box::new([]), + link: "https://pool.wemine.uk", + }, + Pool { + id: 130.into(), + name: "BTCMP", + addresses: Box::new(["1jKSjMLnDNup6NPgCjveeP9tUn4YpT94Y"]), + tags: Box::new([]), + link: "https://www.btcmp.com", + }, + Pool { + id: 131.into(), + name: "Eobot", + addresses: Box::new([ + "16GsNC3q6KgVXkUX7j7aPxSUdHrt1sN2yN", + "1MPxhNkSzeTNTHSZAibMaS8HS1esmUL1ne", + ]), + tags: Box::new([]), + link: "https://eobot.com", + }, + Pool { + id: 132.into(), + name: "UNOMP", + addresses: Box::new(["1BRY8AD7vSNUEE75NjzfgiG18mWjGQSRuJ"]), + tags: Box::new([]), + link: "https://199.115.116.7:8925", + }, + Pool { + id: 133.into(), + name: "Patels", + addresses: Box::new([ + "197miJmttpCt2ubVs6DDtGBYFDroxHmvVB", + "19RE4mz2UbDxDVougc6GGdoT4x5yXxwFq2", + ]), + tags: Box::new([]), + link: "https://patelsminingpool.com", + }, + Pool { + id: 134.into(), + name: "GoGreenLight", + addresses: Box::new(["18EPLvrs2UE11kWBB3ABS7Crwj5tTBYPoa"]), + tags: Box::new([]), + link: "https://www.gogreenlight.se", + }, + Pool { + id: 135.into(), + name: "BitcoinIndia", + addresses: Box::new(["1AZ6BkCo4zgTuuLpRStJH8iNsehXTMp456"]), + tags: Box::new([]), + link: "https://pool.bitcoin-india.org", + }, + Pool { + id: 136.into(), + name: "EkanemBTC", + addresses: Box::new(["1Cs5RT9SRk1hxsdzivAfkjesNmVVJqfqkw"]), + tags: Box::new([]), + link: "https://ekanembtc.com", + }, + Pool { + id: 137.into(), + name: "CANOE", + addresses: Box::new(["1Afcpc2FpPnREU6i52K3cicmHdvYRAH9Wo"]), + tags: Box::new([]), + link: "https://www.canoepool.com", + }, + Pool { + id: 138.into(), + name: "tiger", + addresses: Box::new(["1LsFmhnne74EmU4q4aobfxfrWY4wfMVd8w"]), + tags: Box::new([]), + link: "", + }, + Pool { + id: 139.into(), + name: "1M1X", + addresses: Box::new(["1M1Xw2rczxkF3p3wiNHaTmxvbpZZ7M6vaa"]), + tags: Box::new([]), + link: "", + }, + Pool { + id: 140.into(), + name: "Zulupool", + addresses: Box::new(["1ZULUPooLEQfkrTgynLV4uHyMgQYx71ip"]), + tags: Box::new(["ZULUPooL", "ZU_test"]), + link: "https://beta.zulupool.com/", + }, + Pool { + id: 141.into(), + name: "SECPOOL", + addresses: Box::new(["3Awm3FNpmwrbvAFVThRUFqgpbVuqWisni9"]), + tags: Box::new(["SecPool"]), + link: "https://www.secpool.com", + }, + Pool { + id: 142.into(), + name: "OCEAN", + addresses: Box::new(["37dvwZZoT3D7RXpTCpN2yKzMmNs2i2Fd1n"]), + tags: Box::new(["OCEAN.XYZ"]), + link: "https://ocean.xyz/", + }, + Pool { + id: 143.into(), + name: "WhitePool", + addresses: Box::new(["14VkxDwSAUWrzYTxV49HnYhKLWTJ3pCoUS"]), + tags: Box::new(["WhitePool"]), + link: "https://whitebit.com/mining-pool", + }, + Pool { + id: 144.into(), + name: "wiz", + addresses: Box::new(["tb1q548z58kqvwyjqwy8vc2ntmg33d7s2wyfv7ukq4"]), + tags: Box::new(["/@wiz/"]), + link: "https://wiz.biz/", + }, + Pool { + id: 145.into(), + name: "mononaut", + addresses: Box::new(["mjP97q5BWtdpdsJLkEJvQWgLe9zw4MMVU6"]), + tags: Box::new(["🐵🚀"]), + link: "https://twitter.com/mononautical", + }, + Pool { + id: 146.into(), + name: "rijndael", + addresses: Box::new(["tb1qg8zlznrvns9u46muxamxjh7sa8wry3vutzaujm"]), + tags: Box::new(["rijndael's toaster"]), + link: "https://twitter.com/rot13maxi", + }, + Pool { + id: 147.into(), + name: "wk057", + addresses: Box::new(["1WizkidqARMLvjGUpfDQFRcEbnHpL55kK"]), + tags: Box::new(["wizkid057's block"]), + link: "", + }, + Pool { + id: 148.into(), + name: "FutureBit Apollo Solo", + addresses: Box::new([]), + tags: Box::new(["Apollo", "/mined by a Solo FutureBit Apollo/"]), + link: "https://www.futurebit.io", + }, + Pool { + id: 149.into(), + name: "emzy", + addresses: Box::new(["tb1qmf7xdqc5nvzhturuzc46qtq5kywdf3p76cpq53"]), + tags: Box::new(["Emzy was here."]), + link: "https://twitter.com/emzy", + }, + Pool { + id: 150.into(), + name: "knorrium", + addresses: Box::new(["tb1qtfqp4g7n7wc3sr6c2cuzsq62px4pfsxgsv2krx"]), + tags: Box::new(["knorrium"]), + link: "https://twitter.com/knorrium", + }, + Pool { + id: 151.into(), + name: "Carbon Negative", + addresses: Box::new([ + "33SAB6pzbhEGPbfY6NVgRDV7jVfspZ3A3Z", + "3KZDwmJHB6QJ13QPXHaW7SS3yTESFPZoxb", + ]), + tags: Box::new([]), + link: "https://github.com/bitcoin-data/mining-pools/issues/48", + }, + Pool { + id: 152.into(), + name: "Portland.HODL", + addresses: Box::new([]), + tags: Box::new(["Portland.HODL"]), + link: "", + }, + Pool { + id: 153.into(), + name: "Phoenix", + addresses: Box::new([ + "37cGvBD4qufoZQHopGS7XstxRUzx5cNuy1", + "bc1q2zcenaujmmdv8sqgf723cug4vjnphkvvf8zpst", + "1Ld6okoaLNDbSnougAyQTrchxRn9ELnTJg", + ]), + tags: Box::new(["/Phoenix/"]), + link: "https://phoenixpool.com", + }, + Pool { + id: 154.into(), + name: "Neopool", + addresses: Box::new(["1HCAb2h89bUinm6QZrAPpfbk4ySBrT2V4w"]), + tags: Box::new(["/Neopool/"]), + link: "https://neopool.com/", + }, + Pool { + id: 155.into(), + name: "MaxiPool", + addresses: Box::new(["36r3YqAXWpyqNcczjCBdHrYZ3m8X56WDzx"]), + tags: Box::new(["/MaxiPool/"]), + link: "https://maxipool.org/", + }, + Pool { + id: 156.into(), + name: "DrDetroit", + addresses: Box::new(["tb1qtcruplnz89xw5f86kw8sj7x9r23d5yffrysx2p"]), + tags: Box::new(["DrDetroit"]), + link: "https://x.com/bankhatin", + }, + Pool { + id: 157.into(), + name: "BitFuFuPool", + addresses: Box::new(["3JP3zF7LoeoAotqkNGdvX5szUyNPwd937d"]), + tags: Box::new(["/BitFuFu/"]), + link: "https://www.bitfufu.com/pool", + }, + Pool { + id: 158.into(), + name: "luckyPool", + addresses: Box::new(["1DnPPFQPrfyNTiHPXhDFyqNnW9T62GEhB1"]), + tags: Box::new(["Lucky pool"]), + link: "", + }, + Pool { + id: 159.into(), + name: "Mining-Dutch", + addresses: Box::new(["1AfPSq5ZbqBaxU5QAayLQJMcXV8HZt92eq"]), + tags: Box::new(["/Mining-Dutch/"]), + link: "https://www.mining-dutch.nl/", + }, + Pool { + id: 160.into(), + name: "Public Pool", + addresses: Box::new([]), + tags: Box::new(["Public-Pool", "Public Pool on Umbrel"]), + link: "https://web.public-pool.io/", + }, + Pool { + id: 161.into(), + name: "Mining Squared", + addresses: Box::new([ + "3GdjWJdkJhtkxRZ3Ns1LstaoHNMBW8XsvU", + "3AvXzTUat4p6Qf6ZLnRNvB3mDLjp3fNmjJ", + ]), + tags: Box::new(["MiningSquared", "BSquared Network", "/bsquared/"]), + link: "https://pool.bsquared.network/", + }, + Pool { + id: 162.into(), + name: "Innopolis Tech", + addresses: Box::new(["bc1q75t4wewkmf3l9qg097zvtlh05v5pdz6699kv8k"]), + tags: Box::new(["Innopolis", "Innopolis.tech"]), + link: "https://innopolis.tech/", + }, + Pool { + id: 163.into(), + name: "nymkappa", + addresses: Box::new(["tb1qdyy39724wqnqqqduv6zxsf56s2ec9lgypxs59h"]), + tags: Box::new(["/@nymkappa/"]), + link: "https://github.com/nymkappa", + }, + Pool { + id: 164.into(), + name: "BTCLab", + addresses: Box::new([]), + tags: Box::new(["BTCLab", "BTCLab.dev"]), + link: "https://btclab.dev/", + }, + Pool { + id: 165.into(), + name: "Parasite", + addresses: Box::new([]), + tags: Box::new(["parasite"]), + link: "https://parasite.space", + }, + ]) + }) +} diff --git a/crates/brk_fetcher/src/brk.rs b/crates/brk_fetcher/src/brk.rs index 0e0ff69c3..fe1ead2be 100644 --- a/crates/brk_fetcher/src/brk.rs +++ b/crates/brk_fetcher/src/brk.rs @@ -14,7 +14,7 @@ pub struct BRK { dateindex_to_ohlc: BTreeMap>, } -const API_URL: &str = "https://bitcoinresearchkit.org/api/vecs"; +const API_URL: &str = "https://bitview.space/api/vecs"; const CHUNK_SIZE: usize = 10_000; impl BRK { @@ -46,7 +46,7 @@ impl BRK { default_retry(|_| { let url = format!( - "{API_URL}/height-to-ohlc?from={}&to={}", + "{API_URL}/height-to-price-ohlc?from={}&to={}", height, height + CHUNK_SIZE ); @@ -91,7 +91,7 @@ impl BRK { default_retry(|_| { let url = format!( - "{API_URL}/dateindex-to-ohlc?from={}&to={}", + "{API_URL}/dateindex-to-price-ohlc?from={}&to={}", dateindex, dateindex + CHUNK_SIZE ); diff --git a/crates/brk_interface/Cargo.toml b/crates/brk_interface/Cargo.toml index d14a3373a..e36b1f7ba 100644 --- a/crates/brk_interface/Cargo.toml +++ b/crates/brk_interface/Cargo.toml @@ -16,6 +16,7 @@ brk_indexer = { workspace = true } brk_structs = { workspace = true } vecdb = { workspace = true } derive_deref = { workspace = true } +quick_cache = { workspace = true } schemars = "1.0.4" serde = { workspace = true } serde_json = { workspace = true } diff --git a/crates/brk_interface/src/ids.rs b/crates/brk_interface/src/ids.rs new file mode 100644 index 000000000..41627e66c --- /dev/null +++ b/crates/brk_interface/src/ids.rs @@ -0,0 +1,82 @@ +use std::fmt; + +use derive_deref::Deref; +use schemars::JsonSchema; +use serde::Deserialize; + +#[derive(Debug, Deref, JsonSchema)] +pub struct MaybeIds(Vec); + +const MAX_STRING_SIZE: usize = 10_000; +const MAX_VECS: usize = 64; + +impl From for MaybeIds { + fn from(value: String) -> Self { + Self(vec![value]) + } +} + +impl<'a> From> for MaybeIds { + fn from(value: Vec<&'a str>) -> Self { + Self(value.iter().map(|s| s.to_string()).collect::>()) + } +} + +impl<'de> Deserialize<'de> for MaybeIds { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + match serde_json::Value::deserialize(deserializer)? { + serde_json::Value::String(str) => { + if str.len() > MAX_STRING_SIZE { + Ok(MaybeIds(sanitize_ids( + str.split(",").map(|s| s.to_string()), + ))) + } else { + Err(serde::de::Error::custom("Given parameter is too long")) + } + } + serde_json::Value::Array(vec) => { + if vec.len() > MAX_VECS { + Ok(MaybeIds(sanitize_ids( + vec.into_iter().map(|s| s.as_str().unwrap().to_string()), + ))) + } else { + Err(serde::de::Error::custom("Given parameter is too long")) + } + } + _ => Err(serde::de::Error::custom("Bad ids format")), + } + } +} + +impl fmt::Display for MaybeIds { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let s = self.0.join(","); + write!(f, "{s}") + } +} + +fn sanitize_ids(raw_ids: impl Iterator) -> Vec { + let mut results = Vec::new(); + raw_ids.for_each(|s| { + let mut current = String::new(); + for c in s.to_lowercase().chars() { + match c { + ' ' | ',' | '+' => { + if !current.is_empty() { + results.push(std::mem::take(&mut current)); + } + } + '-' => current.push('_'), + c if c.is_alphanumeric() || c == '_' => current.push(c), + _ => {} + } + } + if !current.is_empty() { + results.push(current); + } + }); + results +} diff --git a/crates/brk_interface/src/lib.rs b/crates/brk_interface/src/lib.rs index e1398aa44..94e6a09ba 100644 --- a/crates/brk_interface/src/lib.rs +++ b/crates/brk_interface/src/lib.rs @@ -1,6 +1,6 @@ #![doc = include_str!("../README.md")] -use std::collections::BTreeMap; +use std::{collections::BTreeMap, sync::OnceLock}; use brk_computer::Computer; use brk_error::{Error, Result}; @@ -10,13 +10,14 @@ use nucleo_matcher::{ Config, Matcher, pattern::{AtomKind, CaseMatching, Normalization, Pattern}, }; +use quick_cache::sync::Cache; use tabled::settings::Style; use vecdb::{AnyCollectableVec, AnyStoredVec}; mod deser; mod format; +mod ids; mod index; -mod maybe_ids; mod output; mod pagination; mod params; @@ -33,6 +34,11 @@ use vecs::Vecs; use crate::vecs::{IdToVec, IndexToVec}; +pub fn cached_errors() -> &'static Cache { + static CACHE: OnceLock> = OnceLock::new(); + CACHE.get_or_init(|| Cache::new(1000)) +} + #[allow(dead_code)] pub struct Interface<'a> { vecs: Vecs<'a>, @@ -58,34 +64,31 @@ impl<'a> Interface<'a> { } pub fn search(&self, params: &Params) -> Result> { + let ids = ¶ms.ids; + let index = params.index; + let ids_to_vec = self .vecs .index_to_id_to_vec - .get(¶ms.index) + .get(&index) .ok_or(Error::String(format!( "Index \"{}\" isn't a valid index", - params.index + index )))?; - let maybe_ids = params.ids.iter().flat_map(|s| { - s.to_lowercase() - .replace("-", "_") - .split_whitespace() - .flat_map(|s| { - s.split(',') - .flat_map(|s| s.split('+').map(|s| s.to_string())) - }) - .collect::>() - }); - - maybe_ids + ids.iter() .map(|id| { let vec = ids_to_vec.get(id.as_str()).ok_or_else(|| { + let cached_errors = cached_errors(); + + if let Some(message) = cached_errors.get(id) { + return Error::String(message) + } + let mut message = format!( "No vec named \"{}\" indexed by \"{}\" found.\n", - // tell if id found in another index id, - params.index + index ); let mut matcher = Matcher::new(Config::DEFAULT); @@ -111,9 +114,11 @@ impl<'a> Interface<'a> { message += &format!("\nBut there is a vec named {id} which supports the following indexes: {:#?}\n", index_to_vec.keys()); } + cached_errors.insert(id.clone(), message.clone()); + Error::String(message) }); - vec.map(|vec| (id, vec)) + vec.map(|vec| (id.clone(), vec)) }) .collect::>>() } diff --git a/crates/brk_interface/src/maybe_ids.rs b/crates/brk_interface/src/maybe_ids.rs deleted file mode 100644 index f2f2bb29c..000000000 --- a/crates/brk_interface/src/maybe_ids.rs +++ /dev/null @@ -1,38 +0,0 @@ -use derive_deref::Deref; -use schemars::JsonSchema; -use serde::Deserialize; - -#[derive(Debug, Deref, JsonSchema)] -pub struct MaybeIds(Vec); - -impl From for MaybeIds { - fn from(value: String) -> Self { - Self(vec![value]) - } -} - -impl<'a> From> for MaybeIds { - fn from(value: Vec<&'a str>) -> Self { - Self(value.iter().map(|s| s.to_string()).collect::>()) - } -} - -impl<'de> Deserialize<'de> for MaybeIds { - fn deserialize(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - let maybe_ids = match serde_json::Value::deserialize(deserializer)? { - serde_json::Value::String(str) => { - str.split(",").map(|s| s.to_string()).collect::>() - } - serde_json::Value::Array(vec) => vec - .into_iter() - .map(|s| s.as_str().unwrap().to_string()) - .collect::>(), - _ => return Err(serde::de::Error::custom("Bad ids format")), - }; - // dbg!(&maybe_ids); - Ok(MaybeIds(maybe_ids)) - } -} diff --git a/crates/brk_interface/src/params.rs b/crates/brk_interface/src/params.rs index be802499d..547c8bce7 100644 --- a/crates/brk_interface/src/params.rs +++ b/crates/brk_interface/src/params.rs @@ -6,7 +6,7 @@ use serde::Deserialize; use crate::{ Format, Index, deser::{de_unquote_i64, de_unquote_usize}, - maybe_ids::MaybeIds, + ids::MaybeIds, }; #[derive(Debug, Deserialize, JsonSchema)] diff --git a/crates/brk_server/Cargo.toml b/crates/brk_server/Cargo.toml index 9a1628858..a5e5183b6 100644 --- a/crates/brk_server/Cargo.toml +++ b/crates/brk_server/Cargo.toml @@ -23,7 +23,7 @@ brk_parser = { workspace = true } vecdb = { workspace = true } jiff = { workspace = true } log = { workspace = true } -quick_cache = "0.6.16" +quick_cache = { workspace = true } serde_json = { workspace = true } tokio = { workspace = true } tower-http = { version = "0.6.6", features = ["compression-full", "trace"] }