bandkit 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +222 -77
  2. package/dist/BandPanel.d.ts.map +1 -1
  3. package/dist/BandPanel.js +23 -2
  4. package/dist/BandPanel.js.map +1 -1
  5. package/dist/BotDecisionPanel.d.ts +7 -0
  6. package/dist/BotDecisionPanel.d.ts.map +1 -0
  7. package/dist/BotDecisionPanel.js +124 -0
  8. package/dist/BotDecisionPanel.js.map +1 -0
  9. package/dist/ContractEventFeed.d.ts +7 -0
  10. package/dist/ContractEventFeed.d.ts.map +1 -0
  11. package/dist/ContractEventFeed.js +76 -0
  12. package/dist/ContractEventFeed.js.map +1 -0
  13. package/dist/GasBadge.d.ts +6 -0
  14. package/dist/GasBadge.d.ts.map +1 -0
  15. package/dist/GasBadge.js +37 -0
  16. package/dist/GasBadge.js.map +1 -0
  17. package/dist/OrderBookWidget.d.ts +8 -0
  18. package/dist/OrderBookWidget.d.ts.map +1 -0
  19. package/dist/OrderBookWidget.js +92 -0
  20. package/dist/OrderBookWidget.js.map +1 -0
  21. package/dist/RegimeBadge.d.ts +6 -0
  22. package/dist/RegimeBadge.d.ts.map +1 -0
  23. package/dist/RegimeBadge.js +39 -0
  24. package/dist/RegimeBadge.js.map +1 -0
  25. package/dist/TradeTape.d.ts +8 -0
  26. package/dist/TradeTape.d.ts.map +1 -0
  27. package/dist/TradeTape.js +67 -0
  28. package/dist/TradeTape.js.map +1 -0
  29. package/dist/decisionEngine.d.ts +41 -0
  30. package/dist/decisionEngine.d.ts.map +1 -0
  31. package/dist/decisionEngine.js +166 -0
  32. package/dist/decisionEngine.js.map +1 -0
  33. package/dist/index.d.ts +14 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +18 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/useBinanceOrderBook.d.ts +27 -0
  38. package/dist/useBinanceOrderBook.d.ts.map +1 -0
  39. package/dist/useBinanceOrderBook.js +95 -0
  40. package/dist/useBinanceOrderBook.js.map +1 -0
  41. package/dist/useBinanceTrades.d.ts +23 -0
  42. package/dist/useBinanceTrades.d.ts.map +1 -0
  43. package/dist/useBinanceTrades.js +77 -0
  44. package/dist/useBinanceTrades.js.map +1 -0
  45. package/dist/useBotDecision.d.ts +32 -0
  46. package/dist/useBotDecision.d.ts.map +1 -0
  47. package/dist/useBotDecision.js +104 -0
  48. package/dist/useBotDecision.js.map +1 -0
  49. package/dist/useCoinbaseTicker.d.ts +28 -0
  50. package/dist/useCoinbaseTicker.d.ts.map +1 -0
  51. package/dist/useCoinbaseTicker.js +87 -0
  52. package/dist/useCoinbaseTicker.js.map +1 -0
  53. package/dist/useGasPrice.d.ts +18 -0
  54. package/dist/useGasPrice.d.ts.map +1 -0
  55. package/dist/useGasPrice.js +44 -0
  56. package/dist/useGasPrice.js.map +1 -0
  57. package/dist/useStrategyContractEvents.d.ts +23 -0
  58. package/dist/useStrategyContractEvents.d.ts.map +1 -0
  59. package/dist/useStrategyContractEvents.js +79 -0
  60. package/dist/useStrategyContractEvents.js.map +1 -0
  61. package/dist/useVolatilityRegime.d.ts +17 -0
  62. package/dist/useVolatilityRegime.d.ts.map +1 -0
  63. package/dist/useVolatilityRegime.js +48 -0
  64. package/dist/useVolatilityRegime.js.map +1 -0
  65. package/package.json +4 -2
  66. package/scripts/test-decision-stream.cjs +417 -0
