@pear-protocol/symmio-client 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -533,12 +533,6 @@ var useSymmWsStore = create((set) => ({
533
533
  function asUnsubscribeFn(value) {
534
534
  return typeof value === "function" ? value : null;
535
535
  }
536
- function logSymmWs(event, details) {
537
- if (typeof window === "undefined") {
538
- return;
539
- }
540
- console.debug("[symm-ws]", event, details ?? {});
541
- }
542
536
  function useSymmWs(params = {}) {
543
537
  const ctx = useContext(SymmContext);
544
538
  const queryClient = useQueryClient();
@@ -549,11 +543,6 @@ function useSymmWs(params = {}) {
549
543
  const chainId = params.chainId ?? ctx?.chainId ?? 42161;
550
544
  useEffect(() => {
551
545
  if (!symmCoreClient || !accountAddress) {
552
- logSymmWs("setup:skip", {
553
- hasClient: !!symmCoreClient,
554
- accountAddress,
555
- chainId
556
- });
557
546
  setConnected(false);
558
547
  return;
559
548
  }
@@ -561,52 +550,21 @@ function useSymmWs(params = {}) {
561
550
  const addr = accountAddress;
562
551
  const unsubscribers = [];
563
552
  let cancelled = false;
564
- logSymmWs("setup:start", {
565
- accountAddress: addr,
566
- chainId,
567
- alreadyConnected: typeof ws.isConnected === "function" ? ws.isConnected() : void 0
568
- });
569
553
  const removeOnConnect = ws.onConnect(() => {
570
- logSymmWs("connection:connected", {
571
- accountAddress: addr,
572
- chainId
573
- });
574
554
  setConnected(true);
575
555
  });
576
556
  const removeOnDisconnect = ws.onDisconnect(() => {
577
- logSymmWs("connection:disconnected", {
578
- accountAddress: addr,
579
- chainId
580
- });
581
557
  setConnected(false);
582
558
  });
583
- const removeOnError = asUnsubscribeFn(
584
- ws.onError?.((error) => {
585
- logSymmWs("connection:error", {
586
- accountAddress: addr,
587
- chainId,
588
- error: error instanceof Error ? error.message : String(error)
589
- });
590
- })
591
- );
592
- const removeOnWelcome = asUnsubscribeFn(
593
- ws.onWelcome?.((message) => {
594
- logSymmWs("connection:welcome", {
595
- accountAddress: addr,
596
- chainId,
597
- message
598
- });
599
- })
600
- );
559
+ const removeOnError = asUnsubscribeFn(ws.onError?.(() => {
560
+ }));
561
+ const removeOnWelcome = asUnsubscribeFn(ws.onWelcome?.(() => {
562
+ }));
601
563
  unsubscribers.push(removeOnConnect, removeOnDisconnect);
602
564
  if (removeOnError) unsubscribers.push(removeOnError);
603
565
  if (removeOnWelcome) unsubscribers.push(removeOnWelcome);
604
566
  const positionsUnsub = asUnsubscribeFn(
605
567
  ws.subscribeToPositions(addr, chainId, () => {
606
- logSymmWs("message:positions", {
607
- accountAddress: addr,
608
- chainId
609
- });
610
568
  queryClient.invalidateQueries({
611
569
  queryKey: symmKeys.positionsRoot
612
570
  });
@@ -615,10 +573,6 @@ function useSymmWs(params = {}) {
615
573
  if (positionsUnsub) unsubscribers.push(positionsUnsub);
616
574
  const openOrdersUnsub = asUnsubscribeFn(
617
575
  ws.subscribeToOpenOrders(addr, chainId, () => {
618
- logSymmWs("message:open-orders", {
619
- accountAddress: addr,
620
- chainId
621
- });
622
576
  queryClient.invalidateQueries({
623
577
  queryKey: symmKeys.openOrdersRoot
624
578
  });
@@ -627,10 +581,6 @@ function useSymmWs(params = {}) {
627
581
  if (openOrdersUnsub) unsubscribers.push(openOrdersUnsub);
628
582
  const tradesUnsub = asUnsubscribeFn(
629
583
  ws.subscribeToTrades(addr, chainId, () => {
630
- logSymmWs("message:trades", {
631
- accountAddress: addr,
632
- chainId
633
- });
634
584
  queryClient.invalidateQueries({
635
585
  queryKey: symmKeys.tradeHistoryRoot
636
586
  });
@@ -639,10 +589,6 @@ function useSymmWs(params = {}) {
639
589
  if (tradesUnsub) unsubscribers.push(tradesUnsub);
640
590
  const accountSummaryUnsub = asUnsubscribeFn(
641
591
  ws.subscribeToAccountSummary(addr, chainId, () => {
642
- logSymmWs("message:account-summary", {
643
- accountAddress: addr,
644
- chainId
645
- });
646
592
  queryClient.invalidateQueries({
647
593
  queryKey: symmKeys.balances(accountAddress, chainId)
648
594
  });
@@ -654,10 +600,6 @@ function useSymmWs(params = {}) {
654
600
  if (accountSummaryUnsub) unsubscribers.push(accountSummaryUnsub);
655
601
  const notificationsUnsub = asUnsubscribeFn(
656
602
  ws.subscribeToNotifications(addr, chainId, () => {
657
- logSymmWs("message:notifications", {
658
- accountAddress: addr,
659
- chainId
660
- });
661
603
  queryClient.invalidateQueries({
662
604
  queryKey: symmKeys.notifications({ accountAddress, chainId })
663
605
  });
@@ -669,10 +611,6 @@ function useSymmWs(params = {}) {
669
611
  if (notificationsUnsub) unsubscribers.push(notificationsUnsub);
670
612
  const tpslUnsub = asUnsubscribeFn(
671
613
  ws.subscribeToTpsl(addr, chainId, () => {
672
- logSymmWs("message:tpsl", {
673
- accountAddress: addr,
674
- chainId
675
- });
676
614
  queryClient.invalidateQueries({ queryKey: symmKeys.tpslOrdersRoot });
677
615
  queryClient.invalidateQueries({ queryKey: symmKeys.openOrdersRoot });
678
616
  })
@@ -680,10 +618,6 @@ function useSymmWs(params = {}) {
680
618
  if (tpslUnsub) unsubscribers.push(tpslUnsub);
681
619
  const twapUnsub = asUnsubscribeFn(
682
620
  ws.subscribeToTwapOrders(addr, chainId, () => {
683
- logSymmWs("message:twap-orders", {
684
- accountAddress: addr,
685
- chainId
686
- });
687
621
  queryClient.invalidateQueries({ queryKey: symmKeys.twapOrdersRoot });
688
622
  queryClient.invalidateQueries({ queryKey: symmKeys.openOrdersRoot });
689
623
  })
@@ -691,10 +625,6 @@ function useSymmWs(params = {}) {
691
625
  if (twapUnsub) unsubscribers.push(twapUnsub);
692
626
  const triggerOrdersUnsub = asUnsubscribeFn(
693
627
  ws.subscribeToTriggerOrders(addr, chainId, () => {
694
- logSymmWs("message:trigger-orders", {
695
- accountAddress: addr,
696
- chainId
697
- });
698
628
  queryClient.invalidateQueries({ queryKey: symmKeys.triggerOrdersRoot });
699
629
  queryClient.invalidateQueries({ queryKey: symmKeys.openOrdersRoot });
700
630
  })
@@ -702,10 +632,6 @@ function useSymmWs(params = {}) {
702
632
  if (triggerOrdersUnsub) unsubscribers.push(triggerOrdersUnsub);
703
633
  const executionsUnsub = asUnsubscribeFn(
704
634
  ws.subscribeToExecutions(addr, chainId, () => {
705
- logSymmWs("message:executions", {
706
- accountAddress: addr,
707
- chainId
708
- });
709
635
  queryClient.invalidateQueries({
710
636
  queryKey: symmKeys.positionsRoot
711
637
  });
@@ -719,27 +645,14 @@ function useSymmWs(params = {}) {
719
645
  if (cancelled) {
720
646
  return;
721
647
  }
722
- logSymmWs("connection:connect-called", {
723
- accountAddress: addr,
724
- chainId
725
- });
726
- }).catch((error) => {
648
+ }).catch(() => {
727
649
  if (cancelled) {
728
650
  return;
729
651
  }
730
- logSymmWs("connection:connect-failed", {
731
- accountAddress: addr,
732
- chainId,
733
- error: error instanceof Error ? error.message : String(error)
734
- });
735
652
  setConnected(false);
736
653
  });
737
654
  return () => {
738
655
  cancelled = true;
739
- logSymmWs("cleanup:start", {
740
- accountAddress: addr,
741
- chainId
742
- });
743
656
  unsubscribers.forEach((unsubscribe) => unsubscribe());
744
657
  ws.disconnect();
745
658
  setConnected(false);
@@ -747,6 +660,9 @@ function useSymmWs(params = {}) {
747
660
  }, [symmCoreClient, accountAddress, chainId, queryClient, setConnected]);
748
661
  return { isConnected };
749
662
  }
663
+ function trimTrailingSlashes(value) {
664
+ return value.replace(/\/+$/, "");
665
+ }
750
666
  function SymmProvider({
751
667
  chainId = 42161,
752
668
  address,
@@ -758,13 +674,21 @@ function SymmProvider({
758
674
  symmioConfig,
759
675
  children
760
676
  }) {
677
+ const normalizedApiUrl = useMemo(
678
+ () => trimTrailingSlashes(symmCoreConfig.apiUrl),
679
+ [symmCoreConfig.apiUrl]
680
+ );
681
+ const normalizedWsUrl = useMemo(
682
+ () => symmCoreConfig.wsUrl ? trimTrailingSlashes(symmCoreConfig.wsUrl) : void 0,
683
+ [symmCoreConfig.wsUrl]
684
+ );
761
685
  const symmCoreClient = useMemo(() => {
762
686
  return createSymmSDK({
763
- apiUrl: symmCoreConfig.apiUrl,
764
- wsUrl: symmCoreConfig.wsUrl,
687
+ apiUrl: normalizedApiUrl,
688
+ wsUrl: normalizedWsUrl,
765
689
  defaultChainId: chainId
766
690
  });
767
- }, [chainId, symmCoreConfig.apiUrl, symmCoreConfig.wsUrl]);
691
+ }, [chainId, normalizedApiUrl, normalizedWsUrl]);
768
692
  const value = useMemo(
769
693
  () => ({
770
694
  symmCoreClient,
@@ -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":["STABLE_QUOTES","create","useContext","useEffect"],"mappings":"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","file":"provider.mjs","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 // Add symbols here that have no Binance equivalent\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];\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 intentionalClose = false;\n private pendingSubscribes: string[] = [];\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 if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\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.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 // Close connection if no subscriptions left\n if (this.streams.size === 0 && this.ws) {\n this.intentionalClose = true;\n this.ws.close();\n this.ws = null;\n this.intentionalClose = false;\n }\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.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\n // Subscribe to all active streams on (re)connect\n const activeStreams = Array.from(this.streams.keys());\n if (activeStreams.length > 0) {\n this.sendSubscribe(activeStreams);\n }\n\n // Process any pending subscribes\n if (this.pendingSubscribes.length > 0) {\n this.sendSubscribe(this.pendingSubscribes);\n this.pendingSubscribes = [];\n }\n };\n\n this.ws.onmessage = (event: MessageEvent) => {\n try {\n const data = JSON.parse(event.data as string);\n this.handleMessage(data);\n } catch {\n // Ignore parse errors\n }\n };\n\n this.ws.onclose = () => {\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 this.pendingSubscribes.push(...streams);\n return;\n }\n\n this.ws.send(JSON.stringify({\n method: 'SUBSCRIBE',\n params: streams,\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 this.pendingSubscribes = this.pendingSubscribes.filter(\n (s) => !streams.includes(s),\n );\n return;\n }\n\n this.ws.send(JSON.stringify({\n method: 'UNSUBSCRIBE',\n params: streams,\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\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, Set<string>>();\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\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 const symbols = streamSymbols.get(binanceSymbol) ?? new Set<string>();\n symbols.add(symmSymbol);\n streamSymbols.set(binanceSymbol, symbols);\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((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\n const symbols = streamSymbols.get(binanceSymbol);\n if (symbols) {\n symbols.delete(symmSymbol);\n if (symbols.size === 0) {\n streamSymbols.delete(binanceSymbol);\n } else {\n streamSymbols.set(binanceSymbol, symbols);\n }\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 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: (address?: Address, chainId?: number) =>\n ['symm', 'balances', address, chainId] 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 { SymmSDK } from \"@pear-protocol/symm-core\";\nimport { SymmContext } from \"../context\";\nimport { symmKeys } from \"../query-keys\";\nimport { useSymmWsStore } from \"../stores/use-symm-ws-store\";\n\ntype UnsubscribeFn = () => void;\n\nfunction asUnsubscribeFn(value: unknown): UnsubscribeFn | null {\n return typeof value === \"function\" ? (value as UnsubscribeFn) : null;\n}\n\nfunction logSymmWs(event: string, details?: Record<string, unknown>) {\n if (typeof window === \"undefined\") {\n return;\n }\n\n console.debug(\"[symm-ws]\", event, details ?? {});\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 logSymmWs(\"setup:skip\", {\n hasClient: !!symmCoreClient,\n accountAddress,\n chainId,\n });\n setConnected(false);\n return;\n }\n\n const ws = symmCoreClient.ws;\n const addr = accountAddress as string;\n const unsubscribers: UnsubscribeFn[] = [];\n let cancelled = false;\n\n logSymmWs(\"setup:start\", {\n accountAddress: addr,\n chainId,\n alreadyConnected: typeof ws.isConnected === \"function\" ? ws.isConnected() : undefined,\n });\n\n const removeOnConnect = ws.onConnect(() => {\n logSymmWs(\"connection:connected\", {\n accountAddress: addr,\n chainId,\n });\n setConnected(true);\n });\n const removeOnDisconnect = ws.onDisconnect(() => {\n logSymmWs(\"connection:disconnected\", {\n accountAddress: addr,\n chainId,\n });\n setConnected(false);\n });\n const removeOnError = asUnsubscribeFn(\n ws.onError?.((error) => {\n logSymmWs(\"connection:error\", {\n accountAddress: addr,\n chainId,\n error: error instanceof Error ? error.message : String(error),\n });\n }),\n );\n const removeOnWelcome = asUnsubscribeFn(\n ws.onWelcome?.((message) => {\n logSymmWs(\"connection:welcome\", {\n accountAddress: addr,\n chainId,\n message,\n });\n }),\n );\n\n // Subscribe to all relevant channels\n unsubscribers.push(removeOnConnect, removeOnDisconnect);\n if (removeOnError) unsubscribers.push(removeOnError);\n if (removeOnWelcome) unsubscribers.push(removeOnWelcome);\n const positionsUnsub = asUnsubscribeFn(\n ws.subscribeToPositions(addr, chainId, () => {\n logSymmWs(\"message:positions\", {\n accountAddress: addr,\n chainId,\n });\n queryClient.invalidateQueries({\n queryKey: symmKeys.positionsRoot,\n });\n })\n );\n if (positionsUnsub) unsubscribers.push(positionsUnsub);\n\n const openOrdersUnsub = asUnsubscribeFn(\n ws.subscribeToOpenOrders(addr, chainId, () => {\n logSymmWs(\"message:open-orders\", {\n accountAddress: addr,\n chainId,\n });\n queryClient.invalidateQueries({\n queryKey: symmKeys.openOrdersRoot,\n });\n })\n );\n if (openOrdersUnsub) unsubscribers.push(openOrdersUnsub);\n\n const tradesUnsub = asUnsubscribeFn(\n ws.subscribeToTrades(addr, chainId, () => {\n logSymmWs(\"message:trades\", {\n accountAddress: addr,\n chainId,\n });\n queryClient.invalidateQueries({\n queryKey: symmKeys.tradeHistoryRoot,\n });\n })\n );\n if (tradesUnsub) unsubscribers.push(tradesUnsub);\n\n const accountSummaryUnsub = asUnsubscribeFn(\n ws.subscribeToAccountSummary(addr, chainId, () => {\n logSymmWs(\"message:account-summary\", {\n accountAddress: addr,\n chainId,\n });\n queryClient.invalidateQueries({\n queryKey: symmKeys.balances(accountAddress, chainId),\n });\n queryClient.invalidateQueries({\n queryKey: symmKeys.accountSummary(accountAddress, chainId),\n });\n })\n );\n if (accountSummaryUnsub) unsubscribers.push(accountSummaryUnsub);\n\n const notificationsUnsub = asUnsubscribeFn(\n ws.subscribeToNotifications(addr, chainId, () => {\n logSymmWs(\"message:notifications\", {\n accountAddress: addr,\n chainId,\n });\n queryClient.invalidateQueries({\n queryKey: symmKeys.notifications({ accountAddress, chainId }),\n });\n queryClient.invalidateQueries({\n queryKey: symmKeys.unreadCount({ accountAddress, chainId }),\n });\n })\n );\n if (notificationsUnsub) unsubscribers.push(notificationsUnsub);\n\n const tpslUnsub = asUnsubscribeFn(\n ws.subscribeToTpsl(addr, chainId, () => {\n logSymmWs(\"message:tpsl\", {\n accountAddress: addr,\n chainId,\n });\n queryClient.invalidateQueries({ queryKey: symmKeys.tpslOrdersRoot });\n queryClient.invalidateQueries({ queryKey: symmKeys.openOrdersRoot });\n })\n );\n if (tpslUnsub) unsubscribers.push(tpslUnsub);\n\n const twapUnsub = asUnsubscribeFn(\n ws.subscribeToTwapOrders(addr, chainId, () => {\n logSymmWs(\"message:twap-orders\", {\n accountAddress: addr,\n chainId,\n });\n queryClient.invalidateQueries({ queryKey: symmKeys.twapOrdersRoot });\n queryClient.invalidateQueries({ queryKey: symmKeys.openOrdersRoot });\n })\n );\n if (twapUnsub) unsubscribers.push(twapUnsub);\n\n const triggerOrdersUnsub = asUnsubscribeFn(\n ws.subscribeToTriggerOrders(addr, chainId, () => {\n logSymmWs(\"message:trigger-orders\", {\n accountAddress: addr,\n chainId,\n });\n queryClient.invalidateQueries({ queryKey: symmKeys.triggerOrdersRoot });\n queryClient.invalidateQueries({ queryKey: symmKeys.openOrdersRoot });\n })\n );\n if (triggerOrdersUnsub) unsubscribers.push(triggerOrdersUnsub);\n\n const executionsUnsub = asUnsubscribeFn(\n ws.subscribeToExecutions(addr, chainId, () => {\n logSymmWs(\"message:executions\", {\n accountAddress: addr,\n chainId,\n });\n queryClient.invalidateQueries({\n queryKey: symmKeys.positionsRoot,\n });\n queryClient.invalidateQueries({\n queryKey: symmKeys.portfolioRoot,\n });\n })\n );\n if (executionsUnsub) unsubscribers.push(executionsUnsub);\n\n void ws.connect()\n .then(() => {\n if (cancelled) {\n return;\n }\n logSymmWs(\"connection:connect-called\", {\n accountAddress: addr,\n chainId,\n });\n })\n .catch((error) => {\n if (cancelled) {\n return;\n }\n logSymmWs(\"connection:connect-failed\", {\n accountAddress: addr,\n chainId,\n error: error instanceof Error ? error.message : String(error),\n });\n setConnected(false);\n });\n\n return () => {\n cancelled = true;\n logSymmWs(\"cleanup:start\", {\n accountAddress: addr,\n chainId,\n });\n unsubscribers.forEach((unsubscribe) => unsubscribe());\n ws.disconnect();\n setConnected(false);\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\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 symmCoreClient = useMemo((): SymmSDK => {\n return createSymmSDK({\n apiUrl: symmCoreConfig.apiUrl,\n wsUrl: symmCoreConfig.wsUrl,\n defaultChainId: chainId,\n });\n }, [chainId, symmCoreConfig.apiUrl, symmCoreConfig.wsUrl]);\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":["STABLE_QUOTES","create","useContext","useEffect"],"mappings":"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","file":"provider.mjs","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 // Add symbols here that have no Binance equivalent\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];\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 intentionalClose = false;\n private pendingSubscribes: string[] = [];\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 if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\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.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 // Close connection if no subscriptions left\n if (this.streams.size === 0 && this.ws) {\n this.intentionalClose = true;\n this.ws.close();\n this.ws = null;\n this.intentionalClose = false;\n }\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.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\n // Subscribe to all active streams on (re)connect\n const activeStreams = Array.from(this.streams.keys());\n if (activeStreams.length > 0) {\n this.sendSubscribe(activeStreams);\n }\n\n // Process any pending subscribes\n if (this.pendingSubscribes.length > 0) {\n this.sendSubscribe(this.pendingSubscribes);\n this.pendingSubscribes = [];\n }\n };\n\n this.ws.onmessage = (event: MessageEvent) => {\n try {\n const data = JSON.parse(event.data as string);\n this.handleMessage(data);\n } catch {\n // Ignore parse errors\n }\n };\n\n this.ws.onclose = () => {\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 this.pendingSubscribes.push(...streams);\n return;\n }\n\n this.ws.send(JSON.stringify({\n method: 'SUBSCRIBE',\n params: streams,\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 this.pendingSubscribes = this.pendingSubscribes.filter(\n (s) => !streams.includes(s),\n );\n return;\n }\n\n this.ws.send(JSON.stringify({\n method: 'UNSUBSCRIBE',\n params: streams,\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\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, Set<string>>();\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\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 const symbols = streamSymbols.get(binanceSymbol) ?? new Set<string>();\n symbols.add(symmSymbol);\n streamSymbols.set(binanceSymbol, symbols);\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((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\n const symbols = streamSymbols.get(binanceSymbol);\n if (symbols) {\n symbols.delete(symmSymbol);\n if (symbols.size === 0) {\n streamSymbols.delete(binanceSymbol);\n } else {\n streamSymbols.set(binanceSymbol, symbols);\n }\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 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: (address?: Address, chainId?: number) =>\n ['symm', 'balances', address, chainId] 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 { SymmSDK } from \"@pear-protocol/symm-core\";\nimport { SymmContext } from \"../context\";\nimport { symmKeys } from \"../query-keys\";\nimport { useSymmWsStore } from \"../stores/use-symm-ws-store\";\n\ntype UnsubscribeFn = () => void;\n\nfunction asUnsubscribeFn(value: unknown): UnsubscribeFn | null {\n return typeof value === \"function\" ? (value as UnsubscribeFn) : null;\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 const unsubscribers: UnsubscribeFn[] = [];\n let cancelled = false;\n\n const removeOnConnect = ws.onConnect(() => {\n setConnected(true);\n });\n const removeOnDisconnect = ws.onDisconnect(() => {\n setConnected(false);\n });\n const removeOnError = asUnsubscribeFn(ws.onError?.(() => {}));\n const removeOnWelcome = asUnsubscribeFn(ws.onWelcome?.(() => {}));\n\n // Subscribe to all relevant channels\n unsubscribers.push(removeOnConnect, removeOnDisconnect);\n if (removeOnError) unsubscribers.push(removeOnError);\n if (removeOnWelcome) unsubscribers.push(removeOnWelcome);\n const positionsUnsub = asUnsubscribeFn(\n ws.subscribeToPositions(addr, chainId, () => {\n queryClient.invalidateQueries({\n queryKey: symmKeys.positionsRoot,\n });\n })\n );\n if (positionsUnsub) unsubscribers.push(positionsUnsub);\n\n const openOrdersUnsub = asUnsubscribeFn(\n ws.subscribeToOpenOrders(addr, chainId, () => {\n queryClient.invalidateQueries({\n queryKey: symmKeys.openOrdersRoot,\n });\n })\n );\n if (openOrdersUnsub) unsubscribers.push(openOrdersUnsub);\n\n const tradesUnsub = asUnsubscribeFn(\n ws.subscribeToTrades(addr, chainId, () => {\n queryClient.invalidateQueries({\n queryKey: symmKeys.tradeHistoryRoot,\n });\n })\n );\n if (tradesUnsub) unsubscribers.push(tradesUnsub);\n\n const accountSummaryUnsub = asUnsubscribeFn(\n ws.subscribeToAccountSummary(addr, chainId, () => {\n queryClient.invalidateQueries({\n queryKey: symmKeys.balances(accountAddress, chainId),\n });\n queryClient.invalidateQueries({\n queryKey: symmKeys.accountSummary(accountAddress, chainId),\n });\n })\n );\n if (accountSummaryUnsub) unsubscribers.push(accountSummaryUnsub);\n\n const notificationsUnsub = asUnsubscribeFn(\n ws.subscribeToNotifications(addr, chainId, () => {\n queryClient.invalidateQueries({\n queryKey: symmKeys.notifications({ accountAddress, chainId }),\n });\n queryClient.invalidateQueries({\n queryKey: symmKeys.unreadCount({ accountAddress, chainId }),\n });\n })\n );\n if (notificationsUnsub) unsubscribers.push(notificationsUnsub);\n\n const tpslUnsub = asUnsubscribeFn(\n ws.subscribeToTpsl(addr, chainId, () => {\n queryClient.invalidateQueries({ queryKey: symmKeys.tpslOrdersRoot });\n queryClient.invalidateQueries({ queryKey: symmKeys.openOrdersRoot });\n })\n );\n if (tpslUnsub) unsubscribers.push(tpslUnsub);\n\n const twapUnsub = asUnsubscribeFn(\n ws.subscribeToTwapOrders(addr, chainId, () => {\n queryClient.invalidateQueries({ queryKey: symmKeys.twapOrdersRoot });\n queryClient.invalidateQueries({ queryKey: symmKeys.openOrdersRoot });\n })\n );\n if (twapUnsub) unsubscribers.push(twapUnsub);\n\n const triggerOrdersUnsub = asUnsubscribeFn(\n ws.subscribeToTriggerOrders(addr, chainId, () => {\n queryClient.invalidateQueries({ queryKey: symmKeys.triggerOrdersRoot });\n queryClient.invalidateQueries({ queryKey: symmKeys.openOrdersRoot });\n })\n );\n if (triggerOrdersUnsub) unsubscribers.push(triggerOrdersUnsub);\n\n const executionsUnsub = asUnsubscribeFn(\n ws.subscribeToExecutions(addr, chainId, () => {\n queryClient.invalidateQueries({\n queryKey: symmKeys.positionsRoot,\n });\n queryClient.invalidateQueries({\n queryKey: symmKeys.portfolioRoot,\n });\n })\n );\n if (executionsUnsub) unsubscribers.push(executionsUnsub);\n\n void ws.connect()\n .then(() => {\n if (cancelled) {\n return;\n }\n })\n .catch(() => {\n if (cancelled) {\n return;\n }\n setConnected(false);\n });\n\n return () => {\n cancelled = true;\n unsubscribers.forEach((unsubscribe) => unsubscribe());\n ws.disconnect();\n setConnected(false);\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pear-protocol/symmio-client",
3
- "version": "0.3.1",
3
+ "version": "0.3.3",
4
4
  "description": "Standalone SDK for Symmio — account management, trading, deposits, withdrawals, and protocol interactions via MultiAccount",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -91,7 +91,7 @@
91
91
  "node": ">=18"
92
92
  },
93
93
  "dependencies": {
94
- "@pear-protocol/symm-core": "^0.1.14",
94
+ "@pear-protocol/symm-core": "^0.1.15",
95
95
  "@pear-protocol/symm-shared": "^0.1.3",
96
96
  "siwe": "^3.0.0",
97
97
  "zustand": "^5.0.12"