@pear-protocol/symmio-client 0.2.40 → 0.2.43

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.
@@ -1,9 +1,10 @@
1
1
  'use client';
2
- import { createContext, useContext, useMemo, useRef, useCallback, useEffect } from 'react';
2
+ import { createContext, useContext, useMemo, useCallback, useEffect, useRef } from 'react';
3
3
  import { createSymmSDK, isAuthExpiredError, isNetworkError, isInsufficientMarginError, isRateLimitedError, isTimeoutError } from '@pear-protocol/symm-core';
4
4
  import { create } from 'zustand';
5
5
  import { jsx } from 'react/jsx-runtime';
6
- import { useQuery, useQueryClient, useMutation } from '@tanstack/react-query';
6
+ import { useQueryClient, useQuery, useMutation } from '@tanstack/react-query';
7
+ import { SiweMessage } from 'siwe';
7
8
  import { isAddress, encodeFunctionData } from 'viem';
8
9
 
9
10
  var SymmContext = createContext(null);
@@ -490,6 +491,7 @@ function useBinanceWs(params) {
490
491
  function SymmProvider({
491
492
  chainId = 42161,
492
493
  address,
494
+ walletClient,
493
495
  symmCoreConfig = {
494
496
  apiUrl: "https://nginx-server-staging.up.railway.app",
495
497
  wsUrl: "wss://nginx-server-staging.up.railway.app"
@@ -509,9 +511,10 @@ function SymmProvider({
509
511
  symmCoreClient,
510
512
  chainId,
511
513
  address,
514
+ walletClient,
512
515
  symmioConfig
513
516
  }),
514
- [symmCoreClient, chainId, address, symmioConfig]
517
+ [symmCoreClient, chainId, address, walletClient, symmioConfig]
515
518
  );
516
519
  useBinanceWs({
517
520
  symmCoreClient,
@@ -554,19 +557,17 @@ function createSiweMessage(params) {
554
557
  const expirationTime = new Date(
555
558
  Date.now() + 30 * 24 * 60 * 60 * 1e3
556
559
  ).toISOString();
557
- const message = [
558
- `${params.domain} wants you to sign in with your Ethereum account:`,
559
- params.address,
560
- "",
561
- params.statement,
562
- "",
563
- `URI: ${params.uri}`,
564
- `Version: ${version}`,
565
- `Chain ID: ${params.chainId}`,
566
- `Nonce: ${params.nonce}`,
567
- `Issued At: ${issuedAt}`,
568
- `Expiration Time: ${expirationTime}`
569
- ].join("\n");
560
+ const message = new SiweMessage({
561
+ domain: params.domain,
562
+ address: params.address,
563
+ statement: params.statement,
564
+ chainId: params.chainId,
565
+ nonce: params.nonce,
566
+ version,
567
+ uri: params.uri,
568
+ issuedAt,
569
+ expirationTime
570
+ }).prepareMessage();
570
571
  return { message, issuedAt, expirationTime };
571
572
  }
572
573
  async function getNonce(chainId, subAccount) {
@@ -634,7 +635,7 @@ function cacheKey(address, chainId) {
634
635
  function storageKey(address, chainId) {
635
636
  return `${TOKEN_STORAGE_PREFIX}:${TOKEN_STORAGE_VERSION}:${cacheKey(address, chainId)}`;
636
637
  }
637
- function readStoredToken(address, chainId) {
638
+ function getCachedTokenEntry(address, chainId) {
638
639
  if (typeof window === "undefined") return null;
639
640
  try {
640
641
  const raw = window.localStorage.getItem(storageKey(address, chainId));
@@ -664,17 +665,12 @@ function writeStoredToken(address, chainId, cached) {
664
665
  } catch {
665
666
  }
666
667
  }
667
- function getCachedToken(address, chainId) {
668
- const stored = readStoredToken(address, chainId);
669
- if (!stored) return null;
670
- return stored.token;
671
- }
672
668
  function clearCachedToken(address, chainId) {
673
669
  if (typeof window !== "undefined") {
674
670
  window.localStorage.removeItem(storageKey(address, chainId));
675
671
  }
676
672
  }
677
- async function fetchAccessToken(walletClient, signerAddress, accountAddress, chainId, domain) {
673
+ async function fetchAccessTokenEntry(walletClient, signerAddress, accountAddress, chainId, domain) {
678
674
  const resolvedDomain = domain ?? (typeof window !== "undefined" ? window.location.host : "localhost");
679
675
  const hedgerLoginUrl = new URL("login", getHedgerBaseUrl(chainId)).href;
680
676
  const nonce = await getNonce(chainId, accountAddress);
@@ -703,39 +699,114 @@ async function fetchAccessToken(walletClient, signerAddress, accountAddress, cha
703
699
  expiresAt: expiresAt - 6e4
704
700
  };
705
701
  writeStoredToken(accountAddress, chainId, cachedToken);
706
- return accessToken;
702
+ return cachedToken;
707
703
  }
708
- function symmAuthTokenKey(address, chainId) {
709
- return `${address.toLowerCase()}:${chainId}`;
704
+
705
+ // src/react/query-keys.ts
706
+ var symmKeys = {
707
+ all: ["symm"],
708
+ accounts: (address, chainId) => ["symm", "accounts", address, chainId],
709
+ accountsApi: (address, chainId) => ["symm", "accountsApi", address, chainId],
710
+ accountsLength: (address, chainId) => ["symm", "accountsLength", address, chainId],
711
+ accountsWithPositions: (address, chainId) => ["symm", "accountsWithPositions", address, chainId],
712
+ accountSummary: (address, chainId) => ["symm", "accountSummary", address, chainId],
713
+ accountData: (address, chainId, upnl) => ["symm", "accountData", address, chainId, upnl],
714
+ signature: (address, chainId) => ["symm", "signature", address, chainId],
715
+ auth: (accountAddress, chainId) => ["symm", "auth", accountAddress, chainId],
716
+ approval: (owner, spender, chainId, token) => ["symm", "approval", owner, spender, chainId, token],
717
+ balances: (address, chainId) => ["symm", "balances", address, chainId],
718
+ positions: (params) => ["symm", "positions", params],
719
+ openOrders: (params) => ["symm", "openOrders", params],
720
+ tradeHistory: (params) => ["symm", "tradeHistory", params],
721
+ tpslOrders: (address, chainId) => ["symm", "tpslOrders", address, chainId],
722
+ tpslOrdersList: (params) => ["symm", "tpslOrders", params],
723
+ twapOrders: (address, chainId) => ["symm", "twapOrders", address, chainId],
724
+ triggerOrders: (params) => ["symm", "triggerOrders", params],
725
+ triggerConfig: (orderId) => ["symm", "triggerConfig", orderId],
726
+ markets: (chainId, search) => ["symm", "markets", chainId, search],
727
+ hedgerMarketById: (id, chainId) => ["symm", "hedgerMarketById", id, chainId],
728
+ hedgerMarketBySymbol: (symbol, chainId) => ["symm", "hedgerMarketBySymbol", symbol, chainId],
729
+ lockedParams: (marketName, leverage, chainId) => ["symm", "lockedParams", marketName, leverage, chainId],
730
+ hedgerMarkets: (request) => ["symm", "hedgerMarkets", request],
731
+ fundingRates: (chainId) => ["symm", "fundingRates", chainId],
732
+ fundingPayments: (params) => ["symm", "fundingPayments", params],
733
+ fundingHistory: (params) => ["symm", "fundingHistory", params],
734
+ portfolio: (params) => ["symm", "portfolio", params],
735
+ notifications: (address, chainId) => ["symm", "notifications", address, chainId],
736
+ unreadCount: (address, chainId) => ["symm", "unreadCount", address, chainId],
737
+ availableMargin: (address, chainId) => ["symm", "availableMargin", address, chainId],
738
+ pendingIds: (address, chainId) => ["symm", "pendingIds", address, chainId],
739
+ pendingInstantOpens: (accountAddress, chainId) => ["symm", "pendingInstantOpens", accountAddress, chainId],
740
+ twapOrder: (orderId) => ["symm", "twapOrder", orderId],
741
+ delegation: (account, target, selectors, chainId) => ["symm", "delegation", account, target, selectors, chainId],
742
+ chartMetadata: (symbolsKey, positionKey) => ["symm", "chartMetadata", symbolsKey, positionKey]
743
+ };
744
+
745
+ // src/react/auth-cache.ts
746
+ function getAuthQueryData(queryClient, accountAddress, chainId) {
747
+ return queryClient.getQueryData(symmKeys.auth(accountAddress, chainId)) ?? null;
710
748
  }
711
- var useSymmAuthStore = create((set, get) => ({
712
- tokensByKey: {},
713
- setToken: (address, chainId, token) => {
714
- const key = symmAuthTokenKey(address, chainId);
715
- set((state) => ({
716
- tokensByKey: {
717
- ...state.tokensByKey,
718
- [key]: token
719
- }
720
- }));
721
- },
722
- getToken: (address, chainId) => {
723
- const key = symmAuthTokenKey(address, chainId);
724
- return get().tokensByKey[key] ?? null;
725
- },
726
- clearToken: (address, chainId) => {
727
- const key = symmAuthTokenKey(address, chainId);
728
- set((state) => {
729
- if (!(key in state.tokensByKey)) return state;
730
- const next = { ...state.tokensByKey };
731
- delete next[key];
732
- return { tokensByKey: next };
733
- });
734
- },
735
- clearAll: () => {
736
- set({ tokensByKey: {} });
749
+ function setAuthQueryData(queryClient, accountAddress, chainId, entry) {
750
+ queryClient.setQueryData(symmKeys.auth(accountAddress, chainId), entry);
751
+ }
752
+ function clearAuthQueryData(queryClient, accountAddress, chainId) {
753
+ queryClient.removeQueries({
754
+ queryKey: symmKeys.auth(accountAddress, chainId),
755
+ exact: true
756
+ });
757
+ }
758
+ function clearPersistedAuthState(accountAddress, chainId) {
759
+ clearCachedToken(accountAddress, chainId);
760
+ }
761
+ function getAuthTokenFromRuntimeCache(queryClient, accountAddress, chainId) {
762
+ const inQuery = getAuthQueryData(queryClient, accountAddress, chainId);
763
+ if (inQuery && inQuery.expiresAt > Date.now()) {
764
+ return inQuery.token;
737
765
  }
738
- }));
766
+ const persisted = getCachedTokenEntry(accountAddress, chainId);
767
+ if (!persisted) {
768
+ return null;
769
+ }
770
+ setAuthQueryData(queryClient, accountAddress, chainId, persisted);
771
+ return persisted.token;
772
+ }
773
+ async function resolveAuthTokenEntry({
774
+ queryClient,
775
+ walletClient,
776
+ signerAddress,
777
+ accountAddress,
778
+ chainId,
779
+ siweDomain,
780
+ force = false
781
+ }) {
782
+ if (!walletClient || !signerAddress || !accountAddress) {
783
+ return null;
784
+ }
785
+ if (!force) {
786
+ const inQuery = getAuthQueryData(queryClient, accountAddress, chainId);
787
+ if (inQuery && inQuery.expiresAt > Date.now()) {
788
+ return inQuery;
789
+ }
790
+ const persisted = getCachedTokenEntry(accountAddress, chainId);
791
+ if (persisted) {
792
+ setAuthQueryData(queryClient, accountAddress, chainId, persisted);
793
+ return persisted;
794
+ }
795
+ }
796
+ const fresh = await fetchAccessTokenEntry(
797
+ walletClient,
798
+ signerAddress,
799
+ accountAddress,
800
+ chainId,
801
+ siweDomain
802
+ );
803
+ setAuthQueryData(queryClient, accountAddress, chainId, fresh);
804
+ return fresh;
805
+ }
806
+ function clearAuthState(queryClient, accountAddress, chainId) {
807
+ clearPersistedAuthState(accountAddress, chainId);
808
+ clearAuthQueryData(queryClient, accountAddress, chainId);
809
+ }
739
810
 
740
811
  // src/react/hooks/use-symm-auth.ts
741
812
  function logSymmAuth(event, details) {
@@ -744,59 +815,26 @@ function logSymmAuth(event, details) {
744
815
  }
745
816
  console.log("[symm-auth]", event, details ?? {});
746
817
  }
747
- function extractSubaccountAddresses(summary) {
748
- const accounts = summary?.data?.accounts;
749
- if (!Array.isArray(accounts)) {
750
- return [];
751
- }
752
- return accounts.flatMap((account) => {
753
- const accountAddress = account.accountAddress ?? account.address;
754
- return accountAddress ? [accountAddress] : [];
755
- });
756
- }
757
818
  function useSymmAuth(params) {
758
819
  const context = useSymmContext();
759
- const ctx = context;
760
- const { symmCoreClient } = context;
761
- const address = params?.address ?? ctx.address;
762
- const chainId = params?.chainId ?? ctx.chainId ?? 42161;
763
- const walletClient = params?.walletClient ?? ctx.walletClient;
820
+ const queryClient = useQueryClient();
821
+ const address = params?.address ?? context.address;
822
+ const chainId = params?.chainId ?? context.chainId ?? 42161;
823
+ const walletClient = params?.walletClient ?? context.walletClient;
764
824
  const siweDomain = params?.siweDomain;
765
- const token = useSymmAuthStore((state) => {
766
- if (address) {
767
- return state.tokensByKey[symmAuthTokenKey(address, chainId)] ?? null;
768
- }
769
- return ctx.accessToken ?? ctx.authToken ?? null;
770
- });
771
- const setToken = useSymmAuthStore((state) => state.setToken);
772
- const getToken = useSymmAuthStore((state) => state.getToken);
773
- const clearToken = useSymmAuthStore((state) => state.clearToken);
774
- const previousAddressRef = useRef(address);
775
- const previousChainIdRef = useRef(chainId);
776
- const refreshAuthRef = useRef(async () => null);
825
+ const activeAccountAddress = params?.activeAccountAddress;
826
+ const canBootstrap = !!walletClient && !!address && !!activeAccountAddress;
777
827
  const refreshAuth = useCallback(
778
828
  async (accountAddress, options) => {
779
- if (!walletClient || !address) return null;
780
- const resolvedAccountAddress = accountAddress ?? address;
781
- if (!options?.force) {
782
- const inStore = getToken(resolvedAccountAddress, chainId);
783
- if (inStore) {
784
- logSymmAuth("refresh:store-hit", {
785
- accountAddress: resolvedAccountAddress,
786
- chainId
787
- });
788
- return inStore;
789
- }
790
- const cached = getCachedToken(resolvedAccountAddress, chainId);
791
- if (cached) {
792
- setToken(resolvedAccountAddress, chainId, cached);
793
- logSymmAuth("refresh:local-storage-hit", {
794
- accountAddress: resolvedAccountAddress,
795
- chainId
796
- });
797
- return cached;
798
- }
829
+ const resolvedAccountAddress = accountAddress ?? activeAccountAddress;
830
+ if (!resolvedAccountAddress) {
831
+ logSymmAuth("refresh:skip-no-active-account", {
832
+ signerAddress: address,
833
+ chainId
834
+ });
835
+ return null;
799
836
  }
837
+ if (!walletClient || !address) return null;
800
838
  try {
801
839
  logSymmAuth("refresh:fetch-start", {
802
840
  signerAddress: address,
@@ -804,14 +842,16 @@ function useSymmAuth(params) {
804
842
  chainId,
805
843
  force: options?.force ?? false
806
844
  });
807
- const token2 = await fetchAccessToken(
845
+ const tokenEntry = await resolveAuthTokenEntry({
846
+ queryClient,
808
847
  walletClient,
809
- address,
810
- resolvedAccountAddress,
848
+ signerAddress: address,
849
+ accountAddress: resolvedAccountAddress,
811
850
  chainId,
812
- siweDomain
813
- );
814
- setToken(resolvedAccountAddress, chainId, token2);
851
+ siweDomain,
852
+ force: options?.force
853
+ });
854
+ const token2 = tokenEntry?.token ?? null;
815
855
  logSymmAuth("refresh:fetch-success", {
816
856
  signerAddress: address,
817
857
  accountAddress: resolvedAccountAddress,
@@ -819,7 +859,7 @@ function useSymmAuth(params) {
819
859
  });
820
860
  return token2;
821
861
  } catch (error) {
822
- clearToken(resolvedAccountAddress, chainId);
862
+ clearPersistedAuthState(resolvedAccountAddress, chainId);
823
863
  logSymmAuth("refresh:fetch-failed", {
824
864
  signerAddress: address,
825
865
  accountAddress: resolvedAccountAddress,
@@ -829,104 +869,49 @@ function useSymmAuth(params) {
829
869
  return null;
830
870
  }
831
871
  },
832
- [walletClient, address, chainId, siweDomain, getToken, setToken, clearToken]
833
- );
834
- refreshAuthRef.current = refreshAuth;
835
- const clearAuth = useCallback(() => {
836
- if (address) {
837
- clearCachedToken(address, chainId);
838
- clearToken(address, chainId);
839
- }
840
- }, [address, chainId, clearToken]);
841
- useEffect(() => {
842
- const previousAddress = previousAddressRef.current;
843
- const previousChainId = previousChainIdRef.current;
844
- const addressChanged = previousAddress !== address;
845
- const chainChanged = previousChainId !== chainId;
846
- let cancelled = false;
847
- previousAddressRef.current = address;
848
- previousChainIdRef.current = chainId;
849
- logSymmAuth("bootstrap:dependencies", {
872
+ [
873
+ walletClient,
850
874
  address,
875
+ activeAccountAddress,
851
876
  chainId,
852
- hasWalletClient: !!walletClient,
853
- hasSymmCoreClient: !!symmCoreClient,
854
- hasRefreshAuth: !!refreshAuthRef.current,
855
- addressChanged,
856
- chainChanged,
857
- previousAddress,
858
- previousChainId
859
- });
860
- if (!address) {
861
- logSymmAuth("bootstrap:skip-no-address", {
862
- chainId,
863
- hasWalletClient: !!walletClient,
864
- hasSymmCoreClient: !!symmCoreClient
865
- });
866
- return;
867
- }
868
- const userAddress = address;
869
- if (previousAddress && (addressChanged || chainChanged)) {
870
- clearCachedToken(previousAddress, previousChainId);
871
- clearToken(previousAddress, previousChainId);
872
- }
873
- async function bootstrapAuth() {
874
- logSymmAuth("bootstrap:run", {
875
- userAddress,
876
- chainId,
877
- hasWalletClient: !!walletClient,
878
- hasSymmCoreClient: !!symmCoreClient,
879
- hasRefreshAuth: !!refreshAuthRef.current
880
- });
881
- let targets = [userAddress];
882
- if (symmCoreClient) {
883
- try {
884
- const summary = await symmCoreClient.accounts.getSummary({
885
- userAddress,
886
- chainId
887
- });
888
- const subaccounts = extractSubaccountAddresses(summary);
889
- if (subaccounts.length > 0) {
890
- targets = subaccounts;
891
- }
892
- logSymmAuth("bootstrap:subaccounts-resolved", {
893
- userAddress,
894
- chainId,
895
- subaccounts
896
- });
897
- } catch (error) {
898
- logSymmAuth("bootstrap:subaccounts-failed", {
899
- userAddress,
900
- chainId,
901
- error: error instanceof Error ? error.message : String(error)
902
- });
903
- }
904
- }
905
- const uniqueTargets = [...new Set(targets)].filter(
906
- (accountAddress) => !!accountAddress
907
- );
908
- logSymmAuth("bootstrap:start", {
909
- userAddress,
877
+ siweDomain,
878
+ queryClient
879
+ ]
880
+ );
881
+ const authQuery = useQuery({
882
+ queryKey: symmKeys.auth(activeAccountAddress, chainId),
883
+ queryFn: async () => {
884
+ const tokenEntry = await resolveAuthTokenEntry({
885
+ queryClient,
886
+ walletClient,
887
+ signerAddress: address,
888
+ accountAddress: activeAccountAddress,
910
889
  chainId,
911
- targets: uniqueTargets,
912
- walletReady: !!walletClient
890
+ siweDomain
913
891
  });
914
- for (const accountAddress of uniqueTargets) {
915
- if (cancelled) {
916
- return;
917
- }
918
- await refreshAuthRef.current(accountAddress);
892
+ if (!tokenEntry) {
893
+ return null;
919
894
  }
895
+ return tokenEntry;
896
+ },
897
+ enabled: canBootstrap,
898
+ retry: false,
899
+ refetchOnWindowFocus: false,
900
+ refetchOnReconnect: false
901
+ });
902
+ const clearAuth = useCallback(() => {
903
+ if (activeAccountAddress) {
904
+ clearAuthState(queryClient, activeAccountAddress, chainId);
920
905
  }
921
- bootstrapAuth();
922
- return () => {
923
- cancelled = true;
924
- };
925
- }, [address, walletClient, chainId, symmCoreClient]);
906
+ }, [activeAccountAddress, chainId, queryClient]);
907
+ const token = authQuery.data?.token ?? null;
926
908
  return {
927
909
  accessToken: token,
928
910
  authToken: token,
929
911
  isAuthenticated: !!token,
912
+ isLoading: authQuery.isLoading,
913
+ isFetching: authQuery.isFetching,
914
+ error: authQuery.error,
930
915
  refresh: refreshAuth,
931
916
  refreshAuth,
932
917
  clear: clearAuth
@@ -1418,6 +1403,30 @@ function prepareDelegateAccess(multiAccount, account, params) {
1418
1403
  config: { account, to: multiAccount, data, value: 0n }
1419
1404
  };
1420
1405
  }
1406
+ function prepareProposeRevoke(multiAccount, account, params) {
1407
+ const data = encodeFunctionData({
1408
+ abi: MultiAccountABI,
1409
+ functionName: "proposeToRevokeAccesses",
1410
+ args: [params.account, params.target, params.selectors]
1411
+ });
1412
+ return {
1413
+ functionName: "proposeToRevokeAccesses",
1414
+ args: [params.account, params.target, params.selectors],
1415
+ config: { account, to: multiAccount, data, value: 0n }
1416
+ };
1417
+ }
1418
+ function prepareRevokeAccess(multiAccount, account, params) {
1419
+ const data = encodeFunctionData({
1420
+ abi: MultiAccountABI,
1421
+ functionName: "revokeAccesses",
1422
+ args: [params.account, params.target, params.selectors]
1423
+ });
1424
+ return {
1425
+ functionName: "revokeAccesses",
1426
+ args: [params.account, params.target, params.selectors],
1427
+ config: { account, to: multiAccount, data, value: 0n }
1428
+ };
1429
+ }
1421
1430
  async function delegateAccess(walletClient, publicClient, multiAccount, params) {
1422
1431
  const account = walletClient.account?.address;
1423
1432
  if (!account) throw new Error("Wallet client has no account");
@@ -1429,6 +1438,28 @@ async function delegateAccess(walletClient, publicClient, multiAccount, params)
1429
1438
  chain: walletClient.chain
1430
1439
  });
1431
1440
  }
1441
+ async function proposeRevoke(walletClient, publicClient, multiAccount, params) {
1442
+ const account = walletClient.account?.address;
1443
+ if (!account) throw new Error("Wallet client has no account");
1444
+ const prepared = prepareProposeRevoke(multiAccount, account, params);
1445
+ const gas = await publicClient.estimateGas(prepared.config);
1446
+ return walletClient.sendTransaction({
1447
+ ...prepared.config,
1448
+ gas: calculateGasMargin(gas),
1449
+ chain: walletClient.chain
1450
+ });
1451
+ }
1452
+ async function revokeAccess(walletClient, publicClient, multiAccount, params) {
1453
+ const account = walletClient.account?.address;
1454
+ if (!account) throw new Error("Wallet client has no account");
1455
+ const prepared = prepareRevokeAccess(multiAccount, account, params);
1456
+ const gas = await publicClient.estimateGas(prepared.config);
1457
+ return walletClient.sendTransaction({
1458
+ ...prepared.config,
1459
+ gas: calculateGasMargin(gas),
1460
+ chain: walletClient.chain
1461
+ });
1462
+ }
1432
1463
  async function hasDelegatedAccess(publicClient, multiAccount, params) {
1433
1464
  validateAddress(params.account, "subAccount");
1434
1465
  validateAddress(params.target, "target");
@@ -1441,52 +1472,61 @@ async function hasDelegatedAccess(publicClient, multiAccount, params) {
1441
1472
  return Boolean(result);
1442
1473
  }
1443
1474
 
1444
- // src/react/query-keys.ts
1445
- var symmKeys = {
1446
- all: ["symm"],
1447
- accounts: (address, chainId) => ["symm", "accounts", address, chainId],
1448
- accountsApi: (address, chainId) => ["symm", "accountsApi", address, chainId],
1449
- accountsLength: (address, chainId) => ["symm", "accountsLength", address, chainId],
1450
- accountsWithPositions: (address, chainId) => ["symm", "accountsWithPositions", address, chainId],
1451
- accountSummary: (address, chainId) => ["symm", "accountSummary", address, chainId],
1452
- accountData: (address, chainId, upnl) => ["symm", "accountData", address, chainId, upnl],
1453
- signature: (address, chainId) => ["symm", "signature", address, chainId],
1454
- approval: (owner, spender, chainId, token) => ["symm", "approval", owner, spender, chainId, token],
1455
- balances: (address, chainId) => ["symm", "balances", address, chainId],
1456
- positions: (params) => ["symm", "positions", params],
1457
- openOrders: (params) => ["symm", "openOrders", params],
1458
- tradeHistory: (params) => ["symm", "tradeHistory", params],
1459
- tpslOrders: (address, chainId) => ["symm", "tpslOrders", address, chainId],
1460
- tpslOrdersList: (params) => ["symm", "tpslOrders", params],
1461
- twapOrders: (address, chainId) => ["symm", "twapOrders", address, chainId],
1462
- triggerOrders: (params) => ["symm", "triggerOrders", params],
1463
- triggerConfig: (orderId) => ["symm", "triggerConfig", orderId],
1464
- markets: (chainId, search) => ["symm", "markets", chainId, search],
1465
- hedgerMarketById: (id, chainId) => ["symm", "hedgerMarketById", id, chainId],
1466
- hedgerMarketBySymbol: (symbol, chainId) => ["symm", "hedgerMarketBySymbol", symbol, chainId],
1467
- lockedParams: (marketName, leverage, chainId) => ["symm", "lockedParams", marketName, leverage, chainId],
1468
- hedgerMarkets: (request) => ["symm", "hedgerMarkets", request],
1469
- fundingRates: (chainId) => ["symm", "fundingRates", chainId],
1470
- fundingPayments: (params) => ["symm", "fundingPayments", params],
1471
- fundingHistory: (params) => ["symm", "fundingHistory", params],
1472
- portfolio: (params) => ["symm", "portfolio", params],
1473
- notifications: (address, chainId) => ["symm", "notifications", address, chainId],
1474
- unreadCount: (address, chainId) => ["symm", "unreadCount", address, chainId],
1475
- availableMargin: (address, chainId) => ["symm", "availableMargin", address, chainId],
1476
- pendingIds: (address, chainId) => ["symm", "pendingIds", address, chainId],
1477
- pendingInstantOpens: (accountAddress, chainId) => ["symm", "pendingInstantOpens", accountAddress, chainId],
1478
- twapOrder: (orderId) => ["symm", "twapOrder", orderId],
1479
- delegation: (account, target, selectors, chainId) => ["symm", "delegation", account, target, selectors, chainId],
1480
- chartMetadata: (symbolsKey, positionKey) => ["symm", "chartMetadata", symbolsKey, positionKey]
1481
- };
1475
+ // src/react/mutation-config.ts
1476
+ function withSymmMutationConfig(config, internal) {
1477
+ const {
1478
+ onSuccess: configOnSuccess,
1479
+ onError: configOnError,
1480
+ onSettled: configOnSettled,
1481
+ ...rest
1482
+ } = config ?? {};
1483
+ return {
1484
+ ...rest,
1485
+ onSuccess: async (...args) => {
1486
+ await internal?.onSuccess?.(...args);
1487
+ await configOnSuccess?.(...args);
1488
+ },
1489
+ onError: async (...args) => {
1490
+ await internal?.onError?.(...args);
1491
+ await configOnError?.(...args);
1492
+ },
1493
+ onSettled: async (...args) => {
1494
+ await internal?.onSettled?.(...args);
1495
+ await configOnSettled?.(...args);
1496
+ }
1497
+ };
1498
+ }
1482
1499
 
1483
1500
  // src/react/hooks/use-symm-delegation.ts
1484
- function useSymmDelegation(params) {
1501
+ function useResolvedDelegationConfig() {
1485
1502
  const { chainId, address, symmioConfig } = useSymmContext();
1486
1503
  const multiAccount = symmioConfig?.multiAccountAddress ?? getAddress(MULTI_ACCOUNT_ADDRESS, chainId, "MultiAccount");
1504
+ const target = DEFAULT_PARTY_B_ADDRESS[chainId];
1505
+ return {
1506
+ address,
1507
+ chainId,
1508
+ defaultTarget: target,
1509
+ multiAccount
1510
+ };
1511
+ }
1512
+ function resolveDelegationRequest(variables, defaultTarget, defaultSelectors) {
1513
+ const target = variables.target ?? defaultTarget;
1514
+ const selectors = variables.selectors ?? defaultSelectors ?? ALL_TRADING_SELECTORS;
1515
+ if (!target) throw new Error("delegation target is not configured");
1516
+ if (selectors.length === 0) {
1517
+ throw new Error("at least one delegation selector is required");
1518
+ }
1519
+ return {
1520
+ account: variables.account,
1521
+ selectors: [...selectors],
1522
+ target
1523
+ };
1524
+ }
1525
+ function useSymmDelegation(params) {
1526
+ const { chainId, address, multiAccount, defaultTarget } = useResolvedDelegationConfig();
1487
1527
  const publicClient = params?.publicClient;
1488
1528
  const accountAddress = params?.accountAddress ?? address;
1489
- const target = params?.target ?? DEFAULT_PARTY_B_ADDRESS[chainId];
1529
+ const target = params?.target ?? defaultTarget;
1490
1530
  const selectors = params?.selectors ?? ALL_TRADING_SELECTORS;
1491
1531
  const consumerEnabled = params?.query?.enabled ?? params?.enabled ?? true;
1492
1532
  const internalEnabled = !!publicClient && !!accountAddress && !!target && selectors.length > 0;
@@ -1521,6 +1561,110 @@ function useSymmDelegation(params) {
1521
1561
  }
1522
1562
  });
1523
1563
  }
1564
+ function useSymmDelegateAccessMutation(params = {}, options) {
1565
+ const queryClient = useQueryClient();
1566
+ const { chainId, multiAccount, defaultTarget } = useResolvedDelegationConfig();
1567
+ const { publicClient, walletClient } = params;
1568
+ return useMutation({
1569
+ ...withSymmMutationConfig(options?.mutation, {
1570
+ onSuccess: async (_data, variables) => {
1571
+ const request = resolveDelegationRequest(
1572
+ variables,
1573
+ params.target ?? defaultTarget,
1574
+ params.selectors
1575
+ );
1576
+ await queryClient.invalidateQueries({
1577
+ queryKey: symmKeys.delegation(
1578
+ request.account,
1579
+ request.target,
1580
+ request.selectors,
1581
+ chainId
1582
+ )
1583
+ });
1584
+ }
1585
+ }),
1586
+ mutationFn: async (variables) => {
1587
+ if (!walletClient || !publicClient) throw new Error("Clients not available");
1588
+ const request = resolveDelegationRequest(
1589
+ variables,
1590
+ params.target ?? defaultTarget,
1591
+ params.selectors
1592
+ );
1593
+ return delegateAccess(walletClient, publicClient, multiAccount, {
1594
+ account: request.account,
1595
+ target: request.target,
1596
+ selectors: request.selectors,
1597
+ activate: true
1598
+ });
1599
+ }
1600
+ });
1601
+ }
1602
+ function useSymmProposeRevokeDelegationMutation(params = {}, options) {
1603
+ const queryClient = useQueryClient();
1604
+ const { chainId, multiAccount, defaultTarget } = useResolvedDelegationConfig();
1605
+ const { publicClient, walletClient } = params;
1606
+ return useMutation({
1607
+ ...withSymmMutationConfig(options?.mutation, {
1608
+ onSuccess: async (_data, variables) => {
1609
+ const request = resolveDelegationRequest(
1610
+ variables,
1611
+ params.target ?? defaultTarget,
1612
+ params.selectors
1613
+ );
1614
+ await queryClient.invalidateQueries({
1615
+ queryKey: symmKeys.delegation(
1616
+ request.account,
1617
+ request.target,
1618
+ request.selectors,
1619
+ chainId
1620
+ )
1621
+ });
1622
+ }
1623
+ }),
1624
+ mutationFn: async (variables) => {
1625
+ if (!walletClient || !publicClient) throw new Error("Clients not available");
1626
+ const request = resolveDelegationRequest(
1627
+ variables,
1628
+ params.target ?? defaultTarget,
1629
+ params.selectors
1630
+ );
1631
+ return proposeRevoke(walletClient, publicClient, multiAccount, request);
1632
+ }
1633
+ });
1634
+ }
1635
+ function useSymmRevokeDelegationMutation(params = {}, options) {
1636
+ const queryClient = useQueryClient();
1637
+ const { chainId, multiAccount, defaultTarget } = useResolvedDelegationConfig();
1638
+ const { publicClient, walletClient } = params;
1639
+ return useMutation({
1640
+ ...withSymmMutationConfig(options?.mutation, {
1641
+ onSuccess: async (_data, variables) => {
1642
+ const request = resolveDelegationRequest(
1643
+ variables,
1644
+ params.target ?? defaultTarget,
1645
+ params.selectors
1646
+ );
1647
+ await queryClient.invalidateQueries({
1648
+ queryKey: symmKeys.delegation(
1649
+ request.account,
1650
+ request.target,
1651
+ request.selectors,
1652
+ chainId
1653
+ )
1654
+ });
1655
+ }
1656
+ }),
1657
+ mutationFn: async (variables) => {
1658
+ if (!walletClient || !publicClient) throw new Error("Clients not available");
1659
+ const request = resolveDelegationRequest(
1660
+ variables,
1661
+ params.target ?? defaultTarget,
1662
+ params.selectors
1663
+ );
1664
+ return revokeAccess(walletClient, publicClient, multiAccount, request);
1665
+ }
1666
+ });
1667
+ }
1524
1668
 
1525
1669
  // src/react/cache.ts
1526
1670
  function invalidateBalances(qc) {
@@ -1542,31 +1686,6 @@ function invalidateOrders(qc) {
1542
1686
  qc.invalidateQueries({ queryKey: ["symm", "triggerOrders"] });
1543
1687
  }
1544
1688
 
1545
- // src/react/mutation-config.ts
1546
- function withSymmMutationConfig(config, internal) {
1547
- const {
1548
- onSuccess: configOnSuccess,
1549
- onError: configOnError,
1550
- onSettled: configOnSettled,
1551
- ...rest
1552
- } = config ?? {};
1553
- return {
1554
- ...rest,
1555
- onSuccess: async (...args) => {
1556
- await internal?.onSuccess?.(...args);
1557
- await configOnSuccess?.(...args);
1558
- },
1559
- onError: async (...args) => {
1560
- await internal?.onError?.(...args);
1561
- await configOnError?.(...args);
1562
- },
1563
- onSettled: async (...args) => {
1564
- await internal?.onSettled?.(...args);
1565
- await configOnSettled?.(...args);
1566
- }
1567
- };
1568
- }
1569
-
1570
1689
  // src/react/hooks/use-symm-instant-trade.ts
1571
1690
  function useInstantTradeDeps(params) {
1572
1691
  const { symmCoreClient, chainId, address, symmioConfig } = useSymmContext();
@@ -1596,7 +1715,7 @@ async function ensureInstantTradeReady(deps, queryClient, request) {
1596
1715
  if (selectors.length === 0) {
1597
1716
  throw new Error("at least one delegation selector is required");
1598
1717
  }
1599
- const accessToken = useSymmAuthStore.getState().getToken(accountAddress, chainId);
1718
+ const accessToken = getAuthTokenFromRuntimeCache(queryClient, accountAddress, chainId);
1600
1719
  if (!accessToken) {
1601
1720
  throw new Error("auth token is required for instant trading");
1602
1721
  }
@@ -2009,7 +2128,7 @@ function useSymmCancelClose(options) {
2009
2128
  }
2010
2129
  const resolvedAccountAddress = accountAddress ?? address;
2011
2130
  const resolvedChainId = overrideChainId ?? chainId;
2012
- const resolvedAuthToken = authToken ?? (resolvedAccountAddress ? useSymmAuthStore.getState().getToken(resolvedAccountAddress, resolvedChainId) : null);
2131
+ const resolvedAuthToken = authToken ?? (resolvedAccountAddress ? getAuthTokenFromRuntimeCache(queryClient, resolvedAccountAddress, resolvedChainId) : null);
2013
2132
  if (!resolvedAuthToken) {
2014
2133
  throw new Error("auth token is required to cancel a pending close");
2015
2134
  }
@@ -2040,7 +2159,7 @@ function useSymmCloseOrder(options) {
2040
2159
  return symmCoreClient.orders.close(request.id, {
2041
2160
  kind: request.kind,
2042
2161
  type: request.type,
2043
- authToken: request.authToken ?? (resolvedAccountAddress ? useSymmAuthStore.getState().getToken(resolvedAccountAddress, chainId) ?? void 0 : void 0)
2162
+ authToken: request.authToken ?? (resolvedAccountAddress ? getAuthTokenFromRuntimeCache(queryClient, resolvedAccountAddress, chainId) ?? void 0 : void 0)
2044
2163
  });
2045
2164
  }
2046
2165
  });
@@ -25170,6 +25289,7 @@ function splitTradeHookArgs(paramsOrOptions, options) {
25170
25289
  }
25171
25290
  function useResolveTradeAuthToken(params = {}) {
25172
25291
  const context = useSymmContext();
25292
+ const queryClient = useQueryClient();
25173
25293
  const address = params.address ?? context.address;
25174
25294
  const chainId = params.chainId ?? context.chainId;
25175
25295
  const { refreshAuth } = useSymmAuth({
@@ -25192,7 +25312,11 @@ function useResolveTradeAuthToken(params = {}) {
25192
25312
  if (!resolvedAccountAddress) {
25193
25313
  return null;
25194
25314
  }
25195
- const inMemoryToken = useSymmAuthStore.getState().getToken(resolvedAccountAddress, chainId);
25315
+ const inMemoryToken = getAuthTokenFromRuntimeCache(
25316
+ queryClient,
25317
+ resolvedAccountAddress,
25318
+ chainId
25319
+ );
25196
25320
  if (inMemoryToken) {
25197
25321
  logTradeAuth("resolve-auth:store-hit", {
25198
25322
  accountAddress: resolvedAccountAddress,
@@ -25213,7 +25337,7 @@ function useResolveTradeAuthToken(params = {}) {
25213
25337
  });
25214
25338
  return refreshAuth(resolvedAccountAddress);
25215
25339
  },
25216
- [address, chainId, refreshAuth, refreshAuthFromContext]
25340
+ [address, chainId, queryClient, refreshAuth, refreshAuthFromContext]
25217
25341
  );
25218
25342
  }
25219
25343
  function useSymmOpenBasketMutation(options) {
@@ -25952,6 +26076,7 @@ function useSymmPendingInstantOpens(params) {
25952
26076
  symmCoreClient,
25953
26077
  chainId: ctxChainId
25954
26078
  } = useSymmContext();
26079
+ const queryClient = useQueryClient();
25955
26080
  const { accountAddress, authToken: providedAuthToken } = params;
25956
26081
  const chainId = params.chainId ?? ctxChainId;
25957
26082
  const internalEnabled = !!symmCoreClient && !!accountAddress;
@@ -25959,7 +26084,7 @@ function useSymmPendingInstantOpens(params) {
25959
26084
  ...params.query,
25960
26085
  queryKey: symmKeys.pendingInstantOpens(accountAddress, chainId),
25961
26086
  queryFn: async () => {
25962
- const authToken = providedAuthToken ?? useSymmAuthStore.getState().getToken(accountAddress, chainId);
26087
+ const authToken = providedAuthToken ?? getAuthTokenFromRuntimeCache(queryClient, accountAddress, chainId);
25963
26088
  if (!authToken) {
25964
26089
  throw new Error("failed to acquire auth token for pending instant opens");
25965
26090
  }
@@ -26840,6 +26965,6 @@ function getSymmErrorMessage(error) {
26840
26965
  return "An unexpected error occurred.";
26841
26966
  }
26842
26967
 
26843
- export { SymmProvider, getSymmErrorMessage, symmKeys, useBinanceMarkPriceStore, useSymmAccountData, useSymmAccountSummary, useSymmAccountsApi, useSymmAccountsLength, useSymmAccountsQuery, useSymmAccountsWithPositions, useSymmAllocateCollateralMutation, useSymmApprovalQuery, useSymmApproveMutation, useSymmAuth, useSymmAuthStore, useSymmAvailableMargin, useSymmBalances, useSymmCancelClose, useSymmCancelOpenMutation, useSymmCancelTpslMutation, useSymmCancelTwapOrderMutation, useSymmChartCandles, useSymmChartSelection, useSymmClearTriggerConfigMutation, useSymmCloseAllPositionsMutation, useSymmCloseOrder, useSymmClosePositionMutation, useSymmContext, useSymmCoreClient, useSymmCreateAccountMutation, useSymmDeallocateCollateralMutation, useSymmDelegation, useSymmDepositAndAllocateMutation, useSymmDepositMutation, useSymmEditAccountNameMutation, useSymmFunding, useSymmFundingHistory, useSymmFundingPayments, useSymmHedgerMarketById, useSymmHedgerMarketBySymbol, useSymmHedgerMarkets, useSymmInstantTradeEnsureReadyMutation, useSymmInstantTradeExecuteMutation, useSymmInternalTransferCollateralMutation, useSymmLockedParams, useSymmMarkReadNotificationMutation, useSymmMarkets, useSymmNotificationsQuery, useSymmOpenBasketMutation, useSymmOpenOrders, useSymmPendingIds, useSymmPendingInstantOpens, useSymmPerformanceOverlays, useSymmPortfolio, useSymmPositions, useSymmSetTpslMutation, useSymmSetTriggerConfigMutation, useSymmSignTermsMutation, useSymmSignatureQuery, useSymmTokenMarkPrice, useSymmTokenSelectionMarkets, useSymmTokenSelectionMetadata, useSymmTpslOrders, useSymmTradeHistory, useSymmTriggerConfigQuery, useSymmTriggerOrders, useSymmTwapOrder, useSymmTwapOrdersQuery, useSymmUnreadCountQuery, useSymmUpdatePositionMutation, useSymmWithdraw, useSymmWs, useSymmWsStore };
26968
+ export { SymmProvider, getSymmErrorMessage, symmKeys, useBinanceMarkPriceStore, useSymmAccountData, useSymmAccountSummary, useSymmAccountsApi, useSymmAccountsLength, useSymmAccountsQuery, useSymmAccountsWithPositions, useSymmAllocateCollateralMutation, useSymmApprovalQuery, useSymmApproveMutation, useSymmAuth, useSymmAvailableMargin, useSymmBalances, useSymmCancelClose, useSymmCancelOpenMutation, useSymmCancelTpslMutation, useSymmCancelTwapOrderMutation, useSymmChartCandles, useSymmChartSelection, useSymmClearTriggerConfigMutation, useSymmCloseAllPositionsMutation, useSymmCloseOrder, useSymmClosePositionMutation, useSymmContext, useSymmCoreClient, useSymmCreateAccountMutation, useSymmDeallocateCollateralMutation, useSymmDelegateAccessMutation, useSymmDelegation, useSymmDepositAndAllocateMutation, useSymmDepositMutation, useSymmEditAccountNameMutation, useSymmFunding, useSymmFundingHistory, useSymmFundingPayments, useSymmHedgerMarketById, useSymmHedgerMarketBySymbol, useSymmHedgerMarkets, useSymmInstantTradeEnsureReadyMutation, useSymmInstantTradeExecuteMutation, useSymmInternalTransferCollateralMutation, useSymmLockedParams, useSymmMarkReadNotificationMutation, useSymmMarkets, useSymmNotificationsQuery, useSymmOpenBasketMutation, useSymmOpenOrders, useSymmPendingIds, useSymmPendingInstantOpens, useSymmPerformanceOverlays, useSymmPortfolio, useSymmPositions, useSymmProposeRevokeDelegationMutation, useSymmRevokeDelegationMutation, useSymmSetTpslMutation, useSymmSetTriggerConfigMutation, useSymmSignTermsMutation, useSymmSignatureQuery, useSymmTokenMarkPrice, useSymmTokenSelectionMarkets, useSymmTokenSelectionMetadata, useSymmTpslOrders, useSymmTradeHistory, useSymmTriggerConfigQuery, useSymmTriggerOrders, useSymmTwapOrder, useSymmTwapOrdersQuery, useSymmUnreadCountQuery, useSymmUpdatePositionMutation, useSymmWithdraw, useSymmWs, useSymmWsStore };
26844
26969
  //# sourceMappingURL=index.mjs.map
26845
26970
  //# sourceMappingURL=index.mjs.map