@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.
@@ -8559,6 +8559,7 @@ type SymmTradeAuthParams = {
8559
8559
  address?: Address;
8560
8560
  chainId?: number;
8561
8561
  };
8562
+
8562
8563
  type OpenBasketMutationRequest = WithOptionalAuthToken<OpenBasketPositionRequest>;
8563
8564
  type ClosePositionMutationRequest = WithOptionalAuthToken<ClosePositionRequest>;
8564
8565
  type CloseAllPositionsMutationRequest = WithOptionalAuthToken<Parameters<NonNullable<ReturnType<typeof useSymmContext>['symmCoreClient']>['positions']['closeAll']>[0]>;
@@ -8559,6 +8559,7 @@ type SymmTradeAuthParams = {
8559
8559
  address?: Address;
8560
8560
  chainId?: number;
8561
8561
  };
8562
+
8562
8563
  type OpenBasketMutationRequest = WithOptionalAuthToken<OpenBasketPositionRequest>;
8563
8564
  type ClosePositionMutationRequest = WithOptionalAuthToken<ClosePositionRequest>;
8564
8565
  type CloseAllPositionsMutationRequest = WithOptionalAuthToken<Parameters<NonNullable<ReturnType<typeof useSymmContext>['symmCoreClient']>['positions']['closeAll']>[0]>;
