1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
[]
= "digdigdig3"
= true
= true
= true
= true
= true
= true
= true
= "Unified async Rust API for 47 exchange connectors (REST + WebSocket). The core layer — pure ExchangeHub + connectors. Higher-level builder, persistence, replay, OB tracker live in `digdigdig3-station`."
= "https://docs.rs/digdigdig3"
= "../../README.md"
= [
# Internal research / workflow / audit notes — never ship to crates.io
"**/research/**",
"contributing/**",
"**/AUDIT*.md",
"**/ARCHITECTURE_AUDIT.md",
"**/IMPLEMENTATION*.md",
"**/FIX_SUMMARY.md",
"**/PROBLEM_ANALYSIS.md",
"**/API_TESTING_REPORT.md",
"**/AUTHENTICATION_SETUP.md",
"**/CRYPTO_NO_AUTH.md",
"**/QUICK_START.md",
"**/integration_test_guide.md",
# Local harness artefacts — already gitignored, defence in depth
"e2e_smoke_*.txt", "deep_smoke_*.txt", "smoke_*.txt", "*.log",
"e2e_trace*/", "liq_capture/", "liq_trace_new/",
"dig3_storage/", "target/",
]
[]
= "digdigdig3"
= "src/lib.rs"
[]
= ["onchain-evm"]
= []
# Canonical on-chain feature flags
# onchain-evm: EIP-712 signing via k256+sha3 (HyperLiquid auth)
= ["dep:k256", "dep:sha3"]
= ["dep:cosmrs"]
= ["dep:starknet-crypto"]
# Backward-compat alias — onchain-ethereum is now onchain-evm
= ["onchain-evm"]
= ["dep:tonic", "dep:prost"]
= ["dep:k256", "dep:sha3"]
# Legacy alias — starknet feature now maps to onchain-starknet
= ["onchain-starknet"]
# ─── Shared dependencies (compile on BOTH targets) ────────────────────────────
[]
# The pure-data core (market-data + trading types, stream descriptors, symbol
# normalizer) split out so light consumers don't compile the connectors. The
# `core::types` / `core::websocket::{stream_kind,…}` / `core::utils::symbol_normalizer`
# modules are re-exported from here under their ORIGINAL paths (see src/core/*).
= { = true }
# Serialization
= { = "1.0", = ["derive"] }
= "1.0"
# Async foundations (target-split below for tokio itself)
= "0.1"
= "0.3"
# HTTP — reqwest 0.12 targets wasm32 automatically via its own cfg; it uses
# browser fetch underneath on wasm32 so NO TLS feature is wanted there.
# We declare it here without any tls feature and add tls features only on
# the native target block below.
= { = "0.12", = ["json"], = false }
# Error handling
= "1.0"
# Logging
= "0.1"
# Crypto (HMAC signatures — pure-Rust, compile on both targets)
= "0.12"
= "0.10"
= "0.4"
= "0.22"
# Time (OKX ISO timestamps — pure-Rust, compile on both targets)
# "now" enables Utc::now(); "wasmbind" is added in wasm block for the wasm impl.
= { = "0.4", = false, = ["std", "now", "clock"] }
# Binary parsing (Dhan WebSocket binary format)
= "1.5"
# UUID generation (client order IDs) — getrandom js feature needed on wasm
= { = "1.0", = ["v4"] }
# Compression (BingX, HTX, Dukascopy)
= "1.0"
= "0.3"
# URL encoding (HTX auth, Polygon)
= "2.5"
= "2.1"
= "2.3"
# Base58 (Raydium pubkey parsing)
= "0.5"
= "0.3.22"
# TOTP (Angel One 2FA)
= "5.6"
# Concurrent hashmap (ConnectorPool)
= "5.5"
# Decimal arithmetic
= "1"
# TOML config
= "0.8"
# Cryptographic signing (feature-gated — native-only libs gated via features)
= { = "0.13", = ["ecdsa-core", "ecdsa"], = true }
= { = "0.10", = true }
= { = "0.6", = true }
# Cosmos SDK (native-only via optional + cfg gate on dep site)
= { = "0.22", = true, = false, = ["bip32"] }
# gRPC (native-only via optional)
= { = "0.12", = ["tls", "tls-native-roots"], = true }
= { = "0.13", = true }
# ─── Native-only dependencies ─────────────────────────────────────────────────
# Everything that requires std::net, native TLS, or tokio I/O goes here.
[]
# Full tokio runtime for native
= { = "1.0", = ["full"] }
# tokio-tungstenite: native WS. NOT available on wasm32.
= { = "0.24", = ["rustls-tls-webpki-roots"] }
# tokio-stream: used for stream combinators in transport.rs
= { = "0.1", = ["sync"] }
# Explicit rustls dep to pin ring as process-level CryptoProvider.
= { = "0.23", = false, = ["ring"] }
# reqwest native TLS features — only valid when not wasm
# (rustls-tls cannot compile to wasm32-unknown-unknown)
= { = "0.12", = ["rustls-tls"], = false }
# JWT + ECDSA signing (Coinbase auth, Angel One TOTP) — trading is native-only.
# ring requires native assembly (clang), cannot compile to wasm32.
= "9.3"
= "0.17"
= "0.8"
# ─── wasm32-only dependencies ─────────────────────────────────────────────────
[]
# Tokio sync-only: broadcast, mpsc, oneshot, Mutex, RwLock compile on wasm.
# Do NOT enable "full", "net", "time", "io-util" — they pull in mio which
# does not compile for wasm32-unknown-unknown.
# We use sync + macros only. rt is NOT enabled because we delegate to
# wasm_bindgen_futures::spawn_local for task spawning.
= { = "1.0", = false, = ["sync", "macros", "time"] }
# tokio-stream: sync feature is wasm-compatible (no I/O)
= { = "0.1", = false, = ["sync"] }
# wasm-bindgen core
= "0.2"
= "0.4"
= "0.3"
# gloo-timers: replaces tokio::time::sleep / interval on wasm.
# The "futures" feature pulls in futures-core + futures-channel (pure Rust).
= { = "0.3", = ["futures"] }
# gloo-net: provides WebSocket API wrapping web_sys, used by WasmWsConn actor.
# Alternative to tokio-tungstenite on the browser side.
= { = "0.6", = ["websocket"] }
# futures-channel: mpsc + oneshot channels inside JS closures (which are sync,
# not async). Explicitly declared even though gloo-timers pulls it transitively,
# so our direct use of `futures_channel::mpsc::unbounded` + `oneshot::channel`
# in rt/wasm.rs does not depend on a transitive dep only.
= "0.3"
# web-sys: low-level browser API bindings.
= { = "0.3", = [
"WebSocket",
"MessageEvent",
"BinaryType",
"CloseEvent",
"ErrorEvent",
"Window",
"Performance",
"Blob",
"FileReader",
] }
# getrandom js feature — required for uuid v4 on wasm32-unknown-unknown.
# Without this getrandom panics at runtime ("unsupported platform").
= { = "0.2", = ["js"] }
# uuid js feature — uuid 1.22+ requires this explicitly on wasm32-unknown-unknown
# in addition to getrandom/js. Cargo merges features from both dependency declarations.
= { = "1.0", = ["v4", "js"] }
# chrono wasmbind + now — enables Utc::now() on wasm32 via JS Date.now().
# "now" enables the Utc::now() method; "wasmbind" provides the wasm32 impl
# via js_sys::Date. Without both, chrono::Utc::now() is a compile-time error.
= { = "0.4", = false, = ["std", "now", "wasmbind"] }
# Monotonic clock drop-in for wasm32. std::time::Instant panics at runtime on
# wasm32-unknown-unknown; this crate re-exports a wasm-compatible Instant backed
# by js_sys::Date::now(). Used via crate::core::rt::clock::Instant.
= { = "0.1", = ["wasm-bindgen"] }
# ─── Dev dependencies ─────────────────────────────────────────────────────────
[]
= "0.4"
[]
= "0.3"