@mysten/dapp-kit 0.11.1 → 0.12.1

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.
Files changed (36) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/dist/cjs/components/WalletProvider.d.ts +4 -1
  3. package/dist/cjs/components/WalletProvider.js +43 -6
  4. package/dist/cjs/components/WalletProvider.js.map +4 -4
  5. package/dist/cjs/constants/walletDefaults.d.ts +1 -0
  6. package/dist/cjs/constants/walletDefaults.js +3 -0
  7. package/dist/cjs/constants/walletDefaults.js.map +2 -2
  8. package/dist/cjs/hooks/useSuiClientInfiniteQuery.d.ts +1 -0
  9. package/dist/cjs/hooks/useSuiClientInfiniteQuery.js +1 -1
  10. package/dist/cjs/hooks/useSuiClientInfiniteQuery.js.map +2 -2
  11. package/dist/cjs/hooks/wallet/useZkSendWallet.d.ts +5 -0
  12. package/dist/cjs/hooks/wallet/useZkSendWallet.js +251 -0
  13. package/dist/cjs/hooks/wallet/useZkSendWallet.js.map +7 -0
  14. package/dist/cjs/index.js +44 -7
  15. package/dist/cjs/index.js.map +4 -4
  16. package/dist/esm/components/WalletProvider.d.ts +4 -1
  17. package/dist/esm/components/WalletProvider.js +41 -4
  18. package/dist/esm/components/WalletProvider.js.map +4 -4
  19. package/dist/esm/constants/walletDefaults.d.ts +1 -0
  20. package/dist/esm/constants/walletDefaults.js +5 -0
  21. package/dist/esm/constants/walletDefaults.js.map +3 -3
  22. package/dist/esm/hooks/useSuiClientInfiniteQuery.d.ts +1 -0
  23. package/dist/esm/hooks/useSuiClientInfiniteQuery.js +1 -1
  24. package/dist/esm/hooks/useSuiClientInfiniteQuery.js.map +2 -2
  25. package/dist/esm/hooks/wallet/useZkSendWallet.d.ts +5 -0
  26. package/dist/esm/hooks/wallet/useZkSendWallet.js +230 -0
  27. package/dist/esm/hooks/wallet/useZkSendWallet.js.map +7 -0
  28. package/dist/esm/index.js +42 -5
  29. package/dist/esm/index.js.map +4 -4
  30. package/dist/tsconfig.esm.tsbuildinfo +1 -1
  31. package/dist/tsconfig.tsbuildinfo +1 -1
  32. package/package.json +4 -3
  33. package/src/components/WalletProvider.tsx +17 -10
  34. package/src/constants/walletDefaults.ts +3 -0
  35. package/src/hooks/useSuiClientInfiniteQuery.ts +4 -2
  36. package/src/hooks/wallet/useZkSendWallet.ts +49 -0