@@ -0,0 +1,166 @@
1
+ export const DEFAULT_DECISION_THRESHOLDS = {
2
+ imbalanceThreshold: 0.15,
3
+ flowThreshold: 0.1,
4
+ spreadWidePct: 0.05,
5
+ divergenceBps: 5,
6
+ minDepthEth: 50
7
+ };
8
+ export function computeBotDecision(inputs, thresholds = DEFAULT_DECISION_THRESHOLDS) {
9
+ const reasons = [];
10
+ // Regime gate
11
+ if (inputs.regime === "UNKNOWN") {
12
+ return {
13
+ decision: "WAIT",
14
+ confidence: 0,
15
+ reasons: [{ text: "Volatility classifier still warming up", tone: "neutral" }]
16
+ };
17
+ }
18
+ if (inputs.regime === "TRENDING") {
19
+ return {
20
+ decision: "STAND DOWN",
21
+ confidence: 90,
22
+ reasons: [
23
+ { text: "Regime: TRENDING — range bot sits out", tone: "bad" },
24
+ { text: "Re-engages when price stabilises in a range", tone: "neutral" }
25
+ ]
26
+ };
27
+ }
28
+ let scoreBuy = 0;
29
+ let scoreSell = 0;
30
+ let confidence = inputs.regime === "RANGING" ? 45 : 30;
31
+ if (inputs.regime === "RANGING") {
32
+ reasons.push({ text: "Regime: RANGING (favourable)", tone: "good" });
33
+ }
34
+ else {
35
+ reasons.push({ text: "Regime: MIXED", tone: "neutral" });
36
+ }
37
+ // Book imbalance
38
+ if (inputs.bookImbalance >= thresholds.imbalanceThreshold) {
39
+ const pct = inputs.bookImbalance * 100;
40
+ scoreBuy += 25;
41
+ reasons.push({ text: `Book imbalance +${pct.toFixed(0)}% bid-heavy`, tone: "good" });
42
+ }
43
+ else if (inputs.bookImbalance <= -thresholds.imbalanceThreshold) {
44
+ const pct = inputs.bookImbalance * 100;
45
+ scoreSell += 25;
46
+ reasons.push({ text: `Book imbalance ${pct.toFixed(0)}% ask-heavy`, tone: "good" });
47
+ }
48
+ else {
49
+ reasons.push({
50
+ text: `Book imbalance balanced (${(inputs.bookImbalance * 100).toFixed(0)}%)`,
51
+ tone: "neutral"
52
+ });
53
+ }
54
+ // Trade flow (last 60s)
55
+ if (inputs.tradeImbalance >= thresholds.flowThreshold) {
56
+ const buyPct = (0.5 + inputs.tradeImbalance / 2) * 100;
57
+ scoreBuy += 20;
58
+ reasons.push({ text: `Recent flow ${buyPct.toFixed(0)}% buys`, tone: "good" });
59
+ }
60
+ else if (inputs.tradeImbalance <= -thresholds.flowThreshold) {
61
+ const sellPct = (0.5 - inputs.tradeImbalance / 2) * 100;
62
+ scoreSell += 20;
63
+ reasons.push({ text: `Recent flow ${sellPct.toFixed(0)}% sells`, tone: "good" });
64
+ }
65
+ else {
66
+ reasons.push({ text: "Recent flow balanced", tone: "neutral" });
67
+ }
68
+ // Spread
69
+ if (inputs.spreadPct > thresholds.spreadWidePct) {
70
+ confidence -= 10;
71
+ reasons.push({ text: `Spread wide (${inputs.spreadPct.toFixed(3)}%)`, tone: "bad" });
72
+ }
73
+ else {
74
+ confidence += 5;
75
+ reasons.push({ text: `Spread tight (${inputs.spreadPct.toFixed(3)}%)`, tone: "good" });
76
+ }
77
+ // Cross-venue divergence
78
+ if (inputs.venueDivergenceBps !== null && Number.isFinite(inputs.venueDivergenceBps)) {
79
+ if (inputs.venueDivergenceBps > thresholds.divergenceBps) {
80
+ scoreBuy += 12;
81
+ reasons.push({
82
+ text: `Binance leading +${inputs.venueDivergenceBps.toFixed(1)} bps vs Coinbase`,
83
+ tone: "good"
84
+ });
85
+ }
86
+ else if (inputs.venueDivergenceBps < -thresholds.divergenceBps) {
87
+ scoreSell += 12;
88
+ reasons.push({
89
+ text: `Binance lagging ${inputs.venueDivergenceBps.toFixed(1)} bps vs Coinbase`,
90
+ tone: "good"
91
+ });
92
+ }
93
+ else {
94
+ reasons.push({
95
+ text: `Venue divergence ${inputs.venueDivergenceBps.toFixed(1)} bps (aligned)`,
96
+ tone: "neutral"
97
+ });
98
+ }
99
+ }
100
+ // Depth check
101
+ if (inputs.bookDepthWithinHalfPctEth < thresholds.minDepthEth) {
102
+ confidence -= 15;
103
+ reasons.push({
104
+ text: `Thin book — ${inputs.bookDepthWithinHalfPctEth.toFixed(0)} ETH within ±0.5%`,
105
+ tone: "bad"
106
+ });
107
+ }
108
+ else {
109
+ confidence += 5;
110
+ reasons.push({
111
+ text: `Book depth healthy (${inputs.bookDepthWithinHalfPctEth.toFixed(0)} ETH within ±0.5%)`,
112
+ tone: "good"
113
+ });
114
+ }
115
+ let decision;
116
+ let finalConfidence = confidence;
117
+ if (scoreBuy > scoreSell + 12) {
118
+ decision = "BUY";
119
+ finalConfidence = Math.min(100, Math.max(0, confidence + scoreBuy));
120
+ }
121
+ else if (scoreSell > scoreBuy + 12) {
122
+ decision = "SELL";
123
+ finalConfidence = Math.min(100, Math.max(0, confidence + scoreSell));
124
+ }
125
+ else {
126
+ decision = "WAIT";
127
+ finalConfidence = Math.min(100, Math.max(0, confidence + Math.max(scoreBuy, scoreSell) / 2));
128
+ reasons.push({ text: "Signals mixed — no clear direction", tone: "neutral" });
129
+ }
130
+ return { decision, confidence: finalConfidence, reasons };
131
+ }
132
+ export function computeBookImbalance(bids, asks, midPrice, withinPct = 0.005) {
133
+ const lowerBound = midPrice * (1 - withinPct);
134
+ const upperBound = midPrice * (1 + withinPct);
135
+ const bidSize = bids.filter((b) => b.price >= lowerBound).reduce((sum, b) => sum + b.size, 0);
136
+ const askSize = asks.filter((a) => a.price <= upperBound).reduce((sum, a) => sum + a.size, 0);
137
+ const total = bidSize + askSize;
138
+ if (total <= 0)
139
+ return 0;
140
+ return (bidSize - askSize) / total;
141
+ }
142
+ export function computeBookDepth(bids, asks, midPrice, withinPct = 0.005) {
143
+ const lowerBound = midPrice * (1 - withinPct);
144
+ const upperBound = midPrice * (1 + withinPct);
145
+ const bidSize = bids.filter((b) => b.price >= lowerBound).reduce((sum, b) => sum + b.size, 0);
146
+ const askSize = asks.filter((a) => a.price <= upperBound).reduce((sum, a) => sum + a.size, 0);
147
+ return bidSize + askSize;
148
+ }
149
+ export function computeTradeImbalance(trades, windowMs = 60_000, nowMs = Date.now()) {
150
+ const cutoff = nowMs - windowMs;
151
+ let buyVolume = 0;
152
+ let sellVolume = 0;
153
+ for (const t of trades) {
154
+ if (t.timestamp < cutoff)
155
+ continue;
156
+ if (t.side === "buy")
157
+ buyVolume += t.size;
158
+ else
159
+ sellVolume += t.size;
160
+ }
161
+ const total = buyVolume + sellVolume;
162
+ if (total <= 0)
163
+ return 0;
164
+ return (buyVolume - sellVolume) / total;
165
+ }
166
+ //# sourceMappingURL=decisionEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decisionEngine.js","sourceRoot":"","sources":["../src/decisionEngine.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -11,6 +11,20 @@ export { approveUniswapV2RoundTripToken, previewUniswapV2RoundTrip, type Ethereu
11
11
  export { useEthPriceTicker, type BinanceMiniTickerMessage, type EthPriceTickerStatus, type UseEthPriceTickerOptions, type UseEthPriceTickerResult } from "./useEthPriceTicker.js";