@@ -550,12 +550,6 @@ var useSymmWsStore = zustand.create((set) => ({
550
550
  function asUnsubscribeFn(value) {
551
551
  return typeof value === "function" ? value : null;
552
552
  }
553
- function logSymmWs(event, details) {
554
- if (typeof window === "undefined") {
555
- return;
556
- }
557
- console.debug("[symm-ws]", event, details ?? {});
558
- }
559
553
  function useSymmWs(params = {}) {
560
554
  const ctx = react.useContext(SymmContext);
561
555
  const queryClient = reactQuery.useQueryClient();
@@ -566,11 +560,6 @@ function useSymmWs(params = {}) {
566
560
  const chainId = params.chainId ?? ctx?.chainId ?? 42161;
567
561
  react.useEffect(() => {
568
562
  if (!symmCoreClient || !accountAddress) {
569
- logSymmWs("setup:skip", {
570
- hasClient: !!symmCoreClient,
571
- accountAddress,
572
- chainId
573
- });
574
563
  setConnected(false);
575
564
  return;
576
565
  }
@@ -578,52 +567,21 @@ function useSymmWs(params = {}) {
578
567
  const addr = accountAddress;
579
568
  const unsubscribers = [];
580
569
  let cancelled = false;
581
- logSymmWs("setup:start", {
582
- accountAddress: addr,
583
- chainId,
584
- alreadyConnected: typeof ws.isConnected === "function" ? ws.isConnected() : void 0
585
- });
586
570
  const removeOnConnect = ws.onConnect(() => {
587
- logSymmWs("connection:connected", {
588
- accountAddress: addr,
589
- chainId
590
- });
591
571
  setConnected(true);
592
572
  });
593
573
  const removeOnDisconnect = ws.onDisconnect(() => {
594
- logSymmWs("connection:disconnected", {
595
- accountAddress: addr,
596
- chainId
597
- });
598
574
  setConnected(false);
599
575
  });
600
- const removeOnError = asUnsubscribeFn(
601
- ws.onError?.((error) => {
602
- logSymmWs("connection:error", {
603
- accountAddress: addr,
604
- chainId,
605
- error: error instanceof Error ? error.message : String(error)
606
- });
607
- })
608
- );
609
- const removeOnWelcome = asUnsubscribeFn(
610
- ws.onWelcome?.((message) => {
611
- logSymmWs("connection:welcome", {
612
- accountAddress: addr,
613
- chainId,
614
- message
615
- });
616
- })
617
- );
576
+ const removeOnError = asUnsubscribeFn(ws.onError?.(() => {
577
+ }));
578
+ const removeOnWelcome = asUnsubscribeFn(ws.onWelcome?.(() => {
579
+ }));
618
580
  unsubscribers.push(removeOnConnect, removeOnDisconnect);
619
581
  if (removeOnError) unsubscribers.push(removeOnError);
620
582
  if (removeOnWelcome) unsubscribers.push(removeOnWelcome);
621
583
  const positionsUnsub = asUnsubscribeFn(
622
584
  ws.subscribeToPositions(addr, chainId, () => {
623
- logSymmWs("message:positions", {
624
- accountAddress: addr,
625
- chainId
626
- });
627
585
  queryClient.invalidateQueries({
628
586
  queryKey: symmKeys.positionsRoot
629
587
  });
@@ -632,10 +590,6 @@ function useSymmWs(params = {}) {
632
590
  if (positionsUnsub) unsubscribers.push(positionsUnsub);
633
591
  const openOrdersUnsub = asUnsubscribeFn(
634
592
  ws.subscribeToOpenOrders(addr, chainId, () => {
635
- logSymmWs("message:open-orders", {
636
- accountAddress: addr,
637
- chainId
638
- });
639
593
  queryClient.invalidateQueries({
640
594
  queryKey: symmKeys.openOrdersRoot
641
595
  });
@@ -644,10 +598,6 @@ function useSymmWs(params = {}) {
644
598
  if (openOrdersUnsub) unsubscribers.push(openOrdersUnsub);
645
599
  const tradesUnsub = asUnsubscribeFn(
646
600
  ws.subscribeToTrades(addr, chainId, () => {
647
- logSymmWs("message:trades", {
648
- accountAddress: addr,
649
- chainId
650
- });
651
601
  queryClient.invalidateQueries({
652
602
  queryKey: symmKeys.tradeHistoryRoot
653
603
  });
@@ -656,10 +606,6 @@ function useSymmWs(params = {}) {
656
606
  if (tradesUnsub) unsubscribers.push(tradesUnsub);
657
607
  const accountSummaryUnsub = asUnsubscribeFn(
658
608
  ws.subscribeToAccountSummary(addr, chainId, () => {
659
- logSymmWs("message:account-summary", {
660
- accountAddress: addr,
661
- chainId
662
- });
663
609
  queryClient.invalidateQueries({
664
610
  queryKey: symmKeys.balances(accountAddress, chainId)
665
611
  });
@@ -671,10 +617,6 @@ function useSymmWs(params = {}) {
671
617
  if (accountSummaryUnsub) unsubscribers.push(accountSummaryUnsub);
672
618
  const notificationsUnsub = asUnsubscribeFn(
673
619
  ws.subscribeToNotifications(addr, chainId, () => {
674
- logSymmWs("message:notifications", {
675
- accountAddress: addr,
676
- chainId
677
- });
678
620
  queryClient.invalidateQueries({
679
621
  queryKey: symmKeys.notifications({ accountAddress, chainId })
680
622
  });
@@ -686,10 +628,6 @@ function useSymmWs(params = {}) {
686
628
  if (notificationsUnsub) unsubscribers.push(notificationsUnsub);
687
629
  const tpslUnsub = asUnsubscribeFn(
688
630
  ws.subscribeToTpsl(addr, chainId, () => {
689
- logSymmWs("message:tpsl", {
690
- accountAddress: addr,
691
- chainId
692
- });
693
631
  queryClient.invalidateQueries({ queryKey: symmKeys.tpslOrdersRoot });
694
632
  queryClient.invalidateQueries({ queryKey: symmKeys.openOrdersRoot });
695
633
  })
@@ -697,10 +635,6 @@ function useSymmWs(params = {}) {
697
635
  if (tpslUnsub) unsubscribers.push(tpslUnsub);
698
636
  const twapUnsub = asUnsubscribeFn(
699
637
  ws.subscribeToTwapOrders(addr, chainId, () => {
700
- logSymmWs("message:twap-orders", {
701
- accountAddress: addr,
702
- chainId
703
- });
704
638
  queryClient.invalidateQueries({ queryKey: symmKeys.twapOrdersRoot });
705
639
  queryClient.invalidateQueries({ queryKey: symmKeys.openOrdersRoot });
706
640
  })
@@ -708,10 +642,6 @@ function useSymmWs(params = {}) {
708
642
  if (twapUnsub) unsubscribers.push(twapUnsub);
709
643
  const triggerOrdersUnsub = asUnsubscribeFn(
710
644
  ws.subscribeToTriggerOrders(addr, chainId, () => {
711
- logSymmWs("message:trigger-orders", {
712
- accountAddress: addr,
713
- chainId
714
- });
715
645
  queryClient.invalidateQueries({ queryKey: symmKeys.triggerOrdersRoot });
716
646
  queryClient.invalidateQueries({ queryKey: symmKeys.openOrdersRoot });
717
647
  })
@@ -719,10 +649,6 @@ function useSymmWs(params = {}) {
719
649
  if (triggerOrdersUnsub) unsubscribers.push(triggerOrdersUnsub);
720
650
  const executionsUnsub = asUnsubscribeFn(
721
651
  ws.subscribeToExecutions(addr, chainId, () => {
722
- logSymmWs("message:executions", {
723
- accountAddress: addr,
724
- chainId
725
- });
726
652
  queryClient.invalidateQueries({
727
653
  queryKey: symmKeys.positionsRoot
728
654
  });
@@ -736,27 +662,14 @@ function useSymmWs(params = {}) {
736
662
  if (cancelled) {
737
663
  return;
738
664
  }
739
- logSymmWs("connection:connect-called", {
740
- accountAddress: addr,
741
- chainId
742
- });
743
- }).catch((error) => {
665
+ }).catch(() => {
744
666
  if (cancelled) {
745
667
  return;
746
668
  }
747
- logSymmWs("connection:connect-failed", {
748
- accountAddress: addr,
749
- chainId,
750
- error: error instanceof Error ? error.message : String(error)
751
- });
752
669
  setConnected(false);
753
670
  });
754
671
  return () => {
755
672
  cancelled = true;
756
- logSymmWs("cleanup:start", {
757
- accountAddress: addr,
758
- chainId
759
- });
760
673
  unsubscribers.forEach((unsubscribe) => unsubscribe());
761
674
  ws.disconnect();
762
675
  setConnected(false);
@@ -764,6 +677,9 @@ function useSymmWs(params = {}) {
764
677
  }, [symmCoreClient, accountAddress, chainId, queryClient, setConnected]);
765
678
  return { isConnected };
766
679
  }
680
+ function trimTrailingSlashes(value) {
681
+ return value.replace(/\/+$/, "");
682
+ }
767
683
  function SymmProvider({
768
684
  chainId = 42161,
769
685
  address,
@@ -775,13 +691,21 @@ function SymmProvider({
775
691
  symmioConfig,
776
692
  children
777
693
  }) {
694
+ const normalizedApiUrl = react.useMemo(
695
+ () => trimTrailingSlashes(symmCoreConfig.apiUrl),
696
+ [symmCoreConfig.apiUrl]
697
+ );
698
+ const normalizedWsUrl = react.useMemo(
699
+ () => symmCoreConfig.wsUrl ? trimTrailingSlashes(symmCoreConfig.wsUrl) : void 0,
700
+ [symmCoreConfig.wsUrl]
701
+ );
778
702
  const symmCoreClient = react.useMemo(() => {
779
703
  return symmCore.createSymmSDK({
780
- apiUrl: symmCoreConfig.apiUrl,
781
- wsUrl: symmCoreConfig.wsUrl,
704
+ apiUrl: normalizedApiUrl,
705
+ wsUrl: normalizedWsUrl,
782
706
  defaultChainId: chainId
783
707
  });
784
- }, [chainId, symmCoreConfig.apiUrl, symmCoreConfig.wsUrl]);
708
+ }, [chainId, normalizedApiUrl, normalizedWsUrl]);
785
709
  const value = react.useMemo(
786
710
  () => ({
787
711
  symmCoreClient,
@@ -1052,12 +976,6 @@ function clearAuthState(queryClient, accountAddress, chainId, signerAddress) {
1052
976
  }
1053
977
 
1054
978
  // src/react/hooks/use-symm-auth.ts
1055
- function logSymmAuth(event, details) {
1056
- if (typeof window === "undefined") {
1057
- return;
1058
- }
1059
- console.log("[symm-auth]", event, details ?? {});
1060
- }
1061
979
  function useSymmAuth(params) {
1062
980
  const context = useSymmContext();
1063
981
  const queryClient = reactQuery.useQueryClient();
@@ -1071,20 +989,10 @@ function useSymmAuth(params) {
1071
989
  async (accountAddress, options) => {
1072
990
  const resolvedAccountAddress = accountAddress ?? activeAccountAddress;
1073
991
  if (!resolvedAccountAddress) {
1074
- logSymmAuth("refresh:skip-no-active-account", {
1075
- signerAddress: address,
1076
- chainId
1077
- });
1078
992
  return null;
1079
993
  }
1080
994
  if (!walletClient || !address) return null;
1081
995
  try {
1082
- logSymmAuth("refresh:fetch-start", {
1083
- signerAddress: address,
1084
- accountAddress: resolvedAccountAddress,
1085
- chainId,
1086
- force: options?.force ?? false
1087
- });
1088
996
  const tokenEntry = await resolveAuthTokenEntry({
1089
997
  queryClient,
1090
998
  walletClient,
@@ -1095,20 +1003,9 @@ function useSymmAuth(params) {
1095
1003
  force: options?.force
1096
1004
  });
1097
1005
  const token2 = tokenEntry?.token ?? null;
1098
- logSymmAuth("refresh:fetch-success", {
1099
- signerAddress: address,
1100
- accountAddress: resolvedAccountAddress,
1101
- chainId
1102
- });
1103
1006
  return token2;
1104
1007
  } catch (error) {
1105
1008
  clearPersistedAuthState(resolvedAccountAddress, chainId);
1106
- logSymmAuth("refresh:fetch-failed", {
1107
- signerAddress: address,
1108
- accountAddress: resolvedAccountAddress,
1109
- chainId,
1110
- error: error instanceof Error ? error.message : String(error)
1111
- });
1112
1009
  return null;
1113
1010
  }
1114
1011
  },
@@ -2356,9 +2253,53 @@ function useSymmApproveMutation(params, options) {
2356
2253
  }
2357
2254
  });
2358
2255
  }
2256
+ function splitTradeHookArgs(paramsOrOptions, options) {
2257
+ if (paramsOrOptions && "mutation" in paramsOrOptions) {
2258
+ return {
2259
+ params: {},
2260
+ options: paramsOrOptions
2261
+ };
2262
+ }
2263
+ return {
2264
+ params: paramsOrOptions ?? {},
2265
+ options
2266
+ };
2267
+ }
2268
+ function useResolveTradeAuthToken(params = {}) {
2269
+ const context = useSymmContext();
2270
+ const queryClient = reactQuery.useQueryClient();
2271
+ const address = params.address ?? context.address;
2272
+ const chainId = params.chainId ?? context.chainId;
2273
+ return react.useCallback(
2274
+ async (providedAuthToken, accountAddress, overrideChainId) => {
2275
+ const resolvedChainId = overrideChainId ?? chainId;
2276
+ if (providedAuthToken) {
2277
+ return providedAuthToken;
2278
+ }
2279
+ const resolvedAccountAddress = accountAddress ?? address;
2280
+ if (!resolvedAccountAddress) {
2281
+ return null;
2282
+ }
2283
+ const inMemoryToken = getAuthTokenFromRuntimeCache(
2284
+ queryClient,
2285
+ resolvedAccountAddress,
2286
+ resolvedChainId,
2287
+ address
2288
+ );
2289
+ if (inMemoryToken) {
2290
+ return inMemoryToken;
2291
+ }
2292
+ return null;
2293
+ },
2294
+ [address, chainId, queryClient]
2295
+ );
2296
+ }
2297
+
2298
+ // src/react/hooks/use-symm-cancel-close.ts
2359
2299
  function useSymmCancelClose(options) {
2360
2300
  const { symmCoreClient, chainId, address } = useSymmContext();
2361
2301
  const queryClient = reactQuery.useQueryClient();
2302
+ const resolveAuthToken = useResolveTradeAuthToken({ address, chainId });
2362
2303
  return reactQuery.useMutation({
2363
2304
  ...withSymmMutationConfig(options?.mutation, {
2364
2305
  onSuccess: () => {
@@ -2375,14 +2316,12 @@ function useSymmCancelClose(options) {
2375
2316
  if (!symmCoreClient) {
2376
2317
  throw new Error("symm-core client not available");
2377
2318
  }
2378
- const resolvedAccountAddress = accountAddress ?? address;
2379
2319
  const resolvedChainId = overrideChainId ?? chainId;
2380
- const resolvedAuthToken = authToken ?? (resolvedAccountAddress ? getAuthTokenFromRuntimeCache(
2381
- queryClient,
2382
- resolvedAccountAddress,
2383
- resolvedChainId,
2384
- address
2385
- ) : null);
2320
+ const resolvedAuthToken = await resolveAuthToken(
2321
+ authToken,
2322
+ accountAddress,
2323
+ resolvedChainId
2324
+ );
2386
2325
  if (!resolvedAuthToken) {
2387
2326
  throw new Error("auth token is required to cancel a pending close");
2388
2327
  }
@@ -2397,6 +2336,7 @@ function useSymmCancelClose(options) {
2397
2336
  function useSymmCloseOrder(options) {
2398
2337
  const { symmCoreClient, address, chainId } = useSymmContext();
2399
2338
  const queryClient = reactQuery.useQueryClient();
2339
+ const resolveAuthToken = useResolveTradeAuthToken({ address, chainId });
2400
2340
  return reactQuery.useMutation({
2401
2341
  ...withSymmMutationConfig(options?.mutation, {
2402
2342
  onSuccess: () => {
@@ -2409,16 +2349,17 @@ function useSymmCloseOrder(options) {
2409
2349
  throw new Error("symm-core client not available");
2410
2350
  }
2411
2351
  const typedRequest = request;
2412
- const resolvedAccountAddress = typedRequest.accountAddress ?? address;
2352
+ const authToken = await resolveAuthToken(
2353
+ typedRequest.authToken,
2354
+ typedRequest.accountAddress
2355
+ );
2356
+ if (!authToken) {
2357
+ throw new Error("auth token is required to close an order");
2358
+ }
2413
2359
  return symmCoreClient.orders.close(request.id, {
2414
2360
  kind: request.kind,
2415
2361
  type: request.type,
2416
- authToken: request.authToken ?? (resolvedAccountAddress ? getAuthTokenFromRuntimeCache(
2417
- queryClient,
2418
- resolvedAccountAddress,
2419
- chainId,
2420
- address
2421
- ) ?? void 0 : void 0)
2362
+ authToken
2422
2363
  });
2423
2364
  }
2424
2365
  });
@@ -25528,64 +25469,6 @@ function useSymmBalances(params) {
25528
25469
  enabled: internalEnabled && (params.query?.enabled ?? true)
25529
25470
  });
25530
25471
  }
25531
- function logTradeAuth(event, details) {
25532
- if (typeof window === "undefined") {
25533
- return;
25534
- }
25535
- console.debug("[symm-trade]", event, details ?? {});
25536
- }
25537
- function splitTradeHookArgs(paramsOrOptions, options) {
25538
- if (paramsOrOptions && "mutation" in paramsOrOptions) {
25539
- return {
25540
- params: {},
25541
- options: paramsOrOptions
25542
- };
25543
- }
25544
- return {
25545
- params: paramsOrOptions ?? {},
25546
- options
25547
- };
25548
- }
25549
- function useResolveTradeAuthToken(params = {}) {
25550
- const context = useSymmContext();
25551
- const queryClient = reactQuery.useQueryClient();
25552
- const address = params.address ?? context.address;
25553
- const chainId = params.chainId ?? context.chainId;
25554
- return react.useCallback(
25555
- async (providedAuthToken, accountAddress) => {
25556
- if (providedAuthToken) {
25557
- logTradeAuth("resolve-auth:provided", {
25558
- accountAddress,
25559
- chainId
25560
- });
25561
- return providedAuthToken;
25562
- }
25563
- const resolvedAccountAddress = accountAddress ?? address;
25564
- if (!resolvedAccountAddress) {
25565
- return null;
25566
- }
25567
- const inMemoryToken = getAuthTokenFromRuntimeCache(
25568
- queryClient,
25569
- resolvedAccountAddress,
25570
- chainId,
25571
- address
25572
- );
25573
- if (inMemoryToken) {
25574
- logTradeAuth("resolve-auth:store-hit", {
25575
- accountAddress: resolvedAccountAddress,
25576
- chainId
25577
- });
25578
- return inMemoryToken;
25579
- }
25580
- logTradeAuth("resolve-auth:miss", {
25581
- accountAddress: resolvedAccountAddress,
25582
- chainId
25583
- });
25584
- return null;
25585
- },
25586
- [address, chainId, queryClient]
25587
- );
25588
- }
25589
25472
  function useSymmOpenBasketMutation(options) {
25590
25473
  const { symmCoreClient } = useSymmContext();
25591
25474
  const queryClient = reactQuery.useQueryClient();