@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.
- package/dist/index.d.mts +49 -1
- package/dist/index.d.ts +49 -1
- package/dist/index.js +191 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +187 -1
- package/dist/index.mjs.map +1 -1
- package/dist/react/index.d.mts +127 -36
- package/dist/react/index.d.ts +127 -36
- package/dist/react/index.js +486 -73
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +481 -75
- package/dist/react/index.mjs.map +1 -1
- package/dist/react/provider.js +70 -25
- package/dist/react/provider.js.map +1 -1
- package/dist/react/provider.mjs +70 -25
- package/dist/react/provider.mjs.map +1 -1
- package/package.json +2 -2
package/dist/react/provider.js
CHANGED
|
@@ -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
|
|
229
|
-
|
|
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
|
-
|
|
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
|
|
401
|
+
var BINANCE_WS_SINGLETON_KEY = "__pearBinanceWsManager__";
|
|
368
402
|
function getBinanceWsManager() {
|
|
369
|
-
|
|
370
|
-
|
|
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
|
|
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
|
-
|
|
381
|
-
|
|
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 =
|
|
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
|
|
436
|
-
|
|
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 =
|
|
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
|
-
|
|
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"]}
|