12
12
  export { useStrategyContract, type StrategyContractAction, type UseStrategyContractOptions, type UseStrategyContractResult } from "./useStrategyContract.js";
13
13
  export { useWalletEthBalance, type UseWalletEthBalanceOptions, type UseWalletEthBalanceResult } from "./useWalletEthBalance.js";
14
+ export { useBinanceOrderBook, type OrderBookLevel, type OrderBookSnapshot, type OrderBookStatus, type UseBinanceOrderBookOptions, type UseBinanceOrderBookResult } from "./useBinanceOrderBook.js";
15
+ export { OrderBookWidget, type OrderBookWidgetProps } from "./OrderBookWidget.js";
16
+ export { useBinanceTrades, type Trade, type TradeSide, type TradesStatus, type UseBinanceTradesOptions, type UseBinanceTradesResult } from "./useBinanceTrades.js";
17
+ export { TradeTape, type TradeTapeProps } from "./TradeTape.js";
18
+ export { useStrategyContractEvents, type StrategyEvent, type StrategyEventKind, type UseStrategyContractEventsOptions, type UseStrategyContractEventsResult } from "./useStrategyContractEvents.js";
19
+ export { ContractEventFeed, type ContractEventFeedProps } from "./ContractEventFeed.js";
20
+ export { useVolatilityRegime, type Regime, type UseVolatilityRegimeOptions, type UseVolatilityRegimeResult } from "./useVolatilityRegime.js";
21
+ export { RegimeBadge, type RegimeBadgeProps } from "./RegimeBadge.js";
22
+ export { useGasPrice, type GasTier, type UseGasPriceOptions, type UseGasPriceResult } from "./useGasPrice.js";
23
+ export { GasBadge, type GasBadgeProps } from "./GasBadge.js";
24
+ export { useCoinbaseTicker, type CoinbaseTickerStatus, type CoinbaseTickerMessage, type UseCoinbaseTickerOptions, type UseCoinbaseTickerResult } from "./useCoinbaseTicker.js";
25
+ export { useBotDecision, type BotDecision, type DecisionResult, type DecisionThresholds, type DecisionHistoryEntry, type UseBotDecisionOptions, type UseBotDecisionResult } from "./useBotDecision.js";
26
+ export { computeBotDecision, computeBookImbalance, computeBookDepth, computeTradeImbalance, DEFAULT_DECISION_THRESHOLDS, type DecisionInputs, type DecisionReason, type BookLevel } from "./decisionEngine.js";
27
+ export { BotDecisionPanel, type BotDecisionPanelProps } from "./BotDecisionPanel.js";
14
28
  /** @deprecated Use BAND_STRATEGY_ABI. Will be removed in v1.0. */
15
29
  export { BAND_STRATEGY_ABI as ETH_BOT_VAULT_ABI } from "./bandStrategyAbi.js";
