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