@pear-protocol/symmio-client 0.3.14 → 0.3.16

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.
@@ -60,6 +60,7 @@ var RECONNECT_DELAYS = [1e3, 2e3, 4e3, 8e3, 16e3, 3e4];
60
60
  var IDLE_CLOSE_DELAY_MS = 3e4;
61
61
  var STALE_CONNECTION_MS = 3e4;
62
62
  var STALE_CHECK_INTERVAL_MS = 1e4;
63
+ var RECONNECT_RESET_MS = 6e4;
63
64
  var STABLE_QUOTES = ["USDT0", "USDT", "USDC", "USDE", "USDH", "USD"];
64
65
  function normalizeBaseSymbol(symbol) {
65
66
  const normalized = symbol.toUpperCase().trim();
@@ -111,6 +112,7 @@ var BinanceWsManager = class {
111
112
  reconnectTimer = null;
112
113
  idleCloseTimer = null;
113
114
  staleCheckTimer = null;
115
+ reconnectResetTimer = null;
114
116
  intentionalClose = false;
115
117
  pendingSubscribes = /* @__PURE__ */ new Set();
116
118
  lastMessageAt = 0;
@@ -149,6 +151,7 @@ var BinanceWsManager = class {
149
151
  const wrappedCb = (raw) => {
150
152
  cb({
151
153
  symbol: normalizeBaseSymbol(raw.s),
154
+ binanceSymbol: raw.s,
152
155
  markPrice: parseFloat(raw.p),
153
156
  indexPrice: parseFloat(raw.i),
154
157
  time: raw.E,
@@ -170,6 +173,7 @@ var BinanceWsManager = class {
170
173
  cb(
171
174
  extractTickers(raw).map((entry) => ({
172
175
  symbol: normalizeBaseSymbol(entry.s),
176
+ binanceSymbol: entry.s,
173
177
  markPrice: parseFloat(entry.p),
174
178
  indexPrice: parseFloat(entry.i),
175
179
  time: entry.E,
@@ -189,6 +193,7 @@ var BinanceWsManager = class {
189
193
  this.clearReconnectTimer();
190
194
  this.clearIdleCloseTimer();
191
195
  this.clearStaleCheckTimer();
196
+ this.clearReconnectResetTimer();
192
197
  this.pendingSubscribes.clear();
193
198
  if (this.ws) {
194
199
  this.ws.close();
@@ -225,20 +230,26 @@ var BinanceWsManager = class {
225
230
  }
226
231
  }
227
232
  ensureConnected() {
228
- if (this.ws && (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING)) {
229
- return;
233
+ if (this.ws) {
234
+ const state = this.ws.readyState;
235
+ if (state === WebSocket.OPEN || state === WebSocket.CONNECTING || state === WebSocket.CLOSING) {
236
+ return;
237
+ }
230
238
  }
231
239
  this.clearReconnectTimer();
232
240
  this.connect();
233
241
  }
234
242
  connect() {
235
243
  if (typeof WebSocket === "undefined") return;
244
+ if (this.ws && this.ws.readyState !== WebSocket.CLOSED) {
245
+ return;
246
+ }
236
247
  this.intentionalClose = false;
237
248
  this.ws = new WebSocket(BINANCE_WS_URL);
238
249
  this.ws.onopen = () => {
239
- this.reconnectAttempt = 0;
240
250
  this.lastMessageAt = Date.now();
241
251
  this.startStaleCheck();
252
+ this.scheduleReconnectReset();
242
253
  const activeStreams = Array.from(
243
254
  /* @__PURE__ */ new Set([...this.streams.keys(), ...this.pendingSubscribes])
244
255
  );
@@ -251,14 +262,24 @@ var BinanceWsManager = class {
251
262
  try {
252
263
  const data = JSON.parse(event.data);
253
264
  this.lastMessageAt = Date.now();
265
+ this.resetReconnectAttempt();
254
266
  this.handleMessage(data);
255
267
  } catch {
256
268
  }
257
269
  };
258
270
  this.ws.onclose = () => {
271
+ const wasIntentional = this.intentionalClose;
272
+ this.intentionalClose = false;
259
273
  this.ws = null;
260
274
  this.clearStaleCheckTimer();
261
- if (this.intentionalClose) return;
275
+ this.clearReconnectResetTimer();
276
+ if (this.streams.size === 0) {
277
+ return;
278
+ }
279
+ if (wasIntentional) {
280
+ this.connect();
281
+ return;
282
+ }
262
283
  this.scheduleReconnect();
263
284
  };
264
285
  this.ws.onerror = () => {
@@ -334,9 +355,6 @@ var BinanceWsManager = class {
334
355
  if (this.streams.size > 0 || !this.ws) return;
335
356
  this.intentionalClose = true;
336
357
  this.ws.close();
337
- this.ws = null;
338
- this.intentionalClose = false;
339
- this.clearStaleCheckTimer();
340
358
  }, IDLE_CLOSE_DELAY_MS);
341
359
  }
342
360
  startStaleCheck() {
@@ -348,6 +366,17 @@ var BinanceWsManager = class {
348
366
  this.ws.close();
349
367
  }, STALE_CHECK_INTERVAL_MS);
350
368
  }
369
+ scheduleReconnectReset() {
370
+ this.clearReconnectResetTimer();
371
+ this.reconnectResetTimer = setTimeout(() => {
372
+ this.reconnectResetTimer = null;
373
+ this.resetReconnectAttempt();
374
+ }, RECONNECT_RESET_MS);
375
+ }
376
+ resetReconnectAttempt() {
377
+ this.reconnectAttempt = 0;
378
+ this.clearReconnectResetTimer();
379
+ }
351
380
  clearReconnectTimer() {
352
381
  if (!this.reconnectTimer) return;
353
382
  clearTimeout(this.reconnectTimer);
@@ -363,13 +392,21 @@ var BinanceWsManager = class {
363
392
  clearInterval(this.staleCheckTimer);
364
393
  this.staleCheckTimer = null;
365
394
  }
395
+ clearReconnectResetTimer() {
396
+ if (!this.reconnectResetTimer) return;
397
+ clearTimeout(this.reconnectResetTimer);
398
+ this.reconnectResetTimer = null;
399
+ }
366
400
  };
367
- var _instance = null;
401
+ var BINANCE_WS_SINGLETON_KEY = "__pearBinanceWsManager__";
368
402
  function getBinanceWsManager() {
369
- if (!_instance) {
370
- _instance = new BinanceWsManager();
403
+ const g = globalThis;
404
+ let manager = g[BINANCE_WS_SINGLETON_KEY];
405
+ if (!manager) {
406
+ manager = new BinanceWsManager();
407
+ g[BINANCE_WS_SINGLETON_KEY] = manager;
371
408
  }
372
- return _instance;
409
+ return manager;
373
410
  }
374
411
 
375
412
  // src/react/stores/use-binance-mark-price-store.ts
@@ -377,15 +414,8 @@ var refCounts = /* @__PURE__ */ new Map();
377
414
  var streamSymbols = /* @__PURE__ */ new Map();
378
415
  var allMarkPricesRefCount = 0;
379
416
  var allMarkPricesUnsubscribe = null;
380
- var STABLE_QUOTES2 = ["USDT0", "USDT", "USDC", "USDE", "USDH", "USD"];
381
- function normalizeBinanceSymbol(symbol) {
382
- const normalized = symbol.toUpperCase().trim();
383
- for (const quote of STABLE_QUOTES2) {
384
- if (normalized.endsWith(quote) && normalized.length > quote.length) {
385
- return normalized.slice(0, -quote.length);
386
- }
387
- }
388
- return normalized;
417
+ function normalizeBinanceSymbolKey(symbol) {
418
+ return symbol.toUpperCase().trim();
389
419
  }
390
420
  function getNextRefCount(binanceSymbol) {
391
421
  return (refCounts.get(binanceSymbol) ?? 0) + 1;
@@ -420,7 +450,7 @@ var useBinanceMarkPriceStore = zustand.create((set) => ({
420
450
  fundingRates: {},
421
451
  nextFundingTimes: {},
422
452
  subscribeSymbol: (symmSymbol, rawBinanceSymbol) => {
423
- const binanceSymbol = normalizeBinanceSymbol(rawBinanceSymbol);
453
+ const binanceSymbol = normalizeBinanceSymbolKey(rawBinanceSymbol);
424
454
  const nextRefCount = getNextRefCount(binanceSymbol);
425
455
  refCounts.set(binanceSymbol, nextRefCount);
426
456
  addMappedSymbol(binanceSymbol, symmSymbol);
@@ -432,8 +462,10 @@ var useBinanceMarkPriceStore = zustand.create((set) => ({
432
462
  let nextFundingRates = null;
433
463
  let nextFundingTimes = null;
434
464
  entries.forEach((entry) => {
435
- const canonicalSymbol = normalizeBinanceSymbol(entry.symbol);
436
- const mappedSymbols = streamSymbols.get(canonicalSymbol);
465
+ const binanceSymbolKey = normalizeBinanceSymbolKey(
466
+ entry.binanceSymbol ?? entry.symbol
467
+ );
468
+ const mappedSymbols = streamSymbols.get(binanceSymbolKey);
437
469
  if (!mappedSymbols || mappedSymbols.size === 0) return;
438
470
  nextMarkPrices ??= { ...state.markPrices };
439
471
  nextFundingRates ??= { ...state.fundingRates };
@@ -458,7 +490,7 @@ var useBinanceMarkPriceStore = zustand.create((set) => ({
458
490
  allMarkPricesRefCount += 1;
459
491
  },
460
492
  unsubscribeSymbol: (symmSymbol, rawBinanceSymbol) => {
461
- const binanceSymbol = normalizeBinanceSymbol(rawBinanceSymbol);
493
+ const binanceSymbol = normalizeBinanceSymbolKey(rawBinanceSymbol);
462
494
  const removedSubscription = removeMappedSymbol(binanceSymbol, symmSymbol);
463
495
  if (!removedSubscription) {
464
496
  return;
@@ -498,6 +530,7 @@ var useBinanceMarkPriceStore = zustand.create((set) => ({
498
530
  }));
499
531
 
500
532
  // src/react/hooks/use-binance-ws.ts
533
+ var BOOTSTRAP_RETRY_DELAYS_MS = [1e3, 2e3, 5e3];
501
534
  function useBinanceWs(params) {
502
535
  const { symmCoreClient, chainId } = params;
503
536
  const subscribeSymbol = useBinanceMarkPriceStore((state) => state.subscribeSymbol);
@@ -508,7 +541,8 @@ function useBinanceWs(params) {
508
541
  }
509
542
  let cancelled = false;
510
543
  let subscribedPairs = [];
511
- const run = async () => {
544
+ let retryTimer = null;
545
+ const run = async (attempt = 0) => {
512
546
  try {
513
547
  const result = await symmCoreClient.markets.listSymmHedger({ chainId });
514
548
  if (cancelled) {
@@ -528,11 +562,22 @@ function useBinanceWs(params) {
528
562
  subscribeSymbol(symbol, binanceSymbol);
529
563
  });
530
564
  } catch {
565
+ const delay = BOOTSTRAP_RETRY_DELAYS_MS[attempt];
566
+ if (cancelled || delay == null) {
567
+ return;
568
+ }
569
+ retryTimer = setTimeout(() => {
570
+ retryTimer = null;
571
+ void run(attempt + 1);
572
+ }, delay);
531
573
  }
532
574
  };
533
575
  void run();
534
576
  return () => {
535
577
  cancelled = true;
578
+ if (retryTimer) {
579
+ clearTimeout(retryTimer);
580
+ }
536
581
  subscribedPairs.forEach(([symbol, binanceSymbol]) => {
537
582
  unsubscribeSymbol(symbol, binanceSymbol);
538
583
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/react/context.ts","../../src/utils/binance-symbol-map.ts","../../src/utils/binance-ws.ts","../../src/react/stores/use-binance-mark-price-store.ts","../../src/react/hooks/use-binance-ws.ts","../../src/react/query-keys.ts","../../src/react/stores/use-symm-ws-store.ts","../../src/react/hooks/use-symm-ws.ts","../../src/react/provider.tsx"],"names":["createContext","STABLE_QUOTES","create","useEffect","useContext","useQueryClient","useMemo","createSymmSDK","jsx"],"mappings":"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","file":"provider.js","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { Address, PublicClient, WalletClient } from \"viem\";\nimport type { SymmSDK } from \"@pear-protocol/symm-core\";\nimport type { SymmioSDKConfig } from \"../types/common\";\n\nexport type SymmContextValue = {\n symmCoreClient: SymmSDK | null;\n chainId: number;\n address?: `0x${string}`;\n walletClient?: WalletClient;\n symmioConfig?: Partial<SymmioSDKConfig>;\n};\n\nexport const SymmContext = createContext<SymmContextValue | null>(null);\n\nexport function useSymmContext(): SymmContextValue {\n const ctx = useContext(SymmContext);\n if (!ctx) {\n throw new Error(\"useSymmContext must be used within <SymmProvider>\");\n }\n return ctx;\n}\n","/**\n * Maps SYMM market symbols to Binance USD-M Futures symbols.\n *\n * Most SYMM markets use the same symbol format as Binance (e.g., \"BTCUSDT\").\n * The override table handles exceptions.\n */\n\nconst SYMBOL_OVERRIDES: Record<string, string> = {\n // Add overrides here as needed for SYMM markets that don't map 1:1 to Binance\n // e.g., 'SOME_SYMM_SYMBOL': 'BINANCE_SYMBOL',\n};\n\n// Symbols known to not exist on Binance USD-M Futures\nconst UNSUPPORTED_SYMBOLS = new Set<string>([\n]);\n\nexport interface BinanceSymbolResolution {\n symmSymbol: string;\n normalizedSymbol: string;\n binanceSymbol: string | null;\n supported: boolean;\n reason: 'missing_symbol' | 'unsupported_symbol' | 'invalid_symbol' | null;\n}\n\nexport function resolveBinanceSymbol(symmSymbol: string): BinanceSymbolResolution {\n if (!symmSymbol || !symmSymbol.trim()) {\n return {\n symmSymbol,\n normalizedSymbol: '',\n binanceSymbol: null,\n supported: false,\n reason: 'missing_symbol',\n };\n }\n\n const normalized = symmSymbol.toUpperCase().trim();\n\n if (!/^[A-Z0-9]+$/.test(normalized)) {\n return {\n symmSymbol,\n normalizedSymbol: normalized,\n binanceSymbol: null,\n supported: false,\n reason: 'invalid_symbol',\n };\n }\n\n if (UNSUPPORTED_SYMBOLS.has(normalized)) {\n return {\n symmSymbol,\n normalizedSymbol: normalized,\n binanceSymbol: null,\n supported: false,\n reason: 'unsupported_symbol',\n };\n }\n\n const binanceSymbol = SYMBOL_OVERRIDES[normalized]\n ?? (normalized.endsWith('USDT') ? normalized : `${normalized}USDT`);\n\n return {\n symmSymbol,\n normalizedSymbol: normalized,\n binanceSymbol,\n supported: true,\n reason: null,\n };\n}\n\nexport function getUnsupportedBinanceSymbols(symbols: string[]): string[] {\n return symbols.filter((symbol) => !resolveBinanceSymbol(symbol).supported);\n}\n\n/**\n * Maps a SYMM market symbol or asset name to its Binance USD-M Futures symbol.\n * Returns null if the symbol is not supported on Binance.\n */\nexport function toBinanceSymbol(symmSymbol: string): string | null {\n return resolveBinanceSymbol(symmSymbol).binanceSymbol;\n}\n\n/**\n * Checks if a SYMM symbol can be mapped to a Binance USD-M Futures symbol.\n */\nexport function isBinanceSupported(symmSymbol: string): boolean {\n return resolveBinanceSymbol(symmSymbol).supported;\n}\n","/**\n * Binance USD-M Futures WebSocket manager.\n *\n * Manages a single connection to wss://fstream.binance.com/market/ws and uses\n * Binance's dynamic subscribe/unsubscribe protocol to add or remove streams\n * without reconnecting.\n *\n * Supports:\n * - Kline (candlestick) streams: <symbol>@kline_<interval>\n * - Mark price streams: <symbol>@markPrice@1s\n *\n * Usage is through a module-level singleton (no auth required for public streams).\n */\n\nconst BINANCE_WS_URL = 'wss://fstream.binance.com/market/ws';\nconst RECONNECT_DELAYS = [1000, 2000, 4000, 8000, 16000, 30000];\nconst IDLE_CLOSE_DELAY_MS = 30_000;\nconst STALE_CONNECTION_MS = 30_000;\nconst STALE_CHECK_INTERVAL_MS = 10_000;\n\nexport interface BinanceWsKline {\n symbol: string;\n interval: string;\n openTime: number;\n closeTime: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n isFinal: boolean;\n}\n\nexport type BinanceWsKlineCallback = (kline: BinanceWsKline) => void;\n\nexport interface BinanceWsMarkPrice {\n symbol: string;\n markPrice: number;\n indexPrice: number;\n time: number;\n fundingRate: number;\n nextFundingTime: number;\n}\n\nexport type BinanceWsMarkPriceCallback = (data: BinanceWsMarkPrice) => void;\nexport type BinanceWsAllMarkPricesCallback = (\n data: BinanceWsMarkPrice[],\n) => void;\n\ntype StreamCallback = (data: any) => void;\n\ninterface BinanceMarkPriceTicker {\n s: string;\n p: string;\n i: string;\n E: number;\n r?: string;\n T?: number;\n}\n\ninterface StreamSubscription {\n callbacks: Map<string, StreamCallback>;\n}\n\nconst STABLE_QUOTES = ['USDT0', 'USDT', 'USDC', 'USDE', 'USDH', 'USD'];\n\nfunction normalizeBaseSymbol(symbol: string): string {\n const normalized = symbol.toUpperCase().trim();\n\n for (const quote of STABLE_QUOTES) {\n if (normalized.endsWith(quote) && normalized.length > quote.length) {\n return normalized.slice(0, -quote.length);\n }\n }\n\n return normalized;\n}\n\nfunction isBinanceMarkPriceTicker(\n value: unknown,\n): value is BinanceMarkPriceTicker {\n return Boolean(\n value &&\n typeof value === 'object' &&\n typeof (value as { s?: unknown }).s === 'string' &&\n typeof (value as { p?: unknown }).p === 'string' &&\n typeof (value as { i?: unknown }).i === 'string' &&\n typeof (value as { E?: unknown }).E === 'number',\n );\n}\n\nfunction extractTickers(payload: unknown): BinanceMarkPriceTicker[] {\n if (Array.isArray(payload)) {\n return payload.filter(isBinanceMarkPriceTicker);\n }\n\n if (payload && typeof payload === 'object') {\n const maybeData = (payload as { data?: unknown }).data;\n if (Array.isArray(maybeData)) {\n return maybeData.filter(isBinanceMarkPriceTicker);\n }\n\n return isBinanceMarkPriceTicker(payload) ? [payload] : [];\n }\n\n return [];\n}\n\nfunction extractWsPayload(payload: unknown): unknown {\n if (\n payload &&\n typeof payload === 'object' &&\n 'data' in payload\n ) {\n return (payload as { data?: unknown }).data ?? payload;\n }\n\n return payload;\n}\n\nfunction isKlinePayload(\n payload: unknown,\n): payload is {\n e: 'kline';\n s: string;\n k: {\n i: string;\n t: number;\n T: number;\n o: string;\n h: string;\n l: string;\n c: string;\n v: string;\n x: boolean;\n };\n} {\n return Boolean(\n payload &&\n typeof payload === 'object' &&\n (payload as { e?: unknown }).e === 'kline' &&\n typeof (payload as { s?: unknown }).s === 'string' &&\n (payload as { k?: unknown }).k &&\n typeof (payload as { k: { i?: unknown } }).k.i === 'string',\n );\n}\n\nfunction isMarkPricePayload(\n payload: unknown,\n): payload is {\n e: 'markPriceUpdate';\n s: string;\n} {\n return Boolean(\n payload &&\n typeof payload === 'object' &&\n (payload as { e?: unknown }).e === 'markPriceUpdate' &&\n typeof (payload as { s?: unknown }).s === 'string',\n );\n}\n\nexport class BinanceWsManager {\n private ws: WebSocket | null = null;\n private streams: Map<string, StreamSubscription> = new Map();\n private reconnectAttempt = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private idleCloseTimer: ReturnType<typeof setTimeout> | null = null;\n private staleCheckTimer: ReturnType<typeof setInterval> | null = null;\n private intentionalClose = false;\n private pendingSubscribes: Set<string> = new Set();\n private lastMessageAt = 0;\n private idCounter = 0;\n\n /**\n * Subscribe to a kline stream. Returns an unsubscribe function.\n */\n subscribeKline(\n symbol: string,\n interval: string,\n cb: BinanceWsKlineCallback,\n ): () => void {\n const streamName = `${symbol.toLowerCase()}@kline_${interval}`;\n const id = this.generateId();\n\n const wrappedCb: StreamCallback = (raw: any) => {\n const k = raw.k;\n if (!k) return;\n cb({\n symbol: raw.s,\n interval: k.i,\n openTime: k.t,\n closeTime: k.T,\n open: parseFloat(k.o),\n high: parseFloat(k.h),\n low: parseFloat(k.l),\n close: parseFloat(k.c),\n volume: parseFloat(k.v),\n isFinal: k.x,\n });\n };\n\n this.addStreamCallback(streamName, id, wrappedCb);\n return () => this.removeStreamCallback(streamName, id);\n }\n\n /**\n * Subscribe to a mark price stream (1s updates). Returns an unsubscribe function.\n */\n subscribeMarkPrice(\n symbol: string,\n cb: BinanceWsMarkPriceCallback,\n ): () => void {\n const streamName = `${symbol.toLowerCase()}@markPrice@1s`;\n const id = this.generateId();\n\n const wrappedCb: StreamCallback = (raw: any) => {\n cb({\n symbol: normalizeBaseSymbol(raw.s),\n markPrice: parseFloat(raw.p),\n indexPrice: parseFloat(raw.i),\n time: raw.E,\n fundingRate: parseFloat(raw.r ?? '0'),\n nextFundingTime: Number(raw.T ?? 0),\n });\n };\n\n this.addStreamCallback(streamName, id, wrappedCb);\n return () => this.removeStreamCallback(streamName, id);\n }\n\n /**\n * Subscribe to the all-market mark price stream (1s updates).\n * Returns an unsubscribe function.\n */\n subscribeAllMarkPrices(cb: BinanceWsAllMarkPricesCallback): () => void {\n const streamName = '!markPrice@arr@1s';\n const id = this.generateId();\n\n const wrappedCb: StreamCallback = (raw: any) => {\n cb(\n extractTickers(raw)\n .map((entry) => ({\n symbol: normalizeBaseSymbol(entry.s),\n markPrice: parseFloat(entry.p),\n indexPrice: parseFloat(entry.i),\n time: entry.E,\n fundingRate: parseFloat(entry.r ?? '0'),\n nextFundingTime: Number(entry.T ?? 0),\n })),\n );\n };\n\n this.addStreamCallback(streamName, id, wrappedCb);\n return () => this.removeStreamCallback(streamName, id);\n }\n\n /**\n * Destroy the manager and close the connection.\n */\n destroy(): void {\n this.intentionalClose = true;\n this.clearReconnectTimer();\n this.clearIdleCloseTimer();\n this.clearStaleCheckTimer();\n this.pendingSubscribes.clear();\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n this.streams.clear();\n }\n\n // --- Private ---\n\n private generateId(): string {\n return `sub_${++this.idCounter}_${Date.now()}`;\n }\n\n private addStreamCallback(\n streamName: string,\n id: string,\n cb: StreamCallback,\n ): void {\n let sub = this.streams.get(streamName);\n const isNew = !sub;\n\n if (!sub) {\n sub = { callbacks: new Map() };\n this.streams.set(streamName, sub);\n }\n sub.callbacks.set(id, cb);\n\n if (isNew) {\n this.clearIdleCloseTimer();\n this.ensureConnected();\n this.sendSubscribe([streamName]);\n }\n }\n\n private removeStreamCallback(streamName: string, id: string): void {\n const sub = this.streams.get(streamName);\n if (!sub) return;\n\n sub.callbacks.delete(id);\n\n if (sub.callbacks.size === 0) {\n this.streams.delete(streamName);\n this.sendUnsubscribe([streamName]);\n\n this.scheduleIdleClose();\n }\n }\n\n private ensureConnected(): void {\n if (this.ws && (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING)) {\n return;\n }\n this.clearReconnectTimer();\n this.connect();\n }\n\n private connect(): void {\n if (typeof WebSocket === 'undefined') return;\n\n this.intentionalClose = false;\n this.ws = new WebSocket(BINANCE_WS_URL);\n\n this.ws.onopen = () => {\n this.reconnectAttempt = 0;\n this.lastMessageAt = Date.now();\n this.startStaleCheck();\n\n // Subscribe once to the deduped active stream set on initial connect\n // or reconnect. Binance supports live JSON SUBSCRIBE messages.\n const activeStreams = Array.from(\n new Set([...this.streams.keys(), ...this.pendingSubscribes]),\n );\n this.pendingSubscribes.clear();\n if (activeStreams.length > 0) {\n this.sendSubscribe(activeStreams);\n }\n };\n\n this.ws.onmessage = (event: MessageEvent) => {\n try {\n const data = JSON.parse(event.data as string);\n this.lastMessageAt = Date.now();\n this.handleMessage(data);\n } catch {\n // Ignore parse errors\n }\n };\n\n this.ws.onclose = () => {\n this.ws = null;\n this.clearStaleCheckTimer();\n if (this.intentionalClose) return;\n this.scheduleReconnect();\n };\n\n this.ws.onerror = () => {\n // onclose will fire after onerror, reconnect handled there\n };\n }\n\n private handleMessage(data: any): void {\n // Binance sends kline events with { e: 'kline', s: 'BTCUSDT', k: {...} }\n // and mark price events with { e: 'markPriceUpdate', s: 'BTCUSDT', p: '...', ... }\n // or all-market mark price arrays for !markPrice@arr@1s.\n // Determine the stream name from the event type.\n\n const payload = extractWsPayload(data);\n\n if (Array.isArray(payload)) {\n this.dispatchToStream('!markPrice@arr@1s', payload);\n return;\n }\n\n if (isKlinePayload(payload)) {\n const k = payload.k;\n const streamName = `${payload.s.toLowerCase()}@kline_${k.i}`;\n this.dispatchToStream(streamName, payload);\n } else if (isMarkPricePayload(payload)) {\n const streamName = `${payload.s.toLowerCase()}@markPrice@1s`;\n this.dispatchToStream(streamName, payload);\n }\n // Ignore subscription confirmations and other system messages\n }\n\n private dispatchToStream(streamName: string, data: any): void {\n const sub = this.streams.get(streamName);\n if (!sub) return;\n\n sub.callbacks.forEach((cb) => {\n try {\n cb(data);\n } catch {\n // Ignore callback errors\n }\n });\n }\n\n private sendSubscribe(streams: string[]): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n streams.forEach((stream) => this.pendingSubscribes.add(stream));\n return;\n }\n\n const params = Array.from(new Set(streams));\n if (params.length === 0) return;\n\n this.ws.send(JSON.stringify({\n method: 'SUBSCRIBE',\n params,\n id: Date.now(),\n }));\n }\n\n private sendUnsubscribe(streams: string[]): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n // Remove from pending if not yet sent\n streams.forEach((stream) => this.pendingSubscribes.delete(stream));\n return;\n }\n\n const params = Array.from(new Set(streams));\n if (params.length === 0) return;\n\n this.ws.send(JSON.stringify({\n method: 'UNSUBSCRIBE',\n params,\n id: Date.now(),\n }));\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer) return;\n if (this.streams.size === 0) return; // No need to reconnect if no subscriptions\n\n const delay = RECONNECT_DELAYS[\n Math.min(this.reconnectAttempt, RECONNECT_DELAYS.length - 1)\n ];\n this.reconnectAttempt++;\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.connect();\n }, delay);\n }\n\n private scheduleIdleClose(): void {\n if (this.streams.size > 0 || this.idleCloseTimer) return;\n\n this.clearReconnectTimer();\n if (!this.ws) return;\n\n this.idleCloseTimer = setTimeout(() => {\n this.idleCloseTimer = null;\n if (this.streams.size > 0 || !this.ws) return;\n\n this.intentionalClose = true;\n this.ws.close();\n this.ws = null;\n this.intentionalClose = false;\n this.clearStaleCheckTimer();\n }, IDLE_CLOSE_DELAY_MS);\n }\n\n private startStaleCheck(): void {\n this.clearStaleCheckTimer();\n this.staleCheckTimer = setInterval(() => {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return;\n if (this.streams.size === 0) return;\n if (Date.now() - this.lastMessageAt < STALE_CONNECTION_MS) return;\n\n this.ws.close();\n }, STALE_CHECK_INTERVAL_MS);\n }\n\n private clearReconnectTimer(): void {\n if (!this.reconnectTimer) return;\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n private clearIdleCloseTimer(): void {\n if (!this.idleCloseTimer) return;\n clearTimeout(this.idleCloseTimer);\n this.idleCloseTimer = null;\n }\n\n private clearStaleCheckTimer(): void {\n if (!this.staleCheckTimer) return;\n clearInterval(this.staleCheckTimer);\n this.staleCheckTimer = null;\n }\n}\n\n// Module-level singleton — Binance public WS requires no authentication\nlet _instance: BinanceWsManager | null = null;\n\nexport function getBinanceWsManager(): BinanceWsManager {\n if (!_instance) {\n _instance = new BinanceWsManager();\n }\n return _instance;\n}\n","import { create } from 'zustand';\nimport { getBinanceWsManager } from '../../utils/binance-ws';\n\ntype MarkPrices = Record<string, number>;\ntype FundingRates = Record<string, number>;\ntype NextFundingTimes = Record<string, number>;\n\ntype BinanceMarkPriceState = {\n markPrices: MarkPrices;\n fundingRates: FundingRates;\n nextFundingTimes: NextFundingTimes;\n subscribeSymbol: (symmSymbol: string, binanceSymbol: string) => void;\n unsubscribeSymbol: (symmSymbol: string, binanceSymbol: string) => void;\n};\n\nconst refCounts = new Map<string, number>();\nconst streamSymbols = new Map<string, Map<string, number>>();\nlet allMarkPricesRefCount = 0;\nlet allMarkPricesUnsubscribe: (() => void) | null = null;\n\nconst STABLE_QUOTES = ['USDT0', 'USDT', 'USDC', 'USDE', 'USDH', 'USD'];\n\nfunction normalizeBinanceSymbol(symbol: string): string {\n const normalized = symbol.toUpperCase().trim();\n\n for (const quote of STABLE_QUOTES) {\n if (normalized.endsWith(quote) && normalized.length > quote.length) {\n return normalized.slice(0, -quote.length);\n }\n }\n\n return normalized;\n}\n\nfunction getNextRefCount(binanceSymbol: string): number {\n return (refCounts.get(binanceSymbol) ?? 0) + 1;\n}\n\nfunction getPrevRefCount(binanceSymbol: string): number {\n return Math.max(0, (refCounts.get(binanceSymbol) ?? 0) - 1);\n}\n\nfunction addMappedSymbol(binanceSymbol: string, symmSymbol: string): void {\n const symbols = streamSymbols.get(binanceSymbol) ?? new Map<string, number>();\n symbols.set(symmSymbol, (symbols.get(symmSymbol) ?? 0) + 1);\n streamSymbols.set(binanceSymbol, symbols);\n}\n\nfunction removeMappedSymbol(binanceSymbol: string, symmSymbol: string): boolean {\n const symbols = streamSymbols.get(binanceSymbol);\n if (!symbols) return false;\n\n const currentCount = symbols.get(symmSymbol) ?? 0;\n if (currentCount <= 0) return false;\n\n if (currentCount === 1) {\n symbols.delete(symmSymbol);\n } else {\n symbols.set(symmSymbol, currentCount - 1);\n }\n\n if (symbols.size === 0) {\n streamSymbols.delete(binanceSymbol);\n } else {\n streamSymbols.set(binanceSymbol, symbols);\n }\n\n return true;\n}\n\nexport const useBinanceMarkPriceStore = create<BinanceMarkPriceState>((set) => ({\n markPrices: {},\n fundingRates: {},\n nextFundingTimes: {},\n\n subscribeSymbol: (symmSymbol, rawBinanceSymbol) => {\n const binanceSymbol = normalizeBinanceSymbol(rawBinanceSymbol);\n const nextRefCount = getNextRefCount(binanceSymbol);\n refCounts.set(binanceSymbol, nextRefCount);\n\n addMappedSymbol(binanceSymbol, symmSymbol);\n\n if (allMarkPricesRefCount === 0) {\n const wsManager = getBinanceWsManager();\n allMarkPricesUnsubscribe = wsManager.subscribeAllMarkPrices((entries) => {\n set((state) => {\n let nextMarkPrices: MarkPrices | null = null;\n let nextFundingRates: FundingRates | null = null;\n let nextFundingTimes: NextFundingTimes | null = null;\n\n entries.forEach((entry) => {\n const canonicalSymbol = normalizeBinanceSymbol(entry.symbol);\n const mappedSymbols = streamSymbols.get(canonicalSymbol);\n if (!mappedSymbols || mappedSymbols.size === 0) return;\n\n nextMarkPrices ??= { ...state.markPrices };\n nextFundingRates ??= { ...state.fundingRates };\n nextFundingTimes ??= { ...state.nextFundingTimes };\n mappedSymbols.forEach((_count, mappedSymbol) => {\n nextMarkPrices![mappedSymbol] = entry.markPrice;\n nextFundingRates![mappedSymbol] = entry.fundingRate;\n nextFundingTimes![mappedSymbol] = entry.nextFundingTime;\n });\n });\n\n if (!nextMarkPrices || !nextFundingRates || !nextFundingTimes) {\n return state;\n }\n\n return {\n markPrices: nextMarkPrices,\n fundingRates: nextFundingRates,\n nextFundingTimes: nextFundingTimes,\n };\n });\n });\n }\n\n allMarkPricesRefCount += 1;\n },\n\n unsubscribeSymbol: (symmSymbol, rawBinanceSymbol) => {\n const binanceSymbol = normalizeBinanceSymbol(rawBinanceSymbol);\n const removedSubscription = removeMappedSymbol(binanceSymbol, symmSymbol);\n if (!removedSubscription) {\n return;\n }\n\n const nextRefCount = getPrevRefCount(binanceSymbol);\n if (nextRefCount === 0) {\n refCounts.delete(binanceSymbol);\n } else {\n refCounts.set(binanceSymbol, nextRefCount);\n }\n\n allMarkPricesRefCount = Math.max(0, allMarkPricesRefCount - 1);\n if (allMarkPricesRefCount === 0) {\n allMarkPricesUnsubscribe?.();\n allMarkPricesUnsubscribe = null;\n }\n\n set((state) => {\n const hasMappedSymbol = Boolean(streamSymbols.get(binanceSymbol)?.has(symmSymbol));\n if (hasMappedSymbol) {\n return state;\n }\n\n if (\n state.markPrices[symmSymbol] == null &&\n state.fundingRates[symmSymbol] == null &&\n state.nextFundingTimes[symmSymbol] == null\n ) {\n return state;\n }\n\n const nextMarkPrices = { ...state.markPrices };\n const nextFundingRates = { ...state.fundingRates };\n const nextFundingTimes = { ...state.nextFundingTimes };\n delete nextMarkPrices[symmSymbol];\n delete nextFundingRates[symmSymbol];\n delete nextFundingTimes[symmSymbol];\n\n return {\n markPrices: nextMarkPrices,\n fundingRates: nextFundingRates,\n nextFundingTimes: nextFundingTimes,\n };\n });\n },\n}));\n","import { useEffect } from \"react\";\nimport type { SymmSDK } from \"@pear-protocol/symm-core\";\nimport { resolveBinanceSymbol } from \"../../utils/binance-symbol-map\";\nimport { useBinanceMarkPriceStore } from \"../stores/use-binance-mark-price-store\";\n\n/**\n * Use case: Establish Binance mark-price WS subscriptions at provider level.\n * Subscribes to all SYMM hedger symbols for the active chain and feeds the shared store.\n */\nexport function useBinanceWs(params: {\n symmCoreClient: SymmSDK | null;\n chainId: number;\n}) {\n const { symmCoreClient, chainId } = params;\n const subscribeSymbol = useBinanceMarkPriceStore((state) => state.subscribeSymbol);\n const unsubscribeSymbol = useBinanceMarkPriceStore((state) => state.unsubscribeSymbol);\n\n useEffect(() => {\n if (!symmCoreClient) {\n return;\n }\n\n let cancelled = false;\n let subscribedPairs: Array<readonly [string, string]> = [];\n\n const run = async () => {\n try {\n const result = await symmCoreClient.markets.listSymmHedger({ chainId });\n if (cancelled) {\n return;\n }\n\n const uniqueSymbols = Array.from(\n new Set(\n result.markets\n .map((market) => market.symbol)\n .filter((symbol): symbol is string => !!symbol)\n )\n );\n\n subscribedPairs = uniqueSymbols\n .map((symbol) => {\n const binanceSymbol = resolveBinanceSymbol(symbol).binanceSymbol;\n if (!binanceSymbol) return null;\n return [symbol, binanceSymbol] as const;\n })\n .filter((entry): entry is readonly [string, string] => !!entry);\n\n subscribedPairs.forEach(([symbol, binanceSymbol]) => {\n subscribeSymbol(symbol, binanceSymbol);\n });\n } catch {\n // best-effort subscription bootstrap\n }\n };\n\n void run();\n\n return () => {\n cancelled = true;\n subscribedPairs.forEach(([symbol, binanceSymbol]) => {\n unsubscribeSymbol(symbol, binanceSymbol);\n });\n };\n }, [symmCoreClient, chainId, subscribeSymbol, unsubscribeSymbol]);\n}\n","import type { GetSymmHedgerMarketsRequest } from '@pear-protocol/symm-core';\nimport type { Address, Hex } from 'viem';\n\nexport const symmKeys = {\n all: ['symm'] as const,\n balancesRoot: ['symm', 'balances'] as const,\n accountSummaryRoot: ['symm', 'accountSummary'] as const,\n accountDataRoot: ['symm', 'accountData'] as const,\n approvalRoot: ['symm', 'approval'] as const,\n positionsRoot: ['symm', 'positions'] as const,\n openOrdersRoot: ['symm', 'openOrders'] as const,\n tradeHistoryRoot: ['symm', 'tradeHistory'] as const,\n portfolioRoot: ['symm', 'portfolio'] as const,\n tpslOrdersRoot: ['symm', 'tpslOrders'] as const,\n twapOrdersRoot: ['symm', 'twapOrders'] as const,\n triggerOrdersRoot: ['symm', 'triggerOrders'] as const,\n accounts: (address?: Address, chainId?: number) =>\n ['symm', 'accounts', address, chainId] as const,\n accountsApi: (address?: Address, chainId?: number) =>\n ['symm', 'accountsApi', address, chainId] as const,\n accountsLength: (address?: Address, chainId?: number) =>\n ['symm', 'accountsLength', address, chainId] as const,\n accountsWithPositions: (address?: Address, chainId?: number) =>\n ['symm', 'accountsWithPositions', address, chainId] as const,\n accountSummary: (address?: Address, chainId?: number) =>\n ['symm', 'accountSummary', address, chainId] as const,\n accountData: (address?: Address, chainId?: number, upnl?: string) =>\n ['symm', 'accountData', address, chainId, upnl] as const,\n signature: (address?: Address, chainId?: number) =>\n ['symm', 'signature', address, chainId] as const,\n auth: (accountAddress?: Address, chainId?: number, signerAddress?: Address) =>\n ['symm', 'auth', accountAddress, chainId, signerAddress] as const,\n approval: (\n owner?: Address,\n spender?: Address,\n chainId?: number,\n token?: Address\n ) => ['symm', 'approval', owner, spender, chainId, token] as const,\n balances: (\n address?: Address,\n chainId?: number,\n multiAccountAddress?: Address\n ) => multiAccountAddress === undefined\n ? ['symm', 'balances', address, chainId] as const\n : ['symm', 'balances', address, chainId, multiAccountAddress] as const,\n positions: (params?: {\n accountAddress?: Address;\n address?: Address;\n chainId?: number;\n }) => ['symm', 'positions', params] as const,\n openOrders: (params?: {\n accountAddress?: Address;\n address?: Address;\n chainId?: number;\n }) => ['symm', 'openOrders', params] as const,\n tradeHistory: (params?: {\n accountAddress?: Address;\n address?: Address;\n chainId?: number;\n }) => ['symm', 'tradeHistory', params] as const,\n tpslOrders: (address?: Address, chainId?: number) =>\n ['symm', 'tpslOrders', address, chainId] as const,\n tpslOrdersList: (params?: {\n accountAddress?: Address;\n address?: Address;\n positionId?: string;\n type?: string;\n status?: string;\n chainId?: number;\n }) => ['symm', 'tpslOrders', params] as const,\n twapOrders: (address?: Address, chainId?: number) =>\n ['symm', 'twapOrders', address, chainId] as const,\n triggerOrders: (params?: {\n accountAddress?: Address;\n address?: Address;\n status?: string;\n limit?: number;\n offset?: number;\n chainId?: number;\n }) => ['symm', 'triggerOrders', params] as const,\n triggerConfig: (orderId?: string) =>\n ['symm', 'triggerConfig', orderId] as const,\n markets: (chainId?: number, search?: string, pageSize?: string) =>\n ['symm', 'markets', chainId, search, pageSize] as const,\n hedgerMarketById: (id?: number, chainId?: number) =>\n ['symm', 'hedgerMarketById', id, chainId] as const,\n hedgerMarketBySymbol: (symbol?: string, chainId?: number) =>\n ['symm', 'hedgerMarketBySymbol', symbol, chainId] as const,\n lockedParams: (marketName?: string, leverage?: number, chainId?: number) =>\n ['symm', 'lockedParams', marketName, leverage, chainId] as const,\n hedgerMarkets: (request?: GetSymmHedgerMarketsRequest) =>\n ['symm', 'hedgerMarkets', request] as const,\n fundingRates: (chainId?: number) => ['symm', 'fundingRates', chainId] as const,\n fundingPayments: (params?: {\n address?: Address;\n positionId?: string;\n chainId?: number;\n limit?: number;\n offset?: number;\n }) => ['symm', 'fundingPayments', params] as const,\n fundingHistory: (params?: {\n chainId?: number;\n period?: string;\n longSymbols?: string;\n shortSymbols?: string;\n interval?: string;\n weightMode?: string;\n includeContributions?: boolean;\n }) => ['symm', 'fundingHistory', params] as const,\n portfolio: (params?: {\n accountAddress?: Address;\n address?: Address;\n chainId?: number;\n }) => ['symm', 'portfolio', params] as const,\n notifications: (params?: {\n accountAddress?: Address;\n address?: Address;\n chainId?: number;\n }) => ['symm', 'notifications', params] as const,\n unreadCount: (params?: {\n accountAddress?: Address;\n address?: Address;\n chainId?: number;\n }) => ['symm', 'unreadCount', params] as const,\n availableMargin: (address?: Address, chainId?: number) =>\n ['symm', 'availableMargin', address, chainId] as const,\n pendingIds: (address?: Address, chainId?: number) =>\n ['symm', 'pendingIds', address, chainId] as const,\n pendingInstantOpens: (accountAddress?: Address, chainId?: number) =>\n ['symm', 'pendingInstantOpens', accountAddress, chainId] as const,\n twapOrder: (orderId?: string) =>\n ['symm', 'twapOrder', orderId] as const,\n delegation: (\n account?: Address,\n target?: Address,\n selectors?: readonly Hex[],\n chainId?: number\n ) => ['symm', 'delegation', account, target, selectors, chainId] as const,\n chartMetadata: (symbolsKey: string, positionKey: string) =>\n ['symm', 'chartMetadata', symbolsKey, positionKey] as const,\n};\n","import { create } from 'zustand';\n\ntype SymmWsState = {\n isConnected: boolean;\n setConnected: (isConnected: boolean) => void;\n};\n\nexport const useSymmWsStore = create<SymmWsState>((set) => ({\n isConnected: false,\n setConnected: (isConnected) => set({ isConnected }),\n}));\n","import { useContext, useEffect } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport type { Address } from \"viem\";\nimport type {\n SymmSDK,\n WebSocketChannel,\n WebSocketChannelData,\n WebSocketDataMessage,\n} from \"@pear-protocol/symm-core\";\nimport { SymmContext } from \"../context\";\nimport { symmKeys } from \"../query-keys\";\nimport { useSymmWsStore } from \"../stores/use-symm-ws-store\";\n\ntype SymmWsClient = NonNullable<SymmSDK[\"ws\"]>;\ntype MessageHandler<C extends WebSocketChannel> = (\n data: WebSocketChannelData[C],\n message: WebSocketDataMessage,\n) => void;\ntype AnyMessageHandler = MessageHandler<WebSocketChannel>;\ntype ChannelSubscription<C extends WebSocketChannel = WebSocketChannel> = {\n channel: C;\n handler: MessageHandler<C>;\n};\n\nconst wsOwnerCounts = new WeakMap<SymmWsClient, number>();\nconst wsConnectPromises = new WeakMap<SymmWsClient, Promise<void>>();\n\nfunction addWsOwner(ws: SymmWsClient): void {\n wsOwnerCounts.set(ws, (wsOwnerCounts.get(ws) ?? 0) + 1);\n}\n\nfunction removeWsOwner(ws: SymmWsClient): number {\n const nextCount = Math.max(0, (wsOwnerCounts.get(ws) ?? 0) - 1);\n if (nextCount === 0) {\n wsOwnerCounts.delete(ws);\n } else {\n wsOwnerCounts.set(ws, nextCount);\n }\n return nextCount;\n}\n\nfunction connectShared(ws: SymmWsClient): Promise<void> {\n if (ws.isConnected()) {\n return Promise.resolve();\n }\n\n const existing = wsConnectPromises.get(ws);\n if (existing) {\n return existing;\n }\n\n const promise = ws.connect().finally(() => {\n wsConnectPromises.delete(ws);\n });\n wsConnectPromises.set(ws, promise);\n return promise;\n}\n\n/**\n * Use case: Connect and manage SYMM WebSocket subscriptions for realtime updates.\n */\n\nexport function useSymmWs(\n params: {\n symmCoreClient?: SymmSDK | null;\n accountAddress?: Address;\n chainId?: number;\n } = {}\n) {\n const ctx = useContext(SymmContext);\n const queryClient = useQueryClient();\n const isConnected = useSymmWsStore((state) => state.isConnected);\n const setConnected = useSymmWsStore((state) => state.setConnected);\n const symmCoreClient = params.symmCoreClient ?? ctx?.symmCoreClient ?? null;\n const accountAddress = params.accountAddress ?? ctx?.address;\n const chainId = params.chainId ?? ctx?.chainId ?? 42161;\n\n useEffect(() => {\n if (!symmCoreClient || !accountAddress) {\n setConnected(false);\n return;\n }\n\n const ws = symmCoreClient.ws;\n const addr = accountAddress as string;\n let cancelled = false;\n\n addWsOwner(ws);\n\n const removeOnConnect = ws.onConnect(() => setConnected(true));\n const removeOnDisconnect = ws.onDisconnect(() => setConnected(false));\n const subscriptions: ChannelSubscription[] = [];\n\n const addSubscription = <C extends WebSocketChannel>(\n channel: C,\n handler: MessageHandler<C>,\n ) => {\n ws.subscribe(channel, addr, chainId, handler);\n subscriptions.push({ channel, handler } as ChannelSubscription);\n };\n\n addSubscription(\"positions\", () => {\n queryClient.invalidateQueries({ queryKey: symmKeys.positionsRoot });\n });\n addSubscription(\"open-orders\", () => {\n queryClient.invalidateQueries({ queryKey: symmKeys.openOrdersRoot });\n });\n addSubscription(\"trades\", () => {\n queryClient.invalidateQueries({ queryKey: symmKeys.tradeHistoryRoot });\n });\n addSubscription(\"account-summary\", () => {\n queryClient.invalidateQueries({\n queryKey: symmKeys.balances(accountAddress, chainId),\n });\n queryClient.invalidateQueries({\n queryKey: symmKeys.accountSummary(accountAddress, chainId),\n });\n });\n addSubscription(\"notifications\", () => {\n queryClient.invalidateQueries({\n queryKey: symmKeys.notifications({ accountAddress, chainId }),\n });\n queryClient.invalidateQueries({\n queryKey: symmKeys.unreadCount({ accountAddress, chainId }),\n });\n });\n addSubscription(\"tpsl\", () => {\n queryClient.invalidateQueries({ queryKey: symmKeys.tpslOrdersRoot });\n queryClient.invalidateQueries({ queryKey: symmKeys.openOrdersRoot });\n });\n addSubscription(\"twap-orders\", () => {\n queryClient.invalidateQueries({ queryKey: symmKeys.twapOrdersRoot });\n queryClient.invalidateQueries({ queryKey: symmKeys.openOrdersRoot });\n });\n addSubscription(\"trigger-orders\", () => {\n queryClient.invalidateQueries({ queryKey: symmKeys.triggerOrdersRoot });\n queryClient.invalidateQueries({ queryKey: symmKeys.openOrdersRoot });\n });\n addSubscription(\"executions\", () => {\n queryClient.invalidateQueries({ queryKey: symmKeys.positionsRoot });\n queryClient.invalidateQueries({ queryKey: symmKeys.portfolioRoot });\n });\n\n void connectShared(ws)\n .then(() => {\n if (cancelled) return;\n // connect() resolves immediately without firing onopen when the socket\n // is already OPEN, so onConnect won't run. Mirror live state into the\n // store to cover that path.\n if (ws.isConnected()) {\n setConnected(true);\n }\n })\n .catch(() => {\n if (cancelled) return;\n setConnected(false);\n });\n\n return () => {\n cancelled = true;\n removeOnConnect();\n removeOnDisconnect();\n subscriptions.forEach(({ channel, handler }) => {\n ws.unsubscribe(channel, addr, chainId, handler as AnyMessageHandler);\n });\n\n if (removeWsOwner(ws) === 0) {\n ws.disconnect();\n setConnected(false);\n }\n };\n }, [symmCoreClient, accountAddress, chainId, queryClient, setConnected]);\n\n return { isConnected };\n}\n","import { useMemo } from \"react\";\nimport type { Address, WalletClient } from \"viem\";\nimport { createSymmSDK, type SymmSDK } from \"@pear-protocol/symm-core\";\n\nimport type { SymmioSDKConfig } from \"../types/common\";\nimport { SymmContext, type SymmContextValue } from \"./context\";\nimport { useBinanceWs } from \"./hooks/use-binance-ws\";\nimport { useSymmWs } from \"./hooks/use-symm-ws\";\n\nfunction trimTrailingSlashes(value: string): string {\n return value.replace(/\\/+$/, \"\");\n}\n\nexport type SymmProviderProps = {\n chainId?: number;\n address?: Address;\n walletClient?: WalletClient;\n symmCoreConfig: {\n apiUrl: string;\n wsUrl?: string;\n };\n symmioConfig?: Partial<SymmioSDKConfig>;\n children: React.ReactNode;\n};\n\nexport function SymmProvider({\n chainId = 42161,\n address,\n walletClient,\n symmCoreConfig = {\n apiUrl: \"https://nginx-server-staging.up.railway.app\",\n wsUrl: \"wss://nginx-server-staging.up.railway.app\",\n },\n symmioConfig,\n children,\n}: SymmProviderProps) {\n const normalizedApiUrl = useMemo(\n () => trimTrailingSlashes(symmCoreConfig.apiUrl),\n [symmCoreConfig.apiUrl],\n );\n const normalizedWsUrl = useMemo(\n () => (symmCoreConfig.wsUrl ? trimTrailingSlashes(symmCoreConfig.wsUrl) : undefined),\n [symmCoreConfig.wsUrl],\n );\n\n const symmCoreClient = useMemo((): SymmSDK => {\n return createSymmSDK({\n apiUrl: normalizedApiUrl,\n wsUrl: normalizedWsUrl,\n defaultChainId: chainId,\n });\n }, [chainId, normalizedApiUrl, normalizedWsUrl]);\n\n const value = useMemo<SymmContextValue>(\n () => ({\n symmCoreClient,\n chainId,\n address,\n walletClient,\n symmioConfig,\n }),\n [symmCoreClient, chainId, address, walletClient, symmioConfig]\n );\n\n useBinanceWs({\n symmCoreClient,\n chainId,\n });\n\n useSymmWs({\n symmCoreClient,\n accountAddress: address,\n chainId,\n });\n\n return <SymmContext.Provider value={value}>{children}</SymmContext.Provider>;\n}\n"]}
1
+ {"version":3,"sources":["../../src/react/context.ts","../../src/utils/binance-symbol-map.ts","../../src/utils/binance-ws.ts","../../src/react/stores/use-binance-mark-price-store.ts","../../src/react/hooks/use-binance-ws.ts","../../src/react/query-keys.ts","../../src/react/stores/use-symm-ws-store.ts","../../src/react/hooks/use-symm-ws.ts","../../src/react/provider.tsx"],"names":["createContext","create","useEffect","useContext","useQueryClient","useMemo","createSymmSDK","jsx"],"mappings":"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","file":"provider.js","sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { Address, PublicClient, WalletClient } from \"viem\";\nimport type { SymmSDK } from \"@pear-protocol/symm-core\";\nimport type { SymmioSDKConfig } from \"../types/common\";\n\nexport type SymmContextValue = {\n symmCoreClient: SymmSDK | null;\n chainId: number;\n address?: `0x${string}`;\n walletClient?: WalletClient;\n symmioConfig?: Partial<SymmioSDKConfig>;\n};\n\nexport const SymmContext = createContext<SymmContextValue | null>(null);\n\nexport function useSymmContext(): SymmContextValue {\n const ctx = useContext(SymmContext);\n if (!ctx) {\n throw new Error(\"useSymmContext must be used within <SymmProvider>\");\n }\n return ctx;\n}\n","/**\n * Maps SYMM market symbols to Binance USD-M Futures symbols.\n *\n * Most SYMM markets use the same symbol format as Binance (e.g., \"BTCUSDT\").\n * The override table handles exceptions.\n */\n\nconst SYMBOL_OVERRIDES: Record<string, string> = {\n // Add overrides here as needed for SYMM markets that don't map 1:1 to Binance\n // e.g., 'SOME_SYMM_SYMBOL': 'BINANCE_SYMBOL',\n};\n\n// Symbols known to not exist on Binance USD-M Futures\nconst UNSUPPORTED_SYMBOLS = new Set<string>([\n]);\n\nexport interface BinanceSymbolResolution {\n symmSymbol: string;\n normalizedSymbol: string;\n binanceSymbol: string | null;\n supported: boolean;\n reason: 'missing_symbol' | 'unsupported_symbol' | 'invalid_symbol' | null;\n}\n\nexport function resolveBinanceSymbol(symmSymbol: string): BinanceSymbolResolution {\n if (!symmSymbol || !symmSymbol.trim()) {\n return {\n symmSymbol,\n normalizedSymbol: '',\n binanceSymbol: null,\n supported: false,\n reason: 'missing_symbol',\n };\n }\n\n const normalized = symmSymbol.toUpperCase().trim();\n\n if (!/^[A-Z0-9]+$/.test(normalized)) {\n return {\n symmSymbol,\n normalizedSymbol: normalized,\n binanceSymbol: null,\n supported: false,\n reason: 'invalid_symbol',\n };\n }\n\n if (UNSUPPORTED_SYMBOLS.has(normalized)) {\n return {\n symmSymbol,\n normalizedSymbol: normalized,\n binanceSymbol: null,\n supported: false,\n reason: 'unsupported_symbol',\n };\n }\n\n const binanceSymbol = SYMBOL_OVERRIDES[normalized]\n ?? (normalized.endsWith('USDT') ? normalized : `${normalized}USDT`);\n\n return {\n symmSymbol,\n normalizedSymbol: normalized,\n binanceSymbol,\n supported: true,\n reason: null,\n };\n}\n\nexport function getUnsupportedBinanceSymbols(symbols: string[]): string[] {\n return symbols.filter((symbol) => !resolveBinanceSymbol(symbol).supported);\n}\n\n/**\n * Maps a SYMM market symbol or asset name to its Binance USD-M Futures symbol.\n * Returns null if the symbol is not supported on Binance.\n */\nexport function toBinanceSymbol(symmSymbol: string): string | null {\n return resolveBinanceSymbol(symmSymbol).binanceSymbol;\n}\n\n/**\n * Checks if a SYMM symbol can be mapped to a Binance USD-M Futures symbol.\n */\nexport function isBinanceSupported(symmSymbol: string): boolean {\n return resolveBinanceSymbol(symmSymbol).supported;\n}\n","/**\n * Binance USD-M Futures WebSocket manager.\n *\n * Manages a single connection to wss://fstream.binance.com/market/ws and uses\n * Binance's dynamic subscribe/unsubscribe protocol to add or remove streams\n * without reconnecting.\n *\n * Supports:\n * - Kline (candlestick) streams: <symbol>@kline_<interval>\n * - Mark price streams: <symbol>@markPrice@1s\n *\n * Usage is through a module-level singleton (no auth required for public streams).\n */\n\nconst BINANCE_WS_URL = 'wss://fstream.binance.com/market/ws';\nconst RECONNECT_DELAYS = [1000, 2000, 4000, 8000, 16000, 30000];\nconst IDLE_CLOSE_DELAY_MS = 30_000;\nconst STALE_CONNECTION_MS = 30_000;\nconst STALE_CHECK_INTERVAL_MS = 10_000;\nconst RECONNECT_RESET_MS = 60_000;\n\nexport interface BinanceWsKline {\n symbol: string;\n interval: string;\n openTime: number;\n closeTime: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n isFinal: boolean;\n}\n\nexport type BinanceWsKlineCallback = (kline: BinanceWsKline) => void;\n\nexport interface BinanceWsMarkPrice {\n symbol: string;\n binanceSymbol?: string;\n markPrice: number;\n indexPrice: number;\n time: number;\n fundingRate: number;\n nextFundingTime: number;\n}\n\nexport type BinanceWsMarkPriceCallback = (data: BinanceWsMarkPrice) => void;\nexport type BinanceWsAllMarkPricesCallback = (\n data: BinanceWsMarkPrice[],\n) => void;\n\ntype StreamCallback = (data: any) => void;\n\ninterface BinanceMarkPriceTicker {\n s: string;\n p: string;\n i: string;\n E: number;\n r?: string;\n T?: number;\n}\n\ninterface StreamSubscription {\n callbacks: Map<string, StreamCallback>;\n}\n\nconst STABLE_QUOTES = ['USDT0', 'USDT', 'USDC', 'USDE', 'USDH', 'USD'];\n\nfunction normalizeBaseSymbol(symbol: string): string {\n const normalized = symbol.toUpperCase().trim();\n\n for (const quote of STABLE_QUOTES) {\n if (normalized.endsWith(quote) && normalized.length > quote.length) {\n return normalized.slice(0, -quote.length);\n }\n }\n\n return normalized;\n}\n\nfunction isBinanceMarkPriceTicker(\n value: unknown,\n): value is BinanceMarkPriceTicker {\n return Boolean(\n value &&\n typeof value === 'object' &&\n typeof (value as { s?: unknown }).s === 'string' &&\n typeof (value as { p?: unknown }).p === 'string' &&\n typeof (value as { i?: unknown }).i === 'string' &&\n typeof (value as { E?: unknown }).E === 'number',\n );\n}\n\nfunction extractTickers(payload: unknown): BinanceMarkPriceTicker[] {\n if (Array.isArray(payload)) {\n return payload.filter(isBinanceMarkPriceTicker);\n }\n\n if (payload && typeof payload === 'object') {\n const maybeData = (payload as { data?: unknown }).data;\n if (Array.isArray(maybeData)) {\n return maybeData.filter(isBinanceMarkPriceTicker);\n }\n\n return isBinanceMarkPriceTicker(payload) ? [payload] : [];\n }\n\n return [];\n}\n\nfunction extractWsPayload(payload: unknown): unknown {\n if (\n payload &&\n typeof payload === 'object' &&\n 'data' in payload\n ) {\n return (payload as { data?: unknown }).data ?? payload;\n }\n\n return payload;\n}\n\nfunction isKlinePayload(\n payload: unknown,\n): payload is {\n e: 'kline';\n s: string;\n k: {\n i: string;\n t: number;\n T: number;\n o: string;\n h: string;\n l: string;\n c: string;\n v: string;\n x: boolean;\n };\n} {\n return Boolean(\n payload &&\n typeof payload === 'object' &&\n (payload as { e?: unknown }).e === 'kline' &&\n typeof (payload as { s?: unknown }).s === 'string' &&\n (payload as { k?: unknown }).k &&\n typeof (payload as { k: { i?: unknown } }).k.i === 'string',\n );\n}\n\nfunction isMarkPricePayload(\n payload: unknown,\n): payload is {\n e: 'markPriceUpdate';\n s: string;\n} {\n return Boolean(\n payload &&\n typeof payload === 'object' &&\n (payload as { e?: unknown }).e === 'markPriceUpdate' &&\n typeof (payload as { s?: unknown }).s === 'string',\n );\n}\n\nexport class BinanceWsManager {\n private ws: WebSocket | null = null;\n private streams: Map<string, StreamSubscription> = new Map();\n private reconnectAttempt = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private idleCloseTimer: ReturnType<typeof setTimeout> | null = null;\n private staleCheckTimer: ReturnType<typeof setInterval> | null = null;\n private reconnectResetTimer: ReturnType<typeof setTimeout> | null = null;\n private intentionalClose = false;\n private pendingSubscribes: Set<string> = new Set();\n private lastMessageAt = 0;\n private idCounter = 0;\n\n /**\n * Subscribe to a kline stream. Returns an unsubscribe function.\n */\n subscribeKline(\n symbol: string,\n interval: string,\n cb: BinanceWsKlineCallback,\n ): () => void {\n const streamName = `${symbol.toLowerCase()}@kline_${interval}`;\n const id = this.generateId();\n\n const wrappedCb: StreamCallback = (raw: any) => {\n const k = raw.k;\n if (!k) return;\n cb({\n symbol: raw.s,\n interval: k.i,\n openTime: k.t,\n closeTime: k.T,\n open: parseFloat(k.o),\n high: parseFloat(k.h),\n low: parseFloat(k.l),\n close: parseFloat(k.c),\n volume: parseFloat(k.v),\n isFinal: k.x,\n });\n };\n\n this.addStreamCallback(streamName, id, wrappedCb);\n return () => this.removeStreamCallback(streamName, id);\n }\n\n /**\n * Subscribe to a mark price stream (1s updates). Returns an unsubscribe function.\n */\n subscribeMarkPrice(\n symbol: string,\n cb: BinanceWsMarkPriceCallback,\n ): () => void {\n const streamName = `${symbol.toLowerCase()}@markPrice@1s`;\n const id = this.generateId();\n\n const wrappedCb: StreamCallback = (raw: any) => {\n cb({\n symbol: normalizeBaseSymbol(raw.s),\n binanceSymbol: raw.s,\n markPrice: parseFloat(raw.p),\n indexPrice: parseFloat(raw.i),\n time: raw.E,\n fundingRate: parseFloat(raw.r ?? '0'),\n nextFundingTime: Number(raw.T ?? 0),\n });\n };\n\n this.addStreamCallback(streamName, id, wrappedCb);\n return () => this.removeStreamCallback(streamName, id);\n }\n\n /**\n * Subscribe to the all-market mark price stream (1s updates).\n * Returns an unsubscribe function.\n */\n subscribeAllMarkPrices(cb: BinanceWsAllMarkPricesCallback): () => void {\n const streamName = '!markPrice@arr@1s';\n const id = this.generateId();\n\n const wrappedCb: StreamCallback = (raw: any) => {\n cb(\n extractTickers(raw)\n .map((entry) => ({\n symbol: normalizeBaseSymbol(entry.s),\n binanceSymbol: entry.s,\n markPrice: parseFloat(entry.p),\n indexPrice: parseFloat(entry.i),\n time: entry.E,\n fundingRate: parseFloat(entry.r ?? '0'),\n nextFundingTime: Number(entry.T ?? 0),\n })),\n );\n };\n\n this.addStreamCallback(streamName, id, wrappedCb);\n return () => this.removeStreamCallback(streamName, id);\n }\n\n /**\n * Destroy the manager and close the connection.\n */\n destroy(): void {\n this.intentionalClose = true;\n this.clearReconnectTimer();\n this.clearIdleCloseTimer();\n this.clearStaleCheckTimer();\n this.clearReconnectResetTimer();\n this.pendingSubscribes.clear();\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n this.streams.clear();\n }\n\n // --- Private ---\n\n private generateId(): string {\n return `sub_${++this.idCounter}_${Date.now()}`;\n }\n\n private addStreamCallback(\n streamName: string,\n id: string,\n cb: StreamCallback,\n ): void {\n let sub = this.streams.get(streamName);\n const isNew = !sub;\n\n if (!sub) {\n sub = { callbacks: new Map() };\n this.streams.set(streamName, sub);\n }\n sub.callbacks.set(id, cb);\n\n if (isNew) {\n this.clearIdleCloseTimer();\n this.ensureConnected();\n this.sendSubscribe([streamName]);\n }\n }\n\n private removeStreamCallback(streamName: string, id: string): void {\n const sub = this.streams.get(streamName);\n if (!sub) return;\n\n sub.callbacks.delete(id);\n\n if (sub.callbacks.size === 0) {\n this.streams.delete(streamName);\n this.sendUnsubscribe([streamName]);\n\n this.scheduleIdleClose();\n }\n }\n\n private ensureConnected(): void {\n if (this.ws) {\n const state = this.ws.readyState;\n if (\n state === WebSocket.OPEN ||\n state === WebSocket.CONNECTING ||\n state === WebSocket.CLOSING\n ) {\n return;\n }\n }\n this.clearReconnectTimer();\n this.connect();\n }\n\n private connect(): void {\n if (typeof WebSocket === 'undefined') return;\n\n if (this.ws && this.ws.readyState !== WebSocket.CLOSED) {\n return;\n }\n\n this.intentionalClose = false;\n this.ws = new WebSocket(BINANCE_WS_URL);\n\n this.ws.onopen = () => {\n this.lastMessageAt = Date.now();\n this.startStaleCheck();\n this.scheduleReconnectReset();\n\n // Subscribe once to the deduped active stream set on initial connect\n // or reconnect. Binance supports live JSON SUBSCRIBE messages.\n const activeStreams = Array.from(\n new Set([...this.streams.keys(), ...this.pendingSubscribes]),\n );\n this.pendingSubscribes.clear();\n if (activeStreams.length > 0) {\n this.sendSubscribe(activeStreams);\n }\n };\n\n this.ws.onmessage = (event: MessageEvent) => {\n try {\n const data = JSON.parse(event.data as string);\n this.lastMessageAt = Date.now();\n this.resetReconnectAttempt();\n this.handleMessage(data);\n } catch {\n // Ignore parse errors\n }\n };\n\n this.ws.onclose = () => {\n const wasIntentional = this.intentionalClose;\n this.intentionalClose = false;\n this.ws = null;\n this.clearStaleCheckTimer();\n this.clearReconnectResetTimer();\n\n if (this.streams.size === 0) {\n return;\n }\n\n if (wasIntentional) {\n // Idle close raced a new subscriber. Reconnect immediately.\n this.connect();\n return;\n }\n\n this.scheduleReconnect();\n };\n\n this.ws.onerror = () => {\n // onclose will fire after onerror, reconnect handled there\n };\n }\n\n private handleMessage(data: any): void {\n // Binance sends kline events with { e: 'kline', s: 'BTCUSDT', k: {...} }\n // and mark price events with { e: 'markPriceUpdate', s: 'BTCUSDT', p: '...', ... }\n // or all-market mark price arrays for !markPrice@arr@1s.\n // Determine the stream name from the event type.\n\n const payload = extractWsPayload(data);\n\n if (Array.isArray(payload)) {\n this.dispatchToStream('!markPrice@arr@1s', payload);\n return;\n }\n\n if (isKlinePayload(payload)) {\n const k = payload.k;\n const streamName = `${payload.s.toLowerCase()}@kline_${k.i}`;\n this.dispatchToStream(streamName, payload);\n } else if (isMarkPricePayload(payload)) {\n const streamName = `${payload.s.toLowerCase()}@markPrice@1s`;\n this.dispatchToStream(streamName, payload);\n }\n // Ignore subscription confirmations and other system messages\n }\n\n private dispatchToStream(streamName: string, data: any): void {\n const sub = this.streams.get(streamName);\n if (!sub) return;\n\n sub.callbacks.forEach((cb) => {\n try {\n cb(data);\n } catch {\n // Ignore callback errors\n }\n });\n }\n\n private sendSubscribe(streams: string[]): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n streams.forEach((stream) => this.pendingSubscribes.add(stream));\n return;\n }\n\n const params = Array.from(new Set(streams));\n if (params.length === 0) return;\n\n this.ws.send(JSON.stringify({\n method: 'SUBSCRIBE',\n params,\n id: Date.now(),\n }));\n }\n\n private sendUnsubscribe(streams: string[]): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n // Remove from pending if not yet sent\n streams.forEach((stream) => this.pendingSubscribes.delete(stream));\n return;\n }\n\n const params = Array.from(new Set(streams));\n if (params.length === 0) return;\n\n this.ws.send(JSON.stringify({\n method: 'UNSUBSCRIBE',\n params,\n id: Date.now(),\n }));\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer) return;\n if (this.streams.size === 0) return; // No need to reconnect if no subscriptions\n\n const delay = RECONNECT_DELAYS[\n Math.min(this.reconnectAttempt, RECONNECT_DELAYS.length - 1)\n ];\n this.reconnectAttempt++;\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.connect();\n }, delay);\n }\n\n private scheduleIdleClose(): void {\n if (this.streams.size > 0 || this.idleCloseTimer) return;\n\n this.clearReconnectTimer();\n if (!this.ws) return;\n\n this.idleCloseTimer = setTimeout(() => {\n this.idleCloseTimer = null;\n if (this.streams.size > 0 || !this.ws) return;\n\n this.intentionalClose = true;\n this.ws.close();\n // onclose nulls this.ws and resets intentionalClose\n }, IDLE_CLOSE_DELAY_MS);\n }\n\n private startStaleCheck(): void {\n this.clearStaleCheckTimer();\n this.staleCheckTimer = setInterval(() => {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return;\n if (this.streams.size === 0) return;\n if (Date.now() - this.lastMessageAt < STALE_CONNECTION_MS) return;\n\n this.ws.close();\n }, STALE_CHECK_INTERVAL_MS);\n }\n\n private scheduleReconnectReset(): void {\n this.clearReconnectResetTimer();\n this.reconnectResetTimer = setTimeout(() => {\n this.reconnectResetTimer = null;\n this.resetReconnectAttempt();\n }, RECONNECT_RESET_MS);\n }\n\n private resetReconnectAttempt(): void {\n this.reconnectAttempt = 0;\n this.clearReconnectResetTimer();\n }\n\n private clearReconnectTimer(): void {\n if (!this.reconnectTimer) return;\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n private clearIdleCloseTimer(): void {\n if (!this.idleCloseTimer) return;\n clearTimeout(this.idleCloseTimer);\n this.idleCloseTimer = null;\n }\n\n private clearStaleCheckTimer(): void {\n if (!this.staleCheckTimer) return;\n clearInterval(this.staleCheckTimer);\n this.staleCheckTimer = null;\n }\n\n private clearReconnectResetTimer(): void {\n if (!this.reconnectResetTimer) return;\n clearTimeout(this.reconnectResetTimer);\n this.reconnectResetTimer = null;\n }\n}\n\n// Cross-module singleton — Binance public WS requires no authentication.\n// Stored on globalThis so duplicate SDK module instances (HMR, dual ESM/CJS\n// bundles, monorepo path mismatches) all share the same manager and we end up\n// with exactly one connection to wss://fstream.binance.com/market/ws per tab.\nconst BINANCE_WS_SINGLETON_KEY = '__pearBinanceWsManager__';\n\ntype GlobalWithBinanceManager = typeof globalThis & {\n [BINANCE_WS_SINGLETON_KEY]?: BinanceWsManager;\n};\n\nexport function getBinanceWsManager(): BinanceWsManager {\n const g = globalThis as GlobalWithBinanceManager;\n let manager = g[BINANCE_WS_SINGLETON_KEY];\n if (!manager) {\n manager = new BinanceWsManager();\n g[BINANCE_WS_SINGLETON_KEY] = manager;\n }\n return manager;\n}\n","import { create } from 'zustand';\nimport { getBinanceWsManager } from '../../utils/binance-ws';\n\ntype MarkPrices = Record<string, number>;\ntype FundingRates = Record<string, number>;\ntype NextFundingTimes = Record<string, number>;\ntype BinanceMarkPriceEntry = {\n symbol: string;\n binanceSymbol?: string;\n markPrice: number;\n fundingRate: number;\n nextFundingTime: number;\n};\n\ntype BinanceMarkPriceState = {\n markPrices: MarkPrices;\n fundingRates: FundingRates;\n nextFundingTimes: NextFundingTimes;\n subscribeSymbol: (symmSymbol: string, binanceSymbol: string) => void;\n unsubscribeSymbol: (symmSymbol: string, binanceSymbol: string) => void;\n};\n\nconst refCounts = new Map<string, number>();\nconst streamSymbols = new Map<string, Map<string, number>>();\nlet allMarkPricesRefCount = 0;\nlet allMarkPricesUnsubscribe: (() => void) | null = null;\n\nfunction normalizeBinanceSymbolKey(symbol: string): string {\n return symbol.toUpperCase().trim();\n}\n\nfunction getNextRefCount(binanceSymbol: string): number {\n return (refCounts.get(binanceSymbol) ?? 0) + 1;\n}\n\nfunction getPrevRefCount(binanceSymbol: string): number {\n return Math.max(0, (refCounts.get(binanceSymbol) ?? 0) - 1);\n}\n\nfunction addMappedSymbol(binanceSymbol: string, symmSymbol: string): void {\n const symbols = streamSymbols.get(binanceSymbol) ?? new Map<string, number>();\n symbols.set(symmSymbol, (symbols.get(symmSymbol) ?? 0) + 1);\n streamSymbols.set(binanceSymbol, symbols);\n}\n\nfunction removeMappedSymbol(binanceSymbol: string, symmSymbol: string): boolean {\n const symbols = streamSymbols.get(binanceSymbol);\n if (!symbols) return false;\n\n const currentCount = symbols.get(symmSymbol) ?? 0;\n if (currentCount <= 0) return false;\n\n if (currentCount === 1) {\n symbols.delete(symmSymbol);\n } else {\n symbols.set(symmSymbol, currentCount - 1);\n }\n\n if (symbols.size === 0) {\n streamSymbols.delete(binanceSymbol);\n } else {\n streamSymbols.set(binanceSymbol, symbols);\n }\n\n return true;\n}\n\nexport const useBinanceMarkPriceStore = create<BinanceMarkPriceState>((set) => ({\n markPrices: {},\n fundingRates: {},\n nextFundingTimes: {},\n\n subscribeSymbol: (symmSymbol, rawBinanceSymbol) => {\n const binanceSymbol = normalizeBinanceSymbolKey(rawBinanceSymbol);\n const nextRefCount = getNextRefCount(binanceSymbol);\n refCounts.set(binanceSymbol, nextRefCount);\n\n addMappedSymbol(binanceSymbol, symmSymbol);\n\n if (allMarkPricesRefCount === 0) {\n const wsManager = getBinanceWsManager();\n allMarkPricesUnsubscribe = wsManager.subscribeAllMarkPrices((entries: BinanceMarkPriceEntry[]) => {\n set((state) => {\n let nextMarkPrices: MarkPrices | null = null;\n let nextFundingRates: FundingRates | null = null;\n let nextFundingTimes: NextFundingTimes | null = null;\n\n entries.forEach((entry) => {\n const binanceSymbolKey = normalizeBinanceSymbolKey(\n entry.binanceSymbol ?? entry.symbol,\n );\n const mappedSymbols = streamSymbols.get(binanceSymbolKey);\n if (!mappedSymbols || mappedSymbols.size === 0) return;\n\n nextMarkPrices ??= { ...state.markPrices };\n nextFundingRates ??= { ...state.fundingRates };\n nextFundingTimes ??= { ...state.nextFundingTimes };\n mappedSymbols.forEach((_count, mappedSymbol) => {\n nextMarkPrices![mappedSymbol] = entry.markPrice;\n nextFundingRates![mappedSymbol] = entry.fundingRate;\n nextFundingTimes![mappedSymbol] = entry.nextFundingTime;\n });\n });\n\n if (!nextMarkPrices || !nextFundingRates || !nextFundingTimes) {\n return state;\n }\n\n return {\n markPrices: nextMarkPrices,\n fundingRates: nextFundingRates,\n nextFundingTimes: nextFundingTimes,\n };\n });\n });\n }\n\n allMarkPricesRefCount += 1;\n },\n\n unsubscribeSymbol: (symmSymbol, rawBinanceSymbol) => {\n const binanceSymbol = normalizeBinanceSymbolKey(rawBinanceSymbol);\n const removedSubscription = removeMappedSymbol(binanceSymbol, symmSymbol);\n if (!removedSubscription) {\n return;\n }\n\n const nextRefCount = getPrevRefCount(binanceSymbol);\n if (nextRefCount === 0) {\n refCounts.delete(binanceSymbol);\n } else {\n refCounts.set(binanceSymbol, nextRefCount);\n }\n\n allMarkPricesRefCount = Math.max(0, allMarkPricesRefCount - 1);\n if (allMarkPricesRefCount === 0) {\n allMarkPricesUnsubscribe?.();\n allMarkPricesUnsubscribe = null;\n }\n\n set((state) => {\n const hasMappedSymbol = Boolean(streamSymbols.get(binanceSymbol)?.has(symmSymbol));\n if (hasMappedSymbol) {\n return state;\n }\n\n if (\n state.markPrices[symmSymbol] == null &&\n state.fundingRates[symmSymbol] == null &&\n state.nextFundingTimes[symmSymbol] == null\n ) {\n return state;\n }\n\n const nextMarkPrices = { ...state.markPrices };\n const nextFundingRates = { ...state.fundingRates };\n const nextFundingTimes = { ...state.nextFundingTimes };\n delete nextMarkPrices[symmSymbol];\n delete nextFundingRates[symmSymbol];\n delete nextFundingTimes[symmSymbol];\n\n return {\n markPrices: nextMarkPrices,\n fundingRates: nextFundingRates,\n nextFundingTimes: nextFundingTimes,\n };\n });\n },\n}));\n","import { useEffect } from \"react\";\nimport type { SymmSDK } from \"@pear-protocol/symm-core\";\nimport { resolveBinanceSymbol } from \"../../utils/binance-symbol-map\";\nimport { useBinanceMarkPriceStore } from \"../stores/use-binance-mark-price-store\";\n\nconst BOOTSTRAP_RETRY_DELAYS_MS = [1_000, 2_000, 5_000];\n\n/**\n * Use case: Establish Binance mark-price WS subscriptions at provider level.\n * Subscribes to all SYMM hedger symbols for the active chain and feeds the shared store.\n */\nexport function useBinanceWs(params: {\n symmCoreClient: SymmSDK | null;\n chainId: number;\n}) {\n const { symmCoreClient, chainId } = params;\n const subscribeSymbol = useBinanceMarkPriceStore((state) => state.subscribeSymbol);\n const unsubscribeSymbol = useBinanceMarkPriceStore((state) => state.unsubscribeSymbol);\n\n useEffect(() => {\n if (!symmCoreClient) {\n return;\n }\n\n let cancelled = false;\n let subscribedPairs: Array<readonly [string, string]> = [];\n let retryTimer: ReturnType<typeof setTimeout> | null = null;\n\n const run = async (attempt = 0) => {\n try {\n const result = await symmCoreClient.markets.listSymmHedger({ chainId });\n if (cancelled) {\n return;\n }\n\n const uniqueSymbols = Array.from(\n new Set(\n result.markets\n .map((market) => market.symbol)\n .filter((symbol): symbol is string => !!symbol)\n )\n );\n\n subscribedPairs = uniqueSymbols\n .map((symbol) => {\n const binanceSymbol = resolveBinanceSymbol(symbol).binanceSymbol;\n if (!binanceSymbol) return null;\n return [symbol, binanceSymbol] as const;\n })\n .filter((entry): entry is readonly [string, string] => !!entry);\n\n subscribedPairs.forEach(([symbol, binanceSymbol]) => {\n subscribeSymbol(symbol, binanceSymbol);\n });\n } catch {\n const delay = BOOTSTRAP_RETRY_DELAYS_MS[attempt];\n if (cancelled || delay == null) {\n return;\n }\n\n retryTimer = setTimeout(() => {\n retryTimer = null;\n void run(attempt + 1);\n }, delay);\n }\n };\n\n void run();\n\n return () => {\n cancelled = true;\n if (retryTimer) {\n clearTimeout(retryTimer);\n }\n subscribedPairs.forEach(([symbol, binanceSymbol]) => {\n unsubscribeSymbol(symbol, binanceSymbol);\n });\n };\n }, [symmCoreClient, chainId, subscribeSymbol, unsubscribeSymbol]);\n}\n","import type { GetSymmHedgerMarketsRequest } from '@pear-protocol/symm-core';\nimport type { Address, Hex } from 'viem';\n\nexport const symmKeys = {\n all: ['symm'] as const,\n balancesRoot: ['symm', 'balances'] as const,\n accountSummaryRoot: ['symm', 'accountSummary'] as const,\n accountDataRoot: ['symm', 'accountData'] as const,\n approvalRoot: ['symm', 'approval'] as const,\n positionsRoot: ['symm', 'positions'] as const,\n openOrdersRoot: ['symm', 'openOrders'] as const,\n tradeHistoryRoot: ['symm', 'tradeHistory'] as const,\n portfolioRoot: ['symm', 'portfolio'] as const,\n tpslOrdersRoot: ['symm', 'tpslOrders'] as const,\n twapOrdersRoot: ['symm', 'twapOrders'] as const,\n triggerOrdersRoot: ['symm', 'triggerOrders'] as const,\n accounts: (address?: Address, chainId?: number) =>\n ['symm', 'accounts', address, chainId] as const,\n accountsApi: (address?: Address, chainId?: number) =>\n ['symm', 'accountsApi', address, chainId] as const,\n accountsLength: (address?: Address, chainId?: number) =>\n ['symm', 'accountsLength', address, chainId] as const,\n accountsWithPositions: (address?: Address, chainId?: number) =>\n ['symm', 'accountsWithPositions', address, chainId] as const,\n accountSummary: (address?: Address, chainId?: number) =>\n ['symm', 'accountSummary', address, chainId] as const,\n accountData: (address?: Address, chainId?: number, upnl?: string) =>\n ['symm', 'accountData', address, chainId, upnl] as const,\n signature: (address?: Address, chainId?: number) =>\n ['symm', 'signature', address, chainId] as const,\n auth: (accountAddress?: Address, chainId?: number, signerAddress?: Address) =>\n ['symm', 'auth', accountAddress, chainId, signerAddress] as const,\n approval: (\n owner?: Address,\n spender?: Address,\n chainId?: number,\n token?: Address\n ) => ['symm', 'approval', owner, spender, chainId, token] as const,\n balances: (\n address?: Address,\n chainId?: number,\n multiAccountAddress?: Address\n ) => multiAccountAddress === undefined\n ? ['symm', 'balances', address, chainId] as const\n : ['symm', 'balances', address, chainId, multiAccountAddress] as const,\n positions: (params?: {\n accountAddress?: Address;\n address?: Address;\n chainId?: number;\n }) => ['symm', 'positions', params] as const,\n openOrders: (params?: {\n accountAddress?: Address;\n address?: Address;\n chainId?: number;\n }) => ['symm', 'openOrders', params] as const,\n tradeHistory: (params?: {\n accountAddress?: Address;\n address?: Address;\n chainId?: number;\n }) => ['symm', 'tradeHistory', params] as const,\n tpslOrders: (address?: Address, chainId?: number) =>\n ['symm', 'tpslOrders', address, chainId] as const,\n tpslOrdersList: (params?: {\n accountAddress?: Address;\n address?: Address;\n positionId?: string;\n type?: string;\n status?: string;\n chainId?: number;\n }) => ['symm', 'tpslOrders', params] as const,\n twapOrders: (address?: Address, chainId?: number) =>\n ['symm', 'twapOrders', address, chainId] as const,\n triggerOrders: (params?: {\n accountAddress?: Address;\n address?: Address;\n status?: string;\n limit?: number;\n offset?: number;\n chainId?: number;\n }) => ['symm', 'triggerOrders', params] as const,\n triggerConfig: (orderId?: string) =>\n ['symm', 'triggerConfig', orderId] as const,\n markets: (chainId?: number, search?: string, pageSize?: string) =>\n ['symm', 'markets', chainId, search, pageSize] as const,\n hedgerMarketById: (id?: number, chainId?: number) =>\n ['symm', 'hedgerMarketById', id, chainId] as const,\n hedgerMarketBySymbol: (symbol?: string, chainId?: number) =>\n ['symm', 'hedgerMarketBySymbol', symbol, chainId] as const,\n lockedParams: (marketName?: string, leverage?: number, chainId?: number) =>\n ['symm', 'lockedParams', marketName, leverage, chainId] as const,\n hedgerMarkets: (request?: GetSymmHedgerMarketsRequest) =>\n ['symm', 'hedgerMarkets', request] as const,\n fundingRates: (chainId?: number) => ['symm', 'fundingRates', chainId] as const,\n fundingPayments: (params?: {\n address?: Address;\n positionId?: string;\n chainId?: number;\n limit?: number;\n offset?: number;\n }) => ['symm', 'fundingPayments', params] as const,\n fundingHistory: (params?: {\n chainId?: number;\n period?: string;\n longSymbols?: string;\n shortSymbols?: string;\n interval?: string;\n weightMode?: string;\n includeContributions?: boolean;\n }) => ['symm', 'fundingHistory', params] as const,\n portfolio: (params?: {\n accountAddress?: Address;\n address?: Address;\n chainId?: number;\n }) => ['symm', 'portfolio', params] as const,\n notifications: (params?: {\n accountAddress?: Address;\n address?: Address;\n chainId?: number;\n }) => ['symm', 'notifications', params] as const,\n unreadCount: (params?: {\n accountAddress?: Address;\n address?: Address;\n chainId?: number;\n }) => ['symm', 'unreadCount', params] as const,\n availableMargin: (address?: Address, chainId?: number) =>\n ['symm', 'availableMargin', address, chainId] as const,\n pendingIds: (address?: Address, chainId?: number) =>\n ['symm', 'pendingIds', address, chainId] as const,\n pendingInstantOpens: (accountAddress?: Address, chainId?: number) =>\n ['symm', 'pendingInstantOpens', accountAddress, chainId] as const,\n twapOrder: (orderId?: string) =>\n ['symm', 'twapOrder', orderId] as const,\n delegation: (\n account?: Address,\n target?: Address,\n selectors?: readonly Hex[],\n chainId?: number\n ) => ['symm', 'delegation', account, target, selectors, chainId] as const,\n chartMetadata: (symbolsKey: string, positionKey: string) =>\n ['symm', 'chartMetadata', symbolsKey, positionKey] as const,\n};\n","import { create } from 'zustand';\n\ntype SymmWsState = {\n isConnected: boolean;\n setConnected: (isConnected: boolean) => void;\n};\n\nexport const useSymmWsStore = create<SymmWsState>((set) => ({\n isConnected: false,\n setConnected: (isConnected) => set({ isConnected }),\n}));\n","import { useContext, useEffect } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport type { Address } from \"viem\";\nimport type {\n SymmSDK,\n WebSocketChannel,\n WebSocketChannelData,\n WebSocketDataMessage,\n} from \"@pear-protocol/symm-core\";\nimport { SymmContext } from \"../context\";\nimport { symmKeys } from \"../query-keys\";\nimport { useSymmWsStore } from \"../stores/use-symm-ws-store\";\n\ntype SymmWsClient = NonNullable<SymmSDK[\"ws\"]>;\ntype MessageHandler<C extends WebSocketChannel> = (\n data: WebSocketChannelData[C],\n message: WebSocketDataMessage,\n) => void;\ntype AnyMessageHandler = MessageHandler<WebSocketChannel>;\ntype ChannelSubscription<C extends WebSocketChannel = WebSocketChannel> = {\n channel: C;\n handler: MessageHandler<C>;\n};\n\nconst wsOwnerCounts = new WeakMap<SymmWsClient, number>();\nconst wsConnectPromises = new WeakMap<SymmWsClient, Promise<void>>();\n\nfunction addWsOwner(ws: SymmWsClient): void {\n wsOwnerCounts.set(ws, (wsOwnerCounts.get(ws) ?? 0) + 1);\n}\n\nfunction removeWsOwner(ws: SymmWsClient): number {\n const nextCount = Math.max(0, (wsOwnerCounts.get(ws) ?? 0) - 1);\n if (nextCount === 0) {\n wsOwnerCounts.delete(ws);\n } else {\n wsOwnerCounts.set(ws, nextCount);\n }\n return nextCount;\n}\n\nfunction connectShared(ws: SymmWsClient): Promise<void> {\n if (ws.isConnected()) {\n return Promise.resolve();\n }\n\n const existing = wsConnectPromises.get(ws);\n if (existing) {\n return existing;\n }\n\n const promise = ws.connect().finally(() => {\n wsConnectPromises.delete(ws);\n });\n wsConnectPromises.set(ws, promise);\n return promise;\n}\n\n/**\n * Use case: Connect and manage SYMM WebSocket subscriptions for realtime updates.\n */\n\nexport function useSymmWs(\n params: {\n symmCoreClient?: SymmSDK | null;\n accountAddress?: Address;\n chainId?: number;\n } = {}\n) {\n const ctx = useContext(SymmContext);\n const queryClient = useQueryClient();\n const isConnected = useSymmWsStore((state) => state.isConnected);\n const setConnected = useSymmWsStore((state) => state.setConnected);\n const symmCoreClient = params.symmCoreClient ?? ctx?.symmCoreClient ?? null;\n const accountAddress = params.accountAddress ?? ctx?.address;\n const chainId = params.chainId ?? ctx?.chainId ?? 42161;\n\n useEffect(() => {\n if (!symmCoreClient || !accountAddress) {\n setConnected(false);\n return;\n }\n\n const ws = symmCoreClient.ws;\n const addr = accountAddress as string;\n let cancelled = false;\n\n addWsOwner(ws);\n\n const removeOnConnect = ws.onConnect(() => setConnected(true));\n const removeOnDisconnect = ws.onDisconnect(() => setConnected(false));\n const subscriptions: ChannelSubscription[] = [];\n\n const addSubscription = <C extends WebSocketChannel>(\n channel: C,\n handler: MessageHandler<C>,\n ) => {\n ws.subscribe(channel, addr, chainId, handler);\n subscriptions.push({ channel, handler } as ChannelSubscription);\n };\n\n addSubscription(\"positions\", () => {\n queryClient.invalidateQueries({ queryKey: symmKeys.positionsRoot });\n });\n addSubscription(\"open-orders\", () => {\n queryClient.invalidateQueries({ queryKey: symmKeys.openOrdersRoot });\n });\n addSubscription(\"trades\", () => {\n queryClient.invalidateQueries({ queryKey: symmKeys.tradeHistoryRoot });\n });\n addSubscription(\"account-summary\", () => {\n queryClient.invalidateQueries({\n queryKey: symmKeys.balances(accountAddress, chainId),\n });\n queryClient.invalidateQueries({\n queryKey: symmKeys.accountSummary(accountAddress, chainId),\n });\n });\n addSubscription(\"notifications\", () => {\n queryClient.invalidateQueries({\n queryKey: symmKeys.notifications({ accountAddress, chainId }),\n });\n queryClient.invalidateQueries({\n queryKey: symmKeys.unreadCount({ accountAddress, chainId }),\n });\n });\n addSubscription(\"tpsl\", () => {\n queryClient.invalidateQueries({ queryKey: symmKeys.tpslOrdersRoot });\n queryClient.invalidateQueries({ queryKey: symmKeys.openOrdersRoot });\n });\n addSubscription(\"twap-orders\", () => {\n queryClient.invalidateQueries({ queryKey: symmKeys.twapOrdersRoot });\n queryClient.invalidateQueries({ queryKey: symmKeys.openOrdersRoot });\n });\n addSubscription(\"trigger-orders\", () => {\n queryClient.invalidateQueries({ queryKey: symmKeys.triggerOrdersRoot });\n queryClient.invalidateQueries({ queryKey: symmKeys.openOrdersRoot });\n });\n addSubscription(\"executions\", () => {\n queryClient.invalidateQueries({ queryKey: symmKeys.positionsRoot });\n queryClient.invalidateQueries({ queryKey: symmKeys.portfolioRoot });\n });\n\n void connectShared(ws)\n .then(() => {\n if (cancelled) return;\n // connect() resolves immediately without firing onopen when the socket\n // is already OPEN, so onConnect won't run. Mirror live state into the\n // store to cover that path.\n if (ws.isConnected()) {\n setConnected(true);\n }\n })\n .catch(() => {\n if (cancelled) return;\n setConnected(false);\n });\n\n return () => {\n cancelled = true;\n removeOnConnect();\n removeOnDisconnect();\n subscriptions.forEach(({ channel, handler }) => {\n ws.unsubscribe(channel, addr, chainId, handler as AnyMessageHandler);\n });\n\n if (removeWsOwner(ws) === 0) {\n ws.disconnect();\n setConnected(false);\n }\n };\n }, [symmCoreClient, accountAddress, chainId, queryClient, setConnected]);\n\n return { isConnected };\n}\n","import { useMemo } from \"react\";\nimport type { Address, WalletClient } from \"viem\";\nimport { createSymmSDK, type SymmSDK } from \"@pear-protocol/symm-core\";\n\nimport type { SymmioSDKConfig } from \"../types/common\";\nimport { SymmContext, type SymmContextValue } from \"./context\";\nimport { useBinanceWs } from \"./hooks/use-binance-ws\";\nimport { useSymmWs } from \"./hooks/use-symm-ws\";\n\nfunction trimTrailingSlashes(value: string): string {\n return value.replace(/\\/+$/, \"\");\n}\n\nexport type SymmProviderProps = {\n chainId?: number;\n address?: Address;\n walletClient?: WalletClient;\n symmCoreConfig: {\n apiUrl: string;\n wsUrl?: string;\n };\n symmioConfig?: Partial<SymmioSDKConfig>;\n children: React.ReactNode;\n};\n\nexport function SymmProvider({\n chainId = 42161,\n address,\n walletClient,\n symmCoreConfig = {\n apiUrl: \"https://nginx-server-staging.up.railway.app\",\n wsUrl: \"wss://nginx-server-staging.up.railway.app\",\n },\n symmioConfig,\n children,\n}: SymmProviderProps) {\n const normalizedApiUrl = useMemo(\n () => trimTrailingSlashes(symmCoreConfig.apiUrl),\n [symmCoreConfig.apiUrl],\n );\n const normalizedWsUrl = useMemo(\n () => (symmCoreConfig.wsUrl ? trimTrailingSlashes(symmCoreConfig.wsUrl) : undefined),\n [symmCoreConfig.wsUrl],\n );\n\n const symmCoreClient = useMemo((): SymmSDK => {\n return createSymmSDK({\n apiUrl: normalizedApiUrl,\n wsUrl: normalizedWsUrl,\n defaultChainId: chainId,\n });\n }, [chainId, normalizedApiUrl, normalizedWsUrl]);\n\n const value = useMemo<SymmContextValue>(\n () => ({\n symmCoreClient,\n chainId,\n address,\n walletClient,\n symmioConfig,\n }),\n [symmCoreClient, chainId, address, walletClient, symmioConfig]\n );\n\n useBinanceWs({\n symmCoreClient,\n chainId,\n });\n\n useSymmWs({\n symmCoreClient,\n accountAddress: address,\n chainId,\n });\n\n return <SymmContext.Provider value={value}>{children}</SymmContext.Provider>;\n}\n"]}