16
30
  /** @deprecated Use BAND_STRATEGY_BYTECODE. Will be removed in v1.0. */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAE,KAAK,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AACvF,OAAO,EACL,iCAAiC,EACjC,6BAA6B,EAC7B,KAAK,oCAAoC,EACzC,KAAK,mCAAmC,EACzC,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACvF,OAAO,EACL,8BAA8B,EAC9B,yBAAyB,EACzB,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC/B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,iBAAiB,EACjB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC7B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,mBAAmB,EACnB,KAAK,sBAAsB,EAC3B,KAAK,0BAA0B,EAC/B,KAAK,yBAAyB,EAC/B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,mBAAmB,EAAE,KAAK,0BAA0B,EAAE,KAAK,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAEhI,kEAAkE;AAClE,OAAO,EAAE,iBAAiB,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,uEAAuE;AACvE,OAAO,EAAE,sBAAsB,IAAI,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAC7F,kEAAkE;AAClE,OAAO,EAAE,iBAAiB,IAAI,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACnF,uEAAuE;AACvE,OAAO,EAAE,sBAAsB,IAAI,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAClG,0DAA0D;AAC1D,OAAO,EAAE,SAAS,IAAI,WAAW,EAAE,KAAK,cAAc,IAAI,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACnG,kEAAkE;AAClE,OAAO,EAAE,iBAAiB,IAAI,aAAa,EAAE,KAAK,sBAAsB,IAAI,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC/H,oEAAoE;AACpE,OAAO,EAAE,mBAAmB,IAAI,4BAA4B,EAAE,KAAK,0BAA0B,IAAI,mCAAmC,EAAE,MAAM,iBAAiB,CAAC;AAC9J,kFAAkF;AAClF,OAAO,EAAE,iCAAiC,IAAI,iCAAiC,EAAE,MAAM,oCAAoC,CAAC;AAC5H,8EAA8E;AAC9E,OAAO,EACL,6BAA6B,IAAI,wBAAwB,EACzD,KAAK,oCAAoC,IAAI,+BAA+B,EAC5E,KAAK,mCAAmC,IAAI,8BAA8B,EAC3E,MAAM,oCAAoC,CAAC;AAC5C,iEAAiE;AACjE,OAAO,EAAE,gBAAgB,IAAI,kBAAkB,EAAE,KAAK,uBAAuB,IAAI,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAC1I,oEAAoE;AACpE,OAAO,EACL,mBAAmB,IAAI,WAAW,EAClC,KAAK,sBAAsB,IAAI,cAAc,EAC7C,KAAK,0BAA0B,IAAI,kBAAkB,EACrD,KAAK,yBAAyB,IAAI,iBAAiB,EACpD,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -11,6 +11,24 @@ export { approveUniswapV2RoundTripToken, previewUniswapV2RoundTrip } from "./tra
11
11
  export { useEthPriceTicker } from "./useEthPriceTicker.js";
12
12
  export { useStrategyContract } from "./useStrategyContract.js";
13
13
  export { useWalletEthBalance } from "./useWalletEthBalance.js";
14
+ // --- Market widgets ------------------------------------------------------
15
+ export { useBinanceOrderBook } from "./useBinanceOrderBook.js";
16
+ export { OrderBookWidget } from "./OrderBookWidget.js";
17
+ export { useBinanceTrades } from "./useBinanceTrades.js";
18
+ export { TradeTape } from "./TradeTape.js";
19
+ // --- On-chain event feed -------------------------------------------------
20
+ export { useStrategyContractEvents } from "./useStrategyContractEvents.js";
21
+ export { ContractEventFeed } from "./ContractEventFeed.js";
22
+ // --- Market context badges -----------------------------------------------
23
+ export { useVolatilityRegime } from "./useVolatilityRegime.js";
24
+ export { RegimeBadge } from "./RegimeBadge.js";
25
+ export { useGasPrice } from "./useGasPrice.js";
26
+ export { GasBadge } from "./GasBadge.js";
27
+ // --- Cross-venue + decision proxy ---------------------------------------
28
+ export { useCoinbaseTicker } from "./useCoinbaseTicker.js";
29
+ export { useBotDecision } from "./useBotDecision.js";
30
+ export { computeBotDecision, computeBookImbalance, computeBookDepth, computeTradeImbalance, DEFAULT_DECISION_THRESHOLDS } from "./decisionEngine.js";
31
+ export { BotDecisionPanel } from "./BotDecisionPanel.js";
14
32
  /** @deprecated Use BAND_STRATEGY_ABI. Will be removed in v1.0. */
15
33
  export { BAND_STRATEGY_ABI as ETH_BOT_VAULT_ABI } from "./bandStrategyAbi.js";