@@ -0,0 +1,230 @@
1
+ // src/hooks/wallet/useZkSendWallet.ts
2
+ import { registerZkSendWallet } from "@mysten/zksend";
3
+ import { useEffect, useLayoutEffect as useLayoutEffect2, useState as useState2 } from "react";
4
+
5
+ // src/hooks/wallet/useAutoConnectWallet.ts
6
+ import { useQuery } from "@tanstack/react-query";
7
+ import { useLayoutEffect, useState } from "react";
8
+
9
+ // src/utils/walletUtils.ts
10
+ import { getWallets, isWalletWithRequiredFeatureSet } from "@mysten/wallet-standard";
11
+ function getWalletUniqueIdentifier(wallet) {
12
+ return wallet?.id ?? wallet?.name;
13
+ }
14
+
15
+ // src/hooks/wallet/useConnectWallet.ts
16
+ import { useMutation } from "@tanstack/react-query";
17
+
18
+ // src/constants/walletMutationKeys.ts
19
+ var walletMutationKeys = {
20
+ all: { baseScope: "wallet" },
21
+ connectWallet: formMutationKeyFn("connect-wallet"),
22
+ autoconnectWallet: formMutationKeyFn("autoconnect-wallet"),
23
+ disconnectWallet: formMutationKeyFn("disconnect-wallet"),
24
+ signPersonalMessage: formMutationKeyFn("sign-personal-message"),
25
+ signTransactionBlock: formMutationKeyFn("sign-transaction-block"),
26
+ signAndExecuteTransactionBlock: formMutationKeyFn("sign-and-execute-transaction-block"),
27
+ switchAccount: formMutationKeyFn("switch-account")
28
+ };
29
+ function formMutationKeyFn(baseEntity) {
30
+ return function mutationKeyFn(additionalKeys = []) {
31
+ return [{ ...walletMutationKeys.all, baseEntity }, ...additionalKeys];
32
+ };
33
+ }
34
+
35
+ // src/hooks/wallet/useWalletStore.ts
36
+ import { useContext } from "react";
37
+ import { useStore } from "zustand";
38
+
39
+ // src/contexts/walletContext.ts
40
+ import { createContext } from "react";
41
+ var WalletContext = createContext(null);
42
+
43
+ // src/hooks/wallet/useWalletStore.ts
44
+ function useWalletStore(selector) {
45
+ const store = useContext(WalletContext);
46
+ if (!store) {
47
+ throw new Error(
48
+ "Could not find WalletContext. Ensure that you have set up the WalletProvider."
49
+ );
50
+ }
51
+ return useStore(store, selector);
52
+ }
53
+
54
+ // src/hooks/wallet/useConnectWallet.ts
55
+ function useConnectWallet({
56
+ mutationKey,
57
+ ...mutationOptions
58
+ } = {}) {
59
+ const setWalletConnected = useWalletStore((state) => state.setWalletConnected);
60
+ const setConnectionStatus = useWalletStore((state) => state.setConnectionStatus);
61
+ return useMutation({
62
+ mutationKey: walletMutationKeys.connectWallet(mutationKey),
63
+ mutationFn: async ({ wallet, accountAddress, ...connectArgs }) => {
64
+ try {
65
+ setConnectionStatus("connecting");
66
+ const connectResult = await wallet.features["standard:connect"].connect(connectArgs);
67
+ const connectedSuiAccounts = connectResult.accounts.filter(
68
+ (account) => account.chains.some((chain) => chain.split(":")[0] === "sui")
69
+ );
70
+ const selectedAccount = getSelectedAccount(connectedSuiAccounts, accountAddress);
71
+ setWalletConnected(wallet, connectedSuiAccounts, selectedAccount);
72
+ return { accounts: connectedSuiAccounts };
73
+ } catch (error) {
74
+ setConnectionStatus("disconnected");
75
+ throw error;
76
+ }
77
+ },
78
+ ...mutationOptions
79
+ });
80
+ }
81
+ function getSelectedAccount(connectedAccounts, accountAddress) {
82
+ if (connectedAccounts.length === 0) {
83
+ return null;
84
+ }
85
+ if (accountAddress) {
86
+ const selectedAccount = connectedAccounts.find((account) => account.address === accountAddress);
87
+ return selectedAccount ?? connectedAccounts[0];
88
+ }
89
+ return connectedAccounts[0];
90
+ }
91
+
92
+ // src/hooks/wallet/useCurrentWallet.ts
93
+ function useCurrentWallet() {
94
+ const currentWallet = useWalletStore((state) => state.currentWallet);
95
+ const connectionStatus = useWalletStore((state) => state.connectionStatus);
96
+ switch (connectionStatus) {
97
+ case "connecting":
98
+ return {
99
+ connectionStatus,
100
+ currentWallet: null,
101
+ isDisconnected: false,
102
+ isConnecting: true,
103
+ isConnected: false
104
+ };
105
+ case "disconnected":
106
+ return {
107
+ connectionStatus,
108
+ currentWallet: null,
109
+ isDisconnected: true,
110
+ isConnecting: false,
111
+ isConnected: false
112
+ };
113
+ case "connected": {
114
+ return {
115
+ connectionStatus,
116
+ currentWallet,
117
+ isDisconnected: false,
118
+ isConnecting: false,
119
+ isConnected: true
120
+ };
121
+ }
122
+ }
123
+ }
124
+
125
+ // src/hooks/wallet/useWallets.ts
126
+ function useWallets() {
127
+ return useWalletStore((state) => state.wallets);
128
+ }
129
+
130
+ // src/hooks/wallet/useAutoConnectWallet.ts
131
+ function useAutoConnectWallet() {
132
+ const { mutateAsync: connectWallet } = useConnectWallet();
133
+ const autoConnectEnabled = useWalletStore((state) => state.autoConnectEnabled);
134
+ const lastConnectedWalletName = useWalletStore((state) => state.lastConnectedWalletName);
135
+ const lastConnectedAccountAddress = useWalletStore((state) => state.lastConnectedAccountAddress);
136
+ const wallets = useWallets();
137
+ const { isConnected } = useCurrentWallet();
138
+ const [clientOnly, setClientOnly] = useState(false);
139
+ useLayoutEffect(() => {
140
+ setClientOnly(true);
141
+ }, []);
142
+ const { data, isError } = useQuery({
143
+ queryKey: [
144
+ "@mysten/dapp-kit",
145
+ "autoconnect",
146
+ {
147
+ isConnected,
148
+ autoConnectEnabled,
149
+ lastConnectedWalletName,
150
+ lastConnectedAccountAddress,
151
+ walletCount: wallets.length
152
+ }
153
+ ],
154
+ queryFn: async () => {
155
+ if (!autoConnectEnabled) {
156
+ return "disabled";
157
+ }
158
+ if (!lastConnectedWalletName || !lastConnectedAccountAddress || isConnected) {
159
+ return "attempted";
160
+ }
161
+ const wallet = wallets.find(
162
+ (wallet2) => getWalletUniqueIdentifier(wallet2) === lastConnectedWalletName
163
+ );
164
+ if (wallet) {
165
+ await connectWallet({
166
+ wallet,
167
+ accountAddress: lastConnectedAccountAddress,
168
+ silent: true
169
+ });
170
+ }
171
+ return "attempted";
172
+ },
173
+ enabled: autoConnectEnabled,
174
+ persister: void 0,
175
+ gcTime: 0,
176
+ staleTime: 0,
177
+ networkMode: "always",
178
+ retry: false,
179
+ retryOnMount: false,
180
+ refetchInterval: false,
181
+ refetchIntervalInBackground: false,
182
+ refetchOnMount: false,
183
+ refetchOnReconnect: false,
184
+ refetchOnWindowFocus: false
185
+ });
186
+ if (!autoConnectEnabled) {
187
+ return "disabled";
188
+ }
189
+ if (!clientOnly) {
190
+ return "idle";
191
+ }
192
+ if (isConnected) {
193
+ return "attempted";
194
+ }
195
+ if (!lastConnectedWalletName) {
196
+ return "attempted";
197
+ }
198
+ return isError ? "attempted" : data ?? "idle";
199
+ }
200
+
201
+ // src/hooks/wallet/useZkSendWallet.ts
202
+ function useZkSendWallet(config) {
203
+ const status = useAutoConnectWallet();
204
+ const [address, setAddress] = useState2(null);
205
+ const [wallet, setWallet] = useState2(null);
206
+ const { mutate: connect } = useConnectWallet();
207
+ useEffect(() => {
208
+ if (!address || !wallet || status !== "attempted")
209
+ return;
210
+ connect({ wallet, silent: true });
211
+ setAddress(null);
212
+ }, [address, status, connect, wallet]);
213
+ useLayoutEffect2(() => {
214
+ if (!config?.name) {
215
+ return;
216
+ }
217
+ const { wallet: wallet2, unregister, addressFromRedirect } = registerZkSendWallet(config.name, {
218
+ origin: config.origin
219
+ });
220
+ if (addressFromRedirect) {
221
+ setWallet(wallet2);
222
+ setAddress(addressFromRedirect);
223
+ }
224
+ return unregister;
225
+ }, [config?.name, config?.origin]);
226
+ }
227
+ export {
228
+ useZkSendWallet
229
+ };
230
+ //# sourceMappingURL=useZkSendWallet.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/hooks/wallet/useZkSendWallet.ts", "../../../../src/hooks/wallet/useAutoConnectWallet.ts", "../../../../src/utils/walletUtils.ts", "../../../../src/hooks/wallet/useConnectWallet.ts", "../../../../src/constants/walletMutationKeys.ts", "../../../../src/hooks/wallet/useWalletStore.ts", "../../../../src/contexts/walletContext.ts", "../../../../src/hooks/wallet/useCurrentWallet.ts", "../../../../src/hooks/wallet/useWallets.ts"],
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { ZkSendWallet } from '@mysten/zksend';\nimport { registerZkSendWallet } from '@mysten/zksend';\nimport { useEffect, useLayoutEffect, useState } from 'react';\n\nimport { useAutoConnectWallet } from './useAutoConnectWallet.js';\nimport { useConnectWallet } from './useConnectWallet.js';\n\nexport interface ZkSendWalletConfig {\n\tname: string;\n\torigin?: string;\n}\n\nexport function useZkSendWallet(config?: ZkSendWalletConfig) {\n\tconst status = useAutoConnectWallet();\n\tconst [address, setAddress] = useState<string | null>(null);\n\tconst [wallet, setWallet] = useState<ZkSendWallet | null>(null);\n\tconst { mutate: connect } = useConnectWallet();\n\n\tuseEffect(() => {\n\t\t// This handles an edge case where the user has already connected a wallet, but is coming from\n\t\t// a zkSend redirect, and we want to force the zkSend wallet to connect. We need to wait for the\n\t\t// autoconnection to attempt to connect, then force the zkSend wallet to connect.\n\t\tif (!address || !wallet || status !== 'attempted') return;\n\n\t\tconnect({ wallet, silent: true });\n\t\t// Reset the address since we only want to do this once:\n\t\tsetAddress(null);\n\t}, [address, status, connect, wallet]);\n\n\tuseLayoutEffect(() => {\n\t\tif (!config?.name) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { wallet, unregister, addressFromRedirect } = registerZkSendWallet(config.name, {\n\t\t\torigin: config.origin,\n\t\t});\n\n\t\tif (addressFromRedirect) {\n\t\t\tsetWallet(wallet);\n\t\t\tsetAddress(addressFromRedirect);\n\t\t}\n\n\t\treturn unregister;\n\t}, [config?.name, config?.origin]);\n}\n", "// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { useQuery } from '@tanstack/react-query';\nimport { useLayoutEffect, useState } from 'react';\n\nimport { getWalletUniqueIdentifier } from '../../utils/walletUtils.js';\nimport { useConnectWallet } from './useConnectWallet.js';\nimport { useCurrentWallet } from './useCurrentWallet.js';\nimport { useWallets } from './useWallets.js';\nimport { useWalletStore } from './useWalletStore.js';\n\nexport function useAutoConnectWallet(): 'disabled' | 'idle' | 'attempted' {\n\tconst { mutateAsync: connectWallet } = useConnectWallet();\n\tconst autoConnectEnabled = useWalletStore((state) => state.autoConnectEnabled);\n\tconst lastConnectedWalletName = useWalletStore((state) => state.lastConnectedWalletName);\n\tconst lastConnectedAccountAddress = useWalletStore((state) => state.lastConnectedAccountAddress);\n\tconst wallets = useWallets();\n\tconst { isConnected } = useCurrentWallet();\n\n\tconst [clientOnly, setClientOnly] = useState(false);\n\tuseLayoutEffect(() => {\n\t\tsetClientOnly(true);\n\t}, []);\n\n\tconst { data, isError } = useQuery({\n\t\tqueryKey: [\n\t\t\t'@mysten/dapp-kit',\n\t\t\t'autoconnect',\n\t\t\t{\n\t\t\t\tisConnected,\n\t\t\t\tautoConnectEnabled,\n\t\t\t\tlastConnectedWalletName,\n\t\t\t\tlastConnectedAccountAddress,\n\t\t\t\twalletCount: wallets.length,\n\t\t\t},\n\t\t],\n\t\tqueryFn: async () => {\n\t\t\tif (!autoConnectEnabled) {\n\t\t\t\treturn 'disabled';\n\t\t\t}\n\n\t\t\tif (!lastConnectedWalletName || !lastConnectedAccountAddress || isConnected) {\n\t\t\t\treturn 'attempted';\n\t\t\t}\n\n\t\t\tconst wallet = wallets.find(\n\t\t\t\t(wallet) => getWalletUniqueIdentifier(wallet) === lastConnectedWalletName,\n\t\t\t);\n\t\t\tif (wallet) {\n\t\t\t\tawait connectWallet({\n\t\t\t\t\twallet,\n\t\t\t\t\taccountAddress: lastConnectedAccountAddress,\n\t\t\t\t\tsilent: true,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn 'attempted';\n\t\t},\n\t\tenabled: autoConnectEnabled,\n\t\tpersister: undefined,\n\t\tgcTime: 0,\n\t\tstaleTime: 0,\n\t\tnetworkMode: 'always',\n\t\tretry: false,\n\t\tretryOnMount: false,\n\t\trefetchInterval: false,\n\t\trefetchIntervalInBackground: false,\n\t\trefetchOnMount: false,\n\t\trefetchOnReconnect: false,\n\t\trefetchOnWindowFocus: false,\n\t});\n\n\tif (!autoConnectEnabled) {\n\t\treturn 'disabled';\n\t}\n\n\t// We always initialize with \"idle\" so that in SSR environments, we guarantee that the initial render states always agree:\n\tif (!clientOnly) {\n\t\treturn 'idle';\n\t}\n\n\tif (isConnected) {\n\t\treturn 'attempted';\n\t}\n\n\tif (!lastConnectedWalletName) {\n\t\treturn 'attempted';\n\t}\n\n\treturn isError ? 'attempted' : data ?? 'idle';\n}\n", "// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type {\n\tMinimallyRequiredFeatures,\n\tWallet,\n\tWalletWithFeatures,\n} from '@mysten/wallet-standard';\nimport { getWallets, isWalletWithRequiredFeatureSet } from '@mysten/wallet-standard';\n\nexport function getRegisteredWallets<AdditionalFeatures extends Wallet['features']>(\n\tpreferredWallets: string[],\n\trequiredFeatures?: (keyof AdditionalFeatures)[],\n) {\n\tconst walletsApi = getWallets();\n\tconst wallets = walletsApi.get();\n\n\tconst suiWallets = wallets.filter(\n\t\t(wallet): wallet is WalletWithFeatures<MinimallyRequiredFeatures & AdditionalFeatures> =>\n\t\t\tisWalletWithRequiredFeatureSet(wallet, requiredFeatures),\n\t);\n\n\treturn [\n\t\t// Preferred wallets, in order:\n\t\t...(preferredWallets\n\t\t\t.map((name) => suiWallets.find((wallet) => wallet.name === name))\n\t\t\t.filter(Boolean) as WalletWithFeatures<MinimallyRequiredFeatures & AdditionalFeatures>[]),\n\n\t\t// Wallets in default order:\n\t\t...suiWallets.filter((wallet) => !preferredWallets.includes(wallet.name)),\n\t];\n}\n\nexport function getWalletUniqueIdentifier(wallet?: Wallet) {\n\treturn wallet?.id ?? wallet?.name;\n}\n", "// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type {\n\tStandardConnectInput,\n\tStandardConnectOutput,\n\tWalletAccount,\n\tWalletWithRequiredFeatures,\n} from '@mysten/wallet-standard';\nimport type { UseMutationOptions, UseMutationResult } from '@tanstack/react-query';\nimport { useMutation } from '@tanstack/react-query';\n\nimport { walletMutationKeys } from '../../constants/walletMutationKeys.js';\nimport { useWalletStore } from './useWalletStore.js';\n\ntype ConnectWalletArgs = {\n\t/** The wallet to connect to. */\n\twallet: WalletWithRequiredFeatures;\n\n\t/** An optional account address to connect to. Defaults to the first authorized account. */\n\taccountAddress?: string;\n} & StandardConnectInput;\n\ntype ConnectWalletResult = StandardConnectOutput;\n\ntype UseConnectWalletMutationOptions = Omit<\n\tUseMutationOptions<ConnectWalletResult, Error, ConnectWalletArgs, unknown>,\n\t'mutationFn'\n>;\n\n/**\n * Mutation hook for establishing a connection to a specific wallet.\n */\nexport function useConnectWallet({\n\tmutationKey,\n\t...mutationOptions\n}: UseConnectWalletMutationOptions = {}): UseMutationResult<\n\tConnectWalletResult,\n\tError,\n\tConnectWalletArgs,\n\tunknown\n> {\n\tconst setWalletConnected = useWalletStore((state) => state.setWalletConnected);\n\tconst setConnectionStatus = useWalletStore((state) => state.setConnectionStatus);\n\n\treturn useMutation({\n\t\tmutationKey: walletMutationKeys.connectWallet(mutationKey),\n\t\tmutationFn: async ({ wallet, accountAddress, ...connectArgs }) => {\n\t\t\ttry {\n\t\t\t\tsetConnectionStatus('connecting');\n\n\t\t\t\tconst connectResult = await wallet.features['standard:connect'].connect(connectArgs);\n\t\t\t\tconst connectedSuiAccounts = connectResult.accounts.filter((account) =>\n\t\t\t\t\taccount.chains.some((chain) => chain.split(':')[0] === 'sui'),\n\t\t\t\t);\n\t\t\t\tconst selectedAccount = getSelectedAccount(connectedSuiAccounts, accountAddress);\n\n\t\t\t\tsetWalletConnected(wallet, connectedSuiAccounts, selectedAccount);\n\n\t\t\t\treturn { accounts: connectedSuiAccounts };\n\t\t\t} catch (error) {\n\t\t\t\tsetConnectionStatus('disconnected');\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t},\n\t\t...mutationOptions,\n\t});\n}\n\nfunction getSelectedAccount(connectedAccounts: readonly WalletAccount[], accountAddress?: string) {\n\tif (connectedAccounts.length === 0) {\n\t\treturn null;\n\t}\n\n\tif (accountAddress) {\n\t\tconst selectedAccount = connectedAccounts.find((account) => account.address === accountAddress);\n\t\treturn selectedAccount ?? connectedAccounts[0];\n\t}\n\n\treturn connectedAccounts[0];\n}\n", "// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { MutationKey } from '@tanstack/react-query';\n\nexport const walletMutationKeys = {\n\tall: { baseScope: 'wallet' },\n\tconnectWallet: formMutationKeyFn('connect-wallet'),\n\tautoconnectWallet: formMutationKeyFn('autoconnect-wallet'),\n\tdisconnectWallet: formMutationKeyFn('disconnect-wallet'),\n\tsignPersonalMessage: formMutationKeyFn('sign-personal-message'),\n\tsignTransactionBlock: formMutationKeyFn('sign-transaction-block'),\n\tsignAndExecuteTransactionBlock: formMutationKeyFn('sign-and-execute-transaction-block'),\n\tswitchAccount: formMutationKeyFn('switch-account'),\n};\n\nfunction formMutationKeyFn(baseEntity: string) {\n\treturn function mutationKeyFn(additionalKeys: MutationKey = []) {\n\t\treturn [{ ...walletMutationKeys.all, baseEntity }, ...additionalKeys];\n\t};\n}\n", "// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { useContext } from 'react';\nimport { useStore } from 'zustand';\n\nimport { WalletContext } from '../../contexts/walletContext.js';\nimport type { StoreState } from '../../walletStore.js';\n\nexport function useWalletStore<T>(selector: (state: StoreState) => T): T {\n\tconst store = useContext(WalletContext);\n\tif (!store) {\n\t\tthrow new Error(\n\t\t\t'Could not find WalletContext. Ensure that you have set up the WalletProvider.',\n\t\t);\n\t}\n\treturn useStore(store, selector);\n}\n", "// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { createContext } from 'react';\n\nimport type { WalletStore } from '../walletStore.js';\n\nexport const WalletContext = createContext<WalletStore | null>(null);\n", "// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { useWalletStore } from './useWalletStore.js';\n\n/**\n * Retrieves the wallet that is currently connected to the dApp, if one exists.\n */\nexport function useCurrentWallet() {\n\tconst currentWallet = useWalletStore((state) => state.currentWallet);\n\tconst connectionStatus = useWalletStore((state) => state.connectionStatus);\n\n\tswitch (connectionStatus) {\n\t\tcase 'connecting':\n\t\t\treturn {\n\t\t\t\tconnectionStatus,\n\t\t\t\tcurrentWallet: null,\n\t\t\t\tisDisconnected: false,\n\t\t\t\tisConnecting: true,\n\t\t\t\tisConnected: false,\n\t\t\t} as const;\n\t\tcase 'disconnected':\n\t\t\treturn {\n\t\t\t\tconnectionStatus,\n\t\t\t\tcurrentWallet: null,\n\t\t\t\tisDisconnected: true,\n\t\t\t\tisConnecting: false,\n\t\t\t\tisConnected: false,\n\t\t\t} as const;\n\t\tcase 'connected': {\n\t\t\treturn {\n\t\t\t\tconnectionStatus,\n\t\t\t\tcurrentWallet: currentWallet!,\n\t\t\t\tisDisconnected: false,\n\t\t\t\tisConnecting: false,\n\t\t\t\tisConnected: true,\n\t\t\t} as const;\n\t\t}\n\t}\n}\n", "// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { useWalletStore } from './useWalletStore.js';\n\n/**\n * Retrieves a list of registered wallets available to the dApp sorted by preference.\n */\nexport function useWallets() {\n\treturn useWalletStore((state) => state.wallets);\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["useLayoutEffect", "useState", "wallet", "useState", "useLayoutEffect", "wallet"]
7
+ }
package/dist/esm/index.js CHANGED
@@ -902,6 +902,9 @@ function ConnectButton({
902
902
  // src/components/WalletProvider.tsx
903
903
  import { useRef } from "react";
904
904
 
905
+ // src/constants/walletDefaults.ts
906
+ import { ZKSEND_WALLET_NAME } from "@mysten/zksend";
907
+
905
908
  // src/utils/stateStorage.ts
906
909
  function createInMemoryStore() {
907
910
  const store = /* @__PURE__ */ new Map();
@@ -925,6 +928,7 @@ var DEFAULT_STORAGE_KEY = "sui-dapp-kit:wallet-connection-info";
925
928
  var DEFAULT_REQUIRED_FEATURES = [
926
929
  "sui:signTransactionBlock"
927
930
  ];
931
+ var DEFAULT_PREFERRED_WALLETS = [SUI_WALLET_NAME, ZKSEND_WALLET_NAME];
928
932
 
929
933
  // src/hooks/wallet/useAutoConnectWallet.ts
930
934
  import { useQuery as useQuery2 } from "@tanstack/react-query";
@@ -1157,6 +1161,35 @@ function useWalletsChanged(preferredWallets, requiredFeatures) {
1157
1161
  }, [preferredWallets, requiredFeatures, setWalletRegistered, setWalletUnregistered]);
1158
1162
  }
1159
1163
 
1164
+ // src/hooks/wallet/useZkSendWallet.ts
1165
+ import { registerZkSendWallet } from "@mysten/zksend";
1166
+ import { useEffect as useEffect4, useLayoutEffect as useLayoutEffect2, useState as useState4 } from "react";
1167
+ function useZkSendWallet(config) {
1168
+ const status = useAutoConnectWallet();
1169
+ const [address, setAddress] = useState4(null);
1170
+ const [wallet, setWallet] = useState4(null);
1171
+ const { mutate: connect } = useConnectWallet();
1172
+ useEffect4(() => {
1173
+ if (!address || !wallet || status !== "attempted")
1174
+ return;
1175
+ connect({ wallet, silent: true });
1176
+ setAddress(null);
1177
+ }, [address, status, connect, wallet]);
1178
+ useLayoutEffect2(() => {
1179
+ if (!config?.name) {
1180
+ return;
1181
+ }
1182
+ const { wallet: wallet2, unregister, addressFromRedirect } = registerZkSendWallet(config.name, {
1183
+ origin: config.origin
1184
+ });
1185
+ if (addressFromRedirect) {
1186
+ setWallet(wallet2);
1187
+ setAddress(addressFromRedirect);
1188
+ }
1189
+ return unregister;
1190
+ }, [config?.name, config?.origin]);
1191
+ }
1192
+
1160
1193
  // src/themes/lightTheme.ts
1161
1194
  var lightTheme = {
1162
1195
  blurs: {
@@ -1402,12 +1435,13 @@ function cssStringFromTheme(theme) {
1402
1435
  // src/components/WalletProvider.tsx
1403
1436
  import { jsx as jsx22, jsxs as jsxs9 } from "react/jsx-runtime";
1404
1437
  function WalletProvider({
1405
- preferredWallets = [SUI_WALLET_NAME],
1438
+ preferredWallets = DEFAULT_PREFERRED_WALLETS,
1406
1439
  requiredFeatures = DEFAULT_REQUIRED_FEATURES,
1407
1440
  storage = DEFAULT_STORAGE,
1408
1441
  storageKey = DEFAULT_STORAGE_KEY,
1409
1442
  enableUnsafeBurner = false,
1410
1443
  autoConnect = false,
1444
+ zkSend,
1411
1445
  theme = lightTheme,
1412
1446
  children
1413
1447
  }) {
@@ -1425,6 +1459,7 @@ function WalletProvider({
1425
1459
  preferredWallets,
1426
1460
  requiredFeatures,
1427
1461
  enableUnsafeBurner,
1462
+ zkSend,
1428
1463
  children: [
1429
1464
  theme ? /* @__PURE__ */ jsx22(InjectedThemeStyles, { theme }) : null,
1430
1465
  children
@@ -1433,13 +1468,15 @@ function WalletProvider({
1433
1468
  ) });
1434
1469
  }
1435
1470
  function WalletConnectionManager({
1436
- preferredWallets,
1437
- requiredFeatures,
1438
- enableUnsafeBurner,
1471
+ preferredWallets = DEFAULT_PREFERRED_WALLETS,
1472
+ requiredFeatures = DEFAULT_REQUIRED_FEATURES,
1473
+ enableUnsafeBurner = false,
1474
+ zkSend,
1439
1475
  children
1440
1476
  }) {
1441
1477
  useWalletsChanged(preferredWallets, requiredFeatures);
1442
1478
  useWalletPropertiesChanged();
1479
+ useZkSendWallet(zkSend);
1443
1480
  useUnsafeBurnerWallet(enableUnsafeBurner);
1444
1481
  useAutoConnectWallet();
1445
1482
  return children;
@@ -1487,7 +1524,7 @@ function useSuiClientInfiniteQuery(method, params, {
1487
1524
  ...params ?? {},
1488
1525
  cursor: pageParam
1489
1526
  }),
1490
- getNextPageParam: ({ nextCursor }) => nextCursor ?? null
1527
+ getNextPageParam: (lastPage) => lastPage.hasNextPage ? lastPage.nextCursor ?? null : null
1491
1528
  });
1492
1529
  }
1493
1530