@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.
- package/CHANGELOG.md +47 -0
- package/dist/cjs/components/WalletProvider.d.ts +4 -1
- package/dist/cjs/components/WalletProvider.js +43 -6
- package/dist/cjs/components/WalletProvider.js.map +4 -4
- package/dist/cjs/constants/walletDefaults.d.ts +1 -0
- package/dist/cjs/constants/walletDefaults.js +3 -0
- package/dist/cjs/constants/walletDefaults.js.map +2 -2
- package/dist/cjs/hooks/useSuiClientInfiniteQuery.d.ts +1 -0
- package/dist/cjs/hooks/useSuiClientInfiniteQuery.js +1 -1
- package/dist/cjs/hooks/useSuiClientInfiniteQuery.js.map +2 -2
- package/dist/cjs/hooks/wallet/useZkSendWallet.d.ts +5 -0
- package/dist/cjs/hooks/wallet/useZkSendWallet.js +251 -0
- package/dist/cjs/hooks/wallet/useZkSendWallet.js.map +7 -0
- package/dist/cjs/index.js +44 -7
- package/dist/cjs/index.js.map +4 -4
- package/dist/esm/components/WalletProvider.d.ts +4 -1
- package/dist/esm/components/WalletProvider.js +41 -4
- package/dist/esm/components/WalletProvider.js.map +4 -4
- package/dist/esm/constants/walletDefaults.d.ts +1 -0
- package/dist/esm/constants/walletDefaults.js +5 -0
- package/dist/esm/constants/walletDefaults.js.map +3 -3
- package/dist/esm/hooks/useSuiClientInfiniteQuery.d.ts +1 -0
- package/dist/esm/hooks/useSuiClientInfiniteQuery.js +1 -1
- package/dist/esm/hooks/useSuiClientInfiniteQuery.js.map +2 -2
- package/dist/esm/hooks/wallet/useZkSendWallet.d.ts +5 -0
- package/dist/esm/hooks/wallet/useZkSendWallet.js +230 -0
- package/dist/esm/hooks/wallet/useZkSendWallet.js.map +7 -0
- package/dist/esm/index.js +42 -5
- package/dist/esm/index.js.map +4 -4
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -3
- package/src/components/WalletProvider.tsx +17 -10
- package/src/constants/walletDefaults.ts +3 -0
- package/src/hooks/useSuiClientInfiniteQuery.ts +4 -2
- 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 =
|
|
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: (
|
|
1527
|
+
getNextPageParam: (lastPage) => lastPage.hasNextPage ? lastPage.nextCursor ?? null : null
|
|
1491
1528
|
});
|
|
1492
1529
|
}
|
|
1493
1530
|
|