16
34
  /** @deprecated Use BAND_STRATEGY_BYTECODE. Will be removed in v1.0. */
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,SAAS,EAAuB,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAA+B,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAmC,MAAM,iBAAiB,CAAC;AACvF,OAAO,EACL,iCAAiC,EACjC,6BAA6B,EAG9B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAgC,MAAM,uBAAuB,CAAC;AACvF,OAAO,EACL,8BAA8B,EAC9B,yBAAyB,EAI1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,iBAAiB,EAKlB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,mBAAmB,EAIpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,mBAAmB,EAAmE,MAAM,0BAA0B,CAAC;AAEhI,kEAAkE;AAClE,OAAO,EAAE,iBAAiB,IAAI,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,uEAAuE;AACvE,OAAO,EAAE,sBAAsB,IAAI,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAC7F,kEAAkE;AAClE,OAAO,EAAE,iBAAiB,IAAI,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACnF,uEAAuE;AACvE,OAAO,EAAE,sBAAsB,IAAI,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAClG,0DAA0D;AAC1D,OAAO,EAAE,SAAS,IAAI,WAAW,EAA2C,MAAM,gBAAgB,CAAC;AACnG,kEAAkE;AAClE,OAAO,EAAE,iBAAiB,IAAI,aAAa,EAAqD,MAAM,wBAAwB,CAAC;AAC/H,oEAAoE;AACpE,OAAO,EAAE,mBAAmB,IAAI,4BAA4B,EAA0E,MAAM,iBAAiB,CAAC;AAC9J,kFAAkF;AAClF,OAAO,EAAE,iCAAiC,IAAI,iCAAiC,EAAE,MAAM,oCAAoC,CAAC;AAC5H,8EAA8E;AAC9E,OAAO,EACL,6BAA6B,IAAI,wBAAwB,EAG1D,MAAM,oCAAoC,CAAC;AAC5C,iEAAiE;AACjE,OAAO,EAAE,gBAAgB,IAAI,kBAAkB,EAA6D,MAAM,uBAAuB,CAAC;AAC1I,oEAAoE;AACpE,OAAO,EACL,mBAAmB,IAAI,WAAW,EAInC,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export type OrderBookLevel = {
2
+ price: number;
3
+ size: number;
4
+ total: number;
5
+ };
6
+ export type OrderBookSnapshot = {
7
+ bids: OrderBookLevel[];
8
+ asks: OrderBookLevel[];
9
+ spread: number | null;
10
+ spreadPercent: number | null;
11
+ midPrice: number | null;
12
+ };
13
+ export type OrderBookStatus = "connecting" | "live" | "stale" | "error";
14
+ export type UseBinanceOrderBookOptions = {
15
+ enabled?: boolean;
16
+ symbol?: string;
17
+ depth?: 5 | 10 | 20;
18
+ reconnectDelayMs?: number;
19
+ };
20
+ export type UseBinanceOrderBookResult = OrderBookSnapshot & {
21
+ status: OrderBookStatus;
22
+ error?: string;
23
+ symbol: string;
24
+ updatedAt?: Date;
25
+ };
26
+ export declare function useBinanceOrderBook(options?: UseBinanceOrderBookOptions): UseBinanceOrderBookResult;
27
+ //# sourceMappingURL=useBinanceOrderBook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBinanceOrderBook.d.ts","sourceRoot":"","sources":["../src/useBinanceOrderBook.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAExE,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,iBAAiB,GAAG;IAC1D,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB,CAAC;AAoBF,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,0BAA+B,GAAG,yBAAyB,CA4FvG"}
@@ -0,0 +1,95 @@
1
+ import { useEffect, useMemo, useState } from "react";
2
+ function buildLevels(raw) {
3
+ let running = 0;
4
+ return raw
5
+ .map(([priceStr, sizeStr]) => {
6
+ const price = Number(priceStr);
7
+ const size = Number(sizeStr);
8
+ running += size;
9
+ return { price, size, total: running };
10
+ })
11
+ .filter((level) => Number.isFinite(level.price) && Number.isFinite(level.size) && level.size > 0);
12
+ }
13
+ export function useBinanceOrderBook(options = {}) {
14
+ const enabled = options.enabled ?? true;
15
+ const symbol = (options.symbol ?? "ethusdt").toLowerCase();
16
+ const depth = options.depth ?? 20;
17
+ const reconnectDelayMs = options.reconnectDelayMs ?? 3000;
18
+ const streamUrl = `wss://stream.binance.com:9443/ws/${symbol}@depth${depth}@100ms`;
19
+ const [message, setMessage] = useState();
20
+ const [status, setStatus] = useState("connecting");
21
+ const [error, setError] = useState();
22
+ const [updatedAt, setUpdatedAt] = useState();
23
+ useEffect(() => {
24
+ if (!enabled) {
25
+ setStatus("stale");
26
+ return;
27
+ }
28
+ if (typeof WebSocket === "undefined") {
29
+ setStatus("error");
30
+ setError("WebSocket is not available in this runtime.");
31
+ return;
32
+ }
33
+ let reconnectTimer;
34
+ let closedByHook = false;
35
+ let socket;
36
+ function connect() {
37
+ setStatus("connecting");
38
+ socket = new WebSocket(streamUrl);
39
+ socket.onopen = () => {
40
+ setStatus("live");
41
+ setError(undefined);
42
+ };
43
+ socket.onmessage = (event) => {
44
+ try {
45
+ const parsed = JSON.parse(String(event.data));
46
+ setMessage(parsed);
47
+ setStatus("live");
48
+ setUpdatedAt(new Date());
49
+ }
50
+ catch {
51
+ setStatus("error");
52
+ setError("Could not parse order book message.");
53
+ }
54
+ };
55
+ socket.onerror = () => {
56
+ setStatus("error");
57
+ setError("Order book connection failed.");
58
+ };
59
+ socket.onclose = () => {
60
+ if (closedByHook)
61
+ return;
62
+ setStatus("stale");
63
+ reconnectTimer = setTimeout(connect, reconnectDelayMs);
64
+ };
65
+ }
66
+ connect();
67
+ return () => {
68
+ closedByHook = true;
69
+ if (reconnectTimer)
70
+ clearTimeout(reconnectTimer);
71
+ socket?.close();
72
+ };
73
+ }, [enabled, reconnectDelayMs, streamUrl]);
74
+ return useMemo(() => {
75
+ const bids = message ? buildLevels(message.bids) : [];
76
+ const asks = message ? buildLevels(message.asks) : [];
77
+ const bestBid = bids[0]?.price ?? null;
78
+ const bestAsk = asks[0]?.price ?? null;
79
+ const spread = bestBid !== null && bestAsk !== null ? bestAsk - bestBid : null;
80
+ const midPrice = bestBid !== null && bestAsk !== null ? (bestBid + bestAsk) / 2 : null;
81
+ const spreadPercent = spread !== null && midPrice !== null && midPrice > 0 ? (spread / midPrice) * 100 : null;
82
+ return {
83
+ bids,
84
+ asks,
85
+ spread,
86
+ spreadPercent,
87
+ midPrice,
88
+ status,
89
+ error,
90
+ symbol: symbol.toUpperCase(),
91
+ updatedAt
92
+ };
93
+ }, [error, message, status, symbol, updatedAt]);
94
+ }
95
+ //# sourceMappingURL=useBinanceOrderBook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBinanceOrderBook.js","sourceRoot":"","sources":["../src/useBinanceOrderBook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAsCrD,SAAS,WAAW,CAAC,GAAuB;IAC1C,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,OAAO,GAAG;SACP,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7B,OAAO,IAAI,IAAI,CAAC;QAChB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IACzC,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;AACtG,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,UAAsC,EAAE;IAC1E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;IACxC,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;IAClC,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,IAAI,CAAC;IAC1D,MAAM,SAAS,GAAG,oCAAoC,MAAM,SAAS,KAAK,QAAQ,CAAC;IAEnF,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,EAAuB,CAAC;IAC9D,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAkB,YAAY,CAAC,CAAC;IACpE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAU,CAAC;IAC7C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,EAAQ,CAAC;IAEnD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,SAAS,CAAC,OAAO,CAAC,CAAC;YACnB,OAAO;QACT,CAAC;QAED,IAAI,OAAO,SAAS,KAAK,WAAW,EAAE,CAAC;YACrC,SAAS,CAAC,OAAO,CAAC,CAAC;YACnB,QAAQ,CAAC,6CAA6C,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QAED,IAAI,cAAyD,CAAC;QAC9D,IAAI,YAAY,GAAG,KAAK,CAAC;QACzB,IAAI,MAA6B,CAAC;QAElC,SAAS,OAAO;YACd,SAAS,CAAC,YAAY,CAAC,CAAC;YACxB,MAAM,GAAG,IAAI,SAAS,CAAC,SAAS,CAAC,CAAC;YAElC,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE;gBACnB,SAAS,CAAC,MAAM,CAAC,CAAC;gBAClB,QAAQ,CAAC,SAAS,CAAC,CAAC;YACtB,CAAC,CAAC;YAEF,MAAM,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;gBAC3B,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAwB,CAAC;oBACrE,UAAU,CAAC,MAAM,CAAC,CAAC;oBACnB,SAAS,CAAC,MAAM,CAAC,CAAC;oBAClB,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBAC3B,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS,CAAC,OAAO,CAAC,CAAC;oBACnB,QAAQ,CAAC,qCAAqC,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE;gBACpB,SAAS,CAAC,OAAO,CAAC,CAAC;gBACnB,QAAQ,CAAC,+BAA+B,CAAC,CAAC;YAC5C,CAAC,CAAC;YAEF,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE;gBACpB,IAAI,YAAY;oBAAE,OAAO;gBACzB,SAAS,CAAC,OAAO,CAAC,CAAC;gBACnB,cAAc,GAAG,UAAU,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;YACzD,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,CAAC;QAEV,OAAO,GAAG,EAAE;YACV,YAAY,GAAG,IAAI,CAAC;YACpB,IAAI,cAAc;gBAAE,YAAY,CAAC,cAAc,CAAC,CAAC;YACjD,MAAM,EAAE,KAAK,EAAE,CAAC;QAClB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC,CAAC;IAE3C,OAAO,OAAO,CAA4B,GAAG,EAAE;QAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAEtD,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC;QACvC,MAAM,MAAM,GAAG,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/E,MAAM,QAAQ,GAAG,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACvF,MAAM,aAAa,GAAG,MAAM,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QAE9G,OAAO;YACL,IAAI;YACJ,IAAI;YACJ,MAAM;YACN,aAAa;YACb,QAAQ;YACR,MAAM;YACN,KAAK;YACL,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE;YAC5B,SAAS;SACV,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,23 @@
1
+ export type TradeSide = "buy" | "sell";
2
+ export type Trade = {
3
+ id: number;
4
+ price: number;
5
+ size: number;
6
+ side: TradeSide;
7
+ timestamp: number;
8
+ };
9
+ export type TradesStatus = "connecting" | "live" | "stale" | "error";
10
+ export type UseBinanceTradesOptions = {
11
+ enabled?: boolean;
12
+ symbol?: string;
13
+ maxTrades?: number;
14
+ reconnectDelayMs?: number;
15
+ };
16
+ export type UseBinanceTradesResult = {
17
+ trades: Trade[];
18
+ status: TradesStatus;
19
+ error?: string;
20
+ symbol: string;
21
+ };
22
+ export declare function useBinanceTrades(options?: UseBinanceTradesOptions): UseBinanceTradesResult;
23
+ //# sourceMappingURL=useBinanceTrades.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBinanceTrades.d.ts","sourceRoot":"","sources":["../src/useBinanceTrades.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,CAAC;AAEvC,MAAM,MAAM,KAAK,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAErE,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAaF,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,uBAA4B,GAAG,sBAAsB,CAqF9F"}
@@ -0,0 +1,77 @@
1
+ import { useEffect, useMemo, useState } from "react";
2
+ export function useBinanceTrades(options = {}) {
3
+ const enabled = options.enabled ?? true;
4
+ const symbol = (options.symbol ?? "ethusdt").toLowerCase();
5
+ const maxTrades = options.maxTrades ?? 30;
6
+ const reconnectDelayMs = options.reconnectDelayMs ?? 3000;
7
+ const streamUrl = `wss://stream.binance.com:9443/ws/${symbol}@trade`;
8
+ const [trades, setTrades] = useState([]);
9
+ const [status, setStatus] = useState("connecting");
10
+ const [error, setError] = useState();
11
+ useEffect(() => {
12
+ if (!enabled) {
13
+ setStatus("stale");
14
+ return;
15
+ }
16
+ if (typeof WebSocket === "undefined") {
17
+ setStatus("error");
18
+ setError("WebSocket is not available in this runtime.");
19
+ return;
20
+ }
21
+ let reconnectTimer;
22
+ let closedByHook = false;
23
+ let socket;
24
+ function connect() {
25
+ setStatus("connecting");
26
+ socket = new WebSocket(streamUrl);
27
+ socket.onopen = () => {
28
+ setStatus("live");
29
+ setError(undefined);
30
+ };
31
+ socket.onmessage = (event) => {
32
+ try {
33
+ const parsed = JSON.parse(String(event.data));
34
+ const trade = {
35
+ id: parsed.t,
36
+ price: Number(parsed.p),
37
+ size: Number(parsed.q),
38
+ side: parsed.m ? "sell" : "buy",
39
+ timestamp: parsed.T
40
+ };
41
+ if (!Number.isFinite(trade.price) || !Number.isFinite(trade.size))
42
+ return;
43
+ setTrades((prev) => [trade, ...prev].slice(0, maxTrades));
44
+ setStatus("live");
45
+ }
46
+ catch {
47
+ setStatus("error");
48
+ setError("Could not parse trade message.");
49
+ }
50
+ };
51
+ socket.onerror = () => {
52
+ setStatus("error");
53
+ setError("Trade stream connection failed.");
54
+ };
55
+ socket.onclose = () => {
56
+ if (closedByHook)
57
+ return;
58
+ setStatus("stale");
59
+ reconnectTimer = setTimeout(connect, reconnectDelayMs);
60
+ };
61
+ }
62
+ connect();
63
+ return () => {
64
+ closedByHook = true;
65
+ if (reconnectTimer)
66
+ clearTimeout(reconnectTimer);
67
+ socket?.close();
68
+ };
69
+ }, [enabled, maxTrades, reconnectDelayMs, streamUrl]);
70
+ return useMemo(() => ({
71
+ trades,
72
+ status,
73
+ error,
74
+ symbol: symbol.toUpperCase()
75
+ }), [trades, status, error, symbol]);
76
+ }
77
+ //# sourceMappingURL=useBinanceTrades.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBinanceTrades.js","sourceRoot":"","sources":["../src/useBinanceTrades.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { type UseBinanceOrderBookOptions } from "./useBinanceOrderBook.js";
2
+ import { type UseBinanceTradesOptions } from "./useBinanceTrades.js";
3
+ import { type UseCoinbaseTickerOptions } from "./useCoinbaseTicker.js";
4
+ import { type UseVolatilityRegimeOptions } from "./useVolatilityRegime.js";
5
+ import { type BotDecision, type DecisionResult, type DecisionThresholds } from "./decisionEngine.js";
6
+ export type { BotDecision, DecisionResult, DecisionThresholds } from "./decisionEngine.js";
7
+ export type DecisionHistoryEntry = {
8
+ at: number;
9
+ decision: BotDecision;
10
+ confidence: number;
11
+ };
12
+ export type UseBotDecisionOptions = {
13
+ enabled?: boolean;
14
+ evaluationIntervalMs?: number;
15
+ flowWindowMs?: number;
16
+ historyLimit?: number;
17
+ thresholds?: Partial<DecisionThresholds>;
18
+ orderBook?: UseBinanceOrderBookOptions;
19
+ trades?: UseBinanceTradesOptions;
20
+ coinbase?: UseCoinbaseTickerOptions;
21
+ regime?: UseVolatilityRegimeOptions;
22
+ };
23
+ export type UseBotDecisionResult = DecisionResult & {
24
+ midPriceBinance: number | null;
25
+ midPriceCoinbase: number | null;
26
+ venueDivergenceBps: number | null;
27
+ bookDepthWithinHalfPctEth: number;
28
+ history: DecisionHistoryEntry[];
29
+ evaluatedAt?: Date;
30
+ };
31
+ export declare function useBotDecision(options?: UseBotDecisionOptions): UseBotDecisionResult;
32
+ //# sourceMappingURL=useBotDecision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBotDecision.d.ts","sourceRoot":"","sources":["../src/useBotDecision.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,KAAK,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAoB,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACvF,OAAO,EAAqB,KAAK,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EAAuB,KAAK,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAML,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACxB,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE3F,MAAM,MAAM,oBAAoB,GAAG;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACzC,SAAS,CAAC,EAAE,0BAA0B,CAAC;IACvC,MAAM,CAAC,EAAE,uBAAuB,CAAC;IACjC,QAAQ,CAAC,EAAE,wBAAwB,CAAC;IACpC,MAAM,CAAC,EAAE,0BAA0B,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,cAAc,GAAG;IAClD,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,yBAAyB,EAAE,MAAM,CAAC;IAClC,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,WAAW,CAAC,EAAE,IAAI,CAAC;CACpB,CAAC;AAQF,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,oBAAoB,CAqHxF"}
@@ -0,0 +1,104 @@
1
+ import { useEffect, useMemo, useRef, useState } from "react";
2
+ import { useBinanceOrderBook } from "./useBinanceOrderBook.js";
3
+ import { useBinanceTrades } from "./useBinanceTrades.js";
4
+ import { useCoinbaseTicker } from "./useCoinbaseTicker.js";
5
+ import { useVolatilityRegime } from "./useVolatilityRegime.js";
6
+ import { computeBookDepth, computeBookImbalance, computeBotDecision, computeTradeImbalance, DEFAULT_DECISION_THRESHOLDS } from "./decisionEngine.js";
7
+ const EMPTY_RESULT = {
8
+ decision: "WAIT",
9
+ confidence: 0,
10
+ reasons: [{ text: "Waiting for live data", tone: "neutral" }]
11
+ };
12
+ export function useBotDecision(options = {}) {
13
+ const enabled = options.enabled ?? true;
14
+ const evaluationIntervalMs = options.evaluationIntervalMs ?? 2000;
15
+ const flowWindowMs = options.flowWindowMs ?? 60_000;
16
+ const historyLimit = options.historyLimit ?? 30;
17
+ const thresholds = { ...DEFAULT_DECISION_THRESHOLDS, ...(options.thresholds ?? {}) };
18
+ const book = useBinanceOrderBook({ ...options.orderBook, enabled });
19
+ const trades = useBinanceTrades({ ...options.trades, enabled });
20
+ const coinbase = useCoinbaseTicker({ ...options.coinbase, enabled });
21
+ const regime = useVolatilityRegime({ ...options.regime, enabled });
22
+ const bookRef = useRef(book);
23
+ const tradesRef = useRef(trades);
24
+ const coinbaseRef = useRef(coinbase);
25
+ const regimeRef = useRef(regime);
26
+ useEffect(() => {
27
+ bookRef.current = book;
28
+ }, [book]);
29
+ useEffect(() => {
30
+ tradesRef.current = trades;
31
+ }, [trades]);
32
+ useEffect(() => {
33
+ coinbaseRef.current = coinbase;
34
+ }, [coinbase]);
35
+ useEffect(() => {
36
+ regimeRef.current = regime;
37
+ }, [regime]);
38
+ const [snapshot, setSnapshot] = useState({
39
+ result: EMPTY_RESULT,
40
+ midBinance: null,
41
+ midCoinbase: null,
42
+ divergenceBps: null,
43
+ depthEth: 0
44
+ });
45
+ const [history, setHistory] = useState([]);
46
+ useEffect(() => {
47
+ if (!enabled)
48
+ return;
49
+ function evaluate() {
50
+ const b = bookRef.current;
51
+ const t = tradesRef.current;
52
+ const c = coinbaseRef.current;
53
+ const r = regimeRef.current;
54
+ const midBinance = b.midPrice;
55
+ if (midBinance === null) {
56
+ setSnapshot((prev) => ({ ...prev, evaluatedAt: new Date() }));
57
+ return;
58
+ }
59
+ const bookImbalance = computeBookImbalance(b.bids, b.asks, midBinance);
60
+ const depthEth = computeBookDepth(b.bids, b.asks, midBinance);
61
+ const tradeImbalance = computeTradeImbalance(t.trades, flowWindowMs);
62
+ const spreadPct = b.spreadPercent ?? 0;
63
+ const midCoinbase = c.midPrice;
64
+ const divergenceBps = midCoinbase !== null && midCoinbase > 0
65
+ ? ((midBinance - midCoinbase) / midCoinbase) * 10000
66
+ : null;
67
+ const result = computeBotDecision({
68
+ regime: r.regime,
69
+ bookImbalance,
70
+ tradeImbalance,
71
+ spreadPct,
72
+ venueDivergenceBps: divergenceBps,
73
+ bookDepthWithinHalfPctEth: depthEth,
74
+ midPrice: midBinance
75
+ }, thresholds);
76
+ const now = Date.now();
77
+ setSnapshot({
78
+ result,
79
+ midBinance,
80
+ midCoinbase,
81
+ divergenceBps,
82
+ depthEth,
83
+ evaluatedAt: new Date(now)
84
+ });
85
+ setHistory((prev) => [
86
+ { at: now, decision: result.decision, confidence: result.confidence },
87
+ ...prev
88
+ ].slice(0, historyLimit));
89
+ }
90
+ evaluate();
91
+ const id = window.setInterval(evaluate, evaluationIntervalMs);
92
+ return () => window.clearInterval(id);
93
+ }, [enabled, evaluationIntervalMs, flowWindowMs, historyLimit, thresholds]);
94
+ return useMemo(() => ({
95
+ ...snapshot.result,
96
+ midPriceBinance: snapshot.midBinance,
97
+ midPriceCoinbase: snapshot.midCoinbase,
98
+ venueDivergenceBps: snapshot.divergenceBps,
99
+ bookDepthWithinHalfPctEth: snapshot.depthEth,
100
+ history,
101
+ evaluatedAt: snapshot.evaluatedAt
102
+ }), [history, snapshot]);
103
+ }
104
+ //# sourceMappingURL=useBotDecision.js.map