@pear-protocol/symmio-client 0.3.15 → 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.js +11 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +11 -2
- package/dist/index.mjs.map +1 -1
- package/dist/react/index.js +57 -17
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +57 -17
- package/dist/react/index.mjs.map +1 -1
- package/dist/react/provider.js +46 -15
- package/dist/react/provider.js.map +1 -1
- package/dist/react/provider.mjs +46 -15
- 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();
|
|
@@ -242,9 +247,9 @@ var BinanceWsManager = class {
|
|
|
242
247
|
this.intentionalClose = false;
|
|
243
248
|
this.ws = new WebSocket(BINANCE_WS_URL);
|
|
244
249
|
this.ws.onopen = () => {
|
|
245
|
-
this.reconnectAttempt = 0;
|
|
246
250
|
this.lastMessageAt = Date.now();
|
|
247
251
|
this.startStaleCheck();
|
|
252
|
+
this.scheduleReconnectReset();
|
|
248
253
|
const activeStreams = Array.from(
|
|
249
254
|
/* @__PURE__ */ new Set([...this.streams.keys(), ...this.pendingSubscribes])
|
|
250
255
|
);
|
|
@@ -257,6 +262,7 @@ var BinanceWsManager = class {
|
|
|
257
262
|
try {
|
|
258
263
|
const data = JSON.parse(event.data);
|
|
259
264
|
this.lastMessageAt = Date.now();
|
|
265
|
+
this.resetReconnectAttempt();
|
|
260
266
|
this.handleMessage(data);
|
|
261
267
|
} catch {
|
|
262
268
|
}
|
|
@@ -266,6 +272,7 @@ var BinanceWsManager = class {
|
|
|
266
272
|
this.intentionalClose = false;
|
|
267
273
|
this.ws = null;
|
|
268
274
|
this.clearStaleCheckTimer();
|
|
275
|
+
this.clearReconnectResetTimer();
|
|
269
276
|
if (this.streams.size === 0) {
|
|
270
277
|
return;
|
|
271
278
|
}
|
|
@@ -359,6 +366,17 @@ var BinanceWsManager = class {
|
|
|
359
366
|
this.ws.close();
|
|
360
367
|
}, STALE_CHECK_INTERVAL_MS);
|
|
361
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
|
+
}
|
|
362
380
|
clearReconnectTimer() {
|
|
363
381
|
if (!this.reconnectTimer) return;
|
|
364
382
|
clearTimeout(this.reconnectTimer);
|
|
@@ -374,6 +392,11 @@ var BinanceWsManager = class {
|
|
|
374
392
|
clearInterval(this.staleCheckTimer);
|
|
375
393
|
this.staleCheckTimer = null;
|
|
376
394
|
}
|
|
395
|
+
clearReconnectResetTimer() {
|
|
396
|
+
if (!this.reconnectResetTimer) return;
|
|
397
|
+
clearTimeout(this.reconnectResetTimer);
|
|
398
|
+
this.reconnectResetTimer = null;
|
|
399
|
+
}
|
|
377
400
|
};
|
|
378
401
|
var BINANCE_WS_SINGLETON_KEY = "__pearBinanceWsManager__";
|
|
379
402
|
function getBinanceWsManager() {
|
|
@@ -391,15 +414,8 @@ var refCounts = /* @__PURE__ */ new Map();
|
|
|
391
414
|
var streamSymbols = /* @__PURE__ */ new Map();
|
|
392
415
|
var allMarkPricesRefCount = 0;
|
|
393
416
|
var allMarkPricesUnsubscribe = null;
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
const normalized = symbol.toUpperCase().trim();
|
|
397
|
-
for (const quote of STABLE_QUOTES2) {
|
|
398
|
-
if (normalized.endsWith(quote) && normalized.length > quote.length) {
|
|
399
|
-
return normalized.slice(0, -quote.length);
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
return normalized;
|
|
417
|
+
function normalizeBinanceSymbolKey(symbol) {
|
|
418
|
+
return symbol.toUpperCase().trim();
|
|
403
419
|
}
|
|
404
420
|
function getNextRefCount(binanceSymbol) {
|
|
405
421
|
return (refCounts.get(binanceSymbol) ?? 0) + 1;
|
|
@@ -434,7 +450,7 @@ var useBinanceMarkPriceStore = zustand.create((set) => ({
|
|
|
434
450
|
fundingRates: {},
|
|
435
451
|
nextFundingTimes: {},
|
|
436
452
|
subscribeSymbol: (symmSymbol, rawBinanceSymbol) => {
|
|
437
|
-
const binanceSymbol =
|
|
453
|
+
const binanceSymbol = normalizeBinanceSymbolKey(rawBinanceSymbol);
|
|
438
454
|
const nextRefCount = getNextRefCount(binanceSymbol);
|
|
439
455
|
refCounts.set(binanceSymbol, nextRefCount);
|
|
440
456
|
addMappedSymbol(binanceSymbol, symmSymbol);
|
|
@@ -446,8 +462,10 @@ var useBinanceMarkPriceStore = zustand.create((set) => ({
|
|
|
446
462
|
let nextFundingRates = null;
|
|
447
463
|
let nextFundingTimes = null;
|
|
448
464
|
entries.forEach((entry) => {
|
|
449
|
-
const
|
|
450
|
-
|
|
465
|
+
const binanceSymbolKey = normalizeBinanceSymbolKey(
|
|
466
|
+
entry.binanceSymbol ?? entry.symbol
|
|
467
|
+
);
|
|
468
|
+
const mappedSymbols = streamSymbols.get(binanceSymbolKey);
|
|
451
469
|
if (!mappedSymbols || mappedSymbols.size === 0) return;
|
|
452
470
|
nextMarkPrices ??= { ...state.markPrices };
|
|
453
471
|
nextFundingRates ??= { ...state.fundingRates };
|
|
@@ -472,7 +490,7 @@ var useBinanceMarkPriceStore = zustand.create((set) => ({
|
|
|
472
490
|
allMarkPricesRefCount += 1;
|
|
473
491
|
},
|
|
474
492
|
unsubscribeSymbol: (symmSymbol, rawBinanceSymbol) => {
|
|
475
|
-
const binanceSymbol =
|
|
493
|
+
const binanceSymbol = normalizeBinanceSymbolKey(rawBinanceSymbol);
|
|
476
494
|
const removedSubscription = removeMappedSymbol(binanceSymbol, symmSymbol);
|
|
477
495
|
if (!removedSubscription) {
|
|
478
496
|
return;
|
|
@@ -512,6 +530,7 @@ var useBinanceMarkPriceStore = zustand.create((set) => ({
|
|
|
512
530
|
}));
|
|
513
531
|
|
|
514
532
|
// src/react/hooks/use-binance-ws.ts
|
|
533
|
+
var BOOTSTRAP_RETRY_DELAYS_MS = [1e3, 2e3, 5e3];
|
|
515
534
|
function useBinanceWs(params) {
|
|
516
535
|
const { symmCoreClient, chainId } = params;
|
|
517
536
|
const subscribeSymbol = useBinanceMarkPriceStore((state) => state.subscribeSymbol);
|
|
@@ -522,7 +541,8 @@ function useBinanceWs(params) {
|
|
|
522
541
|
}
|
|
523
542
|
let cancelled = false;
|
|
524
543
|
let subscribedPairs = [];
|
|
525
|
-
|
|
544
|
+
let retryTimer = null;
|
|
545
|
+
const run = async (attempt = 0) => {
|
|
526
546
|
try {
|
|
527
547
|
const result = await symmCoreClient.markets.listSymmHedger({ chainId });
|
|
528
548
|
if (cancelled) {
|
|
@@ -542,11 +562,22 @@ function useBinanceWs(params) {
|
|
|
542
562
|
subscribeSymbol(symbol, binanceSymbol);
|
|
543
563
|
});
|
|
544
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);
|
|
545
573
|
}
|
|
546
574
|
};
|
|
547
575
|
void run();
|
|
548
576
|
return () => {
|
|
549
577
|
cancelled = true;
|
|
578
|
+
if (retryTimer) {
|
|
579
|
+
clearTimeout(retryTimer);
|
|
580
|
+
}
|
|
550
581
|
subscribedPairs.forEach(([symbol, binanceSymbol]) => {
|
|
551
582
|
unsubscribeSymbol(symbol, binanceSymbol);
|
|
552
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) {\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.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 const wasIntentional = this.intentionalClose;\n this.intentionalClose = false;\n this.ws = null;\n this.clearStaleCheckTimer();\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 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// 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>;\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"]}
|