diff --git a/Cargo.lock b/Cargo.lock index bb05457bf..18f0327ba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -187,35 +187,26 @@ version = "1.0.0" dependencies = [ "anyhow", "async-stream", - "async-trait", - "axum 0.7.9", + "axum", "base32", "base64 0.22.1", - "bytes", "chrono", "clap", "common", "config", - "const-oid", "criterion", - "dashmap 6.1.0", + "dashmap", "futures", "fxt", "governor", - "hdrhistogram", - "hex", "hmac", "http 1.4.0", - "http-body 1.0.1", "http-body-util", - "hyper 1.8.1", - "hyper-util", "image 0.25.10", "jsonwebtoken", "k8s-openapi 0.27.1", "kube 3.1.0", "lru", - "num-traits", "ocsp", "once_cell", "prometheus", @@ -226,7 +217,6 @@ dependencies = [ "redis", "regex", "reqwest 0.12.28", - "rust_decimal", "rustls 0.23.37", "secrecy 0.8.0", "serde", @@ -236,7 +226,6 @@ dependencies = [ "sqlx", "thiserror 1.0.69", "tokio", - "tokio-stream", "tokio-test", "tonic 0.14.5", "tonic-health", @@ -247,15 +236,10 @@ dependencies = [ "totp-rs", "tower 0.4.13", "tower-http 0.5.2", - "tower-layer", - "tower-service", "tracing", - "tracing-subscriber", - "trading_engine", "urlencoding", "uuid", "x509-parser", - "zeroize", ] [[package]] @@ -267,7 +251,7 @@ dependencies = [ "chrono", "clap", "common", - "dashmap 6.1.0", + "dashmap", "futures", "hdrhistogram", "jsonwebtoken", @@ -1437,13 +1421,13 @@ dependencies = [ [[package]] name = "axum" -version = "0.7.9" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8" dependencies = [ - "async-trait", - "axum-core 0.4.5", + "axum-core", "bytes", + "form_urlencoded", "futures-util", "http 1.4.0", "http-body 1.0.1", @@ -1451,13 +1435,12 @@ dependencies = [ "hyper 1.8.1", "hyper-util", "itoa", - "matchit 0.7.3", + "matchit", "memchr", "mime", "percent-encoding", "pin-project-lite", - "rustversion", - "serde", + "serde_core", "serde_json", "serde_path_to_error", "serde_urlencoded", @@ -1469,52 +1452,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "axum" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8" -dependencies = [ - "axum-core 0.5.6", - "bytes", - "futures-util", - "http 1.4.0", - "http-body 1.0.1", - "http-body-util", - "itoa", - "matchit 0.8.4", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "serde_core", - "sync_wrapper 1.0.2", - "tower 0.5.3", - "tower-layer", - "tower-service", -] - -[[package]] -name = "axum-core" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http 1.4.0", - "http-body 1.0.1", - "http-body-util", - "mime", - "pin-project-lite", - "rustversion", - "sync_wrapper 1.0.2", - "tower-layer", - "tower-service", - "tracing", -] - [[package]] name = "axum-core" version = "0.5.6" @@ -1531,6 +1468,7 @@ dependencies = [ "sync_wrapper 1.0.2", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -1568,7 +1506,7 @@ dependencies = [ "crossbeam", "crossbeam-channel", "csv", - "dashmap 6.1.0", + "dashmap", "data", "fastrand", "futures", @@ -1599,7 +1537,7 @@ dependencies = [ "anyhow", "async-stream", "async-trait", - "axum 0.7.9", + "axum", "base64 0.22.1", "chrono", "clap", @@ -1607,7 +1545,7 @@ dependencies = [ "config", "criterion", "crossbeam", - "dashmap 6.1.0", + "dashmap", "data", "dbn 0.42.0", "dotenvy", @@ -1844,7 +1782,7 @@ dependencies = [ "anyhow", "async-stream", "async-trait", - "axum 0.7.9", + "axum", "base64 0.22.1", "bytes", "chrono", @@ -2886,19 +2824,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core 0.9.12", -] - [[package]] name = "dashmap" version = "6.1.0" @@ -2930,7 +2855,7 @@ dependencies = [ "criterion", "crossbeam", "crossbeam-channel", - "dashmap 6.1.0", + "dashmap", "dbn 0.42.0", "fastrand", "flate2", @@ -2938,7 +2863,7 @@ dependencies = [ "futures-core", "futures-util", "governor", - "hashbrown 0.14.5", + "hashbrown 0.16.1", "hdrhistogram", "hex", "lz4", @@ -2989,7 +2914,7 @@ dependencies = [ "anyhow", "async-stream", "async-trait", - "axum 0.7.9", + "axum", "bytes", "chrono", "clap", @@ -3836,7 +3761,7 @@ version = "1.0.0" dependencies = [ "anyhow", "async-trait", - "axum 0.7.9", + "axum", "backtesting", "bincode", "chrono", @@ -4239,22 +4164,25 @@ checksum = "558b88954871f5e5b2af0e62e2e176c8bde7a6c2c4ed41b13d138d96da2e2cbd" [[package]] name = "governor" -version = "0.6.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a7f542ee6b35af73b06abc0dad1c1bae89964e4e253bc4b587b91c9637867b" +checksum = "9efcab3c1958580ff1f25a2a41be1668f7603d849bb63af523b208a3cc1223b8" dependencies = [ "cfg-if", - "dashmap 5.5.3", - "futures", + "dashmap", + "futures-sink", "futures-timer", - "no-std-compat", + "futures-util", + "getrandom 0.3.4", + "hashbrown 0.16.1", "nonzero_ext", "parking_lot 0.12.5", "portable-atomic", "quanta", - "rand 0.8.5", + "rand 0.9.2", "smallvec", "spinning_top", + "web-time", ] [[package]] @@ -4336,7 +4264,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash 0.8.12", - "allocator-api2", ] [[package]] @@ -5890,12 +5817,6 @@ dependencies = [ "regex-automata", ] -[[package]] -name = "matchit" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" - [[package]] name = "matchit" version = "0.8.4" @@ -6074,7 +5995,7 @@ dependencies = [ "crossbeam", "csv", "cudarc", - "dashmap 6.1.0", + "dashmap", "data", "databento", "dbn 0.42.0", @@ -6114,7 +6035,7 @@ dependencies = [ "ml-supervised", "ml-universe", "ml-validation", - "nalgebra 0.33.2", + "nalgebra", "ndarray", "num", "num-traits", @@ -6191,7 +6112,7 @@ dependencies = [ "aws-sdk-s3", "aws-types", "chrono", - "dashmap 6.1.0", + "dashmap", "flate2", "fs2", "hex", @@ -6222,7 +6143,7 @@ dependencies = [ "common", "config", "cudarc", - "dashmap 6.1.0", + "dashmap", "futures", "libc", "mimalloc", @@ -6326,7 +6247,7 @@ dependencies = [ "common", "crossbeam", "cudarc", - "dashmap 6.1.0", + "dashmap", "ml-core", "ndarray", "once_cell", @@ -6410,7 +6331,7 @@ dependencies = [ name = "ml-labeling" version = "1.0.0" dependencies = [ - "dashmap 6.1.0", + "dashmap", "ml-core", "serde", "tokio", @@ -6547,12 +6468,12 @@ dependencies = [ "common", "config", "cudarc", - "dashmap 6.1.0", + "dashmap", "data", "libc", "lru", "ml-core", - "nalgebra 0.33.2", + "nalgebra", "ndarray", "num_cpus", "parking_lot 0.12.5", @@ -6578,7 +6499,7 @@ dependencies = [ "arrow 56.2.0", "async-stream", "async-trait", - "axum 0.7.9", + "axum", "base64 0.22.1", "bytes", "chacha20poly1305", @@ -6726,24 +6647,6 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" -[[package]] -name = "nalgebra" -version = "0.32.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5c17de023a86f59ed79891b2e5d5a94c705dbe904a5b5c9c952ea6221b03e4" -dependencies = [ - "approx", - "matrixmultiply", - "nalgebra-macros", - "num-complex", - "num-rational", - "num-traits", - "rand 0.8.5", - "rand_distr 0.4.3", - "simba 0.8.1", - "typenum", -] - [[package]] name = "nalgebra" version = "0.33.2" @@ -6759,7 +6662,7 @@ dependencies = [ "rand 0.8.5", "rand_distr 0.4.3", "serde", - "simba 0.9.1", + "simba", "typenum", ] @@ -6824,12 +6727,6 @@ dependencies = [ "libc", ] -[[package]] -name = "no-std-compat" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c" - [[package]] name = "nom" version = "7.1.3" @@ -8865,11 +8762,11 @@ dependencies = [ "common", "config", "criterion", - "dashmap 6.1.0", + "dashmap", "fastrand", "futures", "hdrhistogram", - "nalgebra 0.33.2", + "nalgebra", "ndarray", "num", "num-traits", @@ -9787,19 +9684,6 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "simba" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae" -dependencies = [ - "approx", - "num-complex", - "num-traits", - "paste", - "wide", -] - [[package]] name = "simba" version = "0.9.1" @@ -10263,12 +10147,12 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "statrs" -version = "0.17.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f697a07e4606a0a25c044de247e583a330dbb1731d11bc7350b81f48ad567255" +checksum = "2a3fe7c28c6512e766b0874335db33c94ad7b8f9054228ae1c2abd47ce7d335e" dependencies = [ "approx", - "nalgebra 0.32.6", + "nalgebra", "num-traits", "rand 0.8.5", ] @@ -10286,7 +10170,7 @@ dependencies = [ "clap", "common", "config", - "dashmap 6.1.0", + "dashmap", "flate2", "fs2", "futures", @@ -10318,7 +10202,7 @@ dependencies = [ "chrono", "common", "config", - "dashmap 6.1.0", + "dashmap", "futures", "hdrhistogram", "num_cpus", @@ -11113,7 +10997,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fec7c61a0695dc1887c1b53952990f3ad2e3a31453e1f49f10e75424943a93ec" dependencies = [ "async-trait", - "axum 0.8.8", + "axum", "base64 0.22.1", "bytes", "h2 0.4.13", @@ -11460,7 +11344,7 @@ dependencies = [ "approx", "async-stream", "async-trait", - "axum 0.7.9", + "axum", "bigdecimal", "bytes", "chrono", @@ -11474,7 +11358,7 @@ dependencies = [ "hyper-util", "ml", "ml-features", - "nalgebra 0.33.2", + "nalgebra", "num-traits", "once_cell", "prometheus", @@ -11532,7 +11416,7 @@ dependencies = [ "api", "async-stream", "async-trait", - "axum 0.7.9", + "axum", "base32", "base64 0.22.1", "bytes", @@ -11614,7 +11498,7 @@ dependencies = [ "crossbeam-queue", "crossbeam-utils", "ctrader-openapi", - "dashmap 6.1.0", + "dashmap", "flate2", "futures", "hdrhistogram", @@ -11664,7 +11548,7 @@ dependencies = [ "chrono", "clap", "common", - "dashmap 6.1.0", + "dashmap", "futures", "hdrhistogram", "jsonwebtoken", diff --git a/Cargo.toml b/Cargo.toml index c80dbacf2..b0945c550 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -179,6 +179,33 @@ publish = false keywords = ["trading", "hft", "ml", "rust", "finance"] categories = ["finance", "algorithms", "science"] +# Known unfixable duplicates (cargo tree -d), as of 2026-04-30: +# +# Transitive in third-party crates we cannot bump without API breakage or forks: +# - base64 v0.21 (hdrhistogram 7.5 — no newer version released) +# - chacha20 v0.9 (chacha20poly1305 0.10; v0.11 still RC) +# - phf v0.11 (time-tz, transitively via ibapi 1.2 — bumping to ibapi 2.x is a major break) +# - phf v0.12 (chrono-tz 0.10 — both versions held by orthogonal crates) +# - darling v0.14 (vaultrs 0.7 → derive_builder 0.12; vaultrs 0.8 introduces reqwest 0.13 dup, net loss) +# - darling v0.23 (ratatui 0.29 → instability 0.3) +# - itertools v0.10 (criterion 0.5 dev-dep; bumping criterion across 10 bench dirs is high-risk) +# - itertools v0.13 (object_store 0.11; object_store 0.13 has put/get/head/delete API breakage) +# - itertools v0.14 (prost-build 0.14 — already latest) +# - getrandom v0.2/0.3/0.4 (3-way: rand_core 0.6, ahash 0.8, rand 0.10; orthogonal leaves) +# - hashbrown v0.14 (dashmap 6.1 transitive — hashbrown 0.16 in workspace + indexmap) +# - syn v1 / v2 (residual proc-macros pinned to syn 1) +# - thiserror v1 / v2 (some deps still on v1) +# +# Other cargo-tree-d entries are version-suffixes attached to feature splits +# rather than separate compiles (entries with " (*)" markers). +# +# Things we DID dedupe in this pass (2026-04-30): +# - axum 0.7 → 0.8 (workspace + services/api) — dedupes vs tonic 0.14's transitive axum 0.8 +# - statrs 0.17 → 0.18 — dedupes nalgebra 0.32 vs 0.33 +# - governor 0.6 → 0.10 (services/api + crates/data) — dedupes dashmap 5 vs 6 +# - dashmap = workspace (services/api) — same as above +# - hashbrown 0.14 → 0.16 (workspace) — partial dedupe (dashmap 6.1 still pulls 0.14) + [workspace.dependencies] # Core async and utilities - OPTIMIZED VERSIONS tokio = { version = "1.40", features = ["rt-multi-thread", "macros", "net", "sync", "time", "fs", "signal", "io-util", "test-util"] } @@ -270,7 +297,7 @@ secrecy = { version = "0.8", features = ["serde"] } zeroize = { version = "1.8", features = ["std", "zeroize_derive"] } # HashiCorp Vault integration -vaultrs = "0.7" +vaultrs = "0.7" # 0.8 introduces reqwest 0.13 dup (vs workspace 0.12) — net loss # Broker connectivity tokio-tungstenite = { version = "0.24" } @@ -292,7 +319,7 @@ redis = { version = "0.27", features = ["tokio-comp", "json", "connection-manage sqlx = { version = "0.8.6", default-features = false, features = ["runtime-tokio-rustls", "postgres", "chrono", "uuid", "rust_decimal", "migrate", "derive"] } # derive feature required for compile-time query verification, postgres-only usage with rustls (no MySQL) # MINIMAL statistics only - ALL HEAVY ML DEPENDENCIES REMOVED FROM WORKSPACE -statrs = "0.17" # Basic statistics only +statrs = "0.18" # Basic statistics only — 0.18 uses nalgebra 0.33 (dedupes vs ml-* crates) approx = "0.5" # Floating point approximations only # ALL ML DEPENDENCIES COMPLETELY REMOVED FROM WORKSPACE: # linfa, linfa-linear, linfa-clustering - MOVED TO ml_training_service @@ -314,7 +341,7 @@ fs2 = "0.4" flate2 = "1.0" # Web framework for monitoring (minimal) -axum = { version = "0.7", features = ["json"] } +axum = { version = "0.8", features = ["json"] } # 0.8 dedupes with tonic 0.14's transitive axum 0.8 # gRPC and protocol buffers - CONSOLIDATED VERSIONS # Upgraded to 0.14 for Sync BoxBody support (enables HTTP-layer auth middleware) @@ -373,14 +400,14 @@ async-stream = "0.3" zstd = "0.13" lz4 = "1.24" # Object storage for S3 integration -object_store = { version = "0.11", features = ["aws"] } +object_store = { version = "0.11", features = ["aws"] } # 0.13 has API breakage (put/get/head/delete moved); skipping # Parquet/Arrow REQUIRED for market data persistence and replay in backtesting parquet = { version = "56", default-features = false, features = ["arrow", "snap"] } # Minimal for RecordBatch + SNAPPY compression arrow = { version = "56", default-features = false, features = [] } # Minimal for arrays/schema only arrow-array = "56" arrow-schema = "56" dbn = "0.42" # Databento Binary format for real market data -hashbrown = "0.14" +hashbrown = "0.16" # 0.16 dedupes with indexmap 2.x's transitive hashbrown lru = "0.12" backoff = "0.4" @@ -498,6 +525,98 @@ split-debuginfo = "unpacked" # Faster linking on Linux [profile.dev] split-debuginfo = "unpacked" # Faster linking for dev builds +# ── Per-package codegen-units overrides ─────────────────────────────────────── +# Default for all release builds: codegen-units = 16 → parallel LLVM, faster +# compile. Numerical-sensitive crates (anything whose fp output the DQN +# regression suite depends on bit-for-bit) override back to 1 to preserve the +# exact optimization decisions LLVM makes today. +# +# DO NOT remove an override without running the numerical regression suite. +[profile.release.package."*"] +codegen-units = 16 + +# Workspace numerical crates — must keep CGU=1 for bit-exact reproducibility +[profile.release.package.ml] +codegen-units = 1 +[profile.release.package.ml-core] +codegen-units = 1 +[profile.release.package.ml-dqn] +codegen-units = 1 +[profile.release.package.ml-ppo] +codegen-units = 1 +[profile.release.package.ml-supervised] +codegen-units = 1 +[profile.release.package.ml-ensemble] +codegen-units = 1 +[profile.release.package.ml-features] +codegen-units = 1 +[profile.release.package.ml-labeling] +codegen-units = 1 +[profile.release.package.ml-explainability] +codegen-units = 1 +[profile.release.package.ml-hyperopt] +codegen-units = 1 +[profile.release.package.ml-checkpoint] +codegen-units = 1 +[profile.release.package.ml-data] +codegen-units = 1 +[profile.release.package.ml-data-validation] +codegen-units = 1 +[profile.release.package.ml-validation] +codegen-units = 1 +[profile.release.package.ml-asset-selection] +codegen-units = 1 +[profile.release.package.ml-backtesting] +codegen-units = 1 +[profile.release.package.ml-regime] +codegen-units = 1 +[profile.release.package.ml-regime-detection] +codegen-units = 1 +[profile.release.package.ml-risk] +codegen-units = 1 +[profile.release.package.ml-stress-testing] +codegen-units = 1 +[profile.release.package.ml-universe] +codegen-units = 1 +[profile.release.package.ml-paper-trading] +codegen-units = 1 +[profile.release.package.ml-observability] +codegen-units = 1 +[profile.release.package.ml-security] +codegen-units = 1 +[profile.release.package.model_loader] +codegen-units = 1 +[profile.release.package.training_uploader] +codegen-units = 1 +[profile.release.package.risk] +codegen-units = 1 +[profile.release.package.trading_engine] +codegen-units = 1 + +# External numerical/statistical crates +[profile.release.package.ndarray] +codegen-units = 1 +[profile.release.package.nalgebra] +codegen-units = 1 +[profile.release.package.simba] +codegen-units = 1 +[profile.release.package.num-traits] +codegen-units = 1 +[profile.release.package.num-complex] +codegen-units = 1 +[profile.release.package.libm] +codegen-units = 1 +[profile.release.package.statrs] +codegen-units = 1 +[profile.release.package.rand_distr] +codegen-units = 1 +[profile.release.package.rust_decimal] +codegen-units = 1 +[profile.release.package.ordered-float] +codegen-units = 1 +[profile.release.package.cudarc] +codegen-units = 1 + [dev-dependencies] anyhow.workspace = true chrono.workspace = true diff --git a/crates/data/Cargo.toml b/crates/data/Cargo.toml index c0f79d06e..d99fb28be 100644 --- a/crates/data/Cargo.toml +++ b/crates/data/Cargo.toml @@ -96,8 +96,8 @@ arrow.workspace = true dashmap.workspace = true parking_lot.workspace = true -# Rate limiting and caching -governor = "0.6" +# Rate limiting and caching (governor 0.10 dedupes dashmap to v6) +governor = "0.10" nonzero = "0.2" redis = { workspace = true, optional = true } diff --git a/services/api/Cargo.toml b/services/api/Cargo.toml index 5d793d69b..9d6f713bf 100644 --- a/services/api/Cargo.toml +++ b/services/api/Cargo.toml @@ -16,7 +16,6 @@ path = "src/main.rs" tokio = { workspace = true, features = ["sync", "time"] } anyhow.workspace = true tracing.workspace = true -tracing-subscriber.workspace = true serde.workspace = true serde_json.workspace = true once_cell.workspace = true @@ -24,40 +23,31 @@ clap.workspace = true # gRPC and networking (Tonic 0.14) tonic = { workspace = true, features = ["transport", "server", "tls-ring", "tls-webpki-roots"] } +# Used by generated proto code: tonic_prost::ProstCodec tonic-prost.workspace = true tonic-reflection.workspace = true tonic-health.workspace = true +# Used by generated proto code: ::prost::Message derive prost.workspace = true tower = { workspace = true, features = ["util"] } -tower-layer.workspace = true -tower-service.workspace = true -hyper.workspace = true -http-body.workspace = true http-body-util.workspace = true -hyper-util.workspace = true -bytes.workspace = true # Async streams and futures -tokio-stream.workspace = true async-stream.workspace = true futures.workspace = true -async-trait.workspace = true # Performance monitoring -hdrhistogram.workspace = true prometheus = { workspace = true, features = ["process"] } # Cryptography and security sha2.workspace = true x509-parser = { version = "0.16", features = ["verify"] } -reqwest = { version = "0.12", features = ["rustls-tls"], default-features = false } +reqwest = { version = "0.12", features = ["rustls-tls", "json"], default-features = false } base64.workspace = true jsonwebtoken.workspace = true chrono.workspace = true ocsp = "0.4" lru = "0.12" -hex = "0.4" -const-oid = "0.9" # MFA/TOTP dependencies (optional, enabled by default via "mfa" feature) totp-rs = { version = "5.6", optional = true } @@ -68,18 +58,14 @@ hmac = { version = "0.12", optional = true } sha1 = "0.10" urlencoding = { version = "2.1", optional = true } secrecy = { version = "0.8", features = ["serde"] } -zeroize.workspace = true thiserror.workspace = true uuid.workspace = true sqlx = { workspace = true, features = ["postgres", "chrono", "uuid", "json", "macros"] } -num-traits.workspace = true -rust_decimal.workspace = true rand.workspace = true # Internal workspace crates -trading_engine.workspace = true common = { workspace = true, features = ["database"] } config = { workspace = true, features = ["postgres"] } @@ -90,9 +76,9 @@ redis = { workspace = true, features = ["tokio-comp", "connection-manager"] } kube = { version = "3.0", features = ["client", "runtime", "derive"] } k8s-openapi = { version = "0.27", features = ["latest"] } -# Rate limiting -governor = "0.6" -dashmap = "6.0" +# Rate limiting (governor 0.10 dedupes dashmap to v6) +governor = "0.10" +dashmap = { workspace = true } # HTTP and networking http = "1.1" @@ -106,8 +92,8 @@ regex = "1.11" # TLS crypto provider for kube-rs in-cluster client rustls = { version = "0.23", default-features = false, features = ["ring"] } -# HTTP server for Prometheus metrics endpoint -axum = "0.7" +# HTTP server for Prometheus metrics endpoint (workspace pinned to 0.8 to dedupe with tonic) +axum.workspace = true # gRPC-Web support for browser access tonic-web = "0.13"